[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37981] trunk/blender/source/blender/ editors/space_node/node_edit.c: When duplicating nodes in a tree, also copy the links between selected nodes, as well as input links from non-selected to selected nodes.

Lukas Toenne lukas.toenne at googlemail.com
Thu Jun 30 14:38:00 CEST 2011


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);




More information about the Bf-blender-cvs mailing list