/** Frame-rate-independent exponential decay multiplier: `exp(−rate·dt)`. */ export declare function expDecay(rate: number, dt: number): number; /** * Invert a center/scale/rotation placement: screen-UV pointer → shape-local xy (y up). * The forward transform is `screen = center + R(rot)·(local·scale)/aspectLift`; this is its * exact inverse, with x lifted by aspect so the local frame is isotropic. */ export declare function pointerToShapeLocal(opts: { pointerX: number; pointerY: number; centerX: number; centerYv: number; scale: number; rotC: number; rotS: number; aspect: number; }): { x: number; y: number; }; /** * Body-frame angular velocity from consecutive euler angles (radians), for a field sampled at * `R·p`: features move at `−(Rᵀω)×r`, so the euler rates are conjugated by Rᵀ and negated. * Returns null on the first frame (no previous sample). */ export declare function omegaFromRotationDeltas(prev: { x: number; y: number; z: number; } | null, next: { x: number; y: number; z: number; }, dt: number): { x: number; y: number; z: number; } | null; /** Cap an omega vector's magnitude and derive the entrainment gain from it. */ export declare function entrainmentFromOmega(om: { x: number; y: number; z: number; }, opts: { cap: number; gainRate: number; gainMax: number; }): { omegaX: number; omegaY: number; omegaZ: number; entrain: number; }; /** * A stateful smoothed-motion-direction tracker: the axis eases toward the pointer's travel * direction with a teleport guard — a jump wider than `teleport` world units in one frame is * the pointer re-entering the canvas, not a stroke, so the axis holds its previous heading. */ export declare function createMotionAxis(opts?: { smoothing?: number; teleport?: number; }): { update(x: number, y: number): { x: number; y: number; }; }; /** * Fit ~`count` roughly-square cells over an overscanned `[−ov, domainX+ov] × [−ov, 1+ov]` * domain (the jittered home grid — off-screen agents backfill pulled-in edges). */ export declare function fitJitteredGrid(count: number, domainX: number, overscan: number): { cols: number; cellW: number; cellH: number; }; /** Fit an isotropic W×H agent grid to a count and aspect, each axis clamped to [min, max]. */ export declare function fitIsoGrid(count: number, aspect: number, min: number, max: number): { w: number; h: number; }; /** * Camera rotation matrix rows (Rz·Ry·Rx), conjugated for screen space (y down): the y-up * matrix with the off-diagonal y terms sign-flipped, so positive angles read as the natural * orbit directions in the editor. Angles in radians. */ export declare function cameraRowsYDown(rx: number, ry: number, rz: number): { rowX: [number, number, number]; rowY: [number, number, number]; rowZ: [number, number, number]; }; /** * The R3 sub-cell dither for a voxel lattice: frame `i`'s offset, scaled by one cell — evenly * covers the sub-cell cube over frames, so a grid can never stand in coherent moiré with a * boundary. (See `R3_ALPHA` on the harness.) */ export declare function r3SubCellOffset(frameIdx: number, cell: number): { x: number; y: number; z: number; }; //# sourceMappingURL=agentFrame.d.ts.map