[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33537] branches/particles-2010/source/ blender: * Added initexec and freeexec callbacks for to bNodeType, so nodes can create individual storage data in the execution stack.

Lukas Toenne lukas.toenne at googlemail.com
Tue Dec 7 13:17:23 CET 2010


Revision: 33537
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33537
Author:   lukastoenne
Date:     2010-12-07 13:17:23 +0100 (Tue, 07 Dec 2010)

Log Message:
-----------
* Added initexec and freeexec callbacks for to bNodeType, so nodes can create individual storage data in the execution stack. Used by 'For' nodes and mesh data nodes atm.
* Added back particle dynamics node (kernel still empty).

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/editors/space_node/drawnode.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_create_mesh_point.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for_group.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_mesh_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_particle_dynamics.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.h

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-12-07 11:57:34 UTC (rev 33536)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-12-07 12:17:23 UTC (rev 33537)
@@ -135,6 +135,8 @@
 
 	/* simulation nodes */
 	char *(*generate_source)(struct SimNodeStack *node);
+	void (*initexec)(struct SimNodeStack *node);
+	void (*freeexec)(struct SimNodeStack *node);
 	void (*enqueue)(struct SimExecData *execdata, struct SimNodeStack *node, struct SimDataContext *self);
 	void (*enqueue_op)(struct SimExecData *execdata, struct SimNodeStack *node, struct SimDataContext *self, int execlevel, int *pushop);
 } bNodeType;

Modified: branches/particles-2010/source/blender/editors/space_node/drawnode.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/drawnode.c	2010-12-07 11:57:34 UTC (rev 33536)
+++ branches/particles-2010/source/blender/editors/space_node/drawnode.c	2010-12-07 12:17:23 UTC (rev 33537)
@@ -1668,6 +1668,16 @@
 	uiItemR(col, ptr, "rotation_mode", 0, NULL, 0);
 }
 
+static void node_simulation_buts_particledynamics(uiLayout *layout, bContext *C, PointerRNA *ptr)
+{
+	uiLayout *col;
+	
+	node_simulation_buts_data(layout, C, ptr);
+	
+	col= uiLayoutColumn(layout, 0);
+	uiItemR(col, ptr, "integration", 0, NULL, 0);
+}
+
 /* only once called */
 static void node_simulation_set_butfunc(bNodeType *ntype)
 {
@@ -1715,6 +1725,9 @@
 	case SIM_NODE_CURVE:
 		ntype->uifunc = node_simulation_buts_curve;
 		break;
+	case SIM_NODE_PARTICLEDYNAMICS:
+		ntype->uifunc = node_simulation_buts_particledynamics;
+		break;
 		
 	default:
 		ntype->uifunc= NULL;

Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-12-07 11:57:34 UTC (rev 33536)
+++ branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-12-07 12:17:23 UTC (rev 33537)
@@ -457,4 +457,10 @@
 #define SIM_SPACE_WORLD			0
 #define SIM_SPACE_OBJECT		1
 
+/* particle dynamics integration mode */
+#define SIM_DYNAMICS_EULER		0
+#define SIM_DYNAMICS_VERLET		1
+#define SIM_DYNAMICS_MIDPOINT	2
+#define SIM_DYNAMICS_RK4		3
+
 #endif

Modified: branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c	2010-12-07 11:57:34 UTC (rev 33536)
+++ branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c	2010-12-07 12:17:23 UTC (rev 33537)
@@ -2613,6 +2613,28 @@
 	RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_rotation_mode_update");
 }
 
