rayAabb function

double rayAabb(
  1. Ray ray,
  2. Aabb3 box
)

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