svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r20855:20928
[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 /* not very important, but the stack solver likes to know a maximum */
37 #define MAX_SOCKET      64
38
39 struct ID;
40 struct bNodeTree;
41 struct bNode;
42 struct bNodeLink;
43 struct bNodeSocket;
44 struct bNodeStack;
45 struct uiBlock;
46 struct rctf;
47 struct ListBase;
48 struct RenderData;
49 struct Scene;
50 struct Tex;
51 struct GPUMaterial;
52 struct GPUNode;
53 struct GPUNodeStack;
54
55 /* ************** NODE TYPE DEFINITIONS ***** */
56
57 typedef struct bNodeSocketType {
58         int type, limit;
59         char *name;
60         float val1, val2, val3, val4;   /* default alloc value for inputs */
61         float min, max;                                 /* default range for inputs */
62         
63         /* after this line is used internal only */
64         struct bNodeSocket *sock;               /* used during verify_types */
65         struct bNodeSocket *internsock; /* group nodes, the internal socket counterpart */
66         int own_index;                                  /* verify group nodes */
67         
68 } bNodeSocketType;
69
70 typedef struct bNodeType {
71         void *next,*prev;
72         int type;
73         char *name;
74         float width, minwidth, maxwidth;
75         short nclass, flag;
76         
77         bNodeSocketType *inputs, *outputs;
78         
79         char storagename[64];                   /* struct name for DNA */
80         
81         void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
82         
83         /* this line is set on startup of blender */
84         int (*butfunc)(struct uiBlock *, struct bNodeTree *, struct bNode *, struct rctf *);
85
86         void (*initfunc)(struct bNode *);
87         void (*freestoragefunc)(struct bNode *);
88         void (*copystoragefunc)(struct bNode *, struct bNode *);
89         
90         /* for use with dynamic typedefs */
91         ID *id;
92         void *pynode; /* holds pointer to python script */
93         void *pydict; /* holds pointer to python script dictionary (scope)*/
94
95         /* gpu */
96         int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
97
98 } bNodeType;
99
100 /* node->exec, now in use for composites (#define for break is same as ready yes) */
101 #define NODE_PROCESSING 1
102 #define NODE_READY              2
103 #define NODE_BREAK              2
104 #define NODE_FINISHED   4
105 #define NODE_FREEBUFS   8
106 #define NODE_SKIPPED    16
107
108 /* nodetype->nclass, for add-menu and themes */
109 #define NODE_CLASS_INPUT                0
110 #define NODE_CLASS_OUTPUT               1
111 #define NODE_CLASS_OP_COLOR             3
112 #define NODE_CLASS_OP_VECTOR    4
113 #define NODE_CLASS_OP_FILTER    5
114 #define NODE_CLASS_GROUP                6
115 #define NODE_CLASS_FILE                 7
116 #define NODE_CLASS_CONVERTOR    8
117 #define NODE_CLASS_MATTE                9
118 #define NODE_CLASS_DISTORT              10
119 #define NODE_CLASS_OP_DYNAMIC   11
120 #define NODE_CLASS_PATTERN 12
121 #define NODE_CLASS_TEXTURE 13
122
123 /* ************** GENERIC API, TREES *************** */
124
125 void                    ntreeVerifyTypes(struct bNodeTree *ntree);
126
127 struct bNodeTree *ntreeAddTree(int type);
128 void                    ntreeInitTypes(struct bNodeTree *ntree);
129
130 void                    ntreeMakeOwnType(struct bNodeTree *ntree);
131 void                    ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
132 void                    ntreeFreeTree(struct bNodeTree *ntree);
133 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
134 void                    ntreeMakeLocal(struct bNodeTree *ntree);
135
136 void                    ntreeSocketUseFlags(struct bNodeTree *ntree);
137
138 void                    ntreeSolveOrder(struct bNodeTree *ntree);
139
140 void                    ntreeBeginExecTree(struct bNodeTree *ntree);
141 void                    ntreeExecTree(struct bNodeTree *ntree, void *callerdata, int thread);
142 void                    ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
143 void                    ntreeEndExecTree(struct bNodeTree *ntree);
144
145 void                    ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
146 void                    ntreeClearPreview(struct bNodeTree *ntree);
147
148 void                    ntreeFreeCache(struct bNodeTree *ntree);
149                                 
150                                 /* calls allowing threaded composite */
151 struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
152 void                    ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
153 void                    ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
154
155 /* ************** GENERIC API, NODES *************** */
156
157 void                    nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
158
159 void                    nodeAddToPreview(struct bNode *, float *, int, int);
160
161 void                    nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
162 void                    nodeAddSockets(struct bNode *node, struct bNodeType *ntype);
163 struct bNode    *nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup, struct ID *id);
164 void                    nodeRegisterType(struct ListBase *typelist, const struct bNodeType *ntype) ;
165 void                    nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeType *ntype);
166 void                    nodeMakeDynamicType(struct bNode *node);
167 int                             nodeDynamicUnlinkText(struct ID *txtid);
168 void                    nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
169 struct bNode    *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal);
170
171 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
172 void                    nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
173
174 int                     nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
175
176 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
177 int                             nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
178
179 void                    nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
180 struct bNode    *nodeGetActive(struct bNodeTree *ntree);
181 struct bNode    *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
182 void                    nodeClearActiveID(struct bNodeTree *ntree, short idtype);
183
184 void                    NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
185 void                    NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
186
187 /* ************** Groups ****************** */
188
189 struct bNode    *nodeMakeGroupFromSelected(struct bNodeTree *ntree);
190 int                             nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode);
191
192 void                    nodeVerifyGroup(struct bNodeTree *ngroup);
193 void                    nodeGroupSocketUseFlags(struct bNodeTree *ngroup);
194
195 void                    nodeCopyGroup(struct bNode *gnode);
196
197 /* ************** COMMON NODES *************** */
198
199 #define NODE_GROUP              2
200 #define NODE_GROUP_MENU         1000
201 #define NODE_DYNAMIC_MENU       4000
202
203 extern bNodeType node_group_typeinfo;
204
205
206 /* ************** SHADER NODES *************** */
207
208 struct ShadeInput;
209 struct ShadeResult;
210
211 /* note: types are needed to restore callbacks, don't change values */
212 /* range 1 - 100 is reserved for common nodes */
213 /* using toolbox, we add node groups by assuming the values below don't exceed NODE_GROUP_MENU for now */
214
215 #define SH_NODE_OUTPUT          1
216
217 #define SH_NODE_MATERIAL        100
218 #define SH_NODE_RGB                     101
219 #define SH_NODE_VALUE           102
220 #define SH_NODE_MIX_RGB         103
221 #define SH_NODE_VALTORGB        104
222 #define SH_NODE_RGBTOBW         105
223 #define SH_NODE_TEXTURE         106
224 #define SH_NODE_NORMAL          107
225 #define SH_NODE_GEOMETRY        108
226 #define SH_NODE_MAPPING         109
227 #define SH_NODE_CURVE_VEC       110
228 #define SH_NODE_CURVE_RGB       111
229 #define SH_NODE_CAMERA          114
230 #define SH_NODE_MATH            115
231 #define SH_NODE_VECT_MATH       116
232 #define SH_NODE_SQUEEZE         117
233 #define SH_NODE_MATERIAL_EXT    118
234 #define SH_NODE_INVERT          119
235 #define SH_NODE_SEPRGB          120
236 #define SH_NODE_COMBRGB         121
237 #define SH_NODE_HUE_SAT         122
238 #define NODE_DYNAMIC            123
239
240 /* custom defines options for Material node */
241 #define SH_NODE_MAT_DIFF   1
242 #define SH_NODE_MAT_SPEC   2
243 #define SH_NODE_MAT_NEG    4
244 /* custom defines: states for Script node. These are bit indices */
245 #define NODE_DYNAMIC_READY      0 /* 1 */
246 #define NODE_DYNAMIC_LOADED     1 /* 2 */
247 #define NODE_DYNAMIC_NEW        2 /* 4 */
248 #define NODE_DYNAMIC_UPDATED    3 /* 8 */
249 #define NODE_DYNAMIC_ADDEXIST   4 /* 16 */
250 #define NODE_DYNAMIC_ERROR      5 /* 32 */
251 #define NODE_DYNAMIC_REPARSE    6 /* 64 */
252 #define NODE_DYNAMIC_SET        15 /* sign */
253
254 /* the type definitions array */
255 extern struct ListBase node_all_shaders;
256
257 /* API */
258
259 void                    ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
260 void                    ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
261 void                    nodeShaderSynchronizeID(struct bNode *node, int copyto);
262
263                                 /* switch material render loop */
264 extern void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
265 void                    set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *));
266
267 void                    ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
268
269
270 /* ************** COMPOSITE NODES *************** */
271
272 /* output socket defines */
273 #define RRES_OUT_IMAGE          0
274 #define RRES_OUT_ALPHA          1
275 #define RRES_OUT_Z                      2
276 #define RRES_OUT_NORMAL         3
277 #define RRES_OUT_UV                     4
278 #define RRES_OUT_VEC            5
279 #define RRES_OUT_RGBA           6
280 #define RRES_OUT_DIFF           7
281 #define RRES_OUT_SPEC           8
282 #define RRES_OUT_SHADOW         9
283 #define RRES_OUT_AO                     10
284 #define RRES_OUT_REFLECT        11
285 #define RRES_OUT_REFRACT        12
286 #define RRES_OUT_RADIO          13
287 #define RRES_OUT_INDEXOB        14
288 #define RRES_OUT_MIST           15
289
290 /* note: types are needed to restore callbacks, don't change values */
291 #define CMP_NODE_VIEWER         201
292 #define CMP_NODE_RGB            202
293 #define CMP_NODE_VALUE          203
294 #define CMP_NODE_MIX_RGB        204
295 #define CMP_NODE_VALTORGB       205
296 #define CMP_NODE_RGBTOBW        206
297 #define CMP_NODE_NORMAL         207
298 #define CMP_NODE_CURVE_VEC      208
299 #define CMP_NODE_CURVE_RGB      209
300 #define CMP_NODE_ALPHAOVER      210
301 #define CMP_NODE_BLUR           211
302 #define CMP_NODE_FILTER         212
303 #define CMP_NODE_MAP_VALUE      213
304 #define CMP_NODE_TIME           214
305 #define CMP_NODE_VECBLUR        215
306 #define CMP_NODE_SEPRGBA        216
307 #define CMP_NODE_SEPHSVA        217
308 #define CMP_NODE_SETALPHA       218
309 #define CMP_NODE_HUE_SAT        219
310 #define CMP_NODE_IMAGE          220
311 #define CMP_NODE_R_LAYERS       221
312 #define CMP_NODE_COMPOSITE      222
313 #define CMP_NODE_OUTPUT_FILE    223
314 #define CMP_NODE_TEXTURE        224
315 #define CMP_NODE_TRANSLATE      225
316 #define CMP_NODE_ZCOMBINE       226
317 #define CMP_NODE_COMBRGBA       227
318 #define CMP_NODE_DILATEERODE    228
319 #define CMP_NODE_ROTATE         229
320 #define CMP_NODE_SCALE          230
321 #define CMP_NODE_SEPYCCA        231
322 #define CMP_NODE_COMBYCCA       232
323 #define CMP_NODE_SEPYUVA        233
324 #define CMP_NODE_COMBYUVA       234
325 #define CMP_NODE_DIFF_MATTE     235
326 #define CMP_NODE_COLOR_SPILL    236
327 #define CMP_NODE_CHROMA         237
328 #define CMP_NODE_CHANNEL_MATTE  238
329 #define CMP_NODE_FLIP           239
330 #define CMP_NODE_SPLITVIEWER    240
331 #define CMP_NODE_INDEX_MASK     241
332 #define CMP_NODE_MAP_UV         242
333 #define CMP_NODE_ID_MASK        243
334 #define CMP_NODE_DEFOCUS        244
335 #define CMP_NODE_DISPLACE       245
336 #define CMP_NODE_COMBHSVA       246
337 #define CMP_NODE_MATH           247
338 #define CMP_NODE_LUMA_MATTE     248
339 #define CMP_NODE_BRIGHTCONTRAST 249
340 #define CMP_NODE_GAMMA          250
341 #define CMP_NODE_INVERT         251
342 #define CMP_NODE_NORMALIZE      252
343 #define CMP_NODE_CROP           253
344 #define CMP_NODE_DBLUR          254
345 #define CMP_NODE_BILATERALBLUR  255
346 #define CMP_NODE_PREMULKEY  256
347
348 #define CMP_NODE_GLARE          301
349 #define CMP_NODE_TONEMAP        302
350 #define CMP_NODE_LENSDIST       303
351
352 /* channel toggles */
353 #define CMP_CHAN_RGB            1
354 #define CMP_CHAN_A                      2
355 #define CMP_CHAN_R                      4
356 #define CMP_CHAN_G                      8
357 #define CMP_CHAN_B                      16
358
359 /* filter types */
360 #define CMP_FILT_SOFT           0
361 #define CMP_FILT_SHARP          1
362 #define CMP_FILT_LAPLACE        2
363 #define CMP_FILT_SOBEL          3
364 #define CMP_FILT_PREWITT        4
365 #define CMP_FILT_KIRSCH         5
366 #define CMP_FILT_SHADOW         6
367
368 /* scale node type, in custom1 */
369 #define CMP_SCALE_RELATIVE              0
370 #define CMP_SCALE_ABSOLUTE              1
371 #define CMP_SCALE_SCENEPERCENT  2
372
373
374 /* the type definitions array */
375 extern struct ListBase node_all_composit;
376
377 /* API */
378 struct CompBuf;
379 void ntreeCompositTagRender(struct Scene *sce);
380 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
381 void ntreeCompositTagGenerators(struct bNodeTree *ntree);
382 void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
383
384 void free_compbuf(struct CompBuf *cbuf); /* internal...*/
385
386
387 /* ************** TEXTURE NODES *************** */
388
389 struct TexResult;
390
391 #define TEX_NODE_OUTPUT     401
392 #define TEX_NODE_CHECKER    402
393 #define TEX_NODE_TEXTURE    403
394 #define TEX_NODE_BRICKS     404
395 #define TEX_NODE_MATH       405
396 #define TEX_NODE_MIX_RGB    406
397 #define TEX_NODE_RGBTOBW    407
398 #define TEX_NODE_VALTORGB   408
399 #define TEX_NODE_IMAGE      409
400 #define TEX_NODE_CURVE_RGB  410
401 #define TEX_NODE_INVERT     411
402 #define TEX_NODE_HUE_SAT    412
403 #define TEX_NODE_CURVE_TIME 413
404 #define TEX_NODE_ROTATE     414
405 #define TEX_NODE_VIEWER     415
406 #define TEX_NODE_TRANSLATE  416
407 #define TEX_NODE_COORD      417
408 #define TEX_NODE_DISTANCE   418
409 #define TEX_NODE_COMPOSE    419
410 #define TEX_NODE_DECOMPOSE  420
411 #define TEX_NODE_VALTONOR   421
412 #define TEX_NODE_SCALE      422
413 #define TEX_NODE_AT         423
414
415 /* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
416 #define TEX_NODE_PROC      500
417 #define TEX_NODE_PROC_MAX  600
418
419 extern struct ListBase node_all_textures;
420
421 /* API */
422 int  ntreeTexTagAnimated(struct bNodeTree *ntree);
423 void ntreeTexUpdatePreviews( struct bNodeTree* nodetree );
424 void ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, char do_preview, short thread, struct Tex *tex, short which_output, int cfra);
425 void ntreeTexCheckCyclics(struct bNodeTree *ntree);
426 void ntreeTexAssignIndex(struct bNodeTree *ntree, struct bNode *node);
427 char* ntreeTexOutputMenu(struct bNodeTree *ntree);
428
429
430 /**/
431
432 void init_nodesystem(void);
433 void free_nodesystem(void);
434
435 #endif