Cycles Gamma Node
authorDalai Felinto <dfelinto@gmail.com>
Fri, 16 Dec 2011 20:35:06 +0000 (20:35 +0000)
committerDalai Felinto <dfelinto@gmail.com>
Fri, 16 Dec 2011 20:35:06 +0000 (20:35 +0000)
Node specially useful for Texture correction.

This is also a nice example of a simple node made from scratch in case someone wants to create their custom nodes.
Review by Brecht.

16 files changed:
intern/cycles/app/cycles_xml.cpp
intern/cycles/blender/blender_shader.cpp
intern/cycles/kernel/CMakeLists.txt
intern/cycles/kernel/osl/nodes/CMakeLists.txt
intern/cycles/kernel/osl/nodes/node_gamma.osl [new file with mode: 0644]
intern/cycles/kernel/svm/svm.h
intern/cycles/kernel/svm/svm_gamma.h [new file with mode: 0644]
intern/cycles/kernel/svm/svm_types.h
intern/cycles/render/nodes.cpp
intern/cycles/render/nodes.h
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/node.c
source/blender/makesrna/intern/rna_nodetree_types.h
source/blender/nodes/CMakeLists.txt
source/blender/nodes/NOD_shader.h
source/blender/nodes/shader/nodes/node_shader_gamma.c [new file with mode: 0644]

index a028298817929e11820832fa6a293285b4f42116..f5cc01cd0626528419e8dfaf73263adc3d1091e4 100644 (file)
@@ -446,6 +446,9 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
                        xml_read_enum(&mix->type, MixNode::type_enum, node, "type");
                        snode = mix;
                }
+               else if(string_iequals(node.name(), "gamma")) {
+                       snode = new GammaNode();
+               }
                else if(string_iequals(node.name(), "combine_rgb")) {
                        snode = new CombineRGBNode();
                }
index 4191fef4dcd3a4e55559e4aab77487bc626334ba..ecc85a92ae03a5e10de0cc75c81eeaf2dfcc1801 100644 (file)
@@ -160,6 +160,10 @@ static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *
                        node = new InvertNode();
                        break;
                }
