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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-06-23 23:24:32 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-06-23 23:24:32 +0400
commit8acdc0515db613cb8dbeaa3152472fd61559bde5 (patch)
tree243498e40b849069bfca27ed29b15a716d1b4ada /intern
parentd7b99389ba97d2561e01e79d2abfe14703121dbf (diff)
Fix #35847: cycles group nodes did not work well exposing inputs like normal or
texture coordinate that should automatically use the default normal or texture coordinate appropriate for that node, rather than some fixed value specified by the user.
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;