diff options
author | Thomas Dinges <blender@dingto.org> | 2014-06-13 23:44:48 +0400 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2014-06-13 23:59:14 +0400 |
commit | 3de3987ea190415d0d088c3917b45f44afb43840 (patch) | |
tree | 35577ec3798ee74ee4c37821ec74981b3c9d7342 /intern | |
parent | 49df707496e505c8a8b21c1ea36b479e950cc66c (diff) |
Cycles: Add dedicated nodes to split/combine vectors.
This was already possible via the RGB nodes, but that seems weird.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/app/cycles_xml.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/blender/blender_shader.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/CMakeLists.txt | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/CMakeLists.txt | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/node_combine_xyz.osl | 27 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/node_separate_xyz.osl | 28 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm.h | 7 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_sepcomb_xyz.h | 42 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 68 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 10 |
11 files changed, 199 insertions, 0 deletions
diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp index de554fba954..f50a952676f 100644 --- a/intern/cycles/app/cycles_xml.cpp +++ b/intern/cycles/app/cycles_xml.cpp @@ -633,6 +633,12 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug else if(string_iequals(node.name(), "separate_hsv")) { snode = new SeparateHSVNode(); } + else if(string_iequals(node.name(), "combine_xyz")) { + snode = new CombineHSVNode(); + } + else if(string_iequals(node.name(), "separate_xyz")) { + snode = new SeparateHSVNode(); + } else if(string_iequals(node.name(), "hsv")) { snode = new HSVNode(); } diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 379e27c558c..bce236530b9 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -244,6 +244,12 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen else if (b_node.is_a(&RNA_ShaderNodeCombineHSV)) { node = new CombineHSVNode(); } + else if (b_node.is_a(&RNA_ShaderNodeSeparateXYZ)) { + node = new SeparateXYZNode(); + } + else if (b_node.is_a(&RNA_ShaderNodeCombineXYZ)) { + node = new CombineXYZNode(); + } else if (b_node.is_a(&RNA_ShaderNodeHueSaturation)) { node = new HSVNode(); } diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 994fba7a1d3..62d56b46509 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -97,6 +97,7 @@ set(SRC_SVM_HEADERS svm/svm_ramp.h svm/svm_sepcomb_rgb.h svm/svm_sepcomb_hsv.h + svm/svm_sepcomb_xyz.h svm/svm_sky.h svm/svm_tex_coord.h svm/svm_texture.h diff --git a/intern/cycles/kernel/shaders/CMakeLists.txt b/intern/cycles/kernel/shaders/CMakeLists.txt index 5518d652bf9..b164c2a03f7 100644 --- a/intern/cycles/kernel/shaders/CMakeLists.txt +++ b/intern/cycles/kernel/shaders/CMakeLists.txt @@ -13,6 +13,7 @@ set(SRC_OSL node_checker_texture.osl node_combine_rgb.osl node_combine_hsv.osl + node_combine_xyz.osl node_convert_from_color.osl node_convert_from_float.osl node_convert_from_int.osl @@ -57,6 +58,7 @@ set(SRC_OSL node_rgb_ramp.osl node_separate_rgb.osl node_separate_hsv.osl + node_separate_xyz.osl node_set_normal.osl node_sky_texture.osl node_subsurface_scattering.osl diff --git a/intern/cycles/kernel/shaders/node_combine_xyz.osl b/intern/cycles/kernel/shaders/node_combine_xyz.osl new file mode 100644 index 00000000000..933dee5bd78 --- /dev/null +++ b/intern/cycles/kernel/shaders/node_combine_xyz.osl @@ -0,0 +1,27 @@ +/* + * Copyright 2011-2014 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#include "stdosl.h" + +shader node_combine_xyz( + float X = 0.0, + float Y = 0.0, + float Z = 0.0, + output vector Vector = 0.8) +{ + Vector = vector(X, Y, Z); +} + diff --git a/intern/cycles/kernel/shaders/node_separate_xyz.osl b/intern/cycles/kernel/shaders/node_separate_xyz.osl new file mode 100644 index 00000000000..63725cb9995 --- /dev/null +++ b/intern/cycles/kernel/shaders/node_separate_xyz.osl @@ -0,0 +1,28 @@ +/* + * Copyright 2011-2013 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#include "stdosl.h" + +shader node_separate_xyz( + vector Vector = 0.8, + output float X = 0.0, + output float Y = 0.0, + output float Z = 0.0) +{ + X = Vector[0]; + Y = Vector[1]; + Z = Vector[2]; +} diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 6d556a66afa..acdc5183e18 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -169,6 +169,7 @@ CCL_NAMESPACE_END #include "svm_ramp.h" #include "svm_sepcomb_rgb.h" #include "svm_sepcomb_hsv.h" +#include "svm_sepcomb_xyz.h" #include "svm_musgrave.h" #include "svm_sky.h" #include "svm_tex_coord.h" @@ -333,6 +334,12 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, Shade case NODE_COMBINE_RGB: svm_node_combine_rgb(sd, stack, node.y, node.z, node.w); break; + case NODE_SEPARATE_XYZ: + svm_node_separate_xyz(sd, stack, node.y, node.z, node.w); + break; + case NODE_COMBINE_XYZ: + svm_node_combine_xyz(sd, stack, node.y, node.z, node.w); + break; case NODE_SEPARATE_HSV: svm_node_separate_hsv(kg, sd, stack, node.y, node.z, node.w, &offset); break; diff --git a/intern/cycles/kernel/svm/svm_sepcomb_xyz.h b/intern/cycles/kernel/svm/svm_sepcomb_xyz.h new file mode 100644 index 00000000000..f9f966451fd --- /dev/null +++ b/intern/cycles/kernel/svm/svm_sepcomb_xyz.h @@ -0,0 +1,42 @@ +/* + * Copyright 2011-2014 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +CCL_NAMESPACE_BEGIN + +ccl_device void svm_node_combine_xyz(ShaderData *sd, float *stack, uint in_offset, uint vector_index, uint out_offset) +{ + float vector = stack_load_float(stack, in_offset); + + if (stack_valid(out_offset)) + stack_store_float(stack, out_offset+vector_index, vector); +} + +ccl_device void svm_node_separate_xyz(ShaderData *sd, float *stack, uint ivector_offset, uint vector_index, uint out_offset) +{ + float3 vector = stack_load_float3(stack, ivector_offset); + + if (stack_valid(out_offset)) { + if (vector_index == 0) + stack_store_float(stack, out_offset, vector.x); + else if (vector_index == 1) + stack_store_float(stack, out_offset, vector.y); + else + stack_store_float(stack, out_offset, vector.z); + } +} + +CCL_NAMESPACE_END + diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index fda035fdbe0..29a0d264237 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -80,6 +80,8 @@ typedef enum NodeType { NODE_CLOSURE_VOLUME, NODE_SEPARATE_RGB, NODE_COMBINE_RGB, + NODE_SEPARATE_XYZ, + NODE_COMBINE_XYZ, NODE_SEPARATE_HSV, NODE_COMBINE_HSV, NODE_HSV, 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) |