Cycles: glossy and anisotropic BSDF changes
[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 bNodePreview;
48 struct bNodeInstanceHash;
49 struct AnimData;
50 struct bGPdata;
51 struct uiBlock;
52 struct Image;
53
54 /* In writefile.c: write deprecated DNA data,
55  * to ensure forward compatibility in 2.6x versions.
56  * Will be removed eventually.
57  */
58 #define USE_NODE_COMPAT_CUSTOMNODES
59
60 #define NODE_MAXSTR 64
61
62 typedef struct bNodeStack {
63         float vec[4];
64         float min, max;
65         void *data;
66         short hasinput;                 /* when input has link, tagged before executing */
67         short hasoutput;                /* when output is linked, tagged before executing */
68         short datatype;                 /* type of data pointer */
69         short sockettype;               /* type of socket stack comes from, to remap linking different sockets */
70         short is_copy;                  /* data is a copy of external data (no freeing) */
71         short external;                 /* data is used by external nodes (no freeing) */
72         short pad[2];
73 } bNodeStack;
74
75 /* ns->datatype, shadetree only */
76 #define NS_OSA_VECTORS          1
77 #define NS_OSA_VALUES           2
78
79 /* node socket/node socket type -b conversion rules */
80 #define NS_CR_CENTER            0
81 #define NS_CR_NONE                      1
82 #define NS_CR_FIT_WIDTH         2
83 #define NS_CR_FIT_HEIGHT        3
84 #define NS_CR_FIT                       4
85 #define NS_CR_STRETCH           5
86
87 typedef struct bNodeSocket {
88         struct bNodeSocket *next, *prev, *new_sock;
89         
90         IDProperty *prop;                       /* user-defined properties */
91         
92         char identifier[64];            /* unique identifier for mapping */
93         
94         char name[64];  /* MAX_NAME */
95         
96         /* XXX deprecated, only used for the Image and OutputFile nodes,
97          * should be removed at some point.
98          */
99         void *storage;                          /* custom storage */
100         
101         short type, flag;
102         short limit;                            /* max. number of links */
103         short in_out;                           /* input/output type */
104         struct bNodeSocketType *typeinfo;       /* runtime type information */
105         char idname[64];                        /* runtime type identifier */
106         
107         float locx, locy;
108         
109         void *default_value;            /* default input value used for unlinked sockets */
110         
111         /* execution data */
112         short stack_index;                      /* local stack index */
113         /* XXX deprecated, kept for forward compatibility */
114         short stack_type  DNA_DEPRECATED;
115         int pad;
116         
117         void *cache;                            /* cached data from execution */
118         
119         /* internal data to retrieve relations and groups
120          * DEPRECATED, now uses the generic identifier string instead
121          */
122         int own_index  DNA_DEPRECATED;  /* group socket identifiers, to find matching pairs after reading files */
123         /* XXX deprecated, only used for restoring old group node links */
124         int to_index  DNA_DEPRECATED;
125         /* XXX deprecated, still forward compatible since verification restores pointer from matching own_index. */
126         struct bNodeSocket *groupsock  DNA_DEPRECATED;
127         
128         struct bNodeLink *link;         /* a link pointer, set in ntreeUpdateTree */
129
130         /* XXX deprecated, socket input values are stored in default_value now. kept for forward compatibility */
131         bNodeStack ns  DNA_DEPRECATED;  /* custom data for inputs, only UI writes in this */
132 } bNodeSocket;
133
134 /* sock->type */
135 typedef enum eNodeSocketDatatype {
136         SOCK_CUSTOM                     = -1,   /* socket has no integer type */
137         SOCK_FLOAT                      = 0,
138         SOCK_VECTOR                     = 1,
139         SOCK_RGBA                       = 2,
140         SOCK_SHADER                     = 3,
141         SOCK_BOOLEAN            = 4,
142         __SOCK_MESH                     = 5,    /* deprecated */
143         SOCK_INT                        = 6,
144         SOCK_STRING                     = 7
145 } eNodeSocketDatatype;
146
147 /* socket side (input/output) */
148 typedef enum eNodeSocketInOut {
149         SOCK_IN = 1,
150         SOCK_OUT = 2
151 } eNodeSocketInOut;
152
153 /* sock->flag, first bit is select */
154 typedef enum eNodeSocketFlag {
155         SOCK_HIDDEN = 2,                                        /* hidden is user defined, to hide unused */
156         SOCK_IN_USE = 4,                                        /* for quick check if socket is linked */
157         SOCK_UNAVAIL = 8,                                       /* unavailable is for dynamic sockets */
158         // SOCK_DYNAMIC = 16,                           /* DEPRECATED  dynamic socket (can be modified by user) */
159         // SOCK_INTERNAL = 32,                          /* DEPRECATED  group socket should not be exposed */
160         SOCK_COLLAPSED = 64,                            /* socket collapsed in UI */
161         SOCK_HIDE_VALUE = 128,                          /* hide socket value, if it gets auto default */
162         SOCK_AUTO_HIDDEN__DEPRECATED = 256,     /* socket hidden automatically, to distinguish from manually hidden */
163         SOCK_NO_INTERNAL_LINK = 512
164 } eNodeSocketFlag;
165
166 /* limit data in bNode to what we want to see saved? */
167 typedef struct bNode {
168         struct bNode *next, *prev, *new_node;
169
170         IDProperty *prop;               /* user-defined properties */
171         
172         struct bNodeType *typeinfo;     /* runtime type information */
173         char idname[64];                        /* runtime type identifier */
174         
175         char name[64];  /* MAX_NAME */
176         int flag;
177         short type, pad;
178         short done, level;              /* both for dependency and sorting */
179         short lasty, menunr;    /* lasty: check preview render status, menunr: browse ID blocks */
180         short stack_index;              /* for groupnode, offset in global caller stack */
181         short nr;                               /* number of this node in list, used for UI exec events */
182         float color[3];                 /* custom user-defined color */
183         
184         ListBase inputs, outputs;
185         struct bNode *parent;   /* parent node */
186         struct ID *id;                  /* optional link to libdata */
187         void *storage;                  /* custom data, must be struct, for storage in file */
188         struct bNode *original; /* the original node in the tree (for localized tree) */
189         ListBase internal_links; /* list of cached internal links (input to output), for muted nodes and operators */
190         
191         float locx, locy;               /* root offset for drawing (parent space) */
192         float width, height;    /* node custom width and height */
193         float miniwidth;                /* node width if hidden */
194         float offsetx, offsety; /* additional offset from loc */
195         
196         int update;                             /* update flags */
197         
198         char label[64];                 /* custom user-defined label, MAX_NAME */
199         short custom1, custom2; /* to be abused for buttons */
200         float custom3, custom4;
201
202         short need_exec, exec;  /* need_exec is set as UI execution event, exec is flag during exec */
203         void *threaddata;               /* optional extra storage for use in thread (read only then!) */
204         rctf totr;                              /* entire boundbox (worldspace) */
205         rctf butr;                              /* optional buttons area */
206         rctf prvr;                              /* optional preview area */
207         /* XXX TODO
208          * Node totr size depends on the prvr size, which in turn is determined from preview size.
209          * In earlier versions bNodePreview was stored directly in nodes, but since now there can be
210          * multiple instances using different preview images it is possible that required node size varies between instances.
211          * preview_xsize, preview_ysize defines a common reserved size for preview rect for now,
212          * could be replaced by more accurate node instance drawing, but that requires removing totr from DNA
213          * and replacing all uses with per-instance data.
214          */
215         short preview_xsize, preview_ysize;     /* reserved size of the preview rect */
216         int pad2;
217         struct uiBlock *block;  /* runtime during drawing */
218 } bNode;
219
220 /* node->flag */
221 #define NODE_SELECT                     1
222 #define NODE_OPTIONS            2
223 #define NODE_PREVIEW            4
224 #define NODE_HIDDEN                     8
225 #define NODE_ACTIVE                     16
226 #define NODE_ACTIVE_ID          32
227 #define NODE_DO_OUTPUT          64
228 #define __NODE_GROUP_EDIT       128             /* DEPRECATED */
229         /* free test flag, undefined */
230 #define NODE_TEST                       256
231         /* node is disabled */
232 #define NODE_MUTED                      512
233 // #define NODE_CUSTOM_NAME     1024    /* deprecated! */
234         /* group node types: use const outputs by default */
235 #define NODE_CONST_OUTPUT       (1<<11)
236         /* node is always behind others */
237 #define NODE_BACKGROUND         (1<<12)
238         /* automatic flag for nodes included in transforms */
239 #define NODE_TRANSFORM          (1<<13)
240         /* node is active texture */
241
242         /* note: take care with this flag since its possible it gets
243          * `stuck` inside/outside the active group - which makes buttons
244          * window texture not update, we try to avoid it by clearing the
245          * flag when toggling group editing - Campbell */
246 #define NODE_ACTIVE_TEXTURE     (1<<14)
247         /* use a custom color for the node */
248 #define NODE_CUSTOM_COLOR       (1<<15)
249         /* Node has been initialized
250          * This flag indicates the node->typeinfo->init function has been called.
251          * In case of undefined type at creation time this can be delayed until
252          * until the node type is registered.
253          */
254 #define NODE_INIT                       (1<<16)
255
256         /* do recalc of output, used to skip recalculation of unwanted
257          * composite out nodes when editing tree
258          */
259 #define NODE_DO_OUTPUT_RECALC   (1<<17)
260
261 /* node->update */
262 /* XXX NODE_UPDATE is a generic update flag. More fine-grained updates
263  * might be used in the future, but currently all work the same way.
264  */
265 #define NODE_UPDATE                     0xFFFF  /* generic update flag (includes all others) */
266 #define NODE_UPDATE_ID          1               /* associated id data block has changed */
267
268 /* Unique hash key for identifying node instances
269  * Defined as a struct because DNA does not support other typedefs.
270  */
271 typedef struct bNodeInstanceKey
272 {
273         unsigned int value;
274 } bNodeInstanceKey;
275
276 /* Base struct for entries in node instance hash.
277  * WARNING: pointers are cast to this struct internally,
278  * it must be first member in hash entry structs!
279  */
280 typedef struct bNodeInstanceHashEntry {
281         bNodeInstanceKey key;
282         
283         /* tags for cleaning the cache */
284         short tag;
285         short pad;
286 } bNodeInstanceHashEntry;
287
288
289 typedef struct bNodePreview {
290         bNodeInstanceHashEntry hash_entry;      /* must be first */
291         
292         unsigned char *rect;
293         short xsize, ysize;
294         int pad;
295 } bNodePreview;
296
297
298 typedef struct bNodeLink {
299         struct bNodeLink *next, *prev;
300         
301         bNode *fromnode, *tonode;
302         bNodeSocket *fromsock, *tosock;
303         
304         int flag;
305         int pad;
306 } bNodeLink;
307
308 /* link->flag */
309 #define NODE_LINKFLAG_HILITE    1               /* link has been successfully validated */
310 #define NODE_LINK_VALID                 2
311 #define NODE_LINK_TEST                  4               /* free test flag, undefined */
312
313 /* tree->edit_quality/tree->render_quality */
314 #define NTREE_QUALITY_HIGH    0
315 #define NTREE_QUALITY_MEDIUM  1
316 #define NTREE_QUALITY_LOW     2
317
318 /* tree->chunksize */
319 #define NTREE_CHUNCKSIZE_32 32
320 #define NTREE_CHUNCKSIZE_64 64
321 #define NTREE_CHUNCKSIZE_128 128
322 #define NTREE_CHUNCKSIZE_256 256
323 #define NTREE_CHUNCKSIZE_512 512
324 #define NTREE_CHUNCKSIZE_1024 1024
325
326 /* the basis for a Node tree, all links and nodes reside internal here */
327 /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
328 typedef struct bNodeTree {
329         ID id;
330         struct AnimData *adt;           /* animation data (must be immediately after id for utilities to use it) */ 
331         
332         struct bNodeTreeType *typeinfo; /* runtime type information */
333         char idname[64];                                /* runtime type identifier */
334         
335         struct StructRNA *interface_type;       /* runtime RNA type of the group interface */
336         
337         struct bGPdata *gpd;            /* grease pencil data */
338         float view_center[2];           /* node tree stores own offset for consistent editor view */
339         
340         ListBase nodes, links;
341         
342         int type, init;                                 /* set init on fileread */
343         int cur_index;                                  /* sockets in groups have unique identifiers, adding new sockets always 
344                                                                          * will increase this counter */
345         int flag;
346         int update;                                             /* update flags */
347         short is_updating;                              /* flag to prevent reentrant update calls */
348         short done;                                             /* generic temporary flag for recursion check (DFS/BFS) */
349         int pad2;
350         
351         int nodetype DNA_DEPRECATED;    /* specific node type this tree is used for */
352
353         short edit_quality;                             /* Quality setting when editing */
354         short render_quality;                           /* Quality setting when rendering */
355         int chunksize;                                  /* tile size for compositor engine */
356         
357         rctf viewer_border;
358         
359         /* Lists of bNodeSocket to hold default values and own_index.
360          * Warning! Don't make links to these sockets, input/output nodes are used for that.
361          * These sockets are used only for generating external interfaces.
362          */
363         ListBase inputs, outputs;
364         
365         /* Node preview hash table
366          * Only available in base node trees (e.g. scene->node_tree)
367          */
368         struct bNodeInstanceHash *previews;
369         /* Defines the node tree instance to use for the "active" context,
370          * in case multiple different editors are used and make context ambiguous.
371          */
372         bNodeInstanceKey active_viewer_key;
373         int pad;
374         
375         /* execution data */
376         /* XXX It would be preferable to completely move this data out of the underlying node tree,
377          * so node tree execution could finally run independent of the tree itself. This would allow node trees
378          * to be merely linked by other data (materials, textures, etc.), as ID data is supposed to.
379          * Execution data is generated from the tree once at execution start and can then be used
380          * as long as necessary, even while the tree is being modified.
381          */
382         struct bNodeTreeExec *execdata;
383         
384         /* callbacks */
385         void (*progress)(void *, float progress);
386         void (*stats_draw)(void *, char *str);
387         int (*test_break)(void *);
388         void (*update_draw)(void *);
389         void *tbh, *prh, *sdh, *udh;
390         
391 } bNodeTree;
392
393 /* ntree->type, index */
394 #define NTREE_CUSTOM            -1              /* for dynamically registered custom types */
395 #define NTREE_SHADER            0
396 #define NTREE_COMPOSIT          1
397 #define NTREE_TEXTURE           2
398
399 /* ntree->init, flag */
400 #define NTREE_TYPE_INIT         1
401
402 /* ntree->flag */
403 #define NTREE_DS_EXPAND                         1       /* for animation editors */
404 #define NTREE_COM_OPENCL                        2       /* use opencl */
405 #define NTREE_TWO_PASS                          4       /* two pass */
406 #define NTREE_COM_GROUPNODE_BUFFER      8       /* use groupnode buffers */
407 #define NTREE_VIEWER_BORDER                     16      /* use a border for viewer nodes */
408 #define NTREE_IS_LOCALIZED                      32      /* tree is localized copy, free when deleting node groups */
409
410 /* XXX not nice, but needed as a temporary flags
411  * for group updates after library linking.
412  */
413 #define NTREE_DO_VERSIONS_GROUP_EXPOSE_2_56_2   1024    /* changes from r35033 */
414 #define NTREE_DO_VERSIONS_CUSTOMNODES_GROUP             2048    /* custom_nodes branch: remove links to node tree sockets */
415 #define NTREE_DO_VERSIONS_CUSTOMNODES_GROUP_CREATE_INTERFACE    4096    /* custom_nodes branch: create group input/output nodes */
416
417 /* ntree->update */
418 typedef enum eNodeTreeUpdate {
419         NTREE_UPDATE            = 0xFFFF,       /* generic update flag (includes all others) */
420         NTREE_UPDATE_LINKS      = 1,            /* links have been added or removed */
421         NTREE_UPDATE_NODES      = 2,            /* nodes or sockets have been added or removed */
422         NTREE_UPDATE_GROUP_IN   = 16,           /* group inputs have changed */
423         NTREE_UPDATE_GROUP_OUT  = 32,           /* group outputs have changed */
424         NTREE_UPDATE_GROUP      = 48            /* group has changed (generic flag including all other group flags) */
425 } eNodeTreeUpdate;
426
427
428 /* socket value structs for input buttons
429  * DEPRECATED now using ID properties
430  */
431
432 typedef struct bNodeSocketValueInt {
433         int subtype;                            /* RNA subtype */
434         int value;
435         int min, max;
436 } bNodeSocketValueInt;
437
438 typedef struct bNodeSocketValueFloat {
439         int subtype;                            /* RNA subtype */
440         float value;
441         float min, max;
442 } bNodeSocketValueFloat;
443
444 typedef struct bNodeSocketValueBoolean {
445         char value;
446         char pad[3];
447 } bNodeSocketValueBoolean;
448
449 typedef struct bNodeSocketValueVector {
450         int subtype;                            /* RNA subtype */
451         float value[3];
452         float min, max;
453 } bNodeSocketValueVector;
454
455 typedef struct bNodeSocketValueRGBA {
456         float value[4];
457 } bNodeSocketValueRGBA;
458
459 typedef struct bNodeSocketValueString {
460         int subtype;
461         int pad;
462         char value[1024];       /* 1024 = FILEMAX */
463 } bNodeSocketValueString;
464
465 /* data structs, for node->storage */
466 enum {
467         CMP_NODE_MASKTYPE_ADD         = 0,
468         CMP_NODE_MASKTYPE_SUBTRACT    = 1,
469         CMP_NODE_MASKTYPE_MULTIPLY    = 2,
470         CMP_NODE_MASKTYPE_NOT         = 3
471 };
472
473 enum {
474         CMP_NODE_LENSFLARE_GHOST   = 1,
475         CMP_NODE_LENSFLARE_GLOW    = 2,
476         CMP_NODE_LENSFLARE_CIRCLE  = 4,
477         CMP_NODE_LENSFLARE_STREAKS = 8
478 };
479
480 enum {
481         CMP_NODE_DILATEERODE_STEP             = 0,
482         CMP_NODE_DILATEERODE_DISTANCE_THRESH  = 1,
483         CMP_NODE_DILATEERODE_DISTANCE         = 2,
484         CMP_NODE_DILATEERODE_DISTANCE_FEATHER = 3
485 };
486
487 enum {
488         CMP_NODE_INPAINT_SIMPLE               = 0
489 };
490
491 enum {
492         CMP_NODEFLAG_MASK_AA          = (1 << 0),
493         CMP_NODEFLAG_MASK_NO_FEATHER  = (1 << 1),
494         CMP_NODEFLAG_MASK_MOTION_BLUR = (1 << 2),
495
496         /* we may want multiple aspect options, exposed as an rna enum */
497         CMP_NODEFLAG_MASK_FIXED       = (1 << 8),
498         CMP_NODEFLAG_MASK_FIXED_SCENE = (1 << 9)
499 };
500
501 enum {
502         CMP_NODEFLAG_BLUR_VARIABLE_SIZE = (1 << 0)
503 };
504
505 typedef struct NodeFrame {
506         short flag;
507         short label_size;
508 } NodeFrame;
509
510 /* this one has been replaced with ImageUser, keep it for do_versions() */
511 typedef struct NodeImageAnim {
512         int frames   DNA_DEPRECATED;
513         int sfra     DNA_DEPRECATED;
514         int nr       DNA_DEPRECATED;
515         char cyclic  DNA_DEPRECATED;
516         char movie   DNA_DEPRECATED;
517         short pad;
518 } NodeImageAnim;
519
520 typedef struct ColorCorrectionData {
521         float saturation;
522         float contrast;
523         float gamma;
524         float gain;
525         float lift;
526         int pad;
527 } ColorCorrectionData;
528
529 typedef struct NodeColorCorrection {
530         ColorCorrectionData master;
531         ColorCorrectionData shadows;
532         ColorCorrectionData midtones;
533         ColorCorrectionData highlights;
534         float startmidtones;
535         float endmidtones;
536 } NodeColorCorrection;
537
538 typedef struct NodeBokehImage {
539         float angle;
540         int flaps;
541         float rounding;
542         float catadioptric;
543         float lensshift;
544 } NodeBokehImage;
545
546 typedef struct NodeBoxMask {
547         float x;
548         float y;
549         float rotation;
550         float height;
551         float width;
552         int pad;
553 } NodeBoxMask;
554
555 typedef struct NodeEllipseMask {
556         float x;
557         float y;
558         float rotation;
559         float height;
560         float width;
561         int pad;
562 } NodeEllipseMask;
563
564 /* layer info for image node outputs */
565 typedef struct NodeImageLayer {
566         /* index in the Image->layers->passes lists */
567         int pass_index;
568         /* render pass flag, in case this is an original render pass */
569         int pass_flag;
570 } NodeImageLayer;
571
572 typedef struct NodeBlurData {
573         short sizex, sizey;
574         short samples, maxspeed, minspeed, relative, aspect;
575         short curved;
576         float fac, percentx, percenty;
577         short filtertype;
578         char bokeh, gamma;
579         int image_in_width, image_in_height; /* needed for absolute/relative conversions */
580 } NodeBlurData;
581
582 typedef struct NodeDBlurData {
583         float center_x, center_y, distance, angle, spin, zoom;
584         short iter;
585         char wrap, pad;
586 } NodeDBlurData;
587
588 typedef struct NodeBilateralBlurData {
589         float sigma_color, sigma_space;
590         short iter, pad;
591 } NodeBilateralBlurData;
592
593 typedef struct NodeHueSat {
594         float hue, sat, val;
595 } NodeHueSat;
596
597 typedef struct NodeImageFile {
598         char name[1024]; /* 1024 = FILE_MAX */
599         struct ImageFormatData im_format;
600         int sfra, efra;
601 } NodeImageFile;
602
603 /* XXX first struct fields should match NodeImageFile to ensure forward compatibility */
604 typedef struct NodeImageMultiFile {
605         char base_path[1024];   /* 1024 = FILE_MAX */
606         ImageFormatData format;
607         int sfra DNA_DEPRECATED, efra DNA_DEPRECATED;   /* XXX old frame rand values from NodeImageFile for forward compatibility */
608         int active_input;               /* selected input in details view list */
609         int pad;
610 } NodeImageMultiFile;
611 typedef struct NodeImageMultiFileSocket {
612         /* single layer file output */
613         short use_render_format  DNA_DEPRECATED;
614         short use_node_format;  /* use overall node image format */
615         int pad1;
616         char path[1024];                /* 1024 = FILE_MAX */
617         ImageFormatData format;
618         
619         /* multilayer output */
620         char layer[30];         /* EXR_TOT_MAXNAME-2 ('.' and channel char are appended) */
621         char pad2[2];
622 } NodeImageMultiFileSocket;
623
624 typedef struct NodeChroma {
625         float t1, t2, t3;
626         float fsize, fstrength, falpha;
627         float key[4];
628         short algorithm, channel;
629 } NodeChroma;
630
631 typedef struct NodeTwoXYs {
632         short x1, x2, y1, y2;
633         float fac_x1, fac_x2, fac_y1, fac_y2;
634 } NodeTwoXYs;
635
636 typedef struct NodeTwoFloats {
637         float x, y;
638 } NodeTwoFloats;
639
640 typedef struct NodeGeometry {
641         char uvname[64];        /* MAX_CUSTOMDATA_LAYER_NAME */
642         char colname[64];
643 } NodeGeometry;
644
645 typedef struct NodeVertexCol {
646         char name[64];
647 } NodeVertexCol;
648
649 /* qdn: Defocus blur node */
650 typedef struct NodeDefocus {
651         char bktype, pad_c1, preview, gamco;
652         short samples, no_zbuf;
653         float fstop, maxblur, bthresh, scale;
654         float rotation, pad_f1;
655 } NodeDefocus;
656
657 typedef struct NodeScriptDict {
658         void *dict; /* for PyObject *dict */
659         void *node; /* for BPy_Node *node */
660 } NodeScriptDict;
661
662 /* qdn: glare node */
663 typedef struct NodeGlare {
664         char quality, type, iter;
665         char angle, pad_c1, size, pad[2];
666         float colmod, mix, threshold, fade;
667         float angle_ofs, pad_f1;
668 } NodeGlare;
669
670 /* qdn: tonemap node */
671 typedef struct NodeTonemap {
672         float key, offset, gamma;
673         float f, m, a, c;
674         int type;
675 } NodeTonemap;
676
677 /* qdn: lens distortion node */
678 typedef struct NodeLensDist {
679         short jit, proj, fit, pad;
680 } NodeLensDist;
681
682 typedef struct NodeColorBalance {
683         /* ASC CDL parameters */
684         float slope[3];
685         float offset[3];
686         float power[3];
687         
688         /* LGG parameters */
689         float lift[3];
690         float gamma[3];
691         float gain[3];
692 } NodeColorBalance;
693
694 typedef struct NodeColorspill {
695         short limchan, unspill;
696         float limscale;
697         float uspillr, uspillg, uspillb;
698 } NodeColorspill;
699
700 typedef struct NodeDilateErode {
701         char falloff;
702         char pad[7];
703 } NodeDilateErode;
704
705 typedef struct NodeMask {
706         int size_x, size_y;
707 } NodeMask;
708
709 typedef struct NodeTexBase {
710         TexMapping tex_mapping;
711         ColorMapping color_mapping;
712 } NodeTexBase;
713
714 typedef struct NodeTexSky {
715         NodeTexBase base;
716         int sky_model;
717         float sun_direction[3];
718         float turbidity;
719         float ground_albedo;
720 } NodeTexSky;
721
722 typedef struct NodeTexImage {
723         NodeTexBase base;
724         ImageUser iuser;
725         int color_space;
726         int projection;
727         float projection_blend;
728         int interpolation;
729 } NodeTexImage;
730
731 typedef struct NodeTexChecker {
732         NodeTexBase base;
733 } NodeTexChecker;
734
735 typedef struct NodeTexBrick {
736         NodeTexBase base;
737         int offset_freq, squash_freq;
738         float offset, squash;
739 } NodeTexBrick;
740
741 typedef struct NodeTexEnvironment {
742         NodeTexBase base;
743         ImageUser iuser;
744         int color_space;
745         int projection;
746 } NodeTexEnvironment;
747
748 typedef struct NodeTexGradient {
749         NodeTexBase base;
750         int gradient_type;
751         int pad;
752 } NodeTexGradient;
753
754 typedef struct NodeTexNoise {
755         NodeTexBase base;
756 } NodeTexNoise;
757
758 typedef struct NodeTexVoronoi {
759         NodeTexBase base;
760         int coloring;
761         int pad;
762 } NodeTexVoronoi;
763
764 typedef struct NodeTexMusgrave {
765         NodeTexBase base;
766         int musgrave_type;
767         int pad;
768 } NodeTexMusgrave;
769
770 typedef struct NodeTexWave {
771         NodeTexBase base;
772         int wave_type;
773         int pad;
774 } NodeTexWave;
775
776 typedef struct NodeTexMagic {
777         NodeTexBase base;
778         int depth;
779         int pad;
780 } NodeTexMagic;
781
782 typedef struct NodeShaderAttribute {
783         char name[64];
784 } NodeShaderAttribute;
785
786 typedef struct NodeShaderVectTransform {
787         int type;
788         int convert_from, convert_to;
789         int pad;
790 } NodeShaderVectTransform;
791
792 /* TEX_output */
793 typedef struct TexNodeOutput {
794         char name[64];
795 } TexNodeOutput;
796
797 typedef struct NodeKeyingScreenData {
798         char tracking_object[64];
799 } NodeKeyingScreenData;
800
801 typedef struct NodeKeyingData {
802         float screen_balance;
803         float despill_factor;
804         float despill_balance;
805         int edge_kernel_radius;
806         float edge_kernel_tolerance;
807         float clip_black, clip_white;
808         int dilate_distance;
809         int feather_distance;
810         int feather_falloff;
811         int blur_pre, blur_post;
812 } NodeKeyingData;
813
814 typedef struct NodeTrackPosData {
815         char tracking_object[64];
816         char track_name[64];
817 } NodeTrackPosData;
818
819 typedef struct NodeTranslateData {
820         char wrap_axis;
821         char relative;
822         char pad[6];
823 } NodeTranslateData;
824
825 typedef struct NodePlaneTrackDeformData {
826         char tracking_object[64];
827         char plane_track_name[64];
828 } NodePlaneTrackDeformData;
829
830 typedef struct NodeShaderScript {
831         int mode;
832         int flag;
833
834         char filepath[1024]; /* 1024 = FILE_MAX */
835
836         char bytecode_hash[64];
837         char *bytecode;
838 } NodeShaderScript;
839
840 typedef struct NodeShaderTangent {
841         int direction_type;
842         int axis;
843         char uv_map[64];
844 } NodeShaderTangent;
845
846 typedef struct NodeShaderNormalMap {
847         int space;
848         char uv_map[64];
849 } NodeShaderNormalMap;
850
851 typedef struct NodeShaderUVMap {
852         char uv_map[64];
853 } NodeShaderUVMap;
854
855 /* script node mode */
856 #define NODE_SCRIPT_INTERNAL            0
857 #define NODE_SCRIPT_EXTERNAL            1
858
859 /* script node flag */
860 #define NODE_SCRIPT_AUTO_UPDATE         1
861
862
863 /* frame node flags */
864 #define NODE_FRAME_SHRINK               1       /* keep the bounding box minimal */
865 #define NODE_FRAME_RESIZEABLE   2       /* test flag, if frame can be resized by user */
866
867 /* proxy node flags */
868 #define NODE_PROXY_AUTOTYPE                     1       /* automatically change output type based on link */
869
870 /* comp channel matte */
871 #define CMP_NODE_CHANNEL_MATTE_CS_RGB   1
872 #define CMP_NODE_CHANNEL_MATTE_CS_HSV   2
873 #define CMP_NODE_CHANNEL_MATTE_CS_YUV   3
874 #define CMP_NODE_CHANNEL_MATTE_CS_YCC   4
875
876 /* glossy distributions */
877 #define SHD_GLOSSY_BECKMANN                             0
878 #define SHD_GLOSSY_SHARP                                1
879 #define SHD_GLOSSY_GGX                                  2
880 #define SHD_GLOSSY_ASHIKHMIN_SHIRLEY    3
881
882 /* vector transform */
883 #define SHD_VECT_TRANSFORM_TYPE_VECTOR  0
884 #define SHD_VECT_TRANSFORM_TYPE_POINT   1
885 #define SHD_VECT_TRANSFORM_TYPE_NORMAL  2
886
887 #define SHD_VECT_TRANSFORM_SPACE_WORLD  0
888 #define SHD_VECT_TRANSFORM_SPACE_OBJECT 1
889 #define SHD_VECT_TRANSFORM_SPACE_CAMERA 2
890
891 /* toon modes */
892 #define SHD_TOON_DIFFUSE        0
893 #define SHD_TOON_GLOSSY         1
894
895 /* hair components */
896 #define SHD_HAIR_REFLECTION             0
897 #define SHD_HAIR_TRANSMISSION           1
898
899 /* blend texture */
900 #define SHD_BLEND_LINEAR                        0
901 #define SHD_BLEND_QUADRATIC                     1
902 #define SHD_BLEND_EASING                        2
903 #define SHD_BLEND_DIAGONAL                      3
904 #define SHD_BLEND_RADIAL                        4
905 #define SHD_BLEND_QUADRATIC_SPHERE      5
906 #define SHD_BLEND_SPHERICAL                     6
907
908 /* noise basis for textures */
909 #define SHD_NOISE_PERLIN                        0
910 #define SHD_NOISE_VORONOI_F1            1
911 #define SHD_NOISE_VORONOI_F2            2
912 #define SHD_NOISE_VORONOI_F3            3
913 #define SHD_NOISE_VORONOI_F4            4
914 #define SHD_NOISE_VORONOI_F2_F1         5
915 #define SHD_NOISE_VORONOI_CRACKLE       6
916 #define SHD_NOISE_CELL_NOISE            7
917
918 #define SHD_NOISE_SOFT  0
919 #define SHD_NOISE_HARD  1
920
921 /* voronoi texture */
922 #define SHD_VORONOI_DISTANCE_SQUARED    0
923 #define SHD_VORONOI_ACTUAL_DISTANCE             1
924 #define SHD_VORONOI_MANHATTAN                   2
925 #define SHD_VORONOI_CHEBYCHEV                   3
926 #define SHD_VORONOI_MINKOVSKY_H                 4
927 #define SHD_VORONOI_MINKOVSKY_4                 5
928 #define SHD_VORONOI_MINKOVSKY                   6
929
930 #define SHD_VORONOI_INTENSITY   0
931 #define SHD_VORONOI_CELLS               1
932
933 /* musgrave texture */
934 #define SHD_MUSGRAVE_MULTIFRACTAL                       0
935 #define SHD_MUSGRAVE_FBM                                        1
936 #define SHD_MUSGRAVE_HYBRID_MULTIFRACTAL        2
937 #define SHD_MUSGRAVE_RIDGED_MULTIFRACTAL        3
938 #define SHD_MUSGRAVE_HETERO_TERRAIN                     4
939
940 /* wave texture */
941 #define SHD_WAVE_BANDS          0
942 #define SHD_WAVE_RINGS          1
943
944 /* sky texture */
945 #define SHD_SKY_OLD             0
946 #define SHD_SKY_NEW             1
947
948 /* image/environment texture */
949 #define SHD_COLORSPACE_NONE             0
950 #define SHD_COLORSPACE_COLOR    1
951
952 /* environment texture */
953 #define SHD_PROJ_EQUIRECTANGULAR        0
954 #define SHD_PROJ_MIRROR_BALL            1
955
956 /* image texture */
957 #define SHD_PROJ_FLAT                           0
958 #define SHD_PROJ_BOX                            1
959
960 /* image texture interpolation */
961 #define SHD_INTERP_LINEAR               0
962 #define SHD_INTERP_CLOSEST              1
963 #define SHD_INTERP_CUBIC                        2
964 #define SHD_INTERP_SMART                        3
965
966 /* tangent */
967 #define SHD_TANGENT_RADIAL                      0
968 #define SHD_TANGENT_UVMAP                       1
969
970 /* tangent */
971 #define SHD_TANGENT_AXIS_X                      0
972 #define SHD_TANGENT_AXIS_Y                      1
973 #define SHD_TANGENT_AXIS_Z                      2
974
975 /* normal map space */
976 #define SHD_NORMAL_MAP_TANGENT                  0
977 #define SHD_NORMAL_MAP_OBJECT                   1
978 #define SHD_NORMAL_MAP_WORLD                    2
979 #define SHD_NORMAL_MAP_BLENDER_OBJECT   3
980 #define SHD_NORMAL_MAP_BLENDER_WORLD    4
981
982 /* subsurface */
983 enum {
984         SHD_SUBSURFACE_COMPATIBLE               = 0, // Deprecated
985         SHD_SUBSURFACE_CUBIC                    = 1,
986         SHD_SUBSURFACE_GAUSSIAN                 = 2,
987 };
988
989 #if (DNA_DEPRECATED_GCC_POISON == 1)
990 #pragma GCC poison SHD_SUBSURFACE_COMPATIBLE
991 #endif
992
993 /* blur node */
994 #define CMP_NODE_BLUR_ASPECT_NONE               0
995 #define CMP_NODE_BLUR_ASPECT_Y                  1
996 #define CMP_NODE_BLUR_ASPECT_X                  2
997
998 /* wrapping */
999 #define CMP_NODE_WRAP_NONE              0
1000 #define CMP_NODE_WRAP_X                 1
1001 #define CMP_NODE_WRAP_Y                 2
1002 #define CMP_NODE_WRAP_XY                3
1003
1004 #define CMP_NODE_MASK_MBLUR_SAMPLES_MAX 64
1005
1006 /* geometry output socket defines */
1007 #define GEOM_OUT_GLOB   0
1008 #define GEOM_OUT_LOCAL  1
1009 #define GEOM_OUT_VIEW   2
1010 #define GEOM_OUT_ORCO   3
1011 #define GEOM_OUT_UV             4
1012 #define GEOM_OUT_NORMAL 5
1013 #define GEOM_OUT_VCOL   6
1014 #define GEOM_OUT_VCOL_ALPHA     7
1015 #define GEOM_OUT_FRONTBACK      8
1016
1017 /* material input socket defines */
1018 #define MAT_IN_COLOR    0
1019 #define MAT_IN_SPEC             1
1020 #define MAT_IN_REFL             2
1021 #define MAT_IN_NORMAL   3
1022 #define MAT_IN_MIR              4
1023 #define MAT_IN_AMB              5
1024 #define MAT_IN_EMIT     6
1025 #define MAT_IN_SPECTRA  7
1026 #define MAT_IN_RAY_MIRROR       8
1027 #define MAT_IN_ALPHA    9
1028 #define MAT_IN_TRANSLUCENCY     10
1029 #define NUM_MAT_IN              11      /* for array size */
1030
1031 /* material output socket defines */
1032 #define MAT_OUT_COLOR           0
1033 #define MAT_OUT_ALPHA           1
1034 #define MAT_OUT_NORMAL  2
1035 #define MAT_OUT_DIFFUSE 3
1036 #define MAT_OUT_SPEC            4
1037 #define MAT_OUT_AO              5
1038
1039 /* image */
1040 #define CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT      1
1041
1042 /* viewer and cmposite output */
1043 #define CMP_NODE_OUTPUT_IGNORE_ALPHA            1
1044
1045 #endif