Commit: b317185a9993e27b3385b74d646ecc7abc128330
Author: Lukas Stockner
Date:   Mon Jul 18 19:48:21 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBb317185a9993e27b3385b74d646ecc7abc128330

Cycles: Fix NaN smooth normals

===================================================================

M       intern/cycles/kernel/geom/geom_triangle.h
M       intern/cycles/kernel/kernel_shader.h
M       intern/cycles/render/mesh.cpp

===================================================================

diff --git a/intern/cycles/kernel/geom/geom_triangle.h 
b/intern/cycles/kernel/geom/geom_triangle.h
index 0c2351e..192af07 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -77,7 +77,7 @@ ccl_device_inline void triangle_vertices(KernelGlobals *kg, 
int prim, float3 P[3
 
 /* Interpolate smooth vertex normal from vertices */
 
-ccl_device_inline float3 triangle_smooth_normal(KernelGlobals *kg, int prim, 
float u, float v)
+ccl_device_inline float3 triangle_smooth_normal(KernelGlobals *kg, float3 Ng, 
int prim, float u, float v)
 {
        /* load triangle vertices */
        const uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim);
@@ -85,7 +85,9 @@ ccl_device_inline float3 triangle_smooth_normal(KernelGlobals 
*kg, int prim, flo
        float3 n1 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, 
tri_vindex.y));
        float3 n2 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, 
tri_vindex.z));
 
-       return normalize((1.0f - u - v)*n2 + u*n0 + v*n1);
+       float3 N = safe_normalize((1.0f - u - v)*n2 + u*n0 + v*n1);
+
+       return is_zero(N)? Ng: N;
 }
 
 /* Ray differentials on triangle */
diff --git a/intern/cycles/kernel/kernel_shader.h 
b/intern/cycles/kernel/kernel_shader.h
index 765baa2..51ce3ac 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -96,7 +96,7 @@ ccl_device_noinline void shader_setup_from_ray(KernelGlobals 
*kg,
                
                /* smooth normal */
                if(ccl_fetch(sd, shader) & SHADER_SMOOTH_NORMAL)
-                       ccl_fetch(sd, N) = triangle_smooth_normal(kg, 
ccl_fetch(sd, prim), ccl_fetch(sd, u), ccl_fetch(sd, v));
+                       ccl_fetch(sd, N) = triangle_smooth_normal(kg, Ng, 
ccl_fetch(sd, prim), ccl_fetch(sd, u), ccl_fetch(sd, v));
 
 #ifdef __DPDU__
                /* dPdu/dPdv */
@@ -174,7 +174,7 @@ ccl_device_inline void 
shader_setup_from_subsurface(KernelGlobals *kg, ShaderDat
                sd->N = Ng;
 
                if(sd->shader & SHADER_SMOOTH_NORMAL)
-                       sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, 
sd->v);
+                       sd->N = triangle_smooth_normal(kg, Ng, sd->prim, sd->u, 
sd->v);
 
 #  ifdef __DPDU__
                /* dPdu/dPdv */
@@ -284,7 +284,7 @@ ccl_device void shader_setup_from_sample(KernelGlobals *kg,
        if(ccl_fetch(sd, type) & PRIMITIVE_TRIANGLE) {
                /* smooth normal */
                if(ccl_fetch(sd, shader) & SHADER_SMOOTH_NORMAL) {
-                       ccl_fetch(sd, N) = triangle_smooth_normal(kg, 
ccl_fetch(sd, prim), ccl_fetch(sd, u), ccl_fetch(sd, v));
+                       ccl_fetch(sd, N) = triangle_smooth_normal(kg, Ng, 
ccl_fetch(sd, prim), ccl_fetch(sd, u), ccl_fetch(sd, v));
 
 #ifdef __INSTANCING__
                        if(instanced)
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 661719e..6264cb6 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -497,7 +497,7 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, 
float4 *vnormal)
                float3 vNi = vN[i];
 
                if(do_transform)
-                       vNi = normalize(transform_direction(&ntfm, vNi));
+                       vNi = safe_normalize(transform_direction(&ntfm, vNi));
 
                vnormal[i] = make_float4(vNi.x, vNi.y, vNi.z, 0.0f);
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to