From 3de3987ea190415d0d088c3917b45f44afb43840 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Fri, 13 Jun 2014 21:44:48 +0200 Subject: Cycles: Add dedicated nodes to split/combine vectors. This was already possible via the RGB nodes, but that seems weird. --- intern/cycles/render/nodes.cpp | 68 ++++++++++++++++++++++++++++++++++++++++++ intern/cycles/render/nodes.h | 10 +++++++ 2 files changed, 78 insertions(+) (limited to 'intern/cycles/render') diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 2d7f9ea848b..d49a719f4e7 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -3056,6 +3056,40 @@ void CombineRGBNode::compile(OSLCompiler& compiler) compiler.add(this, "node_combine_rgb"); } +/* Combine XYZ */ +CombineXYZNode::CombineXYZNode() +: ShaderNode("combine_xyz") +{ + add_input("X", SHADER_SOCKET_FLOAT); + add_input("Y", SHADER_SOCKET_FLOAT); + add_input("Z", SHADER_SOCKET_FLOAT); + add_output("Vector", SHADER_SOCKET_VECTOR); +} + +void CombineXYZNode::compile(SVMCompiler& compiler) +{ + ShaderInput *x_in = input("X"); + ShaderInput *y_in = input("Y"); + ShaderInput *z_in = input("Z"); + ShaderOutput *vector_out = output("Vector"); + + compiler.stack_assign(vector_out); + + compiler.stack_assign(x_in); + compiler.add_node(NODE_COMBINE_XYZ, x_in->stack_offset, 0, vector_out->stack_offset); + + compiler.stack_assign(y_in); + compiler.add_node(NODE_COMBINE_XYZ, y_in->stack_offset, 1, vector_out->stack_offset); + + compiler.stack_assign(z_in); + compiler.add_node(NODE_COMBINE_XYZ, z_in->stack_offset, 2, vector_out->stack_offset); +} + +void CombineXYZNode::compile(OSLCompiler& compiler) +{ + compiler.add(this, "node_combine_xyz"); +} + /* Combine HSV */ CombineHSVNode::CombineHSVNode() : ShaderNode("combine_hsv") @@ -3180,6 +3214,40 @@ void SeparateRGBNode::compile(OSLCompiler& compiler) compiler.add(this, "node_separate_rgb"); } +/* Separate XYZ */ +SeparateXYZNode::SeparateXYZNode() +: ShaderNode("separate_xyz") +{ + add_input("Vector", SHADER_SOCKET_VECTOR); + add_output("X", SHADER_SOCKET_FLOAT); + add_output("Y", SHADER_SOCKET_FLOAT); + add_output("Z", SHADER_SOCKET_FLOAT); +} + +void SeparateXYZNode::compile(SVMCompiler& compiler) +{ + ShaderInput *vector_in = input("Vector"); + ShaderOutput *x_out = output("X"); + ShaderOutput *y_out = output("Y"); + ShaderOutput *z_out = output("Z"); + + compiler.stack_assign(vector_in); + + compiler.stack_assign(x_out); + compiler.add_node(NODE_SEPARATE_XYZ, vector_in->stack_offset, 0, x_out->stack_offset); + + compiler.stack_assign(y_out); + compiler.add_node(NODE_SEPARATE_XYZ, vector_in->stack_offset, 1, y_out->stack_offset); + + compiler.stack_assign(z_out); + compiler.add_node(NODE_SEPARATE_XYZ, vector_in->stack_offset, 2, z_out->stack_offset); +} + +void SeparateXYZNode::compile(OSLCompiler& compiler) +{ + compiler.add(this, "node_separate_xyz"); +} + /* Separate HSV */ SeparateHSVNode::SeparateHSVNode() : ShaderNode("separate_hsv") diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 8bdce9901b2..cf89bdadaa2 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -451,6 +451,11 @@ public: SHADER_NODE_CLASS(CombineHSVNode) }; +class CombineXYZNode : public ShaderNode { +public: + SHADER_NODE_CLASS(CombineXYZNode) +}; + class GammaNode : public ShaderNode { public: SHADER_NODE_CLASS(GammaNode) @@ -471,6 +476,11 @@ public: SHADER_NODE_CLASS(SeparateHSVNode) }; +class SeparateXYZNode : public ShaderNode { +public: + SHADER_NODE_CLASS(SeparateXYZNode) +}; + class HSVNode : public ShaderNode { public: SHADER_NODE_CLASS(HSVNode) -- cgit v1.2.3