[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13017] trunk/blender/source/blender: Toggle links tool for Node Editor

Juho Vepsalainen bebraw at gmail.com
Thu Dec 27 11:17:33 CET 2007


Revision: 13017
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13017
Author:   bebraw
Date:     2007-12-27 11:17:33 +0100 (Thu, 27 Dec 2007)

Log Message:
-----------
Toggle links tool for Node Editor
This commit adds a new tool, Toggle Links, to the node editor. This tool
allows the user to toggle the status (linked/not linked) between desired
sockets. The tool can be used either by using the f key or the menus.

This functionality is analogue to one found in object editing modes except
for its additional toggle functionality.

To use this tool, the user has to first select an input and an output socket.
Selecting is done by clicking with right mouse button on a socket. After the 
tool has been invoked, the link between those two sockets is toggled. The 
result may vary based on existing linkage.

There can be only one input and one output selected at maximum in a node 
tree. This means that if the user selects a socket while one of the same 
type is already selected, the old one will be deselected.

The tool complements the current way of connecting nodes. One possible use
for it is to use it to review output of nodes by using a viewer node. Just
select wanted input socket of a viewer node, set it visible and use selection 
of an output socket in conjuction with f key to show the output in the viewer
node. Select another output and hit f to see its output and so on.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/include/BSE_node.h
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/src/drawnode.c
    trunk/blender/source/blender/src/editnode.c
    trunk/blender/source/blender/src/header_node.c
    trunk/blender/source/blender/src/toolbox.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2007-12-27 08:36:27 UTC (rev 13016)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2007-12-27 10:17:33 UTC (rev 13017)
@@ -143,6 +143,7 @@
 
 void			nodeAddToPreview(struct bNode *, float *, int, int);
 
+void			nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
 struct bNode	*nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup);
 void			nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
 struct bNode	*nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
@@ -150,6 +151,8 @@
 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
 void			nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
 
+int			nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
+
 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
 int				nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
 

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2007-12-27 08:36:27 UTC (rev 13016)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2007-12-27 10:17:33 UTC (rev 13017)
@@ -483,6 +483,20 @@
 			BLI_addtail(&ngroup->nodes, node);
 			node->locx-= 0.5f*(min[0]+max[0]);
 			node->locy-= 0.5f*(min[1]+max[1]);
+
+			/* set selin and selout of the nodetree */
+			for(sock= node->inputs.first; sock; sock= sock->next) {
+				if(sock->flag & SOCK_SEL) {
+					ngroup->selin= sock;
+					break;
+				}
+			}
+			for(sock= node->outputs.first; sock; sock= sock->next) {
+				if(sock->flag & SOCK_SEL) {
+					ngroup->selout= sock;
+					break;
+				}
+			}
 		}
 	}
 
@@ -653,7 +667,8 @@
 	}
 }
 
-static void find_node_with_socket(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockindex)
+/* finds a node based on given socket */
+int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockindex)
 {
 	bNode *node;
 	bNodeSocket *tsock;
@@ -671,13 +686,15 @@
 		if(tsock)
 			break;
 	}
+
 	if(node) {
 		*nodep= node;
-		*sockindex= index;
+		if(sockindex) *sockindex= index;
+		return 1;
 	}
-	else {
-		*nodep= NULL;
-	}
+	
+	*nodep= NULL;
+	return 0;
 }
 
 /* returns 1 if its OK */
