[Bf-blender-cvs] [145f1d1e0a5] master: Fix T94812: render layer sockets are missing after file load

Jacques Lucke noreply at git.blender.org
Wed Jan 12 11:08:34 CET 2022


Commit: 145f1d1e0a59c1de311a0511e05541563296d879
Author: Jacques Lucke
Date:   Wed Jan 12 11:07:31 2022 +0100
Branches: master
https://developer.blender.org/rB145f1d1e0a59c1de311a0511e05541563296d879

Fix T94812: render layer sockets are missing after file load

The main issue was the use of `G_MAIN` during file load.
This patch refactors the code so that iterating over `G_MAIN`
is not necessary anymore. See D13800 for more details.

Differential Revision: https://developer.blender.org/D13800

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/nodes/composite/node_composite_tree.cc
M	source/blender/nodes/composite/nodes/node_composite_image.cc

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 71d1728a870..ef86804cc3b 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1373,18 +1373,12 @@ void ntreeCompositTagRender(struct Scene *scene);
  * - Each render layer node calls the update function of the
  *   render engine that's used for its scene.
  * - The render engine calls RE_engine_register_pass for each pass.
- * - #RE_engine_register_pass calls #ntreeCompositRegisterPass,
- *   which calls #node_cmp_rlayers_register_pass for every render layer node.
+ * - #RE_engine_register_pass calls #node_cmp_rlayers_register_pass.
  *
  * TODO: This is *not* part of `blenkernel`, it's defined under "source/blender/nodes/".
  * This declaration should be moved out of BKE.
  */
 void ntreeCompositUpdateRLayers(struct bNodeTree *ntree);
-void ntreeCompositRegisterPass(struct bNodeTree *ntree,
-                               struct Scene *scene,
-                               struct ViewLayer *view_layer,
-                               const char *name,
-                               eNodeSocketDatatype type);
 void ntreeCompositClearTags(struct bNodeTree *ntree);
 
 struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree,
diff --git a/source/blender/nodes/composite/node_composite_tree.cc b/source/blender/nodes/composite/node_composite_tree.cc
index 08dbd4ad6f0..c54382cc1ad 100644
--- a/source/blender/nodes/composite/node_composite_tree.cc
+++ b/source/blender/nodes/composite/node_composite_tree.cc
@@ -249,23 +249,6 @@ void ntreeCompositUpdateRLayers(bNodeTree *ntree)
   }
 }
 
-void ntreeCompositRegisterPass(bNodeTree *ntree,
-                               Scene *scene,
-                               ViewLayer *view_layer,
-                               const char *name,
-                               eNodeSocketDatatype type)
-{
-  if (ntree == nullptr) {
-    return;
-  }
-
-  LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-    if (node->type == CMP_NODE_R_LAYERS) {
-      node_cmp_rlayers_register_pass(ntree, node, scene, view_layer, name, type);
-    }
-  }
-}
-
 void ntreeCompositTagRender(Scene *scene)
 {
   /* XXX Think using G_MAIN here is valid, since you want to update current file's scene nodes,
diff --git a/source/blender/nodes/composite/nodes/node_composite_image.cc b/source/blender/nodes/composite/nodes/node_composite_image.cc
index 6f4f9d7e597..f2b9fbc2215 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_image.cc
@@ -269,7 +269,12 @@ void node_cmp_rlayers_register_pass(bNodeTree *ntree,
   }
 }
 
-static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata),
+struct CreateOutputUserData {
+  bNodeTree &ntree;
+  bNode &node;
+};
+
+static void cmp_node_rlayer_create_outputs_cb(void *userdata,
                                               Scene *scene,
                                               ViewLayer *view_layer,
                                               const char *name,
@@ -277,18 +282,8 @@ static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata),
                                               const char *UNUSED(chanid),
                                               eNodeSocketDatatype type)
 {
-  /* Register the pass in all scenes that have a render layer node for this layer.
-   * Since multiple scenes can be used in the compositor, the code must loop over all scenes
-   * and check whether their nodetree has a node that needs to be updated. */
-  /* NOTE: using G_MAIN seems valid here,
-   * unless we want to register that for every other temp Main we could generate??? */
-  ntreeCompositRegisterPass(scene->nodetree, scene, view_layer, name, type);
-
-  for (Scene *sce = (Scene *)G_MAIN->scenes.first; sce; sce = (Scene *)sce->id.next) {
-    if (sce->nodetree && sce != scene) {
-      ntreeCompositRegisterPass(sce->nodetree, scene, view_layer, name, type);
-    }
-  }
+  CreateOutputUserData &data = *(CreateOutputUserData *)userdata;
+  node_cmp_rlayers_register_pass(&data.ntree, &data.node, scene, view_layer, name, type);
 }
 
 static void cmp_node_rlayer_create_outputs(bNodeTree *ntree,
@@ -308,14 +303,17 @@ static void cmp_node_rlayer_create_outputs(bNodeTree *ntree,
         data->prev_index = -1;
         node->storage = data;
 
+        CreateOutputUserData userdata = {*ntree, *node};
+
         RenderEngine *engine = RE_engine_create(engine_type);
         RE_engine_update_render_passes(
-            engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, nullptr);
+            engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, &userdata);
         RE_engine_free(engine);
 
         if ((scene->r.mode & R_EDGE_FRS) &&
             (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS)) {
-          ntreeCompositRegisterPass(ntree, scene, view_layer, RE_PASSNAME_FREESTYLE, SOCK_RGBA);
+          node_cmp_rlayers_register_pass(
+              ntree, node, scene, view_layer, RE_PASSNAME_FREESTYLE, SOCK_RGBA);
         }
 
         MEM_freeN(data);



More information about the Bf-blender-cvs mailing list