/**
 * # Local-frame ray ↔ primitive intersections (raycast narrowphase)
 *
 * Each function intersects a ray, **expressed in the shape's local frame**,
 * against a canonical primitive at the origin (sphere at the origin; box
 * axis-aligned spanning `[-h, +h]`; capsule along the local Y axis). They
 * return the hit distance `t` along the ray (`Infinity` on a miss) and write
 * the **local** outward surface normal (unit) into `outNormal[0..2]`.
 *
 * The ray-narrowphase dispatch transforms the world ray into the body's local
 * frame once (rotate by the inverse body rotation — a unit direction stays
 * unit, so `t` is preserved), calls the matching primitive, then rotates the
 * returned local normal back to world. Keeping the primitives canonical lets
 * the box and capsule tests be axis-aligned (cheap slab / cylinder math) and
 * shares a single transform across them.
 *
 * Conventions:
 *  - the ray direction is unit length (the caller guarantees it);
 *  - the first surface crossing at or after the origin within `tMax` is
 *    returned; a ray starting inside the shape returns its exit crossing;
 *  - the normal is the geometric outward surface normal at the hit.
 *
 * @author Alex Goldring
 * @copyright Company Named Limited (c) 2026
 */
/**
 * Ray vs a sphere of radius `r` centred at the local origin.
 *
 * @param {Float64Array} outNormal length-3, written on hit
 * @param {number} ox @param {number} oy @param {number} oz  ray origin (local)
 * @param {number} dx @param {number} dy @param {number} dz  ray dir (local, unit)
 * @param {number} tMax
 * @param {number} r  sphere radius
 * @returns {number} hit distance, or `Infinity` on miss
 */
export function ray_sphere_local(outNormal: Float64Array, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number, r: number): number;
/**
 * Ray vs an axis-aligned box spanning `[-hx,hx] × [-hy,hy] × [-hz,hz]` at the
 * local origin (the canonical pose of {@link BoxShape3D}). Slab method, with
 * the entry (or, origin-inside, exit) face's outward normal.
 *
 * @param {Float64Array} outNormal length-3, written on hit
 * @param {number} ox @param {number} oy @param {number} oz  ray origin (local)
 * @param {number} dx @param {number} dy @param {number} dz  ray dir (local, unit)
 * @param {number} tMax
 * @param {number} hx @param {number} hy @param {number} hz  half-extents
 * @returns {number} hit distance, or `Infinity` on miss
 */
export function ray_box_local(outNormal: Float64Array, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number, hx: number, hy: number, hz: number): number;
/**
 * Ray vs a capsule along the local Y axis: a cylinder of radius `r` over
 * `y ∈ [−hh, hh]` capped by hemispheres of radius `r` at `(0, ±hh, 0)` — the
 * canonical pose of {@link CapsuleShape3D} (`hh = height/2`). Tests the
 * infinite cylinder (clamped to the segment) and the two cap spheres, taking
 * the nearest valid crossing.
 *
 * @param {Float64Array} outNormal length-3, written on hit
 * @param {number} ox @param {number} oy @param {number} oz  ray origin (local)
 * @param {number} dx @param {number} dy @param {number} dz  ray dir (local, unit)
 * @param {number} tMax
 * @param {number} r   capsule radius
 * @param {number} hh  half-height of the cylindrical section (`height/2`)
 * @returns {number} hit distance, or `Infinity` on miss
 */
export function ray_capsule_local(outNormal: Float64Array, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number, r: number, hh: number): number;
//# sourceMappingURL=ray_shapes.d.ts.map