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
path: root/intern
diff options
context:
space:
mode:
authorThomas Dinges <blender@dingto.org>2015-12-23 23:41:59 +0300
committerThomas Dinges <blender@dingto.org>2015-12-23 23:48:19 +0300
commit059b7a81e2a1ce19ac3c4262bd86eb8d961d5582 (patch)
tree33d19b0d003522deba981332f348f7af7db0ad91 /intern
parent1a2b5d9a8bdb0b48b0cbc421483be8005257f6fa (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.cpp50
-rw-r--r--intern/cycles/render/nodes.h2
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;
};