[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32977] branches/particles-2010/source/ blender: * Fix for node update function, this uses the generic foreach node tree iteration callback for tree types.

Lukas Toenne lukas.toenne at googlemail.com
Wed Nov 10 08:46:38 CET 2010


Revision: 32977
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32977
Author:   lukastoenne
Date:     2010-11-10 08:46:38 +0100 (Wed, 10 Nov 2010)

Log Message:
-----------
* Fix for node update function, this uses the generic foreach node tree iteration callback for tree types.
* Changed uniform distribution function in random node to use range parameters instead of mean & variance (like gaussian and triangular).

Modified Paths:
--------------
    branches/particles-2010/source/blender/editors/space_node/node_draw.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_random.c

Modified: branches/particles-2010/source/blender/editors/space_node/node_draw.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/node_draw.c	2010-11-10 07:44:48 UTC (rev 32976)
+++ branches/particles-2010/source/blender/editors/space_node/node_draw.c	2010-11-10 07:46:38 UTC (rev 32977)
@@ -44,6 +44,7 @@
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
 #include "BKE_main.h"
+#include "BKE_node.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
@@ -117,25 +118,26 @@
 	return 0;
 }
 
+typedef struct NodeUpdateCalldata {
+	bNodeTree *ntree;
+	bNode *node;
+} NodeUpdateCalldata;
+static void node_generic_update_cb(void *calldata, ID *owner_id, bNodeTree *ntree)
+{
+	NodeUpdateCalldata *cd= (NodeUpdateCalldata*)calldata;
+	/* check if nodetree uses the group stored in calldata */
+	if (has_nodetree(ntree, cd->ntree))
+		ED_node_changed_update(owner_id, cd->node);
+}
 void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node)
 {
-	Material *ma;
-	Tex *tex;
-	Scene *sce;
-	
+	bNodeTreeTypeInfo *tti= ntreeGetTypeInfo(ntree->type);
+	NodeUpdateCalldata cd;
+	cd.ntree = ntree;
+	cd.node = node;
 	/* look through all datablocks, to support groups */
-	for(ma=bmain->mat.first; ma; ma=ma->id.next)
-		if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree))
-			ED_node_changed_update(&ma->id, node);
+	tti->foreachNodeTree(bmain, &cd, node_generic_update_cb);
 	
-	for(tex=bmain->tex.first; tex; tex=tex->id.next)
-		if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree))
-			ED_node_changed_update(&tex->id, node);
-	
-	for(sce=bmain->scene.first; sce; sce=sce->id.next)
-		if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree))
-			ED_node_changed_update(&sce->id, node);
-	
 	if(ntree->type == NTREE_TEXTURE)
 		ntreeTexCheckCyclics(ntree);
 }

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_random.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_random.c	2010-11-10 07:44:48 UTC (rev 32976)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_random.c	2010-11-10 07:46:38 UTC (rev 32977)
@@ -36,7 +36,7 @@
 	{ SOCK_INT, 1, "Seed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f },
 	{ SOCK_INT, 1, "ID", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f },
 	{ SOCK_FLOAT, 1, "Mean Value", 0.0f, 0.0f, 0.0f, 0.0f, -1000000.0f, 1000000.0f },
-	{ SOCK_FLOAT, 1, "Variance", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f },
+	{ SOCK_FLOAT, 1, "Variance", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f },
 	{ -1, 0, "" }
 };
 
@@ -45,6 +45,26 @@
 	{ -1, 0, "" }
 };
 
+static void update(bNodeTree *ntree, bNode *node)
+{
+	/* For convenience, the scale sockets are interpreted as either a range pair (uniform)
+	 * or a mean and variance value (gaussian, triangular). Names are changed to indicate this.
+	 */
+	bNodeSocket *sock1 = BLI_findlink(&node->inputs, 2);
+	bNodeSocket *sock2 = BLI_findlink(&node->inputs, 3);
+	switch (node->custom1) {
+	case SIM_RANDOM_UNIFORM:
+		strcpy(sock1->name, "A");
+		strcpy(sock2->name, "B");
+		break;
+	case SIM_RANDOM_GAUSSIAN:
+	case SIM_RANDOM_TRIANGULAR:
+		strcpy(sock1->name, "Mean Value");
+		strcpy(sock2->name, "Variance");
+		break;
+	}
+}
+
 static char *generate_source(struct SimNodeStack *node)
 {
 	DynStr *source= sim_kernel_source_begin(node, NULL, 0, NULL);
@@ -66,21 +86,23 @@
 	BLI_srandom(SIM_INPUT_INT(0, global_id) + BLI_rand());
 	switch (node->base->custom1) {
 	case SIM_RANDOM_UNIFORM:
-		r = 2.0f*BLI_frand() - 1.0f;
+		r = BLI_frand();
+		*SIM_OUTPUT_FLOAT(0, global_id) = (1.0f-r) * SIM_INPUT_FLOAT(2, global_id) + r * SIM_INPUT_FLOAT(3, global_id);
 		break;
 	case SIM_RANDOM_GAUSSIAN:
 		/* Box-Muller method */
 		u1 = BLI_frand();
 		u2 = BLI_frand();
 		r = sqrt(-2.0f*log(u1)) * cos(6.28318530717958647693 * u2);
+		*SIM_OUTPUT_FLOAT(0, global_id) = SIM_INPUT_FLOAT(2, global_id) + r * SIM_INPUT_FLOAT(3, global_id);
 		break;
 	case SIM_RANDOM_TRIANGULAR:
 		u1 = BLI_frand();
 		u2 = BLI_frand();
 		r = (u2 < 0.5f ? 1.0f - sqrt(1.0f - u1) : sqrt(1.0f - u1) - 1.0f);
+		*SIM_OUTPUT_FLOAT(0, global_id) = SIM_INPUT_FLOAT(2, global_id) + r * SIM_INPUT_FLOAT(3, global_id);
 		break;
 	}
-	*SIM_OUTPUT_FLOAT(0, global_id) = SIM_INPUT_FLOAT(2, global_id) + r * SIM_INPUT_FLOAT(3, global_id);
 }
 
 static void enqueue(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
@@ -111,6 +133,7 @@
 	type.flag = NODE_OPTIONS;
 	type.inputs = inputs;
 	type.outputs = outputs;
+	type.updatefunc = update;
 	
 	type.generate_source = generate_source;
 	type.enqueue = enqueue;





More information about the Bf-blender-cvs mailing list