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.
This commit is contained in:
Matt Ebb
2007-08-14 04:38:31 +00:00
parent 149d4ab4de
commit 5c1335a4a5
3 changed files with 32 additions and 0 deletions

View File

@@ -71,6 +71,7 @@ void node_ungroup(struct SpaceNode *snode);
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);

View File

@@ -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)
{

View File

@@ -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) {