diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index f9a4a69c954..515bbe92335 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -199,7 +199,7 @@ void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to) } /* add automatic conversion node in case of type mismatch */ - ShaderNode *convert = add(new ConvertNode(from->type, to->type)); + ShaderNode *convert = add(new ConvertNode(from->type, to->type, true)); connect(from, convert->inputs[0]); connect(convert->outputs[0], to); @@ -341,6 +341,24 @@ void ShaderGraph::remove_unneeded_nodes() } else { foreach(ShaderInput *to, links) { + /* remove any autoconvert nodes too if they lead to + * sockets with an automatically set default value */ + ShaderNode *tonode = to->parent; + + if(tonode->special_type == SHADER_SPECIAL_TYPE_AUTOCONVERT) { + bool all_links_removed = true; + + foreach(ShaderInput *autoin, tonode->outputs[0]->links) { + if(autoin->default_value == ShaderInput::NONE) + all_links_removed = false; + else + disconnect(autoin); + } + + if(all_links_removed) + removed[tonode->id] = true; + } + disconnect(to); /* transfer the default input value to the target socket */ @@ -352,10 +370,10 @@ void ShaderGraph::remove_unneeded_nodes() removed[proxy->id] = true; any_node_removed = true; } - - /* remove useless mix closures nodes */ - if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) { + else if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) { MixClosureNode *mix = static_cast(node); + + /* remove useless mix closures nodes */ if(mix->outputs[0]->links.size() && mix->inputs[1]->link == mix->inputs[2]->link) { ShaderOutput *output = mix->inputs[1]->link; vector inputs = mix->outputs[0]->links; @@ -370,15 +388,11 @@ void ShaderGraph::remove_unneeded_nodes() connect(output, input); } } - } - /* remove unused mix closure input when factor is 0.0 or 1.0 */ - if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) { - MixClosureNode *mix = static_cast(node); - /* Check for closure links and make sure factor link is disconnected */ + /* remove unused mix closure input when factor is 0.0 or 1.0 */ + /* check for closure links and make sure factor link is disconnected */ if(mix->outputs[0]->links.size() && mix->inputs[1]->link && mix->inputs[2]->link && !mix->inputs[0]->link) { - - /* Factor 0.0 */ + /* factor 0.0 */ if(mix->inputs[0]->value.x == 0.0f) { ShaderOutput *output = mix->inputs[1]->link; vector inputs = mix->outputs[0]->links; @@ -393,7 +407,7 @@ void ShaderGraph::remove_unneeded_nodes() connect(output, input); } } - /* Factor 1.0 */ + /* factor 1.0 */ else if(mix->inputs[0]->value.x == 1.0f) { ShaderOutput *output = mix->inputs[2]->link; vector inputs = mix->outputs[0]->links; diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h index 5c4a44af3fc..90e4760ba1c 100644 --- a/intern/cycles/render/graph.h +++ b/intern/cycles/render/graph.h @@ -75,7 +75,8 @@ enum ShaderBump { enum ShaderNodeSpecialType { SHADER_SPECIAL_TYPE_NONE, SHADER_SPECIAL_TYPE_PROXY, - SHADER_SPECIAL_TYPE_MIX_CLOSURE + SHADER_SPECIAL_TYPE_MIX_CLOSURE, + SHADER_SPECIAL_TYPE_AUTOCONVERT }; /* Enum diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 3672b893825..029b948332a 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1121,12 +1121,15 @@ void MappingNode::compile(OSLCompiler& compiler) /* Convert */ -ConvertNode::ConvertNode(ShaderSocketType from_, ShaderSocketType to_) +ConvertNode::ConvertNode(ShaderSocketType from_, ShaderSocketType to_, bool autoconvert) : ShaderNode("convert") { from = from_; to = to_; + if(autoconvert) + special_type = SHADER_SPECIAL_TYPE_AUTOCONVERT; + assert(from != to); if(from == SHADER_SOCKET_FLOAT) @@ -1271,7 +1274,7 @@ void ProxyNode::compile(OSLCompiler& compiler) /* BSDF Closure */ BsdfNode::BsdfNode(bool scattering_) -: ShaderNode("subsurface_scattering"), scattering(scattering_) +: ShaderNode("bsdf"), scattering(scattering_) { closure = ccl::CLOSURE_BSSRDF_ID; diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index f19e0742906..78920d589ed 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -182,7 +182,7 @@ public: class ConvertNode : public ShaderNode { public: - ConvertNode(ShaderSocketType from, ShaderSocketType to); + ConvertNode(ShaderSocketType from, ShaderSocketType to, bool autoconvert = false); SHADER_NODE_BASE_CLASS(ConvertNode) ShaderSocketType from, to; diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c index 4b3cd1c22a1..0fd6d871dc1 100644 --- a/source/blender/nodes/intern/node_socket.c +++ b/source/blender/nodes/intern/node_socket.c @@ -308,6 +308,8 @@ void node_socket_copy_default_value(bNodeSocket *to, bNodeSocket *from) break; } } + + to->flag |= (from->flag & SOCK_HIDE_VALUE); } static void standard_node_socket_interface_init_socket(bNodeTree *UNUSED(ntree), bNodeSocket *stemp, bNode *UNUSED(node), bNodeSocket *sock, const char *UNUSED(data_path))