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:
authorMatt Ebb <matt@mke3.net>2007-08-14 08:38:31 +0400
committerMatt Ebb <matt@mke3.net>2007-08-14 08:38:31 +0400
commit5c1335a4a58801283c185bec8626f24edc2b3a44 (patch)
treebe97d5a52bdfa663342a01c3e147886c5e94dd90 /source/blender/src
parent149d4ab4deac5f7affcf394091d3ee66550d9fb8 (diff)
Fix for bug #7406 'Compositor Crash'
Previously when deleting a scene, no checks were made to see if any render layer nodes in other scenes were referencing them, leaving them pointing to bad memory. Now, this checks all other scenes' nodetrees and sets pointers to the to-be-deleted scene to NULL, which gets taken care of elsewhere.
Diffstat (limited to 'source/blender/src')
-rw-r--r--source/blender/src/editnode.c27
-rw-r--r--source/blender/src/header_info.c4
2 files changed, 31 insertions, 0 deletions
diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c
index aa8dcc908c5..0b8e0776d93 100644
--- a/source/blender/src/editnode.c
+++ b/source/blender/src/editnode.c
@@ -1922,6 +1922,33 @@ void node_read_renderlayers(SpaceNode *snode)
snode_handle_recalc(snode);
}
+/* called from header_info, 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. */
+void clear_scene_in_nodes(Scene *sce)
+{
+ Scene *sce1;
+ bNode *node;
+
+ sce1= G.main->scene.first;
+ while(sce1) {
+ 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;
+ }
+ }
+ }
+ }
+ sce1= sce1->id.next;
+ }
+}
+
+
/* gets active viewer user */
struct ImageUser *ntree_get_active_iuser(bNodeTree *ntree)
{
diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c
index 5d18dbc3b03..aee2e2c620f 100644
--- a/source/blender/src/header_info.c
+++ b/source/blender/src/header_info.c
@@ -106,6 +106,7 @@
#include "BSE_editipo.h"
#include "BSE_filesel.h"
#include "BSE_headerbuttons.h"
+#include "BSE_node.h"
#include "BSE_sequence.h"
#include "BSE_edit.h"
@@ -499,6 +500,9 @@ void do_info_buttons(unsigned short event)
/* check all sequences */
clear_scene_in_allseqs(G.scene);
+ /* check render layer nodes in other scenes */
+ clear_scene_in_nodes(G.scene);
+
/* al screens */
sc= G.main->screen.first;
while(sc) {