style cleanup: follow style guide for formatting of if/for/while loops, and else...
[blender.git] / source / blender / nodes / texture / node_texture_util.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file blender/nodes/texture/node_texture_util.c
29  *  \ingroup nodes
30  */
31
32  
33 /*
34         HOW TEXTURE NODES WORK
35
36         In contrast to Shader nodes, which place a color into the output
37         stack when executed, Texture nodes place a TexDelegate* there. To
38         obtain a color value from this, a node further up the chain reads
39         the TexDelegate* from its input stack, and uses tex_call_delegate to
40         retrieve the color from the delegate.
41  
42         comments: (ton)
43
44         This system needs recode, a node system should rely on the stack, and 
45         callbacks for nodes only should evaluate own node, not recursively go
46         over other previous ones.
47 */
48
49 #include <assert.h>
50 #include "node_texture_util.h"
51
52 #define PREV_RES 128 /* default preview resolution */
53
54 static void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
55 {
56         if (dg->node->need_exec) {
57                 dg->fn(out, params, dg->node, dg->in, thread);
58
59                 if (dg->cdata->do_preview)
60                         tex_do_preview(dg->node, params->previewco, out);
61         }
62 }
63
64 static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread)
65 {
66         TexDelegate *dg = in->data;
67         if (dg) {
68                 tex_call_delegate(dg, in->vec, params, thread);
69         
70                 if (in->hasoutput && in->sockettype == SOCK_FLOAT)
71                         in->vec[1] = in->vec[2] = in->vec[0];
72         }
73         memcpy(out, in->vec, sz * sizeof(float));
74 }
75
76 void tex_input_vec(float *out, bNodeStack *in, TexParams *params, short thread)
77 {
78         tex_input(out, 3, in, params, thread);
79 }
80
81 void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread)
82 {
83         tex_input(out, 4, in, params, thread);
84         
85         if (in->hasoutput && in->sockettype == SOCK_FLOAT) {
86                 out[1] = out[2] = out[0];
87                 out[3] = 1;
88         }
89         
90         if (in->hasoutput && in->sockettype == SOCK_VECTOR) {
91                 out[0] = out[0] * .5f + .5f;
92                 out[1] = out[1] * .5f + .5f;
93                 out[2] = out[2] * .5f + .5f;
94                 out[3] = 1;
95         }
96 }
97
98 float tex_input_value(bNodeStack *in, TexParams *params, short thread)
99 {
100         float out[4];
101         tex_input_vec(out, in, params, thread);
102         return out[0];
103 }
104
105 void params_from_cdata(TexParams *out, TexCallData *in)
106 {
107         out->co = in->co;
108         out->dxt = in->dxt;
109         out->dyt = in->dyt;
110         out->previewco = in->co;
111         out->osatex = in->osatex;
112         out->cfra = in->cfra;
113         out->shi = in->shi;
114         out->mtex = in->mtex;
115 }
116
117 void tex_do_preview(bNode *node, float *co, float *col)
118 {
119         bNodePreview *preview= node->preview;
120
121         if (preview) {
122                 int xs= ((co[0] + 1.0f)*0.5f)*preview->xsize;
123                 int ys= ((co[1] + 1.0f)*0.5f)*preview->ysize;
124
125                 nodeAddToPreview(node, col, xs, ys, 0); /* 0 = no color management */
126         }
127 }
128
129 void tex_output(bNode *node, bNodeStack **in, bNodeStack *out, TexFn texfn, TexCallData *cdata)
130 {
131         TexDelegate *dg;
132         if (!out->data)
133                 /* Freed in tex_end_exec (node.c) */
134                 dg = out->data = MEM_mallocN(sizeof(TexDelegate), "tex delegate");
135         else
136                 dg = out->data;
137         
138         dg->cdata= cdata;
139         dg->fn = texfn;
140         dg->node = node;
141         memcpy(dg->in, in, MAX_SOCKET * sizeof(bNodeStack*));
142         dg->type = out->sockettype;
143 }
144
145 void ntreeTexCheckCyclics(struct bNodeTree *ntree)
146 {
147         bNode *node;
148         for (node= ntree->nodes.first; node; node= node->next) {
149                 
150                 if (node->type == TEX_NODE_TEXTURE && node->id) {
151                         /* custom2 stops the node from rendering */
152                         if (node->custom1) {
153                                 node->custom2 = 1;
154                                 node->custom1 = 0;
155                         }
156                         else {
157                                 Tex *tex = (Tex *)node->id;
158                                 
159                                 node->custom2 = 0;
160                         
161                                 node->custom1 = 1;
162                                 if (tex->use_nodes && tex->nodetree) {
163                                         ntreeTexCheckCyclics(tex->nodetree);
164                                 }
165                                 node->custom1 = 0;
166                         }
167                 }
168
169         }
170 }