[Bf-blender-cvs] [1e9edce1601] compositor-cryptomatte-workflow: Added support for external render engines.

Jeroen Bakker noreply at git.blender.org
Mon Mar 15 12:07:18 CET 2021


Commit: 1e9edce1601d60f6fe63f343b330584e6a00c8b7
Author: Jeroen Bakker
Date:   Mon Mar 15 12:06:52 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rB1e9edce1601d60f6fe63f343b330584e6a00c8b7

Added support for external render engines.

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

M	source/blender/compositor/nodes/COM_CryptomatteNode.cc
M	source/blender/editors/interface/interface_eyedropper_color.c

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

diff --git a/source/blender/compositor/nodes/COM_CryptomatteNode.cc b/source/blender/compositor/nodes/COM_CryptomatteNode.cc
index 577acb59eca..4c698b5609f 100644
--- a/source/blender/compositor/nodes/COM_CryptomatteNode.cc
+++ b/source/blender/compositor/nodes/COM_CryptomatteNode.cc
@@ -82,6 +82,22 @@ static std::string prefix_from_node(const bNode &node)
   return std::string(prefix, BLI_strnlen(prefix, sizeof(prefix)));
 }
 
+static std::string combined_layer_pass_name(RenderLayer *render_layer, RenderPass *render_pass)
+{
+  if (render_layer->name[0] == '\0') {
+    return std::string(render_pass->name,
+                       BLI_strnlen(render_pass->name, sizeof(render_pass->name)));
+  }
+
+  std::string combined_name =
+      blender::StringRef(render_layer->name,
+                         BLI_strnlen(render_layer->name, sizeof(render_layer->name))) +
+      "." +
+      blender::StringRef(render_pass->name,
+                         BLI_strnlen(render_pass->name, sizeof(render_pass->name)));
+  return combined_name;
+}
+
 void CryptomatteNode::input_operations_from_render_source(
     const CompositorContext &context,
     const bNode &node,
@@ -106,12 +122,7 @@ void CryptomatteNode::input_operations_from_render_source(
     RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name);
     if (render_layer) {
       LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) {
-        const std::string combined_name =
-            blender::StringRef(view_layer->name,
-                               strnlen(view_layer->name, sizeof(view_layer->name))) +
-            "." +
-            blender::StringRef(render_pass->name,
-                               strnlen(render_pass->name, sizeof(render_pass->name)));
+        const std::string combined_name = combined_layer_pass_name(render_layer, render_pass);
         if (blender::StringRef(combined_name).startswith(prefix)) {
           RenderLayersProg *op = new RenderLayersProg(
               render_pass->name, COM_DT_COLOR, render_pass->channels);
@@ -167,13 +178,7 @@ void CryptomatteNode::input_operations_from_image_source(
     const std::string prefix = prefix_from_node(node);
     LISTBASE_FOREACH (RenderLayer *, render_layer, &image->rr->layers) {
       LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) {
-        const std::string combined_name =
-            blender::StringRef(render_layer->name,
-                               strnlen(render_layer->name, sizeof(render_layer->name))) +
-            "." +
-            blender::StringRef(render_pass->name,
-                               strnlen(render_pass->name, sizeof(render_pass->name)));
-
+        const std::string combined_name = combined_layer_pass_name(render_layer, render_pass);
         if (blender::StringRef(combined_name).startswith(prefix)) {
           MultilayerColorOperation *op = new MultilayerColorOperation(
               render_layer, render_pass, view);
diff --git a/source/blender/editors/interface/interface_eyedropper_color.c b/source/blender/editors/interface/interface_eyedropper_color.c
index f20d7d88102..349086132dc 100644
--- a/source/blender/editors/interface/interface_eyedropper_color.c
+++ b/source/blender/editors/interface/interface_eyedropper_color.c
@@ -157,9 +157,14 @@ static bool eyedropper_cryptomatte_sample_renderlayer_fl(RenderLayer *render_lay
     return false;
   }
 
-  const char *render_pass_name_prefix = prefix + render_layer_name_len + 1;
+  /* RenderResult from images can have no render layer name. */
+  const char *render_pass_name_prefix = render_layer_name_len ?
+                                            prefix + 1 + render_layer_name_len :
+                                            prefix;
+
   LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) {
-    if (STRPREFIX(render_pass->name, render_pass_name_prefix)) {
+    if (STRPREFIX(render_pass->name, render_pass_name_prefix) &&
+        !STREQLEN(render_pass->name, render_pass_name_prefix, sizeof(render_pass->name))) {
       BLI_assert(render_pass->channels == 4);
       const int x = (int)(fpos[0] * render_pass->rectx);
       const int y = (int)(fpos[1] * render_pass->recty);



More information about the Bf-blender-cvs mailing list