[Bf-blender-cvs] [2d4b638a674] master: Cryptomatte: Read metadata from multilayer OpenEXR.

Jeroen Bakker noreply at git.blender.org
Tue Mar 2 11:20:30 CET 2021


Commit: 2d4b638a674522507917b5f34ad8b5463ff42eb4
Author: Jeroen Bakker
Date:   Tue Mar 2 11:08:04 2021 +0100
Branches: master
https://developer.blender.org/rB2d4b638a674522507917b5f34ad8b5463ff42eb4

Cryptomatte: Read metadata from multilayer OpenEXR.

Currently the compositor reads cryptomatte meta-data from the render
result. When loading a multilayer open exr file the meta-data was ignored.
This patch will also load the cryptomatte meta-data from multilayer open
exr files.

This enabled workflows where the rendering and compositing are done in
separate scenes or for future changes where the cryptomatte node will
use the meta-data for name matching and color picking.

Reviewed By: Sergey Sharybin

Differential Revision: https://developer.blender.org/D10384

===================================================================

M	source/blender/compositor/intern/COM_MetaData.cpp
M	source/blender/compositor/intern/COM_MetaData.h
M	source/blender/compositor/nodes/COM_ImageNode.cpp
M	source/blender/compositor/nodes/COM_ImageNode.h
M	source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
M	source/blender/compositor/operations/COM_MultilayerImageOperation.h
M	source/blender/compositor/operations/COM_OutputFileOperation.cpp
M	source/blender/compositor/operations/COM_RenderLayersProg.cpp

===================================================================

diff --git a/source/blender/compositor/intern/COM_MetaData.cpp b/source/blender/compositor/intern/COM_MetaData.cpp
index 4bc4571face..a6306f6c657 100644
--- a/source/blender/compositor/intern/COM_MetaData.cpp
+++ b/source/blender/compositor/intern/COM_MetaData.cpp
@@ -18,7 +18,6 @@
 
 #include "COM_MetaData.h"
 
-#include "BKE_cryptomatte.hh"
 #include "BKE_image.h"
 
 #include "RE_pipeline.h"
@@ -69,3 +68,39 @@ void MetaData::addToRenderResult(RenderResult *render_result) const
     BKE_render_result_stamp_data(render_result, entry.key.c_str(), entry.value.c_str());
   }
 }
+
+void MetaDataExtractCallbackData::addMetaData(blender::StringRef key, blender::StringRefNull value)
+{
+  if (!meta_data) {
+    meta_data = std::make_unique<MetaData>();
+  }
+  meta_data->add(key, value);
+}
+
+void MetaDataExtractCallbackData::setCryptomatteKeys(blender::StringRef cryptomatte_layer_name)
+{
+  manifest_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name,
+                                                                          "manifest");
+  hash_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name,
+                                                                      "hash");
+  conversion_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name,
+                                                                            "conversion");
+}
+
+void MetaDataExtractCallbackData::extract_cryptomatte_meta_data(void *_data,
+                                                                const char *propname,
+                                                                char *propvalue,
+                                                                int UNUSED(len))
+{
+  MetaDataExtractCallbackData *data = static_cast<MetaDataExtractCallbackData *>(_data);
+  blender::StringRefNull key(propname);
+  if (key == data->hash_key) {
+    data->addMetaData(META_DATA_KEY_CRYPTOMATTE_HASH, propvalue);
+  }
+  else if (key == data->conversion_key) {
+    data->addMetaData(META_DATA_KEY_CRYPTOMATTE_CONVERSION, propvalue);
+  }
+  else if (key == data->manifest_key) {
+    data->addMetaData(META_DATA_KEY_CRYPTOMATTE_MANIFEST, propvalue);
+  }
+}
\ No newline at end of file
diff --git a/source/blender/compositor/intern/COM_MetaData.h b/source/blender/compositor/intern/COM_MetaData.h
index c1e34df2791..6fdd8d3945e 100644
--- a/source/blender/compositor/intern/COM_MetaData.h
+++ b/source/blender/compositor/intern/COM_MetaData.h
@@ -20,6 +20,7 @@
 
 #include <string>
 
+#include "BKE_cryptomatte.hh"
 #include "BLI_map.hh"
 
 #include "MEM_guardedalloc.h"
@@ -54,3 +55,18 @@ class MetaData {
   MEM_CXX_CLASS_ALLOC_FUNCS("COM:MetaData")
 #endif
 };
