[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52013] trunk/blender: Cycles: add strength input for normal map node.

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Nov 8 17:35:21 CET 2012


Revision: 52013
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52013
Author:   blendix
Date:     2012-11-08 16:35:20 +0000 (Thu, 08 Nov 2012)
Log Message:
-----------
Cycles: add strength input for normal map node.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl
    trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bump.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_normal_map.c

Modified: trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl	2012-11-08 16:35:10 UTC (rev 52012)
+++ trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl	2012-11-08 16:35:20 UTC (rev 52013)
@@ -20,6 +20,7 @@
 
 shader node_normal_map(
 	normal NormalIn = N,
+	float Strength = 1.0,
 	color Color = color(0.5, 0.5, 1.0),
 	string space = "Tangent",
 	string attr_name = "geom:tangent",
@@ -44,5 +45,8 @@
 		Normal = normalize(transform("object", "world", vector(mcolor)));
 	else if (space == "World")
 		Normal = normalize(vector(mcolor));
+	
+	if (Strength != 1.0)
+		Normal = normalize(NormalIn + (Normal - NormalIn)*max(Strength, 0.0));
 }
 

Modified: trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2012-11-08 16:35:10 UTC (rev 52012)
+++ trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2012-11-08 16:35:20 UTC (rev 52013)
@@ -227,12 +227,14 @@
 
 __device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
 {
-	uint color_offset, normal_offset, space;
-	decode_node_uchar4(node.y, &color_offset, &normal_offset, &space, NULL);
+	uint color_offset, strength_offset, normal_offset, space;
+	decode_node_uchar4(node.y, &color_offset, &strength_offset, &normal_offset, &space);
 
 	float3 color = stack_load_float3(stack, color_offset);
 	color = 2.0f*make_float3(color.x - 0.5f, color.y - 0.5f, color.z - 0.5f);
 
+	float3 N;
+
 	if(space == NODE_NORMAL_MAP_TANGENT) {
 		/* tangent space */
 		if(sd->object == ~0) {
@@ -257,19 +259,26 @@
 		tangent = cross(sd->N, normalize(cross(tangent, sd->N)));;
 
 		float3 B = sign * cross(sd->N, tangent);
-		float3 N = color.x * tangent + color.y * B + color.z * sd->N;
-
-		stack_store_float3(stack, normal_offset, normalize(N));
+		N = normalize(color.x * tangent + color.y * B + color.z * sd->N);
 	}
 	else {
 		/* object, world space */
-		float3 N = color;
+		N = color;
 
 		if(space == NODE_NORMAL_MAP_OBJECT)
 			object_normal_transform(kg, sd, &N);
 
-		stack_store_float3(stack, normal_offset, normalize(N));
+		N = normalize(N);
 	}
+
+	float strength = stack_load_float(stack, strength_offset);
+
+	if(strength != 1.0f) {
+		strength = max(strength, 0.0f);
+		N = normalize(sd->N + (N - sd->N)*strength);
+	}
+
+	stack_store_float3(stack, normal_offset, normalize(N));
 }
 
 __device void svm_node_tangent(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-11-08 16:35:10 UTC (rev 52012)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-11-08 16:35:20 UTC (rev 52013)
@@ -3032,7 +3032,9 @@
 	attribute = ustring("");
 
 	add_input("NormalIn", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
+	add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f);
 	add_input("Color", SHADER_SOCKET_COLOR);
+
 	add_output("Normal", SHADER_SOCKET_NORMAL);
 }
 
@@ -3055,6 +3057,7 @@
 void NormalMapNode::compile(SVMCompiler& compiler)
 {
 	ShaderInput  *color_in = input("Color");
+	ShaderInput  *strength_in = input("Strength");
 	ShaderOutput *normal_out = output("Normal");
 	int attr = 0, attr_sign = 0;
 
@@ -3070,11 +3073,13 @@
 	}
 
 	compiler.stack_assign(color_in);
+	compiler.stack_assign(strength_in);
 	compiler.stack_assign(normal_out);
 
 	compiler.add_node(NODE_NORMAL_MAP,
 		compiler.encode_uchar4(
 			color_in->stack_offset,
+			strength_in->stack_offset,
 			normal_out->stack_offset,
 			space_enum[space]),
 		attr, attr_sign);

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_bump.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_bump.c	2012-11-08 16:35:10 UTC (rev 52012)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_bump.c	2012-11-08 16:35:20 UTC (rev 52013)
@@ -36,7 +36,7 @@
 
 /* **************** BUMP ******************** */ 
 static bNodeSocketTemplate sh_node_bump_in[] = {
-	{ SOCK_FLOAT, 1, "Strength",	0.1f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+	{ SOCK_FLOAT, 1, "Strength",	0.1f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
 	{ SOCK_FLOAT, 1, "Height",		1.0f, 1.0f, 1.0f, 1.0f, -1000.0f, 1000.0f, PROP_NONE, SOCK_HIDE_VALUE},
 	{ -1, 0, "" }
 };

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_normal_map.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_normal_map.c	2012-11-08 16:35:10 UTC (rev 52012)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_normal_map.c	2012-11-08 16:35:20 UTC (rev 52013)
@@ -30,6 +30,7 @@
 /* **************** OUTPUT ******************** */
 
 static bNodeSocketTemplate sh_node_normal_map_in[] = {
+	{   SOCK_FLOAT, 1, N_("Strength"),	1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
 	{	SOCK_RGBA, 0, N_("Color"), 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f},
 	{	-1, 0, ""	}
 };




More information about the Bf-blender-cvs mailing list