diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-11-23 19:02:55 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-11-23 19:03:14 +0300 |
commit | 3bf7c846eeb4a728c62100b40463874d83f5b3e0 (patch) | |
tree | 9ce90a2339ca5b26918883c3894eec31c87309ff /source/blender | |
parent | e5abce922094cbacd316253be73eeed6ce5a6e92 (diff) |
Fix T57996: Crash - delete node with a driven parameter
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 22 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 5 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_group.c | 4 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_templates.c | 8 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 5 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_nodetree.c | 4 |
7 files changed, 35 insertions, 17 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 9b8febce756..07a50a782c5 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -450,7 +450,11 @@ struct bNode *nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntre void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node); void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node); +/* Frees the node itself, without affect to anything else. */ void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node); +/* Will additionally cleanup things like f-curves which uses this node. */ +void nodeDeleteNode(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node); + struct bNode *BKE_node_copy_ex(struct bNodeTree *ntree, struct bNode *node_src, const int flag); struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 14ca2b8562a..183fa37f84b 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -76,6 +76,7 @@ #include "NOD_texture.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" #define NODE_DEFAULT_MAX_WIDTH 700 @@ -1688,7 +1689,9 @@ static void node_unlink_attached(bNodeTree *ntree, bNode *parent) } /** \note caller needs to manage node->id user */ -static void node_free_node_ex(bNodeTree *ntree, bNode *node, bool remove_animdata, bool use_api_free_cb) +static void node_free_node_ex( + Main *bmain, bNodeTree *ntree, bNode *node, + bool remove_animdata, bool use_api_free_cb) { bNodeSocket *sock, *nextsock; @@ -1722,7 +1725,11 @@ static void node_free_node_ex(bNodeTree *ntree, bNode *node, bool remove_animdat BLI_strescape(propname_esc, node->name, sizeof(propname_esc)); BLI_snprintf(prefix, sizeof(prefix), "nodes[\"%s\"]", propname_esc); - BKE_animdata_fix_paths_remove((ID *)ntree, prefix); + if (BKE_animdata_fix_paths_remove((ID *)ntree, prefix)) { + if (bmain != NULL) { + DEG_relations_tag_update(bmain); + } + } } if (ntree->typeinfo->free_node_cache) @@ -1765,7 +1772,12 @@ static void node_free_node_ex(bNodeTree *ntree, bNode *node, bool remove_animdat void nodeFreeNode(bNodeTree *ntree, bNode *node) { - node_free_node_ex(ntree, node, true, true); + node_free_node_ex(NULL, ntree, node, false, true); +} + +void nodeDeleteNode(Main *bmain, bNodeTree *ntree, bNode *node) +{ + node_free_node_ex(bmain, ntree, node, true, true); } static void node_socket_interface_free(bNodeTree *UNUSED(ntree), bNodeSocket *sock) @@ -1835,7 +1847,7 @@ void ntreeFreeTree(bNodeTree *ntree) for (node = ntree->nodes.first; node; node = next) { next = node->next; - node_free_node_ex(ntree, node, false, false); + node_free_node_ex(NULL, ntree, node, false, false); } /* free interface sockets */ @@ -2577,7 +2589,7 @@ void BKE_node_clipboard_clear(void) for (node = node_clipboard.nodes.first; node; node = node_next) { node_next = node->next; - node_free_node_ex(NULL, node, false, false); + node_free_node_ex(NULL, NULL, node, false, false); } BLI_listbase_clear(&node_clipboard.nodes); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index aca87261da8..746a37fe565 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1586,7 +1586,7 @@ static int node_delete_exec(bContext *C, wmOperator *UNUSED(op)) do_tag_update |= (do_tag_update || node_connected_to_output(bmain, snode->edittree, node)); if (node->id) id_us_min(node->id); - nodeFreeNode(snode->edittree, node); + nodeDeleteNode(bmain, snode->edittree, node); } } @@ -1666,6 +1666,7 @@ void NODE_OT_switch_view_update(wmOperatorType *ot) /* ****************** Delete with reconnect ******************* */ static int node_delete_reconnect_exec(bContext *C, wmOperator *UNUSED(op)) { + Main *bmain = CTX_data_main(C); SpaceNode *snode = CTX_wm_space_node(C); bNode *node, *next; @@ -1679,7 +1680,7 @@ static int node_delete_reconnect_exec(bContext *C, wmOperator *UNUSED(op)) /* check id user here, nodeFreeNode is called for free dbase too */ if (node->id) id_us_min(node->id); - nodeFreeNode(snode->edittree, node); + nodeDeleteNode(bmain, snode->edittree, node); } } diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c index 4012cfdaebc..c7c856d95c4 100644 --- a/source/blender/editors/space_node/node_group.c +++ b/source/blender/editors/space_node/node_group.c @@ -342,11 +342,11 @@ static int node_group_ungroup(Main *bmain, bNodeTree *ntree, bNode *gnode) while (nodes_delayed_free) { node = BLI_linklist_pop(&nodes_delayed_free); - nodeFreeNode(ntree, node); + nodeDeleteNode(bmain, ntree, node); } /* delete the group instance */ - nodeFreeNode(ntree, gnode); + nodeDeleteNode(bmain, ntree, gnode); ntree->update |= NTREE_UPDATE_NODES | NTREE_UPDATE_LINKS; diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c index 64c898cb628..47e9bc7fa26 100644 --- a/source/blender/editors/space_node/node_templates.c +++ b/source/blender/editors/space_node/node_templates.c @@ -124,7 +124,7 @@ static void node_clear_recursive(bNode *node) node_clear_recursive(input->link->fromnode); } -static void node_remove_linked(bNodeTree *ntree, bNode *rem_node) +static void node_remove_linked(Main *bmain, bNodeTree *ntree, bNode *rem_node) { bNode *node, *next; bNodeSocket *sock; @@ -152,7 +152,7 @@ static void node_remove_linked(bNodeTree *ntree, bNode *rem_node) if (node->flag & NODE_TEST) { if (node->id) id_us_min(node->id); - nodeFreeNode(ntree, node); + nodeDeleteNode(bmain, ntree, node); } } } @@ -178,7 +178,7 @@ static void node_socket_remove(Main *bmain, bNodeTree *ntree, bNode *node_to, bN if (!sock_to->link) return; - node_remove_linked(ntree, sock_to->link->fromnode); + node_remove_linked(bmain, ntree, sock_to->link->fromnode); sock_to->flag |= SOCK_COLLAPSED; nodeUpdate(ntree, node_to); @@ -269,7 +269,7 @@ static void node_socket_add_replace(const bContext *C, bNodeTree *ntree, bNode * } /* remove node */ - node_remove_linked(ntree, node_prev); + node_remove_linked(bmain, ntree, node_prev); } nodeUpdate(ntree, node_from); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 3f7a41c53a7..73f4c05b2f8 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -6281,8 +6281,9 @@ static void special_aftertrans_update__mask(bContext *C, TransInfo *t) } } -static void special_aftertrans_update__node(bContext *UNUSED(C), TransInfo *t) +static void special_aftertrans_update__node(bContext *C, TransInfo *t) { + Main *bmain = CTX_data_main(C); const bool canceled = (t->state == TRANS_CANCEL); if (canceled && t->remove_on_cancel) { @@ -6294,7 +6295,7 @@ static void special_aftertrans_update__node(bContext *UNUSED(C), TransInfo *t) for (node = ntree->nodes.first; node; node = node_next) { node_next = node->next; if (node->flag & NODE_SELECT) - nodeFreeNode(ntree, node); + nodeDeleteNode(bmain, ntree, node); } } } diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 42abf76901c..8169e88cac0 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -748,7 +748,7 @@ static void rna_NodeTree_node_remove(bNodeTree *ntree, Main *bmain, ReportList * } id_us_min(node->id); - nodeFreeNode(ntree, node); + nodeDeleteNode(bmain, ntree, node); RNA_POINTER_INVALIDATE(node_ptr); ntreeUpdateTree(bmain, ntree); /* update group node socket links */ @@ -768,7 +768,7 @@ static void rna_NodeTree_node_clear(bNodeTree *ntree, Main *bmain, ReportList *r if (node->id) id_us_min(node->id); - nodeFreeNode(ntree, node); + nodeDeleteNode(bmain, ntree, node); node = next_node; } |