+
+struct MetaDataExtractCallbackData {
+  std::unique_ptr<MetaData> meta_data;
+  std::string hash_key;
+  std::string conversion_key;
+  std::string manifest_key;
+
+  void addMetaData(blender::StringRef key, blender::StringRefNull value);
+  void setCryptomatteKeys(blender::StringRef cryptomatte_layer_name);
+  /* C type callback function (StampCallback). */
+  static void extract_cryptomatte_meta_data(void *_data,
+                                            const char *propname,
+                                            char *propvalue,
+                                            int UNUSED(len));
+};
diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp
index 596a448e6a0..69729e018d7 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.cpp
+++ b/source/blender/compositor/nodes/COM_ImageNode.cpp
@@ -34,12 +34,12 @@ ImageNode::ImageNode(bNode *editorNode) : Node(editorNode)
   /* pass */
 }
 NodeOperation *ImageNode::doMultilayerCheck(NodeConverter &converter,
-                                            RenderLayer *rl,
+                                            RenderLayer *render_layer,
+                                            RenderPass *render_pass,
                                             Image *image,
                                             ImageUser *user,
                                             int framenumber,
                                             int outputsocketIndex,
-                                            int passindex,
                                             int view,
                                             DataType datatype) const
 {
@@ -47,19 +47,18 @@ NodeOperation *ImageNode::doMultilayerCheck(NodeConverter &converter,
   MultilayerBaseOperation *operation = nullptr;
   switch (datatype) {
     case COM_DT_VALUE:
-      operation = new MultilayerValueOperation(passindex, view);
+      operation = new MultilayerValueOperation(render_layer, render_pass, view);
       break;
     case COM_DT_VECTOR:
-      operation = new MultilayerVectorOperation(passindex, view);
+      operation = new MultilayerVectorOperation(render_layer, render_pass, view);
       break;
     case COM_DT_COLOR:
-      operation = new MultilayerColorOperation(passindex, view);
+      operation = new MultilayerColorOperation(render_layer, render_pass, view);
       break;
     default:
       break;
   }
   operation->setImage(image);
-  operation->setRenderLayer(rl);
   operation->setImageUser(user);
   operation->setFramenumber(framenumber);
 
@@ -128,16 +127,15 @@ void ImageNode::convertToOperations(NodeConverter &converter,
           }
 
           if (rpass) {
-            int passindex = BLI_findindex(&rl->passes, rpass);
             switch (rpass->channels) {
               case 1:
                 operation = doMultilayerCheck(converter,
                                               rl,
+                                              rpass,
                                               image,
                                               imageuser,
                                               framenumber,
                                               index,
-                                              passindex,
                                               view,
                                               COM_DT_VALUE);
                 break;
@@ -146,22 +144,22 @@ void ImageNode::convertToOperations(NodeConverter &converter,
               case 3:
                 operation = doMultilayerCheck(converter,
                                               rl,
+                                              rpass,
                                               image,
                                               imageuser,
                                               framenumber,
                                               index,
-                                              passindex,
                                               view,
                                               COM_DT_VECTOR);
                 break;
               case 4:
                 operation = doMultilayerCheck(converter,
                                               rl,
+                                              rpass,
                                               image,
                                               imageuser,
                                               framenumber,
                                               index,
-                                              passindex,
                                               view,
                                               COM_DT_COLOR);
                 break;
diff --git a/source/blender/compositor/nodes/COM_ImageNode.h b/source/blender/compositor/nodes/COM_ImageNode.h
index 1a811fe855d..e2053cfd3b8 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.h
+++ b/source/blender/compositor/nodes/COM_ImageNode.h
@@ -24,6 +24,7 @@
 #include "DNA_node_types.h"
 
 #include "RE_engine.h"
+#include "RE_pipeline.h"
 
 /**
  * \brief ImageNode
@@ -33,11 +34,11 @@ class ImageNode : public Node {
  private:
   NodeOperation *doMultilayerCheck(NodeConverter &converter,
                                    RenderLayer *rl,
+                                   RenderPass *render_pass,
                                    Image *image,
                                    ImageUser *user,
                                    int framenumber,
                                    int outputsocketIndex,
-                                   int passindex,
                                    int view,
                                    DataType datatype) const;
 
diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
index 023538ee5b1..60936ee1939 100644
--- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
+++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
@@ -21,10 +21,14 @@
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
 
-MultilayerBaseOperation::MultilayerBaseOperation(int passindex, int view)
+MultilayerBaseOperation::MultilayerBaseOperation(RenderLayer *render_layer,
+                                                 RenderPass *render_pass,
+                                                 int view)
 {
-  this->m_passId = passindex;
+  this->m_passId = BLI_findindex(&render_layer->passes, render_pass);
   this->m_view = view;
+  this->m_renderLayer = render_layer;
+  this->m_renderPass = render_pass;
 }
 
 ImBuf *MultilayerBaseOperation::getImBuf()
@@ -45,6 +49,32 @@ ImBuf *MultilayerBaseOperation::getImBuf()
   return nullptr;
 }
 
+std::unique_ptr<MetaData> MultilayerColorOperation::getMetaData() const
+{
+  BLI_assert(this->m_buffer);
+  MetaDataExtractCallbackData callback_data = {nullptr};
+  RenderResult *render_result = this->m_image->rr;
+  if (render_result && render_result->stamp_data) {
+    RenderLayer *render_layer = this->m_renderLayer;
+    RenderPass *render_pass = this->m_renderPass;
+    std::string full_layer_name =
+        std::string(render_layer->name,
+                    BLI_strnlen(render_layer->name, sizeof(render_layer->name))) +
+        "." +
+        std::string(render_pass->name, BLI_strnlen(render_pass->name, sizeof(render_pass->name)));
+    blender::StringRef cryptomatte_laye

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list