[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