/** * IdleBehaviorSystem.ts * * Procedural idle facial/body signals for character rigs: * - Chest rise/fall breathing cycle * - Nostril flare coupled to inhale phase * - Eyelid blink cycle * - Micro-saccade gaze offsets * * This system is intentionally armature-binding dependent. If no usable * bindings are provided, output channels remain neutral. */ export interface IdleArmatureBindings { /** Bone name used for breathing chest expansion. */ chestBone?: string; /** Blend-shape/morph key for left eye blink. */ eyelidLeft?: string; /** Blend-shape/morph key for right eye blink. */ eyelidRight?: string; /** Blend-shape/morph key for nostril flare. */ nostrilFlare?: string; } export interface IdleBehaviorConfig { /** Breaths per minute. Default 12. */ breathsPerMinute?: number; /** Peak chest expansion scale delta. Default 0.035. */ chestAmplitude?: number; /** Peak nostril flare weight. Default 0.22. */ nostrilAmplitude?: number; /** Blink interval range in seconds. Default [2.4, 5.2]. */ blinkIntervalRangeSec?: [number, number]; /** Blink close+open duration in seconds. Default 0.12. */ blinkDurationSec?: number; /** Micro-saccade interval range in seconds. Default [0.7, 1.6]. */ microSaccadeIntervalRangeSec?: [number, number]; /** Micro-saccade angular amplitude in normalized gaze units. Default 0.03. */ microSaccadeAmplitude?: number; /** Deterministic RNG injection for testing. Default Math.random. */ random?: () => number; } export interface IdleBehaviorFrame { /** Absolute per-bone scale multipliers. */ boneScale: Record; /** Morph/blend-shape weights in [0, 1]. */ morphWeights: Record; /** Normalized micro-saccade gaze offset. */ gazeOffset: { x: number; y: number; }; /** Normalized blink amount [0, 1]. */ blink: number; /** Normalized breath phase signal [-1, 1]. */ breath: number; } export declare class IdleBehaviorSystem { private readonly bindings; private readonly config; private readonly rnd; private elapsedSec; private nextBlinkSec; private blinkT; private nextSaccadeSec; private saccadeTarget; private gaze; constructor(bindings: IdleArmatureBindings, config?: IdleBehaviorConfig); /** Force an immediate blink cycle. Useful for deterministic tests and scripted beats. */ triggerBlink(): void; update(deltaSec: number): IdleBehaviorFrame; private computeFrame; private computeBlinkWeight; private scheduleNextBlink; private scheduleNextSaccade; } export declare function createIdleBehaviorSystem(bindings: IdleArmatureBindings, config?: IdleBehaviorConfig): IdleBehaviorSystem; //# sourceMappingURL=IdleBehaviorSystem.d.ts.map