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