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