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
path: root/intern
diff options
context:
space:
mode:
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/render/graph.cpp38
-rw-r--r--intern/cycles/render/graph.h3
-rw-r--r--intern/cycles/render/nodes.cpp7
-rw-r--r--intern/cycles/render/nodes.h2
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;