/** * Deterministic, absolute-time micro-motion for native characters. * * The sampler is deliberately pure data: agents can author one compact profile, evaluate any * frame without replaying prior frames, and pass the resulting channels to native renderers. * CharacterHost binds blink, gaze, and breath to real native geometry. Cloth phase remains an * explicit channel for render/world consumers rather than being relabelled as native cloth * simulation before that binding exists. */ export type CharacterMicroMotionProfile = 'human-presence-v1'; export interface CharacterMicroMotionConfig { schemaVersion: 'holoscript.character-micro-motion-config.v1'; profile: CharacterMicroMotionProfile; seed: string; blinkIntervalSeconds: number; blinkDurationSeconds: number; saccadeIntervalSeconds: number; saccadeSettleSeconds: number; saccadeYawRadians: number; saccadePitchRadians: number; breathRateHz: number; breathAmplitude: number; clothRate: number; configDigest: string; } export interface CharacterMicroMotionConfigInput { profile?: CharacterMicroMotionProfile; seed?: string; blinkIntervalSeconds?: number; blinkDurationSeconds?: number; saccadeIntervalSeconds?: number; saccadeSettleSeconds?: number; saccadeYawRadians?: number; saccadePitchRadians?: number; breathRateHz?: number; breathAmplitude?: number; clothRate?: number; } export interface CharacterMicroMotionSample { schemaVersion: 'holoscript.character-micro-motion-sample.v1'; profile: CharacterMicroMotionProfile; seed: string; timeSeconds: number; absoluteTime: true; blink: { weight: number; active: boolean; cyclePhase01: number; }; gaze: { yawRadians: number; pitchRadians: number; eventIndex: number; settle01: number; nativeTransformApplied: false; }; breath: { scale: number; phase01: number; nativeTransformApplied: false; }; cloth: { timeSeconds: number; phase01: number; nativeSimulationApplied: false; }; sampleDigest: string; } export interface CharacterMicroMotionApplicationReceipt { schemaVersion: 'holoscript.character-micro-motion-application.v2'; sampleDigest: string; blinkWeight: number; gazeYawRadians: number; gazePitchRadians: number; breathScale: number; nativeBlinkApplied: true; nativeGazeApplied: boolean; nativeBreathApplied: boolean; facialChangedVertexCount: number; gazeChangedVertexCount: number; breathChangedVertexCount: number; changedVertexCount: number; positionDigest: string; normalDigest: string; } export interface CharacterMicroMotionGeometry { eyeVertexRange: { vertexStart: number; vertexCount: number; }; jointIndices: Uint32Array; secondaryJointIndices?: Uint32Array; secondaryJointWeights?: Float32Array; } export interface NativeCharacterMicroMotionReceipt { schemaVersion: 'holoscript.native-character-micro-motion.v1'; gazeYawRadians: number; gazePitchRadians: number; breathScale: number; nativeGazeApplied: boolean; nativeBreathApplied: boolean; gazeChangedVertexCount: number; breathChangedVertexCount: number; changedVertexCount: number; positionDigest: string; normalDigest: string; } export interface NativeCharacterMicroMotionResult { positions: Float32Array; normals: Float32Array; receipt: NativeCharacterMicroMotionReceipt; } /** * Apply gaze and upper-chest breathing to a fresh copy of already-morphed native geometry. * * The two eye halves are rotated about their own bind-space bounds, which moves the layered * iris, pupil, cornea, and sclera as one globe without shifting the eyelid shell. Breathing is * limited to vertices primarily or secondarily influenced by spine1/spine2, so the cranial and * ocular ranges remain untouched. Every call is absolute and therefore drift-free. */ export declare function applyNativeCharacterMicroMotion(basePositions: Float32Array, baseNormals: Float32Array, geometry: CharacterMicroMotionGeometry, sample: CharacterMicroMotionSample): NativeCharacterMicroMotionResult; export declare function deriveCharacterMicroMotionConfig(input?: CharacterMicroMotionConfigInput): CharacterMicroMotionConfig; export declare function sampleCharacterMicroMotion(config: CharacterMicroMotionConfig, timeSeconds: number): CharacterMicroMotionSample; //# sourceMappingURL=AgentAvatarMicroMotion.d.ts.map