[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31335] branches/particles-2010/source/ blender: Modified the node sorting order during SolveOrder to make it usable for context resolving .

Lukas Toenne lukas.toenne at googlemail.com
Sat Aug 14 19:01:14 CEST 2010


Revision: 31335
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31335
Author:   lukastoenne
Date:     2010-08-14 19:01:14 +0200 (Sat, 14 Aug 2010)

Log Message:
-----------
Modified the node sorting order during SolveOrder to make it usable for context resolving. The old ordering is part of it, so it can still be used that way.
Fixed the data context resolving using the corrected node levels.
Added GetParticleData node and AddParticle nodes to make rudimentary particle effects.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/blenkernel/BKE_particleset.h
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/blenkernel/intern/particleset.c
    branches/particles-2010/source/blender/editors/space_node/drawnode.c
    branches/particles-2010/source/blender/editors/space_node/node_draw.c
    branches/particles-2010/source/blender/editors/space_view3d/drawobject.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesdna/DNA_particleset_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/makesrna/intern/rna_particleset.c
    branches/particles-2010/source/blender/nodes/SIM_node.h
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_particle_data.c

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

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-08-14 16:30:41 UTC (rev 31334)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-08-14 17:01:14 UTC (rev 31335)
@@ -524,6 +524,9 @@
 #define SIM_NODE_GETVERTEXDATA		753
 #define SIM_NODE_SETVERTEXDATA		754
 #define SIM_NODE_ADDPARTICLE		755
+#define SIM_NODE_GETPARTICLEDATA	756
+#define SIM_NODE_SETPARTICLEDATA	757
+#define SIM_NODE_RANDOM				758
 
 /* TO BE REMOVED: debugging stuff, testing, etc. */
 #define SIM_NODE_DEBUGPRINT			801

Modified: branches/particles-2010/source/blender/blenkernel/BKE_particleset.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_particleset.h	2010-08-14 16:30:41 UTC (rev 31334)
+++ branches/particles-2010/source/blender/blenkernel/BKE_particleset.h	2010-08-14 17:01:14 UTC (rev 31335)
@@ -75,6 +75,9 @@
 void pit_next(struct ParticleIterator *it);
 void pit_goto(struct ParticleIterator *it, int index);
 
+void *pset_parprop(struct NParticle *pa, struct ParticlePropertyInfo *prop);
+
+/* object functions */
 void make_local_particleset(struct ParticleSet *pset);
 struct ParticleSet *add_particleset(char *name);
 struct ParticleSet* copy_particleset(struct ParticleSet *pset);

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-08-14 16:30:41 UTC (rev 31334)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-08-14 17:01:14 UTC (rev 31335)
@@ -1564,6 +1564,7 @@
 
 /* ************** dependency stuff *********** */
 
+#if 0
 /* node is guaranteed to be not checked before */
 static int node_recurs_check(bNode *node, bNode ***nsort, int level)
 {
@@ -1583,7 +1584,7 @@
 			}
 		}
 	}
-//	printf("node sort %s level %d\n", node->name, level);
+	printf("node sort %s level %d\n", node->name, level);
 	**nsort= node;
 	(*nsort)++;
 	
@@ -1592,7 +1593,34 @@
 	else 
 		return 0xFFF;
 }
+#endif
 
