diff options
author | Thomas Dinges <blender@dingto.org> | 2015-12-23 23:41:59 +0300 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2015-12-23 23:48:19 +0300 |
commit | 059b7a81e2a1ce19ac3c4262bd86eb8d961d5582 (patch) | |
tree | 33d19b0d003522deba981332f348f7af7db0ad91 /intern | |
parent | 1a2b5d9a8bdb0b48b0cbc421483be8005257f6fa (diff) |
Cycles: Implement constant fold for the ConvertNode.
This way socket type conversions (such as color to float, or float to vector) do not stop the folding process.
Example: http://www.pasteall.org/pic/show.php?id=96803 (selected nodes are folded).
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/render/nodes.cpp | 50 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 2 |
2 files changed, 52 insertions, 0 deletions
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 74a0d207e81..870efda7b80 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1621,6 +1621,56 @@ ConvertNode::ConvertNode(ShaderSocketType from_, ShaderSocketType to_, bool auto assert(0); } +bool ConvertNode::constant_fold(ShaderOutput *socket, float3 *optimized_value) +{ + ShaderInput *in = inputs[0]; + float3 value = in->value; + + /* TODO(DingTo): conversion from/to int is not supported yet, don't fold in that case */ + + if(socket == outputs[0] && in->link == NULL) { + if(from == SHADER_SOCKET_FLOAT) { + if(to == SHADER_SOCKET_INT) + /* float to int */ + return false; + else + /* float to float3 */ + *optimized_value = make_float3(value.x, value.x, value.x); + } + else if(from == SHADER_SOCKET_INT) { + if(to == SHADER_SOCKET_FLOAT) + /* int to float */ + return false; + else + /* int to vector/point/normal */ + return false; + } + else if(to == SHADER_SOCKET_FLOAT) { + if(from == SHADER_SOCKET_COLOR) + /* color to float */ + optimized_value->x = linear_rgb_to_gray(value); + else + /* vector/point/normal to float */ + optimized_value->x = average(value); + } + else if(to == SHADER_SOCKET_INT) { + if(from == SHADER_SOCKET_COLOR) + /* color to int */ + return false; + else + /* vector/point/normal to int */ + return false; + } + else { + *optimized_value = value; + } + + return true; + } + + return false; +} + void ConvertNode::compile(SVMCompiler& compiler) { ShaderInput *in = inputs[0]; diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 8c5f6651463..5d0a9eb533b 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -252,6 +252,8 @@ public: ConvertNode(ShaderSocketType from, ShaderSocketType to, bool autoconvert = false); SHADER_NODE_BASE_CLASS(ConvertNode) + bool constant_fold(ShaderOutput *socket, float3 *optimized_value); + ShaderSocketType from, to; }; |