+               case BL::ShaderNode::type_GAMMA: {
+                       node = new GammaNode();
+                       break;
+               }
                case BL::ShaderNode::type_MIX_RGB: {
                        BL::ShaderNodeMixRGB b_mix_node(b_node);
                        MixNode *mix = new MixNode();
index 65338eeea6e93b3fabc9afef0db92ac1587d82fc..e17544bf7afbcd1b2b2adc80df9aa09de0fcb573 100644 (file)
@@ -59,6 +59,7 @@ set(SRC_SVM_HEADERS
        svm/svm_convert.h
        svm/svm_displace.h
        svm/svm_fresnel.h
+       svm/svm_gamma.h
        svm/svm_geometry.h
        svm/svm_gradient.h
        svm/svm_hsv.h
index 5c1fd8b75d83e7043bfba92be55d75c49bf6e95f..1a207d6c139ed2446ebff9b6de5595f04e735127 100644 (file)
@@ -19,6 +19,7 @@ set(SRC_OSL
        node_emission.osl
        node_environment_texture.osl
        node_fresnel.osl
+       node_gamma.osl
        node_geometry.osl
        node_glass_bsdf.osl
        node_glossy_bsdf.osl
diff --git a/intern/cycles/kernel/osl/nodes/node_gamma.osl b/intern/cycles/kernel/osl/nodes/node_gamma.osl
new file mode 100644 (file)
index 0000000..4dae07d
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2011, 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_gamma(
+       color ColorIn = color(0.8, 0.8, 0.8),
+       float Gamma = 1.0,
+       output ColorOut = color(0.8, 0.8, 0.8)
+{
+       int i;
+       for (i=0;i<3;i++) {
+               if (ColorIn[i] > 0.0)
+                       ColorIn[i] = powf(ColorIn[i], Gamma);
+       }
+
+       ColorOut = ColorIn;
+}
index 2beff7ff7e694e501c8ea3d6b8e9254c8a896c00..5a8d6d62c7947e89d91f04835de5367fa9077075 100644 (file)
@@ -130,6 +130,7 @@ CCL_NAMESPACE_END
 #include "svm_geometry.h"
 #include "svm_hsv.h"
 #include "svm_image.h"
+#include "svm_gamma.h"
 #include "svm_invert.h"
 #include "svm_light_path.h"
 #include "svm_magic.h"
@@ -262,6 +263,9 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT
                        case NODE_INVERT:
                                svm_node_invert(sd, stack, node.y, node.z, node.w);
                                break;
+                       case NODE_GAMMA:
+                               svm_node_gamma(sd, stack, node.y, node.z, node.w);
+                               break;
                        case NODE_MIX:
                                svm_node_mix(kg, sd, stack, node.y, node.z, node.w, &offset);
                                break;
diff --git a/intern/cycles/kernel/svm/svm_gamma.h b/intern/cycles/kernel/svm/svm_gamma.h
new file mode 100644 (file)
index 0000000..4a89670
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011, 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_gamma(ShaderData *sd, float *stack, uint in_gamma, uint in_color, uint out_color)
+{
+       float3 color = stack_load_float3(stack, in_color);
+       float gamma = stack_load_float(stack, in_gamma);
+
+       if (color.x > 0.0)
+               color.x = powf(color.x, gamma);
+       if (color.y > 0.0)
+               color.y = powf(color.y, gamma);
+       if (color.z > 0.0)
+               color.z = powf(color.z, gamma);
+
+       if (stack_valid(out_color))
+               stack_store_float3(stack, out_color, color);
+}
+
+CCL_NAMESPACE_END
index e5e3175761ba87221a60b4757541068c6125c812..c46df3f08c8bf7fe77b892d91b4f6886544203c0 100644 (file)
@@ -85,7 +85,8 @@ typedef enum NodeType {
        NODE_HSV = 5200,
        NODE_CAMERA = 5300,
        NODE_INVERT = 5400,
-       NODE_NORMAL = 5500
+       NODE_NORMAL = 5500,
+       NODE_GAMMA = 5600
 } NodeType;
 
 typedef enum NodeAttributeType {
index aec6f1f3e2683c0ceb5a1bb400a0d5de19cdcb11..5cabb2487095400dc3dc0c7688939b08703de432 100644 (file)
@@ -1726,6 +1726,33 @@ void CombineRGBNode::compile(OSLCompiler& compiler)
        compiler.add(this, "node_combine_rgb");
 }
 
+/* Gamma */
+GammaNode::GammaNode()
+: ShaderNode("gamma")
+{
+       add_input("Color", SHADER_SOCKET_COLOR);
+       add_input("Gamma", SHADER_SOCKET_FLOAT);
+       add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void GammaNode::compile(SVMCompiler& compiler)
+{
+       ShaderInput *color_in = input("Color");
+       ShaderInput *gamma_in = input("Gamma");
+       ShaderOutput *color_out = output("Color");
+
+       compiler.stack_assign(color_in);
+       compiler.stack_assign(gamma_in);
+       compiler.stack_assign(color_out);
+
+       compiler.add_node(NODE_GAMMA, gamma_in->stack_offset, color_in->stack_offset, color_out->stack_offset);
+}
+
+void GammaNode::compile(OSLCompiler& compiler)
+{
+       compiler.add(this, "node_gamma");
+}
+
 /* Separate RGB */
 SeparateRGBNode::SeparateRGBNode()
 : ShaderNode("separate_rgb")
index 9d947de1af5b9ee409a1af47b165806ad9fde776..28fff22fc342e2dc7c8ccf17bb494192d54fa8aa 100644 (file)
@@ -302,6 +302,11 @@ public:
        SHADER_NODE_CLASS(CombineRGBNode)
 };
 
+class GammaNode : public ShaderNode {
+public:
+       SHADER_NODE_CLASS(GammaNode)
+};
+
 class SeparateRGBNode : public ShaderNode {
 public:
        SHADER_NODE_CLASS(SeparateRGBNode)
index 5dbf22b54bf8fe453d35a873a5573670e709a513..378e587279171de76f6b4f98e2062ad3c4692798 100644 (file)
@@ -521,6 +521,7 @@ struct ShadeResult;
 #define SH_NODE_LAYER_WEIGHT                   160
 #define SH_NODE_VOLUME_TRANSPARENT             161
 #define SH_NODE_VOLUME_ISOTROPIC               162
+#define SH_NODE_GAMMA                          163
 
 /* custom defines options for Material node */
 #define SH_NODE_MAT_DIFF   1
index 7be6ef9968dde664847f19dd6501459a5f7f242a..cc49e8465b9e6c796efe5d7e5c8a868c993d63c1 100644 (file)
@@ -1899,6 +1899,7 @@ static void registerShaderNodes(bNodeTreeType *ttype)
        register_node_type_sh_output(ttype);
        register_node_type_sh_material(ttype);
        register_node_type_sh_camera(ttype);
+       register_node_type_sh_gamma(ttype);
        register_node_type_sh_value(ttype);
        register_node_type_sh_rgb(ttype);
        register_node_type_sh_mix_rgb(ttype);
index d8fabad824ec96d6043c56b2609b491b181712a8..19082ea46898855e7db133af03e5ef56477a2595 100644 (file)
@@ -40,6 +40,7 @@ DefNode( ShaderNode,     SH_NODE_VALTORGB,        def_colorramp,          "VALTO
 DefNode( ShaderNode,     SH_NODE_RGBTOBW,         0,                      "RGBTOBW",        RGBToBW,          "RGB to BW",         ""              )
 DefNode( ShaderNode,     SH_NODE_TEXTURE,         def_texture,            "TEXTURE",        Texture,          "Texture",           ""              )
 DefNode( ShaderNode,     SH_NODE_NORMAL,          0,                      "NORMAL",         Normal,           "Normal",            ""              )
+DefNode( ShaderNode,     SH_NODE_GAMMA,           0,                      "GAMMA",          Gamma,            "Gamma",             ""              )
 DefNode( ShaderNode,     SH_NODE_GEOMETRY,        def_sh_geometry,        "GEOMETRY",       Geometry,         "Geometry",          ""              )
 DefNode( ShaderNode,     SH_NODE_MAPPING,         def_sh_mapping,         "MAPPING",        Mapping,          "Mapping",           ""              )
 DefNode( ShaderNode,     SH_NODE_CURVE_VEC,       def_vector_curve,       "CURVE_VEC",      VectorCurve,      "Vector Curve",      ""              )
index 1b327edbc9f3d88bdc3bc862dd7a801fb5ca1303..a09aa7a52a322930a5e86fba8db2d92f6e1001e5 100644 (file)
@@ -113,6 +113,7 @@ set(SRC
        shader/nodes/node_shader_common.c
        shader/nodes/node_shader_curves.c
        shader/nodes/node_shader_dynamic.c
+       shader/nodes/node_shader_gamma.c
        shader/nodes/node_shader_geom.c
        shader/nodes/node_shader_hueSatVal.c
        shader/nodes/node_shader_invert.c
index ae2555177331e29063c56fab0dc5e88930ae66da..2cabdd3397149b03dfe127dbfa4b3b3f145a4c2f 100644 (file)
@@ -54,6 +54,7 @@ void register_node_type_sh_valtorgb(struct bNodeTreeType *ttype);
 void register_node_type_sh_rgbtobw(struct bNodeTreeType *ttype);
 void register_node_type_sh_texture(struct bNodeTreeType *ttype);
 void register_node_type_sh_normal(struct bNodeTreeType *ttype);
+void register_node_type_sh_gamma(struct bNodeTreeType *ttype);
 void register_node_type_sh_geom(struct bNodeTreeType *ttype);
 void register_node_type_sh_mapping(struct bNodeTreeType *ttype);
 void register_node_type_sh_curve_vec(struct bNodeTreeType *ttype);
diff --git a/source/blender/nodes/shader/nodes/node_shader_gamma.c b/source/blender/nodes/shader/nodes/node_shader_gamma.c
new file mode 100644 (file)
index 0000000..1d525d7
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * ***** 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) 2006 Blender Foundation.
+ * All rights reserved.
+ * 
+ * The Original Code is: all of this file.
+ * 
+ * Contributor(s): none yet.
+ * 
+ * ***** END GPL LICENSE BLOCK *****
+
+*/
+
+/** \file blender/nodes/composite/nodes/node_composite_gamma.c
+ *  \ingroup cmpnodes
+ */
+
+
+#include "node_shader_util.h"
+
+/* **************** Gamma Tools  ******************** */
+  
+static bNodeSocketTemplate sh_node_gamma_in[]= {
+       {       SOCK_RGBA, 1, "Color",                  1.0f, 1.0f, 1.0f, 1.0f},
+       {       SOCK_FLOAT, 1, "Gamma",                 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED},
+       {       -1, 0, ""       }
+};
+
+static bNodeSocketTemplate sh_node_gamma_out[]= {
+       {       SOCK_RGBA, 0, "Color"},
+       {       -1, 0, ""       }
+};
+
+void register_node_type_sh_gamma(bNodeTreeType *ttype)
+{
+       static bNodeType ntype;
+       
+       node_type_base(ttype, &ntype, SH_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+       node_type_compatibility(&ntype, NODE_NEW_SHADING);
+       node_type_socket_templates(&ntype, sh_node_gamma_in, sh_node_gamma_out);
+       node_type_size(&ntype, 140, 100, 320);
+       node_type_init(&ntype, NULL);
+       node_type_storage(&ntype, "", NULL, NULL);
+       node_type_exec(&ntype, NULL);
+       node_type_gpu(&ntype, NULL);
+       
+       nodeRegisterType(ttype, &ntype);
+}