[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30487] branches/particles-2010/source/ blender: Nested node execution for simulation nodes.

Lukas Toenne lukas.toenne at googlemail.com
Mon Jul 19 09:54:37 CEST 2010


Revision: 30487
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30487
Author:   lukastoenne
Date:     2010-07-19 09:54:37 +0200 (Mon, 19 Jul 2010)

Log Message:
-----------
Nested node execution for simulation nodes. 'Operator'-nodes can now be executed by other nodes during tree execution. Does not work with group nodes yet.

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/node_draw.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h
    branches/particles-2010/source/blender/nodes/SIM_node.h
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_debugprint.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_subprogram.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.h
    branches/particles-2010/source/blender/nodes/intern/node_tree_simulation.c
    branches/particles-2010/source/blender/nodes/intern/node_util.h

Added Paths:
-----------
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-07-19 07:29:52 UTC (rev 30486)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-07-19 07:54:37 UTC (rev 30487)
@@ -44,6 +44,7 @@
 struct bNodeLink;
 struct bNodeSocket;
 struct bNodeStack;
+struct bNodeOperatorContext;
 struct uiLayout;
 struct rctf;
 struct RenderData;
@@ -472,12 +473,15 @@
 #define SIM_NODE_SUBPROGRAM	602
 #define SIM_NODE_IF			603
 #define SIM_NODE_TIMESTEP	604
+#define SIM_NODE_PASS		605
 
 #define SIM_NODE_DEBUGPRINT	699
 
 /* API */
 void ntreeSimulationExecTree(struct SimulationContext *sim, int thread);
 
+/* Note: this function should only be called from within other nodes execution functions! */
+void ntreeSimulationExecOperator(struct SimulationContext *sim, struct bNodeOperatorContext *ctx);
 
 /**/
 

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-07-19 07:29:52 UTC (rev 30486)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-07-19 07:54:37 UTC (rev 30487)
@@ -168,6 +168,8 @@
 	sock->ns.min= stype->min;
 	sock->ns.max= stype->max;
 	
+	sock->stype = stype;
+	
 	if(lb)
 		BLI_addtail(lb, sock);
 
@@ -194,6 +196,8 @@
 	sock->ns.min= stype->min;
 	sock->ns.max= stype->max;
 	
+	sock->stype = stype;
+	
 	if(lb) {
 		if (next_sock)
 			BLI_insertlinkbefore(lb, next_sock, sock);
@@ -235,6 +239,7 @@
 			sock->ns.min= stype->min;
 			sock->ns.max= stype->max;
 			sock->tosock= stype->internsock;
+			sock->stype = stype;
 			
 			/* non-list sockets may only have one of each type */
 			if ((stype->flag & SOCK_LIST) == 0) {
@@ -245,12 +250,6 @@
 				return;
 			}
 			else {
-				if (r_verified->last)
-					sock->list_index = ((bNodeSocket*)r_verified->last)->list_index + 1;
-				else {
-					sock->list_index = 0;
-				}
-				
 				socknext = sock->next;
 				
 				BLI_remlink(lb, sock);
@@ -263,16 +262,6 @@
 		else
 			sock= sock->next;
 	}
-	
-#if 0
-	if(!r_verified->first) {
-		r_verified->first = r_verified->last = node_add_socket_type(NULL, stype);
-	}
-	else if (list_socket && ((bNodeSocket*)r_verified->last)->link) {
-		/* add an unlinked socket for extending the list */
-		node_add_socket_type(r_verified, stype);
-	}
-#endif
 }
 
 static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first)
@@ -466,7 +455,7 @@
 					inputs[a].internsock= sock;	
 					a++;
 				}
-				if (sock->next && sock->next->list_index <= sock->list_index)
+				if (!sock->next || sock->next->stype != sock->stype)
 					stype++;
 				}
 		}
@@ -493,7 +482,7 @@
 					outputs[a].internsock= sock;	
 					a++;
 				}
-				if (!sock->next || sock->next->list_index < 0)
+				if (!sock->next || sock->next->stype != sock->stype)
 					stype++;
 			}
 		}
@@ -849,51 +838,38 @@
 }
 
 /* ************** Add stuff ********** */
