[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56682] trunk/blender/intern/cycles: Fix #35306: cycles normal mapping not working with flat shading.

Brecht Van Lommel brechtvanlommel at pandora.be
Sat May 11 11:31:58 CEST 2013


Revision: 56682
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56682
Author:   blendix
Date:     2013-05-11 09:31:58 +0000 (Sat, 11 May 2013)
Log Message:
-----------
Fix #35306: cycles normal mapping not working with flat shading.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_services.h
    trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl
    trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h

Modified: trunk/blender/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-05-11 05:32:40 UTC (rev 56681)
+++ trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-05-11 09:31:58 UTC (rev 56682)
@@ -106,10 +106,17 @@
 {
 	MikkUserData *userdata = (MikkUserData*)context->m_pUserData;
 	BL::MeshTessFace f = userdata->mesh.tessfaces[face_num];
-	int4 vi = get_int4(f.vertices_raw());
-	BL::MeshVertex v = userdata->mesh.vertices[vi[vert_num]];
-	float3 vN = get_float3(v.normal());
+	float3 vN;
 
+	if(f.use_smooth()) {
+		int4 vi = get_int4(f.vertices_raw());
+		BL::MeshVertex v = userdata->mesh.vertices[vi[vert_num]];
+		vN = get_float3(v.normal());
+	}
+	else {
+		vN = get_float3(f.normal());
+	}
+
 	N[0] = vN.x;
 	N[1] = vN.y;
 	N[2] = vN.z;

Modified: trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_services.cpp	2013-05-11 05:32:40 UTC (rev 56681)
+++ trunk/blender/intern/cycles/kernel/osl/osl_services.cpp	2013-05-11 09:31:58 UTC (rev 56682)
@@ -76,6 +76,7 @@
 ustring OSLRenderServices::u_geom_trianglevertices("geom:trianglevertices");
 ustring OSLRenderServices::u_geom_polyvertices("geom:polyvertices");
 ustring OSLRenderServices::u_geom_name("geom:name");
+ustring OSLRenderServices::u_is_smooth("geom:is_smooth");
 #ifdef __HAIR__
 ustring OSLRenderServices::u_is_curve("geom:is_curve");
 ustring OSLRenderServices::u_curve_thickness("geom:curve_thickness");
@@ -626,7 +627,10 @@
 		ustring object_name = kg->osl->object_names[sd->object];
 		return set_attribute_string(object_name, type, derivatives, val);
 	}
-	
+	else if (name == u_is_smooth) {
+		float f = ((sd->shader & SHADER_SMOOTH_NORMAL) != 0);
+		return set_attribute_float(f, type, derivatives, val);
+	}
 #ifdef __HAIR__
 	/* Hair Attributes */
 	else if (name == u_is_curve) {

Modified: trunk/blender/intern/cycles/kernel/osl/osl_services.h
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_services.h	2013-05-11 05:32:40 UTC (rev 56681)
+++ trunk/blender/intern/cycles/kernel/osl/osl_services.h	2013-05-11 09:31:58 UTC (rev 56682)
@@ -130,6 +130,7 @@
 	static ustring u_geom_trianglevertices;
 	static ustring u_geom_polyvertices;
 	static ustring u_geom_name;
+	static ustring u_is_smooth;
 	static ustring u_is_curve;
 	static ustring u_curve_thickness;
 	static ustring u_curve_tangent_normal;

Modified: trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl	2013-05-11 05:32:40 UTC (rev 56681)
+++ trunk/blender/intern/cycles/kernel/shaders/node_normal_map.osl	2013-05-11 09:31:58 UTC (rev 56682)
@@ -33,15 +33,17 @@
 		vector tangent;
 		vector ninterp;
 		float tangent_sign;
+		float is_smooth;
 
+		getattribute("geom:is_smooth", is_smooth);
+		if (!is_smooth)
+			ninterp = Ng;
+
 		// get _unnormalized_ interpolated normal and tangent
-		if (!getattribute(attr_name, tangent) ||
-		   !getattribute(attr_sign_name, tangent_sign) ||
-		   !getattribute("geom:N", ninterp))
+		if (getattribute(attr_name, tangent) &&
+		    getattribute(attr_sign_name, tangent_sign) &&
+		    (!is_smooth || getattribute("geom:N", ninterp)))
 		{
-			Normal = normal(0, 0, 0);
-		}
-		else {
 			// apply normal map
 			vector B = tangent_sign * cross(ninterp, tangent);
 			Normal = normalize(mcolor[0] * tangent + mcolor[1] * B + mcolor[2] * ninterp);
@@ -49,6 +51,9 @@
 			// transform to world space
 			Normal = normalize(transform("object", "world", Normal));
 		}
+		else {
+			Normal = normal(0, 0, 0);
+		}
 	}
 	else if (space == "Object")
 		Normal = normalize(transform("object", "world", vector(mcolor)));

Modified: trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2013-05-11 05:32:40 UTC (rev 56681)
+++ trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2013-05-11 09:31:58 UTC (rev 56682)
@@ -261,8 +261,13 @@
 		/* get _unnormalized_ interpolated normal and tangent */
 		float3 tangent = primitive_attribute_float3(kg, sd, attr_elem, attr_offset, NULL, NULL);
 		float sign = primitive_attribute_float(kg, sd, attr_sign_elem, attr_sign_offset, NULL, NULL);
-		float3 normal = primitive_attribute_float3(kg, sd, attr_normal_elem, attr_normal_offset, NULL, NULL);
+		float3 normal;
 
+		if(sd->shader & SHADER_SMOOTH_NORMAL)
+			normal = primitive_attribute_float3(kg, sd, attr_normal_elem, attr_normal_offset, NULL, NULL);
+		else
+			normal = sd->N;
+
 		/* apply normal map */
 		float3 B = sign * cross(normal, tangent);
 		N = normalize(color.x * tangent + color.y * B + color.z * normal);




More information about the Bf-blender-cvs mailing list