[Bf-blender-cvs] [d91211f6237] compositor-cryptomatte-workflow: Add fallback logic when layer does not exist

Jeroen Bakker noreply at git.blender.org
Tue Mar 9 14:10:56 CET 2021


Commit: d91211f6237aa1076930442892beff6139d9fddb
Author: Jeroen Bakker
Date:   Tue Mar 9 13:28:00 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rBd91211f6237aa1076930442892beff6139d9fddb

Add fallback logic when layer does not exist

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

M	source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc

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

diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
index 9053aec884b..615ae2541b2 100644
--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
@@ -36,6 +36,8 @@
 #include "BKE_library.h"
 #include "BKE_main.h"
 
+#include <optional>
+
 static CryptomatteSession *cryptomatte_init_from_node(const bNode &node,
                                                       const int frame_number,
                                                       const bool use_meta_data)
@@ -184,7 +186,29 @@ void ntreeCompositCryptomatteUpdateLayerNames(bNode *node)
 const char *ntreeCompositCryptomatteLayerPrefix(const bNode *node)
 {
   NodeCryptomatte *node_cryptomatte = (NodeCryptomatte *)node->storage;
-  return node_cryptomatte->layer_name;
+  CryptomatteSession *session = cryptomatte_init_from_node(*node, 0, false);
+  std::optional<std::string> first_layer_name = std::nullopt;
+
+  if (session) {
+    for (blender::StringRef layer_name :
+         blender::bke::cryptomatte::BKE_cryptomatte_layer_names_get(*session)) {
+      if (!first_layer_name.has_value()) {
+        first_layer_name = layer_name;
+      }
+
+      if (layer_name == node_cryptomatte->layer_name) {
+        BKE_cryptomatte_free(session);
+        return node_cryptomatte->layer_name;
+      }
+    }
+
+    BKE_cryptomatte_free(session);
+  }
+
+  if (!first_layer_name.has_value()) {
+    return "";
+  }
+  return first_layer_name.value().c_str();
 }
 
 static void node_init_cryptomatte(bNodeTree *UNUSED(ntree), bNode *node)



More information about the Bf-blender-cvs mailing list