/**
 * Dispatch a non-convex shape to its triangle enumerator. Writes
 * triangles into `output` at float-index `offset`, with the layout
 * specified by {@link TRIANGLE_FLOAT_STRIDE} in `triangle_buffer_layout`.
 *
 * Explicit per-shape dispatch (no virtual `enumerate_triangles` method
 * on AbstractShape3D) — adding support for a new concave shape kind is
 * one line here plus a new enumerator file. The narrowphase calls this
 * once per concave collider per contact pair; if performance ever
 * becomes a worry, the entire function can be inlined into the
 * call site without touching the enumerators.
 *
 * Throws if `shape` has no registered enumerator. The narrowphase
 * gates this behind `shape.is_convex === false`, and every shape with
 * `is_convex === false` is required to have an enumerator — there's
 * no silent fallback to "empty triangle set" because that would
 * masquerade the bug as a missed collision.
 *
 * @param {Float64Array} output
 * @param {number} offset float-index into output
 * @param {AbstractShape3D} shape (must have `is_convex === false`)
 * @param {number} aabb_min_x query AABB in shape's body-local frame
 * @param {number} aabb_min_y
 * @param {number} aabb_min_z
 * @param {number} aabb_max_x
 * @param {number} aabb_max_y
 * @param {number} aabb_max_z
 * @returns {number} number of triangles written
 */
export function decompose_to_triangles(output: Float64Array, offset: number, shape: AbstractShape3D, aabb_min_x: number, aabb_min_y: number, aabb_min_z: number, aabb_max_x: number, aabb_max_y: number, aabb_max_z: number): number;
//# sourceMappingURL=decompose_to_triangles.d.ts.map