[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11580] trunk/blender/source/blender: Fix for bug #7406 'Compositor Crash'

Matt Ebb matt at mke3.net
Tue Aug 14 06:38:31 CEST 2007


Revision: 11580
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11580
Author:   broken
Date:     2007-08-14 06:38:31 +0200 (Tue, 14 Aug 2007)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BSE_node.h
    trunk/blender/source/blender/src/editnode.c
    trunk/blender/source/blender/src/header_info.c

Modified: trunk/blender/source/blender/include/BSE_node.h
===================================================================
--- trunk/blender/source/blender/include/BSE_node.h	2007-08-13 23:25:15 UTC (rev 11579)
+++ trunk/blender/source/blender/include/BSE_node.h	2007-08-14 04:38:31 UTC (rev 11580)
@@ -71,6 +71,7 @@
 void snode_make_group_editable(struct SpaceNode *snode, struct bNode *gnode);
 void node_hide(struct SpaceNode *snode);
 void node_read_renderlayers(struct SpaceNode *snode);
+void clear_scene_in_nodes(struct Scene *sce);
 
 void node_transform_ext(int mode, int unused);
 void node_shader_default(struct Material *ma);

Modified: trunk/blender/source/blender/src/editnode.c
===================================================================
--- trunk/blender/source/blender/src/editnode.c	2007-08-13 23:25:15 UTC (rev 11579)
+++ trunk/blender/source/blender/src/editnode.c	2007-08-14 04:38:31 UTC (rev 11580)
@@ -1922,6 +1922,33 @@
 	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)
 {

Modified: trunk/blender/source/blender/src/header_info.c
===================================================================
--- trunk/blender/source/blender/src/header_info.c	2007-08-13 23:25:15 UTC (rev 11579)
+++ trunk/blender/source/blender/src/header_info.c	2007-08-14 04:38:31 UTC (rev 11580)
@@ -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 @@
 			/* 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) {





More information about the Bf-blender-cvs mailing list