[Bf-blender-cvs] [f7984451725] compositor-cryptomatte-workflow: Cryptomatte: Select custom layer name (WIP)

Jeroen Bakker noreply at git.blender.org
Thu Mar 4 10:23:25 CET 2021


Commit: f798445172588d147cf5e4429831709aff8da75e
Author: Jeroen Bakker
Date:   Thu Mar 4 10:22:58 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rBf798445172588d147cf5e4429831709aff8da75e

Cryptomatte: Select custom layer name (WIP)

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/editors/space_node/drawnode.c
M	source/blender/makesdna/DNA_node_types.h
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_node.h b/source/blender/blenkernel/BKE_node.h
index 6c5fa088317..6ed9f296a21 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -47,6 +47,7 @@ struct BlendLibReader;
 struct BlendWriter;
 struct ColorManagedDisplaySettings;
 struct ColorManagedViewSettings;
+struct CryptomatteSession;
 struct FreestyleLineStyle;
 struct GPUMaterial;
 struct GPUNodeStack;
@@ -1285,7 +1286,7 @@ void ntreeCompositColorBalanceSyncFromCDL(bNodeTree *ntree, bNode *node);
 void ntreeCompositCryptomatteSyncFromAdd(bNode *node);
 void ntreeCompositCryptomatteSyncFromRemove(bNode *node);
 const char *ntreeCompositCryptomatteLayerPrefix(const bNode *node);
-
+struct CryptomatteSession *ntreeCompositCryptomatteSessionInitFromNode(const bNode *node);
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 3c4ba706086..4ebe4c7093b 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -2695,7 +2695,7 @@ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *C, Pointe
   }
 
   col = uiLayoutColumn(layout, true);
-  uiItemR(col, ptr, "type", 0, NULL, ICON_NONE);
+  uiItemR(col, ptr, "layer_name", 0, NULL, ICON_NONE);
   uiItemL(col, IFACE_("Matte ID:"), ICON_NONE);
 
   uiLayout *row = uiLayoutRow(col, true);
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index c405eb7d7f0..13c56a1e207 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1059,13 +1059,6 @@ typedef struct NodeSunBeams {
   float ray_length;
 } NodeSunBeams;
 
-/* NodeCryptomatte.type. */
-typedef enum eNodeCryptomatteLayerTypes {
-  CMP_CRYPTOMATTE_TYPE_OBJECT = 0,
-  CMP_CRYPTOMATTE_TYPE_MATERIAL = 1,
-  CMP_CRYPTOMATTE_TYPE_ASSET = 2,
-} eNodeCryptomatteLayerType;
-
 typedef struct CryptomatteEntry {
   struct CryptomatteEntry *next, *prev;
   float encoded_hash;
@@ -1082,11 +1075,11 @@ typedef struct NodeCryptomatte {
 
   /* Contains `CryptomatteEntry`. */
   ListBase entries;
-  int type;
 
   float add[3];
   float remove[3];
-  char _pad[4];
+  /* MAX_NAME */
+  char layer_name[64];
   char *matte_id DNA_DEPRECATED;
 } NodeCryptomatte;
 
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 397ebb65db6..0e9dd30075a 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -3735,6 +3735,44 @@ static void rna_NodeCryptomatte_source_set(PointerRNA *ptr, int value)
   node->custom1 = value;
 }
 
+#  if 0
+static int rna_NodeCryptomatte_layer_name_get(PointerRNA *ptr)
+{
+  return 0;
+}
+
+static void rna_NodeCryptomatte_layer_name_set(PointerRNA *ptr, int new_value)
+{
+}
+
+static const EnumPropertyItem *rna_NodeCryptomatte_layer_name_itemf(bContext *C,
+                                                                    PointerRNA *ptr,
+                                                                    PropertyRNA *UNUSED(prop),
+                                                                    bool *r_free)
+{
+  bNode *node = (bNode *)ptr->data;
+
+  EnumPropertyItem *item = NULL;
+  EnumPropertyItem tmp = {0, "", 0, "", ""};
+  int totitem = 0;
+
+  struct CryptomatteSession *session = ntreeCompositCryptomatteSessionInitFromNode(node);
+  tmp.value = 0;
+  tmp.identifier = "test";
+  tmp.name = "test";
+  RNA_enum_item_add(&item, &totitem, &tmp);
+
+  if (session) {
+    BKE_cryptomatte_free(session);
+  }
+
+  RNA_enum_item_end(&item, &totitem);
+  *r_free = true;
+
+  return NULL;
+}
+#  endif
+
 static PointerRNA rna_NodeCryptomatte_scene_get(PointerRNA *ptr)
 {
   bNode *node = (bNode *)ptr->data;
@@ -8480,12 +8518,13 @@ static void def_cmp_cryptomatte(StructRNA *srna)
       {CMP_CRYPTOMATTE_SRC_RENDER, "RENDER", 0, "Render", "Use Cryptomatte passes from a render"},
       {CMP_CRYPTOMATTE_SRC_IMAGE, "IMAGE", 0, "Image", "Use Cryptomatte passes from an image"},
       {0, NULL, 0, NULL, NULL}};
