diff options
Diffstat (limited to 'source/blender/nodes/composite')
-rw-r--r-- | source/blender/nodes/composite/node_composite_tree.cc | 17 | ||||
-rw-r--r-- | source/blender/nodes/composite/nodes/node_composite_image.cc | 28 |
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); |