Commit: 3f067c61a077042d0d89f30aab2f55e82d318532
Author: Sergey Sharybin
Date:   Thu Oct 22 22:10:40 2015 +0500
Branches: blender-v2.76a-release
https://developer.blender.org/rB3f067c61a077042d0d89f30aab2f55e82d318532

Cycles: Watertight fix for SSS intersection

Same as previous commit, just was missing in there.

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

M       intern/cycles/kernel/geom/geom_triangle_intersect.h

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

diff --git a/intern/cycles/kernel/geom/geom_triangle_intersect.h 
b/intern/cycles/kernel/geom/geom_triangle_intersect.h
index 1ce4eea..970616e 100644
--- a/intern/cycles/kernel/geom/geom_triangle_intersect.h
+++ b/intern/cycles/kernel/geom/geom_triangle_intersect.h
@@ -142,8 +142,8 @@ ccl_device_inline bool triangle_intersect(KernelGlobals *kg,
        float U = Cx * By - Cy * Bx;
        float V = Ax * Cy - Ay * Cx;
        float W = Bx * Ay - By * Ax;
-       if ((U < 0.0f || V < 0.0f || W < 0.0f) &&
-           (U > 0.0f || V > 0.0f || W > 0.0f))
+       if((U < 0.0f || V < 0.0f || W < 0.0f) &&
+          (U > 0.0f || V > 0.0f || W > 0.0f))
        {
                return false;
        }
@@ -242,13 +242,12 @@ ccl_device_inline void triangle_intersect_subsurface(
 
        /* Calculate scaled barycentric coordinates. */
        float U = Cx * By - Cy * Bx;
-       int sign_mask = (__float_as_int(U) & 0x80000000);
        float V = Ax * Cy - Ay * Cx;
-       if(sign_mask != (__float_as_int(V) & 0x80000000)) {
-               return;
-       }
        float W = Bx * Ay - By * Ax;
-       if(sign_mask != (__float_as_int(W) & 0x80000000)) {
+
+       if((U < 0.0f || V < 0.0f || W < 0.0f) &&
+          (U > 0.0f || V > 0.0f || W > 0.0f))
+       {
                return;
        }
 
@@ -261,10 +260,11 @@ ccl_device_inline void triangle_intersect_subsurface(
        /* Calculate scaled z−coordinates of vertices and use them to calculate
         * the hit distance.
         */
+       const int sign_det = (__float_as_int(det) & 0x80000000);
        const float T = (U * A_kz + V * B_kz + W * C_kz) * Sz;
-       const float sign_T = xor_signmask(T, sign_mask);
+       const float sign_T = xor_signmask(T, sign_det);
        if((sign_T < 0.0f) ||
-          (sign_T > tmax * xor_signmask(det, sign_mask)))
+          (sign_T > tmax * xor_signmask(det, sign_det)))
        {
                return;
        }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to