2.50: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r19323...
[blender.git] / source / blender / nodes / intern / TEX_nodes / TEX_valToNor.c
1 /**
2  *
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. 
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  *
19  * The Original Code is Copyright (C) 2005 Blender Foundation.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): Jucas.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include "../TEX_util.h"
30
31 static bNodeSocketType inputs[]= { 
32         { SOCK_VALUE, 1, "Val",   0.0f,   0.0f, 0.0f, 1.0f,  0.0f,   1.0f },
33         { SOCK_VALUE, 1, "Nabla", 0.025f, 0.0f, 0.0f, 0.0f,  0.001f, 0.1f },
34         { -1, 0, "" } 
35 };
36
37 static bNodeSocketType outputs[]= { 
38         { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, 
39         { -1, 0, "" } 
40 };
41
42 static void normalfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
43 {
44         float new_coord[3];
45
46         float nabla = tex_input_value(in[1], coord, thread);    
47         float val;
48         float nor[3];
49
50         val = tex_input_value(in[0], coord, thread);
51
52         new_coord[0] = coord[0] + nabla;
53         new_coord[1] = coord[1];
54         new_coord[2] = coord[2];
55         nor[0] = tex_input_value(in[0], new_coord, thread);
56
57         new_coord[0] = coord[0];
58         new_coord[1] = coord[1] + nabla;
59         nor[1] = tex_input_value(in[0], new_coord, thread);
60         
61         new_coord[1] = coord[1];
62         new_coord[2] = coord[2] + nabla;
63         nor[2] = tex_input_value(in[0], new_coord, thread);
64
65         out[0] = val-nor[0];
66         out[1] = val-nor[1];
67         out[2] = val-nor[2];
68 }
69 static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) 
70 {
71         tex_output(node, in, out[0], &normalfn);
72         
73         tex_do_preview(node, out[0], data);
74 }
75
76 bNodeType tex_node_valtonor = {
77         /* *next,*prev     */ NULL, NULL,
78         /* type code       */ TEX_NODE_VALTONOR, 
79         /* name            */ "Value to Normal", 
80         /* width+range     */ 90, 80, 100, 
81         /* class+opts      */ NODE_CLASS_CONVERTOR, NODE_OPTIONS, 
82         /* input sock      */ inputs, 
83         /* output sock     */ outputs, 
84         /* storage         */ "", 
85         /* execfunc        */ exec,
86         /* butfunc         */ NULL,
87         /* initfunc        */ NULL,
88         /* freestoragefunc */ NULL,
89         /* copystoragefunc */ NULL,
90         /* id              */ NULL
91 };
92