diff options
Diffstat (limited to 'src/intersect.h')
| -rw-r--r-- | src/intersect.h | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/intersect.h b/src/intersect.h index e6566f3..bfde782 100644 --- a/src/intersect.h +++ b/src/intersect.h @@ -44,7 +44,7 @@ __device__ bool intersect_triangle(const float3 &origin, const float3 &direction (m.a01*m.a20 - m.a00*m.a21)*b.y + (m.a00*m.a11 - m.a01*m.a10)*b.z)/determinant; - if (u3 < 0.0f || (1.0f-u1-u2) < 0.0f) + if (u3 <= 0.0f || (1.0f-u1-u2) < 0.0f) return false; distance = u3; @@ -84,32 +84,34 @@ __device__ bool intersect_box(const float3 &origin, const float3 &direction, con { float kmin, kmax, kymin, kymax, kzmin, kzmax; - if (direction.x >= 0.0f) + float divx = 1.0f/direction.x; + if (divx >= 0.0f) { - kmin = (lower_bound.x - origin.x)/direction.x; - kmax = (upper_bound.x - origin.x)/direction.x; + kmin = (lower_bound.x - origin.x)*divx; + kmax = (upper_bound.x - origin.x)*divx; } else { - kmin = (upper_bound.x - origin.x)/direction.x; - kmax = (lower_bound.x - origin.x)/direction.x; + kmin = (upper_bound.x - origin.x)*divx; + kmax = (lower_bound.x - origin.x)*divx; } - if (kmax < kmin) + if (kmax < 0.0f) return false; - if (direction.y >= 0.0f) + float divy = 1.0f/direction.y; + if (divy >= 0.0f) { - kymin = (lower_bound.y - origin.y)/direction.y; - kymax = (upper_bound.y - origin.y)/direction.y; + kymin = (lower_bound.y - origin.y)*divy; + kymax = (upper_bound.y - origin.y)*divy; } else { - kymin = (upper_bound.y - origin.y)/direction.y; - kymax = (lower_bound.y - origin.y)/direction.y; + kymin = (upper_bound.y - origin.y)*divy; + kymax = (lower_bound.y - origin.y)*divy; } - if (kymax < kymin) + if (kymax < 0.0f) return false; if (kymin > kmin) @@ -121,18 +123,19 @@ __device__ bool intersect_box(const float3 &origin, const float3 &direction, con if (kmin > kmax) return false; - if (direction.z >= 0.0f) + float divz = 1.0f/direction.z; + if (divz >= 0.0f) { - kzmin = (lower_bound.z - origin.z)/direction.z; - kzmax = (upper_bound.z - origin.z)/direction.z; + kzmin = (lower_bound.z - origin.z)*divz; + kzmax = (upper_bound.z - origin.z)*divz; } else { - kzmin = (upper_bound.z - origin.z)/direction.z; - kzmax = (lower_bound.z - origin.z)/direction.z; + kzmin = (upper_bound.z - origin.z)*divz; + kzmax = (lower_bound.z - origin.z)*divz; } - if (kzmax < kzmin) + if (kzmax < 0.0f) return false; if (kzmin > kmin) @@ -144,9 +147,6 @@ __device__ bool intersect_box(const float3 &origin, const float3 &direction, con if (kmin > kmax) return false; - if (kmax < 0.0f) - return false; - return true; } |
