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:
authorLukas Toenne <lukas.toenne@googlemail.com>2012-02-27 21:38:16 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2012-02-27 21:38:16 +0400
commit050428049f1f10ac2c8b6ccf7d775c6d9dcfe2ba (patch)
tree36987af8cfe4c4401bdab6b5a99ea3097fa056fd /source/blender/nodes
parentd55c1d59f91a919c8d4b935136454200adb0b8e8 (diff)
Implements a new operator for detaching nodes. In the process i overhauled the node muting system as well.
There are a number of features that use a kind of "internal linking" in nodes: 1. muting 2. delete + reconnect (restore link to/from node after delete) 3. the new detach operator (same as 2, but don't delete the node) The desired behavior in all cases is the same: find a sensible mapping of inputs-to-outputs of a node. In the case of muting these links are displayed in red on the node itself. For the other operators they are used to relink connections, such that one gets the best possible ongoing link between previous up- and downstream nodes. Muting previously used a complicated callback system to ensure consistent behavior in the editor as well as execution in compositor, shader cpu/gpu and texture nodes. This has been greatly simplified by moving the muting step into the node tree localization functions. Any muted node is now bypassed using the generalized nodeInternalRelink function and then removed from the local tree. This way the internal execution system doesn't have to deal with muted nodes at all, as if they are non-existent. The same function is also used by the delete_reconnect and the new links_detach operators (which work directly in the editor node tree). Detaching nodes is currently keymapped as a translation variant (macro operator): pressing ALTKEY + moving node first detaches and then continues with regular transform operator. The default key is ALT+DKEY though, instead ALT+GKEY, since the latter is already used for the ungroup operator.
Diffstat (limited to 'source/blender/nodes')
-rw-r--r--source/blender/nodes/composite/node_composite_tree.c32
-rw-r--r--source/blender/nodes/composite/node_composite_util.c26
-rw-r--r--source/blender/nodes/composite/node_composite_util.h1
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_composite.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_outputFile.c16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_splitViewer.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_viewer.c3
-rw-r--r--source/blender/nodes/intern/node_exec.c8
-rw-r--r--source/blender/nodes/intern/node_util.c54
-rw-r--r--source/blender/nodes/intern/node_util.h9
-rw-r--r--source/blender/nodes/shader/node_shader_tree.c21
-rw-r--r--source/blender/nodes/shader/node_shader_util.c59
-rw-r--r--source/blender/nodes/shader/node_shader_util.h3
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output.c3
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output_lamp.c3
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output_material.c3
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output_world.c3
-rw-r--r--source/blender/nodes/texture/node_texture_tree.c21
-rw-r--r--source/blender/nodes/texture/node_texture_util.c92
-rw-r--r--source/blender/nodes/texture/node_texture_util.h2
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_output.c2
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_viewer.c2
22 files changed, 90 insertions, 279 deletions
diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c
index 8257b850010..0ebed7105f0 100644
--- a/source/blender/nodes/composite/node_composite_tree.c
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -121,9 +121,9 @@ static void update_node(bNodeTree *ntree, bNode *node)
}
/* local tree then owns all compbufs */
-static void localize(bNodeTree *UNUSED(localtree), bNodeTree *ntree)
+static void localize(bNodeTree *localtree, bNodeTree *ntree)
{
- bNode *node;
+ bNode *node, *node_next;
bNodeSocket *sock;
for(node= ntree->nodes.first; node; node= node->next) {
@@ -150,6 +150,26 @@ static void localize(bNodeTree *UNUSED(localtree), bNodeTree *ntree)
sock->new_sock->new_sock= sock;
}
}
+
+ /* replace muted nodes by internal links */
+ for (node= localtree->nodes.first; node; node= node_next) {
+ node_next = node->next;
+
+ if (node->flag & NODE_MUTED) {
+ /* make sure the update tag isn't lost when removing the muted node.
+ * propagate this to all downstream nodes.
+ */
+ if (node->need_exec) {
+ bNodeLink *link;
+ for (link=localtree->links.first; link; link=link->next)
+ if (link->fromnode==node && link->tonode)
+ link->tonode->need_exec = 1;
+ }
+
+ nodeInternalRelink(localtree, node);
+ nodeFreeNode(localtree, node);
+ }
+ }
}
static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
@@ -230,9 +250,7 @@ bNodeTreeType ntreeType_Composite = {
/* update */ update,
/* update_node */ update_node,
/* validate_link */ NULL,
- /* mutefunc */ node_compo_pass_on,
- /* mutelinksfunc */ node_mute_get_links,
- /* gpumutefunc */ NULL
+ /* internal_connect */ node_internal_connect_default
};
@@ -360,9 +378,7 @@ static void *exec_composite_node(void *nodeexec_v)
node_get_stack(node, thd->stack, nsin, nsout);
- if((node->flag & NODE_MUTED) && node->typeinfo->mutefunc)
- node->typeinfo->mutefunc(thd->rd, 0, node, nodeexec->data, nsin, nsout);
- else if(node->typeinfo->execfunc)
+ if(node->typeinfo->execfunc)
node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
else if (node->typeinfo->newexecfunc)
node->typeinfo->newexecfunc(thd->rd, 0, node, nodeexec->data, nsin, nsout);
diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c
index 45f490729e8..f51cd008904 100644
--- a/source/blender/nodes/composite/node_composite_util.c
+++ b/source/blender/nodes/composite/node_composite_util.c
@@ -130,32 +130,6 @@ void compbuf_set_node(CompBuf *cbuf, bNode *node)
if (cbuf) cbuf->node = node;
}
-/* used for disabling node (similar code in node_draw.c for disable line and node_edit for untangling nodes) */
-void node_compo_pass_on(void *UNUSED(data), int UNUSED(thread), struct bNode *node, void *UNUSED(nodedata),
- struct bNodeStack **in, struct bNodeStack **out)
-{
- ListBase links;
- LinkInOutsMuteNode *lnk;
- int i;
-
- if(node->typeinfo->mutelinksfunc == NULL)
- return;
-
- /* Get default muting links (as bNodeStack pointers). */
- links = node->typeinfo->mutelinksfunc(NULL, node, in, out, NULL, NULL);
-
- for(lnk = links.first; lnk; lnk = lnk->next) {
- for(i = 0; i < lnk->num_outs; i++) {
- if(((bNodeStack*)(lnk->in))->data)
- (((bNodeStack*)(lnk->outs))+i)->data = pass_on_compbuf((CompBuf*)((bNodeStack*)(lnk->in))->data);
- }
- /* If num_outs > 1, lnk->outs was an allocated table of pointers... */
- if(i > 1)
- MEM_freeN(lnk->outs);
- }
- BLI_freelistN(&links);
-}
-
CompBuf *get_cropped_compbuf(rcti *drect, float *rectf, int rectx, int recty, int type)
{
diff --git a/source/blender/nodes/composite/node_composite_util.h b/source/blender/nodes/composite/node_composite_util.h
index 5e63750e131..3efdf76f233 100644
--- a/source/blender/nodes/composite/node_composite_util.h
+++ b/source/blender/nodes/composite/node_composite_util.h
@@ -124,7 +124,6 @@ CompBuf *pass_on_compbuf(CompBuf *cbuf);
void free_compbuf(CompBuf *cbuf);
void print_compbuf(char *str, CompBuf *cbuf);
void compbuf_set_node(struct CompBuf *cbuf, struct bNode *node);
-void node_compo_pass_on(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out);
CompBuf *get_cropped_compbuf(rcti *drect, float *rectf, int rectx, int recty, int type);
CompBuf *scalefast_compbuf(CompBuf *inbuf, int newx, int newy);
diff --git a/source/blender/nodes/composite/nodes/node_composite_composite.c b/source/blender/nodes/composite/nodes/node_composite_composite.c
index a5f90d31643..73a84676caa 100644
--- a/source/blender/nodes/composite/nodes/node_composite_composite.c
+++ b/source/blender/nodes/composite/nodes/node_composite_composite.c
@@ -106,7 +106,7 @@ void register_node_type_cmp_composite(bNodeTreeType *ttype)
node_type_size(&ntype, 80, 60, 200);
node_type_exec(&ntype, node_composit_exec_composite);
/* Do not allow muting for this node. */
- node_type_mute(&ntype, NULL, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
index 02df603f494..66075f1bba4 100644
--- a/source/blender/nodes/composite/nodes/node_composite_outputFile.c
+++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
@@ -97,13 +97,6 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
}
}
-static void node_composit_mute_output_file(void *UNUSED(data), int UNUSED(thread),
- struct bNode *UNUSED(node), void *UNUSED(nodedata),
- struct bNodeStack **UNUSED(in), struct bNodeStack **UNUSED(out))
-{
- /* nothing to do here */
-}
-
static void node_composit_init_output_file(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *ntemp)
{
RenderData *rd = &ntemp->scene->r;
@@ -129,7 +122,6 @@ void register_node_type_cmp_output_file(bNodeTreeType *ttype)
node_type_init(&ntype, node_composit_init_output_file);
node_type_storage(&ntype, "NodeImageFile", node_free_standard_storage, node_copy_standard_storage);
node_type_exec(&ntype, node_composit_exec_output_file);
- node_type_mute(&ntype, node_composit_mute_output_file, NULL);
nodeRegisterType(ttype, &ntype);
}
@@ -261,13 +253,6 @@ static void exec_output_multi_file(void *data, bNode *node, bNodeStack **in, bNo
}
}
-static void mute_output_multi_file(void *UNUSED(data), int UNUSED(thread),
- struct bNode *UNUSED(node), void *UNUSED(nodedata),
- struct bNodeStack **UNUSED(in), struct bNodeStack **UNUSED(out))
-{
- /* nothing to do here */
-}
-
void register_node_type_cmp_output_multi_file(bNodeTreeType *ttype)
{
static bNodeType ntype;
@@ -278,7 +263,6 @@ void register_node_type_cmp_output_multi_file(bNodeTreeType *ttype)
node_type_init(&ntype, init_output_multi_file);
node_type_storage(&ntype, "NodeImageMultiFile", free_output_multi_file, copy_output_multi_file);
node_type_exec(&ntype, exec_output_multi_file);
- node_type_mute(&ntype, mute_output_multi_file, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
index bc8bc7c84d1..16356098fe6 100644
--- a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
@@ -159,8 +159,8 @@ void register_node_type_cmp_splitviewer(bNodeTreeType *ttype)
node_type_init(&ntype, node_composit_init_splitviewer);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
node_type_exec(&ntype, node_composit_exec_splitviewer);
- /* Do not allow muting this node. */
- node_type_mute(&ntype, NULL, NULL);
+ /* Do not allow muting for this node. */
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c
index 6a0c074cdb3..f1a6cae62ab 100644
--- a/source/blender/nodes/composite/nodes/node_composite_viewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c
@@ -141,8 +141,7 @@ void register_node_type_cmp_viewer(bNodeTreeType *ttype)
node_type_init(&ntype, node_composit_init_viewer);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
node_type_exec(&ntype, node_composit_exec_viewer);
- /* Do not allow muting this node. */
- node_type_mute(&ntype, NULL, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c
index 1def0c31983..eaf19ad71b6 100644
--- a/source/blender/nodes/intern/node_exec.c
+++ b/source/blender/nodes/intern/node_exec.c
@@ -280,9 +280,7 @@ void ntreeExecNodes(bNodeTreeExec *exec, void *callerdata, int thread)
* 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)
+ 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);
@@ -308,9 +306,7 @@ void ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *call
* 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)
+ 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 dabad10f568..19b3ba63f9a 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -98,60 +98,42 @@ const char *node_filter_label(bNode *node)
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)
+ListBase node_internal_connect_default(bNodeTree *ntree, bNode *node)
{
static int types[] = { SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA };
- bNodeLink link = {NULL};
+ bNodeLink *link;
+ bNodeSocket *fromsock, *tosock;
ListBase ret;
- LinkInOutsMuteNode *lnk;
int in, out, i;
ret.first = ret.last = NULL;
/* Security check! */
- if(!(ntree || (nsin && nsout) || (gnsin && gnsout)))
+ if(!ntree)
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))
+ for (in=0, fromsock=node->inputs.first; fromsock; in++, fromsock=fromsock->next) {
+ if (fromsock->type==types[i] && nodeCountSocketLinks(ntree, fromsock) > 0)
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))
+ if (fromsock) {
+ for (out=0, tosock=node->outputs.first; tosock; out++, tosock=tosock->next) {
+ if (tosock->type==types[i] && (nodeCountSocketLinks(ntree, tosock) > 0))
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);
- }
+ if (tosock) {
+ link = MEM_callocN(sizeof(bNodeLink), "internal node link");
+ link->fromnode = node;
+ link->fromsock = fromsock;
+ link->tonode = node;
+ link->tosock = tosock;
+ /* internal link is always valid */
+ link->flag |= NODE_LINK_VALID;
+ BLI_addtail(&ret, link);
}
}
}
diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h
index 4a5e8765ba2..98afc319214 100644
--- a/source/blender/nodes/intern/node_util.h
+++ b/source/blender/nodes/intern/node_util.h
@@ -61,14 +61,7 @@ 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);
+ListBase node_internal_connect_default(struct bNodeTree *ntree, struct bNode *node);
#endif
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
index b3144ff6830..b1e1989da86 100644
--- a/source/blender/nodes/shader/node_shader_tree.c
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -95,6 +95,21 @@ static void foreach_nodeclass(Scene *scene, void *calldata, bNodeClassCallback f
func(calldata, NODE_CLASS_LAYOUT, IFACE_("Layout"));
}
+static void localize(bNodeTree *localtree, bNodeTree *UNUSED(ntree))
+{
+ bNode *node, *node_next;
+
+ /* replace muted nodes by internal links */
+ for (node= localtree->nodes.first; node; node= node_next) {
+ node_next = node->next;
+
+ if (node->flag & NODE_MUTED) {
+ nodeInternalRelink(localtree, node);
+ nodeFreeNode(localtree, node);
+ }
+ }
+}
+
static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
{
bNode *lnode;
@@ -130,15 +145,13 @@ bNodeTreeType ntreeType_Shader = {
/* free_node_cache */ NULL,
/* foreach_nodetree */ foreach_nodetree,
/* foreach_nodeclass */ foreach_nodeclass,
- /* localize */ NULL,
+ /* localize */ localize,
/* local_sync */ local_sync,
/* local_merge */ NULL,
/* update */ update,
/* update_node */ NULL,
/* validate_link */ NULL,
- /* mute node */ node_shader_pass_on,
- /* mute links node */ node_mute_get_links,
- /* gpu mute node */ gpu_shader_pass_on
+ /* internal_connect */ node_internal_connect_default
};
/* GPU material from shader nodes */
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c
index 1bfb986fdde..1a9a0fc4b3e 100644
--- a/source/blender/nodes/shader/node_shader_util.c
+++ b/source/blender/nodes/shader/node_shader_util.c
@@ -76,56 +76,6 @@ void nodestack_get_vec(float *in, short type_in, bNodeStack *ns)
}
-/* ******************* execute and parse ************ */
-
-/* Used for muted nodes, just copy the vec data from input to output… */
-void node_shader_pass_on(void *UNUSED(data), int UNUSED(thread), struct bNode *node, void *UNUSED(nodedata),
- struct bNodeStack **in, struct bNodeStack **out)
-{
- ListBase links;
- LinkInOutsMuteNode *lnk;
- int i;
-
- if(node->typeinfo->mutelinksfunc == NULL)
- return;
-
- /* Get default muting links (as bNodeStack pointers). */
- links = node->typeinfo->mutelinksfunc(NULL, node, in, out, NULL, NULL);
-
- for(lnk = links.first; lnk; lnk = lnk->next) {
- for(i = 0; i < lnk->num_outs; i++) {
- copy_v4_v4((((bNodeStack*)(lnk->outs))+i)->vec, ((bNodeStack*)(lnk->in))->vec);
- }
- /* If num_outs > 1, lnk->outs was an allocated table of pointers... */
- if(i > 1)
- MEM_freeN(lnk->outs);
- }
- BLI_freelistN(&links);
-}
-
-int gpu_shader_pass_on(struct GPUMaterial *mat, struct bNode *node, void *UNUSED(nodedata),
- struct GPUNodeStack *in, struct GPUNodeStack *out)
-{
- ListBase links;
- LinkInOutsMuteNode *lnk;
-
- if(node->typeinfo->mutelinksfunc == NULL)
- return 0;
-
- /* Get default muting links (as GPUNodeStack pointers). */
- links = node->typeinfo->mutelinksfunc(NULL, node, NULL, NULL, in, out);
-
- for(lnk = links.first; lnk; lnk = lnk->next) {
- GPU_stack_link_mute(mat, "copy_raw", lnk);
- /* If num_outs > 1, lnk->outs was an allocated table of pointers... */
- if(lnk->num_outs > 1)
- MEM_freeN(lnk->outs);
- }
-
- BLI_freelistN(&links);
- return 1;
-}
-
/* go over all used Geometry and Texture nodes, and return a texco flag */
/* no group inside needed, this function is called for groups too */
void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mode)
@@ -343,14 +293,7 @@ void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs)
doit = 1;
if (doit) {
- if((node->flag & NODE_MUTED) && node->typeinfo->gpumutefunc) {
- node_get_stack(node, stack, nsin, nsout);
- gpu_stack_from_data_list(gpuin, &node->inputs, nsin);
- gpu_stack_from_data_list(gpuout, &node->outputs, nsout);
- if(node->typeinfo->gpumutefunc(mat, node, nodeexec->data, gpuin, gpuout))
- data_from_gpu_stack_list(&node->outputs, nsout, gpuout);
- }
- else if(node->typeinfo->gpufunc) {
+ if(node->typeinfo->gpufunc) {
node_get_stack(node, stack, nsin, nsout);
gpu_stack_from_data_list(gpuin, &node->inputs, nsin);
gpu_stack_from_data_list(gpuout, &node->outputs, nsout);
diff --git a/source/blender/nodes/shader/node_shader_util.h b/source/blender/nodes/shader/node_shader_util.h
index 76d3d933fdb..37c272ad61d 100644
--- a/source/blender/nodes/shader/node_shader_util.h
+++ b/source/blender/nodes/shader/node_shader_util.h
@@ -128,7 +128,4 @@ void node_shader_gpu_tex_mapping(struct GPUMaterial *mat, struct bNode *node, st
void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, int do_outputs);
-void node_shader_pass_on(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out);
-int gpu_shader_pass_on(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
-
#endif
diff --git a/source/blender/nodes/shader/nodes/node_shader_output.c b/source/blender/nodes/shader/nodes/node_shader_output.c
index 5bc61859a0a..4a4a2010d59 100644
--- a/source/blender/nodes/shader/nodes/node_shader_output.c
+++ b/source/blender/nodes/shader/nodes/node_shader_output.c
@@ -90,8 +90,7 @@ void register_node_type_sh_output(bNodeTreeType *ttype)
node_type_gpu(&ntype, gpu_shader_output);
/* Do not allow muting output node. */
- node_type_mute(&ntype, NULL, NULL);
- node_type_gpu_mute(&ntype, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_output_lamp.c b/source/blender/nodes/shader/nodes/node_shader_output_lamp.c
index cf2542c948c..f6d5e789b3f 100644
--- a/source/blender/nodes/shader/nodes/node_shader_output_lamp.c
+++ b/source/blender/nodes/shader/nodes/node_shader_output_lamp.c
@@ -49,8 +49,7 @@ void register_node_type_sh_output_lamp(bNodeTreeType *ttype)
node_type_gpu(&ntype, NULL);
/* Do not allow muting output node. */
- node_type_mute(&ntype, NULL, NULL);
- node_type_gpu_mute(&ntype, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_output_material.c b/source/blender/nodes/shader/nodes/node_shader_output_material.c
index 298df3bb66f..13d8ff1c23f 100644
--- a/source/blender/nodes/shader/nodes/node_shader_output_material.c
+++ b/source/blender/nodes/shader/nodes/node_shader_output_material.c
@@ -62,8 +62,7 @@ void register_node_type_sh_output_material(bNodeTreeType *ttype)
node_type_gpu(&ntype, node_shader_gpu_output_material);
/* Do not allow muting output node. */
- node_type_mute(&ntype, NULL, NULL);
- node_type_gpu_mute(&ntype, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_output_world.c b/source/blender/nodes/shader/nodes/node_shader_output_world.c
index 711f591c192..5063d0b50aa 100644
--- a/source/blender/nodes/shader/nodes/node_shader_output_world.c
+++ b/source/blender/nodes/shader/nodes/node_shader_output_world.c
@@ -50,8 +50,7 @@ void register_node_type_sh_output_world(bNodeTreeType *ttype)
node_type_gpu(&ntype, NULL);
/* Do not allow muting output node. */
- node_type_mute(&ntype, NULL, NULL);
- node_type_gpu_mute(&ntype, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c
index 1e171bd8a46..2795cbd3e5a 100644
--- a/source/blender/nodes/texture/node_texture_tree.c
+++ b/source/blender/nodes/texture/node_texture_tree.c
@@ -77,6 +77,21 @@ static void foreach_nodeclass(Scene *UNUSED(scene), void *calldata, bNodeClassCa
func(calldata, NODE_CLASS_LAYOUT, IFACE_("Layout"));
}
+static void localize(bNodeTree *localtree, bNodeTree *UNUSED(ntree))
+{
+ bNode *node, *node_next;
+
+ /* replace muted nodes by internal links */
+ for (node= localtree->nodes.first; node; node= node_next) {
+ node_next = node->next;
+
+ if (node->flag & NODE_MUTED) {
+ nodeInternalRelink(localtree, node);
+ nodeFreeNode(localtree, node);
+ }
+ }
+}
+
static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
{
bNode *lnode;
@@ -107,15 +122,13 @@ bNodeTreeType ntreeType_Texture = {
/* free_node_cache */ NULL,
/* foreach_nodetree */ foreach_nodetree,
/* foreach_nodeclass */ foreach_nodeclass,
- /* localize */ NULL,
+ /* localize */ localize,
/* local_sync */ local_sync,
/* local_merge */ NULL,
/* update */ NULL,
/* update_node */ NULL,
/* validate_link */ NULL,
- /* mute node */ node_tex_pass_on,
- /* mute links node */ node_mute_get_links,
- /* gpu mute node */ NULL
+ /* internal_connect */ node_internal_connect_default
};
int ntreeTexTagAnimated(bNodeTree *ntree)
diff --git a/source/blender/nodes/texture/node_texture_util.c b/source/blender/nodes/texture/node_texture_util.c
index 06ee4b0a53d..c3d298d1ecd 100644
--- a/source/blender/nodes/texture/node_texture_util.c
+++ b/source/blender/nodes/texture/node_texture_util.c
@@ -143,98 +143,6 @@ void tex_output(bNode *node, bNodeStack **in, bNodeStack *out, TexFn texfn, TexC
dg->type = out->sockettype;
}
-/* Used for muted nodes, just pass the TexDelegate data from input to output…
- * XXX That *%!?¿§ callback TextureDelegate system is a nightmare here!
- * So I have to use an ugly hack (checking inputs twice!)… Yuk!
- * I’d be very happy if someone can imagine a better solution
- * (without changing the whole stuff).
- * WARNING: These are only suitable for default muting behavior. If you want a custom
- * one for your texnode, you must not use them!
- */
-static void passonvalfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
-{
- bNodeSocket *sock;
- int i;
-
- /* test the inputs */
- for(i=0, sock = node->inputs.first; sock; sock = sock->next, i++) {
- if(sock->link && sock->type==SOCK_FLOAT && in) {
- out[0] = tex_input_value(in[i], p, thread);
- break;
- }
- }
-}
-
-static void passonvecfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
-{
- bNodeSocket *sock;
- int i;
-
- /* test the inputs */
- for(i=0, sock = node->inputs.first; sock; sock = sock->next, i++) {
- if(sock->link && sock->type==SOCK_VECTOR && in) {
- tex_input_vec(out, in[i], p, thread);
- break;
- }
- }
-}
-
-static void passoncolfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
-{
- bNodeSocket *sock;
- int i;
-
- /* test the inputs */
- for(i=0, sock = node->inputs.first; sock; sock = sock->next, i++) {
- if(sock->link && sock->type==SOCK_RGBA && in) {
- tex_input_rgba(out, in[i], p, thread);
- break;
- }
- }
-}
-
-void node_tex_pass_on(void *data, int UNUSED(thread), struct bNode *node, void *UNUSED(nodedata),
- struct bNodeStack **in, struct bNodeStack **out)
-{
- ListBase links;
- LinkInOutsMuteNode *lnk;
- int i;
-
- if(node->typeinfo->mutelinksfunc == NULL)
- return;
-
- /* Get default muting links (as bNodeStack pointers). */
- links = node->typeinfo->mutelinksfunc(NULL, node, in, out, NULL, NULL);
-
- for(lnk = links.first; lnk; lnk = lnk->next) {
- /* XXX This breaks the generality of the system.
- * Again, unfortunately, I see no other way to do due to tex nodes behavior...
- */
- void (*passonfn)(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread);
- switch(((bNodeStack*)(lnk->in))->sockettype) {
- case SOCK_FLOAT:
- passonfn = passonvalfn;
- break;
- case SOCK_VECTOR:
- passonfn = passonvecfn;
- break;
- case SOCK_RGBA:
- passonfn = passoncolfn;
- break;
- default:
- passonfn = NULL;
- }
- for(i = 0; i < lnk->num_outs; i++) {
- if(((bNodeStack*)(lnk->in))->data && passonfn)
- tex_output(node, in, ((bNodeStack*)(lnk->outs))+i, passonfn, data);
- }
- /* If num_outs > 1, lnk->outs was an allocated table of pointers... */
- if(i > 1)
- MEM_freeN(lnk->outs);
- }
- BLI_freelistN(&links);
-}
-
void ntreeTexCheckCyclics(struct bNodeTree *ntree)
{
bNode *node;
diff --git a/source/blender/nodes/texture/node_texture_util.h b/source/blender/nodes/texture/node_texture_util.h
index a0b219804b9..c9a5a02e277 100644
--- a/source/blender/nodes/texture/node_texture_util.h
+++ b/source/blender/nodes/texture/node_texture_util.h
@@ -119,6 +119,4 @@ void tex_do_preview(bNode *node, float *coord, float *col);
void params_from_cdata(TexParams *out, TexCallData *in);
-void node_tex_pass_on(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out);
-
#endif
diff --git a/source/blender/nodes/texture/nodes/node_texture_output.c b/source/blender/nodes/texture/nodes/node_texture_output.c
index 829cd06dfc0..36b31a864a5 100644
--- a/source/blender/nodes/texture/nodes/node_texture_output.c
+++ b/source/blender/nodes/texture/nodes/node_texture_output.c
@@ -169,7 +169,7 @@ void register_node_type_tex_output(bNodeTreeType *ttype)
node_type_exec(&ntype, exec);
/* Do not allow muting output. */
- node_type_mute(&ntype, NULL, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}
diff --git a/source/blender/nodes/texture/nodes/node_texture_viewer.c b/source/blender/nodes/texture/nodes/node_texture_viewer.c
index a588f13f18f..401e72761e3 100644
--- a/source/blender/nodes/texture/nodes/node_texture_viewer.c
+++ b/source/blender/nodes/texture/nodes/node_texture_viewer.c
@@ -66,7 +66,7 @@ void register_node_type_tex_viewer(bNodeTreeType *ttype)
node_type_exec(&ntype, exec);
/* Do not allow muting viewer node. */
- node_type_mute(&ntype, NULL, NULL);
+ node_type_internal_connect(&ntype, NULL);
nodeRegisterType(ttype, &ntype);
}