[Bf-blender-cvs] [4d23e0f51e3] compositor-cryptomatte-workflow: Create cryptomatte session from scene.

Jeroen Bakker noreply at git.blender.org
Mon Mar 8 16:22:40 CET 2021


Commit: 4d23e0f51e30ffcc8b2ae417924bc1df90b48621
Author: Jeroen Bakker
Date:   Mon Mar 8 15:54:46 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rB4d23e0f51e30ffcc8b2ae417924bc1df90b48621

Create cryptomatte session from scene.

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

M	source/blender/blenkernel/BKE_cryptomatte.h
M	source/blender/blenkernel/intern/cryptomatte.cc
M	source/blender/editors/space_node/drawnode.c
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc

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

diff --git a/source/blender/blenkernel/BKE_cryptomatte.h b/source/blender/blenkernel/BKE_cryptomatte.h
index db31ebebbe1..576a2c1effd 100644
--- a/source/blender/blenkernel/BKE_cryptomatte.h
+++ b/source/blender/blenkernel/BKE_cryptomatte.h
@@ -30,14 +30,17 @@
 extern "C" {
 #endif
 
+/* Forward declarations. */
 struct CryptomatteSession;
 struct Material;
 struct Object;
 struct RenderResult;
+struct Scene;
 
 struct CryptomatteSession *BKE_cryptomatte_init(void);
 struct CryptomatteSession *BKE_cryptomatte_init_from_render_result(
     const struct RenderResult *render_result);
+struct CryptomatteSession *BKE_cryptomatte_init_from_scene(const struct Scene *scene);
 void BKE_cryptomatte_free(struct CryptomatteSession *session);
 void BKE_cryptomatte_add_layer(struct CryptomatteSession *session, const char *layer_name);
 
diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc
index ad9bafa4999..93060a72aac 100644
--- a/source/blender/blenkernel/intern/cryptomatte.cc
+++ b/source/blender/blenkernel/intern/cryptomatte.cc
@@ -30,6 +30,7 @@
 #include "DNA_material_types.h"
 #include "DNA_node_types.h"
 #include "DNA_object_types.h"
+#include "DNA_scene_types.h"
 
 #include "BLI_compiler_attrs.h"
 #include "BLI_dynstr.h"
@@ -54,6 +55,7 @@ struct CryptomatteSession {
   CryptomatteSession();
   CryptomatteSession(const Main *bmain);
   CryptomatteSession(StampData *stamp_data);
+  CryptomatteSession(const Scene *scene);
 
   blender::bke::cryptomatte::CryptomatteLayer &add_layer(std::string layer_name);
   std::optional<std::string> operator[](float encoded_hash) const;
@@ -99,6 +101,15 @@ CryptomatteSession::CryptomatteSession(StampData *stamp_data)
       false);
 }
 
