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