raycastSpatial<T> static method
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;
}