+static void def_sim_particledynamics(StructRNA *srna)
+{
+	PropertyRNA *prop;
+
+	static EnumPropertyItem sim_integration_items[] = {
+		{ SIM_DYNAMICS_EULER, "EULER", 0, "Euler", "" },
+		{ SIM_DYNAMICS_VERLET, "VERLET", 0, "Verlet", "" },
+		{ SIM_DYNAMICS_MIDPOINT, "MIDPOINT", 0, "Midpoint", "" },
+		{ SIM_DYNAMICS_RK4, "RK4", 0, "RK4", "" },
+		{ -1, "", 0, NULL, NULL },
+	};
+
+	prop = RNA_def_property(srna, "integration", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_sdna(prop, NULL, "custom1");
+	RNA_def_property_enum_items(prop, sim_integration_items);
+	RNA_def_property_enum_default(prop, SIM_DYNAMICS_RK4);
+	RNA_def_property_ui_text(prop, "Integration", "Integration mode for a dynamics step");
+	RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+	def_sim_data(srna);
+}
+
 /* -------------------------------------------------------------------------- */
 
 static EnumPropertyItem shader_node_type_items[MaxNodes];

Modified: branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h
===================================================================
--- branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h	2010-12-07 11:57:34 UTC (rev 33536)
+++ branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h	2010-12-07 12:17:23 UTC (rev 33537)
@@ -172,7 +172,7 @@
 DefNode( SimulationNode, SIM_NODE_ADDPARTICLE,    def_sim_data,           "ADDPARTICLE",    AddParticle,      "Add Particle",      ""              )
 DefNode( SimulationNode, SIM_NODE_RANDOM,         def_sim_random,         "RANDOM",         Random,           "Random",            ""              )
 DefNode( SimulationNode, SIM_NODE_CREATEMESHPOINT, def_sim_data,          "CREATEMESHPOINT", CreateMeshPoint, "CreateMeshPoint", ""              )
-DefNode( SimulationNode, SIM_NODE_PARTICLEDYNAMICS, 0,                    "PARTICLEDYNAMICS", ParticleDynamics, "Particle Dynamics", ""            )
+DefNode( SimulationNode, SIM_NODE_PARTICLEDYNAMICS, def_sim_particledynamics, "PARTICLEDYNAMICS", ParticleDynamics, "Particle Dynamics", ""            )
 DefNode( SimulationNode, SIM_NODE_ADDPARTICLEFORCE, 0,                    "ADDPARTICLEFORCE", AddParticleForce, "Add Particle Force", ""            )
 DefNode( SimulationNode, SIM_NODE_TIMESTEP,       0,                      "TIMESTEP",       TimeStep,         "Time Step",         ""              )
 DefNode( SimulationNode, SIM_NODE_CURVE,          def_sim_curve,          "CURVE",          Curve,            "Curve",             ""              )

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_create_mesh_point.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_create_mesh_point.c	2010-12-07 11:57:34 UTC (rev 33536)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_create_mesh_point.c	2010-12-07 12:17:23 UTC (rev 33537)
@@ -33,6 +33,7 @@
 #include "DNA_node_types.h"
 #include "DNA_particleset_types.h"
 
+#include "BKE_cdderivedmesh.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
@@ -57,6 +58,28 @@
 	sim_datanode_init(node, &RNA_Object);
 }
 