+/* node is guaranteed to be not checked before */
+static int node_recurs_check(bNode *node, bNode ***nsort)
+{
+	bNode *fromnode;
+	bNodeSocket *sock;
+	int level = 0xFFF;
+	
+	node->done= 1;
+	
+	for(sock= node->inputs.first; sock; sock= sock->next) {
+		if(sock->link) {
+			fromnode= sock->link->fromnode;
+			if(fromnode) {
+				if (fromnode->done==0)
+					fromnode->level= node_recurs_check(fromnode, nsort);
+				if (fromnode->level <= level)
+					level = fromnode->level - 1;
+			}
+		}
+	}
+	**nsort= node;
+	(*nsort)++;
+	
+	return level;
+}
+
 static void ntreeSolveOrder(bNodeTree *ntree)
 {
 	bNode *node, **nodesort, **nsort;
@@ -1624,7 +1652,8 @@
 	/* recursive check */
 	for(node= ntree->nodes.first; node; node= node->next) {
 		if(node->done==0) {
-			node->level= node_recurs_check(node, &nsort, 0);
+//			node->level= node_recurs_check(node, &nsort, 0);
+			node->level= node_recurs_check(node, &nsort);
 		}
 	}
 	
@@ -1865,11 +1894,18 @@
 static int ntreeSortLinkFromnode(void *a, void *b)
 {
 	bNode *ato = ((bNodeLinkSortList*)a)->link->tonode;
+	bNode *afrom = ((bNodeLinkSortList*)a)->link->fromnode;
+	bNode *bto = ((bNodeLinkSortList*)b)->link->tonode;
 	bNode *bfrom = ((bNodeLinkSortList*)b)->link->fromnode;
 	
-	if (bfrom && ato) {
+	if (ato && afrom && bto && bfrom) {
 		/* this ensures that links, whose from/to-nodes can influence each other are sorted */
-		return (ato->level >= bfrom->level);
+		if (ato->level >= bfrom->level) {
+			return 0;
+		}
+		else {
+			return 1;
+		}
 	}
 	else
 		return 0;
@@ -1905,10 +1941,8 @@
 	if (resctx.type == NDC_UNDEFINED) {
 		for (sock=node->inputs.first; sock; sock=sock->next) {
 			if (sock->stype->contexttype == NDC_UNDEFINED) {
-				if (ELEM(sock->context.type, NDC_UNDEFINED, NDC_SINGLETON)==0) {
-					resctx.type = NDC_UNDEFINED;
-					resctx.source = NULL;
-				}
+				sock->context.type = NDC_UNDEFINED;
+				sock->context.source = NULL;
 			}
 		}
 	}
@@ -1955,8 +1989,29 @@
 	
 	BLI_sortlist(&sortlist, ntreeSortLinkFromnode);
 	
+	#if 1
+	{
+		int i;
+		for (i=0, item=sortlist.first; item; ++i, item = item->next)
+			item->link->debug = i;
+	}
+	#endif
+	#if 0
+	printf("/// Resolving links: ///\n");
 	for (item=sortlist.first; item; item = item->next) {
 		link = item->link;
+		if (link->fromnode) printf("%s:%s", link->fromnode->name, link->fromsock->name);
+		else printf("-:-");
+		printf(" -> ");
+		if (link->tonode) printf("%s:%s", link->tonode->name, link->tosock->name);
+		else printf("-:-");
+		printf("\n");
+	}
+	printf("/////////////////////");
+	#endif
+	
+	for (item=sortlist.first; item; item = item->next) {
+		link = item->link;
 		if (link->fromnode && link->tonode) {
 			if (link->tosock->stype->contexttype == NDC_UNDEFINED) {
 				link->tosock->context = link->fromsock->context;
@@ -2837,6 +2892,9 @@
 	nodeRegisterType(ntypelist, &sim_node_getvertexdata);
 	nodeRegisterType(ntypelist, &sim_node_setvertexdata);
 	nodeRegisterType(ntypelist, &sim_node_addparticle);
+	nodeRegisterType(ntypelist, &sim_node_getparticledata);
+	nodeRegisterType(ntypelist, &sim_node_setparticledata);
+	nodeRegisterType(ntypelist, &sim_node_random);
 
 	nodeRegisterType(ntypelist, &sim_node_debugprint);
 }

Modified: branches/particles-2010/source/blender/blenkernel/intern/particleset.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/particleset.c	2010-08-14 16:30:41 UTC (rev 31334)
+++ branches/particles-2010/source/blender/blenkernel/intern/particleset.c	2010-08-14 17:01:14 UTC (rev 31335)
@@ -43,31 +43,29 @@
 #include "BKE_particleset.h"
 #include "BKE_utildefines.h"
 
-static void pptype_int_zero(void *data)
-{
-	*(int*)data = 0;
-}
-
-static void pptype_float_zero(void *data)
-{
-	*(float*)data = 0.0f;
-}
-
-static void pptype_vector_zero(void *data)
-{
-	zero_v3((float*)data);
-}
-
 ParticlePropertyInfo particle_std_properties[] = {
-//	  Name,           size,                flags,                               data type,     pad, default func.,         init func.,         free func.
-	{ "Position",     3*sizeof(float),     PARPROP_DEFAULT|PARPROP_PROTECTED,   PPTYPE_FLOAT,    0, pptype_vector_zero,    0,                  0             },
-	{ "Velocity",     3*sizeof(float),     PARPROP_DEFAULT|PARPROP_PROTECTED,   PPTYPE_FLOAT,    0, pptype_vector_zero,    0,                  0             },
-	{ "Mass",         sizeof(float),       0,                                   PPTYPE_FLOAT,    0, pptype_vector_zero,    0,                  0             },
-	{ "Custom",       sizeof(int),         0,                                   PPTYPE_INT,      0, pptype_int_zero,       0,                  0             },
+//	   Name,          data type,        flags
+	{ "Position",     PPTYPE_VECTOR,    PARPROP_DEFAULT|PARPROP_PROTECTED    },
+	{ "Velocity",     PPTYPE_VECTOR,    PARPROP_DEFAULT|PARPROP_PROTECTED    },
+	{ "Force",        PPTYPE_VECTOR,    PARPROP_PROTECTED,                   },
+	{ "Mass",         PPTYPE_FLOAT,     0                                    },
+	{ "Custom",       PPTYPE_CUSTOM,    0                                    },
 	/* last line marks the array end */
 	{ "" }
 };
 
+static int get_proptype_size(int type)
+{
+	switch (type) {
+	case PPTYPE_FLOAT:	return sizeof(float); break;
+	case PPTYPE_INT:	return sizeof(int); break;
+	case PPTYPE_BOOL:	return sizeof(char); break;
+	case PPTYPE_VECTOR:	return 3*sizeof(float); break;
+	case PPTYPE_RGBA:	return 4*sizeof(float); break;
+	}
+	return 0;
+}
+
 /* modifier update function */
 void pset_calc_modifiers(Scene *scene, Object *ob)
 {
@@ -141,6 +139,7 @@
 	offset = sizeof(NParticle);
 	
 	for (i=0, propinfo=pset->properties; i < pset->totprop; ++i, ++propinfo) {
+		propinfo->size = get_proptype_size(propinfo->type);
 		propinfo->mapoffset = propinfo->offset; /* store old offset for restoring the buffer */
 		propinfo->offset = offset;
 		
@@ -159,8 +158,8 @@
 	
 	for (i=0, propinfo=pset->properties; i < pset->totprop; ++i, ++propinfo) {
 		if (propinfo->mapoffset < 0) {
-			if (propinfo->set_default)
-				propinfo->set_default((char*)dest + propinfo->offset);
+//			if (propinfo->set_default)
+//				propinfo->set_default((char*)dest + propinfo->offset);
 		}
 		else {
 			memcpy((char*)dest + propinfo->offset, (char*)src + propinfo->mapoffset, propinfo->size);
@@ -316,8 +315,6 @@
 	pa->number = number;
 	pa->alive = PLIFE_UNBORN;
 	pa->birthtime = 0.0f;
-	zero_v3(pa->loc);
-	zero_v3(pa->vel);
 }
 
 static void init_page(ParticleSet *pset, ParticlePage *page, int page_size)
@@ -682,6 +679,11 @@
 	it->index = -1;
 }
 
+void *pset_parprop(NParticle *pa, ParticlePropertyInfo *prop)
+{
+	return ((char*)pa + prop->offset);
+}
+
 void make_local_particleset(ParticleSet *pset)
 {
 	Object *ob = 0;

Modified: branches/particles-2010/source/blender/editors/space_node/drawnode.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/drawnode.c	2010-08-14 16:30:41 UTC (rev 31334)
+++ branches/particles-2010/source/blender/editors/space_node/drawnode.c	2010-08-14 17:01:14 UTC (rev 31335)
@@ -1261,7 +1261,7 @@
 	}
 }
 
-static void node_simulation_buts_getobjectdata(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_simulation_buts_object(uiLayout *layout, bContext *C, PointerRNA *ptr)
 {
 //	bNode *node= ptr->data;
 	uiLayout *col;
@@ -1270,61 +1270,31 @@
 	uiItemR(col, ptr, "object", 0, NULL, 0);
 }
 
-static void node_simulation_buts_setobjectdata(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{
-//	bNode *node= ptr->data;
-	uiLayout *col;
-	
-	col= uiLayoutColumn(layout, 0);
-	uiItemR(col, ptr, "object", 0, NULL, 0);
-}
-
-static void node_simulation_buts_getvertexdata(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{
-//	bNode *node= ptr->data;
-	uiLayout *col;
-	
-	col= uiLayoutColumn(layout, 0);
-	uiItemR(col, ptr, "object", 0, NULL, 0);
-}
-
-static void node_simulation_buts_setvertexdata(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{
-//	bNode *node= ptr->data;
-	uiLayout *col;
-	
-	col= uiLayoutColumn(layout, 0);
-	uiItemR(col, ptr, "object", 0, NULL, 0);
-}
-
-static void node_simulation_buts_addparticle(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list