-/* XXX the list socket updates are done in a brute-force way for now: iterate over all nodes and sockets in a tree.
- * Ideally it should be done atomically for target node + socket, which requires storing the previous socket for the modal linking operator */
 void ntreeUpdateListSockets(bNodeTree *ntree)
 {
 	bNode *node;
 	bNodeSocketType *stype;
 	bNodeSocket *sock, *next_sock;
 	
-	int ttype=0, tsock=0;
-	
 	for (node = ntree->nodes.first; node; node = node->next) {
 		/* nodes are presumed fully verified, stype and socket list are in sync */
 		stype= node->typeinfo->inputs;
 		sock= node->inputs.first;
 		while (sock) {
-			/* XXX needs a more generic way of allowing list sockets - phonybone */
 			if (stype->flag & SOCK_LIST) {
-				int list_index = 0;
 				/* step through all sockets of this type (i.e. the list) */
-//				while (sock && sock->to_index==stype->own_index && strncmp(sock->name, stype->name, NODE_MAXSTR)==0) {
-				while (sock && sock->type==stype->type) {
+				while (sock && sock->stype == stype) {
 					if (!sock->link) {
 						next_sock = sock->next;
 						node_rem_socket(ntree, &node->inputs, sock);
 						sock = next_sock;
 					}
 					else {
-						sock->list_index = list_index;
-						++list_index;
 						sock = sock->next;
 					}
-					++tsock;
 				}
 				/* add an unlinked last socket, so the list can be extended */
 				node_insert_before_socket_type(&node->inputs, sock, stype);
 			} else {
-//				while (sock && sock->to_index==stype->own_index && strncmp(sock->name, stype->name, NODE_MAXSTR)==0) {
-				while (sock && sock->type==stype->type) {
-					sock->list_index = -1;
+				while (sock && sock->stype == stype) {
 					sock = sock->next;
-					++tsock;
 				}
 			}
+
 			++stype;
-			++ttype;
 		}
 	}
 }
@@ -2525,6 +2501,7 @@
 	nodeRegisterType(ntypelist, &sim_node_program);
 	nodeRegisterType(ntypelist, &sim_node_subprogram);
 	nodeRegisterType(ntypelist, &sim_node_if);
+	nodeRegisterType(ntypelist, &sim_node_pass);
 	nodeRegisterType(ntypelist, &sim_node_timestep);
 	nodeRegisterType(ntypelist, &sim_node_debugprint);
 }

Modified: branches/particles-2010/source/blender/editors/space_node/node_draw.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/node_draw.c	2010-07-19 07:29:52 UTC (rev 30486)
+++ branches/particles-2010/source/blender/editors/space_node/node_draw.c	2010-07-19 07:54:37 UTC (rev 30487)
@@ -842,8 +842,10 @@
 										   NULL, 0, 0, 0, 0, "");
 				}
 				else if(sock->type==SOCK_FLOAT) {
-					uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f), 
-							 (short)(node->width-NODE_DY), NODE_DY,  NULL, 0, 0, 0, 0, "");
+					bt=uiDefButR(node->block, NUM, B_NODE_EXEC, sock->name,
+							 (short)sock->locx+NODE_DYS, (short)(sock->locy)-9, (short)node->width-NODE_DY, 17, 
+							  &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
+					uiButSetFunc(bt, node_sync_cb, snode, node);
 				}
 				else if(sock->type==SOCK_INT) {
 					uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f), 

Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-07-19 07:29:52 UTC (rev 30486)
+++ branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-07-19 07:54:37 UTC (rev 30487)
@@ -38,6 +38,7 @@
 struct SpaceNode;
 struct bNodeLink;
 struct bNodeType;
+struct bNodeSocketType;
 struct bNodeGroup;
 struct AnimData;
 struct bGPdata;
@@ -46,6 +47,15 @@
 #define NODE_MAXSTR 32
 
 
+/* Defines execution context for nodes in an operator socket.
+ * This allows calling node executions from within a node tree or group node.
+ */
+typedef struct bNodeOperatorContext {
+	struct bNodeTree *ntree;
+	struct bNode *node;
+	struct bNodeStack *stack;
+} bNodeOperatorContext;
+
 typedef struct bNodeStack {
 	float vec[4];
 	float min, max;			/* min/max for values (UI writes it, execute might use it) */
@@ -54,6 +64,7 @@
 	short hasoutput;		/* when output is linked, tagged before executing */
 	short datatype;			/* type of data pointer */
 	short sockettype;		/* type of socket stack comes from, to remap linking different sockets */
+	bNodeOperatorContext ctx;	/* context for execution, only used for operator sockets */
 } bNodeStack;
 
 /* ns->datatype, shadetree only */
@@ -70,19 +81,19 @@
 	short limit, stack_index;	/* limit for dependency sort, stack_index for exec */
 	short intern;				/* intern = tag for group nodes */
 	short stack_index_ext;		/* for groups, to find the caller stack index */
-	short list_index;			/* for list sockets */
 	
-	short pad1;
-	
 	float locx, locy;
 	
 	/* internal data to retrieve relations and groups */
 	
 	int own_index, to_index;	/* group socket identifiers, to find matching pairs after reading files */
 	
+	char pad[4];
+	
 	struct bNodeSocket *tosock;	/* group-node sockets point to the internal group counterpart sockets, set after read file  */
 	struct bNodeLink *link;		/* a link pointer, set in nodeSolveOrder() */
 	
+	struct bNodeSocketType *stype;	/* socket type, used for list sockets */
 } bNodeSocket;
 
 /* sock->type */

Modified: branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h
===================================================================
--- branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h	2010-07-19 07:29:52 UTC (rev 30486)
+++ branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h	2010-07-19 07:54:37 UTC (rev 30487)
@@ -136,5 +136,6 @@
 DefNode( SimulationNode, SIM_NODE_PROGRAM,        0,                      "PROGRAM",        Program,          "Program",           ""              )
 DefNode( SimulationNode, SIM_NODE_SUBPROGRAM,     0,                      "SUBPROGRAM",     SubProgram,       "SubProgram",        ""              )
 DefNode( SimulationNode, SIM_NODE_IF,             0,                      "IF",             If,               "If",                ""              )
+DefNode( SimulationNode, SIM_NODE_PASS,           0,                      "PASS",           Pass,             "Pass",              ""              )
 DefNode( SimulationNode, SIM_NODE_TIMESTEP,       0,                      "TIMESTEP",       TimeStep,         "Time Step",         ""              )
 DefNode( SimulationNode, SIM_NODE_DEBUGPRINT,     0,                      "DEBUGPRINT",     DebugPrint,       "Debug Print",       ""              )

Modified: branches/particles-2010/source/blender/nodes/SIM_node.h
===================================================================
--- branches/particles-2010/source/blender/nodes/SIM_node.h	2010-07-19 07:29:52 UTC (rev 30486)
+++ branches/particles-2010/source/blender/nodes/SIM_node.h	2010-07-19 07:54:37 UTC (rev 30487)
@@ -39,6 +39,7 @@
 
 extern bNodeType sim_node_timestep;
 extern bNodeType sim_node_debugprint;
+extern bNodeType sim_node_pass;
 extern bNodeType sim_node_program;
 extern bNodeType sim_node_subprogram;
 extern bNodeType sim_node_if;

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_debugprint.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list