nuclear@2: #include "bvol.h" nuclear@2: nuclear@2: bool AABox::intersect(const Ray &ray) const nuclear@2: { nuclear@2: Vector3 param[2] = {vmin, vmax}; nuclear@2: Vector3 inv_dir(1.0 / ray.dir.x, 1.0 / ray.dir.y, 1.0 / ray.dir.z); nuclear@2: int sign[3] = {inv_dir.x < 0, inv_dir.y < 0, inv_dir.z < 0}; nuclear@2: nuclear@2: float tmin = (param[sign[0]].x - ray.origin.x) * inv_dir.x; nuclear@2: float tmax = (param[1 - sign[0]].x - ray.origin.x) * inv_dir.x; nuclear@2: float tymin = (param[sign[1]].y - ray.origin.y) * inv_dir.y; nuclear@2: float tymax = (param[1 - sign[1]].y - ray.origin.y) * inv_dir.y; nuclear@2: nuclear@2: if(tmin > tymax || tymin > tmax) { nuclear@2: return false; nuclear@2: } nuclear@2: if(tymin > tmin) { nuclear@2: tmin = tymin; nuclear@2: } nuclear@2: if(tymax < tmax) { nuclear@2: tmax = tymax; nuclear@2: } nuclear@2: nuclear@2: float tzmin = (param[sign[2]].z - ray.origin.z) * inv_dir.z; nuclear@2: float tzmax = (param[1 - sign[2]].z - ray.origin.z) * inv_dir.z; nuclear@2: nuclear@2: if(tmin > tzmax || tzmin > tmax) { nuclear@2: return false; nuclear@2: } nuclear@2: if(tzmin > tmin) { nuclear@2: tmin = tzmin; nuclear@2: } nuclear@2: if(tzmax < tmax) { nuclear@2: tmax = tzmax; nuclear@2: } nuclear@2: nuclear@2: return true; nuclear@2: }