[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