[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35130] branches/particles-2010/source/ blender: Added a "while" loop implementation: The group tree is executed as long as the condition output is set to true (i.e.

Lukas Toenne lukas.toenne at googlemail.com
Thu Feb 24 18:22:45 CET 2011


Revision: 35130
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35130
Author:   lukastoenne
Date:     2011-02-24 17:22:45 +0000 (Thu, 24 Feb 2011)
Log Message:
-----------
Added a "while" loop implementation: The group tree is executed as long as the condition output is set to true (i.e. > 0). Fixed a couple of bugs and streamlined the group code a bit.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/editors/space_node/drawnode.c
    branches/particles-2010/source/blender/editors/space_node/node_header.c
    branches/particles-2010/source/blender/makesrna/RNA_access.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/node_common.c
    branches/particles-2010/source/blender/nodes/intern/node_common.h
    branches/particles-2010/source/blender/nodes/intern/node_exec.c
    branches/particles-2010/source/blender/nodes/intern/node_exec.h

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-24 16:04:36 UTC (rev 35129)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-24 17:22:45 UTC (rev 35130)
@@ -192,7 +192,6 @@
 #define NODE_CLASS_MATH_ROTATION	19
 #define NODE_CLASS_PARTICLES		25
 #define NODE_CLASS_TRANSFORM		30
-#define NODE_CLASS_FORLOOP			50
 
 /* enum values for input/output */
 #define SOCK_IN		1
@@ -361,6 +360,7 @@
 
 #define NODE_GROUP		2
 #define NODE_FORLOOP	3
+#define NODE_WHILELOOP	4
 #define NODE_GROUP_MENU		10000
 #define NODE_DYNAMIC_MENU	20000
 
@@ -379,10 +379,9 @@
 struct bNode	*node_group_make_from_selected(struct bNodeTree *ntree);
 int				node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode);
 
-/* For Loop */
-void forloop_sync(struct bNodeTree *ntree, int sync_in_out);
-
+/* Loops */
 void register_node_type_forloop(ListBase *lb);
