Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/nodes/composite')
-rw-r--r--source/blender/nodes/composite/node_composite_tree.cc17
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.cc28
2 files changed, 32 insertions, 13 deletions
diff --git a/source/blender/nodes/composite/node_composite_tree.cc b/source/blender/nodes/composite/node_composite_tree.cc
index c54382cc1ad..08dbd4ad6f0 100644
--- a/source/blender/nodes/composite/node_composite_tree.cc
+++ b/source/blender/nodes/composite/node_composite_tree.cc
@@ -249,6 +249,23 @@ 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 f2b9fbc2215..6f4f9d7e597 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_image.cc
@@ -269,12 +269,7 @@ void node_cmp_rlayers_register_pass(bNodeTree *ntree,
}
}
-struct CreateOutputUserData {
- bNodeTree &ntree;
- bNode &node;
-};
-
-static void cmp_node_rlayer_create_outputs_cb(void *userdata,
+static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata),
Scene *scene,
ViewLayer *view_layer,
const char *name,
@@ -282,8 +277,18 @@ static void cmp_node_rlayer_create_outputs_cb(void *userdata,
const char *UNUSED(chanid),
eNodeSocketDatatype type)
{
- CreateOutputUserData &data = *(CreateOutputUserData *)userdata;
- node_cmp_rlayers_register_pass(&data.ntree, &data.node, scene, view_layer, name, 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);
+ }
+ }
}
static void cmp_node_rlayer_create_outputs(bNodeTree *ntree,
@@ -303,17 +308,14 @@ 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, &userdata);
+ engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, nullptr);
RE_engine_free(engine);
if ((scene->r.mode & R_EDGE_FRS) &&
(view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS)) {
- node_cmp_rlayers_register_pass(
- ntree, node, scene, view_layer, RE_PASSNAME_FREESTYLE, SOCK_RGBA);
+ ntreeCompositRegisterPass(ntree, scene, view_layer, RE_PASSNAME_FREESTYLE, SOCK_RGBA);
}
MEM_freeN(data);