[Bf-blender-cvs] [576f491979d] compositor-cryptomatte-workflow: Fix crash selecting correct render pass.

Jeroen Bakker noreply at git.blender.org
Mon Mar 8 16:22:41 CET 2021


Commit: 576f491979dd86c1735837cfa21c85eea30997ae
Author: Jeroen Bakker
Date:   Mon Mar 8 16:22:25 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rB576f491979dd86c1735837cfa21c85eea30997ae

Fix crash selecting correct render pass.

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

M	source/blender/compositor/nodes/COM_CryptomatteNode.cc

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

diff --git a/source/blender/compositor/nodes/COM_CryptomatteNode.cc b/source/blender/compositor/nodes/COM_CryptomatteNode.cc
index a86ec74af54..780c0d490ad 100644
--- a/source/blender/compositor/nodes/COM_CryptomatteNode.cc
+++ b/source/blender/compositor/nodes/COM_CryptomatteNode.cc
@@ -42,22 +42,31 @@ void CryptomatteNode::buildInputOperationsFromRenderSource(
     blender::Vector<NodeOperation *> &r_input_operations)
 {
   Scene *scene = (Scene *)node.id;
+  if (!scene) {
+    return;
+  }
+
   BLI_assert(GS(scene->id.name) == ID_SCE);
-  Render *render = (scene) ? RE_GetSceneRender(scene) : nullptr;
+  Render *render = RE_GetSceneRender(scene);
   RenderResult *render_result = render ? RE_AcquireResultRead(render) : nullptr;
 
   if (!render_result) {
     return;
   }
 
-  const short cryptomatte_layer_id = node.custom2;
-  ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, cryptomatte_layer_id);
-  if (view_layer) {
+  const short cryptomatte_layer_id = 0;
+  std::string prefix = ntreeCompositCryptomatteLayerPrefix(&node);
+  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
     RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name);
     if (render_layer) {
-      std::string prefix = ntreeCompositCryptomatteLayerPrefix(&node);
       LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) {
-        if (blender::StringRef(render_pass->name, sizeof(render_pass->name)).startswith(prefix)) {
+        blender::StringRef 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)));
+        if (combined_name.startswith(prefix)) {
           RenderLayersProg *op = new RenderLayersProg(
               render_pass->name, COM_DT_COLOR, render_pass->channels);
           op->setScene(scene);



More information about the Bf-blender-cvs mailing list