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