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