[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31500] branches/particles-2010/source/ blender: Implemented correct branch counting for operator execution.

Lukas Toenne lukas.toenne at googlemail.com
Sat Aug 21 13:44:23 CEST 2010


Revision: 31500
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31500
Author:   lukastoenne
Date:     2010-08-21 13:44:23 +0200 (Sat, 21 Aug 2010)

Log Message:
-----------
Implemented correct branch counting for operator execution. A data batch is now removed after all active branches have handled it (this could be extended to allow keeping data in memory until all possible branches have been executed, to avoid unnecessary recalculations). Also updated the program control nodes (if, for, pass, subprogram)

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/blenkernel/intern/particleset.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_particle_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_particle_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_subprogram.c
    branches/particles-2010/source/blender/nodes/intern/node_tree_simulation.c

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-08-21 08:38:29 UTC (rev 31499)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-08-21 11:44:23 UTC (rev 31500)
@@ -247,11 +247,11 @@
 	while (sock) {
 		/* both indices are zero for non-groups, otherwise it's a unique index */
 		if(sock->to_index==stype->own_index && strncmp(sock->name, stype->name, NODE_MAXSTR)==0) {
-			sock->type= stype->type;		/* in future, read this from tydefs! */
+//			sock->type= stype->type;		/* in future, read this from tydefs! */
 			if(stype->limit==0) sock->limit= 0xFFF;
 			else sock->limit= stype->limit;
-			sock->ns.min= stype->min;
-			sock->ns.max= stype->max;
+//			sock->ns.min= stype->min;
+//			sock->ns.max= stype->max;
 			sock->tonode= stype->internnode;
 			sock->tosock= stype->internsock;
 			sock->stype = stype;

Modified: branches/particles-2010/source/blender/blenkernel/intern/particleset.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/particleset.c	2010-08-21 08:38:29 UTC (rev 31499)
+++ branches/particles-2010/source/blender/blenkernel/intern/particleset.c	2010-08-21 11:44:23 UTC (rev 31500)
@@ -49,6 +49,7 @@
 	{ "Velocity",     PPTYPE_VECTOR,    PARPROP_DEFAULT|PARPROP_PROTECTED    },
 	{ "Force",        PPTYPE_VECTOR,    PARPROP_PROTECTED,                   },
 	{ "Mass",         PPTYPE_FLOAT,     0                                    },
+	{ "Init",         PPTYPE_BOOL,      0                                    },
 	{ "Custom",       PPTYPE_CUSTOM,    0                                    },
 	/* last line marks the array end */
 	{ "" }

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c	2010-08-21 08:38:29 UTC (rev 31499)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c	2010-08-21 11:44:23 UTC (rev 31500)
@@ -34,28 +34,34 @@
  */
 
 static bNodeSocketType inputs[]= { 
-	{ SOCK_INT, 1, "Iterations", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
-	{ SOCK_OP, 1, "Op", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
+	{ SOCK_INT, 1, "Iterations", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0, NDC_SINGLETON },
+	{ SOCK_OP, 1, "Op", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0, NDC_SINGLETON },
 	{ -1, 0, "" }
 };
 
 static bNodeSocketType outputs[]= { 
-	{ SOCK_OP, 0, "Exec", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
+	{ SOCK_OP, 0, "Exec", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0, NDC_SINGLETON },
 	{ -1, 0, "" }
 };
 
-static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static int exec(SimNodeThreadContext *ctx, SimNodeJob *job)
 {
-#if 0
-//	SimulationContext *sim= (SimulationContext*)data;
-	int i, n;
+	SimNodeDataStream istream[1];
 	
-	n = sim_get_int(in[0]);
-	
-	for (i=0; i < n; ++i) {
-//		ntreeSimulationExecOperator(sim, &in[1]->ctx);
+	SIM_JOBEXEC_OUTPUT_BEGIN(ctx, job, istream, job->current < 1);
+	job->node->node->custom1 = sim_istream_read_int(istream, 0);
+	SIM_JOBEXEC_OUTPUT_END(ctx, job)
+	return NODE_EXEC_FINISHED;
+}
+
+static int opexec(SimNodeThreadContext *ctx, bNode *node, int level, int *r_opsock)
+{
+	if (level < node->custom1) {
+		*r_opsock = 0;
+		return NODE_EXEC_SUSPEND;
 	}
-#endif
+	else
+		return NODE_EXEC_FINISHED;
 }
 
 bNodeType sim_node_for= {
@@ -67,10 +73,14 @@
 	/* input sock      */	inputs,
 	/* output sock     */	outputs,
 	/* storage         */	"",
-	/* execfunc        */	exec,	
+	/* execfunc        */	NULL,
 	/* butfunc         */	NULL,
 	/* initfunc        */	NULL,
 	/* freestoragefunc */	NULL,
 	/* copysotragefunc */	NULL,
-	/* id              */	NULL
+	/* id              */	NULL,
+	/* pynode, pydict  */	NULL, NULL,
+	/* gpufunc         */	NULL,
+	/* sim_exec        */	exec,
+	/* sim_opexec      */	opexec
 };

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_particle_data.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_particle_data.c	2010-08-21 08:38:29 UTC (rev 31499)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_particle_data.c	2010-08-21 11:44:23 UTC (rev 31500)
@@ -46,6 +46,7 @@
 	{ SOCK_VECTOR, 0, "Position", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NDC_PARTICLE },
 	{ SOCK_VECTOR, 0, "Velocity", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NDC_PARTICLE },
 	{ SOCK_FLOAT, 0, "Mass", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NDC_PARTICLE },
+	{ SOCK_BOOL, 0, "Init", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NDC_PARTICLE },
 	{ -1, 0, "" }
 };
 
@@ -60,6 +61,7 @@
 		ParticlePropertyInfo *proppos = pset_find_particle_property(pset, "Position");
 		ParticlePropertyInfo *propvel = pset_find_particle_property(pset, "Velocity");
 		ParticlePropertyInfo *propmass = pset_find_particle_property(pset, "Mass");
+		ParticlePropertyInfo *propinit = pset_find_particle_property(pset, "Init");
 
 		pit_init(&pit, pset);
 		pit_goto(&pit, job->current);
@@ -71,6 +73,8 @@
 			sim_ostream_write_vector(ostream, 2, pset_parprop(pit.pa, propvel));
 		if (propmass)
 			sim_ostream_write_float(ostream, 3, *(float*)pset_parprop(pit.pa, propmass));
+		if (propinit)
+			sim_ostream_write_float(ostream, 4, *(char*)pset_parprop(pit.pa, propinit));
 		pit_next(&pit);
 		SIM_JOBEXEC_INPUT_END(ctx, job)
 		if (pit.pa != NULL)

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-08-21 08:38:29 UTC (rev 31499)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-08-21 11:44:23 UTC (rev 31500)
@@ -45,51 +45,59 @@
 	{ -1, 0, "" }
 };
 
-#if 0
-static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static int exec(SimNodeThreadContext *ctx, SimNodeJob *job)
 {
-//	SimulationContext *sim= (SimulationContext*)data;
-	int cond, use;
+	SimNodeDataStream istream[3];
+	SimNodeDataStream ostream[1];
 	
-	cond = sim_get_bool(in[0]);
-	use = (cond ? 1 : 2);
-	
-	switch (out[0]->sockettype) {
+	switch (job->node->outputs[0].datatype) {
 	case SOCK_OP:
-//		ntreeSimulationExecOperator(sim, &in[use]->ctx);
+		SIM_JOBEXEC_OUTPUT_BEGIN(ctx, job, istream, job->current < 1);
+		job->node->node->custom1 = sim_istream_read_bool(istream, 0);
+		SIM_JOBEXEC_OUTPUT_END(ctx, job)
 		break;
 	case SOCK_INT:
-		sim_set_int(out[0], sim_get_int(in[use]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		if (sim_istream_read_bool(istream, 0))
+			sim_ostream_write_int(ostream, 0, sim_istream_read_int(istream, 1));
+		else
+			sim_ostream_write_int(ostream, 0, sim_istream_read_int(istream, 2));
+		SIM_JOBEXEC_END(ctx, job)
 		break;
 	case SOCK_BOOL:
-		sim_set_bool(out[0], sim_get_bool(in[use]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		if (sim_istream_read_bool(istream, 0))
+			sim_ostream_write_bool(ostream, 0, sim_istream_read_bool(istream, 1));
+		else
+			sim_ostream_write_bool(ostream, 0, sim_istream_read_bool(istream, 2));
+		SIM_JOBEXEC_END(ctx, job)
 		break;
 	case SOCK_VECTOR:
-		copy_v3_v3(out[0]->vec, sim_get_vector(in[use]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		if (sim_istream_read_bool(istream, 0))
+			sim_ostream_write_vector(ostream, 0, sim_istream_read_vector(istream, 1));
+		else
+			sim_ostream_write_vector(ostream, 0, sim_istream_read_vector(istream, 2));
+		SIM_JOBEXEC_END(ctx, job)
 		break;
 	case SOCK_RGBA:
-		copy_v3_v3(out[0]->vec, sim_get_rgba(in[use]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		if (sim_istream_read_bool(istream, 0))
+			sim_ostream_write_rgba(ostream, 0, sim_istream_read_rgba(istream, 1));
+		else
+			sim_ostream_write_rgba(ostream, 0, sim_istream_read_rgba(istream, 2));
+		SIM_JOBEXEC_END(ctx, job)
 		break;
 	}
-}
-#endif
-
-static int exec(SimNodeThreadContext *ctx, SimNodeJob *job)
-{
-//	SimNodeData *data[MAX_SOCKET];	/* arbitrary... watch this */
-	
-//	sim_data_pointer_init(job, data);
-//	node->custom1 = 0;	/* TODO storing this in the node */
-	
 	return NODE_EXEC_FINISHED;
 }
 
 static int opexec(SimNodeThreadContext *ctx, bNode *node, int level, int *r_opsock)
 {
-	
-//	condition = node->custom1;
-	*r_opsock = 1;	/* TODO */
-	
+	if (node->custom1)
+		*r_opsock = 1;
+	else
+		*r_opsock = 2;
 	return NODE_EXEC_FINISHED;
 }
 

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c	2010-08-21 08:38:29 UTC (rev 31499)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c	2010-08-21 11:44:23 UTC (rev 31500)
@@ -40,34 +40,44 @@
 	{ -1, 0, "" }
 };
 
-static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static int exec(SimNodeThreadContext *ctx, SimNodeJob *job)
 {
-#if 0
-//	SimulationContext *sim= (SimulationContext*)data;
+	SimNodeDataStream istream[1];
+	SimNodeDataStream ostream[1];
 	
-	switch (out[0]->sockettype) {
+	switch (job->node->outputs[0].datatype) {
 	case SOCK_OP:
-//		ntreeSimulationExecOperator(sim, &in[0]->ctx);
 		break;
-	case SOCK_FLOAT:
-		sim_set_float(out[0], sim_get_float(in[0]));
-		break;
 	case SOCK_INT:
-		sim_set_int(out[0], sim_get_int(in[0]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		sim_ostream_write_int(ostream, 0, sim_istream_read_int(istream, 0));
+		SIM_JOBEXEC_END(ctx, job)
 		break;
 	case SOCK_BOOL:
-		sim_set_bool(out[0], sim_get_bool(in[0]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		sim_ostream_write_bool(ostream, 0, sim_istream_read_bool(istream, 0));
+		SIM_JOBEXEC_END(ctx, job)
 		break;
 	case SOCK_VECTOR:
-		sim_set_vector(out[0], sim_get_vector(in[0]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		sim_ostream_write_vector(ostream, 0, sim_istream_read_vector(istream, 0));
+		SIM_JOBEXEC_END(ctx, job)
 		break;
 	case SOCK_RGBA:
-		sim_set_rgba(out[0], sim_get_rgba(in[0]));
+		SIM_JOBEXEC_BEGIN(ctx, job, istream, ostream);
+		sim_ostream_write_rgba(ostream, 0, sim_istream_read_rgba(istream, 0));
+		SIM_JOBEXEC_END(ctx, job)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list