+void register_node_type_whileloop(ListBase *lb);
 
 /* ************** SHADER NODES *************** */
 

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-24 16:04:36 UTC (rev 35129)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-24 17:22:45 UTC (rev 35130)
@@ -1671,6 +1671,7 @@
 {
 	register_node_type_group(ntypelist);
 	register_node_type_forloop(ntypelist);
+	register_node_type_whileloop(ntypelist);
 	
 	register_node_type_cmp_rlayers(ntypelist);
 	register_node_type_cmp_image(ntypelist);
@@ -1748,6 +1749,7 @@
 {
 	register_node_type_group(ntypelist);
 	register_node_type_forloop(ntypelist);
+	register_node_type_whileloop(ntypelist);
 	
 	register_node_type_sh_output(ntypelist);
 	register_node_type_sh_mix_rgb(ntypelist);
@@ -1778,6 +1780,7 @@
 {
 	register_node_type_group(ntypelist);
 	register_node_type_forloop(ntypelist);
+	register_node_type_whileloop(ntypelist);
 	
 	register_node_type_tex_math(ntypelist);
 	register_node_type_tex_mix_rgb(ntypelist);
@@ -1822,6 +1825,7 @@
 {
 	register_node_type_group(ntypelist);
 	register_node_type_forloop(ntypelist);
+	register_node_type_whileloop(ntypelist);
 	
 	#if 0
 	nodeRegisterModMesh(ntypelist);
@@ -1835,6 +1839,7 @@
 {
 	register_node_type_group(ntypelist);
 	register_node_type_forloop(ntypelist);
+	register_node_type_whileloop(ntypelist);
 }
 
 static void remove_dynamic_typeinfos(ListBase *list)

Modified: branches/particles-2010/source/blender/editors/space_node/drawnode.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/drawnode.c	2011-02-24 16:04:36 UTC (rev 35129)
+++ branches/particles-2010/source/blender/editors/space_node/drawnode.c	2011-02-24 17:22:45 UTC (rev 35130)
@@ -329,34 +329,98 @@
 		
 		/* input sockets */
 		dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1);
-		for(gsock=ngroup->inputs.first, sock=gnode->inputs.first; gsock; gsock=gsock->next, sock=sock->next) {
-			gsock->locx = rect->xmin;
-			sock->locx = rect->xmin - NODE_GROUP_FRAME;
-			sock->locy = gsock->locy = dy;
-			
-			/* prevent long socket lists from growing out of the group box */
-			if (dy-3*NODE_DYS < rect->ymin)
-				rect->ymin = dy-3*NODE_DYS;
-			if (dy+3*NODE_DYS > rect->ymax)
-				rect->ymax = dy+3*NODE_DYS;
-			
-			dy -= 2*NODE_DY;
+		gsock=ngroup->inputs.first;
+		sock=gnode->inputs.first;
+		while (gsock || sock) {
+			while (sock && !sock->groupsock) {
+				sock->locx = rect->xmin - NODE_GROUP_FRAME;
+				sock->locy = dy;
+
+				/* prevent long socket lists from growing out of the group box */
+				if (dy-3*NODE_DYS < rect->ymin)
+					rect->ymin = dy-3*NODE_DYS;
+				if (dy+3*NODE_DYS > rect->ymax)
+					rect->ymax = dy+3*NODE_DYS;
+				dy -= 2*NODE_DY;
+				
+				sock = sock->next;
+			}
+			while (gsock && (!sock || sock->groupsock!=gsock)) {
+				gsock->locx = rect->xmin;
+				gsock->locy = dy;
+				
+				/* prevent long socket lists from growing out of the group box */
+				if (dy-3*NODE_DYS < rect->ymin)
+					rect->ymin = dy-3*NODE_DYS;
+				if (dy+3*NODE_DYS > rect->ymax)
+					rect->ymax = dy+3*NODE_DYS;
+				dy -= 2*NODE_DY;
+				
+				gsock = gsock->next;
+			}
+			while (sock && gsock && sock->groupsock==gsock) {
+				gsock->locx = rect->xmin;
+				sock->locx = rect->xmin - NODE_GROUP_FRAME;
+				sock->locy = gsock->locy = dy;
+				
+				/* prevent long socket lists from growing out of the group box */
+				if (dy-3*NODE_DYS < rect->ymin)
+					rect->ymin = dy-3*NODE_DYS;
+				if (dy+3*NODE_DYS > rect->ymax)
+					rect->ymax = dy+3*NODE_DYS;
+				dy -= 2*NODE_DY;
+				
+				sock = sock->next;
+				gsock = gsock->next;
+			}
 		}
 		
 		/* output sockets */
 		dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1);
-		for(gsock=ngroup->outputs.first, sock=gnode->outputs.first; gsock; gsock=gsock->next, sock=sock->next) {
-			gsock->locx = rect->xmax;
-			sock->locx = rect->xmax + NODE_GROUP_FRAME;
-			sock->locy = gsock->locy = dy - NODE_DYS;
-			
-			/* prevent long socket lists from growing out of the group box */
-			if (dy-3*NODE_DYS < rect->ymin)
-				rect->ymin = dy-3*NODE_DYS;
-			if (dy+3*NODE_DYS > rect->ymax)
-				rect->ymax = dy+3*NODE_DYS;
-			
-			dy -= 2*NODE_DY;
+		gsock=ngroup->outputs.first;
+		sock=gnode->outputs.first;
+		while (gsock || sock) {
+			while (sock && !sock->groupsock) {
+				sock->locx = rect->xmax + NODE_GROUP_FRAME;
+				sock->locy = dy - NODE_DYS;
+				
+				/* prevent long socket lists from growing out of the group box */
+				if (dy-3*NODE_DYS < rect->ymin)
+					rect->ymin = dy-3*NODE_DYS;
+				if (dy+3*NODE_DYS > rect->ymax)
+					rect->ymax = dy+3*NODE_DYS;
+				dy -= 2*NODE_DY;
+				
+				sock = sock->next;
+			}
+			while (gsock && (!sock || sock->groupsock!=gsock)) {
+				gsock->locx = rect->xmax;
+				gsock->locy = dy - NODE_DYS;
+				
+				/* prevent long socket lists from growing out of the group box */
+				if (dy-3*NODE_DYS < rect->ymin)
+					rect->ymin = dy-3*NODE_DYS;
+				if (dy+3*NODE_DYS > rect->ymax)
+					rect->ymax = dy+3*NODE_DYS;
+				dy -= 2*NODE_DY;
+				
+				gsock = gsock->next;
+			}
+			while (sock && gsock && sock->groupsock==gsock) {
+				gsock->locx = rect->xmax;
+				sock->locx = rect->xmax + NODE_GROUP_FRAME;
+				sock->locy = gsock->locy = dy - NODE_DYS;
+				
+				/* prevent long socket lists from growing out of the group box */
+				if (dy-3*NODE_DYS < rect->ymin)
+					rect->ymin = dy-3*NODE_DYS;
+				if (dy+3*NODE_DYS > rect->ymax)
+					rect->ymax = dy+3*NODE_DYS;
+				dy -= 2*NODE_DY;
+				
+				sock = sock->next;
+				gsock = gsock->next;
+			}
 		}
 	}
 }
@@ -377,6 +441,96 @@
 	ntreeUpdateTree(ngroup);
 }
 
+static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *sock, int in_out, float xoffset, float yoffset)
+{
+	bNodeTree *ngroup= (bNodeTree*)gnode->id;
+	uiBut *bt;
+	
+	if (sock->flag & SOCK_STATIC)
+		uiDefBut(gnode->block, LABEL, 0, sock->name, 
+				 sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
+				 NULL, 0, 31, 0, 0, "");
+	else {
+		bt = uiDefBut(gnode->block, TEX, 0, "", 
+					  sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
+					  sock->name, 0, 31, 0, 0, "");
+		if (in_out==SOCK_IN)
+			uiButSetFunc(bt, update_group_input_cb, snode, ngroup);
+		else
+			uiButSetFunc(bt, update_group_output_cb, snode, ngroup);
+	}
+}
+
+static void draw_group_socket(SpaceNode *snode, bNodeTree *ntree, bNode *gnode, bNodeSocket *sock, bNodeSocket *gsock, int index, int in_out)
+{
+	bNodeTree *ngroup= (bNodeTree*)gnode->id;
+	uiBut *bt;
+	float offset;
+	
+	/* node and group socket circles */
+	if (sock)
+		node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
+	if (gsock)
+		node_socket_circle_draw(ngroup, gsock, NODE_SOCKSIZE);
+	
+	/* socket name */
+	offset = (in_out==SOCK_IN ? -114 : 42);
+	if (!gsock)
+		offset += (in_out==SOCK_IN ? NODE_GROUP_FRAME : -NODE_GROUP_FRAME);
+	if ((gsock && (gsock->flag & SOCK_INTERNAL)) || (in_out==SOCK_OUT && sock && sock->link)) {
+		/* only name, no value button */
+		if (gsock)
+			draw_group_socket_name(snode, gnode, gsock, in_out, offset, -NODE_DYS);
+		else
+			draw_group_socket_name(snode, gnode, sock, in_out, offset, -NODE_DYS);
+	}
+	else {
+		/* both name and value buttons */
+		if (gsock) {
+			draw_group_socket_name(snode, gnode, gsock, in_out, offset, 0);
+			node_draw_socket_button(ngroup, gsock, "", gnode->block,
+									gsock->locx+offset, gsock->locy-NODE_DY, 72,
+									NULL, NULL, NULL);
+		}
+		else {
+			draw_group_socket_name(snode, gnode, sock, in_out, offset, 0);
+			node_draw_socket_button(ngroup, sock, "", gnode->block,
+									sock->locx+offset, sock->locy-NODE_DY, 72,
+									NULL, NULL, NULL);
+		}
+	}
+	
+	if (gsock && !(gsock->flag & SOCK_STATIC)) {
+		/* up/down buttons */
+		offset = (in_out==SOCK_IN ? -40 : 24);
+		uiBlockSetDirection(gnode->block, UI_TOP);
+		uiBlockBeginAlign(gnode->block);
+		bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
+						   gsock->locx+offset, gsock->locy, 16, 16, "");
+		if (!gsock->prev || (gsock->prev->flag & SOCK_STATIC))
+			uiButSetFlag(bt, UI_BUT_DISABLED);
+		RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+		RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
+		bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
+						   gsock->locx+offset, gsock->locy-16, 16, 16, "");
+		if (!gsock->next || (gsock->next->flag & SOCK_STATIC))
+			uiButSetFlag(bt, UI_BUT_DISABLED);
+		RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+		RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
+		uiBlockEndAlign(gnode->block);
+		uiBlockSetDirection(gnode->block, 0);
+		
+		/* remove button */
+		offset = (in_out==SOCK_IN ? -22 : 6);
+		uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
+		bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
+						   gsock->locx+offset, gsock->locy-8, 16, 16, "");
+		RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+		RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
+		uiBlockSetEmboss(gnode->block, UI_EMBOSS);
+	}
+}
+
 /* groups are, on creation, centered around 0,0 */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list