[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50271] trunk/blender/intern/cycles: clamp for Mix node

Dalai Felinto dfelinto at gmail.com
Thu Aug 30 08:31:03 CEST 2012


Revision: 50271
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50271
Author:   dfelinto
Date:     2012-08-30 06:31:02 +0000 (Thu, 30 Aug 2012)
Log Message:
-----------
clamp for Mix node
the implementation was following my early commit for Math node
I haven't had a chance to run those through Brecht, but would like to do eventually. (they work fine though)

Modified Paths:
--------------
    trunk/blender/intern/cycles/app/cycles_xml.cpp
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/kernel/osl/nodes/node_mix.osl
    trunk/blender/intern/cycles/kernel/svm/svm_mix.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h

Modified: trunk/blender/intern/cycles/app/cycles_xml.cpp
===================================================================
--- trunk/blender/intern/cycles/app/cycles_xml.cpp	2012-08-29 23:37:52 UTC (rev 50270)
+++ trunk/blender/intern/cycles/app/cycles_xml.cpp	2012-08-30 06:31:02 UTC (rev 50271)
@@ -484,6 +484,7 @@
 		else if(string_iequals(node.name(), "mix")) {
 			MixNode *mix = new MixNode();
 			xml_read_enum(&mix->type, MixNode::type_enum, node, "type");
+			xml_read_bool(&mix->use_clamp, node, "use_clamp");
 			snode = mix;
 		}
 		else if(string_iequals(node.name(), "gamma")) {
@@ -515,6 +516,7 @@
 		else if(string_iequals(node.name(), "math")) {
 			MathNode *math = new MathNode();
 			xml_read_enum(&math->type, MathNode::type_enum, node, "type");
+			xml_read_bool(&math->use_clamp, node, "use_clamp");
 			snode = math;
 		}
 		else if(string_iequals(node.name(), "vector_math")) {

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-08-29 23:37:52 UTC (rev 50270)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-08-30 06:31:02 UTC (rev 50271)
@@ -221,6 +221,7 @@
 			BL::ShaderNodeMixRGB b_mix_node(b_node);
 			MixNode *mix = new MixNode();
 			mix->type = MixNode::type_enum[b_mix_node.blend_type()];
+			mix->use_clamp = b_mix_node.use_clamp();
 			node = mix;
 			break;
 		}

Modified: trunk/blender/intern/cycles/kernel/osl/nodes/node_mix.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/node_mix.osl	2012-08-29 23:37:52 UTC (rev 50270)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/node_mix.osl	2012-08-30 06:31:02 UTC (rev 50271)
@@ -267,8 +267,20 @@
 	return outcol;
 }
 
+color node_mix_clamp(color col)
+{
+	color outcol = col;
+
+	outcol[0] = clamp(col[0], 0.0, 1.0);
+	outcol[1] = clamp(col[2], 0.0, 1.0);
+	outcol[2] = clamp(col[2], 0.0, 1.0);
+
+	return outcol;
+}
+
 shader node_mix(
 	string type = "Mix",
+	int Clamp = false,
 	float Fac = 0.5,
 	color Color1 = color(0.0, 0.0, 0.0),
 	color Color2 = color(0.0, 0.0, 0.0),
@@ -312,5 +324,8 @@
 		Color = node_mix_soft(t, Color1, Color2);
 	if(type == "Linear Light")
 		Color = node_mix_linear(t, Color1, Color2);
+
+	if(Clamp)
+		Color = node_mix_clamp(Color);
 }
 

Modified: trunk/blender/intern/cycles/kernel/svm/svm_mix.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_mix.h	2012-08-29 23:37:52 UTC (rev 50270)
+++ trunk/blender/intern/cycles/kernel/svm/svm_mix.h	2012-08-30 06:31:02 UTC (rev 50271)
@@ -276,6 +276,17 @@
 	return outcol;
 }
 
+__device float3 svm_mix_clamp(float3 col)
+{
+	float3 outcol = col;
+
+	outcol.x = clamp(col.x, 0.0f, 1.0f);
+	outcol.y = clamp(col.y, 0.0f, 1.0f);
+	outcol.z = clamp(col.z, 0.0f, 1.0f);
+
+	return outcol;
+}
+
 __device float3 svm_mix(NodeMix type, float fac, float3 c1, float3 c2)
 {
 	float t = clamp(fac, 0.0f, 1.0f);
@@ -299,6 +310,7 @@
 		case NODE_MIX_COLOR: return svm_mix_color(t, c1, c2);
 		case NODE_MIX_SOFT: return svm_mix_soft(t, c1, c2);
 		case NODE_MIX_LINEAR: return svm_mix_linear(t, c1, c2);
+		case NODE_MIX_CLAMP: return svm_mix_clamp(c1);
 	}
 
 	return make_float3(0.0f, 0.0f, 0.0f);

Modified: trunk/blender/intern/cycles/kernel/svm/svm_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_types.h	2012-08-29 23:37:52 UTC (rev 50270)
+++ trunk/blender/intern/cycles/kernel/svm/svm_types.h	2012-08-30 06:31:02 UTC (rev 50271)
@@ -163,7 +163,8 @@
 	NODE_MIX_VAL,
 	NODE_MIX_COLOR,
 	NODE_MIX_SOFT,
-	NODE_MIX_LINEAR
+	NODE_MIX_LINEAR,
+	NODE_MIX_CLAMP /* used for the clamp UI option */
 } NodeMix;
 
 typedef enum NodeMath {

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-08-29 23:37:52 UTC (rev 50270)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-08-30 06:31:02 UTC (rev 50271)
@@ -1971,6 +1971,8 @@
 {
 	type = ustring("Mix");
 
+	use_clamp = false;
+
 	add_input("Fac", SHADER_SOCKET_FLOAT, 0.5f);
 	add_input("Color1", SHADER_SOCKET_COLOR);
 	add_input("Color2", SHADER_SOCKET_COLOR);
@@ -2019,11 +2021,17 @@
 
 	compiler.add_node(NODE_MIX, fac_in->stack_offset, color1_in->stack_offset, color2_in->stack_offset);
 	compiler.add_node(NODE_MIX, type_enum[type], color_out->stack_offset);
+
+	if(use_clamp) {
+		compiler.add_node(NODE_MIX, 0, color_out->stack_offset);
+		compiler.add_node(NODE_MIX, NODE_MIX_CLAMP, color_out->stack_offset);
+	}
 }
 
 void MixNode::compile(OSLCompiler& compiler)
 {
 	compiler.parameter("type", type);
+	compiler.parameter("Clamp", use_clamp);
 	compiler.add(this, "node_mix");
 }
 

Modified: trunk/blender/intern/cycles/render/nodes.h
===================================================================
--- trunk/blender/intern/cycles/render/nodes.h	2012-08-29 23:37:52 UTC (rev 50270)
+++ trunk/blender/intern/cycles/render/nodes.h	2012-08-30 06:31:02 UTC (rev 50271)
@@ -329,6 +329,8 @@
 public:
 	SHADER_NODE_CLASS(MixNode)
 
+	bool use_clamp;
+
 	ustring type;
 	static ShaderEnum type_enum;
 };




More information about the Bf-blender-cvs mailing list