/**
 * Raycast against both broadphase trees (static + dynamic) of a
 * {@link PhysicsSystem}, refined against each candidate's true shape geometry.
 * Fills `result` with the nearest hit and returns `true` on hit, `false` on
 * miss. `result.t` is the exact surface distance and `result.normal` the true
 * surface normal for sphere / box / capsule / mesh / heightmap colliders;
 * composite convex shapes (no exact ray test yet) fall back to the broadphase
 * AABB hit + AABB-face normal.
 *
 * **Sensors are skipped.** A ray passes straight through any body or collider
 * flagged {@link is_sensor} (a trigger is not a solid surface), landing on the
 * nearest solid surface behind it. This is the only behaviour — a query that
 * wants to find trigger volumes uses an overlap query, not a ray.
 *
 * Multi-collider bodies resolve their primary (first-attached) collider — the
 * BVH leaf encodes only `body_id`; per-collider rays need the leaf user-data to
 * carry the collider index (future work).
 *
 * @param {PhysicsSystem} system
 * @param {Ray3} ray  origin + unit direction + `tMax`
 * @param {PhysicsSurfacePoint} result  populated on hit; untouched on miss
 * @param {(entity:number, collider:Collider)=>boolean} [filter] called once per
 *   crossing leaf; defaults to {@link returnTrue}.
 * @returns {boolean} true on hit, false on miss
 */
export function raycast(system: PhysicsSystem, ray: Ray3, result: PhysicsSurfacePoint, filter?: (entity: number, collider: Collider) => boolean): boolean;
//# sourceMappingURL=raycast.d.ts.map