Cycles: svn merge -r40358:40411 ^/trunk/blender
[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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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): Bob Holcomb.
29  *
30  * ***** END GPL LICENSE BLOCK *****
31  */
32
33 #ifndef BKE_NODE_H
34 #define BKE_NODE_H
35
36 /** \file BKE_node.h
37  *  \ingroup bke
38  */
39
40 #include "DNA_listBase.h"
41
42 #include "RNA_types.h"
43
44 /* not very important, but the stack solver likes to know a maximum */
45 #define MAX_SOCKET      64
46
47 struct bContext;
48 struct bNode;
49 struct bNodeLink;
50 struct bNodeSocket;
51 struct bNodeStack;
52 struct bNodeTree;
53 struct bNodeTreeExec;
54 struct GPUMaterial;
55 struct GPUNode;
56 struct GPUNodeStack;
57 struct ID;
58 struct ListBase;
59 struct Main;
60 struct uiBlock;
61 struct uiLayout;
62 struct MTex;
63 struct PointerRNA;
64 struct rctf;
65 struct RenderData;
66 struct Scene;
67 struct Tex;
68 struct SpaceNode;
69 struct ARegion;
70 struct Object;
71
72 /* ************** NODE TYPE DEFINITIONS ***** */
73
74 /** Compact definition of a node socket.
75  * Can be used to quickly define a list of static sockets for a node,
76  * which are added to each new node of that type. 
77  *
78  * \deprecated New nodes should add default sockets in the initialization
79  * function instead. This struct is mostly kept for old nodes and should
80  * be removed some time.
81  */
82 typedef struct bNodeSocketTemplate {
83         int type, limit;
84         char name[32];
85         float val1, val2, val3, val4;   /* default alloc value for inputs */
86         float min, max;
87         PropertySubType subtype;
88         int flag;
89         
90         /* after this line is used internal only */
91         struct bNodeSocket *sock;               /* used to hold verified socket */
92 } bNodeSocketTemplate;
93
94 typedef void (*NodeSocketButtonFunction)(const struct bContext *C, struct uiBlock *block, 
95                                                                                  struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock,
96                                                                                  const char *name, int x, int y, int width);
97
98 /** Defines a socket type.
99  * Defines the appearance and behavior of a socket in the UI.
100  */
101 typedef struct bNodeSocketType {
102         int type;
103         char ui_name[32];
104         char ui_description[128];
105         int ui_icon;
106         char ui_color[4];
107         
108         const char *value_structname;
109         int value_structsize;
110         
111         NodeSocketButtonFunction buttonfunc;
112 } bNodeSocketType;
113
114 /** Template for creating a node.
115  * Stored required parameters to make a new node of a specific type.
116  */
117 typedef struct bNodeTemplate {
118         int type;
119         
120         /* group tree */
121         struct bNodeTree *ngroup;
122 } bNodeTemplate;
123
124 /** Defines a node type.
125  * Initial attributes and constants for a node as well as callback functions
126  * implementing the node behavior.
127  */
128 typedef struct bNodeType {
129         void *next,*prev;
130         short needs_free;               /* set for allocated types that need to be freed */
131         
132         int type;
133         char name[32];
134         float width, minwidth, maxwidth;
135         float height, minheight, maxheight;
136         short nclass, flag;
137         
138         /* templates for static sockets */
139         bNodeSocketTemplate *inputs, *outputs;
140         
141         char storagename[64];                   /* struct name for DNA */
142         
143         /// Main draw function for the node.
144         void (*drawfunc)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node);
145         /// Updates the node geometry attributes according to internal state before actual drawing.
146         void (*drawupdatefunc)(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
147         /// Draw the option buttons on the node.
148         void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
149         /// Additional parameters in the side panel.
150         void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
151         /// Optional custom label function for the node header.
152         const char *(*labelfunc)(struct bNode *);
153         /// Optional custom resize handle polling.
154         int (*resize_area_func)(struct bNode *node, int x, int y);
155         
156         /// Called when the node is updated in the editor.
157         void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
158         /// Check and update if internal ID data has changed.
159         void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
160         
161         /// Initialize a new node instance of this type after creation.
162         void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
163         /// Free the custom storage data.
164         void (*freestoragefunc)(struct bNode *node);
165         /// Make a copy of the custom storage data.
166         void (*copystoragefunc)(struct bNode *node, struct bNode *target);
167         
168         /// Create a template from an existing node.
169         struct bNodeTemplate (*templatefunc)(struct bNode *);
170         /** If a node can be made from the template in the given node tree.
171          * \example Node groups can not be created inside their own node tree.
172          */
173         int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
174         
175         /// Initialize a node tree associated to this node type.
176         void (*inittreefunc)(struct bNodeTree *ntree);
177         /// Update a node tree associated to this node type.
178         void (*updatetreefunc)(struct bNodeTree *ntree);
179         
180         /* group edit callbacks for operators */
181         /* XXX this is going to be changed as required by the UI */
182         struct bNodeTree *(*group_edit_get)(struct bNode *node);
183         struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit);
184         void (*group_edit_clear)(struct bNode *node);
185         
186         
187         /* **** execution callbacks **** */
188         void *(*initexecfunc)(struct bNode *node);
189         void (*freeexecfunc)(struct bNode *node, void *nodedata);
190         void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
191         /* XXX this alternative exec function has been added to avoid changing all node types.
192          * when a final generic version of execution code is defined, this will be changed anyway
193          */
194         void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
195         /* gpu */
196         int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
197         /* extended gpu function */
198         int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
199 } bNodeType;
200
201 /* node->exec, now in use for composites (#define for break is same as ready yes) */
202 #define NODE_PROCESSING 1
203 #define NODE_READY              2
204 #define NODE_BREAK              2
205 #define NODE_FINISHED   4
206 #define NODE_FREEBUFS   8
207 #define NODE_SKIPPED    16
208
209 /* sim_exec return value */
210 #define NODE_EXEC_FINISHED      0
211 #define NODE_EXEC_SUSPEND       1
212
213 /* nodetype->nclass, for add-menu and themes */
214 #define NODE_CLASS_INPUT                        0
215 #define NODE_CLASS_OUTPUT                       1
216 #define NODE_CLASS_OP_COLOR                     3
217 #define NODE_CLASS_OP_VECTOR            4
218 #define NODE_CLASS_OP_FILTER            5
219 #define NODE_CLASS_GROUP                        6
220 #define NODE_CLASS_FILE                         7
221 #define NODE_CLASS_CONVERTOR            8
222 #define NODE_CLASS_MATTE                        9
223 #define NODE_CLASS_DISTORT                      10
224 #define NODE_CLASS_OP_DYNAMIC           11
225 #define NODE_CLASS_PATTERN                      12
226 #define NODE_CLASS_TEXTURE                      13
227 #define NODE_CLASS_EXECUTION            14
228 #define NODE_CLASS_GETDATA                      15
229 #define NODE_CLASS_SETDATA                      16
230 #define NODE_CLASS_MATH                         17
231 #define NODE_CLASS_MATH_VECTOR          18
232 #define NODE_CLASS_MATH_ROTATION        19
233 #define NODE_CLASS_PARTICLES            25
234 #define NODE_CLASS_TRANSFORM            30
235 #define NODE_CLASS_COMBINE                      31
236 #define NODE_CLASS_SHADER                       40
237 #define NODE_CLASS_LAYOUT                       100
238
239 /* enum values for input/output */
240 #define SOCK_IN         1
241 #define SOCK_OUT        2
242
243 struct bNodeTreeExec;
244
245 typedef void (*bNodeTreeCallback)(void *calldata, struct ID *owner_id, struct bNodeTree *ntree);
246 typedef struct bNodeTreeType
247 {
248         int type;                                               /* type identifier */
249         char idname[64];                                /* id name for RNA identification */
250         
251         ListBase node_types;                    /* type definitions */
252         
253         /* callbacks */
254         void (*free_cache)(struct bNodeTree *ntree);
255         void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node);
256         void (*foreach_nodetree)(struct Main *main, void *calldata, bNodeTreeCallback func);            /* iteration over all node trees */
257
258         /* calls allowing threaded composite */
259         void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
260         void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
261         void (*local_merge)(struct bNodeTree *localtree, struct bNodeTree *ntree);
262
263         /* Tree update. Overrides nodetype->updatetreefunc! */
264         void (*update)(struct bNodeTree *ntree);
265         /* Node update. Overrides nodetype->updatefunc! */
266         void (*update_node)(struct bNodeTree *ntree, struct bNode *node);
267         
268         int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
269 } bNodeTreeType;
270
271 /* ************** GENERIC API, TREES *************** */
272
273 struct bNodeTreeType *ntreeGetType(int type);
274 struct bNodeType *ntreeGetNodeType(struct bNodeTree *ntree);
275 struct bNodeSocketType *ntreeGetSocketType(int type);
276
277 struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype);
278 void                    ntreeInitTypes(struct bNodeTree *ntree);
279
280 void                    ntreeFreeTree(struct bNodeTree *ntree);
281 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
282 void                    ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
283 void                    ntreeMakeLocal(struct bNodeTree *ntree);
284 int                             ntreeHasType(struct bNodeTree *ntree, int type);
285
286 void                    ntreeSocketUseFlags(struct bNodeTree *ntree);
287
288 void                    ntreeUpdateTree(struct bNodeTree *ntree);
289 /* XXX Currently each tree update call does call to ntreeVerifyNodes too.
290  * Some day this should be replaced by a decent depsgraph automatism!
291  */
292 void                    ntreeVerifyNodes(struct Main *main, struct ID *id);
293
294 void                    ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
295
296 /* XXX old trees handle output flags automatically based on special output node types and last active selection.
297  * new tree types have a per-output socket flag to indicate the final output to use explicitly.
298  */
299 void                    ntreeSetOutput(struct bNodeTree *ntree);
300 void                    ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
301 void                    ntreeClearPreview(struct bNodeTree *ntree);
302
303 void                    ntreeFreeCache(struct bNodeTree *ntree);
304
305 int                             ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
306 int                             ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
307 struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
308 void                    ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
309 void                    ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
310
311 /* ************** GENERIC API, NODES *************** */
312
313 struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type);
314 struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
315 void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
316 void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
317
318 void                    nodeAddToPreview(struct bNode *, float *, int, int, int);
319
320 struct bNode    *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
321 void                    nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
322 void                    nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
323
324 void                    nodeRegisterType(struct ListBase *typelist, struct bNodeType *ntype) ;
325 void                    nodeMakeDynamicType(struct bNode *node);
326 int                             nodeDynamicUnlinkText(struct ID *txtid);
327
328 void                    nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
329 struct bNode    *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
330
331 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
332 void                    nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
333 void                    nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
334
335 void                    nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
336 void                    nodeAttachNode(struct bNode *node, struct bNode *parent);
337 void                    nodeDetachNode(struct bNode *node);
338
339 struct bNode    *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
340 int                             nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex, int *in_out);
341
342 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
343 int                             nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
344
345 void                    nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
346 struct bNode    *nodeGetActive(struct bNodeTree *ntree);
347 struct bNode    *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
348 int                             nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
349 void                    nodeClearActiveID(struct bNodeTree *ntree, short idtype);
350 struct bNode    *nodeGetActiveTexture(struct bNodeTree *ntree);
351
352 void                    NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
353 int                             NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
354 void                    ntreeClearTags(struct bNodeTree *ntree);
355
356 void                    nodeFreePreview(struct bNode *node);
357
358 /* ************** NODE TYPE ACCESS *************** */
359
360 struct bNodeTemplate nodeMakeTemplate(struct bNode *node);
361 int                             nodeValid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
362 const char*             nodeLabel(struct bNode *node);
363 struct bNodeTree *nodeGroupEditGet(struct bNode *node);
364 struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit);
365 void                    nodeGroupEditClear(struct bNode *node);
366
367 /* Init a new node type struct with default values and callbacks */
368 void                    node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
369 void                    node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
370 void                    node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
371 void                    node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp));
372 void                    node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp));
373 void                    node_type_storage(struct bNodeType *ntype,
374                                                                   const char *storagename,
375                                                                   void (*freestoragefunc)(struct bNode *),
376                                                                   void (*copystoragefunc)(struct bNode *, struct bNode *));
377 void                    node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
378 void                    node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *));
379 void                    node_type_update(struct bNodeType *ntype,
380                                                                  void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
381                                                                  void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id));
382 void                    node_type_tree(struct bNodeType *ntype,
383                                                            void (*inittreefunc)(struct bNodeTree *),
384                                                            void (*updatetreefunc)(struct bNodeTree *));
385 void                    node_type_group_edit(struct bNodeType *ntype,
386                                                                          struct bNodeTree *(*group_edit_get)(struct bNode *node),
387                                                                          struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
388                                                                          void (*group_edit_clear)(struct bNode *node));
389
390 void                    node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
391 void                    node_type_exec_new(struct bNodeType *ntype,
392                                                                    void *(*initexecfunc)(struct bNode *node),
393                                                                    void (*freeexecfunc)(struct bNode *node, void *nodedata),
394                                                                    void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **));
395 void                    node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
396 void                    node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out));
397
398 /* ************** COMMON NODES *************** */
399
400 #define NODE_GROUP              2
401 #define NODE_FORLOOP    3
402 #define NODE_WHILELOOP  4
403 #define NODE_FRAME              5
404 #define NODE_GROUP_MENU         10000
405 #define NODE_DYNAMIC_MENU       20000
406
407 /* look up a socket on a group node by the internal group socket */
408 struct bNodeSocket *node_group_find_input(struct bNode *gnode, struct bNodeSocket *gsock);
409 struct bNodeSocket *node_group_find_output(struct bNode *gnode, struct bNodeSocket *gsock);
410
411 struct bNodeSocket *node_group_add_socket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
412 struct bNodeSocket *node_group_expose_socket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out);
413 void node_group_expose_all_sockets(struct bNodeTree *ngroup);
414 void node_group_remove_socket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
415
416 struct bNode    *node_group_make_from_selected(struct bNodeTree *ntree);
417 int                             node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode);
418
419 /* in node_common.c */
420 void register_node_type_frame(ListBase *lb);
421
422 /* ************** SHADER NODES *************** */
423
424 struct ShadeInput;
425 struct ShadeResult;
426
427 /* note: types are needed to restore callbacks, don't change values */
428 /* range 1 - 100 is reserved for common nodes */
429 /* using toolbox, we add node groups by assuming the values below don't exceed NODE_GROUP_MENU for now */
430
431 #define SH_NODE_OUTPUT          1
432
433 #define SH_NODE_MATERIAL        100
434 #define SH_NODE_RGB                     101
435 #define SH_NODE_VALUE           102
436 #define SH_NODE_MIX_RGB         103
437 #define SH_NODE_VALTORGB        104
438 #define SH_NODE_RGBTOBW         105
439 #define SH_NODE_TEXTURE         106
440 #define SH_NODE_NORMAL          107
441 #define SH_NODE_GEOM            108
442 #define SH_NODE_MAPPING         109
443 #define SH_NODE_CURVE_VEC       110
444 #define SH_NODE_CURVE_RGB       111
445 #define SH_NODE_CAMERA          114
446 #define SH_NODE_MATH            115
447 #define SH_NODE_VECT_MATH       116
448 #define SH_NODE_SQUEEZE         117
449 #define SH_NODE_MATERIAL_EXT    118
450 #define SH_NODE_INVERT          119
451 #define SH_NODE_SEPRGB          120
452 #define SH_NODE_COMBRGB         121
453 #define SH_NODE_HUE_SAT         122
454 #define NODE_DYNAMIC            123
455
456 #define SH_NODE_OUTPUT_MATERIAL                 124
457 #define SH_NODE_OUTPUT_WORLD                    125
458 #define SH_NODE_OUTPUT_LAMP                             126
459 #define SH_NODE_FRESNEL                                 127
460 #define SH_NODE_MIX_SHADER                              128
461 #define SH_NODE_ATTRIBUTE                               129
462 #define SH_NODE_BACKGROUND                              130
463 #define SH_NODE_BSDF_ANISOTROPIC                131
464 #define SH_NODE_BSDF_DIFFUSE                    132
465 #define SH_NODE_BSDF_GLOSSY                             133
466 #define SH_NODE_BSDF_GLASS                              134
467 #define SH_NODE_BSDF_TRANSLUCENT                137
468 #define SH_NODE_BSDF_TRANSPARENT                138
469 #define SH_NODE_BSDF_VELVET                             139
470 #define SH_NODE_EMISSION                                140
471 #define SH_NODE_GEOMETRY                                141
472 #define SH_NODE_LIGHT_PATH                              142
473 #define SH_NODE_TEX_IMAGE                               143
474 #define SH_NODE_TEX_NOISE                               144
475 #define SH_NODE_TEX_SKY                                 145
476 #define SH_NODE_TEX_BLEND                               146
477 #define SH_NODE_TEX_VORONOI                             147
478 #define SH_NODE_TEX_MAGIC                               148
479 #define SH_NODE_TEX_MARBLE                              149
480 #define SH_NODE_TEX_CLOUDS                              150
481 #define SH_NODE_TEX_WOOD                                151
482 #define SH_NODE_TEX_MUSGRAVE                    152
483 #define SH_NODE_TEX_STUCCI                              153
484 #define SH_NODE_TEX_DISTNOISE                   154
485 #define SH_NODE_TEX_COORD                               155
486 #define SH_NODE_ADD_SHADER                              156
487 #define SH_NODE_TEX_ENVIRONMENT                 157
488 #define SH_NODE_OUTPUT_TEXTURE                  158
489 #define SH_NODE_HOLDOUT                                 159
490 #define SH_NODE_BLEND_WEIGHT                    160
491
492 /* custom defines options for Material node */
493 #define SH_NODE_MAT_DIFF   1
494 #define SH_NODE_MAT_SPEC   2
495 #define SH_NODE_MAT_NEG    4
496 /* custom defines: states for Script node. These are bit indices */
497 #define NODE_DYNAMIC_READY      0 /* 1 */
498 #define NODE_DYNAMIC_LOADED     1 /* 2 */
499 #define NODE_DYNAMIC_NEW        2 /* 4 */
500 #define NODE_DYNAMIC_UPDATED    3 /* 8 */
501 #define NODE_DYNAMIC_ADDEXIST   4 /* 16 */
502 #define NODE_DYNAMIC_ERROR      5 /* 32 */
503 #define NODE_DYNAMIC_REPARSE    6 /* 64 */
504 #define NODE_DYNAMIC_SET        15 /* sign */
505
506 /* API */
507
508 struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
509 void                    ntreeShaderEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
510 void                    ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
511 void                    ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
512 void                    nodeShaderSynchronizeID(struct bNode *node, int copyto);
513
514                                 /* switch material render loop */
515 extern void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
516 void                    set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *));
517
518 void                    ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
519
520
521 /* ************** COMPOSITE NODES *************** */
522
523 /* output socket defines */
524 #define RRES_OUT_IMAGE          0
525 #define RRES_OUT_ALPHA          1
526 #define RRES_OUT_Z                      2
527 #define RRES_OUT_NORMAL         3
528 #define RRES_OUT_UV                     4
529 #define RRES_OUT_VEC            5
530 #define RRES_OUT_RGBA           6
531 #define RRES_OUT_DIFF           7
532 #define RRES_OUT_SPEC           8
533 #define RRES_OUT_SHADOW         9
534 #define RRES_OUT_AO                     10
535 #define RRES_OUT_REFLECT        11
536 #define RRES_OUT_REFRACT        12
537 #define RRES_OUT_INDIRECT       13
538 #define RRES_OUT_INDEXOB        14
539 #define RRES_OUT_INDEXMA        15
540 #define RRES_OUT_MIST           16
541 #define RRES_OUT_EMIT           17
542 #define RRES_OUT_ENV            18
543
544 /* note: types are needed to restore callbacks, don't change values */
545 #define CMP_NODE_VIEWER         201
546 #define CMP_NODE_RGB            202
547 #define CMP_NODE_VALUE          203
548 #define CMP_NODE_MIX_RGB        204
549 #define CMP_NODE_VALTORGB       205
550 #define CMP_NODE_RGBTOBW        206
551 #define CMP_NODE_NORMAL         207
552 #define CMP_NODE_CURVE_VEC      208
553 #define CMP_NODE_CURVE_RGB      209
554 #define CMP_NODE_ALPHAOVER      210
555 #define CMP_NODE_BLUR           211
556 #define CMP_NODE_FILTER         212
557 #define CMP_NODE_MAP_VALUE      213
558 #define CMP_NODE_TIME           214
559 #define CMP_NODE_VECBLUR        215
560 #define CMP_NODE_SEPRGBA        216
561 #define CMP_NODE_SEPHSVA        217
562 #define CMP_NODE_SETALPHA       218
563 #define CMP_NODE_HUE_SAT        219
564 #define CMP_NODE_IMAGE          220
565 #define CMP_NODE_R_LAYERS       221
566 #define CMP_NODE_COMPOSITE      222
567 #define CMP_NODE_OUTPUT_FILE    223
568 #define CMP_NODE_TEXTURE        224
569 #define CMP_NODE_TRANSLATE      225
570 #define CMP_NODE_ZCOMBINE       226
571 #define CMP_NODE_COMBRGBA       227
572 #define CMP_NODE_DILATEERODE    228
573 #define CMP_NODE_ROTATE         229
574 #define CMP_NODE_SCALE          230
575 #define CMP_NODE_SEPYCCA        231
576 #define CMP_NODE_COMBYCCA       232
577 #define CMP_NODE_SEPYUVA        233
578 #define CMP_NODE_COMBYUVA       234
579 #define CMP_NODE_DIFF_MATTE     235
580 #define CMP_NODE_COLOR_SPILL    236
581 #define CMP_NODE_CHROMA_MATTE   237
582 #define CMP_NODE_CHANNEL_MATTE  238
583 #define CMP_NODE_FLIP           239
584 #define CMP_NODE_SPLITVIEWER    240
585 #define CMP_NODE_INDEX_MASK     241
586 #define CMP_NODE_MAP_UV         242
587 #define CMP_NODE_ID_MASK        243
588 #define CMP_NODE_DEFOCUS        244
589 #define CMP_NODE_DISPLACE       245
590 #define CMP_NODE_COMBHSVA       246
591 #define CMP_NODE_MATH           247
592 #define CMP_NODE_LUMA_MATTE     248
593 #define CMP_NODE_BRIGHTCONTRAST 249
594 #define CMP_NODE_GAMMA          250
595 #define CMP_NODE_INVERT         251
596 #define CMP_NODE_NORMALIZE      252
597 #define CMP_NODE_CROP           253
598 #define CMP_NODE_DBLUR          254
599 #define CMP_NODE_BILATERALBLUR  255
600 #define CMP_NODE_PREMULKEY  256
601 #define CMP_NODE_DIST_MATTE     257
602 #define CMP_NODE_VIEW_LEVELS    258
603 #define CMP_NODE_COLOR_MATTE 259
604 #define CMP_NODE_COLORBALANCE 260
605 #define CMP_NODE_HUECORRECT 261
606
607 #define CMP_NODE_GLARE          301
608 #define CMP_NODE_TONEMAP        302
609 #define CMP_NODE_LENSDIST       303
610
611 /* channel toggles */
612 #define CMP_CHAN_RGB            1
613 #define CMP_CHAN_A                      2
614 #define CMP_CHAN_R                      4
615 #define CMP_CHAN_G                      8
616 #define CMP_CHAN_B                      16
617
618 /* filter types */
619 #define CMP_FILT_SOFT           0
620 #define CMP_FILT_SHARP          1
621 #define CMP_FILT_LAPLACE        2
622 #define CMP_FILT_SOBEL          3
623 #define CMP_FILT_PREWITT        4
624 #define CMP_FILT_KIRSCH         5
625 #define CMP_FILT_SHADOW         6
626
627 /* scale node type, in custom1 */
628 #define CMP_SCALE_RELATIVE              0
629 #define CMP_SCALE_ABSOLUTE              1
630 #define CMP_SCALE_SCENEPERCENT  2
631 #define CMP_SCALE_RENDERPERCENT 3
632
633
634 /* API */
635 struct CompBuf;
636 struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
637 void ntreeCompositEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
638 void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
639 void ntreeCompositTagRender(struct Scene *sce);
640 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
641 void ntreeCompositTagGenerators(struct bNodeTree *ntree);
642 void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
643
644
645
646 /* ************** TEXTURE NODES *************** */
647
648 struct TexResult;
649
650 #define TEX_NODE_OUTPUT     401
651 #define TEX_NODE_CHECKER    402
652 #define TEX_NODE_TEXTURE    403
653 #define TEX_NODE_BRICKS     404
654 #define TEX_NODE_MATH       405
655 #define TEX_NODE_MIX_RGB    406
656 #define TEX_NODE_RGBTOBW    407
657 #define TEX_NODE_VALTORGB   408
658 #define TEX_NODE_IMAGE      409
659 #define TEX_NODE_CURVE_RGB  410
660 #define TEX_NODE_INVERT     411
661 #define TEX_NODE_HUE_SAT    412
662 #define TEX_NODE_CURVE_TIME 413
663 #define TEX_NODE_ROTATE     414
664 #define TEX_NODE_VIEWER     415
665 #define TEX_NODE_TRANSLATE  416
666 #define TEX_NODE_COORD      417
667 #define TEX_NODE_DISTANCE   418
668 #define TEX_NODE_COMPOSE    419
669 #define TEX_NODE_DECOMPOSE  420
670 #define TEX_NODE_VALTONOR   421
671 #define TEX_NODE_SCALE      422
672 #define TEX_NODE_AT         423
673
674 /* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
675 #define TEX_NODE_PROC      500
676 #define TEX_NODE_PROC_MAX  600
677
678 /* API */
679 int  ntreeTexTagAnimated(struct bNodeTree *ntree);
680 void ntreeTexSetPreviewFlag(int);
681 void ntreeTexCheckCyclics(struct bNodeTree *ntree);
682 char* ntreeTexOutputMenu(struct bNodeTree *ntree);
683
684 struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
685 void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
686 int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
687
688
689 /*************************************************/
690
691 void init_nodesystem(void);
692 void free_nodesystem(void);
693
694 void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce);
695
696 #endif