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:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user