2 * ***** BEGIN GPL LICENSE BLOCK *****
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.
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.
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.
18 * The Original Code is Copyright (C) 2005 Blender Foundation.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): Bob Holcomb.
25 * ***** END GPL LICENSE BLOCK *****
28 #ifndef __BKE_NODE_H__
29 #define __BKE_NODE_H__
35 #include "BLI_utildefines.h"
36 #include "BLI_ghash.h"
38 #include "DNA_listBase.h"
40 /* for FOREACH_NODETREE */
41 #include "DNA_lamp_types.h"
42 #include "DNA_material_types.h"
43 #include "DNA_node_types.h"
44 #include "DNA_scene_types.h"
45 #include "DNA_texture_types.h"
46 #include "DNA_world_types.h"
47 #include "DNA_linestyle_types.h"
49 #include "RNA_types.h"
51 /* not very important, but the stack solver likes to know a maximum */
52 #define MAX_SOCKET 512
62 struct bNodeExecContext;
68 struct ImageFormatData;
79 struct ColorManagedViewSettings;
80 struct ColorManagedDisplaySettings;
81 struct bNodeInstanceHash;
83 /* -------------------------------------------------------------------- */
84 /** \name Node Type Definitions
87 /** Compact definition of a node socket.
88 * Can be used to quickly define a list of static sockets for a node,
89 * which are added to each new node of that type.
91 * \deprecated This struct is used by C nodes to define templates as simple
92 * static struct lists. These are converted to the new template collections
93 * in RNA types automatically.
95 typedef struct bNodeSocketTemplate {
97 char name[64]; /* MAX_NAME */
98 float val1, val2, val3, val4; /* default alloc value for inputs */
100 int subtype; /* would use PropertySubType but this is a bad level include to use RNA */
103 /* after this line is used internal only */
104 struct bNodeSocket *sock; /* used to hold verified socket */
105 char identifier[64]; /* generated from name */
106 } bNodeSocketTemplate;
108 /** Defines a socket type.
109 * Defines the appearance and behavior of a socket in the UI.
111 typedef struct bNodeSocketType {
112 char idname[64]; /* identifier name */
114 void (*draw)(struct bContext *C, struct uiLayout *layout, struct PointerRNA *ptr, struct PointerRNA *node_ptr, const char *text);
115 void (*draw_color)(struct bContext *C, struct PointerRNA *ptr, struct PointerRNA *node_ptr, float *r_color);
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, struct bNodeSocket *stemp, struct StructRNA *data_srna);
120 void (*interface_init_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock, const char *data_path);
121 void (*interface_verify_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);
124 /* RNA integration */
125 ExtensionRNA ext_socket;
126 ExtensionRNA ext_interface;
128 /* for standard socket types in C */
132 typedef void *(*NodeInitExecFunction)(struct bNodeExecContext *context, struct bNode *node, bNodeInstanceKey key);
133 typedef void (*NodeFreeExecFunction)(void *nodedata);
134 typedef void (*NodeExecFunction)(void *data, int thread, struct bNode *, struct bNodeExecData *execdata, struct bNodeStack **in, struct bNodeStack **out);
135 typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat, struct bNode *node, struct bNodeExecData *execdata, struct GPUNodeStack *in, struct GPUNodeStack *out);
137 /** Defines a node type.
138 * Initial attributes and constants for a node as well as callback functions
139 * implementing the node behavior.
141 typedef struct bNodeType {
143 short needs_free; /* set for allocated types that need to be freed */
145 char idname[64]; /* identifier name */
148 char ui_name[64]; /* MAX_NAME */
149 char ui_description[256];
152 float width, minwidth, maxwidth;
153 float height, minheight, maxheight;
154 short nclass, flag, compatibility;
156 /* templates for static sockets */
157 bNodeSocketTemplate *inputs, *outputs;
159 char storagename[64]; /* struct name for DNA */
161 /* Main draw function for the node */
162 void (*draw_nodetype)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode,
163 struct bNodeTree *ntree, struct bNode *node, bNodeInstanceKey key);
164 /* Updates the node geometry attributes according to internal state before actual drawing */
165 void (*draw_nodetype_prepare)(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
167 /* Draw the option buttons on the node */
168 void (*draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
169 /* Additional parameters in the side panel */
170 void (*draw_buttons_ex)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
172 /* Additional drawing on backdrop */
173 void (*draw_backdrop)(struct SpaceNode *snode, struct ImBuf *backdrop, struct bNode *node, int x, int y);
176 * Optional custom label function for the node header.
177 * \note Used as a fallback when #bNode.label isn't set.
179 void (*labelfunc)(struct bNodeTree *ntree, struct bNode *node, char *label, int maxlen);
180 /// Optional custom resize handle polling.
181 int (*resize_area_func)(struct bNode *node, int x, int y);
182 /// Optional selection area polling.
183 int (*select_area_func)(struct bNode *node, int x, int y);
184 /// Optional tweak area polling (for grabbing).
185 int (*tweak_area_func)(struct bNode *node, int x, int y);
187 /// Called when the node is updated in the editor.
188 void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
189 /// Check and update if internal ID data has changed.
190 void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
192 /// Initialize a new node instance of this type after creation.
193 void (*initfunc)(struct bNodeTree *ntree, struct bNode *node);
194 /// Free the node instance.
195 void (*freefunc)(struct bNode *node);
196 /// Make a copy of the node instance.
197 void (*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, struct bNode *src_node);
199 /* Registerable API callback versions, called in addition to C callbacks */
200 void (*initfunc_api)(const struct bContext *C, struct PointerRNA *ptr);
201 void (*freefunc_api)(struct PointerRNA *ptr);
202 void (*copyfunc_api)(struct PointerRNA *ptr, struct bNode *src_node);
204 /* can this node type be added to a node tree */
205 int (*poll)(struct bNodeType *ntype, struct bNodeTree *nodetree);
206 /* can this node be added to a node tree */
207 int (*poll_instance)(struct bNode *node, struct bNodeTree *nodetree);
209 /* optional handling of link insertion */
210 void (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
211 /* Update the internal links list, for muting and disconnect operators. */
212 void (*update_internal_links)(struct bNodeTree *, struct bNode *node);
214 /* **** execution callbacks **** */
215 NodeInitExecFunction initexecfunc;
216 NodeFreeExecFunction freeexecfunc;
217 NodeExecFunction execfunc;
219 NodeGPUExecFunction gpufunc;
221 /* RNA integration */
225 /* nodetype->nclass, for add-menu and themes */
226 #define NODE_CLASS_INPUT 0
227 #define NODE_CLASS_OUTPUT 1
228 #define NODE_CLASS_OP_COLOR 3
229 #define NODE_CLASS_OP_VECTOR 4
230 #define NODE_CLASS_OP_FILTER 5
231 #define NODE_CLASS_GROUP 6
232 // #define NODE_CLASS_FILE 7
233 #define NODE_CLASS_CONVERTOR 8
234 #define NODE_CLASS_MATTE 9
235 #define NODE_CLASS_DISTORT 10
236 // #define NODE_CLASS_OP_DYNAMIC 11 /* deprecated */
237 #define NODE_CLASS_PATTERN 12
238 #define NODE_CLASS_TEXTURE 13
239 // #define NODE_CLASS_EXECUTION 14
240 // #define NODE_CLASS_GETDATA 15
241 // #define NODE_CLASS_SETDATA 16
242 // #define NODE_CLASS_MATH 17
243 // #define NODE_CLASS_MATH_VECTOR 18
244 // #define NODE_CLASS_MATH_ROTATION 19
245 // #define NODE_CLASS_PARTICLES 25
246 // #define NODE_CLASS_TRANSFORM 30
247 // #define NODE_CLASS_COMBINE 31
248 #define NODE_CLASS_SCRIPT 32
249 #define NODE_CLASS_INTERFACE 33
250 #define NODE_CLASS_SHADER 40
251 #define NODE_CLASS_LAYOUT 100
253 /* nodetype->compatibility */
254 #define NODE_OLD_SHADING 1
255 #define NODE_NEW_SHADING 2
257 /* node resize directions */
258 #define NODE_RESIZE_TOP 1
259 #define NODE_RESIZE_BOTTOM 2
260 #define NODE_RESIZE_RIGHT 4
261 #define NODE_RESIZE_LEFT 8
263 typedef enum eNodeSizePreset {
270 struct bNodeTreeExec;
272 typedef void (*bNodeClassCallback)(void *calldata, int nclass, const char *name);
273 typedef struct bNodeTreeType {
274 int type; /* type identifier */
275 char idname[64]; /* identifier name */
278 char ui_description[256];
282 void (*free_cache)(struct bNodeTree *ntree);
283 void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node);
284 void (*foreach_nodeclass)(struct Scene *scene, void *calldata, bNodeClassCallback func); /* iteration over all node classes */
285 /* Check visibility in the node editor */
286 int (*poll)(const struct bContext *C, struct bNodeTreeType *ntreetype);
287 /* Select a node tree from the context */
288 void (*get_from_context)(const struct bContext *C, struct bNodeTreeType *ntreetype,
289 struct bNodeTree **r_ntree, struct ID **r_id, struct ID **r_from);
291 /* calls allowing threaded composite */
292 void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
293 void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
294 void (*local_merge)(struct bNodeTree *localtree, struct bNodeTree *ntree);
296 /* Tree update. Overrides nodetype->updatetreefunc! */
297 void (*update)(struct bNodeTree *ntree);
299 int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
301 void (*node_add_init)(struct bNodeTree *ntree, struct bNode *bnode);
303 /* RNA integration */
309 /* -------------------------------------------------------------------- */
310 /** \name Generic API, Trees
313 struct bNodeTreeType *ntreeTypeFind(const char *idname);
314 void ntreeTypeAdd(struct bNodeTreeType *nt);
315 void ntreeTypeFreeLink(const struct bNodeTreeType *nt);
316 bool ntreeIsRegistered(struct bNodeTree *ntree);
317 struct GHashIterator *ntreeTypeGetIterator(void);
319 /* helper macros for iterating over tree types */
320 #define NODE_TREE_TYPES_BEGIN(ntype) \
322 GHashIterator *__node_tree_type_iter__ = ntreeTypeGetIterator(); \
323 for (; !BLI_ghashIterator_done(__node_tree_type_iter__); BLI_ghashIterator_step(__node_tree_type_iter__)) { \
324 bNodeTreeType *ntype = BLI_ghashIterator_getValue(__node_tree_type_iter__);
326 #define NODE_TREE_TYPES_END \
328 BLI_ghashIterator_free(__node_tree_type_iter__); \
331 void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree);
333 void ntreeInitDefault(struct bNodeTree *ntree);
334 struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname);
336 /* copy/free funcs, need to manage ID users */
337 void ntreeFreeTree(struct bNodeTree *ntree);
338 void BKE_node_tree_copy_data(struct Main *bmain, struct bNodeTree *ntree_dst, const struct bNodeTree *ntree_src, const int flag);
339 struct bNodeTree *ntreeCopyTree_ex(const struct bNodeTree *ntree, struct Main *bmain, const bool do_id_user);
340 struct bNodeTree *ntreeCopyTree(struct Main *bmain, const struct bNodeTree *ntree);
341 /* node->id user count */
342 void ntreeUserIncrefID(struct bNodeTree *ntree);
343 void ntreeUserDecrefID(struct bNodeTree *ntree);
346 struct bNodeTree *ntreeFromID(struct ID *id);
348 void ntreeMakeLocal(struct Main *bmain, struct bNodeTree *ntree, bool id_in_mainlist, const bool lib_local);
349 struct bNode *ntreeFindType(const struct bNodeTree *ntree, int type);
350 bool ntreeHasType(const struct bNodeTree *ntree, int type);
351 bool ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
352 void ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree);
353 /* XXX Currently each tree update call does call to ntreeVerifyNodes too.
354 * Some day this should be replaced by a decent depsgraph automatism!
356 void ntreeVerifyNodes(struct Main *main, struct ID *id);
358 void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
360 /* XXX old trees handle output flags automatically based on special output node types and last active selection.
361 * new tree types have a per-output socket flag to indicate the final output to use explicitly.
363 void ntreeSetOutput(struct bNodeTree *ntree);
365 void ntreeFreeCache(struct bNodeTree *ntree);
367 int ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
368 int ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
369 void ntreeNodeFlagSet(const bNodeTree *ntree, const int flag, const bool enable);
370 struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
371 void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
372 void ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
377 /* -------------------------------------------------------------------- */
378 /** \name Node Tree Interface
380 struct bNodeSocket *ntreeFindSocketInterface(struct bNodeTree *ntree, int in_out, const char *identifier);
381 struct bNodeSocket *ntreeAddSocketInterface(struct bNodeTree *ntree, int in_out, const char *idname, const char *name);
382 struct bNodeSocket *ntreeInsertSocketInterface(struct bNodeTree *ntree, int in_out, const char *idname,
383 struct bNodeSocket *next_sock, const char *name);
384 struct bNodeSocket *ntreeAddSocketInterfaceFromSocket(struct bNodeTree *ntree, struct bNode *from_node, struct bNodeSocket *from_sock);
385 struct bNodeSocket *ntreeInsertSocketInterfaceFromSocket(struct bNodeTree *ntree, struct bNodeSocket *next_sock,
386 struct bNode *from_node, struct bNodeSocket *from_sock);
387 void ntreeRemoveSocketInterface(struct bNodeTree *ntree, struct bNodeSocket *sock);
389 struct StructRNA *ntreeInterfaceTypeGet(struct bNodeTree *ntree, int create);
390 void ntreeInterfaceTypeFree(struct bNodeTree *ntree);
391 void ntreeInterfaceTypeUpdate(struct bNodeTree *ntree);
396 /* -------------------------------------------------------------------- */
397 /** \name Generic API, Nodes
400 struct bNodeType *nodeTypeFind(const char *idname);
401 void nodeRegisterType(struct bNodeType *ntype);
402 void nodeUnregisterType(struct bNodeType *ntype);
403 bool nodeIsRegistered(struct bNode *node);
404 struct GHashIterator *nodeTypeGetIterator(void);
406 /* helper macros for iterating over node types */
407 #define NODE_TYPES_BEGIN(ntype) \
409 GHashIterator *__node_type_iter__ = nodeTypeGetIterator(); \
410 for (; !BLI_ghashIterator_done(__node_type_iter__); BLI_ghashIterator_step(__node_type_iter__)) { \
411 bNodeType *ntype = BLI_ghashIterator_getValue(__node_type_iter__);
413 #define NODE_TYPES_END \
415 BLI_ghashIterator_free(__node_type_iter__); \
418 struct bNodeSocketType *nodeSocketTypeFind(const char *idname);
419 void nodeRegisterSocketType(struct bNodeSocketType *stype);
420 void nodeUnregisterSocketType(struct bNodeSocketType *stype);
421 bool nodeSocketIsRegistered(struct bNodeSocket *sock);
422 struct GHashIterator *nodeSocketTypeGetIterator(void);
423 const char *nodeStaticSocketType(int type, int subtype);
424 const char *nodeStaticSocketInterfaceType(int type, int subtype);
426 /* helper macros for iterating over node types */
427 #define NODE_SOCKET_TYPES_BEGIN(stype) \
429 GHashIterator *__node_socket_type_iter__ = nodeSocketTypeGetIterator(); \
430 for (; !BLI_ghashIterator_done(__node_socket_type_iter__); BLI_ghashIterator_step(__node_socket_type_iter__)) { \
431 bNodeSocketType *stype = BLI_ghashIterator_getValue(__node_socket_type_iter__);
433 #define NODE_SOCKET_TYPES_END \
435 BLI_ghashIterator_free(__node_socket_type_iter__); \
438 struct bNodeSocket *nodeFindSocket(struct bNode *node, int in_out, const char *identifier);
439 struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *idname,
440 const char *identifier, const char *name);
441 struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *idname,
442 struct bNodeSocket *next_sock, const char *identifier, const char *name);
443 struct bNodeSocket *nodeAddStaticSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, int type, int subtype,
444 const char *identifier, const char *name);
445 struct bNodeSocket *nodeInsertStaticSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, int type, int subtype,
446 struct bNodeSocket *next_sock, const char *identifier, const char *name);
447 void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
448 void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
449 void nodeModifySocketType(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock, int type, int subtype);
451 struct bNode *nodeAddNode(const struct bContext *C, struct bNodeTree *ntree, const char *idname);
452 struct bNode *nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type);
453 void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
454 void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
456 void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
457 struct bNode *BKE_node_copy_ex(struct bNodeTree *ntree, struct bNode *node_src, const int flag);
458 struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
460 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
461 void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
462 void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
463 bool nodeLinkIsHidden(struct bNodeLink *link);
464 void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
466 void nodeToView(struct bNode *node, float x, float y, float *rx, float *ry);
467 void nodeFromView(struct bNode *node, float x, float y, float *rx, float *ry);
468 bool nodeAttachNodeCheck(struct bNode *node, struct bNode *parent);
469 void nodeAttachNode(struct bNode *node, struct bNode *parent);
470 void nodeDetachNode(struct bNode *node);
472 struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
473 int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
474 struct bNode *nodeFindRootParent(bNode *node);
476 bool nodeIsChildOf(const bNode *parent, const bNode *child);
479 const bNodeTree *ntree, const bNode *node_start,
480 bool (*callback)(bNode *, bNode *, void *, const bool), void *userdata,
481 const bool reversed);
482 void nodeParentsIter(bNode *node, bool (*callback)(bNode *, void *), void *userdata);
484 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
485 int nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
487 void nodeSetSelected(struct bNode *node, bool select);
488 void nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
489 struct bNode *nodeGetActive(struct bNodeTree *ntree);
490 struct bNode *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
491 bool nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
492 void nodeClearActive(struct bNodeTree *ntree);
493 void nodeClearActiveID(struct bNodeTree *ntree, short idtype);
494 struct bNode *nodeGetActiveTexture(struct bNodeTree *ntree);
496 void nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
497 bool nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
498 void nodeUpdateInternalLinks(struct bNodeTree *ntree, struct bNode *node);
499 void nodeSynchronizeID(struct bNode *node, bool copy_to_id);
501 int nodeSocketIsHidden(struct bNodeSocket *sock);
502 void ntreeTagUsedSockets(struct bNodeTree *ntree);
505 void BKE_node_clipboard_init(struct bNodeTree *ntree);
506 void BKE_node_clipboard_clear(void);
507 bool BKE_node_clipboard_validate(void);
508 void BKE_node_clipboard_add_node(struct bNode *node);
509 void BKE_node_clipboard_add_link(struct bNodeLink *link);
510 const struct ListBase *BKE_node_clipboard_get_nodes(void);
511 const struct ListBase *BKE_node_clipboard_get_links(void);
512 int BKE_node_clipboard_get_type(void);
514 /* Node Instance Hash */
515 typedef struct bNodeInstanceHash {
516 GHash *ghash; /* XXX should be made a direct member, GHash allocation needs to support it */
519 typedef void (*bNodeInstanceValueFP)(void *value);
521 extern const bNodeInstanceKey NODE_INSTANCE_KEY_BASE;
522 extern const bNodeInstanceKey NODE_INSTANCE_KEY_NONE;
524 bNodeInstanceKey BKE_node_instance_key(bNodeInstanceKey parent_key, struct bNodeTree *ntree, struct bNode *node);
526 bNodeInstanceHash *BKE_node_instance_hash_new(const char *info);
527 void BKE_node_instance_hash_free(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
528 void BKE_node_instance_hash_insert(bNodeInstanceHash *hash, bNodeInstanceKey key, void *value);
529 void *BKE_node_instance_hash_lookup(bNodeInstanceHash *hash, bNodeInstanceKey key);
530 int BKE_node_instance_hash_remove(bNodeInstanceHash *hash, bNodeInstanceKey key, bNodeInstanceValueFP valfreefp);
531 void BKE_node_instance_hash_clear(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
532 void *BKE_node_instance_hash_pop(bNodeInstanceHash *hash, bNodeInstanceKey key);
533 int BKE_node_instance_hash_haskey(bNodeInstanceHash *hash, bNodeInstanceKey key);
534 int BKE_node_instance_hash_size(bNodeInstanceHash *hash);
536 void BKE_node_instance_hash_clear_tags(bNodeInstanceHash *hash);
537 void BKE_node_instance_hash_tag(bNodeInstanceHash *hash, void *value);
538 bool BKE_node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey key);
539 void BKE_node_instance_hash_remove_untagged(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp);
541 typedef GHashIterator bNodeInstanceHashIterator;
543 BLI_INLINE bNodeInstanceHashIterator *BKE_node_instance_hash_iterator_new(bNodeInstanceHash *hash) { return BLI_ghashIterator_new(hash->ghash); }
544 BLI_INLINE void BKE_node_instance_hash_iterator_init(bNodeInstanceHashIterator *iter, bNodeInstanceHash *hash) { BLI_ghashIterator_init(iter, hash->ghash); }
545 BLI_INLINE void BKE_node_instance_hash_iterator_free(bNodeInstanceHashIterator *iter) { BLI_ghashIterator_free(iter); }
546 BLI_INLINE bNodeInstanceKey BKE_node_instance_hash_iterator_get_key(bNodeInstanceHashIterator *iter) { return *(bNodeInstanceKey *)BLI_ghashIterator_getKey(iter); }
547 BLI_INLINE void *BKE_node_instance_hash_iterator_get_value(bNodeInstanceHashIterator *iter) { return BLI_ghashIterator_getValue(iter); }
548 BLI_INLINE void BKE_node_instance_hash_iterator_step(bNodeInstanceHashIterator *iter) { BLI_ghashIterator_step(iter); }
549 BLI_INLINE bool BKE_node_instance_hash_iterator_done(bNodeInstanceHashIterator *iter) { return BLI_ghashIterator_done(iter); }
551 #define NODE_INSTANCE_HASH_ITER(iter_, hash_) \
552 for (BKE_node_instance_hash_iterator_init(&iter_, hash_); \
553 BKE_node_instance_hash_iterator_done(&iter_) == false; \
554 BKE_node_instance_hash_iterator_step(&iter_))
559 int BKE_node_preview_used(struct bNode *node);
560 bNodePreview *BKE_node_preview_verify(struct bNodeInstanceHash *previews, bNodeInstanceKey key, int xsize, int ysize, bool create);
561 bNodePreview *BKE_node_preview_copy(struct bNodePreview *preview);
562 void BKE_node_preview_free(struct bNodePreview *preview);
563 void BKE_node_preview_init_tree(struct bNodeTree *ntree, int xsize, int ysize, int create_previews);
564 void BKE_node_preview_free_tree(struct bNodeTree *ntree);
565 void BKE_node_preview_remove_unused(struct bNodeTree *ntree);
566 void BKE_node_preview_clear(struct bNodePreview *preview);
567 void BKE_node_preview_clear_tree(struct bNodeTree *ntree);
569 void BKE_node_preview_sync_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree);
570 void BKE_node_preview_merge_tree(struct bNodeTree *to_ntree, struct bNodeTree *from_ntree, bool remove_old);
572 void BKE_node_preview_set_pixel(struct bNodePreview *preview, const float col[4], int x, int y, bool do_manage);
577 /* -------------------------------------------------------------------- */
578 /** \name Node Type Access
581 void nodeLabel(struct bNodeTree *ntree, struct bNode *node, char *label, int maxlen);
583 int nodeGroupPoll(struct bNodeTree *nodetree, struct bNodeTree *grouptree);
585 /* Init a new node type struct with default values and callbacks */
586 void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
587 void node_type_base_custom(struct bNodeType *ntype, const char *idname, const char *name, short nclass, short flag);
588 void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
589 void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
590 void node_type_size_preset(struct bNodeType *ntype, eNodeSizePreset size);
591 void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node));
592 void node_type_storage(struct bNodeType *ntype,
593 const char *storagename,
594 void (*freefunc)(struct bNode *node),
595 void (*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, struct bNode *src_node));
596 void node_type_label(struct bNodeType *ntype, void (*labelfunc)(struct bNodeTree *ntree, struct bNode *, char *label, int maxlen));
597 void node_type_update(struct bNodeType *ntype,
598 void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
599 void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id));
601 void node_type_exec(struct bNodeType *ntype, NodeInitExecFunction initexecfunc, NodeFreeExecFunction freeexecfunc, NodeExecFunction execfunc);
602 void node_type_gpu(struct bNodeType *ntype, NodeGPUExecFunction gpufunc);
603 void node_type_internal_links(struct bNodeType *ntype, void (*update_internal_links)(struct bNodeTree *, struct bNode *));
604 void node_type_compatibility(struct bNodeType *ntype, short compatibility);
607 /* -------------------------------------------------------------------- */
608 /** \name Node Generic Functions
611 bool BKE_node_is_connected_to_output(struct bNodeTree *ntree, struct bNode *node);
613 /* ************** COMMON NODES *************** */
615 #define NODE_UNDEFINED -2 /* node type is not registered */
616 #define NODE_CUSTOM -1 /* for dynamically registered custom types */
618 // #define NODE_FORLOOP 3 /* deprecated */
619 // #define NODE_WHILELOOP 4 /* deprecated */
621 #define NODE_REROUTE 6
622 #define NODE_GROUP_INPUT 7
623 #define NODE_GROUP_OUTPUT 8
625 void BKE_node_tree_unlink_id(ID *id, struct bNodeTree *ntree);
629 /* -------------------------------------------------------------------- */
630 /** \name Node Tree Iterator
632 * Utility macro for visiting every node tree in the library data, including local bNodeTree blocks in other IDs.
633 * This avoids the need for callback functions and allows executing code in a single inner code block.
637 * nodetree: The actual bNodeTree data block.
638 * Check nodetree->idname or nodetree->typeinfo to use only specific types.
640 * id: The owner of the bNodeTree data block.
641 * Same as nodetree if it's a linkable node tree from the library.
646 * FOREACH_NODETREE(bmain, nodetree, id) {
647 * if (id == nodetree)
648 * printf("This is a linkable node tree");
649 * } FOREACH_NODETREE_END
651 * FOREACH_NODETREE(bmain, nodetree, id) {
652 * if (nodetree->idname == "ShaderNodeTree")
653 * printf("This is a shader node tree);
654 * if (GS(id) == ID_MA)
655 * printf(" and it's owned by a material");
656 * } FOREACH_NODETREE_END
662 /* should be an opaque type, only for internal use by BKE_node_tree_iter_*** */
663 struct NodeTreeIterStore {
670 FreestyleLineStyle *linestyle;
673 void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain);
674 bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
675 struct bNodeTree **r_nodetree, struct ID **r_id);
677 #define FOREACH_NODETREE(bmain, _nodetree, _id) \
679 struct NodeTreeIterStore _nstore; \
680 bNodeTree *_nodetree; \
682 /* avoid compiler warning about unused variables */ \
683 BKE_node_tree_iter_init(&_nstore, bmain); \
684 while (BKE_node_tree_iter_step(&_nstore, &_nodetree, &_id) == true) { \
687 #define FOREACH_NODETREE_END \
693 /* -------------------------------------------------------------------- */
694 /** \name Shader Nodes
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 */
703 #define SH_NODE_OUTPUT 1
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
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_ABSORPTION 161
760 #define SH_NODE_VOLUME_SCATTER 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 #define SH_NODE_SUBSURFACE_SCATTERING 177
776 #define SH_NODE_WIREFRAME 178
777 #define SH_NODE_BSDF_TOON 179
778 #define SH_NODE_WAVELENGTH 180
779 #define SH_NODE_BLACKBODY 181
780 #define SH_NODE_VECT_TRANSFORM 182
781 #define SH_NODE_SEPHSV 183
782 #define SH_NODE_COMBHSV 184
783 #define SH_NODE_BSDF_HAIR 185
784 #define SH_NODE_LAMP 186
785 #define SH_NODE_UVMAP 187
786 #define SH_NODE_SEPXYZ 188
787 #define SH_NODE_COMBXYZ 189
788 #define SH_NODE_OUTPUT_LINESTYLE 190
789 #define SH_NODE_UVALONGSTROKE 191
790 #define SH_NODE_TEX_POINTDENSITY 192
791 #define SH_NODE_BSDF_PRINCIPLED 193
792 #define SH_NODE_BEVEL 197
794 /* custom defines options for Material node */
795 #define SH_NODE_MAT_DIFF 1
796 #define SH_NODE_MAT_SPEC 2
797 #define SH_NODE_MAT_NEG 4
801 struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree);
802 void ntreeShaderEndExecTree(struct bNodeTreeExec *exec);
803 bool ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
804 void ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
806 /* switch material render loop */
807 extern void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
808 void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *));
810 void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat, short compatibility);
814 /* -------------------------------------------------------------------- */
815 /** \name Composite Nodes
818 /* output socket defines */
819 #define RRES_OUT_IMAGE 0
820 #define RRES_OUT_ALPHA 1
822 #define RRES_OUT_NORMAL 3
823 #define RRES_OUT_UV 4
824 #define RRES_OUT_VEC 5
825 #define RRES_OUT_RGBA 6
826 #define RRES_OUT_DIFF 7
827 #define RRES_OUT_SPEC 8
828 #define RRES_OUT_SHADOW 9
829 #define RRES_OUT_AO 10
830 #define RRES_OUT_REFLECT 11
831 #define RRES_OUT_REFRACT 12
832 #define RRES_OUT_INDIRECT 13
833 #define RRES_OUT_INDEXOB 14
834 #define RRES_OUT_INDEXMA 15
835 #define RRES_OUT_MIST 16
836 #define RRES_OUT_EMIT 17
837 #define RRES_OUT_ENV 18
838 #define RRES_OUT_DIFF_DIRECT 19
839 #define RRES_OUT_DIFF_INDIRECT 20
840 #define RRES_OUT_DIFF_COLOR 21
841 #define RRES_OUT_GLOSSY_DIRECT 22
842 #define RRES_OUT_GLOSSY_INDIRECT 23
843 #define RRES_OUT_GLOSSY_COLOR 24
844 #define RRES_OUT_TRANSM_DIRECT 25
845 #define RRES_OUT_TRANSM_INDIRECT 26
846 #define RRES_OUT_TRANSM_COLOR 27
847 #define RRES_OUT_SUBSURFACE_DIRECT 28
848 #define RRES_OUT_SUBSURFACE_INDIRECT 29
849 #define RRES_OUT_SUBSURFACE_COLOR 30
850 #define RRES_OUT_DEBUG 31
852 /* note: types are needed to restore callbacks, don't change values */
853 #define CMP_NODE_VIEWER 201
854 #define CMP_NODE_RGB 202
855 #define CMP_NODE_VALUE 203
856 #define CMP_NODE_MIX_RGB 204
857 #define CMP_NODE_VALTORGB 205
858 #define CMP_NODE_RGBTOBW 206
859 #define CMP_NODE_NORMAL 207
860 #define CMP_NODE_CURVE_VEC 208
861 #define CMP_NODE_CURVE_RGB 209
862 #define CMP_NODE_ALPHAOVER 210
863 #define CMP_NODE_BLUR 211
864 #define CMP_NODE_FILTER 212
865 #define CMP_NODE_MAP_VALUE 213
866 #define CMP_NODE_TIME 214
867 #define CMP_NODE_VECBLUR 215
868 #define CMP_NODE_SEPRGBA 216
869 #define CMP_NODE_SEPHSVA 217
870 #define CMP_NODE_SETALPHA 218
871 #define CMP_NODE_HUE_SAT 219
872 #define CMP_NODE_IMAGE 220
873 #define CMP_NODE_R_LAYERS 221
874 #define CMP_NODE_COMPOSITE 222
875 #define CMP_NODE_OUTPUT_FILE 223
876 #define CMP_NODE_TEXTURE 224
877 #define CMP_NODE_TRANSLATE 225
878 #define CMP_NODE_ZCOMBINE 226
879 #define CMP_NODE_COMBRGBA 227
880 #define CMP_NODE_DILATEERODE 228
881 #define CMP_NODE_ROTATE 229
882 #define CMP_NODE_SCALE 230
883 #define CMP_NODE_SEPYCCA 231
884 #define CMP_NODE_COMBYCCA 232
885 #define CMP_NODE_SEPYUVA 233
886 #define CMP_NODE_COMBYUVA 234
887 #define CMP_NODE_DIFF_MATTE 235
888 #define CMP_NODE_COLOR_SPILL 236
889 #define CMP_NODE_CHROMA_MATTE 237
890 #define CMP_NODE_CHANNEL_MATTE 238
891 #define CMP_NODE_FLIP 239
892 #define CMP_NODE_SPLITVIEWER 240
893 // #define CMP_NODE_INDEX_MASK 241
894 #define CMP_NODE_MAP_UV 242
895 #define CMP_NODE_ID_MASK 243
896 #define CMP_NODE_DEFOCUS 244
897 #define CMP_NODE_DISPLACE 245
898 #define CMP_NODE_COMBHSVA 246
899 #define CMP_NODE_MATH 247
900 #define CMP_NODE_LUMA_MATTE 248
901 #define CMP_NODE_BRIGHTCONTRAST 249
902 #define CMP_NODE_GAMMA 250
903 #define CMP_NODE_INVERT 251
904 #define CMP_NODE_NORMALIZE 252
905 #define CMP_NODE_CROP 253
906 #define CMP_NODE_DBLUR 254
907 #define CMP_NODE_BILATERALBLUR 255
908 #define CMP_NODE_PREMULKEY 256
909 #define CMP_NODE_DIST_MATTE 257
910 #define CMP_NODE_VIEW_LEVELS 258
911 #define CMP_NODE_COLOR_MATTE 259
912 #define CMP_NODE_COLORBALANCE 260
913 #define CMP_NODE_HUECORRECT 261
914 #define CMP_NODE_MOVIECLIP 262
915 #define CMP_NODE_STABILIZE2D 263
916 #define CMP_NODE_TRANSFORM 264
917 #define CMP_NODE_MOVIEDISTORTION 265
918 #define CMP_NODE_DOUBLEEDGEMASK 266
919 #define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED 267 /* DEPRECATED multi file node has been merged into regular CMP_NODE_OUTPUT_FILE */
920 #define CMP_NODE_MASK 268
921 #define CMP_NODE_KEYINGSCREEN 269
922 #define CMP_NODE_KEYING 270
923 #define CMP_NODE_TRACKPOS 271
924 #define CMP_NODE_INPAINT 272
925 #define CMP_NODE_DESPECKLE 273
927 #define CMP_NODE_GLARE 301
928 #define CMP_NODE_TONEMAP 302
929 #define CMP_NODE_LENSDIST 303
930 #define CMP_NODE_SUNBEAMS 304
932 #define CMP_NODE_COLORCORRECTION 312
933 #define CMP_NODE_MASK_BOX 313
934 #define CMP_NODE_MASK_ELLIPSE 314
935 #define CMP_NODE_BOKEHIMAGE 315
936 #define CMP_NODE_BOKEHBLUR 316
937 #define CMP_NODE_SWITCH 317
938 #define CMP_NODE_PIXELATE 318
940 #define CMP_NODE_MAP_RANGE 319
941 #define CMP_NODE_PLANETRACKDEFORM 320
942 #define CMP_NODE_CORNERPIN 321
943 #define CMP_NODE_SWITCH_VIEW 322
945 /* channel toggles */
946 #define CMP_CHAN_RGB 1
950 #define CMP_FILT_SOFT 0
951 #define CMP_FILT_SHARP 1
952 #define CMP_FILT_LAPLACE 2
953 #define CMP_FILT_SOBEL 3
954 #define CMP_FILT_PREWITT 4
955 #define CMP_FILT_KIRSCH 5
956 #define CMP_FILT_SHADOW 6
958 /* scale node type, in custom1 */
959 #define CMP_SCALE_RELATIVE 0
960 #define CMP_SCALE_ABSOLUTE 1
961 #define CMP_SCALE_SCENEPERCENT 2
962 #define CMP_SCALE_RENDERPERCENT 3
964 #define CMP_SCALE_RENDERSIZE_FRAME_ASPECT (1 << 0)
965 #define CMP_SCALE_RENDERSIZE_FRAME_CROP (1 << 1)
967 /* track position node, in custom1 */
968 #define CMP_TRACKPOS_ABSOLUTE 0
969 #define CMP_TRACKPOS_RELATIVE_START 1
970 #define CMP_TRACKPOS_RELATIVE_FRAME 2
971 #define CMP_TRACKPOS_ABSOLUTE_FRAME 3
974 void ntreeCompositExecTree(struct Scene *scene, struct bNodeTree *ntree, struct RenderData *rd, int rendering, int do_previews,
975 const struct ColorManagedViewSettings *view_settings, const struct ColorManagedDisplaySettings *display_settings,
976 const char *view_name);
977 void ntreeCompositTagRender(struct Scene *sce);
978 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
979 void ntreeCompositTagGenerators(struct bNodeTree *ntree);
980 void ntreeCompositUpdateRLayers(struct bNodeTree *ntree);
981 void ntreeCompositRegisterPass(struct bNodeTree *ntree, struct Scene *scene, struct SceneRenderLayer *srl, const char *name, int type);
982 void ntreeCompositClearTags(struct bNodeTree *ntree);
984 struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree, struct bNode *node,
985 const char *name, struct ImageFormatData *im_format);
986 int ntreeCompositOutputFileRemoveActiveSocket(struct bNodeTree *ntree, struct bNode *node);
987 void ntreeCompositOutputFileSetPath(struct bNode *node, struct bNodeSocket *sock, const char *name);
988 void ntreeCompositOutputFileSetLayer(struct bNode *node, struct bNodeSocket *sock, const char *name);
989 /* needed in do_versions */
990 void ntreeCompositOutputFileUniquePath(struct ListBase *list, struct bNodeSocket *sock, const char defname[], char delim);
991 void ntreeCompositOutputFileUniqueLayer(struct ListBase *list, struct bNodeSocket *sock, const char defname[], char delim);
993 void ntreeCompositColorBalanceSyncFromLGG(bNodeTree *ntree, bNode *node);
994 void ntreeCompositColorBalanceSyncFromCDL(bNodeTree *ntree, bNode *node);
998 /* -------------------------------------------------------------------- */
999 /** \name Texture Nodes
1004 #define TEX_NODE_OUTPUT 401
1005 #define TEX_NODE_CHECKER 402
1006 #define TEX_NODE_TEXTURE 403
1007 #define TEX_NODE_BRICKS 404
1008 #define TEX_NODE_MATH 405
1009 #define TEX_NODE_MIX_RGB 406
1010 #define TEX_NODE_RGBTOBW 407
1011 #define TEX_NODE_VALTORGB 408
1012 #define TEX_NODE_IMAGE 409
1013 #define TEX_NODE_CURVE_RGB 410
1014 #define TEX_NODE_INVERT 411
1015 #define TEX_NODE_HUE_SAT 412
1016 #define TEX_NODE_CURVE_TIME 413
1017 #define TEX_NODE_ROTATE 414
1018 #define TEX_NODE_VIEWER 415
1019 #define TEX_NODE_TRANSLATE 416
1020 #define TEX_NODE_COORD 417
1021 #define TEX_NODE_DISTANCE 418
1022 #define TEX_NODE_COMPOSE 419
1023 #define TEX_NODE_DECOMPOSE 420
1024 #define TEX_NODE_VALTONOR 421
1025 #define TEX_NODE_SCALE 422
1026 #define TEX_NODE_AT 423
1028 /* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
1029 #define TEX_NODE_PROC 500
1030 #define TEX_NODE_PROC_MAX 600
1033 int ntreeTexTagAnimated(struct bNodeTree *ntree);
1034 void ntreeTexCheckCyclics(struct bNodeTree *ntree);
1036 struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree);
1037 void ntreeTexEndExecTree(struct bNodeTreeExec *exec);
1038 int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target,
1039 float coord[3], float dxt[3], float dyt[3], int osatex, const short thread,
1040 struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
1043 void init_nodesystem(void);
1044 void free_nodesystem(void);
1046 #endif /* __BKE_NODE_H__ */