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 /** \file blender/blenkernel/intern/node.c
32 #include "MEM_guardedalloc.h"
39 #include "DNA_action_types.h"
40 #include "DNA_anim_types.h"
41 #include "DNA_node_types.h"
42 #include "DNA_node_types.h"
43 #include "DNA_scene_types.h"
45 #include "BLI_string.h"
47 #include "BLI_listbase.h"
48 #include "BLI_path_util.h"
49 #include "BLI_utildefines.h"
51 #include "BLF_translation.h"
53 #include "BKE_animsys.h"
54 #include "BKE_action.h"
55 #include "BKE_fcurve.h"
56 #include "BKE_global.h"
57 #include "BKE_image.h"
58 #include "BKE_library.h"
61 #include "BKE_utildefines.h"
62 #include "BKE_utildefines.h"
64 #include "RNA_access.h"
66 #include "NOD_socket.h"
67 #include "NOD_composite.h"
68 #include "NOD_shader.h"
69 #include "NOD_texture.h"
72 bNodeTreeType *ntreeGetType(int type)
74 static bNodeTreeType *types[NUM_NTREE_TYPES];
75 static int types_init = 1;
77 types[NTREE_SHADER] = &ntreeType_Shader;
78 types[NTREE_COMPOSIT] = &ntreeType_Composite;
79 types[NTREE_TEXTURE] = &ntreeType_Texture;
83 if (type >= 0 && type < NUM_NTREE_TYPES) {
91 static bNodeType *node_get_type(bNodeTree *ntree, int type)
93 bNodeType *ntype = ntreeGetType(ntree->type)->node_types.first;
94 for (; ntype; ntype = ntype->next)
95 if (ntype->type == type)
101 bNodeType *ntreeGetNodeType(bNodeTree *ntree)
103 return node_get_type(ntree, ntree->nodetype);
106 bNodeSocketType *ntreeGetSocketType(int type)
108 static bNodeSocketType *types[NUM_SOCKET_TYPES] = {NULL};
109 static int types_init = 1;
112 node_socket_type_init(types);
116 if (type < NUM_SOCKET_TYPES) {
124 void ntreeInitTypes(bNodeTree *ntree)
128 for (node = ntree->nodes.first; node; node = next) {
131 node->typeinfo = node_get_type(ntree, node->type);
133 if (node->typeinfo == NULL) {
134 printf("Error: Node type %s doesn't exist anymore, removed\n", node->name);
135 nodeFreeNode(ntree, node);
139 ntree->init |= NTREE_TYPE_INIT;
142 static bNodeSocket *make_socket(bNodeTree *UNUSED(ntree), int in_out, const char *name, int type)
146 sock = MEM_callocN(sizeof(bNodeSocket), "sock");
148 BLI_strncpy(sock->name, name, NODE_MAXSTR);
149 sock->limit = (in_out == SOCK_IN ? 1 : 0xFFF);
151 sock->storage = NULL;
153 sock->default_value = node_socket_make_default_value(type);
154 node_socket_init_default_value(type, sock->default_value);
159 bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type)
161 bNodeSocket *sock = make_socket(ntree, in_out, name, type);
162 if (in_out == SOCK_IN)
163 BLI_addtail(&node->inputs, sock);
164 else if (in_out == SOCK_OUT)
165 BLI_addtail(&node->outputs, sock);
167 node->update |= NODE_UPDATE;
172 bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type)
174 bNodeSocket *sock = make_socket(ntree, in_out, name, type);
175 if (in_out == SOCK_IN)
176 BLI_insertlinkbefore(&node->inputs, next_sock, sock);
177 else if (in_out == SOCK_OUT)
178 BLI_insertlinkbefore(&node->outputs, next_sock, sock);
180 node->update |= NODE_UPDATE;
185 void nodeRemoveSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
187 bNodeLink *link, *next;
189 for (link = ntree->links.first; link; link = next) {
191 if (link->fromsock == sock || link->tosock == sock) {
192 nodeRemLink(ntree, link);
196 /* this is fast, this way we don't need an in_out argument */
197 BLI_remlink(&node->inputs, sock);
198 BLI_remlink(&node->outputs, sock);
200 node_socket_free_default_value(sock->type, sock->default_value);
203 node->update |= NODE_UPDATE;
206 void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
209 bNodeLink *link, *next;
211 for (link = ntree->links.first; link; link = next) {
213 if (link->fromnode == node || link->tonode == node) {
214 nodeRemLink(ntree, link);
218 for (sock = node->inputs.first; sock; sock = sock->next)
219 node_socket_free_default_value(sock->type, sock->default_value);
220 BLI_freelistN(&node->inputs);
221 for (sock = node->outputs.first; sock; sock = sock->next)
222 node_socket_free_default_value(sock->type, sock->default_value);
223 BLI_freelistN(&node->outputs);
225 node->update |= NODE_UPDATE;
228 /* finds a node based on its name */
229 bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name)
231 return BLI_findstring(&ntree->nodes, name, offsetof(bNode, name));
234 /* finds a node based on given socket */
235 int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockindex, int *in_out)
241 for (node = ntree->nodes.first; node; node = node->next) {
242 for (index = 0, tsock = node->inputs.first; tsock; tsock = tsock->next, index++) {
244 if (in_out) *in_out = SOCK_IN;
250 for (index = 0, tsock = node->outputs.first; tsock; tsock = tsock->next, index++) {
252 if (in_out) *in_out = SOCK_OUT;
262 if (sockindex) *sockindex = index;
270 /* ************** Add stuff ********** */
271 static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype)
273 bNodeSocketTemplate *sockdef;
274 /* bNodeSocket *sock; */ /* UNUSED */
277 sockdef = ntype->inputs;
278 while (sockdef->type != -1) {
279 /* sock = */ node_add_input_from_template(ntree, node, sockdef);
284 if (ntype->outputs) {
285 sockdef = ntype->outputs;
286 while (sockdef->type != -1) {
287 /* sock = */ node_add_output_from_template(ntree, node, sockdef);
294 /* Find the first available, non-duplicate name for a given node */
295 void nodeUniqueName(bNodeTree *ntree, bNode *node)
297 BLI_uniquename(&ntree->nodes, node, "Node", '.', offsetof(bNode, name), sizeof(node->name));
300 bNode *nodeAddNode(bNodeTree *ntree, struct bNodeTemplate *ntemp)
305 ntype = node_get_type(ntree, ntemp->type);
307 printf("nodeAddNodeType() error: '%d' type invalid\n", ntemp->type);
311 if (!nodeValid(ntree, ntemp))
314 node = MEM_callocN(sizeof(bNode), "new node");
315 node->type = ntype->type;
316 node->typeinfo = ntype;
317 node->flag = NODE_SELECT | ntype->flag;
318 node->width = ntype->width;
319 node->miniwidth = 42.0f;
320 node->height = ntype->height;
321 node->color[0] = node->color[1] = node->color[2] = 0.608; /* default theme color */
323 node_add_sockets_from_type(ntree, node, ntype);
325 BLI_addtail(&ntree->nodes, node);
327 if (ntype->initfunc != NULL)
328 ntype->initfunc(ntree, node, ntemp);
330 /* initialize the node name with the node label.
331 * note: do this after the initfunc so nodes get
332 * their data set which may be used in naming
333 * (node groups for example) */
334 BLI_strncpy(node->name, nodeLabel(node), NODE_MAXSTR);
335 nodeUniqueName(ntree, node);
337 ntree->update |= NTREE_UPDATE_NODES;
342 /* keep socket listorder identical, for copying links */
343 /* ntree is the target tree */
344 bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
346 bNode *nnode = MEM_callocN(sizeof(bNode), "dupli node");
347 bNodeSocket *sock, *oldsock;
350 /* can be called for nodes outside a node tree (e.g. clipboard) */
352 nodeUniqueName(ntree, nnode);
354 BLI_addtail(&ntree->nodes, nnode);
357 BLI_duplicatelist(&nnode->inputs, &node->inputs);
358 oldsock = node->inputs.first;
359 for (sock = nnode->inputs.first; sock; sock = sock->next, oldsock = oldsock->next) {
360 oldsock->new_sock = sock;
361 sock->stack_index = 0;
363 sock->default_value = node_socket_make_default_value(oldsock->type);
364 node_socket_copy_default_value(oldsock->type, sock->default_value, oldsock->default_value);
366 /* XXX some compositor node (e.g. image, render layers) still store
367 * some persistent buffer data here, need to clear this to avoid dangling pointers.
372 BLI_duplicatelist(&nnode->outputs, &node->outputs);
373 oldsock = node->outputs.first;
374 for (sock = nnode->outputs.first; sock; sock = sock->next, oldsock = oldsock->next) {
375 oldsock->new_sock = sock;
376 sock->stack_index = 0;
378 sock->default_value = node_socket_make_default_value(oldsock->type);
379 node_socket_copy_default_value(oldsock->type, sock->default_value, oldsock->default_value);
381 /* XXX some compositor node (e.g. image, render layers) still store
382 * some persistent buffer data here, need to clear this to avoid dangling pointers.
387 /* don't increase node->id users, freenode doesn't decrement either */
389 if (node->typeinfo->copystoragefunc)
390 node->typeinfo->copystoragefunc(node, nnode);
392 node->new_node = nnode;
393 nnode->new_node = NULL;
394 nnode->preview = NULL;
397 ntree->update |= NTREE_UPDATE_NODES;
402 /* also used via rna api, so we check for proper input output direction */
403 bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
406 bNodeLink *link = NULL;
407 int from = 0, to = 0;
410 /* test valid input */
411 for (sock = fromnode->outputs.first; sock; sock = sock->next)
412 if (sock == fromsock)
417 for (sock = fromnode->inputs.first; sock; sock = sock->next)
418 if (sock == fromsock)
421 from = -1; /* OK but flip */
425 /* check tree sockets */
426 for (sock = ntree->inputs.first; sock; sock = sock->next)
427 if (sock == fromsock)
432 for (sock = ntree->outputs.first; sock; sock = sock->next)
433 if (sock == fromsock)
436 from = -1; /* OK but flip */
440 for (sock = tonode->inputs.first; sock; sock = sock->next)
446 for (sock = tonode->outputs.first; sock; sock = sock->next)
450 to = -1; /* OK but flip */
454 /* check tree sockets */
455 for (sock = ntree->outputs.first; sock; sock = sock->next)
461 for (sock = ntree->inputs.first; sock; sock = sock->next)
465 to = -1; /* OK but flip */
469 if (from >= 0 && to >= 0) {
470 link = MEM_callocN(sizeof(bNodeLink), "link");
472 BLI_addtail(&ntree->links, link);
473 link->fromnode = fromnode;
474 link->fromsock = fromsock;
475 link->tonode = tonode;
476 link->tosock = tosock;
478 else if (from <= 0 && to <= 0) {
479 link = MEM_callocN(sizeof(bNodeLink), "link");
481 BLI_addtail(&ntree->links, link);
482 link->fromnode = tonode;
483 link->fromsock = tosock;
484 link->tonode = fromnode;
485 link->tosock = fromsock;
489 ntree->update |= NTREE_UPDATE_LINKS;
494 void nodeRemLink(bNodeTree *ntree, bNodeLink *link)
496 /* can be called for links outside a node tree (e.g. clipboard) */
498 BLI_remlink(&ntree->links, link);
501 link->tosock->link = NULL;
505 ntree->update |= NTREE_UPDATE_LINKS;
508 void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
510 bNodeLink *link, *next;
512 for (link = ntree->links.first; link; link = next) {
514 if (link->fromsock == sock || link->tosock == sock) {
515 nodeRemLink(ntree, link);
519 ntree->update |= NTREE_UPDATE_LINKS;
522 void nodeInternalRelink(bNodeTree *ntree, bNode *node)
524 bNodeLink *link, *link_next;
527 if (!node->typeinfo->internal_connect)
530 intlinks = node->typeinfo->internal_connect(ntree, node);
532 /* store link pointers in output sockets, for efficient lookup */
533 for (link = intlinks.first; link; link = link->next)
534 link->tosock->link = link;
536 /* redirect downstream links */
537 for (link = ntree->links.first; link; link = link_next) {
538 link_next = link->next;
540 /* do we have internal link? */
541 if (link->fromnode == node) {
542 if (link->fromsock->link) {
543 /* get the upstream input link */
544 bNodeLink *fromlink = link->fromsock->link->fromsock->link;
547 link->fromnode = fromlink->fromnode;
548 link->fromsock = fromlink->fromsock;
550 ntree->update |= NTREE_UPDATE_LINKS;
553 nodeRemLink(ntree, link);
556 nodeRemLink(ntree, link);
560 /* remove remaining upstream links */
561 for (link = ntree->links.first; link; link = link_next) {
562 link_next = link->next;
564 if (link->tonode == node)
565 nodeRemLink(ntree, link);
568 BLI_freelistN(&intlinks);
571 void nodeToView(bNode *node, float x, float y, float *rx, float *ry)
574 nodeToView(node->parent, x + node->locx, y + node->locy, rx, ry);
577 *rx = x + node->locx;
578 *ry = y + node->locy;
582 void nodeFromView(bNode *node, float x, float y, float *rx, float *ry)
585 nodeFromView(node->parent, x, y, rx, ry);
590 *rx = x - node->locx;
591 *ry = y - node->locy;
595 int nodeAttachNodeCheck(bNode *node, bNode *parent)
597 bNode *parent_recurse;
598 for (parent_recurse = node; parent_recurse; parent_recurse = parent_recurse->parent) {
599 if (parent_recurse == parent) {
607 void nodeAttachNode(bNode *node, bNode *parent)
611 BLI_assert(parent->type == NODE_FRAME);
612 BLI_assert(nodeAttachNodeCheck(parent, node) == FALSE);
614 nodeToView(node, 0.0f, 0.0f, &locx, &locy);
616 node->parent = parent;
617 /* transform to parent space */
618 nodeFromView(parent, locx, locy, &node->locx, &node->locy);
621 void nodeDetachNode(struct bNode *node)
627 BLI_assert(node->parent->type == NODE_FRAME);
629 /* transform to view space */
630 nodeToView(node, 0.0f, 0.0f, &locx, &locy);
637 bNodeTree *ntreeAddTree(const char *name, int type, int nodetype)
642 /* trees are created as local trees if they of compositor, material or texture type,
643 * node groups and other tree types are created as library data.
645 if (ELEM3(type, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE) && nodetype == 0) {
646 ntree = MEM_callocN(sizeof(bNodeTree), "new node tree");
647 *( (short *)ntree->id.name) = ID_NT; /* not "type", as that is ntree->type */
648 BLI_strncpy(ntree->id.name + 2, name, sizeof(ntree->id.name));
651 ntree = BKE_libblock_alloc(&G.main->nodetree, ID_NT, name);
654 ntree->nodetype = nodetype;
656 ntreeInitTypes(ntree);
658 ntype = node_get_type(ntree, ntree->nodetype);
659 if (ntype && ntype->inittreefunc)
660 ntype->inittreefunc(ntree);
665 /* Warning: this function gets called during some rather unexpected times
666 * - this gets called when executing compositing updates (for threaded previews)
667 * - when the nodetree datablock needs to be copied (i.e. when users get copied)
668 * - for scene duplication use ntreeSwapID() after so we don't have stale pointers.
670 * do_make_extern: keep enabled for general use, only reason _not_ to enable is when
671 * copying for internal use (threads for eg), where you wont want it to modify the
674 static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, const short do_make_extern)
677 bNode *node /*, *nnode */ /* UNUSED */, *last;
679 bNodeSocket *gsock, *oldgsock;
681 if (ntree == NULL) return NULL;
683 /* is ntree part of library? */
684 for (newtree = G.main->nodetree.first; newtree; newtree = newtree->id.next)
685 if (newtree == ntree) break;
687 newtree = BKE_libblock_copy(&ntree->id);
690 newtree = MEM_dupallocN(ntree);
691 BKE_libblock_copy_data(&newtree->id, &ntree->id, TRUE); /* copy animdata and ID props */
694 id_us_plus((ID *)newtree->gpd);
696 /* in case a running nodetree is copied */
697 newtree->execdata = NULL;
699 newtree->nodes.first = newtree->nodes.last = NULL;
700 newtree->links.first = newtree->links.last = NULL;
702 last = ntree->nodes.last;
703 for (node = ntree->nodes.first; node; node = node->next) {
705 if (do_make_extern) {
706 id_lib_extern(node->id);
709 node->new_node = NULL;
710 /* nnode= */ nodeCopyNode(newtree, node); /* sets node->new */
712 /* make sure we don't copy new nodes again! */
717 /* socket definition for group usage */
718 BLI_duplicatelist(&newtree->inputs, &ntree->inputs);
719 for (gsock = newtree->inputs.first, oldgsock = ntree->inputs.first; gsock; gsock = gsock->next, oldgsock = oldgsock->next) {
720 oldgsock->new_sock = gsock;
721 gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
722 gsock->default_value = node_socket_make_default_value(oldgsock->type);
723 node_socket_copy_default_value(oldgsock->type, gsock->default_value, oldgsock->default_value);
725 BLI_duplicatelist(&newtree->outputs, &ntree->outputs);
726 for (gsock = newtree->outputs.first, oldgsock = ntree->outputs.first; gsock; gsock = gsock->next, oldgsock = oldgsock->next) {
727 oldgsock->new_sock = gsock;
728 gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
729 gsock->default_value = node_socket_make_default_value(oldgsock->type);
730 node_socket_copy_default_value(oldgsock->type, gsock->default_value, oldgsock->default_value);
734 BLI_duplicatelist(&newtree->links, &ntree->links);
735 for (link = newtree->links.first; link; link = link->next) {
736 link->fromnode = (link->fromnode ? link->fromnode->new_node : NULL);
737 link->fromsock = (link->fromsock ? link->fromsock->new_sock : NULL);
738 link->tonode = (link->tonode ? link->tonode->new_node : NULL);
739 link->tosock = (link->tosock ? link->tosock->new_sock : NULL);
740 /* update the link socket's pointer */
742 link->tosock->link = link;
745 /* update node->parent pointers */
746 for (node = newtree->nodes.first; node; node = node->next) {
748 node->parent = node->parent->new_node;
754 bNodeTree *ntreeCopyTree(bNodeTree *ntree)
756 return ntreeCopyTree_internal(ntree, TRUE);
759 /* use when duplicating scenes */
760 void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
763 /* for scene duplication only */
764 for (node = ntree->nodes.first; node; node = node->next) {
765 if (node->id == id_from) {
771 /* *************** preview *********** */
772 /* if node->preview, then we assume the rect to exist */
774 void nodeFreePreview(bNode *node)
777 if (node->preview->rect)
778 MEM_freeN(node->preview->rect);
779 MEM_freeN(node->preview);
780 node->preview = NULL;
784 static void node_init_preview(bNode *node, int xsize, int ysize)
787 if (node->preview == NULL) {
788 node->preview = MEM_callocN(sizeof(bNodePreview), "node preview");
789 // printf("added preview %s\n", node->name);
792 /* node previews can get added with variable size this way */
793 if (xsize == 0 || ysize == 0)
796 /* sanity checks & initialize */
797 if (node->preview->rect) {
798 if (node->preview->xsize != xsize && node->preview->ysize != ysize) {
799 MEM_freeN(node->preview->rect);
800 node->preview->rect = NULL;
804 if (node->preview->rect == NULL) {
805 node->preview->rect = MEM_callocN(4 * xsize + xsize * ysize * sizeof(char) * 4, "node preview rect");
806 node->preview->xsize = xsize;
807 node->preview->ysize = ysize;
809 /* no clear, makes nicer previews */
812 void ntreeInitPreview(bNodeTree *ntree, int xsize, int ysize)
819 for (node = ntree->nodes.first; node; node = node->next) {
820 if (node->typeinfo->flag & NODE_PREVIEW) /* hrms, check for closed nodes? */
821 node_init_preview(node, xsize, ysize);
822 if (node->type == NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
823 ntreeInitPreview((bNodeTree *)node->id, xsize, ysize);
827 static void nodeClearPreview(bNode *node)
829 if (node->preview && node->preview->rect)
830 memset(node->preview->rect, 0, MEM_allocN_len(node->preview->rect));
833 /* use it to enforce clear */
834 void ntreeClearPreview(bNodeTree *ntree)
841 for (node = ntree->nodes.first; node; node = node->next) {
842 if (node->typeinfo->flag & NODE_PREVIEW)
843 nodeClearPreview(node);
844 if (node->type == NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
845 ntreeClearPreview((bNodeTree *)node->id);
849 /* hack warning! this function is only used for shader previews, and
850 * since it gets called multiple times per pixel for Ztransp we only
851 * add the color once. Preview gets cleared before it starts render though */
852 void nodeAddToPreview(bNode *node, float col[4], int x, int y, int do_manage)
854 bNodePreview *preview = node->preview;
856 if (x >= 0 && y >= 0) {
857 if (x < preview->xsize && y < preview->ysize) {
858 unsigned char *tar = preview->rect + 4 * ((preview->xsize * y) + x);
861 linearrgb_to_srgb_uchar4(tar, col);
864 rgba_float_to_uchar(tar, col);
867 //else printf("prv out bound x y %d %d\n", x, y);
869 //else printf("prv out bound x y %d %d\n", x, y);
873 /* ************** Free stuff ********** */
875 /* goes over entire tree */
876 void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
878 bNodeLink *link, *next;
882 for (link = ntree->links.first; link; link = next) {
885 if (link->fromnode == node) {
888 link->tonode->update |= NODE_UPDATE;
890 else if (link->tonode == node)
896 for (sock = lb->first; sock; sock = sock->next) {
897 if (link->fromsock == sock || link->tosock == sock)
901 nodeRemLink(ntree, link);
907 static void node_unlink_attached(bNodeTree *ntree, bNode *parent)
910 for (node = ntree->nodes.first; node; node = node->next) {
911 if (node->parent == parent)
912 nodeDetachNode(node);
916 void nodeFreeNode(bNodeTree *ntree, bNode *node)
918 bNodeSocket *sock, *nextsock;
920 /* can be called for nodes outside a node tree (e.g. clipboard) */
922 bNodeTreeType *treetype = ntreeGetType(ntree->type);
924 /* remove all references to this node */
925 nodeUnlinkNode(ntree, node);
926 node_unlink_attached(ntree, node);
928 BLI_remlink(&ntree->nodes, node);
930 if (treetype->free_node_cache)
931 treetype->free_node_cache(ntree, node);
934 /* since it is called while free database, node->id is undefined */
936 if (node->typeinfo && node->typeinfo->freestoragefunc)
937 node->typeinfo->freestoragefunc(node);
939 for (sock = node->inputs.first; sock; sock = nextsock) {
940 nextsock = sock->next;
941 node_socket_free_default_value(sock->type, sock->default_value);
944 for (sock = node->outputs.first; sock; sock = nextsock) {
945 nextsock = sock->next;
946 node_socket_free_default_value(sock->type, sock->default_value);
950 nodeFreePreview(node);
955 ntree->update |= NTREE_UPDATE_NODES;
958 /* do not free ntree itself here, BKE_libblock_free calls this function too */
959 void ntreeFreeTree(bNodeTree *ntree)
964 if (ntree == NULL) return;
966 /* XXX hack! node trees should not store execution graphs at all.
967 * This should be removed when old tree types no longer require it.
968 * Currently the execution data for texture nodes remains in the tree
969 * after execution, until the node tree is updated or freed.
971 if (ntree->execdata) {
972 switch (ntree->type) {
974 ntreeCompositEndExecTree(ntree->execdata, 1);
977 ntreeShaderEndExecTree(ntree->execdata, 1);
980 ntreeTexEndExecTree(ntree->execdata, 1);
985 BKE_free_animdata((ID *)ntree);
987 id_us_min((ID *)ntree->gpd);
989 BLI_freelistN(&ntree->links); /* do first, then unlink_node goes fast */
991 for (node = ntree->nodes.first; node; node = next) {
993 nodeFreeNode(ntree, node);
996 for (sock = ntree->inputs.first; sock; sock = sock->next)
997 node_socket_free_default_value(sock->type, sock->default_value);
998 BLI_freelistN(&ntree->inputs);
999 for (sock = ntree->outputs.first; sock; sock = sock->next)
1000 node_socket_free_default_value(sock->type, sock->default_value);
1001 BLI_freelistN(&ntree->outputs);
1004 void ntreeFreeCache(bNodeTree *ntree)
1006 bNodeTreeType *treetype;
1008 if (ntree == NULL) return;
1010 treetype = ntreeGetType(ntree->type);
1011 if (treetype->free_cache)
1012 treetype->free_cache(ntree);
1015 void ntreeSetOutput(bNodeTree *ntree)
1019 /* find the active outputs, might become tree type dependent handler */
1020 for (node = ntree->nodes.first; node; node = node->next) {
1021 if (node->typeinfo->nclass == NODE_CLASS_OUTPUT) {
1025 /* we need a check for which output node should be tagged like this, below an exception */
1026 if (node->type == CMP_NODE_OUTPUT_FILE)
1029 /* there is more types having output class, each one is checked */
1030 for (tnode = ntree->nodes.first; tnode; tnode = tnode->next) {
1031 if (tnode->typeinfo->nclass == NODE_CLASS_OUTPUT) {
1033 if (ntree->type == NTREE_COMPOSIT) {
1035 /* same type, exception for viewer */
1036 if (tnode->type == node->type ||
1037 (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
1038 ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)))
1040 if (tnode->flag & NODE_DO_OUTPUT) {
1043 tnode->flag &= ~NODE_DO_OUTPUT;
1049 if (tnode->type == node->type) {
1050 if (tnode->flag & NODE_DO_OUTPUT) {
1053 tnode->flag &= ~NODE_DO_OUTPUT;
1060 node->flag |= NODE_DO_OUTPUT;
1064 /* here we could recursively set which nodes have to be done,
1065 * might be different for editor or for "real" use... */
1068 typedef struct MakeLocalCallData {
1072 } MakeLocalCallData;
1074 static void ntreeMakeLocal_CheckLocal(void *calldata, ID *owner_id, bNodeTree *ntree)
1076 MakeLocalCallData *cd = (MakeLocalCallData *)calldata;
1079 /* find if group is in tree */
1080 for (node = ntree->nodes.first; node; node = node->next) {
1081 if (node->id == cd->group_id) {
1082 if (owner_id->lib) {
1092 static void ntreeMakeLocal_LinkNew(void *calldata, ID *owner_id, bNodeTree *ntree)
1094 MakeLocalCallData *cd = (MakeLocalCallData *)calldata;
1097 /* find if group is in tree */
1098 for (node = ntree->nodes.first; node; node = node->next) {
1099 if (node->id == cd->group_id) {
1100 if (owner_id->lib == NULL) {
1101 node->id = cd->new_id;
1109 void ntreeMakeLocal(bNodeTree *ntree)
1111 Main *bmain = G.main;
1112 bNodeTreeType *treetype = ntreeGetType(ntree->type);
1113 MakeLocalCallData cd;
1115 /* - only lib users: do nothing
1116 * - only local users: set flag
1117 * - mixed: make copy
1120 if (ntree->id.lib == NULL) return;
1121 if (ntree->id.us == 1) {
1122 id_clear_lib_data(bmain, (ID *)ntree);
1126 /* now check users of groups... again typedepending, callback... */
1127 cd.group_id = &ntree->id;
1132 treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_CheckLocal);
1134 /* if all users are local, we simply make tree local */
1135 if (cd.local && cd.lib == 0) {
1136 id_clear_lib_data(bmain, (ID *)ntree);
1138 else if (cd.local && cd.lib) {
1139 /* this is the mixed case, we copy the tree and assign it to local users */
1140 bNodeTree *newtree = ntreeCopyTree(ntree);
1145 cd.new_id = &newtree->id;
1146 treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_LinkNew);
1150 int ntreeNodeExists(bNodeTree *ntree, bNode *testnode)
1152 bNode *node = ntree->nodes.first;
1153 for (; node; node = node->next)
1154 if (node == testnode)
1159 int ntreeOutputExists(bNode *node, bNodeSocket *testsock)
1161 bNodeSocket *sock = node->outputs.first;
1162 for (; sock; sock = sock->next)
1163 if (sock == testsock)
1168 /* returns localized tree for execution in threads */
1169 bNodeTree *ntreeLocalize(bNodeTree *ntree)
1171 bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
1176 bAction *action_backup = NULL, *tmpact_backup = NULL;
1178 /* Workaround for copying an action on each render!
1179 * set action to NULL so animdata actions don't get copied */
1180 AnimData *adt = BKE_animdata_from_id(&ntree->id);
1183 action_backup = adt->action;
1184 tmpact_backup = adt->tmpact;
1190 /* node copy func */
1191 ltree = ntreeCopyTree_internal(ntree, FALSE);
1194 AnimData *ladt = BKE_animdata_from_id(<ree->id);
1196 adt->action = ladt->action = action_backup;
1197 adt->tmpact = ladt->tmpact = tmpact_backup;
1199 if (action_backup) action_backup->id.us++;
1200 if (tmpact_backup) tmpact_backup->id.us++;
1203 /* end animdata uglyness */
1205 /* ensures only a single output node is enabled */
1206 ntreeSetOutput(ntree);
1208 for (node = ntree->nodes.first; node; node = node->next) {
1209 /* store new_node pointer to original */
1210 node->new_node->new_node = node;
1213 if (ntreetype->localize)
1214 ntreetype->localize(ltree, ntree);
1219 /* sync local composite with real tree */
1220 /* local tree is supposed to be running, be careful moving previews! */
1221 /* is called by jobs manager, outside threads, so it doesnt happen during draw */
1222 void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
1224 bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
1226 if (ntreetype->local_sync)
1227 ntreetype->local_sync(localtree, ntree);
1230 /* merge local tree results back, and free local tree */
1231 /* we have to assume the editor already changed completely */
1232 void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
1234 bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
1237 /* move over the compbufs and previews */
1238 for (lnode = localtree->nodes.first; lnode; lnode = lnode->next) {
1239 if (ntreeNodeExists(ntree, lnode->new_node)) {
1240 if (lnode->preview && lnode->preview->rect) {
1241 nodeFreePreview(lnode->new_node);
1242 lnode->new_node->preview = lnode->preview;
1243 lnode->preview = NULL;
1248 if (ntreetype->local_merge)
1249 ntreetype->local_merge(localtree, ntree);
1251 ntreeFreeTree(localtree);
1252 MEM_freeN(localtree);
1255 /* ************ find stuff *************** */
1257 int ntreeHasType(bNodeTree *ntree, int type)
1262 for (node = ntree->nodes.first; node; node = node->next)
1263 if (node->type == type)
1268 bNodeLink *nodeFindLink(bNodeTree *ntree, bNodeSocket *from, bNodeSocket *to)
1272 for (link = ntree->links.first; link; link = link->next) {
1273 if (link->fromsock == from && link->tosock == to)
1275 if (link->fromsock == to && link->tosock == from) /* hrms? */
1281 int nodeCountSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
1286 for (link = ntree->links.first; link; link = link->next) {
1287 if (link->fromsock == sock || link->tosock == sock)
1293 bNode *nodeGetActive(bNodeTree *ntree)
1297 if (ntree == NULL) return NULL;
1299 for (node = ntree->nodes.first; node; node = node->next)
1300 if (node->flag & NODE_ACTIVE)
1305 /* two active flags, ID nodes have special flag for buttons display */
1306 bNode *nodeGetActiveID(bNodeTree *ntree, short idtype)
1310 if (ntree == NULL) return NULL;
1312 /* check for group edit */
1313 for (node = ntree->nodes.first; node; node = node->next)
1314 if (node->flag & NODE_GROUP_EDIT)
1318 ntree = (bNodeTree *)node->id;
1320 /* now find active node with this id */
1321 for (node = ntree->nodes.first; node; node = node->next)
1322 if (node->id && GS(node->id->name) == idtype)
1323 if (node->flag & NODE_ACTIVE_ID)
1329 int nodeSetActiveID(bNodeTree *ntree, short idtype, ID *id)
1334 if (ntree == NULL) return ok;
1336 /* check for group edit */
1337 for (node = ntree->nodes.first; node; node = node->next)
1338 if (node->flag & NODE_GROUP_EDIT)
1342 ntree = (bNodeTree *)node->id;
1344 /* now find active node with this id */
1345 for (node = ntree->nodes.first; node; node = node->next) {
1346 if (node->id && GS(node->id->name) == idtype) {
1347 if (id && ok == FALSE && node->id == id) {
1348 node->flag |= NODE_ACTIVE_ID;
1352 node->flag &= ~NODE_ACTIVE_ID;
1361 /* two active flags, ID nodes have special flag for buttons display */
1362 void nodeClearActiveID(bNodeTree *ntree, short idtype)
1366 if (ntree == NULL) return;
1368 for (node = ntree->nodes.first; node; node = node->next)
1369 if (node->id && GS(node->id->name) == idtype)
1370 node->flag &= ~NODE_ACTIVE_ID;
1373 void nodeClearActive(bNodeTree *ntree)
1377 if (ntree == NULL) return;
1379 for (node = ntree->nodes.first; node; node = node->next)
1380 node->flag &= ~(NODE_ACTIVE | NODE_ACTIVE_ID);
1384 /* two active flags, ID nodes have special flag for buttons display */
1385 void nodeSetActive(bNodeTree *ntree, bNode *node)
1389 /* make sure only one node is active, and only one per ID type */
1390 for (tnode = ntree->nodes.first; tnode; tnode = tnode->next) {
1391 tnode->flag &= ~NODE_ACTIVE;
1393 if (node->id && tnode->id) {
1394 if (GS(node->id->name) == GS(tnode->id->name))
1395 tnode->flag &= ~NODE_ACTIVE_ID;
1397 if (node->typeinfo->nclass == NODE_CLASS_TEXTURE)
1398 tnode->flag &= ~NODE_ACTIVE_TEXTURE;
1401 node->flag |= NODE_ACTIVE;
1403 node->flag |= NODE_ACTIVE_ID;
1404 if (node->typeinfo->nclass == NODE_CLASS_TEXTURE)
1405 node->flag |= NODE_ACTIVE_TEXTURE;
1408 int nodeSocketIsHidden(bNodeSocket *sock)
1410 return ((sock->flag & (SOCK_HIDDEN | SOCK_UNAVAIL)) != 0);
1413 void nodeSocketSetType(bNodeSocket *sock, int type)
1415 int old_type = sock->type;
1416 void *old_default_value = sock->default_value;
1420 sock->default_value = node_socket_make_default_value(sock->type);
1421 node_socket_init_default_value(type, sock->default_value);
1422 node_socket_convert_default_value(sock->type, sock->default_value, old_type, old_default_value);
1423 node_socket_free_default_value(old_type, old_default_value);
1426 /* ************** Node Clipboard *********** */
1428 typedef struct bNodeClipboard {
1434 bNodeClipboard node_clipboard;
1436 void BKE_node_clipboard_init(struct bNodeTree *ntree)
1438 node_clipboard.type = ntree->type;
1441 void BKE_node_clipboard_clear(void)
1443 bNode *node, *node_next;
1444 bNodeLink *link, *link_next;
1446 for (link = node_clipboard.links.first; link; link=link_next) {
1447 link_next = link->next;
1448 nodeRemLink(NULL, link);
1450 node_clipboard.links.first = node_clipboard.links.last = NULL;
1452 for (node = node_clipboard.nodes.first; node; node=node_next) {
1453 node_next = node->next;
1454 nodeFreeNode(NULL, node);
1456 node_clipboard.nodes.first = node_clipboard.nodes.last = NULL;
1459 void BKE_node_clipboard_add_node(bNode *node)
1461 BLI_addtail(&node_clipboard.nodes, node);
1464 void BKE_node_clipboard_add_link(bNodeLink *link)
1466 BLI_addtail(&node_clipboard.links, link);
1469 const ListBase *BKE_node_clipboard_get_nodes(void)
1471 return &node_clipboard.nodes;
1474 const ListBase *BKE_node_clipboard_get_links(void)
1476 return &node_clipboard.links;
1479 int BKE_node_clipboard_get_type(void)
1481 return node_clipboard.type;
1484 /* ************** dependency stuff *********** */
1486 /* node is guaranteed to be not checked before */
1487 static int node_get_deplist_recurs(bNode *node, bNode ***nsort)
1495 /* check linked nodes */
1496 for (sock = node->inputs.first; sock; sock = sock->next) {
1498 fromnode = sock->link->fromnode;
1500 if (fromnode->done == 0)
1501 fromnode->level = node_get_deplist_recurs(fromnode, nsort);
1502 if (fromnode->level <= level)
1503 level = fromnode->level - 1;
1508 /* check parent node */
1510 if (node->parent->done == 0)
1511 node->parent->level = node_get_deplist_recurs(node->parent, nsort);
1512 if (node->parent->level <= level)
1513 level = node->parent->level - 1;
1524 void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes)
1526 bNode *node, **nsort;
1530 /* first clear data */
1531 for (node = ntree->nodes.first; node; node = node->next) {
1535 if (*totnodes == 0) {
1540 nsort = *deplist = MEM_callocN((*totnodes) * sizeof(bNode *), "sorted node array");
1542 /* recursive check */
1543 for (node = ntree->nodes.first; node; node = node->next) {
1544 if (node->done == 0) {
1545 node->level = node_get_deplist_recurs(node, &nsort);
1550 /* only updates node->level for detecting cycles links */
1551 static void ntree_update_node_level(bNodeTree *ntree)
1555 /* first clear tag */
1556 for (node = ntree->nodes.first; node; node = node->next) {
1560 /* recursive check */
1561 for (node = ntree->nodes.first; node; node = node->next) {
1562 if (node->done == 0) {
1563 node->level = node_get_deplist_recurs(node, NULL);
1568 static void ntree_update_link_pointers(bNodeTree *ntree)
1574 /* first clear data */
1575 for (node = ntree->nodes.first; node; node = node->next) {
1576 for (sock = node->inputs.first; sock; sock = sock->next) {
1578 sock->flag &= ~SOCK_IN_USE;
1580 for (sock = node->outputs.first; sock; sock = sock->next) {
1581 sock->flag &= ~SOCK_IN_USE;
1584 for (sock = ntree->inputs.first; sock; sock = sock->next) {
1585 sock->flag &= ~SOCK_IN_USE;
1587 for (sock = ntree->outputs.first; sock; sock = sock->next) {
1589 sock->flag &= ~SOCK_IN_USE;
1592 for (link = ntree->links.first; link; link = link->next) {
1593 link->tosock->link = link;
1595 link->fromsock->flag |= SOCK_IN_USE;
1596 link->tosock->flag |= SOCK_IN_USE;
1600 static void ntree_validate_links(bNodeTree *ntree)
1602 bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
1605 for (link = ntree->links.first; link; link = link->next) {
1606 link->flag |= NODE_LINK_VALID;
1607 if (link->fromnode && link->tonode && link->fromnode->level <= link->tonode->level)
1608 link->flag &= ~NODE_LINK_VALID;
1609 else if (ntreetype->validate_link) {
1610 if (!ntreetype->validate_link(ntree, link))
1611 link->flag &= ~NODE_LINK_VALID;
1616 static void ntree_verify_nodes_cb(void *calldata, struct ID *UNUSED(owner_id), struct bNodeTree *ntree)
1618 ID *id = (ID *)calldata;
1621 for (node = ntree->nodes.first; node; node = node->next)
1622 if (node->typeinfo->verifyfunc)
1623 node->typeinfo->verifyfunc(ntree, node, id);
1626 void ntreeVerifyNodes(struct Main *main, struct ID *id)
1628 bNodeTreeType *ntreetype;
1632 for (n = 0; n < NUM_NTREE_TYPES; ++n) {
1633 ntreetype = ntreeGetType(n);
1634 if (ntreetype && ntreetype->foreach_nodetree)
1635 ntreetype->foreach_nodetree(main, id, ntree_verify_nodes_cb);
1637 for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next)
1638 ntree_verify_nodes_cb(id, NULL, ntree);
1641 void ntreeUpdateTree(bNodeTree *ntree)
1643 bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
1646 if (ntree->update & (NTREE_UPDATE_LINKS | NTREE_UPDATE_NODES)) {
1647 /* set the bNodeSocket->link pointers */
1648 ntree_update_link_pointers(ntree);
1650 /* update the node level from link dependencies */
1651 ntree_update_node_level(ntree);
1654 /* update individual nodes */
1655 for (node = ntree->nodes.first; node; node = node->next) {
1656 /* node tree update tags override individual node update flags */
1657 if ((node->update & NODE_UPDATE) || (ntree->update & NTREE_UPDATE)) {
1658 if (ntreetype->update_node)
1659 ntreetype->update_node(ntree, node);
1660 else if (node->typeinfo->updatefunc)
1661 node->typeinfo->updatefunc(ntree, node);
1663 /* clear update flag */
1667 /* check link validity */
1668 if (ntree->update & (NTREE_UPDATE_LINKS | NTREE_UPDATE_NODES))
1669 ntree_validate_links(ntree);
1671 /* generic tree update callback */
1672 if (ntreetype->update)
1673 ntreetype->update(ntree);
1675 /* Trees can be associated with a specific node type (i.e. group nodes),
1676 * in that case a tree update function may be defined by that node type.
1678 bNodeType *ntype = node_get_type(ntree, ntree->nodetype);
1679 if (ntype && ntype->updatetreefunc)
1680 ntype->updatetreefunc(ntree);
1683 /* XXX hack, should be done by depsgraph!! */
1684 ntreeVerifyNodes(G.main, &ntree->id);
1686 /* clear the update flag */
1690 void nodeUpdate(bNodeTree *ntree, bNode *node)
1692 bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
1694 if (ntreetype->update_node)
1695 ntreetype->update_node(ntree, node);
1696 else if (node->typeinfo->updatefunc)
1697 node->typeinfo->updatefunc(ntree, node);
1698 /* clear update flag */
1702 int nodeUpdateID(bNodeTree *ntree, ID *id)
1704 bNodeTreeType *ntreetype;
1708 if (ELEM(NULL, id, ntree))
1711 ntreetype = ntreeGetType(ntree->type);
1713 if (ntreetype->update_node) {
1714 for (node = ntree->nodes.first; node; node = node->next) {
1715 if (node->id == id) {
1717 node->update |= NODE_UPDATE_ID;
1718 ntreetype->update_node(ntree, node);
1719 /* clear update flag */
1725 for (node = ntree->nodes.first; node; node = node->next) {
1726 if (node->id == id) {
1728 node->update |= NODE_UPDATE_ID;
1729 if (node->typeinfo->updatefunc)
1730 node->typeinfo->updatefunc(ntree, node);
1731 /* clear update flag */
1741 /* ************* node type access ********** */
1743 int nodeValid(bNodeTree *ntree, bNodeTemplate *ntemp)
1745 bNodeType *ntype = node_get_type(ntree, ntemp->type);
1747 if (ntype->validfunc)
1748 return ntype->validfunc(ntree, ntemp);
1756 const char *nodeLabel(bNode *node)
1758 if (node->label[0] != '\0')
1760 else if (node->typeinfo->labelfunc)
1761 return node->typeinfo->labelfunc(node);
1763 return IFACE_(node->typeinfo->name);
1766 struct bNodeTree *nodeGroupEditGet(struct bNode *node)
1768 if (node->typeinfo->group_edit_get)
1769 return node->typeinfo->group_edit_get(node);
1774 struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit)
1776 if (node->typeinfo->group_edit_set)
1777 return node->typeinfo->group_edit_set(node, edit);
1778 else if (node->typeinfo->group_edit_get)
1779 return node->typeinfo->group_edit_get(node);
1784 void nodeGroupEditClear(struct bNode *node)
1786 if (node->typeinfo->group_edit_clear)
1787 node->typeinfo->group_edit_clear(node);
1790 struct bNodeTemplate nodeMakeTemplate(struct bNode *node)
1792 bNodeTemplate ntemp;
1793 if (node->typeinfo->templatefunc)
1794 return node->typeinfo->templatefunc(node);
1796 ntemp.type = node->type;
1801 void node_type_base(bNodeTreeType *ttype, bNodeType *ntype, int type, const char *name, short nclass, short flag)
1803 memset(ntype, 0, sizeof(bNodeType));
1806 BLI_strncpy(ntype->name, name, sizeof(ntype->name));
1807 ntype->nclass = nclass;
1810 /* Default muting stuff. */
1812 ntype->internal_connect = ttype->internal_connect;
1814 /* default size values */
1816 ntype->minwidth = 100;
1817 ntype->maxwidth = 320;
1818 ntype->height = 100;
1819 ntype->minheight = 30;
1820 ntype->maxheight = FLT_MAX;
1823 void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs)
1825 ntype->inputs = inputs;
1826 ntype->outputs = outputs;
1829 void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp))
1831 ntype->initfunc = initfunc;
1834 void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp))
1836 ntype->validfunc = validfunc;
1839 void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth)
1841 ntype->width = width;
1842 ntype->minwidth = minwidth;
1843 if (maxwidth <= minwidth)
1844 ntype->maxwidth = FLT_MAX;
1846 ntype->maxwidth = maxwidth;
1849 void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
1852 BLI_strncpy(ntype->storagename, storagename, sizeof(ntype->storagename));
1854 ntype->storagename[0] = '\0';
1855 ntype->copystoragefunc = copystoragefunc;
1856 ntype->freestoragefunc = freestoragefunc;
1859 void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *))
1861 ntype->labelfunc = labelfunc;
1864 void node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *))
1866 ntype->templatefunc = templatefunc;
1869 void node_type_update(struct bNodeType *ntype,
1870 void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
1871 void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id))
1873 ntype->updatefunc = updatefunc;
1874 ntype->verifyfunc = verifyfunc;
1877 void node_type_tree(struct bNodeType *ntype, void (*inittreefunc)(struct bNodeTree *), void (*updatetreefunc)(struct bNodeTree *))
1879 ntype->inittreefunc = inittreefunc;
1880 ntype->updatetreefunc = updatetreefunc;
1883 void node_type_group_edit(struct bNodeType *ntype,
1884 struct bNodeTree *(*group_edit_get)(struct bNode *node),
1885 struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
1886 void (*group_edit_clear)(struct bNode *node))
1888 ntype->group_edit_get = group_edit_get;
1889 ntype->group_edit_set = group_edit_set;
1890 ntype->group_edit_clear = group_edit_clear;
1893 void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **))
1895 ntype->execfunc = execfunc;
1898 void node_type_exec_new(struct bNodeType *ntype,
1899 void *(*initexecfunc)(struct bNode *node),
1900 void (*freeexecfunc)(struct bNode *node, void *nodedata),
1901 void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **))
1903 ntype->initexecfunc = initexecfunc;
1904 ntype->freeexecfunc = freeexecfunc;
1905 ntype->newexecfunc = newexecfunc;
1908 void node_type_internal_connect(bNodeType *ntype, ListBase (*internal_connect)(bNodeTree *, bNode *))
1910 ntype->internal_connect = internal_connect;
1913 void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))
1915 ntype->gpufunc = gpufunc;
1918 void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out))
1920 ntype->gpuextfunc = gpuextfunc;
1923 void node_type_compatibility(struct bNodeType *ntype, short compatibility)
1925 ntype->compatibility = compatibility;
1928 static bNodeType *is_nodetype_registered(ListBase *typelist, int type)
1930 bNodeType *ntype = typelist->first;
1932 for (; ntype; ntype = ntype->next)
1933 if (ntype->type == type)
1939 void nodeRegisterType(bNodeTreeType *ttype, bNodeType *ntype)
1941 ListBase *typelist = &(ttype->node_types);
1942 bNodeType *found = is_nodetype_registered(typelist, ntype->type);
1945 BLI_addtail(typelist, ntype);
1948 static void registerCompositNodes(bNodeTreeType *ttype)
1950 register_node_type_frame(ttype);
1951 register_node_type_reroute(ttype);
1953 register_node_type_cmp_group(ttype);
1954 // register_node_type_cmp_forloop(ttype);
1955 // register_node_type_cmp_whileloop(ttype);
1957 register_node_type_cmp_rlayers(ttype);
1958 register_node_type_cmp_image(ttype);
1959 register_node_type_cmp_texture(ttype);
1960 register_node_type_cmp_value(ttype);
1961 register_node_type_cmp_rgb(ttype);
1962 register_node_type_cmp_curve_time(ttype);
1963 register_node_type_cmp_movieclip(ttype);
1965 register_node_type_cmp_composite(ttype);
1966 register_node_type_cmp_viewer(ttype);
1967 register_node_type_cmp_splitviewer(ttype);
1968 register_node_type_cmp_output_file(ttype);
1969 register_node_type_cmp_view_levels(ttype);
1971 register_node_type_cmp_curve_rgb(ttype);
1972 register_node_type_cmp_mix_rgb(ttype);
1973 register_node_type_cmp_hue_sat(ttype);
1974 register_node_type_cmp_brightcontrast(ttype);
1975 register_node_type_cmp_gamma(ttype);
1976 register_node_type_cmp_invert(ttype);
1977 register_node_type_cmp_alphaover(ttype);
1978 register_node_type_cmp_zcombine(ttype);
1979 register_node_type_cmp_colorbalance(ttype);
1980 register_node_type_cmp_huecorrect(ttype);
1982 register_node_type_cmp_normal(ttype);
1983 register_node_type_cmp_curve_vec(ttype);
1984 register_node_type_cmp_map_value(ttype);
1985 register_node_type_cmp_normalize(ttype);
1987 register_node_type_cmp_filter(ttype);
1988 register_node_type_cmp_blur(ttype);
1989 register_node_type_cmp_dblur(ttype);
1990 register_node_type_cmp_bilateralblur(ttype);
1991 register_node_type_cmp_vecblur(ttype);
1992 register_node_type_cmp_dilateerode(ttype);
1993 register_node_type_cmp_inpaint(ttype);
1994 register_node_type_cmp_defocus(ttype);
1996 register_node_type_cmp_valtorgb(ttype);
1997 register_node_type_cmp_rgbtobw(ttype);
1998 register_node_type_cmp_setalpha(ttype);
1999 register_node_type_cmp_idmask(ttype);
2000 register_node_type_cmp_math(ttype);
2001 register_node_type_cmp_seprgba(ttype);
2002 register_node_type_cmp_combrgba(ttype);
2003 register_node_type_cmp_sephsva(ttype);
2004 register_node_type_cmp_combhsva(ttype);
2005 register_node_type_cmp_sepyuva(ttype);
2006 register_node_type_cmp_combyuva(ttype);
2007 register_node_type_cmp_sepycca(ttype);
2008 register_node_type_cmp_combycca(ttype);
2009 register_node_type_cmp_premulkey(ttype);
2011 register_node_type_cmp_diff_matte(ttype);
2012 register_node_type_cmp_distance_matte(ttype);
2013 register_node_type_cmp_chroma_matte(ttype);
2014 register_node_type_cmp_color_matte(ttype);
2015 register_node_type_cmp_channel_matte(ttype);
2016 register_node_type_cmp_color_spill(ttype);
2017 register_node_type_cmp_luma_matte(ttype);
2018 register_node_type_cmp_doubleedgemask(ttype);
2019 register_node_type_cmp_keyingscreen(ttype);
2020 register_node_type_cmp_keying(ttype);
2022 register_node_type_cmp_translate(ttype);
2023 register_node_type_cmp_rotate(ttype);
2024 register_node_type_cmp_scale(ttype);
2025 register_node_type_cmp_flip(ttype);
2026 register_node_type_cmp_crop(ttype);
2027 register_node_type_cmp_displace(ttype);
2028 register_node_type_cmp_mapuv(ttype);
2029 register_node_type_cmp_glare(ttype);
2030 register_node_type_cmp_tonemap(ttype);
2031 register_node_type_cmp_lensdist(ttype);
2032 register_node_type_cmp_transform(ttype);
2033 register_node_type_cmp_stabilize2d(ttype);
2034 register_node_type_cmp_moviedistortion(ttype);
2036 register_node_type_cmp_colorcorrection(ttype);
2037 register_node_type_cmp_boxmask(ttype);
2038 register_node_type_cmp_ellipsemask(ttype);
2039 register_node_type_cmp_bokehimage(ttype);
2040 register_node_type_cmp_bokehblur(ttype);
2041 register_node_type_cmp_switch(ttype);
2043 register_node_type_cmp_mask(ttype);
2044 register_node_type_cmp_trackpos(ttype);
2047 static void registerShaderNodes(bNodeTreeType *ttype)
2049 register_node_type_frame(ttype);
2050 register_node_type_reroute(ttype);
2052 register_node_type_sh_group(ttype);
2053 //register_node_type_sh_forloop(ttype);
2054 //register_node_type_sh_whileloop(ttype);
2056 register_node_type_sh_output(ttype);
2057 register_node_type_sh_material(ttype);
2058 register_node_type_sh_camera(ttype);
2059 register_node_type_sh_gamma(ttype);
2060 register_node_type_sh_brightcontrast(ttype);
2061 register_node_type_sh_value(ttype);
2062 register_node_type_sh_rgb(ttype);
2063 register_node_type_sh_mix_rgb(ttype);
2064 register_node_type_sh_valtorgb(ttype);
2065 register_node_type_sh_rgbtobw(ttype);
2066 register_node_type_sh_texture(ttype);
2067 register_node_type_sh_normal(ttype);
2068 register_node_type_sh_geom(ttype);
2069 register_node_type_sh_mapping(ttype);
2070 register_node_type_sh_curve_vec(ttype);
2071 register_node_type_sh_curve_rgb(ttype);
2072 register_node_type_sh_math(ttype);
2073 register_node_type_sh_vect_math(ttype);
2074 register_node_type_sh_squeeze(ttype);
2075 register_node_type_sh_material_ext(ttype);
2076 register_node_type_sh_invert(ttype);
2077 register_node_type_sh_seprgb(ttype);
2078 register_node_type_sh_combrgb(ttype);
2079 register_node_type_sh_hue_sat(ttype);
2081 register_node_type_sh_attribute(ttype);
2082 register_node_type_sh_geometry(ttype);
2083 register_node_type_sh_light_path(ttype);
2084 register_node_type_sh_light_falloff(ttype);
2085 register_node_type_sh_object_info(ttype);
2086 register_node_type_sh_fresnel(ttype);
2087 register_node_type_sh_layer_weight(ttype);
2088 register_node_type_sh_tex_coord(ttype);
2089 register_node_type_sh_particle_info(ttype);
2091 register_node_type_sh_background(ttype);
2092 register_node_type_sh_bsdf_diffuse(ttype);
2093 register_node_type_sh_bsdf_glossy(ttype);
2094 register_node_type_sh_bsdf_glass(ttype);
2095 register_node_type_sh_bsdf_translucent(ttype);
2096 register_node_type_sh_bsdf_transparent(ttype);
2097 register_node_type_sh_bsdf_velvet(ttype);
2098 register_node_type_sh_emission(ttype);
2099 register_node_type_sh_holdout(ttype);
2100 //register_node_type_sh_volume_transparent(ttype);
2101 //register_node_type_sh_volume_isotropic(ttype);
2102 register_node_type_sh_mix_shader(ttype);
2103 register_node_type_sh_add_shader(ttype);
2105 register_node_type_sh_output_lamp(ttype);
2106 register_node_type_sh_output_material(ttype);
2107 register_node_type_sh_output_world(ttype);
2109 register_node_type_sh_tex_image(ttype);
2110 register_node_type_sh_tex_environment(ttype);
2111 register_node_type_sh_tex_sky(ttype);
2112 register_node_type_sh_tex_noise(ttype);
2113 register_node_type_sh_tex_wave(ttype);
2114 register_node_type_sh_tex_voronoi(ttype);
2115 register_node_type_sh_tex_musgrave(ttype);
2116 register_node_type_sh_tex_gradient(ttype);
2117 register_node_type_sh_tex_magic(ttype);
2118 register_node_type_sh_tex_checker(ttype);
2121 static void registerTextureNodes(bNodeTreeType *ttype)
2123 register_node_type_frame(ttype);
2124 register_node_type_reroute(ttype);
2126 register_node_type_tex_group(ttype);
2127 // register_node_type_tex_forloop(ttype);
2128 // register_node_type_tex_whileloop(ttype);
2130 register_node_type_tex_math(ttype);
2131 register_node_type_tex_mix_rgb(ttype);
2132 register_node_type_tex_valtorgb(ttype);
2133 register_node_type_tex_rgbtobw(ttype);
2134 register_node_type_tex_valtonor(ttype);
2135 register_node_type_tex_curve_rgb(ttype);
2136 register_node_type_tex_curve_time(ttype);
2137 register_node_type_tex_invert(ttype);
2138 register_node_type_tex_hue_sat(ttype);
2139 register_node_type_tex_coord(ttype);
2140 register_node_type_tex_distance(ttype);
2141 register_node_type_tex_compose(ttype);
2142 register_node_type_tex_decompose(ttype);
2144 register_node_type_tex_output(ttype);
2145 register_node_type_tex_viewer(ttype);
2147 register_node_type_tex_checker(ttype);
2148 register_node_type_tex_texture(ttype);
2149 register_node_type_tex_bricks(ttype);
2150 register_node_type_tex_image(ttype);
2152 register_node_type_tex_rotate(ttype);
2153 register_node_type_tex_translate(ttype);
2154 register_node_type_tex_scale(ttype);
2155 register_node_type_tex_at(ttype);
2157 register_node_type_tex_proc_voronoi(ttype);
2158 register_node_type_tex_proc_blend(ttype);
2159 register_node_type_tex_proc_magic(ttype);
2160 register_node_type_tex_proc_marble(ttype);
2161 register_node_type_tex_proc_clouds(ttype);
2162 register_node_type_tex_proc_wood(ttype);
2163 register_node_type_tex_proc_musgrave(ttype);
2164 register_node_type_tex_proc_noise(ttype);
2165 register_node_type_tex_proc_stucci(ttype);
2166 register_node_type_tex_proc_distnoise(ttype);
2169 static void free_typeinfos(ListBase *list)
2171 bNodeType *ntype, *next;
2172 for (ntype = list->first; ntype; ntype = next) {
2175 if (ntype->needs_free)
2180 void init_nodesystem(void)
2182 /* init clipboard */
2183 node_clipboard.nodes.first = node_clipboard.nodes.last = NULL;
2184 node_clipboard.links.first = node_clipboard.links.last = NULL;
2186 registerCompositNodes(ntreeGetType(NTREE_COMPOSIT));
2187 registerShaderNodes(ntreeGetType(NTREE_SHADER));
2188 registerTextureNodes(ntreeGetType(NTREE_TEXTURE));
2191 void free_nodesystem(void)
2193 free_typeinfos(&ntreeGetType(NTREE_COMPOSIT)->node_types);
2194 free_typeinfos(&ntreeGetType(NTREE_SHADER)->node_types);
2195 free_typeinfos(&ntreeGetType(NTREE_TEXTURE)->node_types);
2198 /* called from BKE_scene_unlink, when deleting a scene goes over all scenes
2199 * other than the input, checks if they have render layer nodes referencing
2200 * the to-be-deleted scene, and resets them to NULL. */
2202 /* XXX needs to get current scene then! */
2203 void clear_scene_in_nodes(Main *bmain, Scene *sce)
2208 for (sce1 = bmain->scene.first; sce1; sce1 = sce1->id.next) {
2210 if (sce1->nodetree) {
2211 for (node = sce1->nodetree->nodes.first; node; node = node->next) {
2212 if (node->type == CMP_NODE_R_LAYERS) {
2213 Scene *nodesce = (Scene *)node->id;
2215 if (nodesce == sce) node->id = NULL;