Revision: 37981
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37981
Author:   lukastoenne
Date:     2011-06-30 12:37:59 +0000 (Thu, 30 Jun 2011)
Log Message:
-----------
When duplicating nodes in a tree, also copy the links between selected nodes, 
as well as input links from non-selected to selected nodes.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_node/node_edit.c

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c 2011-06-30 
07:35:41 UTC (rev 37980)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c 2011-06-30 
12:37:59 UTC (rev 37981)
@@ -2004,19 +2004,16 @@
 {
        SpaceNode *snode= CTX_wm_space_node(C);
        bNodeTree *ntree= snode->edittree;
-       bNode *node, *newnode, *last;
+       bNode *node, *newnode, *lastnode;
+       bNodeLink *link, *newlink, *lastlink;
        
        ED_preview_kill_jobs(C);
        
-       last = ntree->nodes.last;
+       lastnode = ntree->nodes.last;
        for(node= ntree->nodes.first; node; node= node->next) {
                if(node->flag & SELECT) {
                        newnode = nodeCopyNode(ntree, node);
                        
-                       /* 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. */
@@ -2027,10 +2024,56 @@
                }
                
                /* make sure we don't copy new nodes again! */
-               if (node==last)
+               if (node==lastnode)
                        break;
        }
        
+       /* copy links between selected nodes
+        * NB: this depends on correct node->new_node and sock->new_sock 
pointers from above copy!
+        */
+       lastlink = ntree->links.last;
+       for (link=ntree->links.first; link; link=link->next) {
+               /* this creates new links between copied nodes,
+                * as well as input links from unselected (when fromnode==NULL) 
!
+                */
+               if (link->tonode && (link->tonode->flag & NODE_SELECT)) {
+                       newlink = MEM_callocN(sizeof(bNodeLink), "bNodeLink");
+                       newlink->flag = link->flag;
+                       newlink->tonode = link->tonode->new_node;
+                       newlink->tosock = link->tosock->new_sock;
+                       if (link->fromnode && (link->fromnode->flag & 
NODE_SELECT)) {
+                               newlink->fromnode = link->fromnode->new_node;
+                               newlink->fromsock = link->fromsock->new_sock;
+                       }
+                       else {
+                               /* input node not copied, this keeps the 
original input linked */
+                               newlink->fromnode = link->fromnode;
+                               newlink->fromsock = link->fromsock;
+                       }
+                       
+                       BLI_addtail(&ntree->links, newlink);
+               }
+               
+               /* make sure we don't copy new links again! */
+               if (link==lastlink)
+                       break;
+       }
+       
+       /* deselect old nodes, select the copies instead */
+       for(node= ntree->nodes.first; node; node= node->next) {
+               if(node->flag & SELECT) {
+                       /* has been set during copy above */
+                       newnode = node->new_node;
+                       
+                       node->flag &= ~(NODE_SELECT|NODE_ACTIVE);
+                       newnode->flag |= NODE_SELECT;
+               }
+               
+               /* make sure we don't copy new nodes again! */
+               if (node==lastnode)
+                       break;
+       }
+       
        ntreeSolveOrder(ntree);
        
        node_tree_verify_groups(snode->nodetree);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to