/**
 * Swing-twist decomposition of the relative rotation `qD = conj(qA)⊗qB`, giving
 * the per-frame-axis angular positions used by wide-cone angular DOFs.
 *
 * Decomposes `qD = swing ⊗ twist`, with **twist** the rotation about frame
 * axis X (the bone / twist axis) and **swing** the residual tilt (a rotation
 * about an axis in the YZ plane that carries X to its new direction). Writes,
 * into `out`:
 *   - `out[0]` = signed twist angle about X, in `(−π, π]` — *exact*, so a twist
 *     limit engages at the true angle, not the `2·sin(θ/2)` small-angle proxy;
 *   - `out[1]`, `out[2]` = the swing angle distributed over Y and Z
 *     (`φ·axis`, φ the true swing angle), so independent Y/Z swing limits form
 *     an accurate (box-shaped) cone that holds at large tilt.
 * Reduces continuously to the small-angle vector near identity. Pure scratch /
 * locals — no allocation, suitable for the per-substep hot loop. (The Quaternion
 * class has an object-based `computeSwingAndTwist`; this is the inlined,
 * allocation-free form — see the bench that justifies it.)
 *
 * @param {number} dx @param {number} dy @param {number} dz @param {number} dw  qD
 * @param {Float64Array} out  length-3 destination (frame-axis positions)
 */
export function swing_twist_error(dx: number, dy: number, dz: number, dw: number, out: Float64Array): void;
/**
 * Solve every joint for one substep: recompute geometry at the current poses,
 * derive each DOF's row parameters from its mode, replay the per-substep
 * warm-start, and run `iters` velocity iterations.
 *
 * Called once per substep from `PhysicsSystem.fixedUpdate`, after the contact
 * solve so the two share the substep / warm-start cadence.
 *
 * @param {Joint[]} joints  live joints (sparse array; holes skipped)
 * @param {PhysicsSystem} system  reads `__bodies` / `__transforms` / index map
 * @param {number} dt_sub  substep size in seconds (the SPOOK gain is derived
 *   from it, matching the contact solver's per-substep position stiffness)
 * @param {number} iters  velocity iterations
 */
export function solve_joints(joints: Joint[], system: PhysicsSystem, dt_sub: number, iters: number): void;
//# sourceMappingURL=solve_constraints.d.ts.map