02e57aa08407eebf513c187683edc66430c67369
[blender.git] / source / blender / makesdna / DNA_node_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Bob Holcomb, Xavier Thomas
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef DNA_NODE_TYPES_H
29 #define DNA_NODE_TYPES_H
30
31 /** \file DNA_node_types.h
32  *  \ingroup DNA
33  */
34
35 #include "DNA_ID.h"
36 #include "DNA_vec_types.h"
37 #include "DNA_listBase.h"
38
39 struct ID;
40 struct ListBase;
41 struct SpaceNode;
42 struct bNodeLink;
43 struct bNodeType;
44 struct bNodeTreeExec;
45 struct AnimData;
46 struct bGPdata;
47 struct uiBlock;
48
49 #define NODE_MAXSTR 32
50
51 typedef struct bNodeStack {
52         float vec[4];
53         float min, max;
54         void *data;
55         short hasinput;                 /* when input has link, tagged before executing */
56         short hasoutput;                /* when output is linked, tagged before executing */
57         short datatype;                 /* type of data pointer */
58         short sockettype;               /* type of socket stack comes from, to remap linking different sockets */
59         short is_copy;                  /* data is a copy of external data (no freeing) */
60         short external;                 /* data is used by external nodes (no freeing) */
61         short pad[2];
62 } bNodeStack;
63
64 /* ns->datatype, shadetree only */
65 #define NS_OSA_VECTORS          1
66 #define NS_OSA_VALUES           2
67
68 typedef struct bNodeSocket {
69         struct bNodeSocket *next, *prev, *new_sock;
70         
71         char name[32];
72         
73         void *storage;                          /* custom storage */
74         
75         short type, flag;
76         short limit;                            /* max. number of links */
77         short pad1;
78         
79         float locx, locy;
80         
81         void *default_value;            /* default input value used for unlinked sockets */
82         
83         /* execution data */
84         short stack_index;                      /* local stack index */
85         short stack_type;                       /* deprecated, kept for forward compatibility */
86         int pad3;
87         void *cache;                            /* cached data from execution */
88         
89         /* internal data to retrieve relations and groups */
90         int own_index;                          /* group socket identifiers, to find matching pairs after reading files */
91         int to_index;                           /* XXX deprecated, only used for restoring old group node links */
92         struct bNodeSocket *groupsock;
93         
94         struct bNodeLink *link;         /* a link pointer, set in ntreeUpdateTree */
95
96         /* DEPRECATED only needed for do_versions */
97         bNodeStack ns;                          /* custom data for inputs, only UI writes in this */
98 } bNodeSocket;
99
100 /* sock->type */
101 #define SOCK_FLOAT                      0
102 #define SOCK_VECTOR                     1
103 #define SOCK_RGBA                       2
104 #define SOCK_SHADER                     3
105 #define SOCK_BOOLEAN            4
106 #define SOCK_MESH                       5
107 #define SOCK_INT                        6
108 #define NUM_SOCKET_TYPES        7       /* must be last! */
109
110 /* socket side (input/output) */
111 #define SOCK_IN         1
112 #define SOCK_OUT        2
113
114 /* sock->flag, first bit is select */
115         /* hidden is user defined, to hide unused */
116 #define SOCK_HIDDEN                             2
117         /* only used now for groups... */
118 #define SOCK_IN_USE                             4       /* XXX deprecated */
119         /* unavailable is for dynamic sockets */
120 #define SOCK_UNAVAIL                    8
121         /* dynamic socket (can be modified by user) */
122 #define SOCK_DYNAMIC                    16
123         /* group socket should not be exposed */
124 #define SOCK_INTERNAL                   32
125         /* socket collapsed in UI */
126 #define SOCK_COLLAPSED                  64
127         /* hide socket value, if it gets auto default */
128 #define SOCK_HIDE_VALUE                 128
129
130 typedef struct bNodePreview {
131         unsigned char *rect;
132         short xsize, ysize;
133         int pad;
134 } bNodePreview;
135
136 /* limit data in bNode to what we want to see saved? */
137 typedef struct bNode {
138         struct bNode *next, *prev, *new_node;
139         
140         char name[32];
141         short type, flag;
142         short done, level;              /* both for dependency and sorting */
143         short lasty, menunr;    /* lasty: check preview render status, menunr: browse ID blocks */
144         short stack_index;              /* for groupnode, offset in global caller stack */
145         short nr;                               /* number of this node in list, used for UI exec events */
146         
147         ListBase inputs, outputs;
148         struct bNode *parent;   /* parent node */
149         struct ID *id;                  /* optional link to libdata */
150         void *storage;                  /* custom data, must be struct, for storage in file */
151         
152         float locx, locy;               /* root offset for drawing */
153         float width, height;    /* node custom width and height */
154         float miniwidth;                /* node width if hidden */
155         
156         int update;                             /* update flags */
157         
158         char label[32];                 /* custom user-defined label */
159         short custom1, custom2; /* to be abused for buttons */
160         float custom3, custom4;
161         
162         short need_exec, exec;  /* need_exec is set as UI execution event, exec is flag during exec */
163         void *threaddata;               /* optional extra storage for use in thread (read only then!) */
164         
165         rctf totr;                              /* entire boundbox */
166         rctf butr;                              /* optional buttons area */
167         rctf prvr;                              /* optional preview area */
168         bNodePreview *preview;  /* optional preview image */
169         struct uiBlock *block;  /* runtime during drawing */
170         
171         struct bNodeType *typeinfo;     /* lookup of callbacks and defaults */
172 } bNode;
173
174 /* node->flag */
175 #define NODE_SELECT                     1
176 #define NODE_OPTIONS            2
177 #define NODE_PREVIEW            4
178 #define NODE_HIDDEN                     8
179 #define NODE_ACTIVE                     16
180 #define NODE_ACTIVE_ID          32
181 #define NODE_DO_OUTPUT          64
182 #define NODE_GROUP_EDIT         128
183         /* free test flag, undefined */
184 #define NODE_TEST                       256
185         /* composite: don't do node but pass on buffer(s) */
186 #define NODE_MUTED                      512
187 #define NODE_CUSTOM_NAME        1024    /* deprecated! */
188         /* group node types: use const outputs by default */
189 #define NODE_CONST_OUTPUT       (1<<11)
190         /* node is always behind others */
191 #define NODE_BACKGROUND         (1<<12)
192         /* automatic flag for nodes included in transforms */
193 #define NODE_TRANSFORM          (1<<13)
194
195 /* node->update */
196 /* XXX NODE_UPDATE is a generic update flag. More fine-grained updates
197  * might be used in the future, but currently all work the same way.
198  */
199 #define NODE_UPDATE                     0xFFFF  /* generic update flag (includes all others) */
200 #define NODE_UPDATE_ID          1               /* associated id data block has changed */
201
202 typedef struct bNodeLink {
203         struct bNodeLink *next, *prev;
204         
205         bNode *fromnode, *tonode;
206         bNodeSocket *fromsock, *tosock;
207         
208         int flag;
209         int pad;
210 } bNodeLink;
211
212 /* link->flag */
213 #define NODE_LINKFLAG_HILITE    1               /* link has been successfully validated */
214 #define NODE_LINK_VALID                 2
215
216 /* the basis for a Node tree, all links and nodes reside internal here */
217 /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
218 typedef struct bNodeTree {
219         ID id;
220         struct AnimData *adt;           /* animation data (must be immediately after id for utilities to use it) */ 
221         
222         struct bGPdata *gpd;            /* grease pencil data */
223         
224         ListBase nodes, links;
225         
226         int type, init;                                 /* set init on fileread */
227         int cur_index;                                  /* sockets in groups have unique identifiers, adding new sockets always 
228                                                                            will increase this counter */
229         int flag;
230         int update;                                             /* update flags */
231         
232         int nodetype;                                   /* specific node type this tree is used for */
233         
234         ListBase inputs, outputs;               /* external sockets for group nodes */
235         
236         /* execution data */
237         /* XXX It would be preferable to completely move this data out of the underlying node tree,
238          * so node tree execution could finally run independent of the tree itself. This would allow node trees
239          * to be merely linked by other data (materials, textures, etc.), as ID data is supposed to.
240          * Execution data is generated from the tree once at execution start and can then be used
241          * as long as necessary, even while the tree is being modified.
242          */
243         struct bNodeTreeExec *execdata;
244         
245         /* callbacks */
246         void (*progress)(void *, float progress);
247         void (*stats_draw)(void *, char *str);
248         int (*test_break)(void *);
249         void *tbh, *prh, *sdh;
250         
251 } bNodeTree;
252
253 /* ntree->type, index */
254 #define NTREE_SHADER            0
255 #define NTREE_COMPOSIT          1
256 #define NTREE_TEXTURE           2
257 #define NUM_NTREE_TYPES         3
258
259 /* ntree->init, flag */
260 #define NTREE_TYPE_INIT         1
261
262 /* ntree->flag */
263 #define NTREE_DS_EXPAND         1       /* for animation editors */
264 /* XXX not nice, but needed as a temporary flags
265  * for group updates after library linking.
266  */
267 #define NTREE_DO_VERSIONS_GROUP_EXPOSE  1024
268
269 /* ntree->update */
270 #define NTREE_UPDATE                    0xFFFF  /* generic update flag (includes all others) */
271 #define NTREE_UPDATE_LINKS              1               /* links have been added or removed */
272 #define NTREE_UPDATE_NODES              2               /* nodes or sockets have been added or removed */
273 #define NTREE_UPDATE_GROUP_IN   16              /* group inputs have changed */
274 #define NTREE_UPDATE_GROUP_OUT  32              /* group outputs have changed */
275 #define NTREE_UPDATE_GROUP              48              /* group has changed (generic flag including all other group flags) */
276
277
278 /* socket value structs for input buttons */
279
280 typedef struct bNodeSocketValueInt {
281         int subtype;                            /* RNA subtype */
282         int value;
283         int min, max;
284 } bNodeSocketValueInt;
285
286 typedef struct bNodeSocketValueFloat {
287         int subtype;                            /* RNA subtype */
288         float value;
289         float min, max;
290 } bNodeSocketValueFloat;
291
292 typedef struct bNodeSocketValueBoolean {
293         char value;
294         char pad[3];
295 } bNodeSocketValueBoolean;
296
297 typedef struct bNodeSocketValueVector {
298         int subtype;                            /* RNA subtype */
299         float value[3];
300         float min, max;
301 } bNodeSocketValueVector;
302
303 typedef struct bNodeSocketValueRGBA {
304         float value[4];
305 } bNodeSocketValueRGBA;
306
307
308 /* data structs, for node->storage */
309
310 /* this one has been replaced with ImageUser, keep it for do_versions() */
311 typedef struct NodeImageAnim {
312         int frames, sfra, nr;
313         char cyclic, movie;
314         short pad;
315 } NodeImageAnim;
316
317 typedef struct NodeBlurData {
318         short sizex, sizey;
319         short samples, maxspeed, minspeed, relative, aspect;
320         short curved;
321         float fac, percentx, percenty;
322         short filtertype;
323         char bokeh, gamma;
324         int image_in_width, image_in_height; /* needed for absolute/relative conversions */
325 } NodeBlurData;
326
327 typedef struct NodeDBlurData {
328         float center_x, center_y, distance, angle, spin, zoom;
329         short iter;
330         char wrap, pad;
331 } NodeDBlurData;
332
333 typedef struct NodeBilateralBlurData {
334         float sigma_color, sigma_space;
335         short iter, pad;
336 } NodeBilateralBlurData;
337
338 typedef struct NodeHueSat {
339         float hue, sat, val;
340 } NodeHueSat;
341
342 typedef struct NodeImageFile {
343         char name[256];
344         short imtype, subimtype, quality, codec;
345         int sfra, efra;
346 } NodeImageFile;
347
348 typedef struct NodeChroma {
349         float t1,t2,t3;
350         float fsize,fstrength,falpha;
351         float key[4];
352    short algorithm, channel;
353 } NodeChroma;
354
355 typedef struct NodeTwoXYs {
356         short x1, x2, y1, y2;
357    float fac_x1, fac_x2, fac_y1, fac_y2;
358 } NodeTwoXYs;
359
360 typedef struct NodeTwoFloats {
361         float x, y;
362 } NodeTwoFloats;
363
364 typedef struct NodeGeometry {
365         char uvname[32];
366         char colname[32];
367 } NodeGeometry;
368
369 typedef struct NodeVertexCol {
370         char name[32];
371 } NodeVertexCol;
372
373 /* qdn: Defocus blur node */
374 typedef struct NodeDefocus {
375         char bktype, rotation, preview, gamco;
376         short samples, no_zbuf;
377         float fstop, maxblur, bthresh, scale;
378 } NodeDefocus;
379
380 typedef struct NodeScriptDict {
381         void *dict; /* for PyObject *dict */
382         void *node; /* for BPy_Node *node */
383 } NodeScriptDict;
384
385 /* qdn: glare node */
386 typedef struct NodeGlare {
387         char quality, type, iter;
388         char angle, angle_ofs, size, pad[2];
389         float colmod, mix, threshold, fade;
390 } NodeGlare;
391
392 /* qdn: tonemap node */
393 typedef struct NodeTonemap {
394         float key, offset, gamma;
395         float f, m, a, c;
396         int type;
397 } NodeTonemap;
398
399 /* qdn: lens distortion node */
400 typedef struct NodeLensDist {
401         short jit, proj, fit, pad;
402 } NodeLensDist;
403
404 typedef struct NodeColorBalance {
405         /* for processing */
406         float slope[3];
407         float offset[3];
408         float power[3];
409         
410         /* for ui representation */
411         float lift[3];
412         float gamma[3];
413         float gain[3];
414
415         /* temp storage for inverted lift */
416         float lift_lgg[3];
417         float gamma_inv[3];
418 } NodeColorBalance;
419
420 typedef struct NodeColorspill {
421         short limchan, unspill;
422         float limscale;
423         float uspillr, uspillg, uspillb;
424 }NodeColorspill;
425
426 /* TEX_output */
427 typedef struct TexNodeOutput {
428         char name[32];
429 } TexNodeOutput;
430
431 /* comp channel matte */
432 #define CMP_NODE_CHANNEL_MATTE_CS_RGB   1
433 #define CMP_NODE_CHANNEL_MATTE_CS_HSV   2
434 #define CMP_NODE_CHANNEL_MATTE_CS_YUV   3
435 #define CMP_NODE_CHANNEL_MATTE_CS_YCC   4
436
437 #define CMP_NODE_BLUR_ASPECT_NONE               0
438 #define CMP_NODE_BLUR_ASPECT_Y                  1
439 #define CMP_NODE_BLUR_ASPECT_X                  2
440
441 #endif