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