Commit: af073e149b3c734f70bb13f20a4e18682885342e
Author: Brecht Van Lommel
Date:   Sun May 29 13:26:41 2016 +0200
Branches: master
https://developer.blender.org/rBaf073e149b3c734f70bb13f20a4e18682885342e

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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to