Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_node/node_edit.c')
-rw-r--r--source/blender/editors/space_node/node_edit.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 7827058f886..624630b9846 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -1693,27 +1693,36 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
static int node_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
- bNode *node;
+ bNodeTree *ntree= snode->edittree;
+ bNode *node, *newnode, *last;
ED_preview_kill_jobs(C);
-
- /* simple id user adjustment, node internal functions dont touch this
- * but operators and readfile.c do. */
- for(node= snode->edittree->nodes.first; node; node= node->next) {
+
+ last = ntree->nodes.last;
+ for(node= ntree->nodes.first; node; node= node->next) {
if(node->flag & SELECT) {
- id_us_plus(node->id);
+ newnode = nodeCopyNode(ntree, node, 1);
+
+ /* deselect old node, select the copy instead */
+ node->flag &= ~(NODE_SELECT|NODE_ACTIVE);
+ newnode->flag |= NODE_SELECT;
+
+ if(newnode->id) {
+ /* simple id user adjustment, node internal functions dont touch this
+ * but operators and readfile.c do. */
+ id_us_plus(newnode->id);
+ /* to ensure redraws or rerenders happen */
+ ED_node_changed_update(snode->id, newnode);
+ }
}
+
+ /* make sure we don't copy new nodes again! */
+ if (node==last)
+ break;
}
-
- ntreeCopyTree(snode->edittree, 1); /* 1 == internally selected nodes */
- /* to ensure redraws or rerenders happen */
- for(node= snode->edittree->nodes.first; node; node= node->next)
- if(node->flag & SELECT)
- if(node->id)
- ED_node_changed_update(snode->id, node);
+ ntreeSolveOrder(ntree);
- ntreeSolveOrder(snode->edittree);
node_tree_verify_groups(snode->nodetree);
snode_notify(C, snode);