[Bf-blender-cvs] [af073e1] master: Code refactor: pass ShaderInput to constant_fold, so it supports arbitrary types.

Brecht Van Lommel noreply at git.blender.org
Sun May 29 20:33:02 CEST 2016


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




More information about the Bf-blender-cvs mailing list