2008b18b5ed00703d7479eed3b114b1841adc0d4
[blender.git] / source / blender / blenkernel / BKE_node.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2005 Blender Foundation.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL LICENSE BLOCK *****
31  */
32
33 #ifndef BKE_NODE_H
34 #define BKE_NODE_H
35
36
37
38 struct ID;
39 struct bNodeTree;
40 struct bNode;
41 struct bNodeLink;
42 struct bNodeSocket;
43 struct bNodeStack;
44 struct uiBlock;
45 struct rctf;
46 struct ListBase;
47 struct RenderData;
48 struct Scene;
49
50 #define SOCK_IN         1
51 #define SOCK_OUT        2
52
53 /* ************** NODE TYPE DEFINITIONS ***** */
54
55 typedef struct bNodeSocketType {
56         int type, limit;
57         char *name;
58         float val1, val2, val3, val4;   /* default alloc value for inputs */
59         float min, max;                                 /* default range for inputs */
60         
61         /* after this line is used internal only */
62         struct bNodeSocket *sock;               /* used during verify_types */
63         struct bNodeSocket *internsock; /* group nodes, the internal socket counterpart */
64         int own_index;                                  /* verify group nodes */
65         
66 } bNodeSocketType;
67
68 typedef struct bNodeType {
69         void *next,*prev;
70         int type;
71         char *name;
72         float width, minwidth, maxwidth;
73         short nclass, flag;
74         
75         bNodeSocketType *inputs, *outputs;
76         
77         char storagename[64];                   /* struct name for DNA */
78         
79         void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
80         
81         /* this line is set on startup of blender */
82         int (*butfunc)(struct uiBlock *, struct bNodeTree *, struct bNode *, struct rctf *);
83
84         void (*initfunc)(struct bNode *);
85         void (*freestoragefunc)(struct bNode *);
86         void (*copystoragefunc)(struct bNode *, struct bNode *);
87         
88         /* for use with dynamic typedefs */
89         ID *id;
90         void *script; /* holds pointer to python script */
91         void *dict; /* holds pointer to python script dictionary (scope)*/
92
93 } bNodeType;
94
95 /* node->exec, now in use for composites (#define for break is same as ready yes) */
96 #define NODE_PROCESSING 1
97 #define NODE_READY              2
98 #define NODE_BREAK              2
99 #define NODE_FINISHED   4
100 #define NODE_FREEBUFS   8
101
102 /* nodetype->nclass, for add-menu and themes */
103 #define NODE_CLASS_INPUT                0
104 #define NODE_CLASS_OUTPUT               1
105 #define NODE_CLASS_OP_COLOR             3
106 #define NODE_CLASS_OP_VECTOR            4
107 #define NODE_CLASS_OP_FILTER            5
108 #define NODE_CLASS_GROUP                6
109 #define NODE_CLASS_FILE                 7
110 #define NODE_CLASS_CONVERTOR            8
111 #define NODE_CLASS_MATTE                9
112 #define NODE_CLASS_DISTORT              10
113
114 /* ************** GENERIC API, TREES *************** */
115
116 void                    ntreeVerifyTypes(struct bNodeTree *ntree);
117
118 struct bNodeTree *ntreeAddTree(int type);
119 void                    ntreeInitTypes(struct bNodeTree *ntree);
120
121 void                    ntreeMakeOwnType(struct bNodeTree *ntree);
122 void                    ntreeFreeTree(struct bNodeTree *ntree);
123 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
124 void                    ntreeMakeLocal(struct bNodeTree *ntree);
125
126 void                    ntreeSocketUseFlags(struct bNodeTree *ntree);
127
128 void                    ntreeSolveOrder(struct bNodeTree *ntree);
129
130 void                    ntreeBeginExecTree(struct bNodeTree *ntree);
131 void                    ntreeExecTree(struct bNodeTree *ntree, void *callerdata, int thread);
132 void                    ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
133 void                    ntreeEndExecTree(struct bNodeTree *ntree);
134
135 void                    ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
136 void                    ntreeClearPreview(struct bNodeTree *ntree);
137
138 void                    ntreeFreeCache(struct bNodeTree *ntree);
139
140 /* ************** GENERIC API, NODES *************** */
141
142 void                    nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
143
144 void                    nodeAddToPreview(struct bNode *, float *, int, int);
145
146 void                    nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
147 struct bNode    *nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup);
148 void                    nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
149 struct bNode    *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
150
151 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
152 void                    nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
153
154 int                     nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
155
156 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
157 int                             nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
158
159 void                    nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
160 struct bNode    *nodeGetActive(struct bNodeTree *ntree);
161 struct bNode    *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
162 void                    nodeClearActiveID(struct bNodeTree *ntree, short idtype);
163
164 void                    NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
165 void                    NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
166
167 /* ************** Groups ****************** */
168
169 struct bNode    *nodeMakeGroupFromSelected(struct bNodeTree *ntree);
170 int                             nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode);
171
172 void                    nodeVerifyGroup(struct bNodeTree *ngroup);
173 void                    nodeGroupSocketUseFlags(struct bNodeTree *ngroup);
174
175 /* ************** COMMON NODES *************** */
176
177 #define NODE_GROUP              2
178 #define NODE_GROUP_MENU         1000
179
180 extern bNodeType node_group_typeinfo;
181
182
183 /* ************** SHADER NODES *************** */
184
185 struct ShadeInput;
186 struct ShadeResult;
187
188 /* note: types are needed to restore callbacks, don't change values */
189 /* range 1 - 100 is reserved for common nodes */
190 /* using toolbox, we add node groups by assuming the values below don't exceed NODE_GROUP_MENU for now */
191
192 #define SH_NODE_OUTPUT          1
193
194 #define SH_NODE_MATERIAL        100
195 #define SH_NODE_RGB             101
196 #define SH_NODE_VALUE           102
197 #define SH_NODE_MIX_RGB         103
198 #define SH_NODE_VALTORGB        104
199 #define SH_NODE_RGBTOBW         105
200 #define SH_NODE_TEXTURE         106
201 #define SH_NODE_NORMAL          107
202 #define SH_NODE_GEOMETRY        108
203 #define SH_NODE_MAPPING         109
204 #define SH_NODE_CURVE_VEC       110
205 #define SH_NODE_CURVE_RGB       111
206 #define SH_NODE_CAMERA          114
207 #define SH_NODE_MATH            115
208 #define SH_NODE_VECT_MATH       116
209 #define SH_NODE_SQUEEZE         117
210 #define SH_NODE_MATERIAL_EXT    118
211 #define SH_NODE_INVERT          119
212 #define SH_NODE_SEPRGB          120
213 #define SH_NODE_COMBRGB         121
214 #define SH_NODE_HUE_SAT         122
215
216
217 /* custom defines options for Material node */
218 #define SH_NODE_MAT_DIFF   1
219 #define SH_NODE_MAT_SPEC   2
220 #define SH_NODE_MAT_NEG    4
221
222 /* the type definitions array */
223 extern struct ListBase node_all_shaders;
224
225 /* API */
226
227 void                    ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
228 void                    ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
229 void                    nodeShaderSynchronizeID(struct bNode *node, int copyto);
230
231                                 /* switch material render loop */
232 extern void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
233 void                    set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *));
234
235
236 /* ************** COMPOSITE NODES *************** */
237
238 /* output socket defines */
239 #define RRES_OUT_IMAGE  0
240 #define RRES_OUT_ALPHA  1
241 #define RRES_OUT_Z      2
242 #define RRES_OUT_NORMAL 3
243 #define RRES_OUT_UV     4
244 #define RRES_OUT_VEC    5
245 #define RRES_OUT_RGBA   6
246 #define RRES_OUT_DIFF   7
247 #define RRES_OUT_SPEC   8
248 #define RRES_OUT_SHADOW 9
249 #define RRES_OUT_AO     10
250 #define RRES_OUT_REFLECT 11
251 #define RRES_OUT_REFRACT 12
252 #define RRES_OUT_RADIO   13
253 #define RRES_OUT_INDEXOB 14
254
255 /* note: types are needed to restore callbacks, don't change values */
256 #define CMP_NODE_VIEWER         201
257 #define CMP_NODE_RGB            202
258 #define CMP_NODE_VALUE          203
259 #define CMP_NODE_MIX_RGB        204
260 #define CMP_NODE_VALTORGB       205
261 #define CMP_NODE_RGBTOBW        206
262 #define CMP_NODE_NORMAL         207
263 #define CMP_NODE_CURVE_VEC      208
264 #define CMP_NODE_CURVE_RGB      209
265 #define CMP_NODE_ALPHAOVER      210
266 #define CMP_NODE_BLUR           211
267 #define CMP_NODE_FILTER         212
268 #define CMP_NODE_MAP_VALUE      213
269 #define CMP_NODE_TIME           214
270 #define CMP_NODE_VECBLUR        215
271 #define CMP_NODE_SEPRGBA        216
272 #define CMP_NODE_SEPHSVA        217
273 #define CMP_NODE_SETALPHA       218
274 #define CMP_NODE_HUE_SAT        219
275 #define CMP_NODE_IMAGE          220
276 #define CMP_NODE_R_LAYERS       221
277 #define CMP_NODE_COMPOSITE      222
278 #define CMP_NODE_OUTPUT_FILE    223
279 #define CMP_NODE_TEXTURE        224
280 #define CMP_NODE_TRANSLATE      225
281 #define CMP_NODE_ZCOMBINE       226
282 #define CMP_NODE_COMBRGBA       227
283 #define CMP_NODE_DILATEERODE    228
284 #define CMP_NODE_ROTATE         229
285 #define CMP_NODE_SCALE          230
286 #define CMP_NODE_SEPYCCA        231
287 #define CMP_NODE_COMBYCCA       232
288 #define CMP_NODE_SEPYUVA        233
289 #define CMP_NODE_COMBYUVA       234
290 #define CMP_NODE_DIFF_MATTE     235
291 #define CMP_NODE_COLOR_SPILL    236
292 #define CMP_NODE_CHROMA         237
293 #define CMP_NODE_CHANNEL_MATTE  238
294 #define CMP_NODE_FLIP           239
295 #define CMP_NODE_SPLITVIEWER    240
296 #define CMP_NODE_INDEX_MASK     241
297 #define CMP_NODE_MAP_UV         242
298 #define CMP_NODE_ID_MASK        243
299 #define CMP_NODE_DEFOCUS        244
300 #define CMP_NODE_DISPLACE       245
301 #define CMP_NODE_COMBHSVA       246
302 #define CMP_NODE_MATH           247
303 #define CMP_NODE_LUMA_MATTE     248
304 #define CMP_NODE_BRIGHTCONTRAST 249
305 #define CMP_NODE_GAMMA          250
306 #define CMP_NODE_INVERT         251
307 #define CMP_NODE_NORMALIZE      252
308 #define CMP_NODE_CROP           253
309 #define CMP_NODE_DBLUR          254
310 #define CMP_NODE_BILATERALBLUR  255
311
312 #define CMP_NODE_GLARE          301
313 #define CMP_NODE_TONEMAP        302
314 #define CMP_NODE_LENSDIST       303
315
316 /* channel toggles */
317 #define CMP_CHAN_RGB            1
318 #define CMP_CHAN_A                      2
319 #define CMP_CHAN_R                      4
320 #define CMP_CHAN_G                      8
321 #define CMP_CHAN_B                      16
322
323 /* filter types */
324 #define CMP_FILT_SOFT           0
325 #define CMP_FILT_SHARP          1
326 #define CMP_FILT_LAPLACE        2
327 #define CMP_FILT_SOBEL          3
328 #define CMP_FILT_PREWITT        4
329 #define CMP_FILT_KIRSCH         5
330 #define CMP_FILT_SHADOW         6
331
332 /* scale node type, in custom1 */
333 #define CMP_SCALE_RELATIVE              0
334 #define CMP_SCALE_ABSOLUTE              1
335 #define CMP_SCALE_SCENEPERCENT  2
336
337
338 /* the type definitions array */
339 extern struct ListBase node_all_composit;
340
341 /* API */
342 struct CompBuf;
343 void ntreeCompositTagRender(struct Scene *sce);
344 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
345 void ntreeCompositTagGenerators(struct bNodeTree *ntree);
346 void ntreeCompositForceHidden(struct bNodeTree *ntree);
347
348 void free_compbuf(struct CompBuf *cbuf); /* internal...*/
349
350 void init_nodesystem(void);
351 void free_nodesystem(void);
352
353 #endif