Merged revision(s) 57671-57767 from trunk/blender into soc-2013-dingto

This commit is contained in:
Thomas Dinges
2013-06-26 11:46:55 +00:00
175 changed files with 1350 additions and 868 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -791,12 +791,16 @@ void Session::update_status_time(bool show_pause, bool show_done)
else
substatus = string_printf("Path Tracing Sample %d/%d", sample+1, tile_manager.num_samples);
if(show_pause)
if(show_pause) {
status = "Paused";
else if(show_done)
}
else if(show_done) {
status = "Done";
else
status = "Rendering";
}
else {
status = substatus;
substatus = "";
}
progress.set_status(status, substatus);