+CryptomatteSession::CryptomatteSession(const Scene *scene)
+{
+  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
+    add_layer(blender::StringRefNull(view_layer->name) + ".CryptoObject");
+    add_layer(blender::StringRefNull(view_layer->name) + ".CryptoAsset");
+    add_layer(blender::StringRefNull(view_layer->name) + ".CryptoMaterial");
+  }
+}
+
 blender::bke::cryptomatte::CryptomatteLayer &CryptomatteSession::add_layer(std::string layer_name)
 {
   return layers.lookup_or_add_default(layer_name);
@@ -128,6 +139,12 @@ struct CryptomatteSession *BKE_cryptomatte_init_from_render_result(
   return session;
 }
 
+struct CryptomatteSession *BKE_cryptomatte_init_from_scene(const struct Scene *scene)
+{
+  CryptomatteSession *session = new CryptomatteSession(scene);
+  return session;
+}
+
 void BKE_cryptomatte_add_layer(struct CryptomatteSession *session, const char *layer_name)
 {
   session->add_layer(layer_name);
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 4ebe4c7093b..c2982d18e7f 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -2675,9 +2675,6 @@ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *C, Pointe
   col = uiLayoutColumn(layout, true);
   if (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) {
     uiTemplateID(col, C, ptr, "scene", NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL);
-    if (node->id) {
-      uiItemR(col, ptr, "view_layer", 0, "", ICON_NONE);
-    }
   }
   else {
     uiTemplateID(
@@ -2695,7 +2692,7 @@ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *C, Pointe
   }
 
   col = uiLayoutColumn(layout, true);
-  uiItemR(col, ptr, "layer_name", 0, NULL, ICON_NONE);
+  uiItemR(col, ptr, "layer_name", 0, "", ICON_NONE);
   uiItemL(col, IFACE_("Matte ID:"), ICON_NONE);
 
   uiLayout *row = uiLayoutRow(col, true);
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 1705d2b5f76..ea7b5dbf13e 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -3743,14 +3743,29 @@ static void rna_NodeCryptomatte_source_set(PointerRNA *ptr, int value)
 
 static int rna_NodeCryptomatte_layer_name_get(PointerRNA *ptr)
 {
+  int index = 0;
+  bNode *node = (bNode *)ptr->data;
+  NodeCryptomatte *storage = node->storage;
+  LISTBASE_FOREACH_INDEX (CryptomatteLayer *, layer, &storage->runtime.layers, index) {
+    if (STREQLEN(storage->layer_name, layer->name, sizeof(storage->layer_name))) {
+      return index;
+    }
+  }
   return 0;
 }
 
 static void rna_NodeCryptomatte_layer_name_set(PointerRNA *ptr, int new_value)
 {
+  bNode *node = (bNode *)ptr->data;
+  NodeCryptomatte *storage = node->storage;
+
+  CryptomatteLayer *layer = BLI_findlink(&storage->runtime.layers, new_value);
+  if (layer) {
+    STRNCPY(storage->layer_name, layer->name);
+  }
 }
 
-static const EnumPropertyItem *rna_NodeCryptomatte_layer_name_itemf(bContext *C,
+static const EnumPropertyItem *rna_NodeCryptomatte_layer_name_itemf(bContext *UNUSED(C),
                                                                     PointerRNA *ptr,
                                                                     PropertyRNA *UNUSED(prop),
                                                                     bool *r_free)
@@ -8547,22 +8562,9 @@ static void def_cmp_cryptomatte(StructRNA *srna)
   RNA_def_property_ui_text(prop, "Image", "");
   RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 
-  prop = RNA_def_property(srna, "view_layer", PROP_ENUM, PROP_NONE);
-  RNA_def_property_enum_sdna(prop, NULL, "custom2");
-  RNA_def_property_enum_items(prop, prop_view_layer_items);
-  RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_view_layer_itemf");
-  RNA_def_property_flag(prop, PROP_ENUM_NO_TRANSLATE);
-  RNA_def_property_ui_text(prop, "Layer", "");
-  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_view_layer_update");
-
   RNA_def_struct_sdna_from(srna, "NodeCryptomatte", "storage");
-  /* TODO(jbakker): Prefer to have an enum field that stores the chosen cryptomatte
-   * layer in the `layer_name` DNA field. Might need to look at AOVs where we did
-   * a similar trick. The enabled `cryptomatte_layer_name` is just a quick workaround
-   * for testing purposes. */
-#  if 1
+
   prop = RNA_def_property(srna, "layer_name", PROP_ENUM, PROP_NONE);
-  // RNA_def_property_enum_sdna(prop, NULL, "layer_name");
   RNA_def_property_enum_items(prop, node_cryptomatte_layer_name_items);
   RNA_def_property_enum_funcs(prop,
                               "rna_NodeCryptomatte_layer_name_get",
@@ -8570,12 +8572,6 @@ static void def_cmp_cryptomatte(StructRNA *srna)
                               "rna_NodeCryptomatte_layer_name_itemf");
   RNA_def_property_ui_text(prop, "Cryptomatte Layer", "What Cryptomatte layer is used");
   RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
-#  else
-  prop = RNA_def_property(srna, "layer_name", PROP_STRING, PROP_NONE);
-  RNA_def_property_string_sdna(prop, NULL, "layer_name");
-  RNA_def_property_ui_text(prop, "Cryptomatte Layer", "What Cryptomatte layer is used");
-  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
-#  endif
 
   prop = RNA_def_property(srna, "add", PROP_FLOAT, PROP_COLOR);
   RNA_def_property_float_sdna(prop, NULL, "runtime.add");
diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
index 2b9ee17e6c0..4374070e02a 100644
--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
@@ -53,6 +53,9 @@ static CryptomatteSession *cryptomatte_init_from_node(const bNode &node, int fra
       if (render_result) {
         session = BKE_cryptomatte_init_from_render_result(render_result);
       }
+      else {
+        session = BKE_cryptomatte_init_from_scene(scene);
+      }
       if (render) {
         RE_ReleaseResult(render);
       }



More information about the Bf-blender-cvs mailing list