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