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:
authorClément Foucault <foucault.clem@gmail.com>2019-10-10 01:31:47 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-10-10 01:31:47 +0300
commitf61a8a2abd07ee879f9bc860230e0dd3e6ee6a0c (patch)
treea61ad71884c9f224927c3a8457b4aa74ab2f75bb /source/blender/blenkernel/intern/node.c
parent8163fda9fb8b89ce9a58fcbb6310b2bb9d78da73 (diff)
Fix T70614 EEVEE: Bump with texture connected to other branches don't work
Was caused by the bump node not being evaluated because the other branch was evaluated before. To fix this, we use fromnode instead of tonode. Also we fix a potential issue with recursiveness because ntree_shader_copy_branch() also use nodeChainIterBackwards() which would reset the iter_flag in the middle of the parent iteration. Use iter_flag as a bitflag for each iteration to fix this.
Diffstat (limited to 'source/blender/blenkernel/intern/node.c')
-rw-r--r--source/blender/blenkernel/intern/node.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 4ddfd879657..779728cb037 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -950,7 +950,8 @@ void nodeChainIter(const bNodeTree *ntree,
static void iter_backwards_ex(const bNodeTree *ntree,
const bNode *node_start,
bool (*callback)(bNode *, bNode *, void *),
- void *userdata)
+ void *userdata,
+ char recursion_mask)
{
LISTBASE_FOREACH (bNodeSocket *, sock, &node_start->inputs) {
bNodeLink *link = sock->link;
@@ -961,18 +962,17 @@ static void iter_backwards_ex(const bNodeTree *ntree,
/* Skip links marked as cyclic. */
continue;
}
- if (link->fromnode->iter_flag) {
- /* Only iter on nodes once. */
+ if (link->fromnode->iter_flag & recursion_mask) {
continue;
}
else {
- link->fromnode->iter_flag = 1;
+ link->fromnode->iter_flag |= recursion_mask;
}
if (!callback(link->fromnode, link->tonode, userdata)) {
return;
}
- iter_backwards_ex(ntree, link->fromnode, callback, userdata);
+ iter_backwards_ex(ntree, link->fromnode, callback, userdata, recursion_mask);
}
}
@@ -981,6 +981,8 @@ static void iter_backwards_ex(const bNodeTree *ntree,
* \a callback for each node (which can return false to end iterator).
*
* Faster than nodeChainIter. Iter only once per node.
+ * Can be called recursively (using another nodeChainIterBackwards) by
+ * setting the recursion_lvl accordingly.
*
* \note Needs updated socket links (ntreeUpdateTree).
* \note Recursive
@@ -988,18 +990,23 @@ static void iter_backwards_ex(const bNodeTree *ntree,
void nodeChainIterBackwards(const bNodeTree *ntree,
const bNode *node_start,
bool (*callback)(bNode *, bNode *, void *),
- void *userdata)
+ void *userdata,
+ int recursion_lvl)
{
if (!node_start) {
return;
}
+ /* Limited by iter_flag type. */
+ BLI_assert(recursion_lvl < 8);
+ char recursion_mask = (1 << recursion_lvl);
+
/* Reset flag. */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
- node->iter_flag = 0;
+ node->iter_flag &= ~recursion_mask;
}
- iter_backwards_ex(ntree, node_start, callback, userdata);
+ iter_backwards_ex(ntree, node_start, callback, userdata, recursion_mask);
}
/**