[Bf-blender-cvs] [3e9f2e69b27] compositor-cryptomatte-workflow: Use cryptomatte session to determine names.
Jeroen Bakker
noreply at git.blender.org
Wed Mar 3 14:54:37 CET 2021
Commit: 3e9f2e69b27b8a83b14d1839431f273d2457cc56
Author: Jeroen Bakker
Date: Wed Mar 3 14:54:01 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rB3e9f2e69b27b8a83b14d1839431f273d2457cc56
Use cryptomatte session to determine names.
===================================================================
M source/blender/blenkernel/BKE_cryptomatte.h
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/intern/cryptomatte.cc
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 4c95b2eff98..15918fa32f8 100644
--- a/source/blender/blenkernel/BKE_cryptomatte.h
+++ b/source/blender/blenkernel/BKE_cryptomatte.h
@@ -54,7 +54,7 @@ uint32_t BKE_cryptomatte_asset_hash(struct CryptomatteSession *session,
const char *layer_name,
const struct Object *object);
float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash);
-bool BKE_cryptomatte_find_name(const struct Main *bmain,
+bool BKE_cryptomatte_find_name(const struct CryptomatteSession *session,
const float encoded_hash,
char *r_name,
int name_len);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index e9050f2df9e..6c5fa088317 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1282,8 +1282,8 @@ void ntreeCompositOutputFileUniqueLayer(struct ListBase *list,
void ntreeCompositColorBalanceSyncFromLGG(bNodeTree *ntree, bNode *node);
void ntreeCompositColorBalanceSyncFromCDL(bNodeTree *ntree, bNode *node);
-void ntreeCompositCryptomatteSyncFromAdd(struct Main *bmain, bNodeTree *ntree, bNode *node);
-void ntreeCompositCryptomatteSyncFromRemove(struct Main *bmain, bNodeTree *ntree, bNode *node);
+void ntreeCompositCryptomatteSyncFromAdd(bNode *node);
+void ntreeCompositCryptomatteSyncFromRemove(bNode *node);
const char *ntreeCompositCryptomatteLayerPrefix(const bNode *node);
/** \} */
diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc
index e375b9b2eb4..4be99288aad 100644
--- a/source/blender/blenkernel/intern/cryptomatte.cc
+++ b/source/blender/blenkernel/intern/cryptomatte.cc
@@ -183,13 +183,12 @@ float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash)
}
/* Find an ID in the given main that matches the given encoded float. */
-bool BKE_cryptomatte_find_name(const Main *bmain,
+bool BKE_cryptomatte_find_name(const CryptomatteSession *session,
const float encoded_hash,
char *r_name,
int name_len)
{
- CryptomatteSession session(bmain);
- std::optional<std::string> name = session[encoded_hash];
+ std::optional<std::string> name = (*session)[encoded_hash];
if (!name) {
return false;
}
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 56e4e4787a3..397ebb65db6 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -3812,13 +3812,13 @@ static void rna_NodeCryptomatte_matte_set(PointerRNA *ptr, const char *value)
static void rna_NodeCryptomatte_update_add(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- ntreeCompositCryptomatteSyncFromAdd(bmain, (bNodeTree *)ptr->owner_id, ptr->data);
+ ntreeCompositCryptomatteSyncFromAdd(ptr->data);
rna_Node_update(bmain, scene, ptr);
}
static void rna_NodeCryptomatte_update_remove(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- ntreeCompositCryptomatteSyncFromRemove(bmain, (bNodeTree *)ptr->owner_id, ptr->data);
+ ntreeCompositCryptomatteSyncFromRemove(ptr->data);
rna_Node_update(bmain, scene, ptr);
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
index 0b0f3724938..9314e1d7383 100644
--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
@@ -35,6 +35,50 @@
#include "BKE_library.h"
#include "BKE_main.h"
+static CryptomatteSession *cryptomatte_init_from_node(const bNode &node, int frame_number)
+{
+ if (node.type != CMP_NODE_CRYPTOMATTE) {
+ return nullptr;
+ }
+
+ NodeCryptomatte *node_cryptomatte = static_cast<NodeCryptomatte *>(node.storage);
+ CryptomatteSession *session = nullptr;
+ switch (node.custom1) {
+ case CMP_CRYPTOMATTE_SRC_RENDER: {
+ Scene *scene = (Scene *)node.id;
+ BLI_assert(GS(scene->id.name) == ID_SCE);
+ Render *render = (scene) ? RE_GetSceneRender(scene) : nullptr;
+ RenderResult *render_result = render ? RE_AcquireResultRead(render) : nullptr;
+ if (render_result) {
+ session = BKE_cryptomatte_init_from_render_result(render_result);
+ }
+ if (render) {
+ RE_ReleaseResult(render);
+ }
+ break;
+ }
+
+ case CMP_CRYPTOMATTE_SRC_IMAGE: {
+ Image *image = (Image *)node.id;
+ BLI_assert(!image || GS(image->id.name) == ID_IM);
+ if (!image || image->type != IMA_TYPE_MULTILAYER) {
+ break;
+ }
+
+ ImageUser *iuser = &node_cryptomatte->iuser;
+ BKE_image_user_frame_calc(image, iuser, frame_number);
+ ImBuf *ibuf = BKE_image_acquire_ibuf(image, iuser, NULL);
+ RenderResult *render_result = image->rr;
+ if (render_result) {
+ session = BKE_cryptomatte_init_from_render_result(render_result);
+ }
+ BKE_image_release_ibuf(image, ibuf, NULL);
+ break;
+ }
+ }
+ return session;
+}
+
extern "C" {
static CryptomatteEntry *cryptomatte_find(const NodeCryptomatte &n, float encoded_hash)
{
@@ -46,19 +90,24 @@ static CryptomatteEntry *cryptomatte_find(const NodeCryptomatte &n, float encode
return nullptr;
}
-static void cryptomatte_add(Main *bmain, NodeCryptomatte &n, float encoded_hash)
+static void cryptomatte_add(bNode &node, NodeCryptomatte &node_cryptomatte, float encoded_hash)
{
/* Check if entry already exist. */
- if (cryptomatte_find(n, encoded_hash)) {
+ if (cryptomatte_find(node_cryptomatte, encoded_hash)) {
return;
}
CryptomatteEntry *entry = static_cast<CryptomatteEntry *>(
MEM_callocN(sizeof(CryptomatteEntry), __func__));
entry->encoded_hash = encoded_hash;
- BKE_cryptomatte_find_name(bmain, encoded_hash, entry->name, sizeof(entry->name));
+ /* TODO(jbakker): Get current frame from scene. */
+ CryptomatteSession *session = cryptomatte_init_from_node(node, 0);
+ if (session) {
+ BKE_cryptomatte_find_name(session, encoded_hash, entry->name, sizeof(entry->name));
+ BKE_cryptomatte_free(session);
+ }
- BLI_addtail(&n.entries, entry);
+ BLI_addtail(&node_cryptomatte.entries, entry);
}
static void cryptomatte_remove(NodeCryptomatte &n, float encoded_hash)
@@ -81,18 +130,16 @@ static bNodeSocketTemplate cmp_node_cryptomatte_out[] = {
{-1, ""},
};
-void ntreeCompositCryptomatteSyncFromAdd(Main *bmain, bNodeTree *UNUSED(ntree), bNode *node)
+void ntreeCompositCryptomatteSyncFromAdd(bNode *node)
{
NodeCryptomatte *n = static_cast<NodeCryptomatte *>(node->storage);
if (n->add[0] != 0.0f) {
- cryptomatte_add(bmain, *n, n->add[0]);
+ cryptomatte_add(*node, *n, n->add[0]);
zero_v3(n->add);
}
}
-void ntreeCompositCryptomatteSyncFromRemove(Main *UNUSED(bmain),
- bNodeTree *UNUSED(ntree),
- bNode *node)
+void ntreeCompositCryptomatteSyncFromRemove(bNode *node)
{
NodeCryptomatte *n = static_cast<NodeCryptomatte *>(node->storage);
if (n->remove[0] != 0.0f) {
More information about the Bf-blender-cvs
mailing list