float Object::Shadow_box(Ray ray) const // Bounding box function for shadows { float t, thit = 1.0; float xmin, xmax, ymin, ymax, zmin, zmax; Vector Q; Vector i(1,0,0), j(0,1,0), k(0,0,1); Vector base = ray.getBase(); Vector dir = ray.getDir(); xmin = this->vmin.x; xmax = this->vmax.x; ymin = this->vmin.y; ymax = this->vmax.y; zmin = this->vmin.z; zmax = this->vmax.z; t = ray.intersect_plane(i, this->vmax); if( (t > 0.0) && (t < 1.0) ) { Q = base + dir.scale(t); if( (ymin <= Q.y) && (Q.y <= ymax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(i.scale(-1), this->vmin); if( (t > 0.0) && (t < 1.0) ) { Q = base + dir.scale(t); if( (ymin <= Q.y) && (Q.y <= ymax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(j, this->vmax); if( (t > 0.0) && (t < 1.0) ) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(j.scale(-1), this->vmin); if( (t > 0.0) && (t < 1.0) ) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(k, this->vmax); if( (t > 0.0) && (t < 1.0) ) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (ymin <= Q.y) && (Q.y <= ymax) ) { thit = t; return thit; } } t = ray.intersect_plane(k.scale(-1), this->vmin); if( (t > 0.0) && (t < 1.0) ) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (ymin <= Q.y) && (Q.y <= ymax) ) { thit = t; return thit; } } return thit; }
float Object::bound_box(Ray ray) const { float t, thit = HUGEREAL; float xmin, xmax, ymin, ymax, zmin, zmax; Vector Q; Vector i(1,0,0), j(0,1,0), k(0,0,1); Vector base = ray.getBase(); Vector dir = ray.getDir(); xmin = this->vmin.x; xmax = this->vmax.x; ymin = this->vmin.y; ymax = this->vmax.y; zmin = this->vmin.z; zmax = this->vmax.z; t = ray.intersect_plane(i, this->vmax); if(t > 0.001) { Q = base + dir.scale(t); if( (ymin <= Q.y) && (Q.y <= ymax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(i.scale(-1), this->vmin); if(t > 0.001) { Q = base + dir.scale(t); if( (ymin <= Q.y) && (Q.y <= ymax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(j, this->vmax); if(t > 0.001) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(j.scale(-1), this->vmin); if(t > 0.001) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (zmin <= Q.z) && (Q.z <= zmax) ) { thit = t; return thit; } } t = ray.intersect_plane(k, this->vmax); if(t > 0.001) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (ymin <= Q.y) && (Q.y <= ymax) ) { thit = t; return thit; } } t = ray.intersect_plane(k.scale(-1), this->vmin); if(t > 0.001) { Q = base + dir.scale(t); if( (xmin <= Q.x) && (Q.x <= xmax) && (ymin <= Q.y) && (Q.y <= ymax) ) { thit = t; return thit; } } return thit; }