own fix r34446, was incorrect, fixed properly now.
[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 #include "DNA_ID.h"
34 #include "DNA_vec_types.h"
35 #include "DNA_listBase.h"
36
37 struct ListBase;
38 struct SpaceNode;
39 struct bNodeLink;
40 struct bNodeType;
41 struct bNodeGroup;
42 struct AnimData;
43 struct bGPdata;
44 struct uiBlock;
45
46 #define NODE_MAXSTR 32
47
48
49 typedef struct bNodeStack {
50         float vec[4];
51         float min, max;                 /* min/max for values (UI writes it, execute might use it) */
52         void *data;
53         short hasinput;                 /* when input has link, tagged before executing */
54         short hasoutput;                /* when output is linked, tagged before executing */
55         short datatype;                 /* type of data pointer */
56         short sockettype;               /* type of socket stack comes from, to remap linking different sockets */
57 } bNodeStack;
58
59 /* ns->datatype, shadetree only */
60 #define NS_OSA_VECTORS          1
61 #define NS_OSA_VALUES           2
62
63 typedef struct bNodeSocket {
64         struct bNodeSocket *next, *prev, *new_sock;
65         
66         char name[32];
67         bNodeStack ns;                          /* custom data for inputs, only UI writes in this */
68         
69         short type, flag;                       /* type is copy from socket type struct */
70         short limit, stack_index;       /* limit for dependency sort, stack_index for exec */
71         short intern;                           /* intern = tag for group nodes */
72         short stack_index_ext;          /* for groups, to find the caller stack index */
73         int pad1;
74         
75         float locx, locy;
76         
77         /* internal data to retrieve relations and groups */
78         
79         int own_index, to_index;        /* group socket identifiers, to find matching pairs after reading files */
80         
81         struct bNodeSocket *tosock;     /* group-node sockets point to the internal group counterpart sockets, set after read file  */
82         struct bNodeLink *link;         /* a link pointer, set in nodeSolveOrder() */
83         
84 } bNodeSocket;
85
86 /* sock->type */
87 #define SOCK_VALUE              0
88 #define SOCK_VECTOR             1
89 #define SOCK_RGBA               2
90
91 /* sock->flag, first bit is select */
92                 /* hidden is user defined, to hide unused */
93 #define SOCK_HIDDEN                             2
94                 /* only used now for groups... */
95 #define SOCK_IN_USE                             4
96                 /* unavailable is for dynamic sockets */
97 #define SOCK_UNAVAIL                    8
98 #
99 #
100 typedef struct bNodePreview {
101         unsigned char *rect;
102         short xsize, ysize;
103 } bNodePreview;
104
105
106 /* limit data in bNode to what we want to see saved? */
107 typedef struct bNode {
108         struct bNode *next, *prev, *new_node;
109         
110         char name[32];
111         short type, flag;
112         short done, level;              /* both for dependency and sorting */
113         short lasty, menunr;    /* lasty: check preview render status, menunr: browse ID blocks */
114         short stack_index;              /* for groupnode, offset in global caller stack */
115         short nr;                               /* number of this node in list, used for UI exec events */
116         
117         ListBase inputs, outputs;
118         struct ID *id;                  /* optional link to libdata */
119         void *storage;                  /* custom data, must be struct, for storage in file */
120         
121         float locx, locy;               /* root offset for drawing */
122         float width, miniwidth;                 
123         short custom1, custom2; /* to be abused for buttons */
124         float custom3, custom4;
125         
126         short need_exec, exec;  /* need_exec is set as UI execution event, exec is flag during exec */
127         void *threaddata;               /* optional extra storage for use in thread (read only then!) */
128         
129         rctf totr;                              /* entire boundbox */
130         rctf butr;                              /* optional buttons area */
131         rctf prvr;                              /* optional preview area */
132         bNodePreview *preview;  /* optional preview image */
133         struct uiBlock *block;  /* runtime during drawing */
134         
135         struct bNodeType *typeinfo;     /* lookup of callbacks and defaults */
136         
137 } bNode;
138
139 /* node->flag */
140 #define NODE_SELECT                     1
141 #define NODE_OPTIONS            2
142 #define NODE_PREVIEW            4
143 #define NODE_HIDDEN                     8
144 #define NODE_ACTIVE                     16
145 #define NODE_ACTIVE_ID          32
146 #define NODE_DO_OUTPUT          64
147 #define NODE_GROUP_EDIT         128
148                 /* free test flag, undefined */
149 #define NODE_TEST                       256
150                 /* composite: don't do node but pass on buffer(s) */
151 #define NODE_MUTED                      512
152 #define NODE_CUSTOM_NAME                1024
153
154 typedef struct bNodeLink {
155         struct bNodeLink *next, *prev;
156         
157         bNode *fromnode, *tonode;
158         bNodeSocket *fromsock, *tosock;
159         
160         int flag, pad;
161         
162 } bNodeLink;
163
164 /* the basis for a Node tree, all links and nodes reside internal here */
165 /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
166 typedef struct bNodeTree {
167         ID id;
168         struct AnimData *adt;           /* animation data (must be immediately after id for utilities to use it) */ 
169         
170         struct bGPdata *gpd;            /* grease pencil data */
171         
172         ListBase nodes, links;
173         
174         bNodeStack *stack;                              /* stack is only while executing, no read/write in file */
175         struct ListBase *threadstack;   /* same as above */
176         
177         int type, init;                                 /* set init on fileread */
178         int stacksize;                                  /* amount of elements in stack */
179         int cur_index;                                  /* sockets in groups have unique identifiers, adding new sockets always 
180                                                                            will increase this counter */
181         int flag, pad;                                  
182         
183         ListBase alltypes;                              /* type definitions */
184         struct bNodeType *owntype;              /* for groups or dynamic trees, no read/write */
185
186         int pad2[2];
187         
188         /* callbacks */
189         void (*progress)(void *, float progress);
190         void (*stats_draw)(void *, char *str);
191         int (*test_break)(void *);
192         void *tbh, *prh, *sdh;
193         
194 } bNodeTree;
195
196 /* ntree->type, index */
197 #define NTREE_SHADER    0
198 #define NTREE_COMPOSIT  1
199 #define NTREE_TEXTURE   2
200
201 /* ntree->init, flag */
202 #define NTREE_TYPE_INIT 1
203 #define NTREE_EXEC_INIT 2
204
205 /* ntree->flag */
206 #define NTREE_DS_EXPAND 1       /* for animation editors */
207
208 /* data structs, for node->storage */
209
210 /* this one has been replaced with ImageUser, keep it for do_versions() */
211 typedef struct NodeImageAnim {
212         int frames, sfra, nr;
213         char cyclic, movie;
214         short pad;
215 } NodeImageAnim;
216
217 typedef struct NodeBlurData {
218         short sizex, sizey;
219         short samples, maxspeed, minspeed, relative;
220         float fac, percentx, percenty;
221         short filtertype;
222         char bokeh, gamma;
223         short curved;
224         short pad;
225         int image_in_width, image_in_height; /* needed for absolute/relative conversions */
226 } NodeBlurData;
227
228 typedef struct NodeDBlurData {
229         float center_x, center_y, distance, angle, spin, zoom;
230         short iter;
231         char wrap, pad;
232 } NodeDBlurData;
233
234 typedef struct NodeBilateralBlurData {
235         float sigma_color, sigma_space;
236         short iter, pad;
237 } NodeBilateralBlurData;
238
239 typedef struct NodeHueSat {
240         float hue, sat, val;
241 } NodeHueSat;
242
243 typedef struct NodeImageFile {
244         char name[256];
245         short imtype, subimtype, quality, codec;
246         int sfra, efra;
247 } NodeImageFile;
248
249 typedef struct NodeChroma {
250         float t1,t2,t3;
251         float fsize,fstrength,falpha;
252         float key[4];
253    short algorithm, channel;
254 } NodeChroma;
255
256 typedef struct NodeTwoXYs {
257         short x1, x2, y1, y2;
258    float fac_x1, fac_x2, fac_y1, fac_y2;
259 } NodeTwoXYs;
260
261 typedef struct NodeTwoFloats {
262         float x, y;
263 } NodeTwoFloats;
264
265 typedef struct NodeGeometry {
266         char uvname[32];
267         char colname[32];
268 } NodeGeometry;
269
270 typedef struct NodeVertexCol {
271         char name[32];
272 } NodeVertexCol;
273
274 /* qdn: Defocus blur node */
275 typedef struct NodeDefocus {
276         char bktype, rotation, preview, gamco;
277         short samples, no_zbuf;
278         float fstop, maxblur, bthresh, scale;
279 } NodeDefocus;
280
281 typedef struct NodeScriptDict {
282         void *dict; /* for PyObject *dict */
283         void *node; /* for BPy_Node *node */
284 } NodeScriptDict;
285
286 /* qdn: glare node */
287 typedef struct NodeGlare {
288         char quality, type, iter;
289         char angle, angle_ofs, size, pad[2];
290         float colmod, mix, threshold, fade;
291 } NodeGlare;
292
293 /* qdn: tonemap node */
294 typedef struct NodeTonemap {
295         float key, offset, gamma;
296         float f, m, a, c;
297         int type;
298 } NodeTonemap;
299
300 /* qdn: lens distortion node */
301 typedef struct NodeLensDist {
302         short jit, proj, fit, pad;
303 } NodeLensDist;
304
305 typedef struct NodeColorBalance {
306         /* for processing */
307         float slope[3];
308         float offset[3];
309         float power[3];
310         
311         /* for ui representation */
312         float lift[3];
313         float gamma[3];
314         float gain[3];
315
316         /* temp storage for inverted lift */
317         float lift_lgg[3];
318         float gamma_inv[3];
319 } NodeColorBalance;
320
321 typedef struct NodeColorspill {
322         short limchan, unspill;
323         float limscale;
324         float uspillr, uspillg, uspillb;
325 }NodeColorspill;
326
327 /* TEX_output */
328 typedef struct TexNodeOutput {
329         char name[32];
330 } TexNodeOutput;
331
332
333 /* comp channel matte */
334 #define CMP_NODE_CHANNEL_MATTE_CS_RGB   1
335 #define CMP_NODE_CHANNEL_MATTE_CS_HSV   2
336 #define CMP_NODE_CHANNEL_MATTE_CS_YUV   3
337 #define CMP_NODE_CHANNEL_MATTE_CS_YCC   4
338
339 #endif