Render API: shader script node for custom shaders.
[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.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Bob Holcomb.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __BKE_NODE_H__
29 #define __BKE_NODE_H__
30
31 /** \file BKE_node.h
32  *  \ingroup bke
33  */
34
35 #include "DNA_listBase.h"
36
37 #include "RNA_types.h"
38
39 /* not very important, but the stack solver likes to know a maximum */
40 #define MAX_SOCKET      64
41
42 struct bContext;
43 struct bNode;
44 struct bNodeLink;
45 struct bNodeSocket;
46 struct bNodeStack;
47 struct bNodeTree;
48 struct bNodeTreeExec;
49 struct GPUMaterial;
50 struct GPUNode;
51 struct GPUNodeStack;
52 struct ID;
53 struct ImageFormatData;
54 struct ListBase;
55 struct Main;
56 struct uiBlock;
57 struct uiLayout;
58 struct MTex;
59 struct PointerRNA;
60 struct rctf;
61 struct RenderData;
62 struct Scene;
63 struct Tex;
64 struct SpaceNode;
65 struct ARegion;
66 struct Object;
67 struct ColorManagedViewSettings;
68 struct ColorManagedDisplaySettings;
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[64];  /* MAX_NAME */
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[64];       /* MAX_NAME */
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         struct Main *main;
119         struct Scene *scene;
120         struct bNodeTree *ngroup;       /* group tree */
121 } bNodeTemplate;
122
123 /** Defines a node type.
124  * Initial attributes and constants for a node as well as callback functions
125  * implementing the node behavior.
126  */
127 typedef struct bNodeType {
128         void *next, *prev;
129         short needs_free;               /* set for allocated types that need to be freed */
130         
131         int type;
132         char name[64];  /* MAX_NAME */
133         float width, minwidth, maxwidth;
134         float height, minheight, maxheight;
135         short nclass, flag, compatibility;
136         
137         /* templates for static sockets */
138         bNodeSocketTemplate *inputs, *outputs;
139         
140         char storagename[64];                   /* struct name for DNA */
141         
142         /// Main draw function for the node.
143         void (*drawfunc)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node);
144         /// Updates the node geometry attributes according to internal state before actual drawing.
145         void (*drawupdatefunc)(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
146         /// Draw the option buttons on the node.
147         void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
148         /// Additional parameters in the side panel.
149         void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
150         /// Additional drawing on backdrop.
151         void (*uibackdropfunc)(struct SpaceNode *snode, struct ImBuf *backdrop, struct bNode *node, int x, int y);
152
153         /// Draw a node socket. Default draws the input value button.
154         NodeSocketButtonFunction drawinputfunc;
155         NodeSocketButtonFunction drawoutputfunc;
156
157         /// Optional custom label function for the node header.
158         const char *(*labelfunc)(struct bNode *);
159         /// Optional custom resize handle polling.
160         int (*resize_area_func)(struct bNode *node, int x, int y);
161         /// Optional selection area polling.
162         int (*select_area_func)(struct bNode *node, int x, int y);
163         /// Optional tweak area polling (for grabbing).
164         int (*tweak_area_func)(struct bNode *node, int x, int y);
165         
166         /// Called when the node is updated in the editor.
167         void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
168         /// Check and update if internal ID data has changed.
169         void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
170         
171         /// Initialize a new node instance of this type after creation.
172         void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
173         /// Free the custom storage data.
174         void (*freestoragefunc)(struct bNode *node);
175         /// Make a copy of the custom storage data.
176         void (*copystoragefunc)(struct bNode *node, struct bNode *target);
177         
178         /// Create a template from an existing node.
179         struct bNodeTemplate (*templatefunc)(struct bNode *);
180         /** If a node can be made from the template in the given node tree.
181          * \note Node groups can not be created inside their own node tree.
182          */
183         int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
184         
185         /// Initialize a node tree associated to this node type.
186         void (*inittreefunc)(struct bNodeTree *ntree);
187         /// Update a node tree associated to this node type.
188         void (*updatetreefunc)(struct bNodeTree *ntree);
189         
190         /* group edit callbacks for operators */
191         /* XXX this is going to be changed as required by the UI */
192         struct bNodeTree *(*group_edit_get)(struct bNode *node);
193         struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit);
194         void (*group_edit_clear)(struct bNode *node);
195         
196         /* Update the internal links list, for muting and disconnect operators. */
197         void (*update_internal_links)(struct bNodeTree *, struct bNode *node);
198         
199         /* **** execution callbacks **** */
200         void *(*initexecfunc)(struct bNode *node);
201         void (*freeexecfunc)(struct bNode *node, void *nodedata);
202         void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
203         /* XXX this alternative exec function has been added to avoid changing all node types.
204          * when a final generic version of execution code is defined, this will be changed anyway
205          */
206         void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
207         /* gpu */
208         int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
209         /* extended gpu function */
210         int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
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 /* deprecated */
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_SCRIPT                       32
249 #define NODE_CLASS_SHADER                       40
250 #define NODE_CLASS_LAYOUT                       100
251
252 /* nodetype->compatibility */
253 #define NODE_OLD_SHADING        1
254 #define NODE_NEW_SHADING        2
255
256 /* node resize directions */
257 #define NODE_RESIZE_TOP         1
258 #define NODE_RESIZE_BOTTOM      2
259 #define NODE_RESIZE_RIGHT       4
260 #define NODE_RESIZE_LEFT        8
261
262 /* enum values for input/output */
263 #define SOCK_IN         1
264 #define SOCK_OUT        2
265
266 struct bNodeTreeExec;
267
268 typedef void (*bNodeTreeCallback)(void *calldata, struct ID *owner_id, struct bNodeTree *ntree);
269 typedef void (*bNodeClassCallback)(void *calldata, int nclass, const char *name);
270 typedef struct bNodeTreeType {
271         int type;                                               /* type identifier */
272         char idname[64];                                /* id name for RNA identification */
273         
274         ListBase node_types;                    /* type definitions */
275         
276         /* callbacks */
277         void (*free_cache)(struct bNodeTree *ntree);
278         void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node);
279         void (*foreach_nodetree)(struct Main *main, void *calldata, bNodeTreeCallback func);            /* iteration over all node trees */
280         void (*foreach_nodeclass)(struct Scene *scene, void *calldata, bNodeClassCallback func);        /* iteration over all node classes */
281
282         /* calls allowing threaded composite */
283         void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
284         void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
285         void (*local_merge)(struct bNodeTree *localtree, struct bNodeTree *ntree);
286
287         /* Tree update. Overrides nodetype->updatetreefunc! */
288         void (*update)(struct bNodeTree *ntree);
289         /* Node update. Overrides nodetype->updatefunc! */
290         void (*update_node)(struct bNodeTree *ntree, struct bNode *node);
291         
292         int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
293
294         /* Default internal linking. */
295         void (*update_internal_links)(struct bNodeTree *, struct bNode *node);
296 } bNodeTreeType;
297
298 /* ************** GENERIC API, TREES *************** */
299
300 struct bNodeTreeType *ntreeGetType(int type);
301 struct bNodeType *ntreeGetNodeType(struct bNodeTree *ntree);
302 struct bNodeSocketType *ntreeGetSocketType(int type);
303
304 struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype);
305 void              ntreeInitTypes(struct bNodeTree *ntree);
306
307 /* copy/free funcs, need to manage ID users */
308 void              ntreeFreeTree_ex(struct bNodeTree *ntree, const short do_id_user);
309 void              ntreeFreeTree(struct bNodeTree *ntree);
310 struct bNodeTree *ntreeCopyTree_ex(struct bNodeTree *ntree, const short do_id_user);
311 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
312 void              ntreeSwitchID_ex(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to, const short do_id_user);
313 void              ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
314 /* node->id user count */
315 void              ntreeUserIncrefID(struct bNodeTree *ntree);
316 void              ntreeUserDecrefID(struct bNodeTree *ntree);
317
318
319 void              ntreeMakeLocal(struct bNodeTree *ntree);
320 int               ntreeHasType(struct bNodeTree *ntree, int type);
321 void              ntreeUpdateTree(struct bNodeTree *ntree);
322 /* XXX Currently each tree update call does call to ntreeVerifyNodes too.
323  * Some day this should be replaced by a decent depsgraph automatism!
324  */
325 void              ntreeVerifyNodes(struct Main *main, struct ID *id);
326
327 void              ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
328
329 /* XXX old trees handle output flags automatically based on special output node types and last active selection.
330  * new tree types have a per-output socket flag to indicate the final output to use explicitly.
331  */
332 void            ntreeSetOutput(struct bNodeTree *ntree);
333 void            ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
334 void            ntreeClearPreview(struct bNodeTree *ntree);
335
336 void            ntreeFreeCache(struct bNodeTree *ntree);
337
338 int             ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
339 int             ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
340 struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
341 void            ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
342 void            ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
343
344 /* ************** GENERIC API, NODES *************** */
345
346 struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type);
347 struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
348 void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
349 void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
350
351 void            nodeAddToPreview(struct bNode *node, const float col[4], int x, int y, int do_manage);
352
353 struct bNode    *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
354 void            nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
355 void            nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
356
357 void            nodeRegisterType(struct bNodeTreeType *ttype, struct bNodeType *ntype);
358 void            nodeMakeDynamicType(struct bNode *node);
359 int             nodeDynamicUnlinkText(struct ID *txtid);
360
361 void            nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
362 struct bNode    *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
363
364 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
365 void            nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
366 void            nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
367 void            nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
368
369 void            nodeToView(struct bNode *node, float x, float y, float *rx, float *ry);
370 void            nodeFromView(struct bNode *node, float x, float y, float *rx, float *ry);
371 int             nodeAttachNodeCheck(struct bNode *node, struct bNode *parent);
372 void            nodeAttachNode(struct bNode *node, struct bNode *parent);
373 void            nodeDetachNode(struct bNode *node);
374
375 struct bNode   *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
376 int             nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex, int *in_out);
377
378 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
379 int             nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
380
381 void            nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
382 struct bNode   *nodeGetActive(struct bNodeTree *ntree);
383 struct bNode   *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
384 int             nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
385 void            nodeClearActive(struct bNodeTree *ntree);
386 void            nodeClearActiveID(struct bNodeTree *ntree, short idtype);
387 struct bNode   *nodeGetActiveTexture(struct bNodeTree *ntree);
388
389 void            nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
390 int             nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
391 void            nodeUpdateInternalLinks(struct bNodeTree *ntree, struct bNode *node);
392
393 void            nodeFreePreview(struct bNode *node);
394
395 int             nodeSocketIsHidden(struct bNodeSocket *sock);
396 void            nodeSocketSetType(struct bNodeSocket *sock, int type);
397
398 /* Node Clipboard */
399 void                   BKE_node_clipboard_init(struct bNodeTree *ntree);
400 void                   BKE_node_clipboard_clear(void);
401 int                    BKE_node_clipboard_validate(void);
402 void                   BKE_node_clipboard_add_node(struct bNode *node);
403 void                   BKE_node_clipboard_add_link(struct bNodeLink *link);
404 const struct ListBase *BKE_node_clipboard_get_nodes(void);
405 const struct ListBase *BKE_node_clipboard_get_links(void);
406 int                    BKE_node_clipboard_get_type(void);
407
408 /* ************** NODE TYPE ACCESS *************** */
409
410 struct bNodeTemplate nodeMakeTemplate(struct bNode *node);
411 int             nodeValid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
412 const char     *nodeLabel(struct bNode *node);
413 struct bNodeTree *nodeGroupEditGet(struct bNode *node);
414 struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit);
415 void            nodeGroupEditClear(struct bNode *node);
416
417 /* Init a new node type struct with default values and callbacks */
418 void            node_type_base(struct bNodeTreeType *ttype, struct bNodeType *ntype, int type,
419                                const char *name, short nclass, short flag);
420 void            node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
421 void            node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
422 void            node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp));
423 void            node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp));
424 void            node_type_storage(struct bNodeType *ntype,
425                                   const char *storagename,
426                                   void (*freestoragefunc)(struct bNode *),
427                                   void (*copystoragefunc)(struct bNode *, struct bNode *));
428 void            node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
429 void            node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *));
430 void            node_type_update(struct bNodeType *ntype,
431                                  void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
432                                  void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id));
433 void            node_type_tree(struct bNodeType *ntype,
434                                void (*inittreefunc)(struct bNodeTree *),
435                                void (*updatetreefunc)(struct bNodeTree *));
436 void            node_type_group_edit(struct bNodeType *ntype,
437                                      struct bNodeTree *(*group_edit_get)(struct bNode *node),
438                                      struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
439                                      void (*group_edit_clear)(struct bNode *node));
440
441 void            node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **,
442                                                                          struct bNodeStack **));
443 void            node_type_exec_new(struct bNodeType *ntype,
444                                    void *(*initexecfunc)(struct bNode *node),
445                                    void (*freeexecfunc)(struct bNode *node, void *nodedata),
446                                    void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata,
447                                                        struct bNodeStack **, struct bNodeStack **));
448 void            node_type_internal_links(struct bNodeType *ntype, void (*update_internal_links)(struct bNodeTree *, struct bNode *));
449 void            node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node,
450                                                                       struct GPUNodeStack *in, struct GPUNodeStack *out));
451 void            node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node,
452                                                                              void *nodedata, struct GPUNodeStack *in,
453                                                                              struct GPUNodeStack *out));
454 void            node_type_compatibility(struct bNodeType *ntype, short compatibility);
455
456 /* ************** COMMON NODES *************** */
457
458 #define NODE_GROUP              2
459 #define __NODE_FORLOOP  3       /* deprecated */
460 #define __NODE_WHILELOOP        4       /* deprecated */
461 #define NODE_FRAME              5
462 #define NODE_REROUTE    6
463
464 /* look up a socket on a group node by the internal group socket */
465 struct bNodeSocket *node_group_find_input(struct bNode *gnode, struct bNodeSocket *gsock);
466 struct bNodeSocket *node_group_find_output(struct bNode *gnode, struct bNodeSocket *gsock);
467
468 struct bNodeSocket *node_group_add_socket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
469 struct bNodeSocket *node_group_expose_socket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out);
470 void node_group_expose_all_sockets(struct bNodeTree *ngroup);
471 void node_group_remove_socket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
472 struct bNodeSocket *node_group_add_extern_socket(struct bNodeTree *ntree, ListBase *lb, int in_out, struct bNodeSocket *gsock);
473
474 /* in node_common.c */
475 void register_node_type_frame(struct bNodeTreeType *ttype);
476 void register_node_type_reroute(struct bNodeTreeType *ttype);
477
478 void BKE_node_tree_unlink_id_cb(void *calldata, struct ID *owner_id, struct bNodeTree *ntree);
479
480 /* ************** SHADER NODES *************** */
481
482 struct ShadeInput;
483 struct ShadeResult;
484
485 /* note: types are needed to restore callbacks, don't change values */
486 /* range 1 - 100 is reserved for common nodes */
487 /* using toolbox, we add node groups by assuming the values below don't exceed NODE_GROUP_MENU for now */
488
489 #define SH_NODE_OUTPUT          1
490
491 #define SH_NODE_MATERIAL        100
492 #define SH_NODE_RGB                     101
493 #define SH_NODE_VALUE           102
494 #define SH_NODE_MIX_RGB         103
495 #define SH_NODE_VALTORGB        104
496 #define SH_NODE_RGBTOBW         105
497 #define SH_NODE_TEXTURE         106
498 #define SH_NODE_NORMAL          107
499 #define SH_NODE_GEOMETRY        108
500 #define SH_NODE_MAPPING         109
501 #define SH_NODE_CURVE_VEC       110
502 #define SH_NODE_CURVE_RGB       111
503 #define SH_NODE_CAMERA          114
504 #define SH_NODE_MATH            115
505 #define SH_NODE_VECT_MATH       116
506 #define SH_NODE_SQUEEZE         117
507 #define SH_NODE_MATERIAL_EXT    118
508 #define SH_NODE_INVERT          119
509 #define SH_NODE_SEPRGB          120
510 #define SH_NODE_COMBRGB         121
511 #define SH_NODE_HUE_SAT         122
512 #define NODE_DYNAMIC            123
513
514 #define SH_NODE_OUTPUT_MATERIAL                 124
515 #define SH_NODE_OUTPUT_WORLD                    125
516 #define SH_NODE_OUTPUT_LAMP                             126
517 #define SH_NODE_FRESNEL                                 127
518 #define SH_NODE_MIX_SHADER                              128
519 #define SH_NODE_ATTRIBUTE                               129
520 #define SH_NODE_BACKGROUND                              130
521 #define SH_NODE_BSDF_ANISOTROPIC                131
522 #define SH_NODE_BSDF_DIFFUSE                    132
523 #define SH_NODE_BSDF_GLOSSY                             133
524 #define SH_NODE_BSDF_GLASS                              134
525 #define SH_NODE_BSDF_TRANSLUCENT                137
526 #define SH_NODE_BSDF_TRANSPARENT                138
527 #define SH_NODE_BSDF_VELVET                             139
528 #define SH_NODE_EMISSION                                140
529 #define SH_NODE_NEW_GEOMETRY                    141
530 #define SH_NODE_LIGHT_PATH                              142
531 #define SH_NODE_TEX_IMAGE                               143
532 #define SH_NODE_TEX_SKY                                 145
533 #define SH_NODE_TEX_GRADIENT                    146
534 #define SH_NODE_TEX_VORONOI                             147
535 #define SH_NODE_TEX_MAGIC                               148
536 #define SH_NODE_TEX_WAVE                                149
537 #define SH_NODE_TEX_NOISE                               150
538 #define SH_NODE_TEX_MUSGRAVE                    152
539 #define SH_NODE_TEX_COORD                               155
540 #define SH_NODE_ADD_SHADER                              156
541 #define SH_NODE_TEX_ENVIRONMENT                 157
542 #define SH_NODE_OUTPUT_TEXTURE                  158
543 #define SH_NODE_HOLDOUT                                 159
544 #define SH_NODE_LAYER_WEIGHT                    160
545 #define SH_NODE_VOLUME_TRANSPARENT              161
546 #define SH_NODE_VOLUME_ISOTROPIC                162
547 #define SH_NODE_GAMMA                                   163
548 #define SH_NODE_TEX_CHECKER                             164
549 #define SH_NODE_BRIGHTCONTRAST                  165
550 #define SH_NODE_LIGHT_FALLOFF                   166
551 #define SH_NODE_OBJECT_INFO                             167
552 #define SH_NODE_PARTICLE_INFO           168
553 #define SH_NODE_TEX_BRICK                               169
554 #define SH_NODE_BUMP                                    170
555 #define SH_NODE_SCRIPT                                  171
556
557 /* custom defines options for Material node */
558 #define SH_NODE_MAT_DIFF   1
559 #define SH_NODE_MAT_SPEC   2
560 #define SH_NODE_MAT_NEG    4
561 /* custom defines: states for Script node. These are bit indices */
562 #define NODE_DYNAMIC_READY      0 /* 1 */
563 #define NODE_DYNAMIC_LOADED     1 /* 2 */
564 #define NODE_DYNAMIC_NEW        2 /* 4 */
565 #define NODE_DYNAMIC_UPDATED    3 /* 8 */
566 #define NODE_DYNAMIC_ADDEXIST   4 /* 16 */
567 #define NODE_DYNAMIC_ERROR      5 /* 32 */
568 #define NODE_DYNAMIC_REPARSE    6 /* 64 */
569 #define NODE_DYNAMIC_SET        15 /* sign */
570
571 /* API */
572
573 struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
574 void            ntreeShaderEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
575 void            ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
576 void            ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
577 void            nodeShaderSynchronizeID(struct bNode *node, int copyto);
578
579 /* switch material render loop */
580 extern void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
581 void            set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *));
582
583 void            ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
584
585
586 /* ************** COMPOSITE NODES *************** */
587
588 /* output socket defines */
589 #define RRES_OUT_IMAGE                          0
590 #define RRES_OUT_ALPHA                          1
591 #define RRES_OUT_Z                                      2
592 #define RRES_OUT_NORMAL                         3
593 #define RRES_OUT_UV                                     4
594 #define RRES_OUT_VEC                            5
595 #define RRES_OUT_RGBA                           6
596 #define RRES_OUT_DIFF                           7
597 #define RRES_OUT_SPEC                           8
598 #define RRES_OUT_SHADOW                         9
599 #define RRES_OUT_AO                                     10
600 #define RRES_OUT_REFLECT                        11
601 #define RRES_OUT_REFRACT                        12
602 #define RRES_OUT_INDIRECT                       13
603 #define RRES_OUT_INDEXOB                        14
604 #define RRES_OUT_INDEXMA                        15
605 #define RRES_OUT_MIST                           16
606 #define RRES_OUT_EMIT                           17
607 #define RRES_OUT_ENV                            18
608 #define RRES_OUT_DIFF_DIRECT            19
609 #define RRES_OUT_DIFF_INDIRECT          20
610 #define RRES_OUT_DIFF_COLOR                     21
611 #define RRES_OUT_GLOSSY_DIRECT          22
612 #define RRES_OUT_GLOSSY_INDIRECT        23
613 #define RRES_OUT_GLOSSY_COLOR           24
614 #define RRES_OUT_TRANSM_DIRECT          25
615 #define RRES_OUT_TRANSM_INDIRECT        26
616 #define RRES_OUT_TRANSM_COLOR           27
617
618 /* note: types are needed to restore callbacks, don't change values */
619 #define CMP_NODE_VIEWER         201
620 #define CMP_NODE_RGB            202
621 #define CMP_NODE_VALUE          203
622 #define CMP_NODE_MIX_RGB        204
623 #define CMP_NODE_VALTORGB       205
624 #define CMP_NODE_RGBTOBW        206
625 #define CMP_NODE_NORMAL         207
626 #define CMP_NODE_CURVE_VEC      208
627 #define CMP_NODE_CURVE_RGB      209
628 #define CMP_NODE_ALPHAOVER      210
629 #define CMP_NODE_BLUR           211
630 #define CMP_NODE_FILTER         212
631 #define CMP_NODE_MAP_VALUE      213
632 #define CMP_NODE_TIME           214
633 #define CMP_NODE_VECBLUR        215
634 #define CMP_NODE_SEPRGBA        216
635 #define CMP_NODE_SEPHSVA        217
636 #define CMP_NODE_SETALPHA       218
637 #define CMP_NODE_HUE_SAT        219
638 #define CMP_NODE_IMAGE          220
639 #define CMP_NODE_R_LAYERS       221
640 #define CMP_NODE_COMPOSITE      222
641 #define CMP_NODE_OUTPUT_FILE    223
642 #define CMP_NODE_TEXTURE        224
643 #define CMP_NODE_TRANSLATE      225
644 #define CMP_NODE_ZCOMBINE       226
645 #define CMP_NODE_COMBRGBA       227
646 #define CMP_NODE_DILATEERODE    228
647 #define CMP_NODE_ROTATE         229
648 #define CMP_NODE_SCALE          230
649 #define CMP_NODE_SEPYCCA        231
650 #define CMP_NODE_COMBYCCA       232
651 #define CMP_NODE_SEPYUVA        233
652 #define CMP_NODE_COMBYUVA       234
653 #define CMP_NODE_DIFF_MATTE     235
654 #define CMP_NODE_COLOR_SPILL    236
655 #define CMP_NODE_CHROMA_MATTE   237
656 #define CMP_NODE_CHANNEL_MATTE  238
657 #define CMP_NODE_FLIP           239
658 #define CMP_NODE_SPLITVIEWER    240
659 #define CMP_NODE_INDEX_MASK     241
660 #define CMP_NODE_MAP_UV         242
661 #define CMP_NODE_ID_MASK        243
662 #define CMP_NODE_DEFOCUS        244
663 #define CMP_NODE_DISPLACE       245
664 #define CMP_NODE_COMBHSVA       246
665 #define CMP_NODE_MATH           247
666 #define CMP_NODE_LUMA_MATTE     248
667 #define CMP_NODE_BRIGHTCONTRAST 249
668 #define CMP_NODE_GAMMA          250
669 #define CMP_NODE_INVERT         251
670 #define CMP_NODE_NORMALIZE      252
671 #define CMP_NODE_CROP           253
672 #define CMP_NODE_DBLUR          254
673 #define CMP_NODE_BILATERALBLUR  255
674 #define CMP_NODE_PREMULKEY  256
675 #define CMP_NODE_DIST_MATTE     257
676 #define CMP_NODE_VIEW_LEVELS    258
677 #define CMP_NODE_COLOR_MATTE 259
678 #define CMP_NODE_COLORBALANCE 260
679 #define CMP_NODE_HUECORRECT 261
680 #define CMP_NODE_MOVIECLIP      262
681 #define CMP_NODE_STABILIZE2D    263
682 #define CMP_NODE_TRANSFORM      264
683 #define CMP_NODE_MOVIEDISTORTION        265
684 #define CMP_NODE_DOUBLEEDGEMASK    266
685 #define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED  267     /* DEPRECATED multi file node has been merged into regular CMP_NODE_OUTPUT_FILE */
686 #define CMP_NODE_MASK           268
687 #define CMP_NODE_KEYINGSCREEN           269
688 #define CMP_NODE_KEYING                 270
689 #define CMP_NODE_TRACKPOS               271
690 #define CMP_NODE_INPAINT    272
691 #define CMP_NODE_DESPECKLE  273
692
693 #define CMP_NODE_GLARE          301
694 #define CMP_NODE_TONEMAP        302
695 #define CMP_NODE_LENSDIST       303
696
697 #define CMP_NODE_COLORCORRECTION 312
698 #define CMP_NODE_MASK_BOX       313
699 #define CMP_NODE_MASK_ELLIPSE   314
700 #define CMP_NODE_BOKEHIMAGE     315
701 #define CMP_NODE_BOKEHBLUR      316
702 #define CMP_NODE_SWITCH         317
703 #define CMP_NODE_PIXELATE       318
704
705 /* channel toggles */
706 #define CMP_CHAN_RGB            1
707 #define CMP_CHAN_A                      2
708 #define CMP_CHAN_R                      4
709 #define CMP_CHAN_G                      8
710 #define CMP_CHAN_B                      16
711
712 /* filter types */
713 #define CMP_FILT_SOFT           0
714 #define CMP_FILT_SHARP          1
715 #define CMP_FILT_LAPLACE        2
716 #define CMP_FILT_SOBEL          3
717 #define CMP_FILT_PREWITT        4
718 #define CMP_FILT_KIRSCH         5
719 #define CMP_FILT_SHADOW         6
720
721 /* scale node type, in custom1 */
722 #define CMP_SCALE_RELATIVE              0
723 #define CMP_SCALE_ABSOLUTE              1
724 #define CMP_SCALE_SCENEPERCENT  2
725 #define CMP_SCALE_RENDERPERCENT 3
726 /* custom2 */
727 #define CMP_SCALE_RENDERSIZE_FRAME_ASPECT  (1 << 0)
728 #define CMP_SCALE_RENDERSIZE_FRAME_CROP    (1 << 1)
729
730
731 /* API */
732 struct CompBuf;
733 struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
734 void ntreeCompositEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
735 void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int rendering, int do_previews,
736                            const struct ColorManagedViewSettings *view_settings, const struct ColorManagedDisplaySettings *display_settings);
737 void ntreeCompositTagRender(struct Scene *sce);
738 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
739 void ntreeCompositTagGenerators(struct bNodeTree *ntree);
740 void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
741 void ntreeCompositClearTags(struct bNodeTree *ntree);
742
743 struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree, struct bNode *node,
744                                                      const char *name, struct ImageFormatData *im_format);
745 int ntreeCompositOutputFileRemoveActiveSocket(struct bNodeTree *ntree, struct bNode *node);
746 void ntreeCompositOutputFileSetPath(struct bNode *node, struct bNodeSocket *sock, const char *name);
747 void ntreeCompositOutputFileSetLayer(struct bNode *node, struct bNodeSocket *sock, const char *name);
748 /* needed in do_versions */
749 void ntreeCompositOutputFileUniquePath(struct ListBase *list, struct bNodeSocket *sock, const char defname[], char delim);
750 void ntreeCompositOutputFileUniqueLayer(struct ListBase *list, struct bNodeSocket *sock, const char defname[], char delim);
751
752 /* ************** TEXTURE NODES *************** */
753
754 struct TexResult;
755
756 #define TEX_NODE_OUTPUT     401
757 #define TEX_NODE_CHECKER    402
758 #define TEX_NODE_TEXTURE    403
759 #define TEX_NODE_BRICKS     404
760 #define TEX_NODE_MATH       405
761 #define TEX_NODE_MIX_RGB    406
762 #define TEX_NODE_RGBTOBW    407
763 #define TEX_NODE_VALTORGB   408
764 #define TEX_NODE_IMAGE      409
765 #define TEX_NODE_CURVE_RGB  410
766 #define TEX_NODE_INVERT     411
767 #define TEX_NODE_HUE_SAT    412
768 #define TEX_NODE_CURVE_TIME 413
769 #define TEX_NODE_ROTATE     414
770 #define TEX_NODE_VIEWER     415
771 #define TEX_NODE_TRANSLATE  416
772 #define TEX_NODE_COORD      417
773 #define TEX_NODE_DISTANCE   418
774 #define TEX_NODE_COMPOSE    419
775 #define TEX_NODE_DECOMPOSE  420
776 #define TEX_NODE_VALTONOR   421
777 #define TEX_NODE_SCALE      422
778 #define TEX_NODE_AT         423
779
780 /* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
781 #define TEX_NODE_PROC      500
782 #define TEX_NODE_PROC_MAX  600
783
784 /* API */
785 int  ntreeTexTagAnimated(struct bNodeTree *ntree);
786 void ntreeTexCheckCyclics(struct bNodeTree *ntree);
787
788 struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
789 void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
790 int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target,
791                      float coord[3], float dxt[3], float dyt[3], int osatex, const short thread,
792                      struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
793
794
795 /*************************************************/
796
797 void init_nodesystem(void);
798 void free_nodesystem(void);
799
800 void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce);
801
802 #endif