[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49526] trunk/blender/source/blender/ editors/space_node/node_edit.c: Fix for node placement when copying to/ pasting from clipboard.

Lukas Toenne lukas.toenne at googlemail.com
Fri Aug 3 12:51:30 CEST 2012


Revision: 49526
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49526
Author:   lukastoenne
Date:     2012-08-03 10:51:29 +0000 (Fri, 03 Aug 2012)
Log Message:
-----------
Fix for node placement when copying to/pasting from clipboard. Child node location is always relative to parent nodes (if the parent is also copied) and must not be offset. Also takes the offset of the edited node group in the editor into account now.

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	2012-08-03 10:42:21 UTC (rev 49525)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2012-08-03 10:51:29 UTC (rev 49526)
@@ -1904,7 +1904,9 @@
 {
 	SpaceNode *snode = CTX_wm_space_node(C);
 	bNodeTree *ntree = snode->edittree;
-	bNode *node, *newnode;
+	bNode *gnode = node_tree_get_editgroup(snode->nodetree);
+	float gnode_x = 0.0f, gnode_y = 0.0f;
+	bNode *node, *new_node;
 	bNodeLink *link, *newlink;
 
 	ED_preview_kill_jobs(C);
@@ -1912,17 +1914,22 @@
 	/* clear current clipboard */
 	nodeClipboardClear();
 
+	/* get group node offset */
+	if (gnode)
+		nodeToView(gnode, 0.0f, 0.0f, &gnode_x, &gnode_y);
+	
 	for (node = ntree->nodes.first; node; node = node->next) {
 		if (node->flag & SELECT) {
-			newnode = nodeCopyNode(NULL, node);
-			nodeClipboardAddNode(newnode);
+			new_node = nodeCopyNode(NULL, node);
+			nodeClipboardAddNode(new_node);
 		}
 	}
 
-	/* ensure valid pointers */
 	for (node = ntree->nodes.first; node; node = node->next) {
 		if (node->flag & SELECT) {
 			bNode *new_node = node->new_node;
+			
+			/* ensure valid pointers */
 			if (new_node->parent) {
 				/* parent pointer must be redirected to new node or detached if parent is not copied */
 				if (new_node->parent->flag & NODE_SELECT) {
@@ -1932,6 +1939,12 @@
 					nodeDetachNode(new_node);
 				}
 			}
+
+			/* transform to basic view space. child node location is relative to parent */
+			if (!new_node->parent) {	
+				new_node->locx += gnode_x;
+				new_node->locy += gnode_y;
+			}
 		}
 	}
 
@@ -1978,6 +1991,8 @@
 {
 	SpaceNode *snode = CTX_wm_space_node(C);
 	bNodeTree *ntree = snode->edittree;
+	bNode *gnode = node_tree_get_editgroup(snode->nodetree);
+	float gnode_x = 0.0f, gnode_y = 0.0f;
 	bNode *node;
 	bNodeLink *link;
 	int num_nodes;
@@ -1988,13 +2003,17 @@
 	/* deselect old nodes */
 	node_deselect_all(snode);
 
+	/* get group node offset */
+	if (gnode)
+		nodeToView(gnode, 0.0f, 0.0f, &gnode_x, &gnode_y);
+
 	/* calculate "barycenter" for placing on mouse cursor */
 	num_nodes = 0;
 	centerx = centery = 0.0f;
 	for (node = nodeClipboardGetNodes()->first; node; node = node->next) {
 		++num_nodes;
-		centerx += node->locx + 0.5f * node->width;
-		centery += node->locy - 0.5f * node->height;
+		centerx += 0.5f * (node->totr.xmin + node->totr.xmax);
+		centery += 0.5f * (node->totr.ymin + node->totr.ymax);
 	}
 	centerx /= num_nodes;
 	centery /= num_nodes;
@@ -2005,10 +2024,6 @@
 
 		/* pasted nodes are selected */
 		node_select(new_node);
-
-		/* place nodes around the mouse cursor */
-		new_node->locx += snode->mx - centerx;
-		new_node->locy += snode->my - centery;
 	}
 	
 	/* reparent copied nodes */
@@ -2016,6 +2031,13 @@
 		bNode *new_node = node->new_node;
 		if (new_node->parent)
 			new_node->parent = new_node->parent->new_node;
+		
+		
+		/* place nodes around the mouse cursor. child nodes locations are relative to parent */
+		if (!new_node->parent) {
+			new_node->locx += snode->mx - centerx - gnode_x;
+			new_node->locy += snode->my - centery - gnode_y;
+		}
 	}
 
 	for (link = nodeClipboardGetLinks()->first; link; link = link->next) {




More information about the Bf-blender-cvs mailing list