diff options
author | Thomas Dinges <blender@dingto.org> | 2014-12-25 00:45:08 +0300 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2014-12-25 00:45:08 +0300 |
commit | 43421e9c5354b6f061cd51922e1a31579b94c6af (patch) | |
tree | 1c1efc8cc5f9153ee6881f6f7d745464ac5beb45 /intern/cycles/render | |
parent | 76b4fad6dbda1b10c8db1acec49c30386c9d9a94 (diff) |
Cycles: Optimize vector math node without links to single values.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/nodes.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 62bdf7cd162..41fa8fd5db2 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -3754,11 +3754,31 @@ void VectorMathNode::compile(SVMCompiler& compiler) ShaderOutput *value_out = output("Value"); ShaderOutput *vector_out = output("Vector"); - compiler.stack_assign(vector1_in); - compiler.stack_assign(vector2_in); compiler.stack_assign(value_out); compiler.stack_assign(vector_out); + /* Optimize vector math node without links to a single value node. */ + if(vector1_in->link == NULL && vector2_in->link == NULL) { + float optimized_value; + float3 optimized_vector; + svm_vector_math(&optimized_value, + &optimized_vector, + (NodeVectorMath)type_enum[type], + vector1_in->value, + vector2_in->value); + + compiler.add_node(NODE_VALUE_F, + __float_as_int(optimized_value), + value_out->stack_offset); + + compiler.add_node(NODE_VALUE_V, vector_out->stack_offset); + compiler.add_node(NODE_VALUE_V, optimized_vector); + return; + } + + compiler.stack_assign(vector1_in); + compiler.stack_assign(vector2_in); + compiler.add_node(NODE_VECTOR_MATH, type_enum[type], vector1_in->stack_offset, vector2_in->stack_offset); compiler.add_node(NODE_VECTOR_MATH, value_out->stack_offset, vector_out->stack_offset); } |