Fixed the node_recurs_check function used to define the order of nodes in ntreeSolveOrder. This was creating equal node levels in some cases (auto-linking viewer to nodes further downstream), leading to falsely detected circular dependencies.

This commit is contained in:
Lukas Toenne
2011-03-13 17:23:44 +00:00
parent 70340503d8
commit 2907826d8c

View File

@@ -1759,32 +1759,29 @@ void ntreeSocketUseFlags(bNodeTree *ntree)
/* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */
static int node_recurs_check(bNode *node, bNode ***nsort, int level)
static int node_recurs_check(bNode *node, bNode ***nsort)
{
bNode *fromnode;
bNodeSocket *sock;
int has_inputlinks= 0;
int level = 0xFFF;
node->done= 1;
level++;
for(sock= node->inputs.first; sock; sock= sock->next) {
if(sock->link) {
has_inputlinks= 1;
fromnode= sock->link->fromnode;
if(fromnode && fromnode->done==0) {
fromnode->level= node_recurs_check(fromnode, nsort, level);
if(fromnode) {
if (fromnode->done==0)
fromnode->level= node_recurs_check(fromnode, nsort);
if (fromnode->level <= level)
level = fromnode->level - 1;
}
}
}
// printf("node sort %s level %d\n", node->name, level);
**nsort= node;
(*nsort)++;
if(has_inputlinks)
return level;
else
return 0xFFF;
return level;
}
@@ -1873,7 +1870,7 @@ void ntreeSolveOrder(bNodeTree *ntree)
/* 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);
}
}