[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