svn merge ^/trunk/blender -r42914:42918
[blender.git] / source / blender / makesdna / DNA_node_types.h
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): Bob Holcomb, Xavier Thomas
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef DNA_NODE_TYPES_H
29 #define DNA_NODE_TYPES_H
30
31 /** \file DNA_node_types.h
32  *  \ingroup DNA
33  */
34
35 #include "DNA_ID.h"
36 #include "DNA_vec_types.h"
37 #include "DNA_listBase.h"
38 #include "DNA_texture_types.h"
39 #include "DNA_scene_types.h"
40
41 struct ID;
42 struct ListBase;
43 struct SpaceNode;
44 struct bNodeLink;
45 struct bNodeType;
46 struct bNodeTreeExec;
47 struct AnimData;
48 struct bGPdata;
49 struct uiBlock;
50 struct Image;
51
52 #define NODE_MAXSTR 32
53
54 typedef struct bNodeStack {
55         float vec[4];
56         float min, max;
57         void *data;
58         short hasinput;                 /* when input has link, tagged before executing */
59         short hasoutput;                /* when output is linked, tagged before executing */
60         short datatype;                 /* type of data pointer */
61         short sockettype;               /* type of socket stack comes from, to remap linking different sockets */
62         short is_copy;                  /* data is a copy of external data (no freeing) */
63         short external;                 /* data is used by external nodes (no freeing) */
64         short pad[2];
65 } bNodeStack;
66
67 /* ns->datatype, shadetree only */
68 #define NS_OSA_VECTORS          1
69 #define NS_OSA_VALUES           2
70
71 typedef struct bNodeSocket {
72         struct bNodeSocket *next, *prev, *new_sock;
73         
74         char name[32];
75         
76         void *storage;                          /* custom storage */
77         
78         short type, flag;
79         short limit;                            /* max. number of links */
80         short pad1;
81         
82         float locx, locy;
83         
84         void *default_value;            /* default input value used for unlinked sockets */
85         
86         /* execution data */
87         short stack_index;                      /* local stack index */
88         short stack_type;                       /* deprecated, kept for forward compatibility */
89         int pad3;
90         void *cache;                            /* cached data from execution */
91         
92         /* internal data to retrieve relations and groups */
93         int own_index;                          /* group socket identifiers, to find matching pairs after reading files */
94         int to_index  DNA_DEPRECATED;  /* XXX deprecated, only used for restoring old group node links */
95         struct bNodeSocket *groupsock;
96         
97         struct bNodeLink *link;         /* a link pointer, set in ntreeUpdateTree */
98
99         /* DEPRECATED only needed for do_versions */
100         bNodeStack ns;                          /* custom data for inputs, only UI writes in this */
101 } bNodeSocket;
102
103 /* sock->type */
104 #define SOCK_FLOAT                      0
105 #define SOCK_VECTOR                     1
106 #define SOCK_RGBA                       2
107 #define SOCK_SHADER                     3
108 #define SOCK_BOOLEAN            4
109 #define SOCK_MESH                       5
110 #define SOCK_INT                        6
111 #define NUM_SOCKET_TYPES        7       /* must be last! */
112
113 /* socket side (input/output) */
114 #define SOCK_IN         1
115 #define SOCK_OUT        2
116
117 /* sock->flag, first bit is select */
118         /* hidden is user defined, to hide unused */
119 #define SOCK_HIDDEN                             2
120         /* only used now for groups... */
121 #define SOCK_IN_USE                             4       /* XXX deprecated */
122         /* unavailable is for dynamic sockets */
123 #define SOCK_UNAVAIL                    8
124         /* dynamic socket (can be modified by user) */
125 #define SOCK_DYNAMIC                    16
126         /* group socket should not be exposed */
127 #define SOCK_INTERNAL                   32
128         /* socket collapsed in UI */
129 #define SOCK_COLLAPSED                  64
130         /* hide socket value, if it gets auto default */
131 #define SOCK_HIDE_VALUE                 128
132
133 typedef struct bNodePreview {
134         unsigned char *rect;
135         short xsize, ysize;
136         int pad;
137 } bNodePreview;
138
139 /* limit data in bNode to what we want to see saved? */
140 typedef struct bNode {
141         struct bNode *next, *prev, *new_node;
142         
143         char name[32];
144         short type, flag;
145         short done, level;              /* both for dependency and sorting */
146         short lasty, menunr;    /* lasty: check preview render status, menunr: browse ID blocks */
147         short stack_index;              /* for groupnode, offset in global caller stack */
148         short nr;                               /* number of this node in list, used for UI exec events */
149         
150         ListBase inputs, outputs;
151         struct bNode *parent;   /* parent node */
152         struct ID *id;                  /* optional link to libdata */
153         void *storage;                  /* custom data, must be struct, for storage in file */
154         
155         float locx, locy;               /* root offset for drawing */
156         float width, height;    /* node custom width and height */
157         float miniwidth;                /* node width if hidden */
158         
159         int update;                             /* update flags */
160         
161         char label[32];                 /* custom user-defined label */
162         short custom1, custom2; /* to be abused for buttons */
163         float custom3, custom4;
164         
165         short need_exec, exec;  /* need_exec is set as UI execution event, exec is flag during exec */
166         void *threaddata;               /* optional extra storage for use in thread (read only then!) */
167         
168         rctf totr;                              /* entire boundbox */
169         rctf butr;                              /* optional buttons area */
170         rctf prvr;                              /* optional preview area */
171         bNodePreview *preview;  /* optional preview image */
172         struct uiBlock *block;  /* runtime during drawing */
173         
174         struct bNodeType *typeinfo;     /* lookup of callbacks and defaults */
175 } bNode;
176
177 /* node->flag */
178 #define NODE_SELECT                     1
179 #define NODE_OPTIONS            2
180 #define NODE_PREVIEW            4
181 #define NODE_HIDDEN                     8
182 #define NODE_ACTIVE                     16
183 #define NODE_ACTIVE_ID          32
184 #define NODE_DO_OUTPUT          64
185 #define NODE_GROUP_EDIT         128
186         /* free test flag, undefined */
187 #define NODE_TEST                       256
188         /* composite: don't do node but pass on buffer(s) */
189 #define NODE_MUTED                      512
190 #define NODE_CUSTOM_NAME        1024    /* deprecated! */
191         /* group node types: use const outputs by default */
192 #define NODE_CONST_OUTPUT       (1<<11)
193         /* node is always behind others */
194 #define NODE_BACKGROUND         (1<<12)
195         /* automatic flag for nodes included in transforms */
196 #define NODE_TRANSFORM          (1<<13)
197         /* node is active texture */
198 #define NODE_ACTIVE_TEXTURE     (1<<14)
199
200 /* node->update */
201 /* XXX NODE_UPDATE is a generic update flag. More fine-grained updates
202  * might be used in the future, but currently all work the same way.
203  */
204 #define NODE_UPDATE                     0xFFFF  /* generic update flag (includes all others) */
205 #define NODE_UPDATE_ID          1               /* associated id data block has changed */
206
207 typedef struct bNodeLink {
208         struct bNodeLink *next, *prev;
209         
210         bNode *fromnode, *tonode;
211         bNodeSocket *fromsock, *tosock;
212         
213         int flag;
214         int pad;
215 } bNodeLink;
216
217 /* link->flag */
218 #define NODE_LINKFLAG_HILITE    1               /* link has been successfully validated */
219 #define NODE_LINK_VALID                 2
220
221 /* the basis for a Node tree, all links and nodes reside internal here */
222 /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
223 typedef struct bNodeTree {
224         ID id;
225         struct AnimData *adt;           /* animation data (must be immediately after id for utilities to use it) */ 
226         
227         struct bGPdata *gpd;            /* grease pencil data */
228         
229         ListBase nodes, links;
230         
231         int type, init;                                 /* set init on fileread */
232         int cur_index;                                  /* sockets in groups have unique identifiers, adding new sockets always 
233                                                                            will increase this counter */
234         int flag;
235         int update;                                             /* update flags */
236         
237         int nodetype;                                   /* specific node type this tree is used for */
238         
239         ListBase inputs, outputs;               /* external sockets for group nodes */
240         
241         /* execution data */
242         /* XXX It would be preferable to completely move this data out of the underlying node tree,
243          * so node tree execution could finally run independent of the tree itself. This would allow node trees
244          * to be merely linked by other data (materials, textures, etc.), as ID data is supposed to.
245          * Execution data is generated from the tree once at execution start and can then be used
246          * as long as necessary, even while the tree is being modified.
247          */
248         struct bNodeTreeExec *execdata;
249         
250         /* callbacks */
251         void (*progress)(void *, float progress);
252         void (*stats_draw)(void *, char *str);
253         int (*test_break)(void *);
254         void *tbh, *prh, *sdh;
255         
256 } bNodeTree;
257
258 /* ntree->type, index */
259 #define NTREE_SHADER            0
260 #define NTREE_COMPOSIT          1
261 #define NTREE_TEXTURE           2
262 #define NUM_NTREE_TYPES         3
263
264 /* ntree->init, flag */
265 #define NTREE_TYPE_INIT         1
266
267 /* ntree->flag */
268 #define NTREE_DS_EXPAND         1       /* for animation editors */
269 /* XXX not nice, but needed as a temporary flags
270  * for group updates after library linking.
271  */
272 #define NTREE_DO_VERSIONS_GROUP_EXPOSE  1024
273
274 /* ntree->update */
275 #define NTREE_UPDATE                    0xFFFF  /* generic update flag (includes all others) */
276 #define NTREE_UPDATE_LINKS              1               /* links have been added or removed */
277 #define NTREE_UPDATE_NODES              2               /* nodes or sockets have been added or removed */
278 #define NTREE_UPDATE_GROUP_IN   16              /* group inputs have changed */
279 #define NTREE_UPDATE_GROUP_OUT  32              /* group outputs have changed */
280 #define NTREE_UPDATE_GROUP              48              /* group has changed (generic flag including all other group flags) */
281
282
283 /* socket value structs for input buttons */
284
285 typedef struct bNodeSocketValueInt {
286         int subtype;                            /* RNA subtype */
287         int value;
288         int min, max;
289 } bNodeSocketValueInt;
290
291 typedef struct bNodeSocketValueFloat {
292         int subtype;                            /* RNA subtype */
293         float value;
294         float min, max;
295 } bNodeSocketValueFloat;
296
297 typedef struct bNodeSocketValueBoolean {
298         char value;
299         char pad[3];
300 } bNodeSocketValueBoolean;
301
302 typedef struct bNodeSocketValueVector {
303         int subtype;                            /* RNA subtype */
304         float value[3];
305         float min, max;
306 } bNodeSocketValueVector;
307
308 typedef struct bNodeSocketValueRGBA {
309         float value[4];
310 } bNodeSocketValueRGBA;
311
312
313 /* data structs, for node->storage */
314
315 /* this one has been replaced with ImageUser, keep it for do_versions() */
316 typedef struct NodeImageAnim {
317         int frames, sfra, nr;
318         char cyclic, movie;
319         short pad;
320 } NodeImageAnim;
321
322 typedef struct NodeBlurData {
323         short sizex, sizey;
324         short samples, maxspeed, minspeed, relative, aspect;
325         short curved;
326         float fac, percentx, percenty;
327         short filtertype;
328         char bokeh, gamma;
329         int image_in_width, image_in_height; /* needed for absolute/relative conversions */
330 } NodeBlurData;
331
332 typedef struct NodeDBlurData {
333         float center_x, center_y, distance, angle, spin, zoom;
334         short iter;
335         char wrap, pad;
336 } NodeDBlurData;
337
338 typedef struct NodeBilateralBlurData {
339         float sigma_color, sigma_space;
340         short iter, pad;
341 } NodeBilateralBlurData;
342
343 typedef struct NodeHueSat {
344         float hue, sat, val;
345 } NodeHueSat;
346
347 typedef struct NodeImageFile {
348         char name[256];
349         struct ImageFormatData im_format;
350         int sfra, efra;
351 } NodeImageFile;
352
353 typedef struct NodeChroma {
354         float t1,t2,t3;
355         float fsize,fstrength,falpha;
356         float key[4];
357    short algorithm, channel;
358 } NodeChroma;
359
360 typedef struct NodeTwoXYs {
361         short x1, x2, y1, y2;
362    float fac_x1, fac_x2, fac_y1, fac_y2;
363 } NodeTwoXYs;
364
365 typedef struct NodeTwoFloats {
366         float x, y;
367 } NodeTwoFloats;
368
369 typedef struct NodeGeometry {
370         char uvname[32];
371         char colname[32];
372 } NodeGeometry;
373
374 typedef struct NodeVertexCol {
375         char name[32];
376 } NodeVertexCol;
377
378 /* qdn: Defocus blur node */
379 typedef struct NodeDefocus {
380         char bktype, pad_c1, preview, gamco;
381         short samples, no_zbuf;
382         float fstop, maxblur, bthresh, scale;
383         float rotation, pad_f1;
384 } NodeDefocus;
385
386 typedef struct NodeScriptDict {
387         void *dict; /* for PyObject *dict */
388         void *node; /* for BPy_Node *node */
389 } NodeScriptDict;
390
391 /* qdn: glare node */
392 typedef struct NodeGlare {
393         char quality, type, iter;
394         char angle, pad_c1, size, pad[2];
395         float colmod, mix, threshold, fade;
396         float angle_ofs, pad_f1;
397 } NodeGlare;
398
399 /* qdn: tonemap node */
400 typedef struct NodeTonemap {
401         float key, offset, gamma;
402         float f, m, a, c;
403         int type;
404 } NodeTonemap;
405
406 /* qdn: lens distortion node */
407 typedef struct NodeLensDist {
408         short jit, proj, fit, pad;
409 } NodeLensDist;
410
411 typedef struct NodeColorBalance {
412         /* for processing */
413         float slope[3];
414         float offset[3];
415         float power[3];
416         
417         /* for ui representation */
418         float lift[3];
419         float gamma[3];
420         float gain[3];
421
422         /* temp storage for inverted lift */
423         float lift_lgg[3];
424         float gamma_inv[3];
425 } NodeColorBalance;
426
427 typedef struct NodeColorspill {
428         short limchan, unspill;
429         float limscale;
430         float uspillr, uspillg, uspillb;
431 }NodeColorspill;
432
433 typedef struct NodeTexBase {
434         TexMapping tex_mapping;
435         ColorMapping color_mapping;
436 } NodeTexBase;
437
438 typedef struct NodeTexSky {
439         NodeTexBase base;
440         float sun_direction[3];
441         float turbidity;
442 } NodeTexSky;
443
444 typedef struct NodeTexImage {
445         NodeTexBase base;
446         int color_space, pad;
447 } NodeTexImage;
448
449 typedef struct NodeTexEnvironment {
450         NodeTexBase base;
451         int color_space, pad;
452 } NodeTexEnvironment;
453
454 typedef struct NodeTexGradient {
455         NodeTexBase base;
456         int gradient_type;
457         int pad;
458 } NodeTexGradient;
459
460 typedef struct NodeTexNoise {
461         NodeTexBase base;
462 } NodeTexNoise;
463
464 typedef struct NodeTexVoronoi {
465         NodeTexBase base;
466         int coloring;
467         int pad;
468 } NodeTexVoronoi;
469
470 typedef struct NodeTexMusgrave {
471         NodeTexBase base;
472         int musgrave_type;
473         int pad;
474 } NodeTexMusgrave;
475
476 typedef struct NodeTexWave {
477         NodeTexBase base;
478         int wave_type;
479         int pad;
480 } NodeTexWave;
481
482 typedef struct NodeTexMagic {
483         NodeTexBase base;
484         int depth;
485         int pad;
486 } NodeTexMagic;
487
488 typedef struct NodeShaderAttribute {
489         char name[64];
490 } NodeShaderAttribute;
491
492 /* TEX_output */
493 typedef struct TexNodeOutput {
494         char name[32];
495 } TexNodeOutput;
496
497 /* comp channel matte */
498 #define CMP_NODE_CHANNEL_MATTE_CS_RGB   1
499 #define CMP_NODE_CHANNEL_MATTE_CS_HSV   2
500 #define CMP_NODE_CHANNEL_MATTE_CS_YUV   3
501 #define CMP_NODE_CHANNEL_MATTE_CS_YCC   4
502
503 /* glossy distributions */
504 #define SHD_GLOSSY_BECKMANN     0
505 #define SHD_GLOSSY_SHARP        1
506 #define SHD_GLOSSY_GGX          2
507
508 /* blend texture */
509 #define SHD_BLEND_LINEAR                        0
510 #define SHD_BLEND_QUADRATIC                     1
511 #define SHD_BLEND_EASING                        2
512 #define SHD_BLEND_DIAGONAL                      3
513 #define SHD_BLEND_RADIAL                        4
514 #define SHD_BLEND_QUADRATIC_SPHERE      5
515 #define SHD_BLEND_SPHERICAL                     6
516
517 /* noise basis for textures */
518 #define SHD_NOISE_PERLIN                        0
519 #define SHD_NOISE_VORONOI_F1            1
520 #define SHD_NOISE_VORONOI_F2            2
521 #define SHD_NOISE_VORONOI_F3            3
522 #define SHD_NOISE_VORONOI_F4            4
523 #define SHD_NOISE_VORONOI_F2_F1         5
524 #define SHD_NOISE_VORONOI_CRACKLE       6
525 #define SHD_NOISE_CELL_NOISE            7
526
527 #define SHD_NOISE_SOFT  0
528 #define SHD_NOISE_HARD  1
529
530 /* voronoi texture */
531 #define SHD_VORONOI_DISTANCE_SQUARED    0
532 #define SHD_VORONOI_ACTUAL_DISTANCE             1
533 #define SHD_VORONOI_MANHATTAN                   2
534 #define SHD_VORONOI_CHEBYCHEV                   3
535 #define SHD_VORONOI_MINKOVSKY_H                 4
536 #define SHD_VORONOI_MINKOVSKY_4                 5
537 #define SHD_VORONOI_MINKOVSKY                   6
538
539 #define SHD_VORONOI_INTENSITY   0
540 #define SHD_VORONOI_CELLS               1
541
542 /* musgrave texture */
543 #define SHD_MUSGRAVE_MULTIFRACTAL                       0
544 #define SHD_MUSGRAVE_FBM                                        1
545 #define SHD_MUSGRAVE_HYBRID_MULTIFRACTAL        2
546 #define SHD_MUSGRAVE_RIDGED_MULTIFRACTAL        3
547 #define SHD_MUSGRAVE_HETERO_TERRAIN                     4
548
549 /* wave texture */
550 #define SHD_WAVE_BANDS          0
551 #define SHD_WAVE_RINGS          1
552
553 #define SHD_WAVE_SINE   0
554 #define SHD_WAVE_SAW    1
555 #define SHD_WAVE_TRI    2
556
557 /* image/environment texture */
558 #define SHD_COLORSPACE_LINEAR   0
559 #define SHD_COLORSPACE_SRGB             1
560
561 /* blur node */
562 #define CMP_NODE_BLUR_ASPECT_NONE               0
563 #define CMP_NODE_BLUR_ASPECT_Y                  1
564 #define CMP_NODE_BLUR_ASPECT_X                  2
565
566 #endif