[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