@@ -717,7 +734,7 @@
 	for(link= ntree->links.first; link; link= link->next) {
 		if(link->tonode==gnode) {
 			/* link->tosock->tosock is on the node we look for */
-			find_node_with_socket(ngroup, link->tosock->tosock, &nextn, &index);
+			nodeFindNode(ngroup, link->tosock->tosock, &nextn, &index);
 			if(nextn==NULL) printf("wrong stuff!\n");
 			else if(nextn->new_node==NULL) printf("wrong stuff too!\n");
 			else {
@@ -727,7 +744,7 @@
 		}
 		else if(link->fromnode==gnode) {
 			/* link->fromsock->tosock is on the node we look for */
-			find_node_with_socket(ngroup, link->fromsock->tosock, &nextn, &index);
+			nodeFindNode(ngroup, link->fromsock->tosock, &nextn, &index);
 			if(nextn==NULL) printf("1 wrong stuff!\n");
 			else if(nextn->new_node==NULL) printf("1 wrong stuff too!\n");
 			else {
@@ -898,6 +915,28 @@
 				nnode->flag |= NODE_SELECT;
 			}
 			node->flag &= ~NODE_ACTIVE;
+
+			/* deselect original sockets */
+			for(sock= node->inputs.first; sock; sock= sock->next) {
+				if(sock->flag & SOCK_SEL) sock->flag&= ~SOCK_SEL;
+			}
+			for(sock= node->outputs.first; sock; sock= sock->next) {
+				if(sock->flag & SOCK_SEL) sock->flag&= ~SOCK_SEL;
+			}
+			
+			/* set tree selin and selout to new sockets */
+			for(sock= nnode->inputs.first; sock; sock= sock->next) {
+				if(sock->flag & SOCK_SEL) {
+					ntree->selin= sock;
+					break;
+				}
+			}
+			for(sock= nnode->outputs.first; sock; sock= sock->next) {
+				if(sock->flag & SOCK_SEL) {
+					ntree->selout= sock;
+					break;
+				}
+			}
 		}
 		if(node==last) break;
 	}
@@ -941,7 +980,7 @@
 /* ************** Free stuff ********** */
 
 /* goes over entire tree */
-static void node_unlink_node(bNodeTree *ntree, bNode *node)
+void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
 {
 	bNodeLink *link, *next;
 	bNodeSocket *sock;
@@ -985,7 +1024,7 @@
 
 void nodeFreeNode(bNodeTree *ntree, bNode *node)
 {
-	node_unlink_node(ntree, node);
+	nodeUnlinkNode(ntree, node);
 	BLI_remlink(&ntree->nodes, node);
 
 	/* since it is called while free database, node->id is undefined */

Modified: trunk/blender/source/blender/include/BSE_node.h
===================================================================
--- trunk/blender/source/blender/include/BSE_node.h	2007-12-27 08:36:27 UTC (rev 13016)
+++ trunk/blender/source/blender/include/BSE_node.h	2007-12-27 10:17:33 UTC (rev 13017)
@@ -72,6 +72,7 @@
 void node_hide(struct SpaceNode *snode);
 void node_read_renderlayers(struct SpaceNode *snode);
 void clear_scene_in_nodes(struct Scene *sce);
+void node_toggle_link(struct SpaceNode *snode);
 
 void node_transform_ext(int mode, int unused);
 void node_shader_default(struct Material *ma);

Modified: trunk/blender/source/blender/makesdna/DNA_node_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_node_types.h	2007-12-27 08:36:27 UTC (rev 13016)
+++ trunk/blender/source/blender/makesdna/DNA_node_types.h	2007-12-27 10:17:33 UTC (rev 13017)
@@ -92,7 +92,8 @@
 #define SOCK_IN_USE				4
 		/* unavailable is for dynamic sockets */
 #define SOCK_UNAVAIL			8
-
+		/* flag for selection status */
+#define SOCK_SEL			16
 #
 #
 typedef struct bNodePreview {
@@ -167,6 +168,10 @@
 	ListBase alltypes;				/* type definitions */
 	struct bNodeType *owntype;		/* for groups or dynamic trees, no read/write */
 
+	/* selected input/output socket */
+	bNodeSocket *selin;
+	bNodeSocket *selout;
+
 	/* callbacks */
 	void (*timecursor)(int nr);
 	void (*stats_draw)(char *str);

Modified: trunk/blender/source/blender/src/drawnode.c
===================================================================
--- trunk/blender/source/blender/src/drawnode.c	2007-12-27 08:36:27 UTC (rev 13016)
+++ trunk/blender/source/blender/src/drawnode.c	2007-12-27 10:17:33 UTC (rev 13017)
@@ -1988,7 +1988,8 @@
 }
 
 /* nice AA filled circle */
-static void socket_circle_draw(float x, float y, float size, int type, int select)
+/* this might have some more generic use */
+static void circle_draw(float x, float y, float size, int type, int col[3])
 {
 	/* 16 values of sin function */
 	static float si[16] = {
@@ -2006,28 +2007,7 @@
 	};
 	int a;
 	
-	if(select==0) {
-		if(type==-1)
-			glColor3ub(0, 0, 0);
-		else if(type==SOCK_VALUE)
-			glColor3ub(160, 160, 160);
-		else if(type==SOCK_VECTOR)
-			glColor3ub(100, 100, 200);
-		else if(type==SOCK_RGBA)
-			glColor3ub(200, 200, 40);
-		else 
-			glColor3ub(100, 200, 100);
-	}
-	else {
-		if(type==SOCK_VALUE)
-			glColor3ub(200, 200, 200);
-		else if(type==SOCK_VECTOR)
-			glColor3ub(140, 140, 240);
-		else if(type==SOCK_RGBA)
-			glColor3ub(240, 240, 100);
-		else 
-			glColor3ub(140, 240, 140);
-	}
+	glColor3ub(col[0], col[1], col[2]);
 	
 	glBegin(GL_POLYGON);
 	for(a=0; a<16; a++)
@@ -2045,6 +2025,41 @@
 	glDisable(GL_BLEND);
 }
 
+static void socket_circle_draw(bNodeSocket *sock, float size)
+{
+	int col[3];
+	
+	/* choose color based on sock flags */
+	if(sock->flag & SELECT) {
+		if(sock->flag & SOCK_SEL) {
+			col[0]= 240; col[1]= 200; col[2]= 40;}
+		else if(sock->type==SOCK_VALUE) {
+			col[0]= 200; col[1]= 200; col[2]= 200;}
+		else if(sock->type==SOCK_VECTOR) {
+			col[0]= 140; col[1]= 140; col[2]= 240;}
+		else if(sock->type==SOCK_RGBA) {
+			col[0]= 240; col[1]= 240; col[2]= 100;}
+		else {
+			col[0]= 140; col[1]= 240; col[2]= 140;}
+	}
+	else if(sock->flag & SOCK_SEL) {
+		col[0]= 200; col[1]= 160; col[2]= 0;}
+	else {
+		if(sock->type==-1) {
+			col[0]= 0; col[1]= 0; col[2]= 0;}
+		else if(sock->type==SOCK_VALUE) {
+			col[0]= 160; col[1]= 160; col[2]= 160;}
+		else if(sock->type==SOCK_VECTOR) {
+			col[0]= 100; col[1]= 100; col[2]= 200;}
+		else if(sock->type==SOCK_RGBA) {
+			col[0]= 200; col[1]= 200; col[2]= 40;}
+		else { 
+			col[0]= 100; col[1]= 200; col[2]= 100;}
+	}
+	
+	circle_draw(sock->locx, sock->locy, size, sock->type, col);
+}
+
 /* not a callback */
 static void node_draw_preview(bNodePreview *preview, rctf *prv)
 {
@@ -2459,7 +2474,7 @@
 	/* socket inputs, buttons */
 	for(sock= node->inputs.first; sock; sock= sock->next) {
 		if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
-			socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+			socket_circle_draw(sock, NODE_SOCKSIZE);
 			
 			if(block && sock->link==NULL) {
 				float *butpoin= sock->ns.vec;
@@ -2501,7 +2516,7 @@
 	/* socket outputs */
 	for(sock= node->outputs.first; sock; sock= sock->next) {
 		if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
-			socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+			socket_circle_draw(sock, NODE_SOCKSIZE);
 			
 			BIF_ThemeColor(TH_TEXT);
 			ofs= 0;
@@ -2589,12 +2604,12 @@
 	/* sockets */
 	for(sock= node->inputs.first; sock; sock= sock->next) {
 		if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
-			socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+			socket_circle_draw(sock, NODE_SOCKSIZE);
 	}
 	
 	for(sock= node->outputs.first; sock; sock= sock->next) {
 		if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
-			socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+			socket_circle_draw(sock, NODE_SOCKSIZE);
 	}
 }
 
@@ -2805,10 +2820,10 @@
 	/* group sockets */
 	for(sock= gnode->inputs.first; sock; sock= sock->next)
 		if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
-			socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+			socket_circle_draw(sock, NODE_SOCKSIZE);
 	for(sock= gnode->outputs.first; sock; sock= sock->next)
 		if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
-			socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+			socket_circle_draw(sock, NODE_SOCKSIZE);
 
 	/* and finally the whole tree */
 	node_draw_nodetree(sa, snode, ngroup);

Modified: trunk/blender/source/blender/src/editnode.c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list