Cycles: Fix shading and crashes resulting from constant folding on displacement

Constant folding was removing all nodes connected to the displacement output
if they evaluated to a constant, causing there to be no valid graph for
displacement even when there was displacement to be applied, and sometimes
caused crashes.
This commit is contained in:
Mai Lavelle 2016-09-11 13:39:12 -04:00 committed by Sergey Sharybin
parent fd01cd7d06
commit 293d5db895
1 changed files with 13 additions and 0 deletions

View File

@ -483,6 +483,8 @@ void ShaderGraph::constant_fold()
ShaderNodeSet done, scheduled;
queue<ShaderNode*> traverse_queue;
bool has_displacement = (output()->input("Displacement")->link != NULL);
/* Schedule nodes which doesn't have any dependencies. */
foreach(ShaderNode *node, nodes) {
if(!check_node_inputs_has_links(node)) {
@ -520,6 +522,17 @@ void ShaderGraph::constant_fold()
node->constant_fold(folder);
}
}
/* Folding might have removed all nodes connected to the displacement output
* even tho there is displacement to be applied, so add in a value node if
* that happens to ensure there is still a valid graph for displacement.
*/
if(has_displacement && !output()->input("Displacement")->link) {
ValueNode *value = (ValueNode*)add(new ValueNode());
value->value = output()->displacement;
connect(value->output("Value"), output()->input("Displacement"));
}
}
/* Step 3: Simplification. */