Merged the particles-2010 branch with node improvements into trunk.
[blender-staging.git] / source / blender / nodes / shader / nodes / node_shader_normal.c
similarity index 67%
rename from source/blender/nodes/intern/SHD_nodes/SHD_normal.c
rename to source/blender/nodes/shader/nodes/node_shader_normal.c
index a4e39935ceab85f53ef353077356b1052ea9c72f..099a9bed10def2cd99845c4c2c68bcc9b346b593 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: SHD_normal.c 36593 2011-05-10 11:19:26Z lukastoenne $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/nodes/intern/SHD_nodes/SHD_normal.c
+/** \file blender/nodes/shader/nodes/node_shader_normal.c
  *  \ingroup shdnodes
  */
 
 
-#include "../SHD_util.h"
+#include "node_shader_util.h"
 
 /* **************** NORMAL  ******************** */
-static bNodeSocketType sh_node_normal_in[]= {
-       {       SOCK_VECTOR, 1, "Normal",       0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_normal_in[]= {
+       {       SOCK_VECTOR, 1, "Normal",       0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
        {       -1, 0, ""       }
 };
 
-static bNodeSocketType sh_node_normal_out[]= {
-       {       SOCK_VECTOR, 0, "Normal",       0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
-       {       SOCK_VALUE, 0, "Dot",           1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_normal_out[]= {
+       {       SOCK_VECTOR, 0, "Normal"},
+       {       SOCK_FLOAT, 0, "Dot"},
        {       -1, 0, ""       }
 };
 
+static void node_shader_init_normal(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+       bNodeSocket *sock= node->outputs.first;
+       bNodeSocketValueVector *dval= (bNodeSocketValueVector*)sock->default_value;
+       
+       /* output value is used for normal vector */
+       dval->value[0] = 0.0f;
+       dval->value[1] = 0.0f;
+       dval->value[2] = 1.0f;
+}
+
 /* generates normal, does dot product */
 static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
 {
@@ -57,7 +68,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack
        
        nodestack_get_vec(vec, SOCK_VECTOR, in[0]);
        
-       VECCOPY(out[0]->vec, sock->ns.vec);
+       VECCOPY(out[0]->vec, ((bNodeSocketValueVector*)sock->default_value)->value);
        /* render normals point inside... the widget points outside */
        out[1]->vec[0]= -INPR(out[0]->vec, vec);
 }
@@ -65,7 +76,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack
 static int gpu_shader_normal(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
 {
        bNodeSocket *sock= node->outputs.first;
-       GPUNodeLink *vec = GPU_uniform(sock->ns.vec);
+       GPUNodeLink *vec = GPU_uniform(((bNodeSocketValueVector*)sock->default_value)->value);
 
        return GPU_stack_link(mat, "normal", in, out, vec);
 }
@@ -74,8 +85,9 @@ void register_node_type_sh_normal(ListBase *lb)
 {
        static bNodeType ntype;
        
-       node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
-                                  sh_node_normal_in, sh_node_normal_out);
+       node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+       node_type_socket_templates(&ntype, sh_node_normal_in, sh_node_normal_out);
+       node_type_init(&ntype, node_shader_init_normal);
        node_type_exec(&ntype, node_shader_exec_normal);
        node_type_gpu(&ntype, gpu_shader_normal);