bool Cube::Intersect(Ray& ray, float& t)
{
int tNear = -2147000000;
int tFar = 2147000000;
//compute min and max
//check x
Min.x = min(Corner1.x, Corner2.x);
Min.y = min(Corner1.y, Corner2.y);
Min.z = min(Corner1.z, Corner2.z);
Max.x = max(Corner1.x, Corner2.x);
Max.y = max(Corner1.y, Corner2.y);
Max.z = max(Corner1.z, Corner2.z);
if((ray.dir.x == 0) && (ray.start.x < Min.x) && (ray.start.x > Max.x))
{
//parallel
return false;
}
else
{
float t1 = (Min.x - ray.start.x) / ray.dir.x;
float t2 = (Max.x - ray.start.x) / ray.dir.x;
if(t1 > t2)
{
float temp1 = t1;
t1 = t2;
t2 = temp1;
}
if(t1 > tNear)
{
tNear = t1;
}
if(t2 > tFar)
{
tFar = t2;
}
if((tNear > tFar) || (tFar < 0))
return false;
}
//check y
if((ray.dir.y == 0) && (ray.start.y < Min.y) && (ray.start.y > Max.y))
{
//parallel
return false;
}
else
{
float t1 = (Min.y - ray.start.y) / ray.dir.y;
float t2 = (Max.y - ray.start.y) / ray.dir.y;
if(t1 > t2)
{
float temp1 = t1;
t1 = t2;
t2 = temp1;
}
if(t1 > tNear)
{
tNear = t1;
}
if(t2 > tFar)
{
tFar = t2;
}
if((tNear > tFar) || (tFar < 0))
return false;
}
//check z
if((ray.dir.z == 0) && (ray.start.z < Min.z) && (ray.start.z > Max.z))
{
//parallel
return false;
}
else
{
float t1 = (Min.z - ray.start.z) / ray.dir.z;
float t2 = (Max.x - ray.start.z) / ray.dir.z;
if(t1 > t2)
{
float temp1 = t1;
t1 = t2;
t2 = temp1;
}
if(t1 > tNear)
{
tNear = t1;
}
if(t2 > tFar)
{
tFar = t2;
}
if((tNear > tFar) || (tFar < 0))
return false;
}
t = tNear;
return true;
}