[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