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