summaryrefslogtreecommitdiff
path: root/src/intersect.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/intersect.h')
-rw-r--r--src/intersect.h44
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;
}