diff options
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/render/graph.cpp | 38 | ||||
-rw-r--r-- | intern/cycles/render/graph.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 7 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 2 |
4 files changed, 34 insertions, 16 deletions
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<MixClosureNode*>(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<ShaderInput*> 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<MixClosureNode*>(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<ShaderInput*> 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<ShaderInput*> 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; |