+typedef struct ExecStorage {
+	struct DerivedMesh *dm;
+} ExecStorage;
+
+static void initexec(SimNodeStack *node)
+{
+	node->storage = MEM_callocN(sizeof(ExecStorage), "ExecStorage");
+}
+
+static void freeexec(SimNodeStack *node)
+{
+	ExecStorage *storage= (ExecStorage*)node->storage;
+	
+	if (storage->dm) {
+		storage->dm->needsFree = 1;
+		storage->dm->release(storage->dm);
+		storage->dm = NULL;
+	}
+	
+	MEM_freeN(storage);
+}
+
 static void kernel_createmeshpoint(int global_id, void **args, SimNodeStack *node)
 {
 //	Object *ob= *(Object**)args[0];
@@ -83,16 +106,31 @@
 
 static void enqueue(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
 {
+	ExecStorage *storage= (ExecStorage*)node->storage;
 	SimDataContext ctx;
 	
+	if (storage->dm) {
+		storage->dm->needsFree = 1;
+		storage->dm->release(storage->dm);
+		storage->dm = NULL;
+	}
+	
 	if (sim_datanode_resolve_context(node->base, self, &ctx)) {
 		Object *ob= (Object*)sim_context_data(&ctx);
 		DerivedMesh *dm;
 		SimKernel *kernel;
 		
-		/* get the derived mesh */
+		/* get the derived mesh and make a copy */
 		dm = mesh_get_derived_final(ctx.scene, ob, CD_MASK_MFACE | CD_MASK_ORCO);
-		if (dm) {
+		storage->dm=CDDM_copy(dm);
+//		CDDM_apply_vert_coords(storage->dm, vertexCos);
+//		CDDM_calc_normals(storage->dm);
+//		dm->needsFree = 1;
+//		dm->release(storage->dm);
+//		dm = NULL;
+		storage->dm->needsFree = 0;
+		
+		if (storage->dm) {
 			int totfaces, totverts;
 			MFace *mf;
 			float *orco;
@@ -110,16 +148,16 @@
 			
 			sim_kernel_set_arg(execdata, kernel, 0, sizeof(Object*), ob);
 			
-			totfaces = dm->getNumFaces(dm);
+			totfaces = storage->dm->getNumFaces(storage->dm);
 			sim_kernel_set_arg(execdata, kernel, 1, sizeof(int), &totfaces);
 			
-			totverts = dm->getNumVerts(dm);
+			totverts = storage->dm->getNumVerts(storage->dm);
 			sim_kernel_set_arg(execdata, kernel, 2, sizeof(int), &totverts);
 			
-			mf = dm->getFaceDataArray(dm, CD_MFACE);
+			mf = storage->dm->getFaceDataArray(storage->dm, CD_MFACE);
 			sim_kernel_set_arg(execdata, kernel, 3, sizeof(MFace*), &mf);
 			
-			orco = (float*)dm->getVertDataArray(dm, CD_ORCO);
+			orco = (float*)storage->dm->getVertDataArray(storage->dm, CD_ORCO);
 			sim_kernel_set_arg(execdata, kernel, 4, sizeof(float*), &orco);
 			
 			sim_kernel_enqueue(execdata, kernel);
@@ -150,6 +188,9 @@
 	type.freestoragefunc = node_free_standard_storage;
 	type.copystoragefunc = node_copy_standard_storage;
 	
+	type.initexec = initexec;
+	type.freeexec = freeexec;
+	
 	type.enqueue = enqueue;
 	
 	nodeRegisterType(typelist, &type);

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-12-07 11:57:34 UTC (rev 33536)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c	2010-12-07 12:17:23 UTC (rev 33537)
@@ -45,27 +45,32 @@
 	int iterations;
 } OpStorage;
 
+static void initexec(SimNodeStack *node)
+{
+	node->storage = MEM_callocN(sizeof(OpStorage), "OpStorage");
+}
+
+static void freeexec(SimNodeStack *node)
+{
+	OpStorage *storage = (OpStorage*)node->storage;
+	
+	MEM_freeN(storage);
+}
+
 static void enqueue_op(SimExecData *execdata, SimNodeStack *node, SimDataContext *self, int execlevel, int *pushop)
 {
-	OpStorage *storage;
+	OpStorage *storage= (OpStorage*)node->storage;
 	SimSocketIterator sockiter;
 	
 	if (execlevel == 0) {
-		node->opstorage = storage = MEM_callocN(sizeof(OpStorage), "NodeOperatorStorage");
-		
 		sim_input_begin(execdata, &sockiter, node->instack[0]);
 		sim_input_read_int(execdata, &sockiter, &storage->iterations);
 		sim_input_end(execdata, &sockiter);
 		if (execdata->error) return;
 	}
-	else
-		storage = (OpStorage*)node->opstorage;
 	
 	if (execlevel < storage->iterations)
 		*pushop = 1;
-	else {
-		MEM_freeN(storage);
-	}
 }
 
 void nodeRegisterSimFor(ListBase *typelist)
@@ -84,6 +89,10 @@
 	/* optional */
 	type.inputs = inputs;
 	type.outputs = outputs;
+	
+	type.initexec = initexec;
+	type.freeexec = freeexec;
+	
 	type.enqueue_op = enqueue_op;
 	
 	nodeRegisterType(typelist, &type);

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

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list