Final merge of HEAD (bf-blender) into the orange branch.
[blender.git] / source / blender / blenkernel / BKE_node.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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2005 Blender Foundation.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL LICENSE BLOCK *****
31  */
32
33 #ifndef BKE_NODE_H
34 #define BKE_NODE_H
35
36 struct bNodeTree;
37 struct bNode;
38 struct bNodeLink;
39 struct bNodeSocket;
40 struct bNodeStack;
41 struct uiBlock;
42 struct rctf;
43 struct ListBase;
44 struct RenderData;
45
46 #define SOCK_IN         1
47 #define SOCK_OUT        2
48
49 /* ************** NODE TYPE DEFINITIONS ***** */
50
51 typedef struct bNodeSocketType {
52         int type, limit;
53         char *name;
54         float val1, val2, val3, val4;   /* default alloc value for inputs */
55         float min, max;                                 /* default range for inputs */
56         
57         /* after this line is used internal only */
58         struct bNodeSocket *sock;               /* used during verify_types */
59         struct bNodeSocket *internsock; /* group nodes, the internal socket counterpart */
60         int own_index;                                  /* verify group nodes */
61         
62 } bNodeSocketType;
63
64 typedef struct bNodeType {
65         int type;
66         char *name;
67         float width, minwidth, maxwidth;
68         short nclass, flag;
69         
70         bNodeSocketType *inputs, *outputs;
71         
72         char storagename[64];                   /* struct name for DNA */
73         
74         void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
75         
76         /* after this line is set on startup of blender */
77         int (*butfunc)(struct uiBlock *, struct bNodeTree *, struct bNode *, struct rctf *);
78
79 } bNodeType;
80
81 /* nodetype->nclass, also for themes */
82 #define NODE_CLASS_INPUT                0
83 #define NODE_CLASS_OUTPUT               1
84 #define NODE_CLASS_GENERATOR    2
85 #define NODE_CLASS_OPERATOR             3
86 #define NODE_CLASS_GROUP                4
87 #define NODE_CLASS_FILE                 5
88
89 /* ************** GENERIC API, TREES *************** */
90
91 void                    ntreeVerifyTypes(struct bNodeTree *ntree);
92
93 struct bNodeTree *ntreeAddTree(int type);
94 void                    ntreeInitTypes(struct bNodeTree *ntree);
95 void                    ntreeMakeOwnType(struct bNodeTree *ntree);
96 void                    ntreeFreeTree(struct bNodeTree *ntree);
97 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
98
99 void                    ntreeSocketUseFlags(struct bNodeTree *ntree);
100
101 void                    ntreeSolveOrder(struct bNodeTree *ntree);
102
103 void                    ntreeBeginExecTree(struct bNodeTree *ntree);
104 void                    ntreeExecTree(struct bNodeTree *ntree, void *callerdata, int thread);
105 void                    ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
106 void                    ntreeEndExecTree(struct bNodeTree *ntree);
107
108 void                    ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
109
110 /* ************** GENERIC API, NODES *************** */
111
112 void                    nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
113
114 void                    nodeAddToPreview(struct bNode *, float *, int, int);
115
116 struct bNode    *nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup);
117 void                    nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
118 struct bNode    *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
119
120 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
121 void                    nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
122
123 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
124 int                             nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
125
126 void                    nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
127 struct bNode    *nodeGetActive(struct bNodeTree *ntree);
128 struct bNode    *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
129 void                    nodeClearActiveID(struct bNodeTree *ntree, short idtype);
130
131 void                    NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
132
133 /* ************** Groups ****************** */
134
135 struct bNode    *nodeMakeGroupFromSelected(struct bNodeTree *ntree);
136 int                             nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode);
137
138 void                    nodeVerifyGroup(struct bNodeTree *ngroup);
139 void                    nodeGroupSocketUseFlags(struct bNodeTree *ngroup);
140
141 /* ************** COMMON NODES *************** */
142
143 #define NODE_GROUP              2
144
145 extern bNodeType node_group_typeinfo;
146
147
148 /* ************** SHADER NODES *************** */
149
150 struct ShadeInput;
151 struct ShadeResult;
152
153 /* note: types are needed to restore callbacks, don't change values */
154 #define SH_NODE_OUTPUT          1
155
156 #define SH_NODE_MATERIAL        100
157 #define SH_NODE_RGB                     101
158 #define SH_NODE_VALUE           102
159 #define SH_NODE_MIX_RGB         103
160 #define SH_NODE_VALTORGB        104
161 #define SH_NODE_RGBTOBW         105
162 #define SH_NODE_TEXTURE         106
163 #define SH_NODE_NORMAL          107
164 #define SH_NODE_GEOMETRY        108
165 #define SH_NODE_MAPPING         109
166 #define SH_NODE_CURVE_VEC       110
167 #define SH_NODE_CURVE_RGB       111
168
169 /* custom defines: options for Material node */
170 #define SH_NODE_MAT_DIFF        1
171 #define SH_NODE_MAT_SPEC        2
172 #define SH_NODE_MAT_NEG         4
173
174 /* the type definitions array */
175 extern bNodeType *node_all_shaders[];
176
177 /* API */
178
179 void                    ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
180 int                             ntreeShaderGetTexco(struct bNodeTree *ntree, int osa);
181 void                    nodeShaderSynchronizeID(struct bNode *node, int copyto);
182
183                                 /* switch material render loop */
184 void                    set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *));
185
186 /* ************** COMPOSIT NODES *************** */
187
188 /* note: types are needed to restore callbacks, don't change values */
189 #define CMP_NODE_VIEWER         201
190 #define CMP_NODE_RGB            202
191 #define CMP_NODE_VALUE          203
192 #define CMP_NODE_MIX_RGB        204
193 #define CMP_NODE_VALTORGB       205
194 #define CMP_NODE_RGBTOBW        206
195 #define CMP_NODE_NORMAL         207
196 #define CMP_NODE_CURVE_VEC      208
197 #define CMP_NODE_CURVE_RGB      209
198 #define CMP_NODE_ALPHAOVER      210
199 #define CMP_NODE_BLUR           211
200 #define CMP_NODE_FILTER         212
201 #define CMP_NODE_MAP_VALUE      213
202 #define CMP_NODE_TIME           214
203
204 #define CMP_NODE_IMAGE                  220
205 #define CMP_NODE_R_RESULT               221
206 #define CMP_NODE_COMPOSITE              222
207 #define CMP_NODE_OUTPUT_FILE    223
208
209
210 /* filter types */
211 #define CMP_FILT_SOFT           0
212 #define CMP_FILT_SHARP          1
213 #define CMP_FILT_LAPLACE        2
214 #define CMP_FILT_SOBEL          3
215 #define CMP_FILT_PREWITT        4
216 #define CMP_FILT_KIRSCH         5
217 #define CMP_FILT_SHADOW         6
218
219
220 /* the type definitions array */
221 extern bNodeType *node_all_composit[];
222
223 /* API */
224 struct CompBuf;
225 int ntreeCompositNeedsRender(struct bNodeTree *ntree);
226 void ntreeCompositTagRender(struct bNodeTree *ntree);
227
228 void free_compbuf(struct CompBuf *cbuf); /* internal...*/
229
230 #endif
231