forked from bartvdbraak/blender
Generalization of node dependency sorting, avoid using the sock->link pointer. This pointer only works for sockets that follow the standard 1-to-n connectivity (an output can be linked to multiple inputs, an input can only have one connection). Future node trees may implement 1-to-1 or n-to-1 linking.
This commit is contained in:
parent
08fc8c3561
commit
2a3c65169f
@ -1641,21 +1641,21 @@ int BKE_node_clipboard_get_type(void)
|
|||||||
/* ************** dependency stuff *********** */
|
/* ************** dependency stuff *********** */
|
||||||
|
|
||||||
/* node is guaranteed to be not checked before */
|
/* node is guaranteed to be not checked before */
|
||||||
static int node_get_deplist_recurs(bNode *node, bNode ***nsort)
|
static int node_get_deplist_recurs(bNodeTree *ntree, bNode *node, bNode ***nsort)
|
||||||
{
|
{
|
||||||
bNode *fromnode;
|
bNode *fromnode;
|
||||||
bNodeSocket *sock;
|
bNodeLink *link;
|
||||||
int level = 0xFFF;
|
int level = 0xFFF;
|
||||||
|
|
||||||
node->done = TRUE;
|
node->done = TRUE;
|
||||||
|
|
||||||
/* check linked nodes */
|
/* check linked nodes */
|
||||||
for (sock = node->inputs.first; sock; sock = sock->next) {
|
for (link = ntree->links.first; link; link = link->next) {
|
||||||
if (sock->link) {
|
if (link->tonode == node) {
|
||||||
fromnode = sock->link->fromnode;
|
fromnode = link->fromnode;
|
||||||
if (fromnode) {
|
if (fromnode) {
|
||||||
if (fromnode->done == 0)
|
if (fromnode->done == 0)
|
||||||
fromnode->level = node_get_deplist_recurs(fromnode, nsort);
|
fromnode->level = node_get_deplist_recurs(ntree, fromnode, nsort);
|
||||||
if (fromnode->level <= level)
|
if (fromnode->level <= level)
|
||||||
level = fromnode->level - 1;
|
level = fromnode->level - 1;
|
||||||
}
|
}
|
||||||
@ -1665,7 +1665,7 @@ static int node_get_deplist_recurs(bNode *node, bNode ***nsort)
|
|||||||
/* check parent node */
|
/* check parent node */
|
||||||
if (node->parent) {
|
if (node->parent) {
|
||||||
if (node->parent->done == 0)
|
if (node->parent->done == 0)
|
||||||
node->parent->level = node_get_deplist_recurs(node->parent, nsort);
|
node->parent->level = node_get_deplist_recurs(ntree, node->parent, nsort);
|
||||||
if (node->parent->level <= level)
|
if (node->parent->level <= level)
|
||||||
level = node->parent->level - 1;
|
level = node->parent->level - 1;
|
||||||
}
|
}
|
||||||
@ -1699,7 +1699,7 @@ void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, in
|
|||||||
/* recursive check */
|
/* recursive check */
|
||||||
for (node = ntree->nodes.first; node; node = node->next) {
|
for (node = ntree->nodes.first; node; node = node->next) {
|
||||||
if (node->done == 0) {
|
if (node->done == 0) {
|
||||||
node->level = node_get_deplist_recurs(node, &nsort);
|
node->level = node_get_deplist_recurs(ntree, node, &nsort);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1717,7 +1717,7 @@ static void ntree_update_node_level(bNodeTree *ntree)
|
|||||||
/* recursive check */
|
/* recursive check */
|
||||||
for (node = ntree->nodes.first; node; node = node->next) {
|
for (node = ntree->nodes.first; node; node = node->next) {
|
||||||
if (node->done == 0) {
|
if (node->done == 0) {
|
||||||
node->level = node_get_deplist_recurs(node, NULL);
|
node->level = node_get_deplist_recurs(ntree, node, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user