[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