Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-04-17 14:38:10 +0400
committerTon Roosendaal <ton@blender.org>2009-04-17 14:38:10 +0400
commit80e40d504c457ed3041fed925a6b3f80f54dffe1 (patch)
tree4e3f0cdfa82904277f9e9359dd0a5e54eabb0ce5
parent6761cc00d4f79f603a7e52b33e0aad26e210cbd2 (diff)
bugfix #18287
Texture nodes hang when nodes have a cyclic case. Added a (temp?) provision to tag node->need_exec zero for cyclic nodes, and added check for this in texture nodes. There was also a bug in 'tag changed' for texture nodes, which not only tagged, but also called the tree exec (should not happen!). In general the texture exec needs recode; it doesn't use the stacks as provided per node, but recurses itself to previous nodes, giving problems like this. Node execs should only do their own bizz, the node system handles dependency and eval order nicely already.
-rw-r--r--source/blender/blenkernel/intern/node.c39
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_texture.c2
-rw-r--r--source/blender/nodes/intern/TEX_util.c9
3 files changed, 38 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 9a78f8ea02a..e4e5883b2d8 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1644,7 +1644,8 @@ void ntreeSolveOrder(bNodeTree *ntree)
might be different for editor or for "real" use... */
}
-/* should be callback! */
+/* Should be callback! */
+/* Do not call execs here */
void NodeTagChanged(bNodeTree *ntree, bNode *node)
{
if(ntree->type==NTREE_COMPOSIT) {
@@ -1664,8 +1665,6 @@ void NodeTagChanged(bNodeTree *ntree, bNode *node)
}
node->need_exec= 1;
}
- else if(ntree->type == NTREE_TEXTURE)
- ntreeTexUpdatePreviews(ntree);
}
void NodeTagIDChanged(bNodeTree *ntree, ID *id)
@@ -2067,6 +2066,11 @@ void ntreeBeginExecTree(bNodeTree *ntree)
/* tag used outputs, so we know when we can skip operations */
for(node= ntree->nodes.first; node; node= node->next) {
bNodeSocket *sock;
+
+ /* composite has own need_exec tag handling */
+ if(ntree->type!=NTREE_COMPOSIT)
+ node->need_exec= 1;
+
for(sock= node->inputs.first; sock; sock= sock->next) {
if(sock->link) {
ns= ntree->stack + sock->link->fromsock->stack_index;
@@ -2075,9 +2079,22 @@ void ntreeBeginExecTree(bNodeTree *ntree)
}
else
sock->ns.sockettype= sock->type;
+
+ if(sock->link) {
+ bNodeLink *link= sock->link;
+ /* this is the test for a cyclic case */
+ if(link->fromnode && link->tonode) {
+ if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF);
+ else {
+ node->need_exec= 0;
+ }
+ }
+ }
}
+
if(node->type==NODE_GROUP && node->id)
group_tag_used_outputs(node, ntree->stack);
+
}
if(ntree->type==NTREE_COMPOSIT)
@@ -2160,13 +2177,15 @@ void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread)
}
for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->execfunc) {
- node_get_stack(node, stack, nsin, nsout);
- node->typeinfo->execfunc(callerdata, node, nsin, nsout);
- }
- else if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, stack, nsin, nsout);
- node_group_execute(stack, callerdata, node, nsin, nsout);
+ if(node->need_exec) {
+ if(node->typeinfo->execfunc) {
+ node_get_stack(node, stack, nsin, nsout);
+ node->typeinfo->execfunc(callerdata, node, nsin, nsout);
+ }
+ else if(node->type==NODE_GROUP && node->id) {
+ node_get_stack(node, stack, nsin, nsout);
+ node_group_execute(stack, callerdata, node, nsin, nsout);
+ }
}
}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
index 884d2cd0eb6..30492b84764 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
@@ -47,7 +47,7 @@ static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, shor
Tex *nodetex = (Tex *)node->id;
- if(node->custom2) {
+ if(node->custom2 || node->need_exec==0) {
/* this node refers to its own texture tree! */
QUATCOPY(
out,
diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c
index 562072328a8..1aabb7ae514 100644
--- a/source/blender/nodes/intern/TEX_util.c
+++ b/source/blender/nodes/intern/TEX_util.c
@@ -34,6 +34,12 @@
obtain a colour value from this, a node further up the chain reads
the TexDelegate* from its input stack, and uses tex_call_delegate to
retrieve the colour from the delegate.
+
+ comments: (ton)
+
+ This system needs recode, a node system should rely on the stack, and
+ callbacks for nodes only should evaluate own node, not recursively go
+ over other previous ones.
*/
#include <assert.h>
@@ -43,7 +49,8 @@
void tex_call_delegate(TexDelegate *dg, float *out, float *coord, short thread)
{
- dg->fn(out, coord, dg->node, dg->in, thread);
+ if(dg->node->need_exec)
+ dg->fn(out, coord, dg->node, dg->in, thread);
}
void tex_input(float *out, int sz, bNodeStack *in, float *coord, short thread)