5ee4f5f5a993c4ee3a174e40c2bc27fb869c5b6d
[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 #pragma once
21
22 /** \file
23  * \ingroup bke
24  */
25
26 #include "BLI_compiler_compat.h"
27 #include "BLI_ghash.h"
28
29 #include "DNA_listBase.h"
30
31 /* for FOREACH_NODETREE_BEGIN */
32 #include "DNA_node_types.h"
33
34 #include "RNA_types.h"
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 /* not very important, but the stack solver likes to know a maximum */
41 #define MAX_SOCKET 512
42
43 struct ARegion;
44 struct BlendDataReader;
45 struct BlendExpander;
46 struct BlendLibReader;
47 struct BlendWriter;
48 struct ColorManagedDisplaySettings;
49 struct ColorManagedViewSettings;
50 struct CryptomatteSession;
51 struct FreestyleLineStyle;
52 struct GPUMaterial;
53 struct GPUNodeStack;
54 struct ID;
55 struct ImBuf;
56 struct ImageFormatData;
57 struct Light;
58 struct ListBase;
59 struct MTex;
60 struct Main;
61 struct Material;
62 struct PointerRNA;
63 struct RenderData;
64 struct Scene;
65 struct SpaceNode;
66 struct Tex;
67 struct World;
68 struct bContext;
69 struct bNode;
70 struct bNodeExecContext;
71 struct bNodeExecData;
72 struct bNodeInstanceHash;
73 struct bNodeLink;
74 struct bNodeSocket;
75 struct bNodeStack;
76 struct bNodeTree;
77 struct bNodeTreeExec;
78 struct bNodeTreeType;
79 struct uiLayout;
80
81 /* -------------------------------------------------------------------- */
82 /** \name Node Type Definitions
83  * \{ */
84
85 /**
86  * \brief Compact definition of a node socket.
87  *
88  * Can be used to quickly define a list of static sockets for a node,
89  * which are added to each new node of that type.
90  *
91  * \deprecated This struct is used by C nodes to define templates as simple
92  * static struct lists. These are converted to the new template collections
93  * in RNA types automatically.
94  */
95 typedef struct bNodeSocketTemplate {
96   int type;
97   char name[64];                /* MAX_NAME */
98   float val1, val2, val3, val4; /* default alloc value for inputs */
99   float min, max;
100   int subtype; /* would use PropertySubType but this is a bad level include to use RNA */
101   int flag;
102
103   /* after this line is used internal only */
104   struct bNodeSocket *sock; /* used to hold verified socket */
105   char identifier[64];      /* generated from name */
106 } bNodeSocketTemplate;
107
108 /* Use `void *` for callbacks that require C++. This is rather ugly, but works well for now. This
109  * would not be necessary if we would use bNodeSocketType and bNodeType only in C++ code.
110  * However, achieving this requires quite a few changes currently. */
111 #ifdef __cplusplus
112 namespace blender {
113 namespace nodes {
114 class SocketMFNetworkBuilder;
115 class NodeMFNetworkBuilder;
116 class GeoNodeExecParams;
117 }  // namespace nodes
118 namespace fn {
119 class CPPType;
120 class MFDataType;
121 }  // namespace fn
122 }  // namespace blender
123
124 using NodeExpandInMFNetworkFunction = void (*)(blender::nodes::NodeMFNetworkBuilder &builder);
125 using NodeGeometryExecFunction = void (*)(blender::nodes::GeoNodeExecParams params);
126 using SocketGetCPPTypeFunction = const blender::fn::CPPType *(*)();
127 using SocketGetCPPValueFunction = void (*)(const struct bNodeSocket &socket, void *r_value);
128 using SocketExpandInMFNetworkFunction = void (*)(blender::nodes::SocketMFNetworkBuilder &builder);
129
130 #else
131 typedef void *NodeExpandInMFNetworkFunction;
132 typedef void *SocketExpandInMFNetworkFunction;
133 typedef void *NodeGeometryExecFunction;
134 typedef void *SocketGetCPPTypeFunction;
135 typedef void *SocketGetCPPValueFunction;
136 #endif
137
138 /**
139  * \brief Defines a socket type.
140  *
141  * Defines the appearance and behavior of a socket in the UI.
142  */
143 typedef struct bNodeSocketType {
144   char idname[64]; /* identifier name */
145
146   void (*draw)(struct bContext *C,
147                struct uiLayout *layout,
148                struct PointerRNA *ptr,
149                struct PointerRNA *node_ptr,
150                const char *text);
151   void (*draw_color)(struct bContext *C,
152                      struct PointerRNA *ptr,
153                      struct PointerRNA *node_ptr,
154                      float *r_color);
155
156   void (*interface_draw)(struct bContext *C, struct uiLayout *layout, struct PointerRNA *ptr);
157   void (*interface_draw_color)(struct bContext *C, struct PointerRNA *ptr, float *r_color);
158   void (*interface_register_properties)(struct bNodeTree *ntree,
159                                         struct bNodeSocket *stemp,
160                                         struct StructRNA *data_srna);
161   void (*interface_init_socket)(struct bNodeTree *ntree,
162                                 struct bNodeSocket *stemp,
163                                 struct bNode *node,
164                                 struct bNodeSocket *sock,
165                                 const char *data_path);
166   void (*interface_verify_socket)(struct bNodeTree *ntree,
167                                   struct bNodeSocket *stemp,
168                                   struct bNode *node,
169                                   struct bNodeSocket *sock,
170                                   const char *data_path);
171   void (*interface_from_socket)(struct bNodeTree *ntree,
172                                 struct bNodeSocket *stemp,
173                                 struct bNode *node,
174                                 struct bNodeSocket *sock);
175
176   /* RNA integration */
177   ExtensionRNA ext_socket;
178   ExtensionRNA ext_interface;
179
180   /* for standard socket types in C */
181   int type, subtype;
182
183   /* When set, bNodeSocket->limit does not have any effect anymore. */
184   bool use_link_limits_of_type;
185   int input_link_limit;
186   int output_link_limit;
187
188   /* Callback to free the socket type. */
189   void (*free_self)(struct bNodeSocketType *stype);
190
191   /* Expands the socket into a multi-function node that outputs the socket value. */
192   SocketExpandInMFNetworkFunction expand_in_mf_network;
193   /* Return the CPPType of this socket. */
194   SocketGetCPPTypeFunction get_cpp_type;
195   /* Get the value of this socket in a generic way. */
196   SocketGetCPPValueFunction get_cpp_value;
197 } bNodeSocketType;
198
199 typedef void *(*NodeInitExecFunction)(struct bNodeExecContext *context,
200                                       struct bNode *node,
201                                       bNodeInstanceKey key);
202 typedef void (*NodeFreeExecFunction)(void *nodedata);
203 typedef void (*NodeExecFunction)(void *data,
204                                  int thread,
205                                  struct bNode *,
206                                  struct bNodeExecData *execdata,
207                                  struct bNodeStack **in,
208                                  struct bNodeStack **out);
209 typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat,
210                                    struct bNode *node,
211                                    struct bNodeExecData *execdata,
212                                    struct GPUNodeStack *in,
213                                    struct GPUNodeStack *out);
214
215 /**
216  * \brief Defines a node type.
217  *
218  * Initial attributes and constants for a node as well as callback functions
219  * implementing the node behavior.
220  */
221 typedef struct bNodeType {
222   void *next, *prev;
223
224   char idname[64]; /* identifier name */
225   int type;
226
227   char ui_name[64]; /* MAX_NAME */
228   char ui_description[256];
229   int ui_icon;
230
231   float width, minwidth, maxwidth;
232   float height, minheight, maxheight;
233   short nclass, flag;
234
235   /* templates for static sockets */
236   bNodeSocketTemplate *inputs, *outputs;
237
238   char storagename[64]; /* struct name for DNA */
239
240   /* Main draw function for the node */
241   void (*draw_nodetype)(const struct bContext *C,
242                         struct ARegion *region,
243                         struct SpaceNode *snode,
244                         struct bNodeTree *ntree,
245                         struct bNode *node,
246                         bNodeInstanceKey key);
247   /* Updates the node geometry attributes according to internal state before actual drawing */
248   void (*draw_nodetype_prepare)(const struct bContext *C,
249                                 struct bNodeTree *ntree,
250                                 struct bNode *node);
251
252   /* Draw the option buttons on the node */
253   void (*draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
254   /* Additional parameters in the side panel */
255   void (*draw_buttons_ex)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
256
257   /* Additional drawing on backdrop */
258   void (*draw_backdrop)(
259       struct SpaceNode *snode, struct ImBuf *backdrop, struct bNode *node, int x, int y);
260
261   /**
262    * Optional custom label function for the node header.
263    * \note Used as a fallback when #bNode.label isn't set.
264    */
265   void (*labelfunc)(struct bNodeTree *ntree, struct bNode *node, char *label, int maxlen);
266   /** Optional custom resize handle polling. */
267   int (*resize_area_func)(struct bNode *node, int x, int y);
268   /** Optional selection area polling. */
269   int (*select_area_func)(struct bNode *node, int x, int y);
270   /** Optional tweak area polling (for grabbing). */
271   int (*tweak_area_func)(struct bNode *node, int x, int y);
272
273   /** Called when the node is updated in the editor. */
274   void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
275   /** Check and update if internal ID data has changed. */
276   void (*group_update_func)(struct bNodeTree *ntree, struct bNode *node);
277
278   /** Initialize a new node instance of this type after creation. */
279   void (*initfunc)(struct bNodeTree *ntree, struct bNode *node);
280   /** Free the node instance. */
281   void (*freefunc)(struct bNode *node);
282   /** Make a copy of the node instance. */
283   void (*copyfunc)(struct bNodeTree *dest_ntree,
284                    struct bNode *dest_node,
285                    const struct bNode *src_node);
286
287   /* Registerable API callback versions, called in addition to C callbacks */
288   void (*initfunc_api)(const struct bContext *C, struct PointerRNA *ptr);
289   void (*freefunc_api)(struct PointerRNA *ptr);
290   void (*copyfunc_api)(struct PointerRNA *ptr, const struct bNode *src_node);
291
292   /**
293    * Can this node type be added to a node tree?
294    * \param r_disabled_hint: Optional hint to display in the UI when the poll fails.
295    *                         The callback can set this to a static string without having to
296    *                         null-check it (or without setting it to null if it's not used).
297    *                         The caller must pass a valid `const char **` and null-initialize it
298    *                         when it's not just a dummy, that is, if it actually wants to access
299    *                         the returned disabled-hint (null-check needed!).
300    */
301   bool (*poll)(struct bNodeType *ntype, struct bNodeTree *nodetree, const char **r_disabled_hint);
302   /** Can this node be added to a node tree?
303    * \param r_disabled_hint: See `poll()`.
304    */
305   bool (*poll_instance)(struct bNode *node,
306                         struct bNodeTree *nodetree,
307                         const char **r_disabled_hint);
308
309   /* optional handling of link insertion */
310   void (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
311   /* Update the internal links list, for muting and disconnect operators. */
312   void (*update_internal_links)(struct bNodeTree *, struct bNode *node);
313
314   void (*free_self)(struct bNodeType *ntype);
315
316   /* **** execution callbacks **** */
317   NodeInitExecFunction init_exec_fn;
318   NodeFreeExecFunction free_exec_fn;
319   NodeExecFunction exec_fn;
320   /* gpu */
321   NodeGPUExecFunction gpu_fn;
322
323   /* Expands the bNode into nodes in a multi-function network, which will be evaluated later on. */
324   NodeExpandInMFNetworkFunction expand_in_mf_network;
325
326   /* Execute a geometry node. */
327   NodeGeometryExecFunction geometry_node_execute;
328   bool geometry_node_execute_supports_lazyness;
329
330   /* RNA integration */
331   ExtensionRNA rna_ext;
332 } bNodeType;
333
334 /* nodetype->nclass, for add-menu and themes */
335 #define NODE_CLASS_INPUT 0
336 #define NODE_CLASS_OUTPUT 1
337 #define NODE_CLASS_OP_COLOR 3
338 #define NODE_CLASS_OP_VECTOR 4
339 #define NODE_CLASS_OP_FILTER 5
340 #define NODE_CLASS_GROUP 6
341 // #define NODE_CLASS_FILE              7
342 #define NODE_CLASS_CONVERTOR 8
343 #define NODE_CLASS_MATTE 9
344 #define NODE_CLASS_DISTORT 10
345 // #define NODE_CLASS_OP_DYNAMIC        11 /* deprecated */
346 #define NODE_CLASS_PATTERN 12
347 #define NODE_CLASS_TEXTURE 13
348 // #define NODE_CLASS_EXECUTION     14
349 // #define NODE_CLASS_GETDATA           15
350 // #define NODE_CLASS_SETDATA           16
351 // #define NODE_CLASS_MATH              17
352 // #define NODE_CLASS_MATH_VECTOR       18
353 // #define NODE_CLASS_MATH_ROTATION 19
354 // #define NODE_CLASS_PARTICLES     25
355 // #define NODE_CLASS_TRANSFORM     30
356 // #define NODE_CLASS_COMBINE           31
357 #define NODE_CLASS_SCRIPT 32
358 #define NODE_CLASS_INTERFACE 33
359 #define NODE_CLASS_SHADER 40
360 #define NODE_CLASS_GEOMETRY 41
361 #define NODE_CLASS_ATTRIBUTE 42
362 #define NODE_CLASS_LAYOUT 100
363
364 /* node resize directions */
365 #define NODE_RESIZE_TOP 1
366 #define NODE_RESIZE_BOTTOM 2
367 #define NODE_RESIZE_RIGHT 4
368 #define NODE_RESIZE_LEFT 8
369
370 typedef enum eNodeSizePreset {
371   NODE_SIZE_DEFAULT,
372   NODE_SIZE_SMALL,
373   NODE_SIZE_MIDDLE,
374   NODE_SIZE_LARGE,
375 } eNodeSizePreset;
376
377 struct bNodeTreeExec;
378
379 typedef void (*bNodeClassCallback)(void *calldata, int nclass, const char *name);
380 typedef struct bNodeTreeType {
381   int type;        /* type identifier */
382   char idname[64]; /* identifier name */
383
384   char ui_name[64];
385   char ui_description[256];
386   int ui_icon;
387
388   /* callbacks */
389   void (*free_cache)(struct bNodeTree *ntree);
390   void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node);
391   /* Iteration over all node classes. */
392   void (*foreach_nodeclass)(struct Scene *scene, void *calldata, bNodeClassCallback func);
393   /* Check visibility in the node editor */
394   bool (*poll)(const struct bContext *C, struct bNodeTreeType *ntreetype);
395   /* Select a node tree from the context */
396   void (*get_from_context)(const struct bContext *C,
397                            struct bNodeTreeType *ntreetype,
398                            struct bNodeTree **r_ntree,
399                            struct ID **r_id,
400                            struct ID **r_from);
401
402   /* calls allowing threaded composite */
403   void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
404   void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
405   void (*local_merge)(struct Main *bmain, struct bNodeTree *localtree, struct bNodeTree *ntree);
406
407   /* Tree update. Overrides nodetype->updatetreefunc! */
408   void (*update)(struct bNodeTree *ntree);
409
410   bool (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
411
412   void (*node_add_init)(struct bNodeTree *ntree, struct bNode *bnode);
413
414   /* Check if the socket type is valid for this tree type. */
415   bool (*valid_socket_type)(enum eNodeSocketDatatype socket_type, struct bNodeTreeType *ntreetype);
416
417   /* RNA integration */
418   ExtensionRNA rna_ext;
419 } bNodeTreeType;
420
421 /** \} */
422
423 /* -------------------------------------------------------------------- */
424 /** \name Generic API, Trees
425  * \{ */
426
427 struct bNodeTreeType *ntreeTypeFind(const char *idname);
428 void ntreeTypeAdd(struct bNodeTreeType *nt);
429 void ntreeTypeFreeLink(const struct bNodeTreeType *nt);
430 bool ntreeIsRegistered(struct bNodeTree *ntree);
431 struct GHashIterator *ntreeTypeGetIterator(void);
432
433 /* helper macros for iterating over tree types */
434 #define NODE_TREE_TYPES_BEGIN(ntype) \
435   { \
436     GHashIterator *__node_tree_type_iter__ = ntreeTypeGetIterator(); \
437     for (; !BLI_ghashIterator_done(__node_tree_type_iter__); \
438          BLI_ghashIterator_step(__node_tree_type_iter__)) { \
439       bNodeTreeType *ntype = (bNodeTreeType *)BLI_ghashIterator_getValue(__node_tree_type_iter__);
440
441 #define NODE_TREE_TYPES_END \
442   } \
443   BLI_ghashIterator_free(__node_tree_type_iter__); \
444   } \
445   (void)0
446
447 void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree);
448
449 struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname);
450
451 /* copy/free funcs, need to manage ID users */
452 void ntreeFreeTree(struct bNodeTree *ntree);
453 /* Free tree which is embedded into another datablock. */
454 void ntreeFreeEmbeddedTree(struct bNodeTree *ntree);
455 struct bNodeTree *ntreeCopyTree_ex(const struct bNodeTree *ntree,
456                                    struct Main *bmain,
457                                    const bool do_id_user);
458 struct bNodeTree *ntreeCopyTree(struct Main *bmain, const struct bNodeTree *ntree);
459
460 struct bNodeTree **BKE_ntree_ptr_from_id(struct ID *id);
461 struct bNodeTree *ntreeFromID(struct ID *id);
462
463 void ntreeFreeLocalNode(struct bNodeTree *ntree, struct bNode *node);
464 void ntreeFreeLocalTree(struct bNodeTree *ntree);
465 struct bNode *ntreeFindType(const struct bNodeTree *ntree, int type);
466 bool ntreeHasType(const struct bNodeTree *ntree, int type);
467 bool ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
468 void ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree);
469 void ntreeUpdateAllNew(struct Main *main);
470 void ntreeUpdateAllUsers(struct Main *main, struct ID *id);
471
472 void ntreeGetDependencyList(struct bNodeTree *ntree,
473                             struct bNode ***r_deplist,
474                             int *r_deplist_len);
475
476 /* XXX old trees handle output flags automatically based on special output
477  * node types and last active selection.
478  * New tree types have a per-output socket flag to indicate the final output to use explicitly.
479  */
480 void ntreeSetOutput(struct bNodeTree *ntree);
481
482 void ntreeFreeCache(struct bNodeTree *ntree);
483
484 bool ntreeNodeExists(const struct bNodeTree *ntree, const struct bNode *testnode);
485 bool ntreeOutputExists(const struct bNode *node, const struct bNodeSocket *testsock);
486 void ntreeNodeFlagSet(const bNodeTree *ntree, const int flag, const bool enable);
487 struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
488 void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
489 void ntreeLocalMerge(struct Main *bmain, struct bNodeTree *localtree, struct bNodeTree *ntree);
490
491 void ntreeBlendWrite(struct BlendWriter *writer, struct bNodeTree *ntree);
492 void ntreeBlendReadData(struct BlendDataReader *reader, struct bNodeTree *ntree);
493 void ntreeBlendReadLib(struct BlendLibReader *reader, struct bNodeTree *ntree);
494 void ntreeBlendReadExpand(struct BlendExpander *expander, struct bNodeTree *ntree);
495
496 /** \} */
497
498 /* -------------------------------------------------------------------- */
499 /** \name Node Tree Interface
500  * \{ */
501 struct bNodeSocket *ntreeFindSocketInterface(struct bNodeTree *ntree,
502                                              eNodeSocketInOut in_out,
503                                              const char *identifier);
504 struct bNodeSocket *ntreeAddSocketInterface(struct bNodeTree *ntree,
505                                             eNodeSocketInOut in_out,
506                                             const char *idname,
507                                             const char *name);
508 struct bNodeSocket *ntreeInsertSocketInterface(struct bNodeTree *ntree,
509                                                eNodeSocketInOut in_out,
510                                                const char *idname,
511                                                struct bNodeSocket *next_sock,
512                                                const char *name);
513 struct bNodeSocket *ntreeAddSocketInterfaceFromSocket(struct bNodeTree *ntree,
514                                                       struct bNode *from_node,
515                                                       struct bNodeSocket *from_sock);
516 struct bNodeSocket *ntreeInsertSocketInterfaceFromSocket(struct bNodeTree *ntree,
517                                                          struct bNodeSocket *next_sock,
518                                                          struct bNode *from_node,
519                                                          struct bNodeSocket *from_sock);
520 void ntreeRemoveSocketInterface(struct bNodeTree *ntree, struct bNodeSocket *sock);
521
522 struct StructRNA *ntreeInterfaceTypeGet(struct bNodeTree *ntree, bool create);
523 void ntreeInterfaceTypeFree(struct bNodeTree *ntree);
524 void ntreeInterfaceTypeUpdate(struct bNodeTree *ntree);
525
526 /** \} */
527
528 /* -------------------------------------------------------------------- */
529 /** \name Generic API, Nodes
530  * \{ */
531
532 struct bNodeType *nodeTypeFind(const char *idname);
533 void nodeRegisterType(struct bNodeType *ntype);
534 void nodeUnregisterType(struct bNodeType *ntype);
535 bool nodeTypeUndefined(struct bNode *node);
536 struct GHashIterator *nodeTypeGetIterator(void);
537
538 /* helper macros for iterating over node types */
539 #define NODE_TYPES_BEGIN(ntype) \
540   { \
541     GHashIterator *__node_type_iter__ = nodeTypeGetIterator(); \
542     for (; !BLI_ghashIterator_done(__node_type_iter__); \
543          BLI_ghashIterator_step(__node_type_iter__)) { \
544       bNodeType *ntype = (bNodeType *)BLI_ghashIterator_getValue(__node_type_iter__);
545
546 #define NODE_TYPES_END \
547   } \
548   BLI_ghashIterator_free(__node_type_iter__); \
549   } \
550   ((void)0)
551
552 struct bNodeSocketType *nodeSocketTypeFind(const char *idname);
553 void nodeRegisterSocketType(struct bNodeSocketType *stype);
554 void nodeUnregisterSocketType(struct bNodeSocketType *stype);
555 bool nodeSocketIsRegistered(struct bNodeSocket *sock);
556 struct GHashIterator *nodeSocketTypeGetIterator(void);
557 const char *nodeStaticSocketType(int type, int subtype);
558 const char *nodeStaticSocketInterfaceType(int type, int subtype);
559
560 /* helper macros for iterating over node types */
561 #define NODE_SOCKET_TYPES_BEGIN(stype) \
562   { \
563     GHashIterator *__node_socket_type_iter__ = nodeSocketTypeGetIterator(); \
564     for (; !BLI_ghashIterator_done(__node_socket_type_iter__); \
565          BLI_ghashIterator_step(__node_socket_type_iter__)) { \
566       bNodeSocketType *stype = (bNodeSocketType *)BLI_ghashIterator_getValue( \
567           __node_socket_type_iter__);
568
569 #define NODE_SOCKET_TYPES_END \
570   } \
571   BLI_ghashIterator_free(__node_socket_type_iter__); \
572   } \
573   ((void)0)
574
575 struct bNodeSocket *nodeFindSocket(const struct bNode *node,
576                                    eNodeSocketInOut in_out,
577                                    const char *identifier);
578 struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree,
579                                   struct bNode *node,
580                                   eNodeSocketInOut in_out,
581                                   const char *idname,
582                                   const char *identifier,
583                                   const char *name);
584 struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree,
585                                      struct bNode *node,
586                                      eNodeSocketInOut in_out,
587                                      const char *idname,
588                                      struct bNodeSocket *next_sock,
589                                      const char *identifier,
590                                      const char *name);
591 struct bNodeSocket *nodeAddStaticSocket(struct bNodeTree *ntree,
592                                         struct bNode *node,
593                                         eNodeSocketInOut in_out,
594                                         int type,
595                                         int subtype,
596                                         const char *identifier,
597                                         const char *name);
598 struct bNodeSocket *nodeInsertStaticSocket(struct bNodeTree *ntree,
599                                            struct bNode *node,
600                                            eNodeSocketInOut in_out,
601                                            int type,
602                                            int subtype,
603                                            struct bNodeSocket *next_sock,
604                                            const char *identifier,
605                                            const char *name);
606 void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
607 void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
608 void nodeModifySocketType(
609     struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock, int type, int subtype);
610
611 struct bNode *nodeAddNode(const struct bContext *C, struct bNodeTree *ntree, const char *idname);
612 struct bNode *nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type);
613 void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
614 void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
615
616 /* Delete node, associated animation data and ID user count. */
617 void nodeRemoveNode(struct Main *bmain,
618                     struct bNodeTree *ntree,
619                     struct bNode *node,
620                     bool do_id_user);
621
622 struct bNode *BKE_node_copy_ex(struct bNodeTree *ntree,
623                                const struct bNode *node_src,
624                                const int flag,
625                                const bool unique_name);
626
627 /* Same as BKE_node_copy_ex() but stores pointers to a new node and its sockets in the source
628  * node.
629  *
630  * NOTE: DANGER ZONE!
631  *
632  * TODO(sergey): Maybe it's better to make BKE_node_copy_ex() return a mapping from old node and
633  * sockets to new one. */
634 struct bNode *BKE_node_copy_store_new_pointers(struct bNodeTree *ntree,
635                                                struct bNode *node_src,
636                                                const int flag);
637 struct bNodeTree *ntreeCopyTree_ex_new_pointers(const struct bNodeTree *ntree,
638                                                 struct Main *bmain,
639                                                 const bool do_id_user);
640
641 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree,
642                               struct bNode *fromnode,
643                               struct bNodeSocket *fromsock,
644                               struct bNode *tonode,
645                               struct bNodeSocket *tosock);
646 void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
647 void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
648 void nodeMuteLinkToggle(struct bNodeTree *ntree, struct bNodeLink *link);
649 bool nodeLinkIsHidden(const struct bNodeLink *link);
650 void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
651
652 void nodeToView(const struct bNode *node, float x, float y, float *rx, float *ry);
653 void nodeFromView(const struct bNode *node, float x, float y, float *rx, float *ry);
654 bool nodeAttachNodeCheck(const struct bNode *node, const struct bNode *parent);
655 void nodeAttachNode(struct bNode *node, struct bNode *parent);
656 void nodeDetachNode(struct bNode *node);
657
658 void nodePositionRelative(struct bNode *from_node,
659                           struct bNode *to_node,
660                           struct bNodeSocket *from_sock,
661                           struct bNodeSocket *to_sock);
662 void nodePositionPropagate(struct bNode *node);
663
664 struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
665 bool nodeFindNode(struct bNodeTree *ntree,
666                   struct bNodeSocket *sock,
667                   struct bNode **r_node,
668                   int *r_sockindex);
669 struct bNode *nodeFindRootParent(bNode *node);
670
671 bool nodeIsChildOf(const bNode *parent, const bNode *child);
672
673 void nodeChainIter(const bNodeTree *ntree,
674                    const bNode *node_start,
675                    bool (*callback)(bNode *, bNode *, void *, const bool),
676                    void *userdata,
677                    const bool reversed);
678 void nodeChainIterBackwards(const bNodeTree *ntree,
679                             const bNode *node_start,
680                             bool (*callback)(bNode *, bNode *, void *),
681                             void *userdata,
682                             int recursion_lvl);
683 void nodeParentsIter(bNode *node, bool (*callback)(bNode *, void *), void *userdata);
684
685 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree,
686                                const struct bNodeSocket *from,
687                                const struct bNodeSocket *to);
688 int nodeCountSocketLinks(const struct bNodeTree *ntree, const struct bNodeSocket *sock);
689
690 void nodeSetSelected(struct bNode *node, bool select);
691 void nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
692 struct bNode *nodeGetActive(struct bNodeTree *ntree);
693 struct bNode *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
694 bool nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
695 void nodeClearActive(struct bNodeTree *ntree);
696 void nodeClearActiveID(struct bNodeTree *ntree, short idtype);
697 struct bNode *nodeGetActiveTexture(struct bNodeTree *ntree);
698
699 void nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
700 bool nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
701 void nodeUpdateInternalLinks(struct bNodeTree *ntree, struct bNode *node);
702
703 int nodeSocketIsHidden(const struct bNodeSocket *sock);
704 void ntreeTagUsedSockets(struct bNodeTree *ntree);
705 void nodeSetSocketAvailability(struct bNodeSocket *sock, bool is_available);
706
707 int nodeSocketLinkLimit(const struct bNodeSocket *sock);
708
709 /* Node Clipboard */
710 void BKE_node_clipboard_init(const struct bNodeTree *ntree);
711 void BKE_node_clipboard_clear(void);
712 void BKE_node_clipboard_free(void);
713 bool BKE_node_clipboard_validate(void);
714 void BKE_node_clipboard_add_node(struct bNode *node);
715 void BKE_node_clipboard_add_link(struct bNodeLink *link);
716 const struct ListBase *BKE_node_clipboard_get_nodes(void);
717 const struct ListBase *BKE_node_clipboard_get_links(void);
718 int BKE_node_clipboard_get_type(void);
719
720 /* Node Instance Hash */
721 typedef struct bNodeInstanceHash {
722   GHash *ghash; /* XXX should be made a direct member, GHash allocation needs to support it */
723 } bNodeInstanceHash;
724
725 typedef void (*bNodeInstanceValueFP)(void *value);
726
727 extern const bNodeInstanceKey NODE_INSTANCE_KEY_BASE;
728 extern const bNodeInstanceKey NODE_INSTANCE_KEY_NONE;
729
730 bNodeInstanceKey BKE_node_instance_key(bNodeInstanceKey parent_key,
731                                        const struct bNodeTree *ntree,
732                                        const struct bNode *node);
733
734 bNodeInstanceHash *BKE_node_instance_hash_new(const char *info);
735 void BKE_node_instance_hash_free(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
736 void BKE_node_instance_hash_insert(bNodeInstanceHash *hash, bNodeInstanceKey key, void *value);
737 void *BKE_node_instance_hash_lookup(bNodeInstanceHash *hash, bNodeInstanceKey key);
738 int BKE_node_instance_hash_remove(bNodeInstanceHash *hash,
739                                   bNodeInstanceKey key,
740                                   bNodeInstanceValueFP valfreefp);
741 void BKE_node_instance_hash_clear(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
742 void *BKE_node_instance_hash_pop(bNodeInstanceHash *hash, bNodeInstanceKey key);
743 int BKE_node_instance_hash_haskey(bNodeInstanceHash *hash, bNodeInstanceKey key);
744 int BKE_node_instance_hash_size(bNodeInstanceHash *hash);
745
746 void BKE_node_instance_hash_clear_tags(bNodeInstanceHash *hash);
747 void BKE_node_instance_hash_tag(bNodeInstanceHash *hash, void *value);
748 bool BKE_node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey key);
749 void BKE_node_instance_hash_remove_untagged(bNodeInstanceHash *hash,
750                                             bNodeInstanceValueFP valfreefp);
751
752 typedef GHashIterator bNodeInstanceHashIterator;
753
754 BLI_INLINE bNodeInstanceHashIterator *BKE_node_instance_hash_iterator_new(bNodeInstanceHash *hash)
755 {
756   return BLI_ghashIterator_new(hash->ghash);
757 }
758 BLI_INLINE void BKE_node_instance_hash_iterator_init(bNodeInstanceHashIterator *iter,
759                                                      bNodeInstanceHash *hash)
760 {
761   BLI_ghashIterator_init(iter, hash->ghash);
762 }
763 BLI_INLINE void BKE_node_instance_hash_iterator_free(bNodeInstanceHashIterator *iter)
764 {
765   BLI_ghashIterator_free(iter);
766 }
767 BLI_INLINE bNodeInstanceKey
768 BKE_node_instance_hash_iterator_get_key(bNodeInstanceHashIterator *iter)
769 {
770   return *(bNodeInstanceKey *)BLI_ghashIterator_getKey(iter);
771 }
772 BLI_INLINE void *BKE_node_instance_hash_iterator_get_value(bNodeInstanceHashIterator *iter)
773 {
774   return BLI_ghashIterator_getValue(iter);
775 }
776 BLI_INLINE void BKE_node_instance_hash_iterator_step(bNodeInstanceHashIterator *iter)
777 {
778   BLI_ghashIterator_step(iter);
779 }
780 BLI_INLINE bool BKE_node_instance_hash_iterator_done(bNodeInstanceHashIterator *iter)
781 {
782   return BLI_ghashIterator_done(iter);
783 }
784
785 #define NODE_INSTANCE_HASH_ITER(iter_, hash_) \
786   for (BKE_node_instance_hash_iterator_init(&iter_, hash_); \
787        BKE_node_instance_hash_iterator_done(&iter_) == false; \
788        BKE_node_instance_hash_iterator_step(&iter_))
789
790 /* Node Previews */
791
792 bool BKE_node_preview_used(const struct bNode *node);
793 bNodePreview *BKE_node_preview_verify(
794     struct bNodeInstanceHash *previews, bNodeInstanceKey key, int xsize, int ysize, bool create);
795 bNodePreview *BKE_node_preview_copy(struct bNodePreview *preview);
796 void BKE_node_preview_free(struct bNodePreview *preview);
797 void BKE_node_preview_init_tree(struct bNodeTree *ntree,
798                                 int xsize,
799                                 int ysize,
800                                 bool create_previews);
801 void BKE_node_preview_free_tree(struct bNodeTree *ntree);
802 void BKE_node_preview_remove_unused(struct bNodeTree *ntree);
803 void BKE_node_preview_clear(struct bNodePreview *preview);
804 void BKE_node_preview_clear_tree(struct bNodeTree *ntree);
805
806 void BKE_node_preview_sync_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree);
807 void BKE_node_preview_merge_tree(struct bNodeTree *to_ntree,
808                                  struct bNodeTree *from_ntree,
809                                  bool remove_old);
810
811 void BKE_node_preview_set_pixel(
812     struct bNodePreview *preview, const float col[4], int x, int y, bool do_manage);
813
814 /** \} */
815
816 /* -------------------------------------------------------------------- */
817 /** \name Node Type Access
818  * \{ */
819
820 void nodeLabel(struct bNodeTree *ntree, struct bNode *node, char *label, int maxlen);
821 const char *nodeSocketLabel(const struct bNodeSocket *sock);
822
823 bool nodeGroupPoll(struct bNodeTree *nodetree,
824                    struct bNodeTree *grouptree,
825                    const char **r_disabled_hint);
826
827 /* Init a new node type struct with default values and callbacks */
828 void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
829 void node_type_base_custom(
830     struct bNodeType *ntype, const char *idname, const char *name, short nclass, short flag);
831 void node_type_socket_templates(struct bNodeType *ntype,
832                                 struct bNodeSocketTemplate *inputs,
833                                 struct bNodeSocketTemplate *outputs);
834 void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
835 void node_type_size_preset(struct bNodeType *ntype, eNodeSizePreset size);
836 void node_type_init(struct bNodeType *ntype,
837                     void (*initfunc)(struct bNodeTree *ntree, struct bNode *node));
838 void node_type_storage(struct bNodeType *ntype,
839                        const char *storagename,
840                        void (*freefunc)(struct bNode *node),
841                        void (*copyfunc)(struct bNodeTree *dest_ntree,
842                                         struct bNode *dest_node,
843                                         const struct bNode *src_node));
844 void node_type_label(
845     struct bNodeType *ntype,
846     void (*labelfunc)(struct bNodeTree *ntree, struct bNode *, char *label, int maxlen));
847 void node_type_update(struct bNodeType *ntype,
848                       void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node));
849 void node_type_group_update(struct bNodeType *ntype,
850                             void (*group_update_func)(struct bNodeTree *ntree,
851                                                       struct bNode *node));
852
853 void node_type_exec(struct bNodeType *ntype,
854                     NodeInitExecFunction init_exec_fn,
855                     NodeFreeExecFunction free_exec_fn,
856                     NodeExecFunction exec_fn);
857 void node_type_gpu(struct bNodeType *ntype, NodeGPUExecFunction gpu_fn);
858 void node_type_internal_links(struct bNodeType *ntype,
859                               void (*update_internal_links)(struct bNodeTree *, struct bNode *));
860
861 /** \} */
862
863 /* -------------------------------------------------------------------- */
864 /** \name Node Generic Functions
865  * \{ */
866
867 bool BKE_node_is_connected_to_output(struct bNodeTree *ntree, struct bNode *node);
868
869 /* ************** COMMON NODES *************** */
870
871 #define NODE_UNDEFINED -2 /* node type is not registered */
872 #define NODE_CUSTOM -1    /* for dynamically registered custom types */
873 #define NODE_GROUP 2
874 // #define NODE_FORLOOP 3       /* deprecated */
875 // #define NODE_WHILELOOP   4   /* deprecated */
876 #define NODE_FRAME 5
877 #define NODE_REROUTE 6
878 #define NODE_GROUP_INPUT 7
879 #define NODE_GROUP_OUTPUT 8
880 #define NODE_CUSTOM_GROUP 9
881
882 void BKE_node_tree_unlink_id(ID *id, struct bNodeTree *ntree);
883
884 /** \} */
885
886 /* -------------------------------------------------------------------- */
887 /** \name Node Tree Iterator
888  *
889  * Utility macro for visiting every node tree in the library data,
890  * including local bNodeTree blocks in other IDs.
891  * This avoids the need for callback functions and allows executing code
892  * in a single inner code block.
893  *
894  * Variables:
895  *
896  * - nodetree:
897  *   The actual bNodeTree data block.
898  *   Check nodetree->idname or nodetree->typeinfo to use only specific types.
899  *
900  * - id:
901  *   The owner of the bNodeTree data block.
902  *   Same as nodetree if it's a linkable node tree from the library.
903  *
904  * Examples:
905  *
906  * \code{.c}
907  * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) {
908  *     if (id == nodetree)
909  *         printf("This is a linkable node tree");
910  * } FOREACH_NODETREE_END;
911  *
912  * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) {
913  *     if (nodetree->idname == "ShaderNodeTree")
914  *         printf("This is a shader node tree);
915  *     if (GS(id) == ID_MA)
916  *         printf(" and it's owned by a material");
917  * } FOREACH_NODETREE_END;
918  * \endcode
919  *
920  * \{ */
921
922 /* should be an opaque type, only for internal use by BKE_node_tree_iter_*** */
923 struct NodeTreeIterStore {
924   bNodeTree *ngroup;
925   Scene *scene;
926   struct Material *mat;
927   Tex *tex;
928   struct Light *light;
929   struct World *world;
930   struct FreestyleLineStyle *linestyle;
931   struct Simulation *simulation;
932 };
933
934 void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain);
935 bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
936                              struct bNodeTree **r_nodetree,
937                              struct ID **r_id);
938
939 #define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id) \
940   { \
941     struct NodeTreeIterStore _nstore; \
942     bNodeTree *_nodetree; \
943     ID *_id; \
944     /* avoid compiler warning about unused variables */ \
945     BKE_node_tree_iter_init(&_nstore, bmain); \
946     while (BKE_node_tree_iter_step(&_nstore, &_nodetree, &_id) == true) { \
947       if (_nodetree) {
948
949 #define FOREACH_NODETREE_END \
950   } \
951   } \
952   } \
953   ((void)0)
954 /** \} */
955
956 /* -------------------------------------------------------------------- */
957 /** \name Node Tree
958  */
959
960 void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree,
961                                  struct Scene *scene,
962                                  const int layer_index);
963
964 /* -------------------------------------------------------------------- */
965 /** \name Shader Nodes
966  * \{ */
967
968 /* note: types are needed to restore callbacks, don't change values */
969 /* range 1 - 100 is reserved for common nodes */
970 /* using toolbox, we add node groups by assuming the values below
971  * don't exceed NODE_GROUP_MENU for now. */
972
973 //#define SH_NODE_OUTPUT        1
974
975 //#define SH_NODE_MATERIAL  100
976 #define SH_NODE_RGB 101
977 #define SH_NODE_VALUE 102
978 #define SH_NODE_MIX_RGB 103
979 #define SH_NODE_VALTORGB 104
980 #define SH_NODE_RGBTOBW 105
981 #define SH_NODE_SHADERTORGB 106
982 //#define SH_NODE_TEXTURE       106
983 #define SH_NODE_NORMAL 107
984 //#define SH_NODE_GEOMETRY  108
985 #define SH_NODE_MAPPING 109
986 #define SH_NODE_CURVE_VEC 110
987 #define SH_NODE_CURVE_RGB 111
988 #define SH_NODE_CAMERA 114
989 #define SH_NODE_MATH 115
990 #define SH_NODE_VECTOR_MATH 116
991 #define SH_NODE_SQUEEZE 117
992 //#define SH_NODE_MATERIAL_EXT  118
993 #define SH_NODE_INVERT 119
994 #define SH_NODE_SEPRGB 120
995 #define SH_NODE_COMBRGB 121
996 #define SH_NODE_HUE_SAT 122
997 #define NODE_DYNAMIC 123
998
999 #define SH_NODE_OUTPUT_MATERIAL 124
1000 #define SH_NODE_OUTPUT_WORLD 125
1001 #define SH_NODE_OUTPUT_LIGHT 126
1002 #define SH_NODE_FRESNEL 127
1003 #define SH_NODE_MIX_SHADER 128
1004 #define SH_NODE_ATTRIBUTE 129
1005 #define SH_NODE_BACKGROUND 130
1006 #define SH_NODE_BSDF_ANISOTROPIC 131
1007 #define SH_NODE_BSDF_DIFFUSE 132
1008 #define SH_NODE_BSDF_GLOSSY 133
1009 #define SH_NODE_BSDF_GLASS 134
1010 #define SH_NODE_BSDF_TRANSLUCENT 137
1011 #define SH_NODE_BSDF_TRANSPARENT 138
1012 #define SH_NODE_BSDF_VELVET 139
1013 #define SH_NODE_EMISSION 140
1014 #define SH_NODE_NEW_GEOMETRY 141
1015 #define SH_NODE_LIGHT_PATH 142
1016 #define SH_NODE_TEX_IMAGE 143
1017 #define SH_NODE_TEX_SKY 145
1018 #define SH_NODE_TEX_GRADIENT 146
1019 #define SH_NODE_TEX_VORONOI 147
1020 #define SH_NODE_TEX_MAGIC 148
1021 #define SH_NODE_TEX_WAVE 149
1022 #define SH_NODE_TEX_NOISE 150
1023 #define SH_NODE_TEX_MUSGRAVE 152
1024 #define SH_NODE_TEX_COORD 155
1025 #define SH_NODE_ADD_SHADER 156
1026 #define SH_NODE_TEX_ENVIRONMENT 157
1027 // #define SH_NODE_OUTPUT_TEXTURE 158
1028 #define SH_NODE_HOLDOUT 159
1029 #define SH_NODE_LAYER_WEIGHT 160
1030 #define SH_NODE_VOLUME_ABSORPTION 161
1031 #define SH_NODE_VOLUME_SCATTER 162
1032 #define SH_NODE_GAMMA 163
1033 #define SH_NODE_TEX_CHECKER 164
1034 #define SH_NODE_BRIGHTCONTRAST 165
1035 #define SH_NODE_LIGHT_FALLOFF 166
1036 #define SH_NODE_OBJECT_INFO 167
1037 #define SH_NODE_PARTICLE_INFO 168
1038 #define SH_NODE_TEX_BRICK 169
1039 #define SH_NODE_BUMP 170
1040 #define SH_NODE_SCRIPT 171
1041 #define SH_NODE_AMBIENT_OCCLUSION 172
1042 #define SH_NODE_BSDF_REFRACTION 173
1043 #define SH_NODE_TANGENT 174
1044 #define SH_NODE_NORMAL_MAP 175
1045 #define SH_NODE_HAIR_INFO 176
1046 #define SH_NODE_SUBSURFACE_SCATTERING 177
1047 #define SH_NODE_WIREFRAME 178
1048 #define SH_NODE_BSDF_TOON 179
1049 #define SH_NODE_WAVELENGTH 180
1050 #define SH_NODE_BLACKBODY 181
1051 #define SH_NODE_VECT_TRANSFORM 182
1052 #define SH_NODE_SEPHSV 183
1053 #define SH_NODE_COMBHSV 184
1054 #define SH_NODE_BSDF_HAIR 185
1055 // #define SH_NODE_LAMP 186
1056 #define SH_NODE_UVMAP 187
1057 #define SH_NODE_SEPXYZ 188
1058 #define SH_NODE_COMBXYZ 189
1059 #define SH_NODE_OUTPUT_LINESTYLE 190
1060 #define SH_NODE_UVALONGSTROKE 191
1061 #define SH_NODE_TEX_POINTDENSITY 192
1062 #define SH_NODE_BSDF_PRINCIPLED 193
1063 #define SH_NODE_TEX_IES 194
1064 #define SH_NODE_EEVEE_SPECULAR 195
1065 #define SH_NODE_BEVEL 197
1066 #define SH_NODE_DISPLACEMENT 198
1067 #define SH_NODE_VECTOR_DISPLACEMENT 199
1068 #define SH_NODE_VOLUME_PRINCIPLED 200
1069 /* 201..700 occupied by other node types, continue from 701 */
1070 #define SH_NODE_BSDF_HAIR_PRINCIPLED 701
1071 #define SH_NODE_MAP_RANGE 702
1072 #define SH_NODE_CLAMP 703
1073 #define SH_NODE_TEX_WHITE_NOISE 704
1074 #define SH_NODE_VOLUME_INFO 705
1075 #define SH_NODE_VERTEX_COLOR 706
1076 #define SH_NODE_OUTPUT_AOV 707
1077 #define SH_NODE_VECTOR_ROTATE 708
1078
1079 /* custom defines options for Material node */
1080 // #define SH_NODE_MAT_DIFF 1
1081 // #define SH_NODE_MAT_SPEC 2
1082 // #define SH_NODE_MAT_NEG 4
1083
1084 /* API */
1085
1086 struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree);
1087 void ntreeShaderEndExecTree(struct bNodeTreeExec *exec);
1088 struct bNode *ntreeShaderOutputNode(struct bNodeTree *ntree, int target);
1089
1090 void ntreeGPUMaterialNodes(struct bNodeTree *localtree,
1091                            struct GPUMaterial *mat,
1092                            bool *has_surface_output,
1093                            bool *has_volume_output);
1094
1095 /** \} */
1096
1097 /* -------------------------------------------------------------------- */
1098 /** \name Composite Nodes
1099  * \{ */
1100
1101 /* output socket defines */
1102 #define RRES_OUT_IMAGE 0
1103 #define RRES_OUT_ALPHA 1
1104 // #define RRES_OUT_Z 2
1105 // #define RRES_OUT_NORMAL 3
1106 // #define RRES_OUT_UV 4
1107 // #define RRES_OUT_VEC 5
1108 // #define RRES_OUT_RGBA 6
1109 #define RRES_OUT_DIFF 7
1110 // #define RRES_OUT_SPEC 8
1111 // #define RRES_OUT_SHADOW 9
1112 // #define RRES_OUT_AO 10
1113 // #define RRES_OUT_REFLECT 11
1114 // #define RRES_OUT_REFRACT 12
1115 // #define RRES_OUT_INDIRECT 13
1116 // #define RRES_OUT_INDEXOB 14
1117 // #define RRES_OUT_INDEXMA 15
1118 // #define RRES_OUT_MIST 16
1119 // #define RRES_OUT_EMIT 17
1120 // #define RRES_OUT_ENV 18
1121 // #define RRES_OUT_DIFF_DIRECT 19
1122 // #define RRES_OUT_DIFF_INDIRECT 20
1123 // #define RRES_OUT_DIFF_COLOR 21
1124 // #define RRES_OUT_GLOSSY_DIRECT 22
1125 // #define RRES_OUT_GLOSSY_INDIRECT 23
1126 // #define RRES_OUT_GLOSSY_COLOR 24
1127 // #define RRES_OUT_TRANSM_DIRECT 25
1128 // #define RRES_OUT_TRANSM_INDIRECT 26
1129 // #define RRES_OUT_TRANSM_COLOR 27
1130 // #define RRES_OUT_SUBSURFACE_DIRECT 28
1131 // #define RRES_OUT_SUBSURFACE_INDIRECT 29
1132 // #define RRES_OUT_SUBSURFACE_COLOR 30
1133 // #define RRES_OUT_DEBUG 31
1134
1135 /* note: types are needed to restore callbacks, don't change values */
1136 #define CMP_NODE_VIEWER 201
1137 #define CMP_NODE_RGB 202
1138 #define CMP_NODE_VALUE 203
1139 #define CMP_NODE_MIX_RGB 204
1140 #define CMP_NODE_VALTORGB 205
1141 #define CMP_NODE_RGBTOBW 206
1142 #define CMP_NODE_NORMAL 207
1143 #define CMP_NODE_CURVE_VEC 208
1144 #define CMP_NODE_CURVE_RGB 209
1145 #define CMP_NODE_ALPHAOVER 210
1146 #define CMP_NODE_BLUR 211
1147 #define CMP_NODE_FILTER 212
1148 #define CMP_NODE_MAP_VALUE 213
1149 #define CMP_NODE_TIME 214
1150 #define CMP_NODE_VECBLUR 215
1151 #define CMP_NODE_SEPRGBA 216
1152 #define CMP_NODE_SEPHSVA 217
1153 #define CMP_NODE_SETALPHA 218
1154 #define CMP_NODE_HUE_SAT 219
1155 #define CMP_NODE_IMAGE 220
1156 #define CMP_NODE_R_LAYERS 221
1157 #define CMP_NODE_COMPOSITE 222
1158 #define CMP_NODE_OUTPUT_FILE 223
1159 #define CMP_NODE_TEXTURE 224
1160 #define CMP_NODE_TRANSLATE 225
1161 #define CMP_NODE_ZCOMBINE 226
1162 #define CMP_NODE_COMBRGBA 227
1163 #define CMP_NODE_DILATEERODE 228
1164 #define CMP_NODE_ROTATE 229
1165 #define CMP_NODE_SCALE 230
1166 #define CMP_NODE_SEPYCCA 231
1167 #define CMP_NODE_COMBYCCA 232
1168 #define CMP_NODE_SEPYUVA 233
1169 #define CMP_NODE_COMBYUVA 234
1170 #define CMP_NODE_DIFF_MATTE 235
1171 #define CMP_NODE_COLOR_SPILL 236
1172 #define CMP_NODE_CHROMA_MATTE 237
1173 #define CMP_NODE_CHANNEL_MATTE 238
1174 #define CMP_NODE_FLIP 239
1175 #define CMP_NODE_SPLITVIEWER 240
1176 // #define CMP_NODE_INDEX_MASK  241
1177 #define CMP_NODE_MAP_UV 242
1178 #define CMP_NODE_ID_MASK 243
1179 #define CMP_NODE_DEFOCUS 244
1180 #define CMP_NODE_DISPLACE 245
1181 #define CMP_NODE_COMBHSVA 246
1182 #define CMP_NODE_MATH 247
1183 #define CMP_NODE_LUMA_MATTE 248
1184 #define CMP_NODE_BRIGHTCONTRAST 249
1185 #define CMP_NODE_GAMMA 250
1186 #define CMP_NODE_INVERT 251
1187 #define CMP_NODE_NORMALIZE 252
1188 #define CMP_NODE_CROP 253
1189 #define CMP_NODE_DBLUR 254
1190 #define CMP_NODE_BILATERALBLUR 255
1191 #define CMP_NODE_PREMULKEY 256
1192 #define CMP_NODE_DIST_MATTE 257
1193 #define CMP_NODE_VIEW_LEVELS 258
1194 #define CMP_NODE_COLOR_MATTE 259
1195 #define CMP_NODE_COLORBALANCE 260
1196 #define CMP_NODE_HUECORRECT 261
1197 #define CMP_NODE_MOVIECLIP 262
1198 #define CMP_NODE_STABILIZE2D 263
1199 #define CMP_NODE_TRANSFORM 264
1200 #define CMP_NODE_MOVIEDISTORTION 265
1201 #define CMP_NODE_DOUBLEEDGEMASK 266
1202 #define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED \
1203   267 /* DEPRECATED multi file node has been merged into regular CMP_NODE_OUTPUT_FILE */
1204 #define CMP_NODE_MASK 268
1205 #define CMP_NODE_KEYINGSCREEN 269
1206 #define CMP_NODE_KEYING 270
1207 #define CMP_NODE_TRACKPOS 271
1208 #define CMP_NODE_INPAINT 272
1209 #define CMP_NODE_DESPECKLE 273
1210 #define CMP_NODE_ANTIALIASING 274
1211
1212 #define CMP_NODE_GLARE 301
1213 #define CMP_NODE_TONEMAP 302
1214 #define CMP_NODE_LENSDIST 303
1215 #define CMP_NODE_SUNBEAMS 304
1216
1217 #define CMP_NODE_COLORCORRECTION 312
1218 #define CMP_NODE_MASK_BOX 313
1219 #define CMP_NODE_MASK_ELLIPSE 314
1220 #define CMP_NODE_BOKEHIMAGE 315
1221 #define CMP_NODE_BOKEHBLUR 316
1222 #define CMP_NODE_SWITCH 317
1223 #define CMP_NODE_PIXELATE 318
1224
1225 #define CMP_NODE_MAP_RANGE 319
1226 #define CMP_NODE_PLANETRACKDEFORM 320
1227 #define CMP_NODE_CORNERPIN 321
1228 #define CMP_NODE_SWITCH_VIEW 322
1229 #define CMP_NODE_CRYPTOMATTE_LEGACY 323
1230 #define CMP_NODE_DENOISE 324
1231 #define CMP_NODE_EXPOSURE 325
1232 #define CMP_NODE_CRYPTOMATTE 326
1233
1234 /* channel toggles */
1235 #define CMP_CHAN_RGB 1
1236 #define CMP_CHAN_A 2
1237
1238 /* filter types */
1239 #define CMP_FILT_SOFT 0
1240 #define CMP_FILT_SHARP 1
1241 #define CMP_FILT_LAPLACE 2
1242 #define CMP_FILT_SOBEL 3
1243 #define CMP_FILT_PREWITT 4
1244 #define CMP_FILT_KIRSCH 5
1245 #define CMP_FILT_SHADOW 6
1246
1247 /* scale node type, in custom1 */
1248 #define CMP_SCALE_RELATIVE 0
1249 #define CMP_SCALE_ABSOLUTE 1
1250 #define CMP_SCALE_SCENEPERCENT 2
1251 #define CMP_SCALE_RENDERPERCENT 3
1252 /* custom2 */
1253 #define CMP_SCALE_RENDERSIZE_FRAME_ASPECT (1 << 0)
1254 #define CMP_SCALE_RENDERSIZE_FRAME_CROP (1 << 1)
1255
1256 /* track position node, in custom1 */
1257 #define CMP_TRACKPOS_ABSOLUTE 0
1258 #define CMP_TRACKPOS_RELATIVE_START 1
1259 #define CMP_TRACKPOS_RELATIVE_FRAME 2
1260 #define CMP_TRACKPOS_ABSOLUTE_FRAME 3
1261
1262 /* Cryptomatte source. */
1263 #define CMP_CRYPTOMATTE_SRC_RENDER 0
1264 #define CMP_CRYPTOMATTE_SRC_IMAGE 1
1265
1266 /* API */
1267 void ntreeCompositExecTree(struct Scene *scene,
1268                            struct bNodeTree *ntree,
1269                            struct RenderData *rd,
1270                            int rendering,
1271                            int do_previews,
1272                            const struct ColorManagedViewSettings *view_settings,
1273                            const struct ColorManagedDisplaySettings *display_settings,
1274                            const char *view_name);
1275 void ntreeCompositTagRender(struct Scene *scene);
1276 void ntreeCompositUpdateRLayers(struct bNodeTree *ntree);
1277 void ntreeCompositRegisterPass(struct bNodeTree *ntree,
1278                                struct Scene *scene,
1279                                struct ViewLayer *view_layer,
1280                                const char *name,
1281                                eNodeSocketDatatype type);
1282 void ntreeCompositClearTags(struct bNodeTree *ntree);
1283
1284 struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree,
1285                                                      struct bNode *node,
1286                                                      const char *name,
1287                                                      struct ImageFormatData *im_format);
1288 int ntreeCompositOutputFileRemoveActiveSocket(struct bNodeTree *ntree, struct bNode *node);
1289 void ntreeCompositOutputFileSetPath(struct bNode *node,
1290                                     struct bNodeSocket *sock,
1291                                     const char *name);
1292 void ntreeCompositOutputFileSetLayer(struct bNode *node,
1293                                      struct bNodeSocket *sock,
1294                                      const char *name);
1295 /* needed in do_versions */
1296 void ntreeCompositOutputFileUniquePath(struct ListBase *list,
1297                                        struct bNodeSocket *sock,
1298                                        const char defname[],
1299                                        char delim);
1300 void ntreeCompositOutputFileUniqueLayer(struct ListBase *list,
1301                                         struct bNodeSocket *sock,
1302                                         const char defname[],
1303                                         char delim);
1304
1305 void ntreeCompositColorBalanceSyncFromLGG(bNodeTree *ntree, bNode *node);
1306 void ntreeCompositColorBalanceSyncFromCDL(bNodeTree *ntree, bNode *node);
1307
1308 void ntreeCompositCryptomatteSyncFromAdd(bNode *node);
1309 void ntreeCompositCryptomatteSyncFromRemove(bNode *node);
1310 bNodeSocket *ntreeCompositCryptomatteAddSocket(bNodeTree *ntree, bNode *node);
1311 int ntreeCompositCryptomatteRemoveSocket(bNodeTree *ntree, bNode *node);
1312 void ntreeCompositCryptomatteLayerPrefix(const bNode *node, char *r_prefix, size_t prefix_len);
1313 /* Update the runtime layer names with the cryptomatte layer names of the references
1314  * render layer or image. */
1315 void ntreeCompositCryptomatteUpdateLayerNames(bNode *node);
1316 struct CryptomatteSession *ntreeCompositCryptomatteSession(bNode *node);
1317
1318 /** \} */
1319
1320 /* -------------------------------------------------------------------- */
1321 /** \name Texture Nodes
1322  * \{ */
1323
1324 struct TexResult;
1325
1326 #define TEX_NODE_OUTPUT 401
1327 #define TEX_NODE_CHECKER 402
1328 #define TEX_NODE_TEXTURE 403
1329 #define TEX_NODE_BRICKS 404
1330 #define TEX_NODE_MATH 405
1331 #define TEX_NODE_MIX_RGB 406
1332 #define TEX_NODE_RGBTOBW 407
1333 #define TEX_NODE_VALTORGB 408
1334 #define TEX_NODE_IMAGE 409
1335 #define TEX_NODE_CURVE_RGB 410
1336 #define TEX_NODE_INVERT 411
1337 #define TEX_NODE_HUE_SAT 412
1338 #define TEX_NODE_CURVE_TIME 413
1339 #define TEX_NODE_ROTATE 414
1340 #define TEX_NODE_VIEWER 415
1341 #define TEX_NODE_TRANSLATE 416
1342 #define TEX_NODE_COORD 417
1343 #define TEX_NODE_DISTANCE 418
1344 #define TEX_NODE_COMPOSE 419
1345 #define TEX_NODE_DECOMPOSE 420
1346 #define TEX_NODE_VALTONOR 421
1347 #define TEX_NODE_SCALE 422
1348 #define TEX_NODE_AT 423
1349
1350 /* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
1351 #define TEX_NODE_PROC 500
1352 #define TEX_NODE_PROC_MAX 600
1353
1354 /* API */
1355 void ntreeTexCheckCyclics(struct bNodeTree *ntree);
1356
1357 struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree);
1358 void ntreeTexEndExecTree(struct bNodeTreeExec *exec);
1359 int ntreeTexExecTree(struct bNodeTree *ntree,
1360                      struct TexResult *target,
1361                      const float co[3],
1362                      float dxt[3],
1363                      float dyt[3],
1364                      int osatex,
1365                      const short thread,
1366                      const struct Tex *tex,
1367                      short which_output,
1368                      int cfra,
1369                      int preview,
1370                      struct MTex *mtex);
1371 /** \} */
1372
1373 /* -------------------------------------------------------------------- */
1374 /** \name Geometry Nodes
1375  * \{ */
1376
1377 #define GEO_NODE_TRIANGULATE 1000
1378 #define GEO_NODE_EDGE_SPLIT 1001
1379 #define GEO_NODE_TRANSFORM 1002
1380 #define GEO_NODE_BOOLEAN 1003
1381 #define GEO_NODE_POINT_DISTRIBUTE 1004
1382 #define GEO_NODE_POINT_INSTANCE 1005
1383 #define GEO_NODE_SUBDIVISION_SURFACE 1006
1384 #define GEO_NODE_OBJECT_INFO 1007
1385 #define GEO_NODE_ATTRIBUTE_RANDOMIZE 1008
1386 #define GEO_NODE_ATTRIBUTE_MATH 1009
1387 #define GEO_NODE_JOIN_GEOMETRY 1010
1388 #define GEO_NODE_ATTRIBUTE_FILL 1011
1389 #define GEO_NODE_ATTRIBUTE_MIX 1012
1390 #define GEO_NODE_ATTRIBUTE_COLOR_RAMP 1013
1391 #define GEO_NODE_POINT_SEPARATE 1014
1392 #define GEO_NODE_ATTRIBUTE_COMPARE 1015
1393 #define GEO_NODE_POINT_ROTATE 1016
1394 #define GEO_NODE_ATTRIBUTE_VECTOR_MATH 1017
1395 #define GEO_NODE_ALIGN_ROTATION_TO_VECTOR 1018
1396 #define GEO_NODE_POINT_TRANSLATE 1019
1397 #define GEO_NODE_POINT_SCALE 1020
1398 #define GEO_NODE_ATTRIBUTE_SAMPLE_TEXTURE 1021
1399 #define GEO_NODE_POINTS_TO_VOLUME 1022
1400 #define GEO_NODE_COLLECTION_INFO 1023
1401 #define GEO_NODE_IS_VIEWPORT 1024
1402 #define GEO_NODE_ATTRIBUTE_PROXIMITY 1025
1403 #define GEO_NODE_VOLUME_TO_MESH 1026
1404 #define GEO_NODE_ATTRIBUTE_COMBINE_XYZ 1027
1405 #define GEO_NODE_ATTRIBUTE_SEPARATE_XYZ 1028
1406 #define GEO_NODE_SUBDIVIDE 1029
1407 #define GEO_NODE_ATTRIBUTE_REMOVE 1030
1408 #define GEO_NODE_ATTRIBUTE_CONVERT 1031
1409 #define GEO_NODE_MESH_PRIMITIVE_CUBE 1032
1410 #define GEO_NODE_MESH_PRIMITIVE_CIRCLE 1033
1411 #define GEO_NODE_MESH_PRIMITIVE_UV_SPHERE 1034
1412 #define GEO_NODE_MESH_PRIMITIVE_CYLINDER 1035
1413 #define GEO_NODE_MESH_PRIMITIVE_ICO_SPHERE 1036
1414 #define GEO_NODE_MESH_PRIMITIVE_CONE 1037
1415 #define GEO_NODE_MESH_PRIMITIVE_LINE 1038
1416 #define GEO_NODE_MESH_PRIMITIVE_GRID 1039
1417 #define GEO_NODE_ATTRIBUTE_MAP_RANGE 1040
1418 #define GEO_NODE_ATTRIBUTE_CLAMP 1041
1419 #define GEO_NODE_BOUNDING_BOX 1042
1420 #define GEO_NODE_SWITCH 1043
1421 #define GEO_NODE_ATTRIBUTE_TRANSFER 1044
1422 #define GEO_NODE_CURVE_TO_MESH 1045
1423 #define GEO_NODE_ATTRIBUTE_CURVE_MAP 1046
1424 #define GEO_NODE_CURVE_RESAMPLE 1047
1425 #define GEO_NODE_ATTRIBUTE_VECTOR_ROTATE 1048
1426 #define GEO_NODE_MATERIAL_ASSIGN 1049
1427
1428 /** \} */
1429
1430 /* -------------------------------------------------------------------- */
1431 /** \name Function Nodes
1432  * \{ */
1433
1434 #define FN_NODE_BOOLEAN_MATH 1200
1435 #define FN_NODE_FLOAT_COMPARE 1202
1436 #define FN_NODE_RANDOM_FLOAT 1206
1437 #define FN_NODE_INPUT_VECTOR 1207
1438 #define FN_NODE_INPUT_STRING 1208
1439
1440 /** \} */
1441
1442 void BKE_node_system_init(void);
1443 void BKE_node_system_exit(void);
1444
1445 /* -------------------------------------------------------------------- */
1446 /* evaluation support, */
1447
1448 struct Depsgraph;
1449
1450 void BKE_nodetree_shading_params_eval(struct Depsgraph *depsgraph,
1451                                       struct bNodeTree *ntree_dst,
1452                                       const struct bNodeTree *ntree_src);
1453
1454 extern struct bNodeType NodeTypeUndefined;
1455 extern struct bNodeSocketType NodeSocketTypeUndefined;
1456
1457 #ifdef __cplusplus
1458 }
1459 #endif