Cleanup: pep8
[blender.git] / source / blender / makesdna / DNA_node_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_NODE_TYPES_H__
25 #define __DNA_NODE_TYPES_H__
26
27 #include "DNA_ID.h"
28 #include "DNA_vec_types.h"
29 #include "DNA_listBase.h"
30 #include "DNA_texture_types.h"
31 #include "DNA_scene_types.h"
32
33 struct AnimData;
34 struct ID;
35 struct Image;
36 struct ListBase;
37 struct bGPdata;
38 struct bNodeInstanceHash;
39 struct bNodeLink;
40 struct bNodePreview;
41 struct bNodeTreeExec;
42 struct bNodeType;
43 struct uiBlock;
44
45 #define NODE_MAXSTR 64
46
47 typedef struct bNodeStack {
48   float vec[4];
49   float min, max;
50   void *data;
51   /** When input has link, tagged before executing. */
52   short hasinput;
53   /** When output is linked, tagged before executing. */
54   short hasoutput;
55   /** Type of data pointer. */
56   short datatype;
57   /** Type of socket stack comes from, to remap linking different sockets. */
58   short sockettype;
59   /** Data is a copy of external data (no freeing). */
60   short is_copy;
61   /** Data is used by external nodes (no freeing). */
62   short external;
63   char _pad[4];
64 } bNodeStack;
65
66 /* ns->datatype, shadetree only */
67 #define NS_OSA_VECTORS 1
68 #define NS_OSA_VALUES 2
69
70 /* node socket/node socket type -b conversion rules */
71 #define NS_CR_CENTER 0
72 #define NS_CR_NONE 1
73 #define NS_CR_FIT_WIDTH 2
74 #define NS_CR_FIT_HEIGHT 3
75 #define NS_CR_FIT 4
76 #define NS_CR_STRETCH 5
77
78 typedef struct bNodeSocket {
79   struct bNodeSocket *next, *prev, *new_sock;
80
81   /** User-defined properties. */
82   IDProperty *prop;
83
84   /** Unique identifier for mapping. */
85   char identifier[64];
86
87   /** MAX_NAME. */
88   char name[64];
89
90   /* XXX deprecated, only used for the Image and OutputFile nodes,
91    * should be removed at some point.
92    */
93   /** Custom storage. */
94   void *storage;
95
96   short type, flag;
97   /** Max. number of links. */
98   short limit;
99   /** Input/output type. */
100   short in_out;
101   /** Runtime type information. */
102   struct bNodeSocketType *typeinfo;
103   /** Runtime type identifier. */
104   char idname[64];
105
106   float locx, locy;
107
108   /** Default input value used for unlinked sockets. */
109   void *default_value;
110
111   /* execution data */
112   /** Local stack index. */
113   short stack_index;
114   /* XXX deprecated, kept for forward compatibility */
115   short stack_type DNA_DEPRECATED;
116   char display_shape;
117   char _pad[3];
118
119   /** Cached data from execution. */
120   void *cache;
121
122   /* internal data to retrieve relations and groups
123    * DEPRECATED, now uses the generic identifier string instead
124    */
125   /** Group socket identifiers, to find matching pairs after reading files. */
126   int own_index DNA_DEPRECATED;
127   /* XXX deprecated, only used for restoring old group node links */
128   int to_index DNA_DEPRECATED;
129   /* XXX deprecated, still forward compatible since verification
130    * restores pointer from matching own_index. */
131   struct bNodeSocket *groupsock DNA_DEPRECATED;
132
133   /** A link pointer, set in ntreeUpdateTree. */
134   struct bNodeLink *link;
135
136   /* XXX deprecated, socket input values are stored in default_value now.
137    * kept for forward compatibility */
138   /** Custom data for inputs, only UI writes in this. */
139   bNodeStack ns DNA_DEPRECATED;
140 } bNodeSocket;
141
142 /* sock->type */
143 typedef enum eNodeSocketDatatype {
144   SOCK_CUSTOM = -1, /* socket has no integer type */
145   SOCK_FLOAT = 0,
146   SOCK_VECTOR = 1,
147   SOCK_RGBA = 2,
148   SOCK_SHADER = 3,
149   SOCK_BOOLEAN = 4,
150   __SOCK_MESH = 5, /* deprecated */
151   SOCK_INT = 6,
152   SOCK_STRING = 7,
153 } eNodeSocketDatatype;
154
155 /* socket shape */
156 typedef enum eNodeSocketDisplayShape {
157   SOCK_DISPLAY_SHAPE_CIRCLE = 0,
158   SOCK_DISPLAY_SHAPE_SQUARE = 1,
159   SOCK_DISPLAY_SHAPE_DIAMOND = 2,
160   SOCK_DISPLAY_SHAPE_CIRCLE_DOT = 3,
161   SOCK_DISPLAY_SHAPE_SQUARE_DOT = 4,
162   SOCK_DISPLAY_SHAPE_DIAMOND_DOT = 5,
163 } eNodeSocketDisplayShape;
164
165 /* socket side (input/output) */
166 typedef enum eNodeSocketInOut {
167   SOCK_IN = 1 << 0,
168   SOCK_OUT = 1 << 1,
169 } eNodeSocketInOut;
170
171 /* sock->flag, first bit is select */
172 typedef enum eNodeSocketFlag {
173   /** hidden is user defined, to hide unused */
174   SOCK_HIDDEN = (1 << 1),
175   /** for quick check if socket is linked */
176   SOCK_IN_USE = (1 << 2),
177   /** unavailable is for dynamic sockets */
178   SOCK_UNAVAIL = (1 << 3),
179   // /** DEPRECATED  dynamic socket (can be modified by user) */
180   // SOCK_DYNAMIC = (1 << 4),
181   // /** DEPRECATED  group socket should not be exposed */
182   // SOCK_INTERNAL = (1 << 5),
183   /** socket collapsed in UI */
184   SOCK_COLLAPSED = (1 << 6),
185   /** hide socket value, if it gets auto default */
186   SOCK_HIDE_VALUE = (1 << 7),
187   /** socket hidden automatically, to distinguish from manually hidden */
188   SOCK_AUTO_HIDDEN__DEPRECATED = (1 << 8),
189   SOCK_NO_INTERNAL_LINK = (1 << 9),
190   /** Draw socket in a more compact form. */
191   SOCK_COMPACT = (1 << 10),
192 } eNodeSocketFlag;
193
194 /* limit data in bNode to what we want to see saved? */
195 typedef struct bNode {
196   struct bNode *next, *prev, *new_node;
197
198   /** User-defined properties. */
199   IDProperty *prop;
200
201   /** Runtime type information. */
202   struct bNodeType *typeinfo;
203   /** Runtime type identifier. */
204   char idname[64];
205
206   /** MAX_NAME. */
207   char name[64];
208   int flag;
209   short type;
210   char _pad[2];
211   /** Both for dependency and sorting. */
212   short done, level;
213   /** Lasty: check preview render status, menunr: browse ID blocks. */
214   short lasty, menunr;
215   /** For groupnode, offset in global caller stack. */
216   short stack_index;
217   /** Number of this node in list, used for UI exec events. */
218   short nr;
219   /** Custom user-defined color. */
220   float color[3];
221
222   ListBase inputs, outputs;
223   /** Parent node. */
224   struct bNode *parent;
225   /** Optional link to libdata. */
226   struct ID *id;
227   /** Custom data, must be struct, for storage in file. */
228   void *storage;
229   /** The original node in the tree (for localized tree). */
230   struct bNode *original;
231   /** List of cached internal links (input to output), for muted nodes and operators. */
232   ListBase internal_links;
233
234   /** Root offset for drawing (parent space). */
235   float locx, locy;
236   /** Node custom width and height. */
237   float width, height;
238   /** Node width if hidden. */
239   float miniwidth;
240   /** Additional offset from loc. */
241   float offsetx, offsety;
242   /** Initial locx for insert offset animation. */
243   float anim_init_locx;
244   /** Offset that will be added to locx for insert offset animation. */
245   float anim_ofsx;
246
247   /** Update flags. */
248   int update;
249
250   /** Custom user-defined label, MAX_NAME. */
251   char label[64];
252   /** To be abused for buttons. */
253   short custom1, custom2;
254   float custom3, custom4;
255
256   /** Need_exec is set as UI execution event, exec is flag during exec. */
257   short need_exec, exec;
258   /** Optional extra storage for use in thread (read only then!). */
259   void *threaddata;
260   /** Entire boundbox (worldspace). */
261   rctf totr;
262   /** Optional buttons area. */
263   rctf butr;
264   /** Optional preview area. */
265   rctf prvr;
266   /**
267    * XXX TODO
268    * Node totr size depends on the prvr size, which in turn is determined from preview size.
269    * In earlier versions bNodePreview was stored directly in nodes, but since now there can be
270    * multiple instances using different preview images it is possible that required node size
271    * varies between instances. preview_xsize, preview_ysize defines a common reserved size for
272    * preview rect for now, could be replaced by more accurate node instance drawing,
273    * but that requires removing totr from DNA and replacing all uses with per-instance data.
274    */
275   /** Reserved size of the preview rect. */
276   short preview_xsize, preview_ysize;
277   /** Used at runtime when going through the tree. Initialize before use. */
278   short tmp_flag;
279   /** Used at runtime to tag derivatives branches. EEVEE only. */
280   char branch_tag;
281   /** Used at runtime when iterating over node branches. */
282   char iter_flag;
283   /** Runtime during drawing. */
284   struct uiBlock *block;
285
286   /**
287    * XXX: eevee only, id of screen space reflection layer,
288    * needs to be a float to feed GPU_uniform.
289    */
290   float ssr_id;
291   /**
292    * XXX: eevee only, id of screen subsurface scatter layer,
293    * needs to be a float to feed GPU_uniform.
294    */
295   float sss_id;
296 } bNode;
297
298 /* node->flag */
299 #define NODE_SELECT 1
300 #define NODE_OPTIONS 2
301 #define NODE_PREVIEW 4
302 #define NODE_HIDDEN 8
303 #define NODE_ACTIVE 16
304 #define NODE_ACTIVE_ID 32
305 #define NODE_DO_OUTPUT 64
306 #define __NODE_GROUP_EDIT 128 /* DEPRECATED */
307 /* free test flag, undefined */
308 #define NODE_TEST 256
309 /* node is disabled */
310 #define NODE_MUTED 512
311 // #define NODE_CUSTOM_NAME 1024    /* deprecated! */
312 /* group node types: use const outputs by default */
313 #define NODE_CONST_OUTPUT (1 << 11)
314 /* node is always behind others */
315 #define NODE_BACKGROUND (1 << 12)
316 /* automatic flag for nodes included in transforms */
317 #define NODE_TRANSFORM (1 << 13)
318 /* node is active texture */
319
320 /* note: take care with this flag since its possible it gets
321  * `stuck` inside/outside the active group - which makes buttons
322  * window texture not update, we try to avoid it by clearing the
323  * flag when toggling group editing - Campbell */
324 #define NODE_ACTIVE_TEXTURE (1 << 14)
325 /* use a custom color for the node */
326 #define NODE_CUSTOM_COLOR (1 << 15)
327 /* Node has been initialized
328  * This flag indicates the node->typeinfo->init function has been called.
329  * In case of undefined type at creation time this can be delayed until
330  * until the node type is registered.
331  */
332 #define NODE_INIT (1 << 16)
333
334 /* do recalc of output, used to skip recalculation of unwanted
335  * composite out nodes when editing tree
336  */
337 #define NODE_DO_OUTPUT_RECALC (1 << 17)
338
339 /* node->update */
340 /* XXX NODE_UPDATE is a generic update flag. More fine-grained updates
341  * might be used in the future, but currently all work the same way.
342  */
343 #define NODE_UPDATE 0xFFFF     /* generic update flag (includes all others) */
344 #define NODE_UPDATE_ID 1       /* associated id data block has changed */
345 #define NODE_UPDATE_OPERATOR 2 /* node update triggered from update operator */
346
347 /* Unique hash key for identifying node instances
348  * Defined as a struct because DNA does not support other typedefs.
349  */
350 typedef struct bNodeInstanceKey {
351   unsigned int value;
352 } bNodeInstanceKey;
353
354 /* Base struct for entries in node instance hash.
355  * WARNING: pointers are cast to this struct internally,
356  * it must be first member in hash entry structs!
357  */
358 #
359 #
360 typedef struct bNodeInstanceHashEntry {
361   bNodeInstanceKey key;
362
363   /* tags for cleaning the cache */
364   short tag;
365 } bNodeInstanceHashEntry;
366
367 #
368 #
369 typedef struct bNodePreview {
370   /** Must be first. */
371   bNodeInstanceHashEntry hash_entry;
372
373   unsigned char *rect;
374   short xsize, ysize;
375 } bNodePreview;
376
377 typedef struct bNodeLink {
378   struct bNodeLink *next, *prev;
379
380   bNode *fromnode, *tonode;
381   bNodeSocket *fromsock, *tosock;
382
383   int flag;
384   char _pad[4];
385 } bNodeLink;
386
387 /* link->flag */
388 #define NODE_LINKFLAG_HILITE (1 << 0) /* link has been successfully validated */
389 #define NODE_LINK_VALID (1 << 1)
390 #define NODE_LINK_TEST (1 << 2) /* free test flag, undefined */
391
392 /* tree->edit_quality/tree->render_quality */
393 #define NTREE_QUALITY_HIGH 0
394 #define NTREE_QUALITY_MEDIUM 1
395 #define NTREE_QUALITY_LOW 2
396
397 /* tree->chunksize */
398 #define NTREE_CHUNKSIZE_32 32
399 #define NTREE_CHUNKSIZE_64 64
400 #define NTREE_CHUNKSIZE_128 128
401 #define NTREE_CHUNKSIZE_256 256
402 #define NTREE_CHUNKSIZE_512 512
403 #define NTREE_CHUNKSIZE_1024 1024
404
405 /* the basis for a Node tree, all links and nodes reside internal here */
406 /* only re-usable node trees are in the library though,
407  * materials and textures allocate own tree struct */
408 typedef struct bNodeTree {
409   ID id;
410   /** Animation data (must be immediately after id for utilities to use it). */
411   struct AnimData *adt;
412
413   /** Runtime type information. */
414   struct bNodeTreeType *typeinfo;
415   /** Runtime type identifier. */
416   char idname[64];
417
418   /** Runtime RNA type of the group interface. */
419   struct StructRNA *interface_type;
420
421   /** Grease pencil data. */
422   struct bGPdata *gpd;
423   /** Node tree stores own offset for consistent editor view. */
424   float view_center[2];
425
426   ListBase nodes, links;
427
428   /** Set init on fileread. */
429   int type, init;
430   /**
431    * Sockets in groups have unique identifiers, adding new sockets always
432    * will increase this counter.
433    */
434   int cur_index;
435   int flag;
436   /** Update flags. */
437   int update;
438   /** Flag to prevent re-entrant update calls. */
439   short is_updating;
440   /** Generic temporary flag for recursion check (DFS/BFS). */
441   short done;
442   char _pad2[4];
443
444   /** Specific node type this tree is used for. */
445   int nodetype DNA_DEPRECATED;
446
447   /** Quality setting when editing. */
448   short edit_quality;
449   /** Quality setting when rendering. */
450   short render_quality;
451   /** Tile size for compositor engine. */
452   int chunksize;
453
454   rctf viewer_border;
455
456   /* Lists of bNodeSocket to hold default values and own_index.
457    * Warning! Don't make links to these sockets, input/output nodes are used for that.
458    * These sockets are used only for generating external interfaces.
459    */
460   ListBase inputs, outputs;
461
462   /* Node preview hash table
463    * Only available in base node trees (e.g. scene->node_tree)
464    */
465   struct bNodeInstanceHash *previews;
466   /* Defines the node tree instance to use for the "active" context,
467    * in case multiple different editors are used and make context ambiguous.
468    */
469   bNodeInstanceKey active_viewer_key;
470   char _pad[4];
471
472   /** Execution data.
473    *
474    * XXX It would be preferable to completely move this data out of the underlying node tree,
475    * so node tree execution could finally run independent of the tree itself.
476    * This would allow node trees to be merely linked by other data (materials, textures, etc.),
477    * as ID data is supposed to.
478    * Execution data is generated from the tree once at execution start and can then be used
479    * as long as necessary, even while the tree is being modified.
480    */
481   struct bNodeTreeExec *execdata;
482
483   /* callbacks */
484   void (*progress)(void *, float progress);
485   /** \warning may be called by different threads */
486   void (*stats_draw)(void *, const char *str);
487   int (*test_break)(void *);
488   void (*update_draw)(void *);
489   void *tbh, *prh, *sdh, *udh;
490 } bNodeTree;
491
492 /* ntree->type, index */
493 #define NTREE_CUSTOM -1 /* for dynamically registered custom types */
494 #define NTREE_SHADER 0
495 #define NTREE_COMPOSIT 1
496 #define NTREE_TEXTURE 2
497
498 /* ntree->init, flag */
499 #define NTREE_TYPE_INIT 1
500
501 /* ntree->flag */
502 #define NTREE_DS_EXPAND (1 << 0)            /* for animation editors */
503 #define NTREE_COM_OPENCL (1 << 1)           /* use opencl */
504 #define NTREE_TWO_PASS (1 << 2)             /* two pass */
505 #define NTREE_COM_GROUPNODE_BUFFER (1 << 3) /* use groupnode buffers */
506 #define NTREE_VIEWER_BORDER (1 << 4)        /* use a border for viewer nodes */
507 /* NOTE: DEPRECATED, use (id->tag & LIB_TAG_LOCALIZED) instead. */
508
509 /* tree is localized copy, free when deleting node groups */
510 /* #define NTREE_IS_LOCALIZED           (1 << 5) */
511
512 /* ntree->update */
513 typedef enum eNodeTreeUpdate {
514   NTREE_UPDATE = 0xFFFF,             /* generic update flag (includes all others) */
515   NTREE_UPDATE_LINKS = (1 << 0),     /* links have been added or removed */
516   NTREE_UPDATE_NODES = (1 << 1),     /* nodes or sockets have been added or removed */
517   NTREE_UPDATE_GROUP_IN = (1 << 4),  /* group inputs have changed */
518   NTREE_UPDATE_GROUP_OUT = (1 << 5), /* group outputs have changed */
519   /* group has changed (generic flag including all other group flags) */
520   NTREE_UPDATE_GROUP = (NTREE_UPDATE_GROUP_IN | NTREE_UPDATE_GROUP_OUT),
521 } eNodeTreeUpdate;
522
523 /* socket value structs for input buttons
524  * DEPRECATED now using ID properties
525  */
526
527 typedef struct bNodeSocketValueInt {
528   /** RNA subtype. */
529   int subtype;
530   int value;
531   int min, max;
532 } bNodeSocketValueInt;
533
534 typedef struct bNodeSocketValueFloat {
535   /** RNA subtype. */
536   int subtype;
537   float value;
538   float min, max;
539 } bNodeSocketValueFloat;
540
541 typedef struct bNodeSocketValueBoolean {
542   char value;
543   char _pad[3];
544 } bNodeSocketValueBoolean;
545
546 typedef struct bNodeSocketValueVector {
547   /** RNA subtype. */
548   int subtype;
549   float value[3];
550   float min, max;
551 } bNodeSocketValueVector;
552
553 typedef struct bNodeSocketValueRGBA {
554   float value[4];
555 } bNodeSocketValueRGBA;
556
557 typedef struct bNodeSocketValueString {
558   int subtype;
559   char _pad[4];
560   /** 1024 = FILEMAX. */
561   char value[1024];
562 } bNodeSocketValueString;
563
564 /* data structs, for node->storage */
565 enum {
566   CMP_NODE_MASKTYPE_ADD = 0,
567   CMP_NODE_MASKTYPE_SUBTRACT = 1,
568   CMP_NODE_MASKTYPE_MULTIPLY = 2,
569   CMP_NODE_MASKTYPE_NOT = 3,
570 };
571
572 enum {
573   CMP_NODE_LENSFLARE_GHOST = (1 << 0),
574   CMP_NODE_LENSFLARE_GLOW = (1 << 1),
575   CMP_NODE_LENSFLARE_CIRCLE = (1 << 2),
576   CMP_NODE_LENSFLARE_STREAKS = (1 << 3),
577 };
578
579 enum {
580   CMP_NODE_DILATEERODE_STEP = 0,
581   CMP_NODE_DILATEERODE_DISTANCE_THRESH = 1,
582   CMP_NODE_DILATEERODE_DISTANCE = 2,
583   CMP_NODE_DILATEERODE_DISTANCE_FEATHER = 3,
584 };
585
586 enum {
587   CMP_NODE_INPAINT_SIMPLE = 0,
588 };
589
590 enum {
591   /* CMP_NODEFLAG_MASK_AA          = (1 << 0), */ /* DEPRECATED */
592   CMP_NODEFLAG_MASK_NO_FEATHER = (1 << 1),
593   CMP_NODEFLAG_MASK_MOTION_BLUR = (1 << 2),
594
595   /* we may want multiple aspect options, exposed as an rna enum */
596   CMP_NODEFLAG_MASK_FIXED = (1 << 8),
597   CMP_NODEFLAG_MASK_FIXED_SCENE = (1 << 9),
598 };
599
600 enum {
601   CMP_NODEFLAG_BLUR_VARIABLE_SIZE = (1 << 0),
602   CMP_NODEFLAG_BLUR_EXTEND_BOUNDS = (1 << 1),
603 };
604
605 typedef struct NodeFrame {
606   short flag;
607   short label_size;
608 } NodeFrame;
609
610 /* this one has been replaced with ImageUser, keep it for do_versions() */
611 typedef struct NodeImageAnim {
612   int frames DNA_DEPRECATED;
613   int sfra DNA_DEPRECATED;
614   int nr DNA_DEPRECATED;
615   char cyclic DNA_DEPRECATED;
616   char movie DNA_DEPRECATED;
617   char _pad[2];
618 } NodeImageAnim;
619
620 typedef struct ColorCorrectionData {
621   float saturation;
622   float contrast;
623   float gamma;
624   float gain;
625   float lift;
626   char _pad[4];
627 } ColorCorrectionData;
628
629 typedef struct NodeColorCorrection {
630   ColorCorrectionData master;
631   ColorCorrectionData shadows;
632   ColorCorrectionData midtones;
633   ColorCorrectionData highlights;
634   float startmidtones;
635   float endmidtones;
636 } NodeColorCorrection;
637
638 typedef struct NodeBokehImage {
639   float angle;
640   int flaps;
641   float rounding;
642   float catadioptric;
643   float lensshift;
644 } NodeBokehImage;
645
646 typedef struct NodeBoxMask {
647   float x;
648   float y;
649   float rotation;
650   float height;
651   float width;
652   char _pad[4];
653 } NodeBoxMask;
654
655 typedef struct NodeEllipseMask {
656   float x;
657   float y;
658   float rotation;
659   float height;
660   float width;
661   char _pad[4];
662 } NodeEllipseMask;
663
664 /* layer info for image node outputs */
665 typedef struct NodeImageLayer {
666   /* index in the Image->layers->passes lists */
667   int pass_index DNA_DEPRECATED;
668   /* render pass name */
669   /** Amount defined in openexr_multi.h. */
670   char pass_name[64];
671 } NodeImageLayer;
672
673 typedef struct NodeBlurData {
674   short sizex, sizey;
675   short samples, maxspeed, minspeed, relative, aspect;
676   short curved;
677   float fac, percentx, percenty;
678   short filtertype;
679   char bokeh, gamma;
680   /** Needed for absolute/relative conversions. */
681   int image_in_width, image_in_height;
682 } NodeBlurData;
683
684 typedef struct NodeDBlurData {
685   float center_x, center_y, distance, angle, spin, zoom;
686   short iter;
687   char wrap, _pad;
688 } NodeDBlurData;
689
690 typedef struct NodeBilateralBlurData {
691   float sigma_color, sigma_space;
692   short iter;
693   char _pad[2];
694 } NodeBilateralBlurData;
695
696 /* NOTE: Only for do-version code. */
697 typedef struct NodeHueSat {
698   float hue, sat, val;
699 } NodeHueSat;
700
701 typedef struct NodeImageFile {
702   /** 1024 = FILE_MAX. */
703   char name[1024];
704   struct ImageFormatData im_format;
705   int sfra, efra;
706 } NodeImageFile;
707
708 /* XXX first struct fields should match NodeImageFile to ensure forward compatibility */
709 typedef struct NodeImageMultiFile {
710   /** 1024 = FILE_MAX. */
711   char base_path[1024];
712   ImageFormatData format;
713   /** XXX old frame rand values from NodeImageFile for forward compatibility. */
714   int sfra DNA_DEPRECATED, efra DNA_DEPRECATED;
715   /** Selected input in details view list. */
716   int active_input;
717   char _pad[4];
718 } NodeImageMultiFile;
719 typedef struct NodeImageMultiFileSocket {
720   /* single layer file output */
721   short use_render_format DNA_DEPRECATED;
722   /** Use overall node image format. */
723   short use_node_format;
724   char _pad1[4];
725   /** 1024 = FILE_MAX. */
726   char path[1024];
727   ImageFormatData format;
728
729   /* multilayer output */
730   /** EXR_TOT_MAXNAME-2 ('.' and channel char are appended). */
731   char layer[30];
732   char _pad2[2];
733 } NodeImageMultiFileSocket;
734
735 typedef struct NodeChroma {
736   float t1, t2, t3;
737   float fsize, fstrength, falpha;
738   float key[4];
739   short algorithm, channel;
740 } NodeChroma;
741
742 typedef struct NodeTwoXYs {
743   short x1, x2, y1, y2;
744   float fac_x1, fac_x2, fac_y1, fac_y2;
745 } NodeTwoXYs;
746
747 typedef struct NodeTwoFloats {
748   float x, y;
749 } NodeTwoFloats;
750
751 typedef struct NodeVertexCol {
752   char name[64];
753 } NodeVertexCol;
754
755 /* qdn: Defocus blur node */
756 typedef struct NodeDefocus {
757   char bktype, _pad0, preview, gamco;
758   short samples, no_zbuf;
759   float fstop, maxblur, bthresh, scale;
760   float rotation;
761   char _pad1[4];
762 } NodeDefocus;
763
764 typedef struct NodeScriptDict {
765   /** For PyObject *dict. */
766   void *dict;
767   /** For BPy_Node *node. */
768   void *node;
769 } NodeScriptDict;
770
771 /* qdn: glare node */
772 typedef struct NodeGlare {
773   char quality, type, iter;
774   /* XXX angle is only kept for backward/forward compatibility,
775    * was used for two different things, see T50736. */
776   char angle DNA_DEPRECATED, _pad0, size, star_45, streaks;
777   float colmod, mix, threshold, fade;
778   float angle_ofs;
779   char _pad1[4];
780 } NodeGlare;
781
782 /* qdn: tonemap node */
783 typedef struct NodeTonemap {
784   float key, offset, gamma;
785   float f, m, a, c;
786   int type;
787 } NodeTonemap;
788
789 /* qdn: lens distortion node */
790 typedef struct NodeLensDist {
791   short jit, proj, fit;
792   char _pad[2];
793 } NodeLensDist;
794
795 typedef struct NodeColorBalance {
796   /* ASC CDL parameters */
797   float slope[3];
798   float offset[3];
799   float power[3];
800   float offset_basis;
801   char _pad[4];
802
803   /* LGG parameters */
804   float lift[3];
805   float gamma[3];
806   float gain[3];
807 } NodeColorBalance;
808
809 typedef struct NodeColorspill {
810   short limchan, unspill;
811   float limscale;
812   float uspillr, uspillg, uspillb;
813 } NodeColorspill;
814
815 typedef struct NodeDilateErode {
816   char falloff;
817   char _pad[7];
818 } NodeDilateErode;
819
820 typedef struct NodeMask {
821   int size_x, size_y;
822 } NodeMask;
823
824 typedef struct NodeTexBase {
825   TexMapping tex_mapping;
826   ColorMapping color_mapping;
827 } NodeTexBase;
828
829 typedef struct NodeTexSky {
830   NodeTexBase base;
831   int sky_model;
832   float sun_direction[3];
833   float turbidity;
834   float ground_albedo;
835 } NodeTexSky;
836
837 typedef struct NodeTexImage {
838   NodeTexBase base;
839   ImageUser iuser;
840   int color_space DNA_DEPRECATED;
841   int projection;
842   float projection_blend;
843   int interpolation;
844   int extension;
845   char _pad[4];
846 } NodeTexImage;
847
848 typedef struct NodeTexChecker {
849   NodeTexBase base;
850 } NodeTexChecker;
851
852 typedef struct NodeTexBrick {
853   NodeTexBase base;
854   int offset_freq, squash_freq;
855   float offset, squash;
856 } NodeTexBrick;
857
858 typedef struct NodeTexEnvironment {
859   NodeTexBase base;
860   ImageUser iuser;
861   int color_space DNA_DEPRECATED;
862   int projection;
863   int interpolation;
864   char _pad[4];
865 } NodeTexEnvironment;
866
867 typedef struct NodeTexGradient {
868   NodeTexBase base;
869   int gradient_type;
870   char _pad[4];
871 } NodeTexGradient;
872
873 typedef struct NodeTexNoise {
874   NodeTexBase base;
875   int dimensions;
876   char _pad[4];
877 } NodeTexNoise;
878
879 typedef struct NodeTexVoronoi {
880   NodeTexBase base;
881   int dimensions;
882   int feature;
883   int distance;
884   int coloring DNA_DEPRECATED;
885 } NodeTexVoronoi;
886
887 typedef struct NodeTexMusgrave {
888   NodeTexBase base;
889   int musgrave_type;
890   int dimensions;
891 } NodeTexMusgrave;
892
893 typedef struct NodeTexWave {
894   NodeTexBase base;
895   int wave_type;
896   int wave_profile;
897 } NodeTexWave;
898
899 typedef struct NodeTexMagic {
900   NodeTexBase base;
901   int depth;
902   char _pad[4];
903 } NodeTexMagic;
904
905 typedef struct NodeShaderAttribute {
906   char name[64];
907 } NodeShaderAttribute;
908
909 typedef struct NodeShaderVectTransform {
910   int type;
911   int convert_from, convert_to;
912   char _pad[4];
913 } NodeShaderVectTransform;
914
915 typedef struct NodeShaderTexPointDensity {
916   NodeTexBase base;
917   short point_source;
918   char _pad[2];
919   int particle_system;
920   float radius;
921   int resolution;
922   short space;
923   short interpolation;
924   short color_source;
925   short ob_color_source;
926   /** Vertex attribute layer for color source, MAX_CUSTOMDATA_LAYER_NAME. */
927   char vertex_attribute_name[64];
928   /* Used at runtime only by sampling RNA API. */
929   PointDensity pd;
930   int cached_resolution;
931   char _pad2[4];
932 } NodeShaderTexPointDensity;
933
934 /* TEX_output */
935 typedef struct TexNodeOutput {
936   char name[64];
937 } TexNodeOutput;
938
939 typedef struct NodeKeyingScreenData {
940   char tracking_object[64];
941 } NodeKeyingScreenData;
942
943 typedef struct NodeKeyingData {
944   float screen_balance;
945   float despill_factor;
946   float despill_balance;
947   int edge_kernel_radius;
948   float edge_kernel_tolerance;
949   float clip_black, clip_white;
950   int dilate_distance;
951   int feather_distance;
952   int feather_falloff;
953   int blur_pre, blur_post;
954 } NodeKeyingData;
955
956 typedef struct NodeTrackPosData {
957   char tracking_object[64];
958   char track_name[64];
959 } NodeTrackPosData;
960
961 typedef struct NodeTranslateData {
962   char wrap_axis;
963   char relative;
964   char _pad[6];
965 } NodeTranslateData;
966
967 typedef struct NodePlaneTrackDeformData {
968   char tracking_object[64];
969   char plane_track_name[64];
970   char flag;
971   char motion_blur_samples;
972   char _pad[2];
973   float motion_blur_shutter;
974 } NodePlaneTrackDeformData;
975
976 typedef struct NodeShaderScript {
977   int mode;
978   int flag;
979
980   /** 1024 = FILE_MAX. */
981   char filepath[1024];
982
983   char bytecode_hash[64];
984   char *bytecode;
985 } NodeShaderScript;
986
987 typedef struct NodeShaderTangent {
988   int direction_type;
989   int axis;
990   char uv_map[64];
991 } NodeShaderTangent;
992
993 typedef struct NodeShaderNormalMap {
994   int space;
995   char uv_map[64];
996 } NodeShaderNormalMap;
997
998 typedef struct NodeShaderUVMap {
999   char uv_map[64];
1000 } NodeShaderUVMap;
1001
1002 typedef struct NodeShaderVertexColor {
1003   char layer_name[64];
1004 } NodeShaderVertexColor;
1005
1006 typedef struct NodeShaderTexIES {
1007   int mode;
1008
1009   /** 1024 = FILE_MAX. */
1010   char filepath[1024];
1011 } NodeShaderTexIES;
1012
1013 typedef struct NodeSunBeams {
1014   float source[2];
1015
1016   float ray_length;
1017 } NodeSunBeams;
1018
1019 typedef struct NodeCryptomatte {
1020   float add[3];
1021   float remove[3];
1022   char *matte_id;
1023   int num_inputs;
1024   char _pad[4];
1025 } NodeCryptomatte;
1026
1027 typedef struct NodeDenoise {
1028   char hdr;
1029   char _pad[7];
1030 } NodeDenoise;
1031
1032 /* script node mode */
1033 #define NODE_SCRIPT_INTERNAL 0
1034 #define NODE_SCRIPT_EXTERNAL 1
1035
1036 /* script node flag */
1037 #define NODE_SCRIPT_AUTO_UPDATE 1
1038
1039 /* ies node mode */
1040 #define NODE_IES_INTERNAL 0
1041 #define NODE_IES_EXTERNAL 1
1042
1043 /* frame node flags */
1044 #define NODE_FRAME_SHRINK 1     /* keep the bounding box minimal */
1045 #define NODE_FRAME_RESIZEABLE 2 /* test flag, if frame can be resized by user */
1046
1047 /* proxy node flags */
1048 #define NODE_PROXY_AUTOTYPE 1 /* automatically change output type based on link */
1049
1050 /* comp channel matte */
1051 #define CMP_NODE_CHANNEL_MATTE_CS_RGB 1
1052 #define CMP_NODE_CHANNEL_MATTE_CS_HSV 2
1053 #define CMP_NODE_CHANNEL_MATTE_CS_YUV 3
1054 #define CMP_NODE_CHANNEL_MATTE_CS_YCC 4
1055
1056 /* glossy distributions */
1057 #define SHD_GLOSSY_BECKMANN 0
1058 #define SHD_GLOSSY_SHARP 1
1059 #define SHD_GLOSSY_GGX 2
1060 #define SHD_GLOSSY_ASHIKHMIN_SHIRLEY 3
1061 #define SHD_GLOSSY_MULTI_GGX 4
1062
1063 /* vector transform */
1064 #define SHD_VECT_TRANSFORM_TYPE_VECTOR 0
1065 #define SHD_VECT_TRANSFORM_TYPE_POINT 1
1066 #define SHD_VECT_TRANSFORM_TYPE_NORMAL 2
1067
1068 #define SHD_VECT_TRANSFORM_SPACE_WORLD 0
1069 #define SHD_VECT_TRANSFORM_SPACE_OBJECT 1
1070 #define SHD_VECT_TRANSFORM_SPACE_CAMERA 2
1071
1072 /* toon modes */
1073 #define SHD_TOON_DIFFUSE 0
1074 #define SHD_TOON_GLOSSY 1
1075
1076 /* hair components */
1077 #define SHD_HAIR_REFLECTION 0
1078 #define SHD_HAIR_TRANSMISSION 1
1079
1080 /* principled hair parametrization */
1081 #define SHD_PRINCIPLED_HAIR_REFLECTANCE 0
1082 #define SHD_PRINCIPLED_HAIR_PIGMENT_CONCENTRATION 1
1083 #define SHD_PRINCIPLED_HAIR_DIRECT_ABSORPTION 2
1084
1085 /* blend texture */
1086 #define SHD_BLEND_LINEAR 0
1087 #define SHD_BLEND_QUADRATIC 1
1088 #define SHD_BLEND_EASING 2
1089 #define SHD_BLEND_DIAGONAL 3
1090 #define SHD_BLEND_RADIAL 4
1091 #define SHD_BLEND_QUADRATIC_SPHERE 5
1092 #define SHD_BLEND_SPHERICAL 6
1093
1094 /* noise basis for textures */
1095 #define SHD_NOISE_PERLIN 0
1096 #define SHD_NOISE_VORONOI_F1 1
1097 #define SHD_NOISE_VORONOI_F2 2
1098 #define SHD_NOISE_VORONOI_F3 3
1099 #define SHD_NOISE_VORONOI_F4 4
1100 #define SHD_NOISE_VORONOI_F2_F1 5
1101 #define SHD_NOISE_VORONOI_CRACKLE 6
1102 #define SHD_NOISE_CELL_NOISE 7
1103
1104 #define SHD_NOISE_SOFT 0
1105 #define SHD_NOISE_HARD 1
1106
1107 /* Voronoi Texture */
1108
1109 enum {
1110   SHD_VORONOI_EUCLIDEAN = 0,
1111   SHD_VORONOI_MANHATTAN = 1,
1112   SHD_VORONOI_CHEBYCHEV = 2,
1113   SHD_VORONOI_MINKOWSKI = 3,
1114 };
1115
1116 enum {
1117   SHD_VORONOI_F1 = 0,
1118   SHD_VORONOI_F2 = 1,
1119   SHD_VORONOI_SMOOTH_F1 = 2,
1120   SHD_VORONOI_DISTANCE_TO_EDGE = 3,
1121   SHD_VORONOI_N_SPHERE_RADIUS = 4,
1122 };
1123
1124 /* musgrave texture */
1125 #define SHD_MUSGRAVE_MULTIFRACTAL 0
1126 #define SHD_MUSGRAVE_FBM 1
1127 #define SHD_MUSGRAVE_HYBRID_MULTIFRACTAL 2
1128 #define SHD_MUSGRAVE_RIDGED_MULTIFRACTAL 3
1129 #define SHD_MUSGRAVE_HETERO_TERRAIN 4
1130
1131 /* wave texture */
1132 #define SHD_WAVE_BANDS 0
1133 #define SHD_WAVE_RINGS 1
1134
1135 #define SHD_WAVE_PROFILE_SIN 0
1136 #define SHD_WAVE_PROFILE_SAW 1
1137
1138 /* sky texture */
1139 #define SHD_SKY_OLD 0
1140 #define SHD_SKY_NEW 1
1141
1142 /* environment texture */
1143 #define SHD_PROJ_EQUIRECTANGULAR 0
1144 #define SHD_PROJ_MIRROR_BALL 1
1145
1146 #define SHD_IMAGE_EXTENSION_REPEAT 0
1147 #define SHD_IMAGE_EXTENSION_EXTEND 1
1148 #define SHD_IMAGE_EXTENSION_CLIP 2
1149
1150 /* image texture */
1151 #define SHD_PROJ_FLAT 0
1152 #define SHD_PROJ_BOX 1
1153 #define SHD_PROJ_SPHERE 2
1154 #define SHD_PROJ_TUBE 3
1155
1156 /* image texture interpolation */
1157 #define SHD_INTERP_LINEAR 0
1158 #define SHD_INTERP_CLOSEST 1
1159 #define SHD_INTERP_CUBIC 2
1160 #define SHD_INTERP_SMART 3
1161
1162 /* tangent */
1163 #define SHD_TANGENT_RADIAL 0
1164 #define SHD_TANGENT_UVMAP 1
1165
1166 /* tangent */
1167 #define SHD_TANGENT_AXIS_X 0
1168 #define SHD_TANGENT_AXIS_Y 1
1169 #define SHD_TANGENT_AXIS_Z 2
1170
1171 /* normal map, displacement space */
1172 #define SHD_SPACE_TANGENT 0
1173 #define SHD_SPACE_OBJECT 1
1174 #define SHD_SPACE_WORLD 2
1175 #define SHD_SPACE_BLENDER_OBJECT 3
1176 #define SHD_SPACE_BLENDER_WORLD 4
1177
1178 #define SHD_AO_INSIDE 1
1179 #define SHD_AO_LOCAL 2
1180
1181 /* Mapping node vector types */
1182 enum {
1183   NODE_MAPPING_TYPE_POINT = 0,
1184   NODE_MAPPING_TYPE_TEXTURE = 1,
1185   NODE_MAPPING_TYPE_VECTOR = 2,
1186   NODE_MAPPING_TYPE_NORMAL = 3,
1187 };
1188
1189 /* math node clamp */
1190 #define SHD_MATH_CLAMP 1
1191
1192 /* Math node operations. */
1193 enum {
1194   NODE_MATH_ADD = 0,
1195   NODE_MATH_SUBTRACT = 1,
1196   NODE_MATH_MULTIPLY = 2,
1197   NODE_MATH_DIVIDE = 3,
1198   NODE_MATH_SINE = 4,
1199   NODE_MATH_COSINE = 5,
1200   NODE_MATH_TANGENT = 6,
1201   NODE_MATH_ARCSINE = 7,
1202   NODE_MATH_ARCCOSINE = 8,
1203   NODE_MATH_ARCTANGENT = 9,
1204   NODE_MATH_POWER = 10,
1205   NODE_MATH_LOGARITHM = 11,
1206   NODE_MATH_MINIMUM = 12,
1207   NODE_MATH_MAXIMUM = 13,
1208   NODE_MATH_ROUND = 14,
1209   NODE_MATH_LESS_THAN = 15,
1210   NODE_MATH_GREATER_THAN = 16,
1211   NODE_MATH_MODULO = 17,
1212   NODE_MATH_ABSOLUTE = 18,
1213   NODE_MATH_ARCTAN2 = 19,
1214   NODE_MATH_FLOOR = 20,
1215   NODE_MATH_CEIL = 21,
1216   NODE_MATH_FRACTION = 22,
1217   NODE_MATH_SQRT = 23,
1218 };
1219
1220 /* Vector Math node operations. */
1221 enum {
1222   NODE_VECTOR_MATH_ADD = 0,
1223   NODE_VECTOR_MATH_SUBTRACT = 1,
1224   NODE_VECTOR_MATH_MULTIPLY = 2,
1225   NODE_VECTOR_MATH_DIVIDE = 3,
1226
1227   NODE_VECTOR_MATH_CROSS_PRODUCT = 4,
1228   NODE_VECTOR_MATH_PROJECT = 5,
1229   NODE_VECTOR_MATH_REFLECT = 6,
1230   NODE_VECTOR_MATH_DOT_PRODUCT = 7,
1231
1232   NODE_VECTOR_MATH_DISTANCE = 8,
1233   NODE_VECTOR_MATH_LENGTH = 9,
1234   NODE_VECTOR_MATH_SCALE = 10,
1235   NODE_VECTOR_MATH_NORMALIZE = 11,
1236
1237   NODE_VECTOR_MATH_SNAP = 12,
1238   NODE_VECTOR_MATH_FLOOR = 13,
1239   NODE_VECTOR_MATH_CEIL = 14,
1240   NODE_VECTOR_MATH_MODULO = 15,
1241   NODE_VECTOR_MATH_FRACTION = 16,
1242   NODE_VECTOR_MATH_ABSOLUTE = 17,
1243   NODE_VECTOR_MATH_MINIMUM = 18,
1244   NODE_VECTOR_MATH_MAXIMUM = 19,
1245 };
1246
1247 /* mix rgb node flags */
1248 #define SHD_MIXRGB_USE_ALPHA 1
1249 #define SHD_MIXRGB_CLAMP 2
1250
1251 /* subsurface */
1252 enum {
1253 #ifdef DNA_DEPRECATED
1254   SHD_SUBSURFACE_COMPATIBLE = 0,  // Deprecated
1255 #endif
1256   SHD_SUBSURFACE_CUBIC = 1,
1257   SHD_SUBSURFACE_GAUSSIAN = 2,
1258   SHD_SUBSURFACE_BURLEY = 3,
1259   SHD_SUBSURFACE_RANDOM_WALK = 4,
1260 };
1261
1262 /* blur node */
1263 #define CMP_NODE_BLUR_ASPECT_NONE 0
1264 #define CMP_NODE_BLUR_ASPECT_Y 1
1265 #define CMP_NODE_BLUR_ASPECT_X 2
1266
1267 /* wrapping */
1268 #define CMP_NODE_WRAP_NONE 0
1269 #define CMP_NODE_WRAP_X 1
1270 #define CMP_NODE_WRAP_Y 2
1271 #define CMP_NODE_WRAP_XY 3
1272
1273 #define CMP_NODE_MASK_MBLUR_SAMPLES_MAX 64
1274
1275 /* image */
1276 #define CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT 1
1277
1278 /* viewer and cmposite output */
1279 #define CMP_NODE_OUTPUT_IGNORE_ALPHA 1
1280
1281 /* Plane track deform node */
1282 enum {
1283   CMP_NODEFLAG_PLANETRACKDEFORM_MOTION_BLUR = 1,
1284 };
1285
1286 /* Stabilization node */
1287 enum {
1288   CMP_NODEFLAG_STABILIZE_INVERSE = 1,
1289 };
1290
1291 #define CMP_NODE_PLANETRACKDEFORM_MBLUR_SAMPLES_MAX 64
1292
1293 /* Point Density shader node */
1294
1295 enum {
1296   SHD_POINTDENSITY_SOURCE_PSYS = 0,
1297   SHD_POINTDENSITY_SOURCE_OBJECT = 1,
1298 };
1299
1300 enum {
1301   SHD_POINTDENSITY_SPACE_OBJECT = 0,
1302   SHD_POINTDENSITY_SPACE_WORLD = 1,
1303 };
1304
1305 enum {
1306   SHD_POINTDENSITY_COLOR_PARTAGE = 1,
1307   SHD_POINTDENSITY_COLOR_PARTSPEED = 2,
1308   SHD_POINTDENSITY_COLOR_PARTVEL = 3,
1309 };
1310
1311 enum {
1312   SHD_POINTDENSITY_COLOR_VERTCOL = 0,
1313   SHD_POINTDENSITY_COLOR_VERTWEIGHT = 1,
1314   SHD_POINTDENSITY_COLOR_VERTNOR = 2,
1315 };
1316
1317 /* Output shader node */
1318
1319 typedef enum NodeShaderOutputTarget {
1320   SHD_OUTPUT_ALL = 0,
1321   SHD_OUTPUT_EEVEE = 1,
1322   SHD_OUTPUT_CYCLES = 2,
1323 } NodeShaderOutputTarget;
1324
1325 #endif