intersectBox method
Implementation
Vector3? intersectBox(BoundingBox box, Vector3 target) {
double tmin, tmax, tymin, tymax, tzmin, tzmax;
final invdirx = 1 / direction.x,
invdiry = 1 / direction.y,
invdirz = 1 / direction.z;
final origin = this.origin;
if (invdirx >= 0) {
tmin = (box.min.x - origin.x) * invdirx;
tmax = (box.max.x - origin.x) * invdirx;
} else {
tmin = (box.max.x - origin.x) * invdirx;
tmax = (box.min.x - origin.x) * invdirx;
}
if (invdiry >= 0) {
tymin = (box.min.y - origin.y) * invdiry;
tymax = (box.max.y - origin.y) * invdiry;
} else {
tymin = (box.max.y - origin.y) * invdiry;
tymax = (box.min.y - origin.y) * invdiry;
}
if ((tmin > tymax) || (tymin > tmax)) return null;
// These lines also handle the case where tmin or tmax is NaN
// (result of 0 * Infinity). x !== x returns true if x is NaN
if (tymin > tmin || tmin != tmin) tmin = tymin;
if (tymax < tmax || tmax != tmax) tmax = tymax;
if (invdirz >= 0) {
tzmin = (box.min.z - origin.z) * invdirz;
tzmax = (box.max.z - origin.z) * invdirz;
} else {
tzmin = (box.max.z - origin.z) * invdirz;
tzmax = (box.min.z - origin.z) * invdirz;
}
if ((tmin > tzmax) || (tzmin > tmax)) return null;
if (tzmin > tmin || tmin != tmin) tmin = tzmin;
if (tzmax < tmax || tmax != tmax) tmax = tzmax;
//return point closest to the ray (positive side)
if (tmax < 0) return null;
return at(tmin >= 0 ? tmin : tmax, target);
}