[Bf-blender-cvs] [10d3aca] compositor-2016: Code refactor: pass ShaderInput to constant_fold, so it supports arbitrary types.
Brecht Van Lommel
noreply at git.blender.org
Wed Jun 8 21:51:08 CEST 2016
Commit: 10d3acacf6bc630141796137beb506cd2478eccd
Author: Brecht Van Lommel
Date: Sun May 29 13:26:41 2016 +0200
Branches: compositor-2016
https://developer.blender.org/rB10d3acacf6bc630141796137beb506cd2478eccd
Code refactor: pass ShaderInput to constant_fold, so it supports arbitrary types.
===================================================================
M intern/cycles/blender/blender_shader.cpp
M intern/cycles/render/graph.cpp
M intern/cycles/render/graph.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
M intern/cycles/render/shader.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 7aa099e..5f16c1b 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -179,25 +179,25 @@ static void set_default_value(ShaderInput *input,
/* copy values for non linked inputs */
switch(input->type()) {
case SocketType::FLOAT: {
- input->value_float() = get_float(b_sock.ptr, "default_value");
+ input->set(get_float(b_sock.ptr, "default_value"));
break;
}
case SocketType::INT: {
- input->value_float() = (float)get_int(b_sock.ptr, "default_value");
+ input->set(get_int(b_sock.ptr, "default_value"));
break;
}
case SocketType::COLOR: {
- input->value() = float4_to_float3(get_float4(b_sock.ptr, "default_value"));
+ input->set(float4_to_float3(get_float4(b_sock.ptr, "default_value")));
break;
}
case SocketType::NORMAL:
case SocketType::POINT:
case SocketType::VECTOR: {
- input->value() = get_float3(b_sock.ptr, "default_value");
+ input->set(get_float3(b_sock.ptr, "default_value"));
break;
}
case SocketType::STRING: {
- input->value_string() = (ustring)blender_absolute_path(b_data, b_id, get_string(b_sock.ptr, "default_value"));
+ input->set((ustring)blender_absolute_path(b_data, b_id, get_string(b_sock.ptr, "default_value")));
break;
}
default:
@@ -1225,7 +1225,7 @@ void BlenderSync::sync_materials(bool update_all)
ShaderNode *closure, *out;
closure = graph->add(new DiffuseBsdfNode());
- closure->input("Color")->value() = get_float3(b_mat->diffuse_color());
+ closure->input("Color")->set(get_float3(b_mat->diffuse_color()));
out = graph->output();
graph->connect(closure->output("BSDF"), out->input("Surface"));
@@ -1274,7 +1274,7 @@ void BlenderSync::sync_world(bool update_all)
ShaderNode *closure, *out;
closure = graph->add(new BackgroundNode());
- closure->input("Color")->value() = get_float3(b_world.horizon_color());
+ closure->input("Color")->set(get_float3(b_world.horizon_color()));
out = graph->output();
graph->connect(closure->output("Background"), out->input("Surface"));
@@ -1367,8 +1367,8 @@ void BlenderSync::sync_lamps(bool update_all)
}
closure = graph->add(new EmissionNode());
- closure->input("Color")->value() = get_float3(b_lamp->color());
- closure->input("Strength")->value_float() = strength;
+ closure->input("Color")->set(get_float3(b_lamp->color()));
+ closure->input("Strength")->set(strength);
out = graph->output();
graph->connect(closure->output("Emission"), out->input("Surface"));
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index 62998b0..29c0eec 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -470,8 +470,8 @@ void ShaderGraph::remove_proxy_nodes()
disconnect(to);
/* transfer the default input value to the target socket */
- to->value() = input->value();
- to->value_string() = input->value_string();
+ to->set(input->value());
+ to->set(input->value_string());
}
}
@@ -537,14 +537,13 @@ void ShaderGraph::constant_fold()
}
}
/* Optimize current node. */
- float3 optimized_value = make_float3(0.0f, 0.0f, 0.0f);
- if(node->constant_fold(this, output, &optimized_value)) {
- /* Apply optimized value to connected sockets. */
+ if(node->constant_fold(this, output, output->links[0])) {
+ /* Apply optimized value to other connected sockets and disconnect. */
vector<ShaderInput*> links(output->links);
- foreach(ShaderInput *input, links) {
- /* Assign value and disconnect the optimizedinput. */
- input->value() = optimized_value;
- disconnect(input);
+ for(size_t i = 0; i < links.size(); i++) {
+ if(i > 0)
+ links[i]->set(links[0]->value());
+ disconnect(links[i]);
}
}
}
@@ -935,7 +934,7 @@ void ShaderGraph::transform_multi_closure(ShaderNode *node, ShaderOutput *weight
if(fin->link)
connect(fin->link, fac_in);
else
- fac_in->value_float() = fin->value_float();
+ fac_in->set(fin->value_float());
if(weight_out)
connect(weight_out, weight_in);
@@ -970,12 +969,12 @@ void ShaderGraph::transform_multi_closure(ShaderNode *node, ShaderOutput *weight
if(weight_in->link)
connect(weight_in->link, value1_in);
else
- value1_in->value() = weight_in->value();
+ value1_in->set(weight_in->value_float());
if(weight_out)
connect(weight_out, value2_in);
else
- value2_in->value_float() = 1.0f;
+ value2_in->set(1.0f);
weight_out = math_node->output("Value");
if(weight_in->link)
@@ -986,7 +985,7 @@ void ShaderGraph::transform_multi_closure(ShaderNode *node, ShaderOutput *weight
if(weight_out)
connect(weight_out, weight_in);
else
- weight_in->value_float() += 1.0f;
+ weight_in->set(weight_in->value_float() + 1.0f);
}
}
diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h
index 760b19f..882e495 100644
--- a/intern/cycles/render/graph.h
+++ b/intern/cycles/render/graph.h
@@ -85,6 +85,11 @@ public:
int flags() { return flags_; }
SocketType::Type type() { return type_; }
+ void set(float f) { value_.x = f; }
+ void set(float3 f) { value_ = f; }
+ void set(int i) { value_.x = (float)i; }
+ void set(ustring s) { value_string_ = s; }
+
float3& value() { return value_; }
float& value_float() { return value_.x; }
ustring& value_string() { return value_string_; }
@@ -148,7 +153,7 @@ public:
/* ** Node optimization ** */
/* Check whether the node can be replaced with single constant. */
- virtual bool constant_fold(ShaderGraph * /*graph*/, ShaderOutput * /*socket*/, float3 * /*optimized_value*/) { return false; }
+ virtual bool constant_fold(ShaderGraph * /*graph*/, ShaderOutput * /*socket*/, ShaderInput * /*optimized*/) { return false; }
/* Simplify settings used by artists to the ones which are simpler to
* evaluate in the kernel but keep the final result unchanged.
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 359225c..ea68a67 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -1545,12 +1545,10 @@ RGBToBWNode::RGBToBWNode()
add_output("Val", SocketType::FLOAT);
}
-bool RGBToBWNode::constant_fold(ShaderGraph * /*graph*/,
- ShaderOutput * /*socket*/,
- float3 *optimized_value)
+bool RGBToBWNode::constant_fold(ShaderGraph *, ShaderOutput *, ShaderInput *optimized)
{
if(inputs[0]->link == NULL) {
- optimized_value->x = linear_rgb_to_gray(inputs[0]->value());
+ optimized->set(linear_rgb_to_gray(inputs[0]->value()));
return true;
}
@@ -1624,9 +1622,7 @@ ConvertNode::ConvertNode(SocketType::Type from_, SocketType::Type to_, bool auto
assert(0);
}
-bool ConvertNode::constant_fold(ShaderGraph * /*graph*/,
- ShaderOutput * /*socket*/,
- float3 *optimized_value)
+bool ConvertNode::constant_fold(ShaderGraph *, ShaderOutput *, ShaderInput *optimized)
{
ShaderInput *in = inputs[0];
float3 value = in->value();
@@ -1635,42 +1631,24 @@ bool ConvertNode::constant_fold(ShaderGraph * /*graph*/,
if(in->link == NULL) {
if(from == SocketType::FLOAT) {
- if(to == SocketType::INT)
- /* float to int */
- return false;
- else
- /* float to float3 */
- *optimized_value = make_float3(value.x, value.x, value.x);
- }
- else if(from == SocketType::INT) {
- if(to == SocketType::FLOAT)
- /* int to float */
- return false;
- else
- /* int to vector/point/normal */
- return false;
- }
- else if(to == SocketType::FLOAT) {
- if(from == SocketType::COLOR)
- /* color to float */
- optimized_value->x = linear_rgb_to_gray(value);
- else
- /* vector/point/normal to float */
- optimized_value->x = average(value);
- }
- else if(to == SocketType::INT) {
- if(from == SocketType::COLOR)
- /* color to int */
- return false;
- else
- /* vector/point/normal to int */
- return false;
+ if(SocketType::is_float3(to)) {
+ optimized->set(make_float3(value.x, value.x, value.x));
+ return true;
+ }
}
- else {
- *optimized_value = value;
+ else if(SocketType::is_float3(from)) {
+ if(to == SocketType::FLOAT) {
+ if(from == SocketType::COLOR)
+ optimized->set(linear_rgb_to_gray(value));
+ else
+ optimized->set(average(value));
+ return true;
+ }
+ else if(SocketType::is_float3(to)) {
+ optimized->set(value);
+ return true;
+ }
}
-
- return true;
}
return false;
@@ -2254,7 +2232,7 @@ void EmissionNode::compile(OSLCompiler& compiler)
compiler.add(this, "node_emission");
}
-bool EmissionNode::constant_fold(ShaderGraph * /*graph*/, ShaderOutput * /*socket*/, float3 * /*optimized_value*/)
+bool EmissionNode::constant_fold(ShaderGraph *, ShaderOutput *, ShaderInput *)
{
ShaderInput *color_in = input("Color");
ShaderInput *strength_in = input("Strength");
@@ -2296,7 +2274,7 @@ void BackgroundNode::compile(OSLCompiler& compiler)
compiler.add(this, "node_background");
}
-bool BackgroundNode::constant_fold(ShaderGraph * /*graph*/, ShaderOutput * /*socket*/, float3 * /*optimized_value*/)
+bool BackgroundNode::constant_fold(ShaderGraph *, ShaderOutput *, ShaderInput *)
{
ShaderInput *color_in = input("Color");
ShaderInput *strength_in = input("Strength");
@@ -3147,10 +3125,9 @@ ValueNode::ValueNode()
add_output("Value", SocketType::FLOAT);
}
-bool ValueNode::constant_fold(ShaderGraph * /*graph*/, ShaderOutput * /*socket*/,
- float3 *optimized_value)
+bool ValueNode::constant_fold(ShaderGraph *, ShaderOutput *, ShaderInput *optimized)
{
- *optimized_value = make_float3(value, value, value);
+ optimized->set(value);
return true;
}
@@ -3177,10 +3154,9 @@ ColorNode::ColorNode()
add_output("Color", SocketType::COLOR);
}
-bool ColorNode::constant_fold(ShaderGraph * /*graph*/, ShaderOutput * /*socket*/,
- float3 *optimized_value)
+bool ColorNode::constant_fold(ShaderGr
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list