Final merge of HEAD (bf-blender) into the orange branch.
[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
38 struct SpaceNode;
39 struct bNodeLink;
40 struct bNodeType;
41 struct bNodeGroup;
42 struct uiBlock;
43
44 #define NODE_MAXSTR 32
45
46
47 typedef struct bNodeStack {
48         float vec[4];
49         float min, max;                 /* min/max for values (UI writes it, execute might use it) */
50         void *data;
51         short hasinput;                 /* when input has link, tagged before executing */
52         short hasoutput;                /* when output is linked, tagged before executing */
53         short datatype;                 /* type of data pointer */
54         short pad;
55 } bNodeStack;
56
57 /* ns->datatype, shadetree only */
58 #define NS_OSA_VECTORS          1
59 #define NS_OSA_VALUES           2
60
61 typedef struct bNodeSocket {
62         struct bNodeSocket *next, *prev;
63         
64         char name[32];
65         bNodeStack ns;                          /* custom data for inputs, only UI writes in this */
66         
67         short type, flag;                       /* type is copy from socket type struct */
68         short limit, stack_index;       /* limit for dependency sort, stack_index for exec */
69         short intern;                           /* intern = tag for group nodes */
70         short stack_index_ext;          /* for groups, to find the caller stack index */
71         int pad1;
72         
73         float locx, locy;
74         
75         /* internal data to retrieve relations and groups */
76         
77         int own_index, to_index;        /* group socket identifiers, to find matching pairs after reading files */
78         
79         struct bNodeSocket *tosock;     /* group-node sockets point to the internal group counterpart sockets, set after read file  */
80         struct bNodeLink *link;         /* a link pointer, set in nodeSolveOrder() */
81         
82 } bNodeSocket;
83
84 /* sock->type */
85 #define SOCK_VALUE              0
86 #define SOCK_VECTOR             1
87 #define SOCK_RGBA               2
88 #define SOCK_IMAGE              3
89
90 /* sock->flag, first bit is select */
91 #define SOCK_HIDDEN                             2
92                 /* only used now for groups... */
93 #define SOCK_IN_USE                             4
94
95 #
96 #
97 typedef struct bNodePreview {
98         float *rect;
99         short xsize, ysize;
100 } bNodePreview;
101
102
103 /* limit data in bNode to what we want to see saved? */
104 typedef struct bNode {
105         struct bNode *next, *prev, *new;
106         
107         char name[32];
108         short type, flag;
109         short done, level;              /* both for dependency and sorting */
110         short lasty, menunr;    /* lasty: check preview render status, menunr: browse ID blocks */
111         short stack_index;              /* for groupnode, offset in global caller stack */
112         short nr;                               /* number of this node in list, used for exec events */
113         
114         ListBase inputs, outputs;
115         struct ID *id;                  /* optional link to libdata */
116         void *storage;                  /* custom data, must be struct, for storage in file */
117         struct uiBlock *block;  /* each node has own block */
118         
119         float locx, locy;               /* root offset for drawing */
120         float width, miniwidth;                 
121         short custom1, custom2; /* to be abused for buttons */
122         
123         short need_exec, pad1;  /* need_exec is set to optimize execution */
124         
125         rctf totr;                              /* entire boundbox */
126         rctf butr;                              /* optional buttons area */
127         rctf prvr;                              /* optional preview area */
128         bNodePreview *preview;  /* optional preview image */
129         
130         struct bNodeType *typeinfo;     /* lookup of callbacks and defaults */
131         
132 } bNode;
133
134 /* node->flag */
135 #define NODE_SELECT                     1
136 #define NODE_OPTIONS            2
137 #define NODE_PREVIEW            4
138 #define NODE_HIDDEN                     8
139 #define NODE_ACTIVE                     16
140 #define NODE_ACTIVE_ID          32
141 #define NODE_DO_OUTPUT          64
142 #define NODE_GROUP_EDIT         128
143
144 typedef struct bNodeLink {
145         struct bNodeLink *next, *prev;
146         
147         bNode *fromnode, *tonode;
148         bNodeSocket *fromsock, *tosock;
149         
150 } bNodeLink;
151
152 /* the basis for a Node tree, all links and nodes reside internal here */
153 /* only re-usable node trees are in the library though, materials allocate own tree struct */
154 typedef struct bNodeTree {
155         ID id;
156         
157         ListBase nodes, links;
158         
159         bNodeStack *stack;                              /* stack is only while executing, no read/write in file */
160         bNodeStack *stack1;                             /* for other thread, easy to expand though... */
161         
162         int type, init;                                 /* set init on fileread */
163         int stacksize;                                  /* amount of elements in stack */
164         int cur_index;                                  /* sockets in groups have unique identifiers, adding new sockets always will increase this counter */
165         struct bNodeType **alltypes;    /* type definitions, set on fileread, no read/write */
166         struct bNodeType *owntype;              /* for groups or dynamic trees, no read/write */
167         
168         /* callbacks */
169         void (*timecursor)(int nr);
170         
171 } bNodeTree;
172
173 /* ntree->type, index */
174 #define NTREE_SHADER    0
175 #define NTREE_COMPOSIT  1
176
177 /* ntree->init, flag */
178 #define NTREE_TYPE_INIT 1
179 #define NTREE_EXEC_INIT 2
180
181 /* data structs, for node->storage */
182
183 typedef struct NodeImageAnim {
184         short frames, sfra, nr;
185         char cyclic, movie;
186 } NodeImageAnim;
187
188 #endif
189