Cycles:
authorThomas Dinges <blender@dingto.org>
Wed, 3 Jul 2013 23:46:56 +0000 (23:46 +0000)
committerThomas Dinges <blender@dingto.org>
Wed, 3 Jul 2013 23:46:56 +0000 (23:46 +0000)
* Added 2 new nodes to combine and separate HSV colors.

Screenshot:
http://www.pasteall.org/pic/show.php?id=54828

17 files changed:
intern/cycles/blender/blender_shader.cpp
intern/cycles/kernel/CMakeLists.txt
intern/cycles/kernel/shaders/CMakeLists.txt
intern/cycles/kernel/shaders/node_combine_hsv.osl [new file with mode: 0644]
intern/cycles/kernel/shaders/node_separate_hsv.osl [new file with mode: 0644]
intern/cycles/kernel/svm/svm.h
intern/cycles/kernel/svm/svm_sepcomb_hsv.h [new file with mode: 0644]
intern/cycles/kernel/svm/svm_types.h
intern/cycles/render/nodes.cpp
intern/cycles/render/nodes.h
release/scripts/startup/nodeitems_builtins.py
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/node.c
source/blender/nodes/CMakeLists.txt
source/blender/nodes/NOD_shader.h
source/blender/nodes/NOD_static_types.h
source/blender/nodes/shader/nodes/node_shader_sepcombHSV.c [new file with mode: 0644]

index a1aeceeb2166193b0e4aabf95314538163d49a1d..d0b83d9e55379e50f40406b8adb1669b2c694d8d 100644 (file)
@@ -231,6 +231,12 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
        else if (b_node.is_a(&RNA_ShaderNodeCombineRGB)) {
                node = new CombineRGBNode();
        }
+       else if (b_node.is_a(&RNA_ShaderNodeSeparateHSV)) {
+               node = new SeparateHSVNode();
+       }
+       else if (b_node.is_a(&RNA_ShaderNodeCombineHSV)) {
+               node = new CombineHSVNode();
+       }
        else if (b_node.is_a(&RNA_ShaderNodeHueSaturation)) {
                node = new HSVNode();
        }
