diff options
Diffstat (limited to 'source/blender/nodes/intern')
-rw-r--r-- | source/blender/nodes/intern/node_exec.c | 16 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_util.c | 61 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_util.h | 11 |
3 files changed, 86 insertions, 2 deletions
diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c index b6374aeb386..1def0c31983 100644 --- a/source/blender/nodes/intern/node_exec.c +++ b/source/blender/nodes/intern/node_exec.c @@ -276,7 +276,13 @@ void ntreeExecNodes(bNodeTreeExec *exec, void *callerdata, int thread) node = nodeexec->node; if(node->need_exec) { node_get_stack(node, exec->stack, nsin, nsout); - if(node->typeinfo->execfunc) + /* Handle muted nodes... + * If the mute func is not set, assume the node should never be muted, + * and hence execute it! + */ + if((node->flag & NODE_MUTED) && node->typeinfo->mutefunc) + node->typeinfo->mutefunc(callerdata, thread, node, nodeexec->data, nsin, nsout); + else if(node->typeinfo->execfunc) node->typeinfo->execfunc(callerdata, node, nsin, nsout); else if (node->typeinfo->newexecfunc) node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout); @@ -298,7 +304,13 @@ void ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *call node = nodeexec->node; if(node->need_exec) { node_get_stack(node, nts->stack, nsin, nsout); - if(node->typeinfo->execfunc) + /* Handle muted nodes... + * If the mute func is not set, assume the node should never be muted, + * and hence execute it! + */ + if((node->flag & NODE_MUTED) && node->typeinfo->mutefunc) + node->typeinfo->mutefunc(callerdata, thread, node, nodeexec->data, nsin, nsout); + else if(node->typeinfo->execfunc) node->typeinfo->execfunc(callerdata, node, nsin, nsout); else if (node->typeinfo->newexecfunc) node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout); diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c index da85dd0a5ea..dabad10f568 100644 --- a/source/blender/nodes/intern/node_util.c +++ b/source/blender/nodes/intern/node_util.c @@ -97,3 +97,64 @@ const char *node_filter_label(bNode *node) RNA_enum_name(node_filter_items, node->custom1, &name); return name; } + +/* Returns a list of mapping of some input bNodeStack, GPUNodeStack or bNodeSocket + * to one or more outputs of the same type. + * *ntree or (**nsin, **nsout) or (*gnsin, *gnsout) must not be NULL. */ +ListBase node_mute_get_links(bNodeTree *ntree, bNode *node, bNodeStack **nsin, bNodeStack **nsout, + GPUNodeStack *gnsin, GPUNodeStack *gnsout) +{ + static int types[] = { SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA }; + bNodeLink link = {NULL}; + ListBase ret; + LinkInOutsMuteNode *lnk; + int in, out, i; + + ret.first = ret.last = NULL; + + /* Security check! */ + if(!(ntree || (nsin && nsout) || (gnsin && gnsout))) + return ret; + + /* Connect the first input of each type with first output of the same type. */ + + link.fromnode = link.tonode = node; + for (i=0; i < 3; ++i) { + /* find input socket */ + for (in=0, link.fromsock=node->inputs.first; link.fromsock; in++, link.fromsock=link.fromsock->next) { + if (link.fromsock->type==types[i] && (ntree ? nodeCountSocketLinks(ntree, link.fromsock) : nsin ? nsin[in]->hasinput : gnsin[in].hasinput)) + break; + } + if (link.fromsock) { + for (out=0, link.tosock=node->outputs.first; link.tosock; out++, link.tosock=link.tosock->next) { + if (link.tosock->type==types[i] && (ntree ? nodeCountSocketLinks(ntree, link.tosock) : nsout ? nsout[out]->hasoutput : gnsout[out].hasoutput)) + break; + } + if (link.tosock) { + if(nsin && nsout) { + lnk = MEM_mallocN(sizeof(LinkInOutsMuteNode), "Muting node: new in to outs link."); + lnk->in = nsin[in]; + lnk->outs = nsout[out]; + lnk->num_outs = 1; + BLI_addtail(&ret, lnk); + } + else if(gnsin && gnsout) { + lnk = MEM_mallocN(sizeof(LinkInOutsMuteNode), "Muting node: new in to outs link."); + lnk->in = &gnsin[in]; + lnk->outs = &gnsout[out]; + lnk->num_outs = 1; + BLI_addtail(&ret, lnk); + } + else { + lnk = MEM_mallocN(sizeof(LinkInOutsMuteNode), "Muting node: new in to outs link."); + lnk->in = link.fromsock; + lnk->outs = link.tosock; + lnk->num_outs = 1; + BLI_addtail(&ret, lnk); + } + } + } + } + + return ret; +} diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h index d127a49cb4b..7ca090394c3 100644 --- a/source/blender/nodes/intern/node_util.h +++ b/source/blender/nodes/intern/node_util.h @@ -41,6 +41,8 @@ #include "NOD_socket.h" +#include "GPU_material.h" /* For Shader muting GPU code... */ + struct bNodeTree; struct bNode; @@ -59,6 +61,15 @@ const char *node_math_label(struct bNode *node); const char *node_vect_math_label(struct bNode *node); const char *node_filter_label(struct bNode *node); +typedef struct LinkInOutsMuteNode +{ + struct LinkInOutsMuteNode *next, *prev; + void *in, *outs; + unsigned int num_outs; /* If > 1, outs is an array of pointers that need to be freed too! */ +} LinkInOutsMuteNode; +ListBase node_mute_get_links(struct bNodeTree *ntree, struct bNode *node, struct bNodeStack **nsin, + struct bNodeStack **nsout, struct GPUNodeStack *gnsin, struct GPUNodeStack *gnsout); + #endif // this is needed for inlining behaviour |