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:
@@ -483,6 +483,8 @@ void ShaderGraph::constant_fold()
|
|||||||
ShaderNodeSet done, scheduled;
|
ShaderNodeSet done, scheduled;
|
||||||
queue<ShaderNode*> traverse_queue;
|
queue<ShaderNode*> traverse_queue;
|
||||||
|
|
||||||
|
bool has_displacement = (output()->input("Displacement")->link != NULL);
|
||||||
|
|
||||||
/* Schedule nodes which doesn't have any dependencies. */
|
/* Schedule nodes which doesn't have any dependencies. */
|
||||||
foreach(ShaderNode *node, nodes) {
|
foreach(ShaderNode *node, nodes) {
|
||||||
if(!check_node_inputs_has_links(node)) {
|
if(!check_node_inputs_has_links(node)) {
|
||||||
@@ -520,6 +522,17 @@ void ShaderGraph::constant_fold()
|
|||||||
node->constant_fold(folder);
|
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. */
|
/* Step 3: Simplification. */
|
||||||
|
Reference in New Issue
Block a user