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