diff options
Diffstat (limited to 'intern/cycles/util/util_math.h')
-rw-r--r-- | intern/cycles/util/util_math.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h index bd376e80c64..e2abfcde702 100644 --- a/intern/cycles/util/util_math.h +++ b/intern/cycles/util/util_math.h @@ -1579,7 +1579,7 @@ ccl_device_inline bool ray_triangle_intersect_uv( ccl_device bool ray_quad_intersect(float3 ray_P, float3 ray_D, float ray_mint, float ray_maxt, float3 quad_P, float3 quad_u, float3 quad_v, float3 quad_n, - float3 *isect_P, float *isect_t) + float3 *isect_P, float *isect_t, float *isect_u, float *isect_v) { float t = -(dot(ray_P, quad_n) - dot(quad_P, quad_n)) / dot(ray_D, quad_n); if(t < ray_mint || t > ray_maxt) @@ -1587,13 +1587,19 @@ ccl_device bool ray_quad_intersect(float3 ray_P, float3 ray_D, float ray_mint, f float3 hit = ray_P + t*ray_D; float3 inplane = hit - quad_P; - if(fabsf(dot(inplane, quad_u) / dot(quad_u, quad_u)) > 0.5f) + + float u = dot(inplane, quad_u) / dot(quad_u, quad_u) + 0.5f; + if(u < 0.0f || u > 1.0f) return false; - if(fabsf(dot(inplane, quad_v) / dot(quad_v, quad_v)) > 0.5f) + + float v = dot(inplane, quad_v) / dot(quad_v, quad_v) + 0.5f; + if(v < 0.0f || v > 1.0f) return false; if(isect_P) *isect_P = hit; if(isect_t) *isect_t = t; + if(isect_u) *isect_u = u; + if(isect_v) *isect_v = v; return true; } |