-
-  static const EnumPropertyItem cryptomatte_type_items[] = {
-      {CMP_CRYPTOMATTE_TYPE_OBJECT, "OBJECT", 0, "Object", "Use Object layer"},
-      {CMP_CRYPTOMATTE_TYPE_MATERIAL, "MATERIAL", 0, "Material", "Use Material layer"},
-      {CMP_CRYPTOMATTE_TYPE_ASSET, "ASSET", 0, "Asset", "Use Asset layer"},
+#  if 0
+  static const EnumPropertyItem cryptomatte_layer_name_items[] = {
+      {0, "CryptoObject", 0, "Object", "Use Object layer"},
+      // {CMP_CRYPTOMATTE_TYPE_MATERIAL, "CryptoMaterial", 0, "Material", "Use Material layer"},
+      // {CMP_CRYPTOMATTE_TYPE_ASSET, "CryptoAsset", 0, "Asset", "Use Asset layer"},
       {0, NULL, 0, NULL, NULL}};
+#  endif
 
   prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_sdna(prop, NULL, "custom1");
@@ -8521,11 +8560,26 @@ static void def_cmp_cryptomatte(StructRNA *srna)
   RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_view_layer_update");
 
   RNA_def_struct_sdna_from(srna, "NodeCryptomatte", "storage");
-  prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
-  RNA_def_property_enum_sdna(prop, NULL, "type");
-  RNA_def_property_enum_items(prop, cryptomatte_type_items);
-  RNA_def_property_ui_text(prop, "Type", "What type of Cryptomatte layer is used");
+  /* 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 0
+  prop = RNA_def_property(srna, "cryptomatte_layer_name", PROP_ENUM, PROP_NONE);
+  // RNA_def_property_enum_sdna(prop, NULL, "layer_name");
+  RNA_def_property_enum_items(prop, cryptomatte_layer_name_items);
+  RNA_def_property_enum_funcs(prop,
+                              "rna_NodeCryptomatte_layer_name_get",
+                              "rna_NodeCryptomatte_layer_name_set",
+                              "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_array_default(prop, default_1);
diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
index 9314e1d7383..77f1be6025a 100644
--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
@@ -147,6 +147,10 @@ void ntreeCompositCryptomatteSyncFromRemove(bNode *node)
     zero_v3(n->remove);
   }
 }
+CryptomatteSession *ntreeCompositCryptomatteSessionInitFromNode(const bNode *node)
+{
+  return cryptomatte_init_from_node(*node, 0);
+}
 
 const char *CRYPTOMATTE_LAYER_PREFIX_OBJECT = "CryptoObject";
 const char *CRYPTOMATTE_LAYER_PREFIX_MATERIAL = "CryptoMaterial";
@@ -155,20 +159,8 @@ const char *CRYPTOMATTE_LAYER_PREFIX_UNKNOWN = "";
 
 const char *ntreeCompositCryptomatteLayerPrefix(const bNode *node)
 {
-  NodeCryptomatte *cryptoMatteSettings = (NodeCryptomatte *)node->storage;
-
-  switch (cryptoMatteSettings->type) {
-    case CMP_CRYPTOMATTE_TYPE_OBJECT:
-      return CRYPTOMATTE_LAYER_PREFIX_OBJECT;
-
-    case CMP_CRYPTOMATTE_TYPE_MATERIAL:
-      return CRYPTOMATTE_LAYER_PREFIX_MATERIAL;
-
-    case CMP_CRYPTOMATTE_TYPE_ASSET:
-      return CRYPTOMATTE_LAYER_PREFIX_ASSET;
-  }
-  BLI_assert(false && "Invalid Cryptomatte layer.");
-  return CRYPTOMATTE_LAYER_PREFIX_UNKNOWN;
+  NodeCryptomatte *node_cryptomatte = (NodeCryptomatte *)node->storage;
+  return node_cryptomatte->layer_name;
 }
 
 static void node_init_cryptomatte(bNodeTree *UNUSED(ntree), bNode *node)



More information about the Bf-blender-cvs mailing list