rayAabb function
Distance along ray to box, or kNoHit.
A ray starting inside the box returns 0: for picking, "the click was inside
this object" is a hit at zero distance, not a hit at the far wall.
Implementation
double rayAabb(Ray ray, Aabb3 box) {
final o = ray.origin;
final d = ray.direction;
final min = box.min;
final max = box.max;
var tMin = -double.infinity;
var tMax = double.infinity;
for (var axis = 0; axis < 3; axis++) {
final origin = o[axis];
final direction = d[axis];
final lo = min[axis];
final hi = max[axis];
if (direction.abs() < 1e-20) {
// Parallel to this slab: either always inside it, or never.
if (origin < lo || origin > hi) return kNoHit;
continue;
}
final inverse = 1.0 / direction;
var near = (lo - origin) * inverse;
var far = (hi - origin) * inverse;
if (near > far) {
final swap = near;
near = far;
far = swap;
}
if (near > tMin) tMin = near;
if (far < tMax) tMax = far;
if (tMin > tMax) return kNoHit;
}
if (tMax < 0.0) return kNoHit;
return tMin < 0.0 ? 0.0 : tMin;
}