Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/nodes/intern')
-rw-r--r--source/blender/nodes/intern/node_exec.c16
-rw-r--r--source/blender/nodes/intern/node_util.c61
-rw-r--r--source/blender/nodes/intern/node_util.h11
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