diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-08-20 17:51:25 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-08-20 17:51:25 +0400 |
commit | 0f6a6c7499f0c1fa509355c5967f30a42cfa771e (patch) | |
tree | 0de8396d8dd554719f2103276ec14398b18ec298 /source/blender/editors/space_node/node_edit.c | |
parent | ad647b2767ea8b5cdc24cb3fae1173eca8a0da9b (diff) |
fix for crash pasting nodes into a node tree when the ID pointer is lost.
also fix for ID user count on paste which wasn't increasing.
Diffstat (limited to 'source/blender/editors/space_node/node_edit.c')
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index e4fc19fbd08..6d01fc83647 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -2019,10 +2019,13 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *op) bNodeTree *ntree = snode->edittree; bNode *gnode = node_tree_get_editgroup(snode->nodetree); float gnode_x = 0.0f, gnode_y = 0.0f; + const ListBase *clipboard_nodes_lb; + const ListBase *clipboard_links_lb; bNode *node; bNodeLink *link; int num_nodes; float centerx, centery; + int is_clipboard_valid; if (BKE_node_clipboard_get_type() != ntree->type) { BKE_report(op->reports, RPT_ERROR, "Clipboard nodes are an incompatible type"); @@ -2038,10 +2041,17 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *op) if (gnode) nodeToView(gnode, 0.0f, 0.0f, &gnode_x, &gnode_y); + + /* validate pointers in the clipboard */ + is_clipboard_valid = BKE_node_clipboard_validate(); + + clipboard_nodes_lb = BKE_node_clipboard_get_nodes(); + clipboard_links_lb = BKE_node_clipboard_get_links(); + /* calculate "barycenter" for placing on mouse cursor */ num_nodes = 0; centerx = centery = 0.0f; - for (node = BKE_node_clipboard_get_nodes()->first; node; node = node->next) { + for (node = clipboard_nodes_lb->first; node; node = node->next) { ++num_nodes; centerx += 0.5f * (node->totr.xmin + node->totr.xmax); centery += 0.5f * (node->totr.ymin + node->totr.ymax); @@ -2050,15 +2060,18 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *op) centery /= num_nodes; /* copy nodes from clipboard */ - for (node = BKE_node_clipboard_get_nodes()->first; node; node = node->next) { + for (node = clipboard_nodes_lb->first; node; node = node->next) { bNode *new_node = nodeCopyNode(ntree, node); + /* needed since nodeCopyNode() doesn't increase ID's */ + id_us_plus(node->id); + /* pasted nodes are selected */ node_select(new_node); } /* reparent copied nodes */ - for (node = BKE_node_clipboard_get_nodes()->first; node; node = node->next) { + for (node = clipboard_nodes_lb->first; node; node = node->next) { bNode *new_node = node->new_node; if (new_node->parent) new_node->parent = new_node->parent->new_node; @@ -2071,7 +2084,7 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *op) } } - for (link = BKE_node_clipboard_get_links()->first; link; link = link->next) { + for (link = clipboard_links_lb->first; link; link = link->next) { nodeAddLink(ntree, link->fromnode->new_node, link->fromsock->new_sock, link->tonode->new_node, link->tosock->new_sock); } @@ -2081,6 +2094,10 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *op) snode_notify(C, snode); snode_dag_update(C, snode); + if (is_clipboard_valid == FALSE) { + BKE_report(op->reports, RPT_ERROR, "Some nodes ID references could not be found"); + } + return OPERATOR_FINISHED; } |