diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-22 20:10:40 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-22 20:10:40 +0300 |
commit | 47b1279762dd07cdef4570e077459497f48e4fb8 (patch) | |
tree | f3c5d78e5cb0bd831145e4838fed260c1923fddb | |
parent | f84cbae43e3ef2538b8458339beb60ef5dc3a2e5 (diff) |
Cycles: Watertight fix for SSS intersection
Same as previous commit, just was missing in there.
-rw-r--r-- | intern/cycles/kernel/geom/geom_triangle_intersect.h | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/intern/cycles/kernel/geom/geom_triangle_intersect.h b/intern/cycles/kernel/geom/geom_triangle_intersect.h index 1ce4eea48f4..970616eb894 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; } |