Cleanup: quiet undeclared variable warnings
[blender.git] / source / blender / blenkernel / BKE_node.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #ifndef __BKE_NODE_H__
21 #define __BKE_NODE_H__
22
23 /** \file
24  * \ingroup bke
25  */
26
27 #include "BLI_compiler_compat.h"
28 #include "BLI_ghash.h"
29
30 #include "DNA_listBase.h"
31
32 /* for FOREACH_NODETREE_BEGIN */
33 #include "DNA_lamp_types.h"
34 #include "DNA_material_types.h"
35 #include "DNA_node_types.h"
36 #include "DNA_scene_types.h"
37 #include "DNA_texture_types.h"
38 #include "DNA_world_types.h"
39 #include "DNA_linestyle_types.h"
40
41 #include "RNA_types.h"
42
43 /* not very important, but the stack solver likes to know a maximum */
44 #define MAX_SOCKET      512
45
46 struct ARegion;
47 struct ColorManagedDisplaySettings;
48 struct ColorManagedViewSettings;
49 struct GPUMaterial;
50 struct GPUNodeStack;
51 struct ID;
52 struct ImBuf;
53 struct ImageFormatData;
54 struct ListBase;
55 struct MTex;
56 struct Main;
57 struct PointerRNA;
58 struct RenderData;
59 struct Scene;
60 struct SpaceNode;
61 struct Tex;
62 struct ViewRender;
63 struct bContext;
64 struct bNode;
65 struct bNodeExecContext;
66 struct bNodeExecData;
67 struct bNodeInstanceHash;
68 struct bNodeLink;
69 struct bNodeSocket;
70 struct bNodeStack;
71 struct bNodeTree;
72 struct bNodeTreeExec;
73 struct bNodeTreeType;
74 struct uiLayout;
75
76 /* -------------------------------------------------------------------- */
77 /** \name Node Type Definitions
78  * \{ */
79
80 /** Compact definition of a node socket.
81  * Can be used to quickly define a list of static sockets for a node,
82  * which are added to each new node of that type.
83  *
84  * \deprecated This struct is used by C nodes to define templates as simple
85  * static struct lists. These are converted to the new template collections
86  * in RNA types automatically.
87  */
88 typedef struct bNodeSocketTemplate {
89         int type, limit;
90         char name[64];  /* MAX_NAME */
91         float val1, val2, val3, val4;   /* default alloc value for inputs */
92         float min, max;
93         int subtype;  /* would use PropertySubType but this is a bad level include to use RNA */
94         int flag;
95
96         /* after this line is used internal only */
97         struct bNodeSocket *sock;               /* used to hold verified socket */
98         char identifier[64];                    /* generated from name */
99 } bNodeSocketTemplate;
100
101 /** Defines a socket type.
102  * Defines the appearance and behavior of a socket in the UI.
103  */
104 typedef struct bNodeSocketType {
105         char idname[64];                                /* identifier name */
106
107         void (*draw)(struct bContext *C, struct uiLayout *layout, struct PointerRNA *ptr, struct PointerRNA *node_ptr, const char *text);
108         void (*draw_color)(struct bContext *C, struct PointerRNA *ptr, struct PointerRNA *node_ptr, float *r_color);
109
110         void (*interface_draw)(struct bContext *C, struct uiLayout *layout, struct PointerRNA *ptr);
111         void (*interface_draw_color)(struct bContext *C, struct PointerRNA *ptr, float *r_color);
112         void (*interface_register_properties)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct StructRNA *data_srna);
113         void (*interface_init_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock, const char *data_path);
114         void (*interface_verify_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock, const char *data_path);
115         void (*interface_from_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock);
116
117         /* RNA integration */
118         ExtensionRNA ext_socket;
119         ExtensionRNA ext_interface;
120
121         /* for standard socket types in C */
122         int type, subtype;
123 } bNodeSocketType;
124
125 typedef void *(*NodeInitExecFunction)(struct bNodeExecContext *context, struct bNode *node, bNodeInstanceKey key);
126 typedef void (*NodeFreeExecFunction)(void *nodedata);
127 typedef void (*NodeExecFunction)(void *data, int thread, struct bNode *, struct bNodeExecData *execdata, struct bNodeStack **in, struct bNodeStack **out);
128 typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat, struct bNode *node, struct bNodeExecData *execdata, struct GPUNodeStack *in, struct GPUNodeStack *out);
129
130 /** Defines a node type.
131  * Initial attributes and constants for a node as well as callback functions
132  * implementing the node behavior.
133  */
134 typedef struct bNodeType {
135         void *next, *prev;
136         short needs_free;               /* set for allocated types that need to be freed */
137
138         char idname[64];                                /* identifier name */
139         int type;
140
141         char ui_name[64];       /* MAX_NAME */
142         char ui_description[256];
143         int ui_icon;
144
145         float width, minwidth, maxwidth;
146         float height, minheight, maxheight;
147         short nclass, flag;
148
149         /* templates for static sockets */
150         bNodeSocketTemplate *inputs, *outputs;
151
152         char storagename[64];                   /* struct name for DNA */
153
154         /* Main draw function for the node */
155         void (*draw_nodetype)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode,
156                          struct bNodeTree *ntree, struct bNode *node, bNodeInstanceKey key);
157         /* Updates the node geometry attributes according to internal state before actual drawing */
158         void (*draw_nodetype_prepare)(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
159
160         /* Draw the option buttons on the node */
161         void (*draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
162         /* Additional parameters in the side panel */
163         void (*draw_buttons_ex)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
164
165         /* Additional drawing on backdrop */
166         void (*draw_backdrop)(struct SpaceNode *snode, struct ImBuf *backdrop, struct bNode *node, int x, int y);
167
168         /**
169          * Optional custom label function for the node header.
170          * \note Used as a fallback when #bNode.label isn't set.
171          */
172         void (*labelfunc)(struct bNodeTree *ntree, struct bNode *node, char *label, int maxlen);
173         /// Optional custom resize handle polling.
174         int (*resize_area_func)(struct bNode *node, int x, int y);
175         /// Optional selection area polling.
176         int (*select_area_func)(struct bNode *node, int x, int y);
177         /// Optional tweak area polling (for grabbing).
178         int (*tweak_area_func)(struct bNode *node, int x, int y);
179
180         /// Called when the node is updated in the editor.
181         void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
182         /// Check and update if internal ID data has changed.
183         void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
184
185         /// Initialize a new node instance of this type after creation.
186         void (*initfunc)(struct bNodeTree *ntree, struct bNode *node);
187         /// Free the node instance.
188         void (*freefunc)(struct bNode *node);
189         /// Make a copy of the node instance.
190         void (*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, struct bNode *src_node);
191
192         /* Registerable API callback versions, called in addition to C callbacks */
193         void (*initfunc_api)(const struct bContext *C, struct PointerRNA *ptr);
194         void (*freefunc_api)(struct PointerRNA *ptr);
195         void (*copyfunc_api)(struct PointerRNA *ptr, struct bNode *src_node);
196
197         /* can this node type be added to a node tree */
198         bool (*poll)(struct bNodeType *ntype, struct bNodeTree *nodetree);
199         /* can this node be added to a node tree */
200         bool (*poll_instance)(struct bNode *node, struct bNodeTree *nodetree);
201
202         /* optional handling of link insertion */
203         void (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
204         /* Update the internal links list, for muting and disconnect operators. */
205         void (*update_internal_links)(struct bNodeTree *, struct bNode *node);
206
207         /* **** execution callbacks **** */
208         NodeInitExecFunction initexecfunc;
209         NodeFreeExecFunction freeexecfunc;
210         NodeExecFunction execfunc;
211         /* gpu */
212         NodeGPUExecFunction gpufunc;
213
214         /* RNA integration */
215         ExtensionRNA ext;
216 } bNodeType;
217
218 /* nodetype->nclass, for add-menu and themes */
219 #define NODE_CLASS_INPUT                        0
220 #define NODE_CLASS_OUTPUT                       1
221 #define NODE_CLASS_OP_COLOR                     3
222 #define NODE_CLASS_OP_VECTOR            4
223 #define NODE_CLASS_OP_FILTER            5
224 #define NODE_CLASS_GROUP                        6
225 // #define NODE_CLASS_FILE                              7
226 #define NODE_CLASS_CONVERTOR            8
227 #define NODE_CLASS_MATTE                        9
228 #define NODE_CLASS_DISTORT                      10
229 // #define NODE_CLASS_OP_DYNAMIC                11 /* deprecated */
230 #define NODE_CLASS_PATTERN                      12
231 #define NODE_CLASS_TEXTURE                      13
232 // #define NODE_CLASS_EXECUTION         14
233 // #define NODE_CLASS_GETDATA                   15
234 // #define NODE_CLASS_SETDATA                   16
235 // #define NODE_CLASS_MATH                              17
236 // #define NODE_CLASS_MATH_VECTOR               18
237 // #define NODE_CLASS_MATH_ROTATION     19
238 // #define NODE_CLASS_PARTICLES         25
239 // #define NODE_CLASS_TRANSFORM         30
240 // #define NODE_CLASS_COMBINE                   31
241 #define NODE_CLASS_SCRIPT                       32
242 #define NODE_CLASS_INTERFACE            33
243 #define NODE_CLASS_SHADER                       40
244 #define NODE_CLASS_LAYOUT                       100
245
246 /* node resize directions */
247 #define NODE_RESIZE_TOP         1
248 #define NODE_RESIZE_BOTTOM      2
249 #define NODE_RESIZE_RIGHT       4
250 #define NODE_RESIZE_LEFT        8
251
252 typedef enum eNodeSizePreset {
253         NODE_SIZE_DEFAULT,
254         NODE_SIZE_SMALL,
255         NODE_SIZE_MIDDLE,
256         NODE_SIZE_LARGE
257 } eNodeSizePreset;
258
259 struct bNodeTreeExec;
260
261 typedef void (*bNodeClassCallback)(void *calldata, int nclass, const char *name);
262 typedef struct bNodeTreeType {
263         int type;                                               /* type identifier */
264         char idname[64];                                /* identifier name */
265
266         char ui_name[64];
267         char ui_description[256];
268         int ui_icon;
269
270         /* callbacks */
271         void (*free_cache)(struct bNodeTree *ntree);
272         void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node);
273         void (*foreach_nodeclass)(struct Scene *scene, void *calldata, bNodeClassCallback func);        /* iteration over all node classes */
274         /* Check visibility in the node editor */
275         bool (*poll)(const struct bContext *C, struct bNodeTreeType *ntreetype);
276         /* Select a node tree from the context */
277         void (*get_from_context)(const struct bContext *C, struct bNodeTreeType *ntreetype,
278                                  struct bNodeTree **r_ntree, struct ID **r_id, struct ID **r_from);
279
280         /* calls allowing threaded composite */
281         void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
282         void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
283         void (*local_merge)(struct Main *bmain, struct bNodeTree *localtree, struct bNodeTree *ntree);
284
285         /* Tree update. Overrides nodetype->updatetreefunc! */
286         void (*update)(struct bNodeTree *ntree);
287
288         bool (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
289
290         void (*node_add_init)(struct bNodeTree *ntree, struct bNode *bnode);
291
292         /* RNA integration */
293         ExtensionRNA ext;
294 } bNodeTreeType;
295
296 /** \} */
297
298 /* -------------------------------------------------------------------- */
299 /** \name Generic API, Trees
300  * \{ */
301
302 struct bNodeTreeType *ntreeTypeFind(const char *idname);
303 void ntreeTypeAdd(struct bNodeTreeType *nt);
304 void ntreeTypeFreeLink(const struct bNodeTreeType *nt);
305 bool ntreeIsRegistered(struct bNodeTree *ntree);
306 struct GHashIterator *ntreeTypeGetIterator(void);
307
308 /* helper macros for iterating over tree types */
309 #define NODE_TREE_TYPES_BEGIN(ntype) \
310 { \
311         GHashIterator *__node_tree_type_iter__ = ntreeTypeGetIterator(); \
312         for (; !BLI_ghashIterator_done(__node_tree_type_iter__); BLI_ghashIterator_step(__node_tree_type_iter__)) { \
313                 bNodeTreeType *ntype = BLI_ghashIterator_getValue(__node_tree_type_iter__);
314
315 #define NODE_TREE_TYPES_END \
316         } \
317         BLI_ghashIterator_free(__node_tree_type_iter__); \
318 } (void)0
319
320 void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree);
321
322 void ntreeInitDefault(struct bNodeTree *ntree);
323 struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname);
324
325 /* copy/free funcs, need to manage ID users */
326 void              ntreeFreeTree(struct bNodeTree *ntree);
327 /* Free tree which is owned byt another datablock. */
328 void              ntreeFreeNestedTree(struct bNodeTree *ntree);
329 void BKE_node_tree_copy_data(struct Main *bmain, struct bNodeTree *ntree_dst, const struct bNodeTree *ntree_src, const int flag);
330 struct bNodeTree *ntreeCopyTree_ex(const struct bNodeTree *ntree, struct Main *bmain, const bool do_id_user);
331 struct bNodeTree *ntreeCopyTree(struct Main *bmain, const struct bNodeTree *ntree);
332 /* node->id user count */
333 void              ntreeUserIncrefID(struct bNodeTree *ntree);
334 void              ntreeUserDecrefID(struct bNodeTree *ntree);
335
336
337 struct bNodeTree *ntreeFromID(const struct ID *id);
338
339 void              ntreeMakeLocal(struct Main *bmain, struct bNodeTree *ntree, bool id_in_mainlist, const bool lib_local);
340 void              ntreeFreeLocalTree(struct bNodeTree *ntree);
341 struct bNode     *ntreeFindType(const struct bNodeTree *ntree, int type);
342 bool              ntreeHasType(const struct bNodeTree *ntree, int type);
343 bool              ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
344 void              ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree);
345 /* XXX Currently each tree update call does call to ntreeVerifyNodes too.
346  * Some day this should be replaced by a decent depsgraph automatism!
347  */
348 void              ntreeVerifyNodes(struct Main *main, struct ID *id);
349
350 void              ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
351
352 /* XXX old trees handle output flags automatically based on special output node types and last active selection.
353  * new tree types have a per-output socket flag to indicate the final output to use explicitly.
354  */
355 void            ntreeSetOutput(struct bNodeTree *ntree);
356
357 void            ntreeFreeCache(struct bNodeTree *ntree);
358
359 int             ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
360 int             ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
361 void            ntreeNodeFlagSet(const bNodeTree *ntree, const int flag, const bool enable);
362 struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
363 void            ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
364 void            ntreeLocalMerge(struct Main *bmain, struct bNodeTree *localtree, struct bNodeTree *ntree);
365
366 /** \} */
367
368
369 /* -------------------------------------------------------------------- */
370 /** \name Node Tree Interface
371  * \{ */
372 struct bNodeSocket *ntreeFindSocketInterface(struct bNodeTree *ntree, int in_out, const char *identifier);
373 struct bNodeSocket *ntreeAddSocketInterface(struct bNodeTree *ntree, int in_out, const char *idname, const char *name);
374 struct bNodeSocket *ntreeInsertSocketInterface(struct bNodeTree *ntree, int in_out, const char *idname,
375                                                struct bNodeSocket *next_sock, const char *name);
376 struct bNodeSocket *ntreeAddSocketInterfaceFromSocket(struct bNodeTree *ntree, struct bNode *from_node, struct bNodeSocket *from_sock);
377 struct bNodeSocket *ntreeInsertSocketInterfaceFromSocket(struct bNodeTree *ntree, struct bNodeSocket *next_sock,
378                                                          struct bNode *from_node, struct bNodeSocket *from_sock);
379 void            ntreeRemoveSocketInterface(struct bNodeTree *ntree, struct bNodeSocket *sock);
380
381 struct StructRNA *ntreeInterfaceTypeGet(struct bNodeTree *ntree, int create);
382 void ntreeInterfaceTypeFree(struct bNodeTree *ntree);
383 void ntreeInterfaceTypeUpdate(struct bNodeTree *ntree);
384
385 /** \} */
386
387
388 /* -------------------------------------------------------------------- */
389 /** \name Generic API, Nodes
390  * \{ */
391
392 struct bNodeType *nodeTypeFind(const char *idname);
393 void                    nodeRegisterType(struct bNodeType *ntype);
394 void                    nodeUnregisterType(struct bNodeType *ntype);
395 bool                    nodeIsRegistered(struct bNode *node);
396 struct GHashIterator *nodeTypeGetIterator(void);
397
398 /* helper macros for iterating over node types */
399 #define NODE_TYPES_BEGIN(ntype) \
400 { \
401         GHashIterator *__node_type_iter__ = nodeTypeGetIterator(); \
402         for (; !BLI_ghashIterator_done(__node_type_iter__); BLI_ghashIterator_step(__node_type_iter__)) { \
403                 bNodeType *ntype = BLI_ghashIterator_getValue(__node_type_iter__);
404
405 #define NODE_TYPES_END \
406         } \
407         BLI_ghashIterator_free(__node_type_iter__); \
408 } ((void)0)
409
410 struct bNodeSocketType *nodeSocketTypeFind(const char *idname);
411 void                    nodeRegisterSocketType(struct bNodeSocketType *stype);
412 void                    nodeUnregisterSocketType(struct bNodeSocketType *stype);
413 bool                    nodeSocketIsRegistered(struct bNodeSocket *sock);
414 struct GHashIterator *nodeSocketTypeGetIterator(void);
415 const char *nodeStaticSocketType(int type, int subtype);
416 const char *nodeStaticSocketInterfaceType(int type, int subtype);
417
418 /* helper macros for iterating over node types */
419 #define NODE_SOCKET_TYPES_BEGIN(stype) \
420 { \
421         GHashIterator *__node_socket_type_iter__ = nodeSocketTypeGetIterator(); \
422         for (; !BLI_ghashIterator_done(__node_socket_type_iter__); BLI_ghashIterator_step(__node_socket_type_iter__)) { \
423                 bNodeSocketType *stype = BLI_ghashIterator_getValue(__node_socket_type_iter__);
424
425 #define NODE_SOCKET_TYPES_END \
426         } \
427         BLI_ghashIterator_free(__node_socket_type_iter__); \
428 }
429
430 struct bNodeSocket *nodeFindSocket(struct bNode *node, int in_out, const char *identifier);
431 struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *idname,
432                                   const char *identifier, const char *name);
433 struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *idname,
434                                      struct bNodeSocket *next_sock, const char *identifier, const char *name);
435 struct bNodeSocket *nodeAddStaticSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, int type, int subtype,
436                                         const char *identifier, const char *name);
437 struct bNodeSocket *nodeInsertStaticSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, int type, int subtype,
438                                            struct bNodeSocket *next_sock, const char *identifier, const char *name);
439 void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
440 void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
441 void nodeModifySocketType(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock, int type, int subtype);
442
443 struct bNode    *nodeAddNode(const struct bContext *C, struct bNodeTree *ntree, const char *idname);
444 struct bNode    *nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type);
445 void            nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
446 void            nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
447
448 /* Frees the node itself, without affect to anything else. */
449 void            nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
450 /* Will additionally cleanup things like f-curves which uses this node. */
451 void            nodeDeleteNode(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
452
453 struct bNode    *BKE_node_copy_ex(struct bNodeTree *ntree, struct bNode *node_src, const int flag);
454
455 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
456 void            nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
457 void            nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
458 bool            nodeLinkIsHidden(struct bNodeLink *link);
459 void            nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
460
461 void            nodeToView(struct bNode *node, float x, float y, float *rx, float *ry);
462 void            nodeFromView(struct bNode *node, float x, float y, float *rx, float *ry);
463 bool            nodeAttachNodeCheck(struct bNode *node, struct bNode *parent);
464 void            nodeAttachNode(struct bNode *node, struct bNode *parent);
465 void            nodeDetachNode(struct bNode *node);
466
467 void            nodePositionRelative(struct bNode *from_node, struct bNode *to_node,
468                                      struct bNodeSocket *from_sock, struct bNodeSocket *to_sock);
469 void            nodePositionPropagate(struct bNode *node);
470
471 struct bNode   *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
472 int             nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
473 struct bNode   *nodeFindRootParent(bNode *node);
474
475 bool            nodeIsChildOf(const bNode *parent, const bNode *child);
476
477 void nodeChainIter(
478         const bNodeTree *ntree, const bNode *node_start,
479         bool (*callback)(bNode *, bNode *, void *, const bool), void *userdata,
480         const bool reversed);
481 void nodeParentsIter(bNode *node, bool (*callback)(bNode *, void *), void *userdata);
482
483 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
484 int             nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
485
486 void            nodeSetSelected(struct bNode *node, bool select);
487 void            nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
488 struct bNode   *nodeGetActive(struct bNodeTree *ntree);
489 struct bNode   *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
490 bool            nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
491 void            nodeClearActive(struct bNodeTree *ntree);
492 void            nodeClearActiveID(struct bNodeTree *ntree, short idtype);
493 struct bNode   *nodeGetActiveTexture(struct bNodeTree *ntree);
494
495 void            nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
496 bool            nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
497 void            nodeUpdateInternalLinks(struct bNodeTree *ntree, struct bNode *node);
498
499 int             nodeSocketIsHidden(struct bNodeSocket *sock);
500 void            ntreeTagUsedSockets(struct bNodeTree *ntree);
501
502 /* Node Clipboard */
503 void                   BKE_node_clipboard_init(struct bNodeTree *ntree);
504 void                   BKE_node_clipboard_clear(void);
505 bool                   BKE_node_clipboard_validate(void);
506 void                   BKE_node_clipboard_add_node(struct bNode *node);
507 void                   BKE_node_clipboard_add_link(struct bNodeLink *link);
508 const struct ListBase *BKE_node_clipboard_get_nodes(void);
509 const struct ListBase *BKE_node_clipboard_get_links(void);
510 int                    BKE_node_clipboard_get_type(void);
511
512 /* Node Instance Hash */
513 typedef struct bNodeInstanceHash {
514         GHash *ghash;   /* XXX should be made a direct member, GHash allocation needs to support it */
515 } bNodeInstanceHash;
516
517 typedef void (*bNodeInstanceValueFP)(void *value);
518
519 extern const bNodeInstanceKey NODE_INSTANCE_KEY_BASE;
520 extern const bNodeInstanceKey NODE_INSTANCE_KEY_NONE;
521
522 bNodeInstanceKey       BKE_node_instance_key(bNodeInstanceKey parent_key, struct bNodeTree *ntree, struct bNode *node);
523
524 bNodeInstanceHash     *BKE_node_instance_hash_new(const char *info);
525 void                   BKE_node_instance_hash_free(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
526 void                   BKE_node_instance_hash_insert(bNodeInstanceHash *hash, bNodeInstanceKey key, void *value);
527 void                  *BKE_node_instance_hash_lookup(bNodeInstanceHash *hash, bNodeInstanceKey key);
528 int                    BKE_node_instance_hash_remove(bNodeInstanceHash *hash, bNodeInstanceKey key, bNodeInstanceValueFP valfreefp);
529 void                   BKE_node_instance_hash_clear(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
530 void                  *BKE_node_instance_hash_pop(bNodeInstanceHash *hash, bNodeInstanceKey key);
531 int                    BKE_node_instance_hash_haskey(bNodeInstanceHash *hash, bNodeInstanceKey key);
532 int                    BKE_node_instance_hash_size(bNodeInstanceHash *hash);
533
534 void                   BKE_node_instance_hash_clear_tags(bNodeInstanceHash *hash);
535 void                   BKE_node_instance_hash_tag(bNodeInstanceHash *hash, void *value);
536 bool                   BKE_node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey key);
537 void                   BKE_node_instance_hash_remove_untagged(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
538
539 typedef GHashIterator bNodeInstanceHashIterator;
540
541 BLI_INLINE bNodeInstanceHashIterator *BKE_node_instance_hash_iterator_new(bNodeInstanceHash *hash) { return BLI_ghashIterator_new(hash->ghash); }
542 BLI_INLINE void                       BKE_node_instance_hash_iterator_init(bNodeInstanceHashIterator *iter, bNodeInstanceHash *hash) { BLI_ghashIterator_init(iter, hash->ghash); }
543 BLI_INLINE void                       BKE_node_instance_hash_iterator_free(bNodeInstanceHashIterator *iter) { BLI_ghashIterator_free(iter); }
544 BLI_INLINE bNodeInstanceKey           BKE_node_instance_hash_iterator_get_key(bNodeInstanceHashIterator *iter) { return *(bNodeInstanceKey *)BLI_ghashIterator_getKey(iter); }
545 BLI_INLINE void                      *BKE_node_instance_hash_iterator_get_value(bNodeInstanceHashIterator *iter) { return BLI_ghashIterator_getValue(iter); }
546 BLI_INLINE void                       BKE_node_instance_hash_iterator_step(bNodeInstanceHashIterator *iter) { BLI_ghashIterator_step(iter); }
547 BLI_INLINE bool                       BKE_node_instance_hash_iterator_done(bNodeInstanceHashIterator *iter) { return BLI_ghashIterator_done(iter); }
548
549 #define NODE_INSTANCE_HASH_ITER(iter_, hash_) \
550         for (BKE_node_instance_hash_iterator_init(&iter_, hash_); \
551              BKE_node_instance_hash_iterator_done(&iter_) == false; \
552              BKE_node_instance_hash_iterator_step(&iter_))
553
554
555 /* Node Previews */
556
557 int             BKE_node_preview_used(struct bNode *node);
558 bNodePreview   *BKE_node_preview_verify(struct bNodeInstanceHash *previews, bNodeInstanceKey key, int xsize, int ysize, bool create);
559 bNodePreview   *BKE_node_preview_copy(struct bNodePreview *preview);
560 void            BKE_node_preview_free(struct bNodePreview *preview);
561 void            BKE_node_preview_init_tree(struct bNodeTree *ntree, int xsize, int ysize, int create_previews);
562 void            BKE_node_preview_free_tree(struct bNodeTree *ntree);
563 void            BKE_node_preview_remove_unused(struct bNodeTree *ntree);
564 void            BKE_node_preview_clear(struct bNodePreview *preview);
565 void            BKE_node_preview_clear_tree(struct bNodeTree *ntree);
566
567 void            BKE_node_preview_sync_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree);
568 void            BKE_node_preview_merge_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree, bool remove_old);
569
570 void            BKE_node_preview_set_pixel(struct bNodePreview *preview, const float col[4], int x, int y, bool do_manage);
571
572 /** \} */
573
574 /* -------------------------------------------------------------------- */
575 /** \name Node Type Access
576  * \{ */
577
578 void            nodeLabel(struct bNodeTree *ntree, struct bNode *node, char *label, int maxlen);
579
580 int                             nodeGroupPoll(struct bNodeTree *nodetree, struct bNodeTree *grouptree);
581
582 /* Init a new node type struct with default values and callbacks */
583 void            node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
584 void            node_type_base_custom(struct bNodeType *ntype, const char *idname, const char *name, short nclass, short flag);
585 void            node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
586 void            node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
587 void            node_type_size_preset(struct bNodeType *ntype, eNodeSizePreset size);
588 void            node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node));
589 void            node_type_storage(struct bNodeType *ntype,
590                                   const char *storagename,
591                                   void (*freefunc)(struct bNode *node),
592                                   void (*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, struct bNode *src_node));
593 void            node_type_label(struct bNodeType *ntype, void (*labelfunc)(struct bNodeTree *ntree, struct bNode *, char *label, int maxlen));
594 void            node_type_update(struct bNodeType *ntype,
595                                  void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
596                                  void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id));
597
598 void            node_type_exec(struct bNodeType *ntype, NodeInitExecFunction initexecfunc, NodeFreeExecFunction freeexecfunc, NodeExecFunction execfunc);
599 void            node_type_gpu(struct bNodeType *ntype, NodeGPUExecFunction gpufunc);
600 void            node_type_internal_links(struct bNodeType *ntype, void (*update_internal_links)(struct bNodeTree *, struct bNode *));
601
602 /** \} */
603
604 /* -------------------------------------------------------------------- */
605 /** \name Node Generic Functions
606  * \{ */
607
608 bool BKE_node_is_connected_to_output(struct bNodeTree *ntree, struct bNode *node);
609
610 /* ************** COMMON NODES *************** */
611
612 #define NODE_UNDEFINED  -2              /* node type is not registered */
613 #define NODE_CUSTOM             -1              /* for dynamically registered custom types */
614 #define NODE_GROUP              2
615 // #define NODE_FORLOOP 3               /* deprecated */
616 // #define NODE_WHILELOOP       4       /* deprecated */
617 #define NODE_FRAME              5
618 #define NODE_REROUTE    6
619 #define NODE_GROUP_INPUT        7
620 #define NODE_GROUP_OUTPUT       8
621
622 void BKE_node_tree_unlink_id(ID *id, struct bNodeTree *ntree);
623
624 /** \} */
625
626 /* -------------------------------------------------------------------- */
627 /** \name Node Tree Iterator
628  *
629  * Utility macro for visiting every node tree in the library data, including local bNodeTree blocks in other IDs.
630  * This avoids the need for callback functions and allows executing code in a single inner code block.
631  *
632  * Variables:
633  *
634  *   nodetree:  The actual bNodeTree data block.
635  *              Check nodetree->idname or nodetree->typeinfo to use only specific types.
636  *
637  *   id:        The owner of the bNodeTree data block.
638  *              Same as nodetree if it's a linkable node tree from the library.
639  *
640  * Examples:
641  *
642  * \code{.c}
643  * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) {
644  *     if (id == nodetree)
645  *         printf("This is a linkable node tree");
646  * } FOREACH_NODETREE_END;
647  *
648  * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) {
649  *     if (nodetree->idname == "ShaderNodeTree")
650  *         printf("This is a shader node tree);
651  *     if (GS(id) == ID_MA)
652  *         printf(" and it's owned by a material");
653  * } FOREACH_NODETREE_END;
654  * \endcode
655  *
656  * \{
657  */
658
659 /* should be an opaque type, only for internal use by BKE_node_tree_iter_*** */
660 struct NodeTreeIterStore {
661         bNodeTree *ngroup;
662         Scene *scene;
663         Material *mat;
664         Tex *tex;
665         Lamp *lamp;
666         World *world;
667         FreestyleLineStyle *linestyle;
668 };
669
670 void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain);
671 bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
672                              struct bNodeTree **r_nodetree, struct ID **r_id);
673
674 #define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id) \
675 { \
676         struct NodeTreeIterStore _nstore; \
677         bNodeTree *_nodetree; \
678         ID *_id; \
679         /* avoid compiler warning about unused variables */ \
680         BKE_node_tree_iter_init(&_nstore, bmain); \
681         while (BKE_node_tree_iter_step(&_nstore, &_nodetree, &_id) == true) { \
682                 if (_nodetree) {
683
684 #define FOREACH_NODETREE_END \
685                 } \
686         } \
687 } ((void)0)
688 /** \} */
689
690
691 /* -------------------------------------------------------------------- */
692 /** \name Node Tree
693  */
694
695 void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, const int layer_index);
696
697 /* -------------------------------------------------------------------- */
698 /** \name Shader Nodes
699  * \{ */
700
701 /* note: types are needed to restore callbacks, don't change values */
702 /* range 1 - 100 is reserved for common nodes */
703 /* using toolbox, we add node groups by assuming the values below don't exceed NODE_GROUP_MENU for now */
704
705 //#define SH_NODE_OUTPUT                1
706
707 //#define SH_NODE_MATERIAL      100
708 #define SH_NODE_RGB                     101
709 #define SH_NODE_VALUE           102
710 #define SH_NODE_MIX_RGB         103
711 #define SH_NODE_VALTORGB        104
712 #define SH_NODE_RGBTOBW         105
713 #define SH_NODE_SHADERTORGB     106
714 //#define SH_NODE_TEXTURE               106
715 #define SH_NODE_NORMAL          107
716 //#define SH_NODE_GEOMETRY      108
717 #define SH_NODE_MAPPING         109
718 #define SH_NODE_CURVE_VEC       110
719 #define SH_NODE_CURVE_RGB       111
720 #define SH_NODE_CAMERA          114
721 #define SH_NODE_MATH            115
722 #define SH_NODE_VECT_MATH       116
723 #define SH_NODE_SQUEEZE         117
724 //#define SH_NODE_MATERIAL_EXT  118
725 #define SH_NODE_INVERT          119
726 #define SH_NODE_SEPRGB          120
727 #define SH_NODE_COMBRGB         121
728 #define SH_NODE_HUE_SAT         122
729 #define NODE_DYNAMIC            123
730
731 #define SH_NODE_OUTPUT_MATERIAL                 124
732 #define SH_NODE_OUTPUT_WORLD                    125
733 #define SH_NODE_OUTPUT_LIGHT                    126
734 #define SH_NODE_FRESNEL                                 127
735 #define SH_NODE_MIX_SHADER                              128
736 #define SH_NODE_ATTRIBUTE                               129
737 #define SH_NODE_BACKGROUND                              130
738 #define SH_NODE_BSDF_ANISOTROPIC                131
739 #define SH_NODE_BSDF_DIFFUSE                    132
740 #define SH_NODE_BSDF_GLOSSY                             133
741 #define SH_NODE_BSDF_GLASS                              134
742 #define SH_NODE_BSDF_TRANSLUCENT                137
743 #define SH_NODE_BSDF_TRANSPARENT                138
744 #define SH_NODE_BSDF_VELVET                             139
745 #define SH_NODE_EMISSION                                140
746 #define SH_NODE_NEW_GEOMETRY                    141
747 #define SH_NODE_LIGHT_PATH                              142
748 #define SH_NODE_TEX_IMAGE                               143
749 #define SH_NODE_TEX_SKY                                 145
750 #define SH_NODE_TEX_GRADIENT                    146
751 #define SH_NODE_TEX_VORONOI                             147
752 #define SH_NODE_TEX_MAGIC                               148
753 #define SH_NODE_TEX_WAVE                                149
754 #define SH_NODE_TEX_NOISE                               150
755 #define SH_NODE_TEX_MUSGRAVE                    152
756 #define SH_NODE_TEX_COORD                               155
757 #define SH_NODE_ADD_SHADER                              156
758 #define SH_NODE_TEX_ENVIRONMENT                 157
759 #define SH_NODE_OUTPUT_TEXTURE                  158
760 #define SH_NODE_HOLDOUT                                 159
761 #define SH_NODE_LAYER_WEIGHT                    160
762 #define SH_NODE_VOLUME_ABSORPTION               161
763 #define SH_NODE_VOLUME_SCATTER                  162
764 #define SH_NODE_GAMMA                                   163
765 #define SH_NODE_TEX_CHECKER                             164
766 #define SH_NODE_BRIGHTCONTRAST                  165
767 #define SH_NODE_LIGHT_FALLOFF                   166
768 #define SH_NODE_OBJECT_INFO                             167
769 #define SH_NODE_PARTICLE_INFO                   168
770 #define SH_NODE_TEX_BRICK                               169
771 #define SH_NODE_BUMP                                    170
772 #define SH_NODE_SCRIPT                                  171
773 #define SH_NODE_AMBIENT_OCCLUSION               172
774 #define SH_NODE_BSDF_REFRACTION                 173
775 #define SH_NODE_TANGENT                                 174
776 #define SH_NODE_NORMAL_MAP                              175
777 #define SH_NODE_HAIR_INFO                               176
778 #define SH_NODE_SUBSURFACE_SCATTERING   177
779 #define SH_NODE_WIREFRAME                               178
780 #define SH_NODE_BSDF_TOON                               179
781 #define SH_NODE_WAVELENGTH                              180
782 #define SH_NODE_BLACKBODY                               181
783 #define SH_NODE_VECT_TRANSFORM                  182
784 #define SH_NODE_SEPHSV                                  183
785 #define SH_NODE_COMBHSV                                 184
786 #define SH_NODE_BSDF_HAIR                               185
787 #define SH_NODE_LAMP                                    186
788 #define SH_NODE_UVMAP                                   187
789 #define SH_NODE_SEPXYZ                                  188
790 #define SH_NODE_COMBXYZ                                 189
791 #define SH_NODE_OUTPUT_LINESTYLE                190
792 #define SH_NODE_UVALONGSTROKE                   191
793 #define SH_NODE_TEX_POINTDENSITY                192
794 #define SH_NODE_BSDF_PRINCIPLED         193
795 #define SH_NODE_TEX_IES                 194
796 #define SH_NODE_EEVEE_SPECULAR                  195
797 #define SH_NODE_BEVEL                   197
798 #define SH_NODE_DISPLACEMENT            198
799 #define SH_NODE_VECTOR_DISPLACEMENT     199
800 #define SH_NODE_VOLUME_PRINCIPLED       200
801 /* 201..700 occupied by other node types, continue from 701 */
802 #define SH_NODE_BSDF_HAIR_PRINCIPLED    701
803
804 /* custom defines options for Material node */
805 #define SH_NODE_MAT_DIFF   1
806 #define SH_NODE_MAT_SPEC   2
807 #define SH_NODE_MAT_NEG    4
808
809 /* API */
810
811 struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree);
812 void            ntreeShaderEndExecTree(struct bNodeTreeExec *exec);
813 bool            ntreeShaderExecTree(struct bNodeTree *ntree, int thread);
814 struct bNode   *ntreeShaderOutputNode(struct bNodeTree *ntree, int target);
815
816 void            ntreeGPUMaterialNodes(struct bNodeTree *localtree, struct GPUMaterial *mat,
817                                       bool *has_surface_output, bool *has_volume_output);
818
819 /** \} */
820
821 /* -------------------------------------------------------------------- */
822 /** \name Composite Nodes
823  * \{ */
824
825 /* output socket defines */
826 #define RRES_OUT_IMAGE                                  0
827 #define RRES_OUT_ALPHA                                  1
828 #define RRES_OUT_Z                                              2
829 #define RRES_OUT_NORMAL                                 3
830 #define RRES_OUT_UV                                             4
831 #define RRES_OUT_VEC                                    5
832 #define RRES_OUT_RGBA                                   6
833 #define RRES_OUT_DIFF                                   7
834 #define RRES_OUT_SPEC                                   8
835 #define RRES_OUT_SHADOW                                 9
836 #define RRES_OUT_AO                                             10
837 #define RRES_OUT_REFLECT                                11
838 #define RRES_OUT_REFRACT                                12
839 #define RRES_OUT_INDIRECT                               13
840 #define RRES_OUT_INDEXOB                                14
841 #define RRES_OUT_INDEXMA                                15
842 #define RRES_OUT_MIST                                   16
843 #define RRES_OUT_EMIT                                   17
844 #define RRES_OUT_ENV                                    18
845 #define RRES_OUT_DIFF_DIRECT                    19
846 #define RRES_OUT_DIFF_INDIRECT                  20
847 #define RRES_OUT_DIFF_COLOR                             21
848 #define RRES_OUT_GLOSSY_DIRECT                  22
849 #define RRES_OUT_GLOSSY_INDIRECT                23
850 #define RRES_OUT_GLOSSY_COLOR                   24
851 #define RRES_OUT_TRANSM_DIRECT                  25
852 #define RRES_OUT_TRANSM_INDIRECT                26
853 #define RRES_OUT_TRANSM_COLOR                   27
854 #define RRES_OUT_SUBSURFACE_DIRECT              28
855 #define RRES_OUT_SUBSURFACE_INDIRECT    29
856 #define RRES_OUT_SUBSURFACE_COLOR               30
857 #define RRES_OUT_DEBUG                          31
858
859 /* note: types are needed to restore callbacks, don't change values */
860 #define CMP_NODE_VIEWER         201
861 #define CMP_NODE_RGB            202
862 #define CMP_NODE_VALUE          203
863 #define CMP_NODE_MIX_RGB        204
864 #define CMP_NODE_VALTORGB       205
865 #define CMP_NODE_RGBTOBW        206
866 #define CMP_NODE_NORMAL         207
867 #define CMP_NODE_CURVE_VEC      208
868 #define CMP_NODE_CURVE_RGB      209
869 #define CMP_NODE_ALPHAOVER      210
870 #define CMP_NODE_BLUR           211
871 #define CMP_NODE_FILTER         212
872 #define CMP_NODE_MAP_VALUE      213
873 #define CMP_NODE_TIME           214
874 #define CMP_NODE_VECBLUR        215
875 #define CMP_NODE_SEPRGBA        216
876 #define CMP_NODE_SEPHSVA        217
877 #define CMP_NODE_SETALPHA       218
878 #define CMP_NODE_HUE_SAT        219
879 #define CMP_NODE_IMAGE          220
880 #define CMP_NODE_R_LAYERS       221
881 #define CMP_NODE_COMPOSITE      222
882 #define CMP_NODE_OUTPUT_FILE    223
883 #define CMP_NODE_TEXTURE        224
884 #define CMP_NODE_TRANSLATE      225
885 #define CMP_NODE_ZCOMBINE       226
886 #define CMP_NODE_COMBRGBA       227
887 #define CMP_NODE_DILATEERODE    228
888 #define CMP_NODE_ROTATE         229
889 #define CMP_NODE_SCALE          230
890 #define CMP_NODE_SEPYCCA        231
891 #define CMP_NODE_COMBYCCA       232
892 #define CMP_NODE_SEPYUVA        233
893 #define CMP_NODE_COMBYUVA       234
894 #define CMP_NODE_DIFF_MATTE     235
895 #define CMP_NODE_COLOR_SPILL    236
896 #define CMP_NODE_CHROMA_MATTE   237
897 #define CMP_NODE_CHANNEL_MATTE  238
898 #define CMP_NODE_FLIP           239
899 #define CMP_NODE_SPLITVIEWER    240
900 // #define CMP_NODE_INDEX_MASK  241
901 #define CMP_NODE_MAP_UV         242
902 #define CMP_NODE_ID_MASK        243
903 #define CMP_NODE_DEFOCUS        244
904 #define CMP_NODE_DISPLACE       245
905 #define CMP_NODE_COMBHSVA       246
906 #define CMP_NODE_MATH           247
907 #define CMP_NODE_LUMA_MATTE     248
908 #define CMP_NODE_BRIGHTCONTRAST 249
909 #define CMP_NODE_GAMMA          250
910 #define CMP_NODE_INVERT         251
911 #define CMP_NODE_NORMALIZE      252
912 #define CMP_NODE_CROP           253
913 #define CMP_NODE_DBLUR          254
914 #define CMP_NODE_BILATERALBLUR  255
915 #define CMP_NODE_PREMULKEY  256
916 #define CMP_NODE_DIST_MATTE     257
917 #define CMP_NODE_VIEW_LEVELS    258
918 #define CMP_NODE_COLOR_MATTE 259
919 #define CMP_NODE_COLORBALANCE 260
920 #define CMP_NODE_HUECORRECT 261
921 #define CMP_NODE_MOVIECLIP      262
922 #define CMP_NODE_STABILIZE2D    263
923 #define CMP_NODE_TRANSFORM      264
924 #define CMP_NODE_MOVIEDISTORTION        265
925 #define CMP_NODE_DOUBLEEDGEMASK    266
926 #define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED  267     /* DEPRECATED multi file node has been merged into regular CMP_NODE_OUTPUT_FILE */
927 #define CMP_NODE_MASK           268
928 #define CMP_NODE_KEYINGSCREEN           269
929 #define CMP_NODE_KEYING                 270
930 #define CMP_NODE_TRACKPOS               271
931 #define CMP_NODE_INPAINT    272
932 #define CMP_NODE_DESPECKLE  273
933
934 #define CMP_NODE_GLARE          301
935 #define CMP_NODE_TONEMAP        302
936 #define CMP_NODE_LENSDIST       303
937 #define CMP_NODE_SUNBEAMS       304
938
939 #define CMP_NODE_COLORCORRECTION 312
940 #define CMP_NODE_MASK_BOX       313
941 #define CMP_NODE_MASK_ELLIPSE   314
942 #define CMP_NODE_BOKEHIMAGE     315
943 #define CMP_NODE_BOKEHBLUR      316
944 #define CMP_NODE_SWITCH         317
945 #define CMP_NODE_PIXELATE       318
946
947 #define CMP_NODE_MAP_RANGE      319
948 #define CMP_NODE_PLANETRACKDEFORM       320
949 #define CMP_NODE_CORNERPIN          321
950 #define CMP_NODE_SWITCH_VIEW    322
951 #define CMP_NODE_CRYPTOMATTE    323
952
953 /* channel toggles */
954 #define CMP_CHAN_RGB            1
955 #define CMP_CHAN_A                      2
956
957 /* filter types */
958 #define CMP_FILT_SOFT           0
959 #define CMP_FILT_SHARP          1
960 #define CMP_FILT_LAPLACE        2
961 #define CMP_FILT_SOBEL          3
962 #define CMP_FILT_PREWITT        4
963 #define CMP_FILT_KIRSCH         5
964 #define CMP_FILT_SHADOW         6
965
966 /* scale node type, in custom1 */
967 #define CMP_SCALE_RELATIVE              0
968 #define CMP_SCALE_ABSOLUTE              1
969 #define CMP_SCALE_SCENEPERCENT  2
970 #define CMP_SCALE_RENDERPERCENT 3
971 /* custom2 */
972 #define CMP_SCALE_RENDERSIZE_FRAME_ASPECT  (1 << 0)
973 #define CMP_SCALE_RENDERSIZE_FRAME_CROP    (1 << 1)
974
975 /* track position node, in custom1 */
976 #define CMP_TRACKPOS_ABSOLUTE                   0
977 #define CMP_TRACKPOS_RELATIVE_START     1
978 #define CMP_TRACKPOS_RELATIVE_FRAME     2
979 #define CMP_TRACKPOS_ABSOLUTE_FRAME     3
980
981 /* API */
982 void ntreeCompositExecTree(struct Scene *scene, struct bNodeTree *ntree, struct RenderData *rd, int rendering, int do_previews,
983                            const struct ColorManagedViewSettings *view_settings, const struct ColorManagedDisplaySettings *display_settings,
984                            const char *view_name);
985 void ntreeCompositTagRender(struct Scene *sce);
986 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
987 void ntreeCompositTagGenerators(struct bNodeTree *ntree);
988 void ntreeCompositUpdateRLayers(struct bNodeTree *ntree);
989 void ntreeCompositRegisterPass(struct bNodeTree *ntree, struct Scene *scene, struct ViewLayer *view_layer, const char *name, int type);
990 void ntreeCompositClearTags(struct bNodeTree *ntree);
991
992 struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree, struct bNode *node,
993                                                      const char *name, struct ImageFormatData *im_format);
994 int ntreeCompositOutputFileRemoveActiveSocket(struct bNodeTree *ntree, struct bNode *node);
995 void ntreeCompositOutputFileSetPath(struct bNode *node, struct bNodeSocket *sock, const char *name);
996 void ntreeCompositOutputFileSetLayer(struct bNode *node, struct bNodeSocket *sock, const char *name);
997 /* needed in do_versions */
998 void ntreeCompositOutputFileUniquePath(struct ListBase *list, struct bNodeSocket *sock, const char defname[], char delim);
999 void ntreeCompositOutputFileUniqueLayer(struct ListBase *list, struct bNodeSocket *sock, const char defname[], char delim);
1000
1001 void ntreeCompositColorBalanceSyncFromLGG(bNodeTree *ntree, bNode *node);
1002 void ntreeCompositColorBalanceSyncFromCDL(bNodeTree *ntree, bNode *node);
1003
1004 void ntreeCompositCryptomatteSyncFromAdd(bNodeTree *ntree, bNode *node);
1005 void ntreeCompositCryptomatteSyncFromRemove(bNodeTree *ntree, bNode *node);
1006 struct bNodeSocket *ntreeCompositCryptomatteAddSocket(struct bNodeTree *ntree, struct bNode *node);
1007 int ntreeCompositCryptomatteRemoveSocket(struct bNodeTree *ntree, struct bNode *node);
1008
1009 /** \} */
1010
1011 /* -------------------------------------------------------------------- */
1012 /** \name Texture Nodes
1013  * \{ */
1014
1015 struct TexResult;
1016
1017 #define TEX_NODE_OUTPUT     401
1018 #define TEX_NODE_CHECKER    402
1019 #define TEX_NODE_TEXTURE    403
1020 #define TEX_NODE_BRICKS     404
1021 #define TEX_NODE_MATH       405
1022 #define TEX_NODE_MIX_RGB    406
1023 #define TEX_NODE_RGBTOBW    407
1024 #define TEX_NODE_VALTORGB   408
1025 #define TEX_NODE_IMAGE      409
1026 #define TEX_NODE_CURVE_RGB  410
1027 #define TEX_NODE_INVERT     411
1028 #define TEX_NODE_HUE_SAT    412
1029 #define TEX_NODE_CURVE_TIME 413
1030 #define TEX_NODE_ROTATE     414
1031 #define TEX_NODE_VIEWER     415
1032 #define TEX_NODE_TRANSLATE  416
1033 #define TEX_NODE_COORD      417
1034 #define TEX_NODE_DISTANCE   418
1035 #define TEX_NODE_COMPOSE    419
1036 #define TEX_NODE_DECOMPOSE  420
1037 #define TEX_NODE_VALTONOR   421
1038 #define TEX_NODE_SCALE      422
1039 #define TEX_NODE_AT         423
1040
1041 /* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
1042 #define TEX_NODE_PROC      500
1043 #define TEX_NODE_PROC_MAX  600
1044
1045 /* API */
1046 int  ntreeTexTagAnimated(struct bNodeTree *ntree);
1047 void ntreeTexCheckCyclics(struct bNodeTree *ntree);
1048
1049 struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree);
1050 void ntreeTexEndExecTree(struct bNodeTreeExec *exec);
1051 int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target,
1052                      float coord[3], float dxt[3], float dyt[3], int osatex, const short thread,
1053                      struct Tex *tex, short which_output, int cfra, int preview, struct MTex *mtex);
1054 /** \} */
1055
1056 void init_nodesystem(void);
1057 void free_nodesystem(void);
1058
1059 /* -------------------------------------------------------------------- */
1060 /* evaluation support, */
1061
1062 struct Depsgraph;
1063
1064 void BKE_nodetree_shading_params_eval(struct Depsgraph *depsgraph,
1065                                       struct bNodeTree *ntree_dst,
1066                                       const struct bNodeTree *ntree_src);
1067
1068 extern struct bNodeType NodeTypeUndefined;
1069 extern struct bNodeSocketType NodeSocketTypeUndefined;
1070
1071 #endif  /* __BKE_NODE_H__ */