diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-02-05 16:51:51 +0400 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2014-02-05 16:51:51 +0400 |
commit | 1687023776a3ce0de41a4cfe0ebc72a5ebadabe4 (patch) | |
tree | 28e8af3d7cbafbab07bc86f61b58a109d0091408 /source/blender/blenkernel | |
parent | e9fda259dac3d95018bc9378e2f8f3b10a8c46c4 (diff) |
Fix T38340 and T38473: fixed Scene pointers in Composite and Defocus nodes don't get updated based on context.
As discussed in T38340 the solution is to use the current scene from
context whenever feasible.
Composite does not use node->id at all now, the scene which owns the
compositing node tree is retrieved from context instead.
Defocus node->id is made editable by the user. By default it is not set,
which also will make it use the contextual scene and camera info.
The node->id pointer in Defocus is **not** cleared in older blend files.
This is done for backward compatibility: the node will then behave as
before in untouched scenes.
File Output nodes also don't store scene in node->id. This is only needed
when creating a new node for initializing the file format.
Reviewers: brecht, jbakker, mdewanchand
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D290
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 13 |
3 files changed, 12 insertions, 30 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 3a111724d18..d219c1c6e8d 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -931,7 +931,7 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMateria /* API */ struct CompBuf; -void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int rendering, int do_previews, +void ntreeCompositExecTree(struct Scene *scene, struct bNodeTree *ntree, struct RenderData *rd, int rendering, int do_previews, const struct ColorManagedViewSettings *view_settings, const struct ColorManagedDisplaySettings *display_settings); void ntreeCompositTagRender(struct Scene *sce); int ntreeCompositTagAnimated(struct bNodeTree *ntree); @@ -999,6 +999,4 @@ int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, void init_nodesystem(void); void free_nodesystem(void); -void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce); - #endif diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index f058bbc5f78..bc616934fef 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3658,31 +3658,6 @@ void free_nodesystem(void) } } -/* called from BKE_scene_unlink, when deleting a scene goes over all scenes - * other than the input, checks if they have render layer nodes referencing - * the to-be-deleted scene, and resets them to NULL. */ - -/* XXX needs to get current scene then! */ -void clear_scene_in_nodes(Main *bmain, Scene *sce) -{ - Scene *sce1; - bNode *node; - - for (sce1 = bmain->scene.first; sce1; sce1 = sce1->id.next) { - if (sce1 != sce) { - if (sce1->nodetree) { - for (node = sce1->nodetree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_R_LAYERS) { - Scene *nodesce = (Scene *)node->id; - - if (nodesce == sce) node->id = NULL; - } - } - } - } - } -} - /* -------------------------------------------------------------------- */ /* NodeTree Iterator Helpers (FOREACH_NODETREE) */ diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 936f76765c2..120a791d679 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -727,8 +727,17 @@ void BKE_scene_unlink(Main *bmain, Scene *sce, Scene *newsce) if (sce1->set == sce) sce1->set = NULL; - /* check render layer nodes in other scenes */ - clear_scene_in_nodes(bmain, sce); + for (sce1 = bmain->scene.first; sce1; sce1 = sce1->id.next) { + bNode *node; + + if (sce1 == sce || !sce1->nodetree) + continue; + + for (node = sce1->nodetree->nodes.first; node; node = node->next) { + if (node->id == &sce->id) + node->id = NULL; + } + } /* al screens */ for (sc = bmain->screen.first; sc; sc = sc->id.next) |