[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