Cycles: Watertight fix for SSS intersection

Same as previous commit, just was missing in there.
This commit is contained in:
Sergey Sharybin 2015-10-22 22:10:40 +05:00
parent f84cbae43e
commit 47b1279762
1 changed files with 9 additions and 9 deletions

View File

@ -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 zcoordinates 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;
}