raycastSpatial<T> static method

RaycastHit<T>? raycastSpatial<T>(
  1. Ray ray,
  2. SpatialHash<T> world,
  3. Shape shape(
    1. T
    )
)

Implementation

static RaycastHit<T>? raycastSpatial<T>(
  Ray ray,
  SpatialHash<T> world,
  Shape Function(T) shape,
) {
  const maxDist = 1e6;
  final farX = ray.origin.x + ray.direction.x * maxDist;
  final farY = ray.origin.y + ray.direction.y * maxDist;
  final minX = math.min(ray.origin.x, farX);
  final maxX = math.max(ray.origin.x, farX);
  final minY = math.min(ray.origin.y, farY);
  final maxY = math.max(ray.origin.y, farY);

  final candidates = world.query(
    AABB(Vec2(minX, minY), width: maxX - minX, height: maxY - minY),
  );

  RaycastHit<T>? closest;
  for (final obj in candidates) {
    final hit = raycastShape(ray, shape(obj));
    if (hit == null) continue;
    if (closest == null || hit.distance < closest.distance) {
      closest = RaycastHit<T>(
        object: obj,
        point: hit.point,
        normal: hit.normal,
        distance: hit.distance,
      );
    }
  }

  return closest;
}