index 184aaecc9017fe4e2cecbbeab94fd6dda320c10d..963ec65278499e280686f5f9759b8802a07ec5a6 100644 (file)
@@ -100,6 +100,7 @@ set(SRC_SVM_HEADERS
        svm/svm_normal.h
        svm/svm_ramp.h
        svm/svm_sepcomb_rgb.h
+       svm/svm_sepcomb_hsv.h
        svm/svm_sky.h
        svm/svm_tex_coord.h
        svm/svm_texture.h
index df1b6ee442da7088d862118256103d5894170cc5..660cfbce528e28036c1b907e5dc8b50861094595 100644 (file)
@@ -12,6 +12,7 @@ set(SRC_OSL
        node_camera.osl
        node_checker_texture.osl
        node_combine_rgb.osl
+       node_combine_hsv.osl
        node_convert_from_color.osl
        node_convert_from_float.osl
        node_convert_from_int.osl
@@ -53,6 +54,7 @@ set(SRC_OSL
        node_rgb_curves.osl
        node_rgb_ramp.osl
        node_separate_rgb.osl
+       node_separate_hsv.osl
        node_set_normal.osl
        node_sky_texture.osl
        node_subsurface_scattering.osl
diff --git a/intern/cycles/kernel/shaders/node_combine_hsv.osl b/intern/cycles/kernel/shaders/node_combine_hsv.osl
new file mode 100644 (file)
index 0000000..a5c889e
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2013, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+
+shader node_combine_hsv(
+       float H = 0.0,
+       float S = 0.0,
+       float V = 0.0,
+       output color Color = 0.8)
+{
+       Color = color("hsv", H, S, V);  
+}
+
diff --git a/intern/cycles/kernel/shaders/node_separate_hsv.osl b/intern/cycles/kernel/shaders/node_separate_hsv.osl
new file mode 100644 (file)
index 0000000..0f074bf
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2013, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+#include "node_color.h"
+
+shader node_separate_hsv(
+       color Color = 0.8,
+       output float H = 0.0,
+       output float S = 0.0,
+       output float V = 0.0)
+{
+       color col = rgb_to_hsv(Color);
+       
+       H = col[0];
+       S = col[1];
+       V = col[2];
+}
index 20dba59d2d0d917509055bd4e5a2518de833ecf5..5380bdad1aef4fac3e9d65138f997ddfdfb590b8 100644 (file)
@@ -170,6 +170,7 @@ CCL_NAMESPACE_END
 #include "svm_mix.h"
 #include "svm_ramp.h"
 #include "svm_sepcomb_rgb.h"
+#include "svm_sepcomb_hsv.h"
 #include "svm_musgrave.h"
 #include "svm_sky.h"
 #include "svm_tex_coord.h"
@@ -340,6 +341,12 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT
                        case NODE_COMBINE_RGB:
                                svm_node_combine_rgb(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;
+                       case NODE_COMBINE_HSV:
+                               svm_node_combine_hsv(kg, sd, stack, node.y, node.z, node.w, &offset);
+                               break;
                        case NODE_HSV:
                                svm_node_hsv(kg, sd, stack, node.y, node.z, node.w, &offset);
                                break;
diff --git a/intern/cycles/kernel/svm/svm_sepcomb_hsv.h b/intern/cycles/kernel/svm/svm_sepcomb_hsv.h
new file mode 100644 (file)
index 0000000..d349d0e
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+__device void svm_node_combine_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, uint hue_in, uint saturation_in, uint value_in, int *offset)
+{
+       uint4 node1 = read_node(kg, offset);
+       uint color_out = node1.y;
+       
+       float hue = stack_load_float(stack, hue_in);
+       float saturation = stack_load_float(stack, saturation_in);
+       float value = stack_load_float(stack, value_in);
+       
+       /* Combine, and convert back to RGB */
+       float3 color = hsv_to_rgb(make_float3(hue, saturation, value));
+
+       if (stack_valid(color_out))
+               stack_store_float3(stack, color_out, color);
+}
+
+__device void svm_node_separate_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, uint color_in, uint hue_out, uint saturation_out, int *offset)
+{
+       uint4 node1 = read_node(kg, offset);
+       uint value_out = node1.y;
+       
+       float3 color = stack_load_float3(stack, color_in);
+       
+       /* Convert to HSV */
+       color = rgb_to_hsv(color);
+
+       if (stack_valid(hue_out)) 
+                       stack_store_float(stack, hue_out, color.x);
+       if (stack_valid(saturation_out)) 
+                       stack_store_float(stack, saturation_out, color.y);
+       if (stack_valid(value_out)) 
+                       stack_store_float(stack, value_out, color.z);
+}
+
+CCL_NAMESPACE_END
+
index 9d9cb71f0f9ce48461c4a243ff3100064437fe7e..6c47fbc14be0382f889fe97b1153a5e810f001ef 100644 (file)
@@ -83,6 +83,8 @@ typedef enum NodeType {
        NODE_CLOSURE_VOLUME,
        NODE_SEPARATE_RGB,
        NODE_COMBINE_RGB,
+       NODE_SEPARATE_HSV,
+       NODE_COMBINE_HSV,
        NODE_HSV,
        NODE_CAMERA,
        NODE_INVERT,
index 3fbcadee42390504af40b450803faf00aa5dcdba..319d821037709d68e7bbf8d3943ae82bfc49c7e9 100644 (file)
@@ -2644,6 +2644,37 @@ void CombineRGBNode::compile(OSLCompiler& compiler)
        compiler.add(this, "node_combine_rgb");
 }
 
+/* Combine HSV */
+CombineHSVNode::CombineHSVNode()
+: ShaderNode("combine_hsv")
+{
+       add_input("H", SHADER_SOCKET_FLOAT);
+       add_input("S", SHADER_SOCKET_FLOAT);
+       add_input("V", SHADER_SOCKET_FLOAT);
+       add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void CombineHSVNode::compile(SVMCompiler& compiler)
+{
+       ShaderInput *hue_in = input("H");
+       ShaderInput *saturation_in = input("S");
+       ShaderInput *value_in = input("V");
+       ShaderOutput *color_out = output("Color");
+
+       compiler.stack_assign(color_out);
+       compiler.stack_assign(hue_in);
+       compiler.stack_assign(saturation_in);
+       compiler.stack_assign(value_in);
+       
+       compiler.add_node(NODE_COMBINE_HSV, hue_in->stack_offset, saturation_in->stack_offset, value_in->stack_offset);
+       compiler.add_node(NODE_COMBINE_HSV, color_out->stack_offset);
+}
+
+void CombineHSVNode::compile(OSLCompiler& compiler)
+{
+       compiler.add(this, "node_combine_hsv");
+}
+
 /* Gamma */
 GammaNode::GammaNode()
 : ShaderNode("gamma")
@@ -2737,7 +2768,39 @@ void SeparateRGBNode::compile(OSLCompiler& compiler)
        compiler.add(this, "node_separate_rgb");
 }
 
-/* Separate RGB */
+/* Separate HSV */
+SeparateHSVNode::SeparateHSVNode()
+: ShaderNode("separate_rgb")
+{
+       add_input("Color", SHADER_SOCKET_COLOR);
+       add_output("H", SHADER_SOCKET_FLOAT);
+       add_output("S", SHADER_SOCKET_FLOAT);
+       add_output("V", SHADER_SOCKET_FLOAT);
+}
+
+void SeparateHSVNode::compile(SVMCompiler& compiler)
+{
+       ShaderInput *color_in = input("Color");
+       ShaderOutput *hue_out = output("H");
+       ShaderOutput *saturation_out = output("S");
+       ShaderOutput *value_out = output("V");
+
+       compiler.stack_assign(color_in);
+       compiler.stack_assign(hue_out);
+       compiler.stack_assign(saturation_out);
+       compiler.stack_assign(value_out);
+       
+       compiler.add_node(NODE_SEPARATE_HSV, color_in->stack_offset, hue_out->stack_offset, saturation_out->stack_offset);
+       compiler.add_node(NODE_SEPARATE_HSV, value_out->stack_offset);
+
+}
+
+void SeparateHSVNode::compile(OSLCompiler& compiler)
+{
+       compiler.add(this, "node_separate_hsv");
+}
+
+/* Hue Saturation Value */
 HSVNode::HSVNode()
 : ShaderNode("hsv")
 {
index 670d8da7825feb5f0a81d37a0662d3202cad58dc..ed4d24c774a645855758311bfc84979a5df8150e 100644 (file)
@@ -407,6 +407,11 @@ public:
        SHADER_NODE_CLASS(CombineRGBNode)
 };
 
+class CombineHSVNode : public ShaderNode {
+public:
+       SHADER_NODE_CLASS(CombineHSVNode)
+};
+
 class GammaNode : public ShaderNode {
 public:
        SHADER_NODE_CLASS(GammaNode)
@@ -422,6 +427,11 @@ public:
        SHADER_NODE_CLASS(SeparateRGBNode)
 };
 
+class SeparateHSVNode : public ShaderNode {
+public:
+       SHADER_NODE_CLASS(SeparateHSVNode)
+};
+
 class HSVNode : public ShaderNode {
 public:
        SHADER_NODE_CLASS(HSVNode)
index 915fa276b2696bafb5e14e62cf4b9530464a2fd0..91090dc2c75dbd59a261281b8b792629c7113d21 100644 (file)
@@ -227,6 +227,8 @@ shader_node_categories = [
         NodeItem("ShaderNodeVectorMath"),
         NodeItem("ShaderNodeSeparateRGB"),
         NodeItem("ShaderNodeCombineRGB"),
+        NodeItem("ShaderNodeSeparateHSV"),
+        NodeItem("ShaderNodeCombineHSV"),
         NodeItem("ShaderNodeWavelength"),
         NodeItem("ShaderNodeBlackbody"),
         ]),
index 5f84450045f051a5a4e4e5d806b6c9775065f57d..c151d47334e83bdc034d2c3885ceacdb155f0b25 100644 (file)
@@ -744,6 +744,8 @@ struct ShadeResult;
 #define SH_NODE_WAVELENGTH                             180
 #define SH_NODE_BLACKBODY                              181
 #define SH_NODE_VECT_TRANSFORM                 182
+#define SH_NODE_SEPHSV                                 183
+#define SH_NODE_COMBHSV                                        184
 
 /* custom defines options for Material node */
 #define SH_NODE_MAT_DIFF   1
index fbb0132965af9f18e930cbb05f3544da076b1cae..929d741282eea71ff4e663ea6e1ee875bfedc41d 100644 (file)
@@ -3427,6 +3427,8 @@ static void registerShaderNodes(void)
        register_node_type_sh_invert();
        register_node_type_sh_seprgb();
        register_node_type_sh_combrgb();
+       register_node_type_sh_sephsv();
+       register_node_type_sh_combhsv();
        register_node_type_sh_hue_sat();
 
        register_node_type_sh_attribute();
index 3241f98ad1eda396174a6dab9de8399747a0f47b..64261246e3d31c2b2cda94b9161325a4df439ac1 100644 (file)
@@ -140,6 +140,7 @@ set(SRC
        shader/nodes/node_shader_output.c
        shader/nodes/node_shader_rgb.c
        shader/nodes/node_shader_sepcombRGB.c
+       shader/nodes/node_shader_sepcombHSV.c
        shader/nodes/node_shader_squeeze.c
        shader/nodes/node_shader_texture.c
        shader/nodes/node_shader_valToRgb.c
index a8c77a9baed54ba6408a8f1b8f1d41c89729ce94..ec39d81618dd3d1f57f40e5376fd3d15005af13e 100644 (file)
@@ -70,6 +70,8 @@ void register_node_type_sh_material_ext(void);
 void register_node_type_sh_invert(void);
 void register_node_type_sh_seprgb(void);
 void register_node_type_sh_combrgb(void);
+void register_node_type_sh_sephsv(void);
+void register_node_type_sh_combhsv(void);
 void register_node_type_sh_hue_sat(void);
 void register_node_type_sh_tex_brick(void);
 
index f94e6fc9f5271b9bc380b33a2a6c0f52e067d3ee..05c1330ee85af7ee3cd2e6a1cee7b7cb171ea3c7 100644 (file)
@@ -115,6 +115,8 @@ DefNode( ShaderNode,     SH_NODE_TEX_CHECKER,        def_sh_tex_checker,     "TE
 DefNode( ShaderNode,     SH_NODE_TEX_BRICK,          def_sh_tex_brick,       "TEX_BRICK",          TexBrick,         "Brick Texture",     ""       )
 DefNode( ShaderNode,     SH_NODE_TEX_COORD,          def_sh_tex_coord,       "TEX_COORD",          TexCoord,         "Texture Coordinate",""       )
 DefNode( ShaderNode,     SH_NODE_VECT_TRANSFORM,     def_sh_vect_transform,  "VECT_TRANSFORM",     VectorTransform,  "Vector Transform",  ""       )
+DefNode( ShaderNode,     SH_NODE_SEPHSV,             0,                      "SEPHSV",             SeparateHSV,      "Separate HSV",      ""       )
+DefNode( ShaderNode,     SH_NODE_COMBHSV,            0,                      "COMBHSV",            CombineHSV,       "Combine HSV",       ""       )
 
 DefNode( CompositorNode, CMP_NODE_VIEWER,         def_cmp_viewer,         "VIEWER",         Viewer,           "Viewer",            ""              )
 DefNode( CompositorNode, CMP_NODE_RGB,            0,                      "RGB",            RGB,              "RGB",               ""              )
diff --git a/source/blender/nodes/shader/nodes/node_shader_sepcombHSV.c b/source/blender/nodes/shader/nodes/node_shader_sepcombHSV.c
new file mode 100644 (file)
index 0000000..707e295
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2013 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/shader/nodes/node_shader_sepcombHSV.c
+ *  \ingroup shdnodes
+ */
+
+
+#include "node_shader_util.h"
+
+/* **************** SEPARATE HSV ******************** */
+static bNodeSocketTemplate sh_node_sephsv_in[] = {
+       {       SOCK_RGBA, 1, N_("Color"),                      0.8f, 0.8f, 0.8f, 1.0f},
+       {       -1, 0, ""       }
+};
+static bNodeSocketTemplate sh_node_sephsv_out[] = {
+       {       SOCK_FLOAT, 0, N_("H")},
+       {       SOCK_FLOAT, 0, N_("S")},
+       {       SOCK_FLOAT, 0, N_("V")},
+       {       -1, 0, ""       }
+};
+
+void register_node_type_sh_sephsv(void)
+{
+       static bNodeType ntype;
+
+       sh_node_type_base(&ntype, SH_NODE_SEPHSV, "Separate HSV", NODE_CLASS_CONVERTOR, 0);
+       node_type_compatibility(&ntype, NODE_NEW_SHADING);
+       node_type_socket_templates(&ntype, sh_node_sephsv_in, sh_node_sephsv_out);
+
+       nodeRegisterType(&ntype);
+}
+
+
+/* **************** COMBINE HSV ******************** */
+static bNodeSocketTemplate sh_node_combhsv_in[] = {
+       {       SOCK_FLOAT, 1, N_("H"),                 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+       {       SOCK_FLOAT, 1, N_("S"),                 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+       {       SOCK_FLOAT, 1, N_("V"),                 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+       {       -1, 0, ""       }
+};
+static bNodeSocketTemplate sh_node_combhsv_out[] = {
+       {       SOCK_RGBA, 0, N_("Color")},
+       {       -1, 0, ""       }
+};
+
+void register_node_type_sh_combhsv(void)
+{
+       static bNodeType ntype;
+
+       sh_node_type_base(&ntype, SH_NODE_COMBHSV, "Combine HSV", NODE_CLASS_CONVERTOR, 0);
+       node_type_compatibility(&ntype, NODE_NEW_SHADING);
+       node_type_socket_templates(&ntype, sh_node_combhsv_in, sh_node_combhsv_out);
+
+       nodeRegisterType(&ntype);
+}