@lovelace_lol/embody 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/WasmRuntimeCore.d.ts +10 -24
- package/dist/core/index.d.ts +2 -4
- package/dist/core.cjs +27 -739
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +28 -735
- package/dist/core.js.map +1 -1
- package/dist/engines/three/Embody.d.ts +1 -2
- package/dist/index.cjs +164 -729
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.js +166 -726
- package/dist/index.js.map +1 -1
- package/dist/three.cjs +162 -499
- package/dist/three.cjs.map +1 -1
- package/dist/three.js +163 -500
- package/dist/three.js.map +1 -1
- package/dist/wasm/embody_wasm.d.ts +3 -3
- package/dist/wasm/embody_wasm.js +3 -3
- package/dist/wasm/embody_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/dist/core/TsRuntimeCore.d.ts +0 -40
package/dist/three.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/compositeAxis.ts","../src/mappings/visemeSystem.ts","../src/engines/three/balanceUtils.ts","../src/engines/three/bakedClipPartitioning.ts","../src/engines/three/ThreeAnimationRuntime.ts","../src/engines/three/ThreeModelInspector.ts","../src/engines/three/ThreeFrameApplier.ts","../src/core/TsRuntimeCore.ts","../src/core/contracts/abi.ts","../src/core/WasmRuntimeCore.ts","../src/hair/appearance.ts","../src/presets/cc4.ts","../src/engines/three/hair/HairPhysicsController.ts","../src/mappings/extendPresetWithProfile.ts","../src/presets/bettaFish.ts","../src/presets/registry.ts","../src/presets/index.ts","../src/engines/three/Embody.ts","../src/engines/three/ThreeClipAdapter.ts","../src/engines/three/characterScene.ts","../src/engines/three/modelLoader.ts","../src/engines/three/characterHost.ts"],"names":["PropertyBinding","AnimationClip","action","duration","state","loopMode","playbackRate","reverse","Vector3","morphTargetId","Quaternion","isRotationBoneBinding","clampBalance","target","getSideScale","boneId","meshId","clamp01","AU_INFO","CONTINUUM_PAIRS_MAP","CONTINUUM_LABELS","COMPOSITE_ROTATIONS","deg2rad","X_AXIS","Y_AXIS","Z_AXIS","initEmbodyCore","Box3","collectMorphMeshes","targets","empty","suffix","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","Mesh","MathUtils"],"mappings":"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","file":"three.js","sourcesContent":["import type { AUSelector, BoneBinding, RotationAxis } from './types';\n\nexport function toAUList(value?: AUSelector): number[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction findBoneBindingForNode(\n auToBones: Record<number, BoneBinding[]>,\n auId: number,\n nodeKey: string\n): BoneBinding | null {\n return auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n}\n\nexport function getCompositeAxisValue(\n axisConfig: RotationAxis | null | undefined,\n getValue: (auId: number) => number\n): number {\n if (!axisConfig) return 0;\n\n const negativeAUs = toAUList(axisConfig.negative);\n const positiveAUs = toAUList(axisConfig.positive);\n\n if (negativeAUs.length > 0 && positiveAUs.length > 0) {\n const negativeValue = Math.max(...negativeAUs.map(getValue), 0);\n const positiveValue = Math.max(...positiveAUs.map(getValue), 0);\n return positiveValue - negativeValue;\n }\n\n if (axisConfig.aus.length > 1) {\n return Math.max(...axisConfig.aus.map(getValue), 0);\n }\n\n return getValue(axisConfig.aus[0]);\n}\n\nexport function getCompositeAxisBinding(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined,\n direction: number,\n getValue: (auId: number) => number,\n auToBones: Record<number, BoneBinding[]>\n): BoneBinding | null {\n if (!axisConfig) return null;\n\n const directionalAUs = direction < 0 ? toAUList(axisConfig.negative) : toAUList(axisConfig.positive);\n const candidates = directionalAUs.length > 0 ? directionalAUs : axisConfig.aus;\n const ranked = [...candidates].sort((a, b) => getValue(b) - getValue(a));\n\n for (const auId of ranked) {\n const binding = findBoneBindingForNode(auToBones, auId, nodeKey);\n if (binding) return binding;\n }\n\n return null;\n}\n","import type {\n MappingEditorModel,\n MappingEditorSection,\n MorphCandidate,\n MorphCandidateMatch,\n MorphTargetRef,\n Profile,\n VisemeBinding,\n VisemeSlot,\n} from './types';\n\nfunction hasOwn<T extends object>(value: T | undefined, key: string): boolean {\n return Boolean(value && Object.prototype.hasOwnProperty.call(value, key));\n}\n\nfunction toSlotId(label: string, index: number): string {\n const normalized = label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return normalized || `viseme-${index}`;\n}\n\nfunction bindingTargets(binding: VisemeBinding | undefined): MorphTargetRef[] {\n if (!binding) return [];\n const targets = binding.targets?.map((target) => target.morph).filter((morph) => morph !== '');\n if (targets && targets.length > 0) return targets;\n return binding.morph !== undefined && binding.morph !== '' ? [binding.morph] : [];\n}\n\nexport interface ResolvedVisemeBindingTarget {\n morph: MorphTargetRef;\n weight: number;\n}\n\nfunction normalizeBindingWeight(weight: number | undefined): number {\n return Number.isFinite(weight) ? Math.max(0, weight ?? 1) : 1;\n}\n\nexport function getProfileVisemeSlots(profile: Profile): VisemeSlot[] {\n if (profile.visemeSlots && profile.visemeSlots.length > 0) {\n return [...profile.visemeSlots].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n\n return (profile.visemeKeys || []).map((key, index) => {\n const label = typeof key === 'string' && key ? key : `Viseme ${index}`;\n return {\n id: toSlotId(label, index),\n label,\n order: index,\n defaultJawAmount: profile.visemeJawAmounts?.[index],\n };\n });\n}\n\nexport function getVisemeSlotIndex(profile: Profile, slotId: string): number {\n return getProfileVisemeSlots(profile).findIndex((slot) => slot.id === slotId);\n}\n\nexport function compileVisemeKeys(profile: Profile): MorphTargetRef[] {\n const slots = getProfileVisemeSlots(profile);\n if (!profile.visemeBindings) return [...(profile.visemeKeys || [])];\n\n return slots.map((slot, index) => {\n const target = bindingTargets(profile.visemeBindings?.[slot.id])[0];\n return target ?? profile.visemeKeys?.[index] ?? '';\n });\n}\n\nexport function getVisemeBindingTargets(profile: Profile, visemeIndex: number): ResolvedVisemeBindingTarget[] {\n const slots = getProfileVisemeSlots(profile);\n const slot = slots[visemeIndex];\n const binding = slot ? profile.visemeBindings?.[slot.id] : undefined;\n\n const boundTargets = binding?.targets\n ?.filter((target) => target.morph !== undefined && target.morph !== '')\n .map((target) => ({\n morph: target.morph,\n weight: normalizeBindingWeight(target.weight),\n }));\n\n if (boundTargets && boundTargets.length > 0) {\n return boundTargets;\n }\n\n if (binding?.morph !== undefined && binding.morph !== '') {\n return [{ morph: binding.morph, weight: 1 }];\n }\n\n const legacyTarget = profile.visemeKeys?.[visemeIndex];\n return legacyTarget !== undefined && legacyTarget !== ''\n ? [{ morph: legacyTarget, weight: 1 }]\n : [];\n}\n\nexport function getVisemeJawAmounts(profile: Profile): number[] | undefined {\n const slots = getProfileVisemeSlots(profile);\n if (slots.length === 0) return profile.visemeJawAmounts ? [...profile.visemeJawAmounts] : undefined;\n return slots.map((slot, index) => slot.defaultJawAmount ?? profile.visemeJawAmounts?.[index] ?? 0);\n}\n\nexport function resolveVisemeMeshCategory(profile: Profile): string {\n const morphToMesh = profile.morphToMesh || {};\n if (profile.visemeMeshCategory) return profile.visemeMeshCategory;\n if (hasOwn(morphToMesh, 'viseme')) return 'viseme';\n return 'face';\n}\n\nexport function getMeshNamesForVisemeProfile(profile: Profile): string[] {\n const morphToMesh: Record<string, string[]> = profile.morphToMesh || {};\n const category = resolveVisemeMeshCategory(profile);\n if (hasOwn(morphToMesh, category)) {\n return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n }\n return profile.visemeMeshCategory ? [] : [...(morphToMesh.face || [])];\n}\n\nexport function getMeshNamesForAUProfile(profile: Profile, auId: number): string[] {\n const morphToMesh = profile.morphToMesh || {};\n const facePart = profile.auInfo?.[String(auId)]?.facePart;\n const category = facePart ? profile.auFacePartToMeshCategory?.[facePart] : undefined;\n if (category) return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n return [...(morphToMesh.face || [])];\n}\n\nfunction compileMatcher(pattern: string): RegExp | null {\n try {\n return new RegExp(pattern, 'i');\n } catch {\n return null;\n }\n}\n\nfunction classifyVisemeMorph(morphName: string, profile: Profile): MorphCandidateMatch[] {\n const slots = getProfileVisemeSlots(profile);\n const matches: MorphCandidateMatch[] = [];\n\n for (const slot of slots) {\n const explicitTargets = bindingTargets(profile.visemeBindings?.[slot.id]);\n if (explicitTargets.some((target) => String(target).toLowerCase() === morphName.toLowerCase())) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 1,\n reason: 'explicit',\n });\n continue;\n }\n\n for (const pattern of slot.matchers || []) {\n const matcher = compileMatcher(pattern);\n if (matcher?.test(morphName)) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 0.75,\n reason: 'regex',\n pattern,\n });\n }\n }\n }\n\n return matches;\n}\n\nexport function buildMappingEditorModel(profile: Profile, morphNames: string[] = []): MappingEditorModel {\n const sections = new Map<string, MappingEditorSection>();\n const configuredSections = profile.mappingSections || [];\n const configuredById = new Map(configuredSections.map((section) => [section.id, section]));\n let nextOrder = configuredSections.length;\n\n for (const section of configuredSections) {\n sections.set(section.id, { ...section });\n }\n\n const getOrder = (id: string, fallback?: number): number => {\n const configured = configuredById.get(id);\n if (configured) return configured.order;\n if (fallback !== undefined) return fallback;\n const order = nextOrder;\n nextOrder += 1;\n return order;\n };\n\n const auSectionOrders = new Map<string, number>();\n for (const [auId, info] of Object.entries(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n auSectionOrders.set(label, Math.min(auSectionOrders.get(label) ?? Number.MAX_SAFE_INTEGER, Number(auId)));\n }\n if (configuredSections.length === 0 && auSectionOrders.size > 0) {\n nextOrder = Math.max(...auSectionOrders.values()) + 1;\n }\n\n for (const info of Object.values(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n const configured = configuredById.get(label);\n const meshCategory = profile.auFacePartToMeshCategory?.[label] || 'face';\n sections.set(label, {\n ...configured,\n id: label,\n label: configured?.label || label,\n kind: 'au',\n order: getOrder(label, auSectionOrders.get(label)),\n meshCategory: configured?.meshCategory || meshCategory,\n facePart: label,\n });\n }\n\n const configuredVisemes = configuredById.get('Visemes');\n sections.set('Visemes', {\n ...configuredVisemes,\n id: 'Visemes',\n label: configuredVisemes?.label || 'Visemes',\n kind: 'viseme',\n order: getOrder('Visemes'),\n meshCategory: configuredVisemes?.meshCategory || resolveVisemeMeshCategory(profile),\n });\n\n if (hasOwn(profile.morphToMesh, 'hair')) {\n const configuredHair = configuredById.get('Hair');\n sections.set('Hair', {\n ...configuredHair,\n id: 'Hair',\n label: configuredHair?.label || 'Hair',\n kind: 'hair',\n order: getOrder('Hair'),\n meshCategory: configuredHair?.meshCategory || 'hair',\n });\n }\n\n const configuredUnmapped = configuredById.get('Unmapped');\n sections.set('Unmapped', {\n ...configuredUnmapped,\n id: 'Unmapped',\n label: configuredUnmapped?.label || 'Unmapped',\n kind: 'unmapped',\n order: getOrder('Unmapped'),\n meshCategory: configuredUnmapped?.meshCategory || 'face',\n });\n\n const candidates: MorphCandidate[] = morphNames.map((morph) => {\n const matches = classifyVisemeMorph(morph, profile);\n if (matches.length === 0) {\n return { morph, sectionId: 'Unmapped', kind: 'unmapped', matches };\n }\n const explicit = matches.filter((match) => match.reason === 'explicit');\n if (explicit.length > 0) {\n return { morph, sectionId: 'Visemes', kind: 'explicit', matches: explicit };\n }\n return {\n morph,\n sectionId: 'Visemes',\n kind: matches.length > 1 ? 'conflict' : 'candidate',\n matches,\n };\n });\n\n return {\n sections: Array.from(sections.values()).sort((a, b) => a.order - b.order || a.label.localeCompare(b.label)),\n candidates,\n };\n}\n\nexport interface ProviderVisemeEvent {\n provider: string;\n id?: string | number;\n phoneme?: string;\n}\n\nexport interface ProviderVisemeMatch {\n slotId: string;\n index: number;\n confidence: number;\n reason: 'provider' | 'phoneme' | 'rest' | 'none';\n}\n\nexport function mapProviderVisemeToSlot(profile: Profile, event: ProviderVisemeEvent): ProviderVisemeMatch | null {\n const slots = getProfileVisemeSlots(profile);\n const provider = event.provider.toLowerCase();\n\n if (event.id !== undefined) {\n const id = String(event.id);\n const index = slots.findIndex((slot) =>\n (slot.providerIds?.[provider] || []).some((candidate) => String(candidate) === id)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 1, reason: 'provider' };\n }\n }\n\n if (event.phoneme) {\n const phoneme = event.phoneme.toLowerCase();\n const index = slots.findIndex((slot) =>\n (slot.phonemes || []).some((candidate) => candidate.toLowerCase() === phoneme)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 0.8, reason: 'phoneme' };\n }\n }\n\n const restIndex = slots.findIndex((slot) => slot.id === 'rest' || slot.features?.lipClosed === 1);\n if (restIndex >= 0) {\n return { slotId: slots[restIndex].id, index: restIndex, confidence: 0.25, reason: 'rest' };\n }\n\n return null;\n}\n","export function clampBalance(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(-1, Math.min(1, value));\n}\n\nexport function getSideScale(\n balance: number,\n side?: 'left' | 'right'\n): number {\n if (side !== 'left' && side !== 'right') return 1;\n\n const clamped = clampBalance(balance);\n if (side === 'left') {\n return clamped > 0 ? 1 - clamped : 1;\n }\n return clamped < 0 ? 1 + clamped : 1;\n}\n\nexport function resolveCurveBalance(\n curveId: string,\n globalBalance: number,\n balanceMap?: Record<string, number>\n): number {\n if (balanceMap && Object.prototype.hasOwnProperty.call(balanceMap, curveId)) {\n return clampBalance(Number(balanceMap[curveId]));\n }\n return clampBalance(globalBalance);\n}\n","import {\n AnimationClip,\n KeyframeTrack,\n Object3D,\n PropertyBinding,\n} from 'three';\nimport type {\n AnimationBlendMode,\n BakedClipChannel,\n BakedClipChannelInfo,\n} from '../../core/types';\nimport type { ResolvedBones } from './types';\n\nconst MIXER_CLIP_PREFIX = '__embody_baked_partition__/';\nconst FACE_SAFE_TARGET_RE = /(head|neck|jaw|eye|brow|lid|mouth|lip|face|cheek|nose|tongue|teeth)/i;\nconst BODY_LIKE_TARGET_RE = /(root|armature|hips?|pelvis|spine|waist|chest|torso|shoulder|arm|forearm|hand|finger|leg|thigh|calf|knee|foot|toe|tail|wing|fin|body|abdomen|clavicle)/i;\nconst SCENE_LIKE_TARGET_RE = /(camera|cam|scene|world|global|origin|pivot|cube)/i;\nconst CHANNEL_ORDER: BakedClipChannel[] = ['face', 'body', 'scene'];\n\nexport interface PartitionedBakedMixerClip {\n channel: BakedClipChannel;\n clip: AnimationClip;\n}\n\nexport interface PartitionedBakedClip {\n sourceClip: AnimationClip;\n channels: BakedClipChannelInfo[];\n mixerClips: PartitionedBakedMixerClip[];\n}\n\ntype ParsedTrackTarget = {\n propertyName: string;\n target: Object3D | null;\n targetName: string;\n};\n\nfunction getMixerClipName(sourceClipName: string, channel: BakedClipChannel): string {\n return `${MIXER_CLIP_PREFIX}${sourceClipName}/${channel}`;\n}\n\nfunction parseTrackTarget(trackName: string, model: Object3D): ParsedTrackTarget | null {\n let parsed: ReturnType<typeof PropertyBinding.parseTrackName>;\n\n try {\n parsed = PropertyBinding.parseTrackName(trackName);\n } catch {\n return null;\n }\n\n const targetKey = parsed.objectName === 'bones' && parsed.objectIndex\n ? String(parsed.objectIndex)\n : parsed.nodeName;\n const target = targetKey\n ? model.getObjectByProperty('uuid', targetKey) ?? PropertyBinding.findNode(model, targetKey)\n : null;\n\n return {\n propertyName: parsed.propertyName,\n target,\n targetName: target?.name ?? parsed.nodeName ?? '',\n };\n}\n\nfunction isSceneTrackTarget(target: Object3D | null, targetName: string): boolean {\n if (!target) return true;\n if ((target as { isCamera?: boolean }).isCamera) return true;\n return SCENE_LIKE_TARGET_RE.test(targetName);\n}\n\nfunction isFaceSafeTransformTarget(\n target: Object3D | null,\n targetName: string,\n safeTransformTargets: Set<Object3D>\n): boolean {\n if (target && safeTransformTargets.has(target)) {\n return true;\n }\n if (!targetName) {\n return false;\n }\n if (BODY_LIKE_TARGET_RE.test(targetName) || SCENE_LIKE_TARGET_RE.test(targetName)) {\n return false;\n }\n return FACE_SAFE_TARGET_RE.test(targetName);\n}\n\nexport function classifyBakedTrack(\n track: KeyframeTrack,\n model: Object3D,\n bones: ResolvedBones\n): BakedClipChannel {\n const parsed = parseTrackTarget(track.name, model);\n if (!parsed) {\n return 'scene';\n }\n\n if (parsed.propertyName === 'morphTargetInfluences' || parsed.propertyName === 'weights') {\n return 'face';\n }\n\n if (isSceneTrackTarget(parsed.target, parsed.targetName)) {\n return 'scene';\n }\n\n if (parsed.propertyName === 'quaternion') {\n const safeTransformTargets = new Set(\n Object.values(bones)\n .map((entry) => entry?.obj)\n .filter((entry): entry is Object3D => !!entry)\n );\n\n if (isFaceSafeTransformTarget(parsed.target, parsed.targetName, safeTransformTargets)) {\n return 'face';\n }\n }\n\n return 'body';\n}\n\nexport function resolveBakedChannelBlendMode(\n channel: BakedClipChannel,\n requestedBlendMode: AnimationBlendMode\n): AnimationBlendMode | undefined {\n if (channel === 'face') {\n return requestedBlendMode === 'additive' ? 'additive' : 'replace';\n }\n if (channel === 'body') {\n return 'replace';\n }\n return undefined;\n}\n\nexport function resolveBakedAggregateBlendMode(\n channels: BakedClipChannelInfo[],\n requestedBlendMode: AnimationBlendMode\n): AnimationBlendMode {\n if (requestedBlendMode !== 'additive') {\n return 'replace';\n }\n\n return channels.some((channel) => (\n channel.channel === 'face'\n && channel.playable\n && channel.trackCount > 0\n ))\n ? 'additive'\n : 'replace';\n}\n\nexport function partitionBakedClip(\n clip: AnimationClip,\n model: Object3D,\n bones: ResolvedBones\n): PartitionedBakedClip {\n const tracksByChannel = new Map<BakedClipChannel, KeyframeTrack[]>(\n CHANNEL_ORDER.map((channel) => [channel, []])\n );\n\n for (const track of clip.tracks) {\n const channel = classifyBakedTrack(track, model, bones);\n tracksByChannel.get(channel)?.push(track.clone());\n }\n\n const mixerClips: PartitionedBakedMixerClip[] = [];\n const channels: BakedClipChannelInfo[] = [];\n\n for (const channel of CHANNEL_ORDER) {\n const tracks = tracksByChannel.get(channel) ?? [];\n if (tracks.length === 0) {\n continue;\n }\n\n const playable = channel !== 'scene';\n const blendMode = resolveBakedChannelBlendMode(channel, 'additive');\n channels.push({\n channel,\n trackCount: tracks.length,\n playable,\n blendMode,\n });\n\n if (!playable) {\n continue;\n }\n\n mixerClips.push({\n channel,\n clip: new AnimationClip(getMixerClipName(clip.name, channel), clip.duration, tracks),\n });\n }\n\n return {\n sourceClip: clip,\n channels,\n mixerClips,\n };\n}\n","/**\n * ThreeAnimationRuntime - Lerp-based animation driver\n *\n * Internal driver for time-based interpolation with easing functions.\n */\n\nimport {\n AnimationMixer,\n AnimationAction,\n AnimationClip,\n AnimationUtils,\n NumberKeyframeTrack,\n PropertyBinding,\n QuaternionKeyframeTrack,\n AdditiveAnimationBlendMode,\n LoopRepeat,\n LoopPingPong,\n LoopOnce,\n NormalAnimationBlendMode,\n Quaternion,\n Vector3,\n VectorKeyframeTrack,\n} from 'three';\nimport type { KeyframeTrack, Mesh, Object3D } from 'three';\nimport type {\n TransitionHandle,\n AnimationPlayOptions,\n AnimationClipInfo,\n AnimationState,\n AnimationActionHandle,\n CurvesMap,\n ClipOptions,\n ClipEventListener,\n ClipHandle,\n Snippet,\n BoneKey,\n CompositeRotation,\n RotationAxis,\n AnimationSource,\n AnimationBlendMode,\n BakedClipChannel,\n BakedClipChannelInfo,\n AnimationEasing,\n CurvePoint,\n SnippetChannel,\n TypedSnippet,\n BoneBinding,\n EmbodyAnimationRuntime,\n EmbodyAnimationRuntimeConnector,\n EmbodyAnimationRuntimeFactory,\n} from '../../core/types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from '../../core/compositeAxis';\nimport type { Profile } from '../../mappings/types';\nimport {\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getProfileVisemeSlots,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n} from '../../mappings/visemeSystem';\nimport type { ResolvedBones } from './types';\nimport { getSideScale, resolveCurveBalance } from './balanceUtils';\nimport {\n partitionBakedClip,\n resolveBakedAggregateBlendMode,\n resolveBakedChannelBlendMode,\n type PartitionedBakedClip,\n} from './bakedClipPartitioning';\n\ntype Transition = {\n key: string;\n from: number;\n to: number;\n duration: number; // seconds\n elapsed: number; // seconds\n apply: (value: number) => void;\n easing: (t: number) => number;\n resolve?: () => void; // Called when transition completes\n paused: boolean; // Individual pause state\n};\n\nconst easeInOutQuad = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\n// Smoother cubic easing - better for viseme transitions\nconst easeInOutCubic = (t: number) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n// Export easing functions for external use\nexport { easeInOutQuad, easeInOutCubic };\n\nfunction debugFlagEnabled(name: string): boolean {\n try {\n const locationLike = (globalThis as { location?: { search?: string } }).location;\n const search = typeof locationLike?.search === 'string' ? locationLike.search : '';\n if (!search) return false;\n const value = new URLSearchParams(search).get(name);\n return value === '1' || value === 'true';\n } catch {\n return false;\n }\n}\n\nfunction typedLipSyncDebugEnabled(): boolean {\n return debugFlagEnabled('polymerVocalDebug') || debugFlagEnabled('polymerLipSyncDebug');\n}\n\nfunction logTypedLipSyncDebug(label: string, payload: unknown): void {\n if (!typedLipSyncDebugEnabled()) return;\n try {\n console.info(`${label} ${JSON.stringify(payload)}`);\n } catch {\n console.info(label, payload);\n }\n}\n\nfunction summarizeKeyframes(keyframes: ScalarKeyframe[]) {\n return {\n frames: keyframes.length,\n firstSec: keyframes[0]?.time ?? null,\n lastSec: keyframes[keyframes.length - 1]?.time ?? null,\n peak: keyframes.reduce((max, frame) => Math.max(max, Number.isFinite(frame.intensity) ? frame.intensity : 0), 0),\n };\n}\n\nfunction summarizeTypedChannel(channel: SnippetChannel) {\n return {\n target: channel.target,\n intensityScale: channel.intensityScale ?? 1,\n ...summarizeKeyframes(channel.keyframes ?? []),\n };\n}\n\nfunction summarizeBindingTarget(bindingTarget: ReturnType<typeof getVisemeBindingTargets>[number]) {\n return {\n morph: bindingTarget.morph,\n weight: bindingTarget.weight,\n };\n}\n\nexport class ThreeAnimationRuntime {\n private transitions = new Map<string, Transition>();\n\n /**\n * Tick all active transitions by dt seconds.\n * Applies eased interpolation and removes completed transitions.\n * Respects individual transition pause state.\n */\n tick(dtSeconds: number): void {\n if (dtSeconds <= 0) return;\n\n const completed: string[] = [];\n\n this.transitions.forEach((t, key) => {\n // Skip paused transitions\n if (t.paused) return;\n\n t.elapsed += dtSeconds;\n const progress = Math.min(t.elapsed / t.duration, 1.0);\n const easedProgress = t.easing(progress);\n\n // Interpolate and apply\n const value = t.from + (t.to - t.from) * easedProgress;\n t.apply(value);\n\n // Check completion\n if (progress >= 1.0) {\n completed.push(key);\n t.resolve?.();\n }\n });\n\n // Remove completed transitions\n completed.forEach(key => this.transitions.delete(key));\n }\n\n /**\n * Add or replace a transition for the given key.\n * If a transition with the same key exists, it is cancelled and replaced.\n * @returns TransitionHandle with { promise, pause, resume, cancel }\n */\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing: (t: number) => number = easeInOutQuad\n ): TransitionHandle {\n // Convert to seconds once here - all callers pass milliseconds\n const durationSec = durationMs / 1000;\n\n // Cancel existing transition for this key\n const existing = this.transitions.get(key);\n if (existing?.resolve) {\n existing.resolve(); // Resolve immediately (cancelled)\n }\n\n // Instant transition if duration is 0 or values are equal\n if (durationSec <= 0 || Math.abs(to - from) < 1e-6) {\n apply(to);\n return {\n promise: Promise.resolve(),\n pause: () => {},\n resume: () => {},\n cancel: () => {},\n };\n }\n\n const promise = new Promise<void>((resolve) => {\n const transitionObj: Transition = {\n key,\n from,\n to,\n duration: durationSec,\n elapsed: 0,\n apply,\n easing,\n resolve,\n paused: false,\n };\n this.transitions.set(key, transitionObj);\n });\n\n return {\n promise,\n pause: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = true;\n },\n resume: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = false;\n },\n cancel: () => {\n const t = this.transitions.get(key);\n if (t) {\n t.resolve?.();\n this.transitions.delete(key);\n }\n },\n };\n }\n\n /** Clear all running transitions. */\n clearTransitions(): void {\n this.transitions.forEach(t => t.resolve?.());\n this.transitions.clear();\n }\n\n /** Get count of active transitions. */\n getActiveTransitionCount(): number {\n return this.transitions.size;\n }\n}\n\nexport interface ThreeAnimationSystemHost {\n getModel: () => Object3D | null;\n getMeshes: () => Mesh[];\n getMeshByName: (name: string) => Mesh | undefined;\n getMeshNamesForAU?: (auId: number) => string[];\n getMeshNamesForViseme?: () => string[];\n getCurrentAUValue?: (auId: number) => number;\n getCurrentVisemeValue?: (visemeIndex: number) => number;\n getCurrentMorphValue?: (morphKey: string, meshNames?: string[]) => number;\n getCurrentMorphIndexValue?: (morphIndex: number, meshNames?: string[]) => number;\n getCurrentBoneQuaternion?: (nodeKey: string) => Quaternion | null;\n getCurrentBonePositionValue?: (nodeKey: string, axis: 'x' | 'y' | 'z') => number | null;\n getBones: () => ResolvedBones;\n getConfig: () => Profile;\n getCompositeRotations: () => CompositeRotation[];\n computeSideValues: (base: number, balance?: number) => { left: number; right: number };\n getAUMixWeight: (auId: number) => number;\n isMixedAU: (auId: number) => boolean;\n reapplyProceduralState?: () => void;\n}\n\n/** @deprecated Use ThreeAnimationSystemHost. */\nexport type AnimationControllerHost = ThreeAnimationSystemHost;\n\n/** @deprecated Use ThreeAnimationSystemHost. */\nexport type BakedAnimationHost = ThreeAnimationSystemHost;\n\nexport type ThreeAnimationSystemOptions = {\n animationRuntimeFactory?: EmbodyAnimationRuntimeFactory;\n};\n\n// Lightweight unique id for mixer actions/handles\nconst makeActionId = () => `act_${Math.random().toString(36).slice(2, 8)}_${Date.now().toString(36)}`;\nconst X_AXIS = new Vector3(1, 0, 0);\nconst Y_AXIS = new Vector3(0, 1, 0);\nconst Z_AXIS = new Vector3(0, 0, 1);\nconst CLIP_EVENT_METADATA_KEY = '__embodyClipEvents';\nconst CLIP_EVENT_EPSILON = 1e-4;\n\ntype RotationBoneBinding = BoneBinding & { channel: 'rx' | 'ry' | 'rz' };\n\nfunction isRotationBoneBinding(binding: BoneBinding | undefined): binding is RotationBoneBinding {\n return binding?.channel === 'rx' || binding?.channel === 'ry' || binding?.channel === 'rz';\n}\n\nfunction getAutoVisemeJawBinding(config: Profile, bones?: ResolvedBones): RotationBoneBinding | null {\n const candidates = [\n config.auToBones[103]?.find(isRotationBoneBinding),\n config.auToBones[26]?.find(isRotationBoneBinding),\n ].filter((binding): binding is RotationBoneBinding => !!binding);\n if (bones) {\n return candidates.find((binding) => !!bones[binding.node]) ?? candidates[0] ?? null;\n }\n return candidates[0] ?? null;\n}\n\nfunction axisVectorForRotationChannel(channel: 'rx' | 'ry' | 'rz'): Vector3 {\n return channel === 'rx' ? X_AXIS : channel === 'ry' ? Y_AXIS : Z_AXIS;\n}\n\ntype ClipEventMetadata = {\n keyframeTimes: number[];\n};\n\ntype ScalarKeyframe = Pick<CurvePoint, 'time' | 'intensity' | 'inherit'>;\n\ntype ClipMonitor = {\n action: AnimationAction;\n actionId: string;\n clip: AnimationClip;\n clipName: string;\n duration: number;\n keyframeTimes: number[];\n listeners: Set<ClipEventListener>;\n initialDirection: 1 | -1;\n direction: 1 | -1;\n iteration: number;\n lastTime: number;\n lastKeyframeIndex: number;\n loopMode: 'once' | 'repeat' | 'pingpong';\n finishedPending: boolean;\n cleanedUp: boolean;\n resolveFinished: () => void;\n};\n\ntype NormalizedPlaybackState = {\n source: AnimationSource;\n loop: boolean;\n loopMode: 'repeat' | 'pingpong' | 'once';\n repeatCount?: number;\n reverse: boolean;\n playbackRate: number;\n weight: number;\n balance: number;\n requestedBlendMode: AnimationBlendMode;\n blendMode: AnimationBlendMode;\n easing: AnimationEasing;\n};\n\ntype BakedActionGroup = {\n actionId: string;\n channelActions: Map<BakedClipChannel, AnimationAction>;\n pendingFinishedChannels: Set<BakedClipChannel>;\n finishedPromise: Promise<void>;\n resolveFinished: () => void;\n};\n\ntype DynamicClipSource = {\n clipName: string;\n curves?: CurvesMap;\n channels?: SnippetChannel[];\n options?: ClipOptions;\n hasInheritedStart: boolean;\n};\n\ntype ClipParamsUpdate = {\n weight?: number;\n rate?: number;\n loop?: boolean;\n loopMode?: 'once' | 'repeat' | 'pingpong';\n repeatCount?: number;\n reverse?: boolean;\n actionId?: string;\n};\n\nconst ADDITIVE_BAKED_MIXER_CLIP_SUFFIX = '__embody_additive_delta';\n\nexport class ThreeAnimationSystem {\n private host: ThreeAnimationSystemHost;\n // Clip-backed snippets need a later mixer pass so they can override baked additive tracks.\n private animationMixer: AnimationMixer | null = null;\n private clipAnimationMixer: AnimationMixer | null = null;\n private mixerFinishedListenerAttached = false;\n private clipMixerFinishedListenerAttached = false;\n private animationClips: AnimationClip[] = [];\n private bakedSourceClips = new Map<string, PartitionedBakedClip>();\n private bakedMixerActions = new Map<string, AnimationAction>();\n private bakedAdditiveMixerClips = new Map<string, AnimationClip>();\n private bakedActionGroups = new Map<string, BakedActionGroup>();\n private bakedMixerClipToSource = new Map<string, { sourceClipName: string; channel: BakedClipChannel }>();\n private animationActions = new Map<string, AnimationAction>();\n private animationFinishedCallbacks = new Map<string, () => void>();\n private clipActions = new Map<string, AnimationAction>();\n private clipHandles = new Map<string, ClipHandle>();\n private rendererClipHandles = new Map<string, ClipHandle>();\n private clipSources = new Map<string, AnimationSource>();\n private playbackState = new Map<string, NormalizedPlaybackState>();\n private actionIds = new WeakMap<AnimationAction, string>();\n private actionIdToClip = new Map<string, string>();\n private clipMonitors = new Map<string, ClipMonitor>();\n private dynamicClipSources = new WeakMap<AnimationClip, DynamicClipSource>();\n private cljsAnimationRuntime: EmbodyAnimationRuntime | null = null;\n\n constructor(host: ThreeAnimationSystemHost, options: ThreeAnimationSystemOptions = {}) {\n this.host = host;\n if (options.animationRuntimeFactory) {\n this.cljsAnimationRuntime = options.animationRuntimeFactory(\n { owner: 'ThreeAnimationSystem' },\n this.createRuntimeConnector()\n );\n }\n }\n\n private shouldDebugClipLogs(): boolean {\n const globalLocation = typeof window !== 'undefined' ? window.location : undefined;\n const search = globalLocation?.search ?? '';\n return search.includes('polymerVocalDebug=1')\n || search.includes('embodyDebug=1');\n }\n\n private debugClipLog(...args: unknown[]): void {\n if (this.shouldDebugClipLogs()) {\n console.log(...args);\n }\n }\n\n private createRuntimeConnector(): EmbodyAnimationRuntimeConnector {\n return {\n buildClip: (clipName, curves, options) => {\n const handle = this.buildClipDirect(clipName, curves, options);\n if (!handle) return null;\n this.rendererClipHandles.set(clipName, handle);\n handle.subscribe?.((event) => {\n this.cljsAnimationRuntime?.acceptClipEvent(event);\n });\n return {\n actionId: handle.actionId,\n duration: handle.getDuration(),\n time: handle.getTime(),\n };\n },\n stopClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.stop();\n this.rendererClipHandles.delete(clipName);\n },\n pauseClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.pause();\n },\n resumeClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.resume();\n },\n setClipWeight: (clipName, weight) => {\n this.rendererClipHandles.get(clipName)?.setWeight?.(weight);\n },\n setClipPlaybackRate: (clipName, rate) => {\n this.rendererClipHandles.get(clipName)?.setPlaybackRate?.(rate);\n },\n setClipLoop: (clipName, mode, repeatCount) => {\n this.rendererClipHandles.get(clipName)?.setLoop?.(mode, repeatCount);\n },\n setClipTime: (clipName, time) => {\n this.rendererClipHandles.get(clipName)?.setTime?.(time);\n },\n getClipTime: (clipName) => this.rendererClipHandles.get(clipName)?.getTime() ?? 0,\n getClipDuration: (clipName) => this.rendererClipHandles.get(clipName)?.getDuration() ?? 0,\n updateClipParams: (clipName, params) => this.updateClipParamsDirect(clipName, params as ClipParamsUpdate),\n cleanupSnippet: (clipName) => this.cleanupSnippetDirect(clipName),\n };\n }\n\n getRuntimeSnapshot(): Record<string, unknown> | null {\n return this.cljsAnimationRuntime?.snapshot() ?? null;\n }\n\n private getActionId(action?: AnimationAction | null): string | undefined {\n if (!action) return undefined;\n return this.actionIds.get(action) ?? action.__actionId;\n }\n\n private setActionId(action: AnimationAction, clipName: string): string {\n const actionId = makeActionId();\n this.actionIds.set(action, actionId);\n this.actionIdToClip.set(actionId, clipName);\n action.__actionId = actionId;\n return actionId;\n }\n\n private clearActionId(action?: AnimationAction | null): void {\n if (!action) return;\n const actionId = this.getActionId(action);\n if (actionId) {\n this.actionIdToClip.delete(actionId);\n }\n this.actionIds.delete(action);\n delete action.__actionId;\n }\n\n private uncacheClip(\n clip?: AnimationClip | null,\n mixer: AnimationMixer | null = this.animationMixer\n ): void {\n if (!clip || !mixer) return;\n try {\n mixer.uncacheClip(clip);\n } catch {}\n }\n\n private uncacheAction(\n action?: AnimationAction | null,\n mixer: AnimationMixer | null = this.animationMixer\n ): void {\n if (!action || !mixer) return;\n try {\n const clip = action.getClip();\n if (clip) {\n mixer.uncacheAction(clip);\n mixer.uncacheClip(clip);\n }\n } catch {}\n }\n\n private releaseBakedMixerAction(mixerClipName: string): void {\n const action = this.bakedMixerActions.get(mixerClipName);\n if (!action) return;\n try {\n action.stop();\n } catch {}\n this.uncacheAction(action);\n this.clearActionId(action);\n this.bakedMixerActions.delete(mixerClipName);\n }\n\n private clearBakedAdditiveMixerClip(mixerClipName: string): void {\n const clip = this.bakedAdditiveMixerClips.get(mixerClipName);\n if (!clip) return;\n this.uncacheClip(clip);\n this.bakedAdditiveMixerClips.delete(mixerClipName);\n }\n\n private clearAllBakedAdditiveMixerClips(): void {\n for (const mixerClipName of Array.from(this.bakedAdditiveMixerClips.keys())) {\n this.clearBakedAdditiveMixerClip(mixerClipName);\n }\n }\n\n private resolveTrackTarget(\n model: Object3D,\n parsed: ReturnType<typeof PropertyBinding.parseTrackName>\n ): Object3D | null {\n const targetKey = parsed.objectName === 'bones' && parsed.objectIndex\n ? parsed.objectIndex\n : parsed.nodeName;\n if (!targetKey) {\n return null;\n }\n return model.getObjectByProperty('uuid', targetKey)\n ?? PropertyBinding.findNode(model, targetKey)\n ?? null;\n }\n\n private getMorphTrackBaseValue(\n target: Object3D | null,\n propertyIndex: string | number | undefined\n ): number {\n if (!target) {\n return 0;\n }\n\n const meshTarget = target as Mesh & {\n morphTargetInfluences?: number[];\n morphTargetDictionary?: Record<string, number>;\n };\n const influences = meshTarget.morphTargetInfluences;\n if (!influences) {\n return 0;\n }\n\n let morphIndex: number | undefined;\n if (typeof propertyIndex === 'number' && Number.isInteger(propertyIndex)) {\n morphIndex = propertyIndex;\n } else if (typeof propertyIndex === 'string') {\n if (/^\\d+$/.test(propertyIndex)) {\n morphIndex = Number(propertyIndex);\n } else {\n morphIndex = meshTarget.morphTargetDictionary?.[propertyIndex];\n }\n }\n\n if (morphIndex === undefined) {\n return 0;\n }\n\n return influences[morphIndex] ?? 0;\n }\n\n private canCreateFirstFrameReferenceTrack(track: KeyframeTrack): boolean {\n const valueSize = track.getValueSize();\n if (!Number.isFinite(valueSize) || valueSize <= 0 || track.values.length < valueSize) {\n return false;\n }\n\n return track.ValueTypeName === 'number'\n || track.ValueTypeName === 'quaternion'\n || track.ValueTypeName === 'vector';\n }\n\n private createFirstFrameReferenceTrack(track: KeyframeTrack): KeyframeTrack | null {\n const valueSize = track.getValueSize();\n if (!this.canCreateFirstFrameReferenceTrack(track)) {\n return null;\n }\n\n const values = Array.from(track.values.slice(0, valueSize));\n if (track.ValueTypeName === 'number') {\n return new NumberKeyframeTrack(track.name, [0], values);\n }\n if (track.ValueTypeName === 'quaternion') {\n return new QuaternionKeyframeTrack(track.name, [0], values);\n }\n if (track.ValueTypeName === 'vector') {\n return new VectorKeyframeTrack(track.name, [0], values);\n }\n return null;\n }\n\n private createAdditiveReferenceTrack(\n track: KeyframeTrack,\n model: Object3D\n ): KeyframeTrack | null {\n const trackName = typeof track?.name === 'string' ? track.name : '';\n if (!trackName) {\n return null;\n }\n\n let parsed: ReturnType<typeof PropertyBinding.parseTrackName>;\n try {\n parsed = PropertyBinding.parseTrackName(trackName);\n } catch {\n return null;\n }\n\n const target = this.resolveTrackTarget(model, parsed);\n if (parsed.propertyName === 'morphTargetInfluences') {\n return new NumberKeyframeTrack(\n track.name,\n [0],\n [this.getMorphTrackBaseValue(target, parsed.propertyIndex)]\n );\n }\n\n return this.createFirstFrameReferenceTrack(track);\n }\n\n private createAdditiveMixerClip(mixerClip: AnimationClip): AnimationClip | null {\n const model = this.host.getModel();\n if (!model) {\n return null;\n }\n\n const additiveTracks: KeyframeTrack[] = [];\n const referenceTracks: KeyframeTrack[] = [];\n for (const track of mixerClip.tracks) {\n const referenceTrack = this.createAdditiveReferenceTrack(track, model);\n if (!referenceTrack) {\n continue;\n }\n additiveTracks.push(track.clone());\n referenceTracks.push(referenceTrack);\n }\n\n const additiveClip = new AnimationClip(\n `${mixerClip.name}${ADDITIVE_BAKED_MIXER_CLIP_SUFFIX}`,\n mixerClip.duration,\n additiveTracks\n );\n if (additiveTracks.length > 0) {\n const referenceClip = new AnimationClip(\n `${mixerClip.name}${ADDITIVE_BAKED_MIXER_CLIP_SUFFIX}_reference`,\n 0,\n referenceTracks\n );\n AnimationUtils.makeClipAdditive(additiveClip, 0, referenceClip);\n }\n return additiveClip;\n }\n\n private getOrCreateBakedAdditiveMixerClip(mixerClip: AnimationClip): AnimationClip | null {\n const cached = this.bakedAdditiveMixerClips.get(mixerClip.name);\n if (cached) {\n return cached;\n }\n\n const additiveClip = this.createAdditiveMixerClip(mixerClip);\n if (!additiveClip) {\n return null;\n }\n this.bakedAdditiveMixerClips.set(mixerClip.name, additiveClip);\n return additiveClip;\n }\n\n private setClipEventMetadata(clip: AnimationClip, metadata: ClipEventMetadata) {\n const userData = ((clip as any).userData ??= {});\n userData[CLIP_EVENT_METADATA_KEY] = metadata;\n }\n\n private getClipEventMetadata(clip: AnimationClip): ClipEventMetadata {\n const userData = (clip as any).userData;\n const keyframeTimes = Array.isArray(userData?.[CLIP_EVENT_METADATA_KEY]?.keyframeTimes)\n ? userData[CLIP_EVENT_METADATA_KEY].keyframeTimes.filter((time: unknown): time is number => Number.isFinite(time as number))\n : [];\n return { keyframeTimes };\n }\n\n private curvesHaveInheritedStart(curves: CurvesMap): boolean {\n return Object.values(curves).some((curve) => !!curve?.[0]?.inherit);\n }\n\n private channelsHaveInheritedStart(channels: readonly SnippetChannel[]): boolean {\n return channels.some((channel) => !!channel.keyframes?.[0]?.inherit);\n }\n\n private rebuildDynamicClip(source: DynamicClipSource): AnimationClip | null {\n if (source.channels) {\n return this.typedSnippetToClip(source.clipName, source.channels, source.options);\n }\n if (source.curves) {\n return this.snippetToClip(source.clipName, source.curves, source.options);\n }\n return null;\n }\n\n private resolveInheritedClipForPlayback(clip: AnimationClip): AnimationClip {\n const source = this.dynamicClipSources.get(clip);\n if (!source?.hasInheritedStart) {\n return clip;\n }\n return this.rebuildDynamicClip(source) ?? clip;\n }\n\n private getKeyframeIndex(times: number[], currentTime: number) {\n if (!times.length) return -1;\n const target = Math.max(0, currentTime) + 1e-3;\n let lo = 0;\n let hi = times.length - 1;\n let idx = 0;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n if (times[mid] <= target) {\n idx = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return idx;\n }\n\n private emitClipEvent(monitor: ClipMonitor, event: Parameters<ClipEventListener>[0]) {\n for (const listener of Array.from(monitor.listeners)) {\n try {\n listener(event);\n } catch (error) {\n console.error('[Embody] clip event listener failed', error);\n }\n }\n }\n\n private emitKeyframesForRange(\n monitor: ClipMonitor,\n startTime: number,\n endTime: number,\n direction: 1 | -1,\n includeStart: boolean\n ) {\n if (!monitor.keyframeTimes.length) return;\n\n const times = direction === 1 ? monitor.keyframeTimes : [...monitor.keyframeTimes].reverse();\n for (const time of times) {\n const matchesForward = direction === 1\n && (includeStart ? time >= startTime - CLIP_EVENT_EPSILON : time > startTime + CLIP_EVENT_EPSILON)\n && time <= endTime + CLIP_EVENT_EPSILON;\n const matchesReverse = direction === -1\n && (includeStart ? time <= startTime + CLIP_EVENT_EPSILON : time < startTime - CLIP_EVENT_EPSILON)\n && time >= endTime - CLIP_EVENT_EPSILON;\n if (!matchesForward && !matchesReverse) continue;\n\n const keyframeIndex = monitor.keyframeTimes.indexOf(time);\n monitor.lastKeyframeIndex = keyframeIndex;\n this.emitClipEvent(monitor, {\n type: 'keyframe',\n clipName: monitor.clipName,\n keyframeIndex,\n totalKeyframes: monitor.keyframeTimes.length,\n currentTime: time,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n }\n }\n\n private resetClipMonitor(monitor: ClipMonitor, currentTime: number) {\n monitor.iteration = 0;\n monitor.direction = monitor.initialDirection;\n monitor.lastTime = currentTime;\n monitor.lastKeyframeIndex = this.getKeyframeIndex(monitor.keyframeTimes, currentTime);\n monitor.finishedPending = false;\n }\n\n private syncClipMonitorTime(monitor: ClipMonitor, currentTime: number, emitSeek = false) {\n const clamped = Math.max(0, Math.min(monitor.duration, currentTime));\n monitor.lastTime = clamped;\n monitor.lastKeyframeIndex = this.getKeyframeIndex(monitor.keyframeTimes, clamped);\n if (emitSeek) {\n this.emitClipEvent(monitor, {\n type: 'seek',\n clipName: monitor.clipName,\n currentTime: clamped,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n }\n }\n\n private cleanupClipMonitor(actionId: string, options: { resolveFinished?: boolean } = {}) {\n const monitor = this.clipMonitors.get(actionId);\n if (!monitor || monitor.cleanedUp) return;\n const { resolveFinished = true } = options;\n monitor.cleanedUp = true;\n try { monitor.action.paused = true; } catch {}\n if (resolveFinished) {\n monitor.resolveFinished();\n }\n monitor.listeners.clear();\n this.clipMonitors.delete(actionId);\n this.actionIdToClip.delete(actionId);\n }\n\n private advanceClipMonitor(monitor: ClipMonitor, previousTime: number) {\n if (monitor.cleanedUp || (monitor.action.paused && !monitor.finishedPending)) return;\n\n const currentTime = Math.max(0, Math.min(monitor.duration, monitor.action.time));\n const delta = currentTime - previousTime;\n\n if (monitor.loopMode === 'pingpong') {\n const movingForward = monitor.direction === 1;\n const bouncedAtEnd = movingForward && delta < -CLIP_EVENT_EPSILON;\n const bouncedAtStart = !movingForward && delta > CLIP_EVENT_EPSILON;\n\n if (bouncedAtEnd) {\n this.emitKeyframesForRange(monitor, previousTime, monitor.duration, 1, false);\n monitor.direction = -1;\n this.emitKeyframesForRange(monitor, monitor.duration, currentTime, -1, false);\n } else if (bouncedAtStart) {\n this.emitKeyframesForRange(monitor, previousTime, 0, -1, false);\n monitor.direction = 1;\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: 0,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, 0, currentTime, 1, false);\n } else if (delta > CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, 1, false);\n monitor.direction = 1;\n } else if (delta < -CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, -1, false);\n monitor.direction = -1;\n }\n } else if (monitor.direction === 1) {\n const wrapped = currentTime + CLIP_EVENT_EPSILON < previousTime;\n if (wrapped) {\n this.emitKeyframesForRange(monitor, previousTime, monitor.duration, 1, false);\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: 0,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, 0, currentTime, 1, true);\n } else if (delta > CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, 1, false);\n }\n } else {\n const wrapped = currentTime > previousTime + CLIP_EVENT_EPSILON;\n if (wrapped) {\n this.emitKeyframesForRange(monitor, previousTime, 0, -1, false);\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: monitor.duration,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, monitor.duration, currentTime, -1, true);\n } else if (delta < -CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, -1, false);\n }\n }\n\n this.syncClipMonitorTime(monitor, currentTime);\n }\n\n private normalizePlaybackOptions(\n options: AnimationPlayOptions | ClipOptions | undefined,\n defaults: { loop: boolean; source: AnimationSource }\n ): NormalizedPlaybackState {\n const clipOptions = options as ClipOptions | undefined;\n const rawRate = options?.playbackRate ?? options?.speed ?? 1.0;\n const playbackRate = Number.isFinite(rawRate) ? Math.max(0, Math.abs(rawRate)) : 1.0;\n const rawWeight = options?.weight ?? options?.intensity ?? clipOptions?.mixerWeight ?? 1.0;\n const weight = Number.isFinite(rawWeight) ? Math.max(0, rawWeight) : 1.0;\n const loopMode = options?.loopMode\n ?? (typeof options?.loop === 'boolean'\n ? (options.loop ? 'repeat' : 'once')\n : (defaults.loop ? 'repeat' : 'once'));\n const requestedBlendMode = options?.blendMode ?? (clipOptions?.mixerAdditive ? 'additive' : 'replace');\n return {\n source: options?.source ?? defaults.source,\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: options?.repeatCount,\n reverse: !!options?.reverse,\n playbackRate,\n weight,\n balance: Number.isFinite(options?.balance) ? options?.balance ?? 0 : 0,\n requestedBlendMode,\n blendMode: requestedBlendMode,\n easing: options?.easing ?? 'linear',\n };\n }\n\n private applyPlaybackState(action: AnimationAction, state: NormalizedPlaybackState): void {\n const signedRate = state.reverse ? -state.playbackRate : state.playbackRate;\n action.setEffectiveTimeScale(signedRate);\n action.setEffectiveWeight(state.weight);\n action.blendMode = state.blendMode === 'additive'\n ? AdditiveAnimationBlendMode\n : NormalAnimationBlendMode;\n\n const reps = state.repeatCount ?? Infinity;\n if (state.loopMode === 'pingpong') {\n action.setLoop(LoopPingPong, reps);\n } else if (state.loopMode === 'once') {\n action.setLoop(LoopOnce, 1);\n } else {\n action.setLoop(LoopRepeat, reps);\n }\n action.clampWhenFinished = state.loopMode === 'once';\n }\n\n private setPlaybackState(clipName: string, state: NormalizedPlaybackState): void {\n this.playbackState.set(clipName, state);\n this.clipSources.set(clipName, state.source);\n }\n\n private getPlaybackStateSnapshot(\n clipName: string,\n defaults: { loop: boolean; source: AnimationSource }\n ): NormalizedPlaybackState {\n const existing = this.playbackState.get(clipName);\n if (existing) {\n return { ...existing };\n }\n return this.normalizePlaybackOptions(undefined, defaults);\n }\n\n private mergePlaybackOptions(\n current: NormalizedPlaybackState,\n options: AnimationPlayOptions | ClipOptions | undefined\n ): NormalizedPlaybackState {\n if (!options) {\n return current;\n }\n const next = { ...current };\n const clipOptions = options as ClipOptions | undefined;\n const loopMode = options.loopMode\n ?? (typeof options.loop === 'boolean' ? (options.loop ? 'repeat' : 'once') : undefined);\n\n if (options.source) next.source = options.source;\n if (loopMode) {\n next.loopMode = loopMode;\n next.loop = loopMode !== 'once';\n }\n if (options.repeatCount !== undefined) {\n next.repeatCount = Number.isFinite(options.repeatCount)\n ? Math.max(0, options.repeatCount ?? 0)\n : undefined;\n }\n if (typeof options.reverse === 'boolean') {\n next.reverse = options.reverse;\n }\n\n const rate = options.playbackRate ?? options.speed;\n if (rate !== undefined) {\n next.playbackRate = Number.isFinite(rate) ? Math.max(0, Math.abs(rate)) : current.playbackRate;\n }\n\n const weight = options.weight ?? options.intensity ?? clipOptions?.mixerWeight;\n if (weight !== undefined) {\n next.weight = Number.isFinite(weight) ? Math.max(0, weight) : current.weight;\n }\n\n if (typeof options.balance === 'number' && Number.isFinite(options.balance)) {\n next.balance = Math.max(-1, Math.min(1, options.balance));\n }\n\n if (options.blendMode) {\n next.requestedBlendMode = options.blendMode;\n } else if (typeof clipOptions?.mixerAdditive === 'boolean') {\n next.requestedBlendMode = clipOptions.mixerAdditive ? 'additive' : 'replace';\n }\n next.blendMode = next.requestedBlendMode;\n\n if (options.easing) {\n next.easing = options.easing;\n }\n\n return next;\n }\n\n private isBakedSourceClip(clipName: string): boolean {\n return this.bakedSourceClips.has(clipName);\n }\n\n private getBakedSourceClip(clipName: string): PartitionedBakedClip | undefined {\n return this.bakedSourceClips.get(clipName);\n }\n\n private getBakedChannelInfo(\n clipName: string,\n playbackState?: NormalizedPlaybackState\n ): BakedClipChannelInfo[] | undefined {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return undefined;\n }\n\n const requestedBlendMode = playbackState?.requestedBlendMode ?? 'replace';\n return bakedClip.channels.map((channel) => ({\n ...channel,\n blendMode: resolveBakedChannelBlendMode(channel.channel, requestedBlendMode),\n }));\n }\n\n private getBakedAggregateBlendMode(\n clipName: string,\n playbackState?: NormalizedPlaybackState\n ): AnimationBlendMode {\n const channels = this.getBakedChannelInfo(clipName, playbackState);\n if (!channels) {\n return playbackState?.requestedBlendMode ?? playbackState?.blendMode ?? 'replace';\n }\n return resolveBakedAggregateBlendMode(\n channels,\n playbackState?.requestedBlendMode ?? 'replace'\n );\n }\n\n private applyPlaybackStateToBakedAction(\n action: AnimationAction,\n state: NormalizedPlaybackState,\n channel: BakedClipChannel\n ): void {\n this.applyPlaybackState(action, {\n ...state,\n blendMode: resolveBakedChannelBlendMode(channel, state.requestedBlendMode) ?? 'replace',\n });\n }\n\n private resolveStartTime(\n duration: number,\n state: NormalizedPlaybackState,\n explicitStartTime?: number\n ): number {\n if (typeof explicitStartTime === 'number' && Number.isFinite(explicitStartTime)) {\n return Math.max(0, Math.min(duration, explicitStartTime));\n }\n if (state.reverse && state.loopMode === 'once') {\n return duration;\n }\n return 0;\n }\n\n private getOrCreateBakedMixerAction(\n sourceClipName: string,\n channel: BakedClipChannel,\n blendMode: AnimationBlendMode = 'replace'\n ): AnimationAction | null {\n const bakedClip = this.getBakedSourceClip(sourceClipName);\n const mixerClip = bakedClip?.mixerClips.find((entry) => entry.channel === channel)?.clip;\n if (!mixerClip) {\n return null;\n }\n\n const desiredClip = blendMode === 'additive'\n ? this.getOrCreateBakedAdditiveMixerClip(mixerClip)\n : mixerClip;\n if (!desiredClip) {\n return null;\n }\n\n const existing = this.bakedMixerActions.get(mixerClip.name);\n if (existing?.getClip() === desiredClip) {\n return existing;\n }\n\n this.ensureMixer();\n if (!this.animationMixer) {\n return null;\n }\n\n if (existing) {\n this.releaseBakedMixerAction(mixerClip.name);\n }\n\n const action = this.animationMixer.clipAction(desiredClip);\n this.bakedMixerActions.set(mixerClip.name, action);\n return action;\n }\n\n private getRepresentativeBakedAction(clipName: string): AnimationAction | null {\n const group = this.bakedActionGroups.get(clipName);\n if (!group) {\n return null;\n }\n return group.channelActions.values().next().value ?? null;\n }\n\n private createBakedActionGroup(\n clipName: string,\n playbackState: NormalizedPlaybackState\n ): BakedActionGroup | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return null;\n }\n\n const channelActions = new Map<BakedClipChannel, AnimationAction>();\n for (const mixerClip of bakedClip.mixerClips) {\n const channelBlendMode = resolveBakedChannelBlendMode(\n mixerClip.channel,\n playbackState.requestedBlendMode\n ) ?? 'replace';\n const action = this.getOrCreateBakedMixerAction(\n clipName,\n mixerClip.channel,\n channelBlendMode\n );\n if (action) {\n channelActions.set(mixerClip.channel, action);\n }\n }\n\n if (channelActions.size === 0) {\n return null;\n }\n\n let resolveFinished = () => {};\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n\n return {\n actionId: makeActionId(),\n channelActions,\n pendingFinishedChannels: playbackState.loopMode === 'once'\n ? new Set(channelActions.keys())\n : new Set<BakedClipChannel>(),\n finishedPromise,\n resolveFinished,\n };\n }\n\n private getMeshNamesForAU(auId: number, config: Profile, explicitMeshNames?: string[]): string[] {\n if (explicitMeshNames && explicitMeshNames.length > 0) {\n return explicitMeshNames;\n }\n\n if (typeof this.host.getMeshNamesForAU === 'function') {\n return this.host.getMeshNamesForAU(auId) || [];\n }\n\n return getMeshNamesForAUProfile(config, auId);\n }\n\n private getMeshNamesForViseme(config: Profile, explicitMeshNames?: string[]): string[] {\n if (explicitMeshNames && explicitMeshNames.length > 0) {\n return explicitMeshNames;\n }\n\n if (typeof this.host.getMeshNamesForViseme === 'function') {\n return this.host.getMeshNamesForViseme() || [];\n }\n\n return getMeshNamesForVisemeProfile(config);\n }\n\n private hasActiveAdditivePlayback(): boolean {\n for (const [clipName, group] of this.bakedActionGroups) {\n const state = this.playbackState.get(clipName);\n if (state?.blendMode !== 'additive') {\n continue;\n }\n for (const action of group.channelActions.values()) {\n if (action.isRunning() && !action.paused) {\n return true;\n }\n }\n }\n\n for (const [clipName, action] of this.animationActions) {\n const state = this.playbackState.get(clipName);\n if (state?.blendMode !== 'additive') {\n continue;\n }\n if (action.isRunning() && !action.paused) {\n return true;\n }\n }\n\n return false;\n }\n\n update(dtSeconds: number): void {\n if (this.animationMixer) {\n this.animationMixer.update(dtSeconds);\n }\n\n if (this.clipAnimationMixer) {\n const snapshots = Array.from(this.clipMonitors.values()).map((monitor) => ({\n actionId: monitor.actionId,\n previousTime: monitor.action.time,\n }));\n this.clipAnimationMixer.update(dtSeconds);\n for (const { actionId, previousTime } of snapshots) {\n const monitor = this.clipMonitors.get(actionId);\n if (!monitor) continue;\n this.advanceClipMonitor(monitor, previousTime);\n if (monitor.finishedPending) {\n const finalTime = Math.max(0, Math.min(monitor.duration, monitor.action.time));\n this.syncClipMonitorTime(monitor, finalTime);\n this.emitClipEvent(monitor, {\n type: 'completed',\n clipName: monitor.clipName,\n currentTime: finalTime,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n this.cleanupClipMonitor(actionId);\n }\n }\n }\n\n if (this.hasActiveAdditivePlayback()) {\n this.host.reapplyProceduralState?.();\n }\n }\n\n dispose(): void {\n this.stopAllAnimations();\n this.clearAllBakedAdditiveMixerClips();\n if (this.animationMixer) {\n this.animationMixer.stopAllAction();\n this.animationMixer = null;\n }\n if (this.clipAnimationMixer) {\n this.clipAnimationMixer.stopAllAction();\n this.clipAnimationMixer = null;\n }\n this.mixerFinishedListenerAttached = false;\n this.clipMixerFinishedListenerAttached = false;\n this.animationClips = [];\n this.bakedSourceClips.clear();\n this.bakedMixerActions.clear();\n this.bakedAdditiveMixerClips.clear();\n this.bakedActionGroups.clear();\n this.bakedMixerClipToSource.clear();\n this.animationActions.clear();\n this.animationFinishedCallbacks.clear();\n this.clipActions.clear();\n this.clipHandles.clear();\n this.clipSources.clear();\n this.playbackState.clear();\n this.clipMonitors.clear();\n }\n\n loadAnimationClips(clips: unknown[]): void {\n const model = this.host.getModel();\n if (!model) {\n console.warn('Embody: Cannot load animation clips before calling onReady()');\n return;\n }\n\n for (const clipName of this.bakedSourceClips.keys()) {\n this.stopAnimation(clipName);\n }\n if (this.animationMixer) {\n for (const bakedClip of this.bakedSourceClips.values()) {\n for (const mixerClip of bakedClip.mixerClips) {\n this.releaseBakedMixerAction(mixerClip.clip.name);\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n try {\n this.animationMixer.uncacheAction(mixerClip.clip);\n } catch {}\n try {\n this.animationMixer.uncacheClip(mixerClip.clip);\n } catch {}\n }\n }\n }\n this.clearAllBakedAdditiveMixerClips();\n\n for (const clipName of this.bakedSourceClips.keys()) {\n this.playbackState.delete(clipName);\n this.clipSources.delete(clipName);\n }\n\n this.bakedSourceClips.clear();\n this.bakedMixerActions.clear();\n this.bakedActionGroups.clear();\n this.bakedMixerClipToSource.clear();\n\n this.ensureMixer();\n const partitionedClips = (clips as AnimationClip[]).map((clip) => (\n partitionBakedClip(clip, model, this.host.getBones())\n ));\n\n this.animationClips = partitionedClips.map((clip) => clip.sourceClip);\n for (const bakedClip of partitionedClips) {\n this.bakedSourceClips.set(bakedClip.sourceClip.name, bakedClip);\n this.clipSources.set(bakedClip.sourceClip.name, 'baked');\n for (const mixerClip of bakedClip.mixerClips) {\n this.bakedMixerClipToSource.set(mixerClip.clip.name, {\n sourceClipName: bakedClip.sourceClip.name,\n channel: mixerClip.channel,\n });\n }\n }\n }\n\n getAnimationClips(): AnimationClipInfo[] {\n return this.animationClips.map(clip => ({\n name: clip.name,\n duration: clip.duration,\n trackCount: clip.tracks.length,\n source: this.clipSources.get(clip.name) ?? 'baked',\n channels: this.getBakedSourceClip(clip.name)?.channels,\n }));\n }\n\n removeAnimationClip(clipName: string): boolean {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return false;\n }\n\n this.stopAnimation(clipName);\n\n if (this.animationMixer) {\n for (const mixerClip of bakedClip.mixerClips) {\n const action = this.bakedMixerActions.get(mixerClip.clip.name);\n this.releaseBakedMixerAction(mixerClip.clip.name);\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n try {\n this.animationMixer.uncacheAction(mixerClip.clip);\n } catch {}\n try {\n this.animationMixer.uncacheClip(mixerClip.clip);\n } catch {}\n this.bakedMixerClipToSource.delete(mixerClip.clip.name);\n const actionId = this.getActionId(action);\n if (actionId && action) {\n this.actionIdToClip.delete(actionId);\n this.actionIds.delete(action);\n }\n }\n }\n for (const mixerClip of bakedClip.mixerClips) {\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n this.bakedMixerActions.delete(mixerClip.clip.name);\n }\n\n this.animationClips = this.animationClips.filter((entry) => entry.name !== clipName);\n this.bakedSourceClips.delete(clipName);\n this.bakedActionGroups.delete(clipName);\n this.playbackState.delete(clipName);\n this.clipSources.delete(clipName);\n\n return true;\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n console.warn(`Embody: Animation clip \"${clipName}\" not found`);\n return null;\n }\n\n const playbackState = this.mergePlaybackOptions(\n this.getPlaybackStateSnapshot(clipName, { loop: true, source: 'baked' }),\n options\n );\n playbackState.blendMode = this.getBakedAggregateBlendMode(clipName, playbackState);\n const actionGroup = this.createBakedActionGroup(clipName, playbackState);\n if (!actionGroup) {\n console.warn(`Embody: Animation clip \"${clipName}\" has no character mixer channels to play`);\n return null;\n }\n\n const crossfadeDuration = options.crossfadeDuration ?? 0;\n const clampWhenFinished = options.clampWhenFinished ?? playbackState.loopMode === 'once';\n const startTime = this.resolveStartTime(bakedClip.sourceClip.duration, playbackState, options.startTime);\n\n for (const [channel, action] of actionGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, playbackState, channel);\n action.clampWhenFinished = clampWhenFinished;\n\n if (crossfadeDuration > 0) {\n action.reset();\n action.fadeIn(crossfadeDuration);\n } else {\n action.reset();\n }\n action.time = startTime;\n action.play();\n }\n\n this.bakedActionGroups.set(clipName, actionGroup);\n this.setPlaybackState(clipName, playbackState);\n return this.createBakedAnimationHandle(clipName, actionGroup);\n }\n\n stopAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.stop();\n try { action.paused = false; } catch {}\n }\n this.bakedActionGroups.delete(clipName);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const actionId = this.getActionId(action);\n const isBaked = (this.clipSources.get(clipName) ?? 'baked') === 'baked';\n action.stop();\n if (!isBaked && this.clipAnimationMixer) {\n try {\n const clip = action.getClip();\n if (clip) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n } catch {}\n }\n if (!isBaked) {\n this.animationActions.delete(clipName);\n this.playbackState.delete(clipName);\n } else {\n try { action.paused = false; } catch {}\n }\n this.animationFinishedCallbacks.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n const clipAction = this.clipActions.get(clipName);\n if (clipAction && clipAction !== action) {\n const actionId = this.getActionId(clipAction);\n try {\n clipAction.stop();\n if (this.clipAnimationMixer) {\n const clip = clipAction.getClip();\n if (clip) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n }\n } catch {}\n this.clipActions.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n if (this.clipActions.get(clipName) === action) {\n this.clipActions.delete(clipName);\n }\n this.clipHandles.delete(clipName);\n }\n\n stopAllAnimations(): void {\n for (const clipName of new Set([\n ...this.bakedActionGroups.keys(),\n ...this.animationActions.keys(),\n ...this.clipActions.keys(),\n ])) {\n this.stopAnimation(clipName);\n }\n }\n\n pauseAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.paused = true;\n }\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = true;\n }\n }\n\n resumeAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.paused = false;\n }\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = false;\n }\n }\n\n pauseAllAnimations(): void {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.isRunning()) {\n action.paused = true;\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.isRunning()) {\n action.paused = true;\n }\n }\n }\n\n resumeAllAnimations(): void {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.paused) {\n action.paused = false;\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.paused) {\n action.paused = false;\n }\n }\n }\n\n setAnimationSpeed(clipName: string, speed: number): void {\n if (this.isBakedSourceClip(clipName)) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n next.playbackRate = Number.isFinite(speed) ? Math.max(0, Math.abs(speed)) : 1.0;\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'clip',\n });\n next.playbackRate = Number.isFinite(speed) ? Math.max(0, Math.abs(speed)) : 1.0;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n if (this.isBakedSourceClip(clipName)) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n next.weight = Number.isFinite(intensity) ? Math.max(0, intensity) : 1.0;\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'clip',\n });\n next.weight = Number.isFinite(intensity) ? Math.max(0, intensity) : 1.0;\n action.setEffectiveWeight(next.weight);\n this.setPlaybackState(clipName, next);\n }\n }\n\n setAnimationLoopMode(clipName: string, loopMode: 'repeat' | 'once' | 'pingpong'): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.loopMode = loopMode;\n next.loop = loopMode !== 'once';\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationRepeatCount(clipName: string, repeatCount?: number): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.repeatCount = typeof repeatCount === 'number' && Number.isFinite(repeatCount)\n ? Math.max(0, repeatCount)\n : undefined;\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationReverse(clipName: string, reverse: boolean): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.reverse = !!reverse;\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationBlendMode(clipName: string, blendMode: AnimationBlendMode): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.requestedBlendMode = blendMode;\n\n if (this.isBakedSourceClip(clipName)) {\n next.blendMode = this.getBakedAggregateBlendMode(clipName, next);\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, currentAction] of Array.from(bakedGroup.channelActions)) {\n const channelBlendMode = resolveBakedChannelBlendMode(channel, next.requestedBlendMode) ?? 'replace';\n const previousTime = currentAction.time;\n const wasActive = currentAction.isRunning() || currentAction.paused;\n const wasPaused = currentAction.paused;\n const action = this.getOrCreateBakedMixerAction(clipName, channel, channelBlendMode);\n if (!action) {\n bakedGroup.channelActions.delete(channel);\n continue;\n }\n\n this.applyPlaybackStateToBakedAction(action, next, channel);\n action.time = Math.max(0, Math.min(action.getClip().duration, previousTime));\n if (action !== currentAction && wasActive) {\n action.play();\n }\n action.paused = wasPaused;\n bakedGroup.channelActions.set(channel, action);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n next.blendMode = blendMode;\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n seekAnimation(clipName: string, time: number): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n const state = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n const duration = this.getBakedSourceClip(clipName)?.sourceClip.duration ?? 0;\n const clamped = Math.max(0, Math.min(duration, Number.isFinite(time) ? time : 0));\n for (const action of bakedGroup.channelActions.values()) {\n action.time = clamped;\n }\n try {\n this.animationMixer?.update(0);\n this.clipAnimationMixer?.update(0);\n if (state.blendMode === 'additive') {\n this.host.reapplyProceduralState?.();\n }\n } catch {}\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n const duration = action.getClip().duration;\n action.time = Math.max(0, Math.min(duration, Number.isFinite(time) ? time : 0));\n try {\n this.clipAnimationMixer?.update(0);\n const state = this.playbackState.get(clipName);\n if (state?.blendMode === 'additive') {\n this.host.reapplyProceduralState?.();\n }\n } catch {}\n }\n\n setAnimationTimeScale(timeScale: number): void {\n if (this.animationMixer) {\n this.animationMixer.timeScale = timeScale;\n }\n if (this.clipAnimationMixer) {\n this.clipAnimationMixer.timeScale = timeScale;\n }\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (bakedClip) {\n const state = this.playbackState.get(clipName);\n const action = this.getRepresentativeBakedAction(clipName);\n if (!state && !action) {\n return null;\n }\n const loopMode = state?.loopMode\n ?? (action?.loop === LoopPingPong ? 'pingpong' : action?.loop === LoopOnce ? 'once' : 'repeat');\n const playbackRate = state?.playbackRate ?? Math.abs(action?.getEffectiveTimeScale?.() ?? 1);\n const reverse = state?.reverse ?? ((action?.getEffectiveTimeScale?.() ?? 1) < 0);\n const pausedValues = this.bakedActionGroups.get(clipName)\n ? Array.from(this.bakedActionGroups.get(clipName)!.channelActions.values()).map((entry) => entry.paused)\n : [];\n\n return {\n name: bakedClip.sourceClip.name,\n actionId: this.bakedActionGroups.get(clipName)?.actionId,\n source: state?.source ?? this.clipSources.get(clipName) ?? 'baked',\n isPlaying: this.bakedActionGroups.get(clipName)\n ? Array.from(this.bakedActionGroups.get(clipName)!.channelActions.values()).some((entry) => entry.isRunning() && !entry.paused)\n : false,\n isPaused: pausedValues.length > 0 ? pausedValues.every(Boolean) : false,\n time: action?.time ?? 0,\n duration: bakedClip.sourceClip.duration,\n speed: playbackRate,\n playbackRate,\n reverse,\n weight: state?.weight ?? action?.getEffectiveWeight?.() ?? 1,\n balance: state?.balance ?? 0,\n requestedBlendMode: state?.requestedBlendMode ?? 'replace',\n blendMode: this.getBakedAggregateBlendMode(clipName, state),\n channels: this.getBakedChannelInfo(clipName, state),\n easing: state?.easing ?? 'linear',\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: state?.repeatCount,\n isLooping: loopMode !== 'once',\n };\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return null;\n\n const clip = action.getClip();\n const state = this.playbackState.get(clipName);\n const loopMode = state?.loopMode\n ?? (action.loop === LoopPingPong ? 'pingpong' : action.loop === LoopOnce ? 'once' : 'repeat');\n const playbackRate = state?.playbackRate ?? Math.abs(action.getEffectiveTimeScale());\n const reverse = state?.reverse ?? action.getEffectiveTimeScale() < 0;\n return {\n name: clip.name,\n actionId: this.getActionId(action),\n source: state?.source ?? this.clipSources.get(clip.name) ?? 'baked',\n isPlaying: action.isRunning() && !action.paused,\n isPaused: action.paused,\n time: action.time,\n duration: clip.duration,\n speed: playbackRate,\n playbackRate,\n reverse,\n weight: state?.weight ?? action.getEffectiveWeight(),\n balance: state?.balance ?? 0,\n requestedBlendMode: state?.requestedBlendMode ?? state?.blendMode ?? 'replace',\n blendMode: state?.blendMode ?? 'replace',\n channels: state?.source === 'baked' ? this.getBakedChannelInfo(clipName, state) : undefined,\n easing: state?.easing ?? 'linear',\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: state?.repeatCount,\n isLooping: loopMode !== 'once',\n };\n }\n\n getPlayingAnimations(): AnimationState[] {\n const playing: AnimationState[] = [];\n for (const name of this.bakedActionGroups.keys()) {\n const state = this.getAnimationState(name);\n if (state?.isPlaying) {\n playing.push(state);\n }\n }\n for (const [name, action] of this.animationActions) {\n if (action.isRunning()) {\n const state = this.getAnimationState(name);\n if (state) playing.push(state);\n }\n }\n return playing;\n }\n\n crossfadeTo(clipName: string, duration = 0.3, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.isRunning()) {\n action.fadeOut(duration);\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.isRunning()) {\n action.fadeOut(duration);\n }\n }\n\n return this.playAnimation(clipName, {\n ...options,\n crossfadeDuration: duration,\n });\n }\n\n snippetToClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): AnimationClip | null {\n const config = this.host.getConfig();\n if (!this.host.getModel()) {\n console.warn(`[Embody] snippetToClip: No model loaded for \"${clipName}\"`);\n return null;\n }\n if (Object.keys(curves).length === 0) {\n console.warn(`[Embody] snippetToClip: Empty curves for \"${clipName}\"`);\n return null;\n }\n\n const tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack> = [];\n const intensityScale = options?.intensityScale ?? 1.0;\n const globalBalance = options?.balance ?? 0;\n const balanceMap = options?.balanceMap;\n const meshNames = options?.meshNames;\n const visemeSlotCount = getProfileVisemeSlots(config).length;\n let maxTime = 0;\n\n const isNumericAU = (id: string) => /^\\d+$/.test(id);\n const isVisemeIndex = (id: string) => {\n if (options?.snippetCategory !== 'visemeSnippet') return false;\n const num = Number(id);\n return !Number.isNaN(num) && num >= 0 && num < visemeSlotCount;\n };\n\n const hasInheritedStart = (arr: ScalarKeyframe[] | undefined) => !!arr?.[0]?.inherit;\n const clampIntensity = (v: number) => Math.max(0, Math.min(2, v));\n const sampleCurve = (curveId: string, t: number) => {\n const arr = curves[curveId];\n if (!arr) return 0;\n let inheritedStartValue: number | undefined;\n if (hasInheritedStart(arr)) {\n if (isVisemeIndex(curveId)) {\n inheritedStartValue = this.host.getCurrentVisemeValue?.(Number(curveId));\n } else if (isNumericAU(curveId)) {\n inheritedStartValue = this.host.getCurrentAUValue?.(Number(curveId));\n }\n }\n return clampIntensity(\n this.sampleFinalKeyframeValue(\n arr,\n t,\n (intensity) => intensity * intensityScale,\n inheritedStartValue === undefined ? undefined : clampIntensity(inheritedStartValue)\n )\n );\n };\n\n const keyframeTimes = (() => {\n const times = new Set<number>();\n Object.values(curves).forEach((arr) => {\n arr.forEach((kf) => times.add(kf.time));\n });\n return Array.from(times).sort((a, b) => a - b);\n })();\n\n for (const [curveId, keyframes] of Object.entries(curves)) {\n if (!keyframes || keyframes.length === 0) continue;\n\n const curveMaxTime = keyframes[keyframes.length - 1].time;\n if (curveMaxTime > maxTime) maxTime = curveMaxTime;\n\n if (isNumericAU(curveId)) {\n const auId = Number(curveId);\n\n if (isVisemeIndex(curveId)) {\n const visemeMeshNames = this.getMeshNamesForViseme(config, meshNames);\n for (const target of getVisemeBindingTargets(config, auId)) {\n const effectiveScale = intensityScale * target.weight;\n if (typeof target.morph === 'number') {\n this.addMorphIndexTracks(tracks, target.morph, keyframes, effectiveScale, visemeMeshNames);\n } else if (target.morph) {\n this.addMorphTracks(tracks, target.morph, keyframes, effectiveScale, visemeMeshNames);\n }\n }\n } else {\n const auMeshNames = this.getMeshNamesForAU(auId, config, meshNames);\n const morphsBySide = config.auToMorphs[auId];\n const mixWeight = this.host.isMixedAU(auId) ? this.host.getAUMixWeight(auId) : 1.0;\n\n const leftKeys = morphsBySide?.left ?? [];\n const rightKeys = morphsBySide?.right ?? [];\n const centerKeys = morphsBySide?.center ?? [];\n\n const curveBalance = resolveCurveBalance(curveId, globalBalance, balanceMap);\n\n for (const morphKey of leftKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (curveBalance > 0) effectiveScale *= (1 - curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n for (const morphKey of rightKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (curveBalance < 0) effectiveScale *= (1 + curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n for (const morphKey of centerKeys) {\n const effectiveScale = intensityScale * mixWeight;\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n }\n } else {\n this.addMorphTracks(tracks, curveId, keyframes, intensityScale, meshNames);\n }\n }\n\n // Auto-generate jaw bone rotation from viseme curves when enabled\n // This replicates transitionViseme behavior for clip-based playback\n const autoVisemeJaw = options?.autoVisemeJaw !== false; // Default true\n const jawScale = options?.jawScale ?? 1.0;\n const visemeJawAmounts = getVisemeJawAmounts(config);\n const bones = this.host.getBones();\n const autoVisemeJawBinding = getAutoVisemeJawBinding(config, bones);\n const autoVisemeJawNodeKey = autoVisemeJawBinding?.node as BoneKey | undefined;\n let autoVisemeJawHandledJaw = false;\n\n if (\n autoVisemeJaw &&\n jawScale > 0 &&\n visemeJawAmounts &&\n autoVisemeJawBinding &&\n options?.snippetCategory === 'visemeSnippet' &&\n keyframeTimes.length > 0\n ) {\n const jawEntry = bones[autoVisemeJawBinding.node] ?? bones.JAW;\n\n if (jawEntry) {\n autoVisemeJawHandledJaw = true;\n // Sample all viseme curves at each keyframe time and compute weighted jaw amount\n const jawValues: number[] = [];\n const inheritedJawStart = keyframeTimes.length > 0\n && Array.from({ length: visemeSlotCount }, (_, index) => curves[String(index)])\n .some((curve) => hasInheritedStart(curve));\n const currentJawQ = inheritedJawStart\n ? this.host.getCurrentBoneQuaternion?.(autoVisemeJawBinding.node) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentJawQ) {\n jawValues.push(currentJawQ.x, currentJawQ.y, currentJawQ.z, currentJawQ.w);\n continue;\n }\n let jawAmount = 0;\n\n // Sum contributions from all active visemes at time t\n for (let visemeIdx = 0; visemeIdx < visemeSlotCount; visemeIdx++) {\n const visemeCurve = curves[String(visemeIdx)];\n if (!visemeCurve) continue;\n\n const visemeValue = sampleCurve(String(visemeIdx), t);\n if (visemeValue > 0 && visemeIdx < visemeJawAmounts.length) {\n // Take max jaw amount across all active visemes (like transitionViseme)\n const visemeJaw = visemeJawAmounts[visemeIdx] * visemeValue * jawScale;\n if (visemeJaw > jawAmount) {\n jawAmount = visemeJaw;\n }\n }\n }\n\n const maxDegrees = autoVisemeJawBinding.maxDegrees ?? 30;\n const radians = (maxDegrees * Math.PI / 180) * jawAmount;\n const jawQ = new Quaternion().copy(jawEntry.baseQuat);\n jawQ.multiply(new Quaternion().setFromAxisAngle(\n axisVectorForRotationChannel(autoVisemeJawBinding.channel),\n radians * autoVisemeJawBinding.scale\n ));\n\n jawValues.push(jawQ.x, jawQ.y, jawQ.z, jawQ.w);\n }\n\n const trackName = `${jawEntry.obj.uuid}.quaternion`;\n tracks.push(new QuaternionKeyframeTrack(trackName, keyframeTimes, jawValues));\n }\n }\n\n if (keyframeTimes.length > 0) {\n const compositeRotations = this.host.getCompositeRotations();\n const hasCurveAU = new Set<number>(\n Object.keys(curves)\n .filter(isNumericAU)\n .map((id) => Number(id))\n );\n\n const getAxisBinding = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n axisValue: number,\n t: number\n ) => {\n return getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n axisValue,\n (auId: number) => getAxisSampleForNode(auId, nodeKey, t),\n config.auToBones\n );\n };\n\n const getAxisSampleForNode = (\n auId: number,\n nodeKey: BoneKey,\n t: number\n ) => {\n const rawValue = sampleCurve(String(auId), t);\n if (rawValue <= 1e-6) return 0;\n\n const binding = config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n\n const curveBalance = resolveCurveBalance(String(auId), globalBalance, balanceMap);\n return rawValue * getSideScale(curveBalance, binding.side);\n };\n\n const getAxisValue = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n t: number\n ) =>\n getCompositeAxisValue(axisConfig, (auId: number) => getAxisSampleForNode(auId, nodeKey, t));\n\n for (const composite of compositeRotations) {\n const nodeKey = composite.node as BoneKey;\n\n if (autoVisemeJawHandledJaw && (nodeKey === autoVisemeJawNodeKey || nodeKey === 'JAW')) {\n continue;\n }\n\n const entry = bones[nodeKey];\n if (!entry) {\n console.log(`[snippetToClip] Skipping composite for \"${nodeKey}\" - bone not resolved`);\n continue;\n }\n\n const relevantAUs = new Set<number>();\n [composite.pitch, composite.yaw, composite.roll]\n .filter(Boolean)\n .forEach((axisConfig) => {\n axisConfig!.aus.forEach((auId) => {\n if (hasCurveAU.has(auId)) relevantAUs.add(auId);\n });\n });\n\n if (relevantAUs.size === 0) {\n continue;\n }\n\n const values: number[] = [];\n const currentBoneQ = Array.from(relevantAUs).some((auId) => hasInheritedStart(curves[String(auId)]))\n ? this.host.getCurrentBoneQuaternion?.(nodeKey) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentBoneQ) {\n values.push(currentBoneQ.x, currentBoneQ.y, currentBoneQ.z, currentBoneQ.w);\n continue;\n }\n const compositeQ = new Quaternion().copy(entry.baseQuat);\n\n const applyAxis = (\n axisConfig: RotationAxis | null | undefined\n ) => {\n if (!axisConfig) return;\n let axisValue = getAxisValue(nodeKey, axisConfig, t);\n if (Math.abs(axisValue) <= 1e-6) return;\n\n const binding = getAxisBinding(nodeKey, axisConfig, axisValue, t);\n if (!binding?.maxDegrees || !binding.channel) return;\n\n const radians = (binding.maxDegrees * Math.PI / 180) * Math.abs(axisValue) * binding.scale;\n const axis = binding.channel === 'rx' ? X_AXIS : binding.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n };\n\n applyAxis(composite.yaw);\n applyAxis(composite.pitch);\n applyAxis(composite.roll);\n\n values.push(compositeQ.x, compositeQ.y, compositeQ.z, compositeQ.w);\n }\n\n const trackName = `${entry.obj.uuid}.quaternion`;\n tracks.push(new QuaternionKeyframeTrack(trackName, keyframeTimes, values));\n }\n\n for (const curveId of Object.keys(curves)) {\n if (!isNumericAU(curveId)) continue;\n const auId = Number(curveId);\n const bindings = config.auToBones[auId] || [];\n const curve = curves[curveId];\n if (!curve || curve.length === 0) continue;\n\n for (const binding of bindings) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n const entry = bones[binding.node as BoneKey];\n if (!entry || binding.maxUnits === undefined) continue;\n\n const axisIndex: 'x' | 'y' | 'z' = binding.channel === 'tx' ? 'x' : binding.channel === 'ty' ? 'y' : 'z';\n const basePos = entry.basePos[axisIndex];\n const inheritedStartValue = curve[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(binding.node, axisIndex) ?? entry.obj.position[axisIndex]\n : undefined;\n const values: number[] = [];\n\n for (const t of keyframeTimes) {\n values.push(\n this.sampleFinalKeyframeValue(\n curve,\n t,\n (intensity) => {\n const v = clampIntensity(intensity * intensityScale);\n return basePos + (v * binding.maxUnits! * binding.scale);\n },\n inheritedStartValue\n )\n );\n }\n\n const trackName = `${entry.obj.uuid}.position[${axisIndex}]`;\n tracks.push(new NumberKeyframeTrack(trackName, keyframeTimes, values));\n }\n }\n }\n\n if (tracks.length === 0) {\n console.warn(`[Embody] snippetToClip: No tracks created for \"${clipName}\"`);\n return null;\n }\n\n const clip = new AnimationClip(clipName, maxTime, tracks);\n this.setClipEventMetadata(clip, { keyframeTimes });\n this.dynamicClipSources.set(clip, {\n clipName,\n curves,\n options,\n hasInheritedStart: this.curvesHaveInheritedStart(curves),\n });\n this.debugClipLog(`[Embody] snippetToClip: Created clip \"${clipName}\" with ${tracks.length} tracks, duration ${maxTime.toFixed(2)}s`);\n\n return clip;\n }\n\n typedSnippetToClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): AnimationClip | null {\n const config = this.host.getConfig();\n if (!this.host.getModel()) {\n console.warn(`[Embody] typedSnippetToClip: No model loaded for \"${clipName}\"`);\n return null;\n }\n if (channels.length === 0) {\n console.warn(`[Embody] typedSnippetToClip: Empty channels for \"${clipName}\"`);\n return null;\n }\n\n const tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack> = [];\n const intensityScale = options?.intensityScale ?? 1.0;\n const globalBalance = options?.balance ?? 0;\n const balanceMap = options?.balanceMap;\n const meshNames = options?.meshNames;\n const bones = this.host.getBones();\n type ProfileMappedTarget =\n | Extract<SnippetChannel['target'], { type: 'au' }>\n | Extract<SnippetChannel['target'], { type: 'lipSync' }>;\n const isProfileMappedTarget = (target: SnippetChannel['target']): target is ProfileMappedTarget =>\n target.type === 'au' || target.type === 'lipSync';\n const isProfileMappedChannel = (channel: SnippetChannel): channel is SnippetChannel & { target: ProfileMappedTarget } =>\n isProfileMappedTarget(channel.target);\n const visemeChannels = channels.filter((channel) => channel.target.type === 'viseme');\n const lipSyncChannels = channels.filter((channel) => channel.target.type === 'lipSync');\n const auChannels = channels.filter((channel) => channel.target.type === 'au');\n const profileMappedChannels = channels.filter(isProfileMappedChannel);\n let maxTime = 0;\n\n logTypedLipSyncDebug('[Embody Typed LipSync] typedSnippetToClip input', {\n clipName,\n channelCount: channels.length,\n visemeChannels: visemeChannels.map(summarizeTypedChannel),\n lipSyncChannels: lipSyncChannels.map(summarizeTypedChannel),\n auChannels: auChannels.map(summarizeTypedChannel),\n options: {\n source: options?.source,\n autoVisemeJaw: options?.autoVisemeJaw,\n jawScale: options?.jawScale,\n intensityScale: options?.intensityScale,\n snippetCategory: options?.snippetCategory,\n },\n });\n\n const hasInheritedStart = (arr: ScalarKeyframe[] | undefined) => !!arr?.[0]?.inherit;\n const clampIntensity = (v: number) => Math.max(0, Math.min(2, v));\n const channelScale = (channel: SnippetChannel) => intensityScale * (channel.intensityScale ?? 1);\n\n const keyframeTimes = (() => {\n const times = new Set<number>();\n channels.forEach((channel) => {\n channel.keyframes.forEach((kf) => times.add(kf.time));\n });\n return Array.from(times).sort((a, b) => a - b);\n })();\n\n const sampleTypedChannel = (\n channel: SnippetChannel,\n t: number\n ) => {\n let inheritedStartValue: number | undefined;\n if (hasInheritedStart(channel.keyframes)) {\n const target = channel.target;\n if (target.type === 'viseme') {\n inheritedStartValue = this.host.getCurrentVisemeValue?.(target.id);\n } else if (target.type === 'au') {\n inheritedStartValue = this.host.getCurrentAUValue?.(target.id);\n } else if (target.type === 'morph') {\n inheritedStartValue = typeof target.id === 'number'\n ? this.host.getCurrentMorphIndexValue?.(target.id, target.meshNames ?? meshNames)\n : this.host.getCurrentMorphValue?.(target.id, target.meshNames ?? meshNames);\n } else if (target.type === 'bone' && (target.channel === 'tx' || target.channel === 'ty' || target.channel === 'tz')) {\n const axis = target.channel === 'tx' ? 'x' : target.channel === 'ty' ? 'y' : 'z';\n inheritedStartValue = this.host.getCurrentBonePositionValue?.(target.id, axis) ?? undefined;\n }\n }\n return clampIntensity(\n this.sampleFinalKeyframeValue(\n channel.keyframes,\n t,\n (intensity) => intensity * channelScale(channel),\n inheritedStartValue === undefined ? undefined : clampIntensity(inheritedStartValue)\n )\n );\n };\n\n for (const channel of channels) {\n if (!channel.keyframes || channel.keyframes.length === 0) continue;\n\n const curveMaxTime = channel.keyframes[channel.keyframes.length - 1].time;\n if (curveMaxTime > maxTime) maxTime = curveMaxTime;\n const target = channel.target;\n\n if (target.type === 'viseme') {\n const visemeMeshNames = this.getMeshNamesForViseme(config, target.meshNames ?? meshNames);\n const bindingTargets = getVisemeBindingTargets(config, target.id);\n const tracksBefore = tracks.length;\n for (const bindingTarget of bindingTargets) {\n const effectiveScale = channelScale(channel) * bindingTarget.weight;\n if (typeof bindingTarget.morph === 'number') {\n this.addMorphIndexTracks(tracks, bindingTarget.morph, channel.keyframes, effectiveScale, visemeMeshNames);\n } else if (bindingTarget.morph) {\n this.addMorphTracks(tracks, bindingTarget.morph, channel.keyframes, effectiveScale, visemeMeshNames);\n }\n }\n logTypedLipSyncDebug('[Embody Typed LipSync] viseme binding', {\n clipName,\n visemeId: target.id,\n meshNames: visemeMeshNames,\n bindingCount: bindingTargets.length,\n bindings: bindingTargets.map(summarizeBindingTarget),\n keyframes: summarizeKeyframes(channel.keyframes),\n tracksBefore,\n tracksAfter: tracks.length,\n });\n continue;\n }\n\n if (isProfileMappedTarget(target)) {\n const controlMeshNames = this.getMeshNamesForAU(target.id, config, meshNames);\n const morphsBySide = config.auToMorphs[target.id];\n const mixWeight = this.host.isMixedAU(target.id) ? this.host.getAUMixWeight(target.id) : 1.0;\n const curveBalance = target.type === 'au'\n ? target.balance ?? resolveCurveBalance(String(target.id), globalBalance, balanceMap)\n : resolveCurveBalance(String(target.id), globalBalance, balanceMap);\n\n for (const morphKey of morphsBySide?.left ?? []) {\n let effectiveScale = channelScale(channel) * mixWeight;\n if (curveBalance > 0) effectiveScale *= (1 - curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n for (const morphKey of morphsBySide?.right ?? []) {\n let effectiveScale = channelScale(channel) * mixWeight;\n if (curveBalance < 0) effectiveScale *= (1 + curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n for (const morphKey of morphsBySide?.center ?? []) {\n const effectiveScale = channelScale(channel) * mixWeight;\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n continue;\n }\n\n if (target.type === 'morph') {\n const targetMeshes = target.meshNames ?? meshNames;\n if (typeof target.id === 'number') {\n this.addMorphIndexTracks(tracks, target.id, channel.keyframes, channelScale(channel), targetMeshes);\n } else {\n this.addMorphTracks(tracks, target.id, channel.keyframes, channelScale(channel), targetMeshes);\n }\n continue;\n }\n\n if (target.type === 'bone') {\n const entry = bones[target.id];\n if (!entry) continue;\n const scale = target.scale ?? 1;\n if (target.channel === 'rx' || target.channel === 'ry' || target.channel === 'rz') {\n const axis = target.channel === 'rx' ? X_AXIS : target.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const maxDegrees = target.maxDegrees ?? 30;\n const inheritedStart = hasInheritedStart(channel.keyframes)\n ? this.host.getCurrentBoneQuaternion?.(target.id) ?? null\n : null;\n const times = channel.keyframes.map((frame) => frame.time);\n const values: number[] = [];\n for (let index = 0; index < channel.keyframes.length; index += 1) {\n if (index === 0 && inheritedStart) {\n values.push(inheritedStart.x, inheritedStart.y, inheritedStart.z, inheritedStart.w);\n continue;\n }\n const intensity = clampIntensity(channel.keyframes[index].intensity * channelScale(channel));\n const radians = (maxDegrees * Math.PI / 180) * intensity * scale;\n const q = new Quaternion().copy(entry.baseQuat);\n q.multiply(new Quaternion().setFromAxisAngle(axis, radians));\n values.push(q.x, q.y, q.z, q.w);\n }\n tracks.push(new QuaternionKeyframeTrack(`${entry.obj.uuid}.quaternion`, times, values));\n } else {\n const axis = target.channel === 'tx' ? 'x' : target.channel === 'ty' ? 'y' : 'z';\n const maxUnits = target.maxUnits ?? 1;\n const inheritedStart = channel.keyframes[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(target.id, axis) ?? entry.obj.position[axis]\n : undefined;\n const values = channel.keyframes.map((frame, index) => {\n if (index === 0 && inheritedStart !== undefined) return inheritedStart;\n const intensity = clampIntensity(frame.intensity * channelScale(channel));\n return entry.basePos[axis] + intensity * maxUnits * scale;\n });\n tracks.push(new NumberKeyframeTrack(\n `${entry.obj.uuid}.position[${axis}]`,\n channel.keyframes.map((frame) => frame.time),\n values\n ));\n }\n continue;\n }\n\n const unsupportedType = String((target as { type?: unknown }).type ?? 'unknown');\n console.warn(`[Embody] typedSnippetToClip: Unsupported typed snippet target \"${unsupportedType}\" in \"${clipName}\"`);\n }\n\n const autoVisemeJaw = options?.autoVisemeJaw === true;\n const jawScale = options?.jawScale ?? 1.0;\n const visemeJawAmounts = getVisemeJawAmounts(config);\n const autoVisemeJawBinding = getAutoVisemeJawBinding(config, bones);\n const autoVisemeJawNodeKey = autoVisemeJawBinding?.node as BoneKey | undefined;\n let autoVisemeJawHandledJaw = false;\n if (autoVisemeJaw && jawScale > 0 && visemeJawAmounts && autoVisemeJawBinding && visemeChannels.length > 0 && keyframeTimes.length > 0) {\n const jawEntry = bones[autoVisemeJawBinding.node] ?? bones.JAW;\n if (jawEntry) {\n autoVisemeJawHandledJaw = true;\n const jawValues: number[] = [];\n const inheritedJawStart = visemeChannels.some((channel) => hasInheritedStart(channel.keyframes));\n const currentJawQ = inheritedJawStart ? this.host.getCurrentBoneQuaternion?.(autoVisemeJawBinding.node) ?? null : null;\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentJawQ) {\n jawValues.push(currentJawQ.x, currentJawQ.y, currentJawQ.z, currentJawQ.w);\n continue;\n }\n let jawAmount = 0;\n for (const channel of visemeChannels) {\n const target = channel.target;\n if (target.type !== 'viseme') continue;\n if (target.id < 0 || target.id >= visemeJawAmounts.length) continue;\n const visemeValue = sampleTypedChannel(channel, t);\n const visemeJaw = visemeJawAmounts[target.id] * visemeValue * jawScale;\n if (visemeJaw > jawAmount) jawAmount = visemeJaw;\n }\n const maxDegrees = autoVisemeJawBinding.maxDegrees ?? 30;\n const radians = (maxDegrees * Math.PI / 180) * jawAmount;\n const jawQ = new Quaternion().copy(jawEntry.baseQuat);\n jawQ.multiply(new Quaternion().setFromAxisAngle(\n axisVectorForRotationChannel(autoVisemeJawBinding.channel),\n radians * autoVisemeJawBinding.scale\n ));\n jawValues.push(jawQ.x, jawQ.y, jawQ.z, jawQ.w);\n }\n tracks.push(new QuaternionKeyframeTrack(`${jawEntry.obj.uuid}.quaternion`, keyframeTimes, jawValues));\n }\n }\n\n if (keyframeTimes.length > 0 && profileMappedChannels.length > 0) {\n const compositeRotations = this.host.getCompositeRotations();\n const hasChannelAU = new Set<number>(\n profileMappedChannels.map((channel) => channel.target.id)\n );\n const channelsByAU = new Map<number, SnippetChannel[]>();\n profileMappedChannels.forEach((channel) => {\n const existing = channelsByAU.get(channel.target.id) ?? [];\n existing.push(channel);\n channelsByAU.set(channel.target.id, existing);\n });\n\n const getAxisSampleForNode = (\n auId: number,\n nodeKey: BoneKey,\n t: number\n ) => {\n const channelsForAU = channelsByAU.get(auId);\n if (!channelsForAU) return 0;\n\n let value = 0;\n for (const channel of channelsForAU) {\n if (!isProfileMappedTarget(channel.target)) continue;\n const rawValue = sampleTypedChannel(channel, t);\n if (rawValue <= 1e-6) continue;\n\n const binding = config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n if (!binding?.side) {\n value = Math.max(value, rawValue);\n continue;\n }\n\n const curveBalance = channel.target.type === 'au'\n ? channel.target.balance ?? resolveCurveBalance(String(auId), globalBalance, balanceMap)\n : resolveCurveBalance(String(auId), globalBalance, balanceMap);\n value = Math.max(value, rawValue * getSideScale(curveBalance, binding.side));\n }\n return value;\n };\n\n const getAxisValue = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n t: number\n ) =>\n getCompositeAxisValue(axisConfig, (auId: number) => getAxisSampleForNode(auId, nodeKey, t));\n\n const getAxisBinding = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n axisValue: number,\n t: number\n ) => getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n axisValue,\n (auId: number) => getAxisSampleForNode(auId, nodeKey, t),\n config.auToBones\n );\n\n for (const composite of compositeRotations) {\n const nodeKey = composite.node as BoneKey;\n\n if (autoVisemeJawHandledJaw && (nodeKey === autoVisemeJawNodeKey || nodeKey === 'JAW')) {\n continue;\n }\n\n const entry = bones[nodeKey];\n if (!entry) {\n this.debugClipLog(`[typedSnippetToClip] Skipping composite for \"${nodeKey}\" - bone not resolved`);\n continue;\n }\n\n const relevantAUs = new Set<number>();\n [composite.pitch, composite.yaw, composite.roll]\n .filter(Boolean)\n .forEach((axisConfig) => {\n axisConfig!.aus.forEach((auId) => {\n if (hasChannelAU.has(auId)) relevantAUs.add(auId);\n });\n });\n\n if (relevantAUs.size === 0) {\n continue;\n }\n\n const values: number[] = [];\n const currentBoneQ = Array.from(relevantAUs).some((auId) =>\n channelsByAU.get(auId)?.some((channel) => hasInheritedStart(channel.keyframes))\n )\n ? this.host.getCurrentBoneQuaternion?.(nodeKey) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentBoneQ) {\n values.push(currentBoneQ.x, currentBoneQ.y, currentBoneQ.z, currentBoneQ.w);\n continue;\n }\n\n const compositeQ = new Quaternion().copy(entry.baseQuat);\n\n const applyAxis = (\n axisConfig: RotationAxis | null | undefined\n ) => {\n if (!axisConfig) return;\n const axisValue = getAxisValue(nodeKey, axisConfig, t);\n if (Math.abs(axisValue) <= 1e-6) return;\n\n const binding = getAxisBinding(nodeKey, axisConfig, axisValue, t);\n if (!binding?.maxDegrees || !binding.channel) return;\n\n const radians = (binding.maxDegrees * Math.PI / 180) * Math.abs(axisValue) * binding.scale;\n const axis = binding.channel === 'rx' ? X_AXIS : binding.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n };\n\n applyAxis(composite.yaw);\n applyAxis(composite.pitch);\n applyAxis(composite.roll);\n\n values.push(compositeQ.x, compositeQ.y, compositeQ.z, compositeQ.w);\n }\n\n tracks.push(new QuaternionKeyframeTrack(`${entry.obj.uuid}.quaternion`, keyframeTimes, values));\n }\n\n for (const channel of profileMappedChannels) {\n const auId = channel.target.id;\n const bindings = config.auToBones[auId] || [];\n\n for (const binding of bindings) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n const entry = bones[binding.node as BoneKey];\n if (!entry || binding.maxUnits === undefined) continue;\n\n const axisIndex: 'x' | 'y' | 'z' = binding.channel === 'tx' ? 'x' : binding.channel === 'ty' ? 'y' : 'z';\n const basePos = entry.basePos[axisIndex];\n const inheritedStartValue = channel.keyframes[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(binding.node, axisIndex) ?? entry.obj.position[axisIndex]\n : undefined;\n const values: number[] = [];\n\n for (const t of keyframeTimes) {\n const rawValue = sampleTypedChannel(channel, t);\n const curveBalance = channel.target.type === 'au'\n ? channel.target.balance ?? resolveCurveBalance(String(auId), globalBalance, balanceMap)\n : resolveCurveBalance(String(auId), globalBalance, balanceMap);\n const sideScale = binding.side ? getSideScale(curveBalance, binding.side) : 1;\n const value = clampIntensity(rawValue * sideScale);\n values.push(\n inheritedStartValue !== undefined && t === keyframeTimes[0]\n ? inheritedStartValue\n : basePos + (value * binding.maxUnits * binding.scale)\n );\n }\n\n tracks.push(new NumberKeyframeTrack(`${entry.obj.uuid}.position[${axisIndex}]`, keyframeTimes, values));\n }\n }\n }\n\n if (tracks.length === 0) {\n console.warn(`[Embody] typedSnippetToClip: No tracks created for \"${clipName}\"`);\n return null;\n }\n\n const clip = new AnimationClip(clipName, maxTime, tracks);\n this.setClipEventMetadata(clip, { keyframeTimes });\n this.dynamicClipSources.set(clip, {\n clipName,\n channels,\n options,\n hasInheritedStart: this.channelsHaveInheritedStart(channels),\n });\n logTypedLipSyncDebug('[Embody Typed LipSync] clip created', {\n clipName,\n trackCount: tracks.length,\n durationSec: maxTime,\n visemeIds: visemeChannels.map((channel) => channel.target.type === 'viseme' ? channel.target.id : null),\n lipSyncIds: lipSyncChannels.map((channel) => channel.target.type === 'lipSync' ? channel.target.id : null),\n auIds: auChannels.map((channel) => channel.target.type === 'au' ? channel.target.id : null),\n });\n this.debugClipLog(`[Embody] typedSnippetToClip: Created clip \"${clipName}\" with ${tracks.length} tracks, duration ${maxTime.toFixed(2)}s`);\n\n return clip;\n }\n\n private playClipDirect(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n const mixer = this.ensureClipMixer();\n\n if (!mixer) {\n console.warn('[Embody] playClip: No model loaded, cannot create mixer');\n return null;\n }\n const hasInheritedStart = !!this.dynamicClipSources.get(clip)?.hasInheritedStart;\n clip = this.resolveInheritedClipForPlayback(clip);\n\n const playbackState = this.mergePlaybackOptions(\n this.getPlaybackStateSnapshot(clip.name, {\n loop: false,\n source: options?.source ?? 'clip',\n }),\n options\n );\n const startTime = this.resolveStartTime(clip.duration, playbackState, options?.startTime);\n\n let action: AnimationAction;\n let actionId: string;\n let existingAction = this.clipActions.get(clip.name);\n if (existingAction && hasInheritedStart && existingAction.getClip() !== clip) {\n const previousClip = existingAction.getClip();\n const previousActionId = this.getActionId(existingAction);\n try { existingAction.stop(); } catch {}\n try { mixer.uncacheAction(previousClip); } catch {}\n try { mixer.uncacheClip(previousClip); } catch {}\n if (previousActionId) this.cleanupClipMonitor(previousActionId);\n this.clipActions.delete(clip.name);\n this.animationActions.delete(clip.name);\n existingAction = undefined;\n }\n if (existingAction) {\n action = existingAction;\n actionId = this.getActionId(action) ?? this.setActionId(action, clip.name);\n } else {\n action = mixer.clipAction(clip);\n actionId = this.setActionId(action, clip.name);\n }\n\n const existingClip = this.animationClips.find(c => c.name === clip.name);\n if (!existingClip) {\n this.animationClips.push(clip);\n }\n this.applyPlaybackState(action, playbackState);\n\n this.cleanupClipMonitor(actionId);\n\n let resolveFinished!: () => void;\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n const createMonitor = (\n listeners = new Set<ClipEventListener>(),\n state = this.playbackState.get(clip.name) ?? playbackState\n ): ClipMonitor => {\n const keyframeTimes = this.getClipEventMetadata(clip).keyframeTimes;\n const initialDirection: 1 | -1 = state.reverse ? -1 : 1;\n return {\n action,\n actionId,\n clip,\n clipName: clip.name,\n duration: clip.duration,\n keyframeTimes,\n listeners,\n initialDirection,\n direction: initialDirection,\n iteration: 0,\n lastTime: Math.max(0, Math.min(clip.duration, action.time)),\n lastKeyframeIndex: this.getKeyframeIndex(keyframeTimes, action.time),\n loopMode: state.loopMode,\n finishedPending: false,\n cleanedUp: false,\n resolveFinished,\n };\n };\n let monitor = createMonitor();\n this.clipMonitors.set(actionId, monitor);\n\n action.reset();\n action.time = startTime;\n action.play();\n this.resetClipMonitor(monitor, action.time);\n\n this.clipActions.set(clip.name, action);\n this.animationActions.set(clip.name, action);\n this.setPlaybackState(clip.name, playbackState);\n this.debugClipLog(`[Embody] playClip: Playing \"${clip.name}\" (rate: ${playbackState.playbackRate}, loop: ${playbackState.loop}, actionId: ${actionId})`);\n\n const handle: ClipHandle = {\n clipName: clip.name,\n actionId,\n\n play: () => {\n const source = this.dynamicClipSources.get(clip);\n if (source?.hasInheritedStart) {\n const listeners = new Set(monitor.listeners);\n const nextClip = this.rebuildDynamicClip(source);\n if (nextClip) {\n try { action.stop(); } catch {}\n try { mixer.uncacheAction(clip); } catch {}\n try { mixer.uncacheClip(clip); } catch {}\n this.cleanupClipMonitor(actionId, { resolveFinished: false });\n clip = nextClip;\n action = mixer.clipAction(clip);\n actionId = this.setActionId(action, clip.name);\n handle.actionId = actionId;\n const nextPlaybackState = this.playbackState.get(clip.name) ?? playbackState;\n this.applyPlaybackState(action, nextPlaybackState);\n monitor = createMonitor(listeners, nextPlaybackState);\n this.clipMonitors.set(actionId, monitor);\n this.clipActions.set(clip.name, action);\n this.animationActions.set(clip.name, action);\n }\n }\n action.reset();\n action.time = this.resolveStartTime(\n clip.duration,\n this.getPlaybackStateSnapshot(clip.name, {\n loop: false,\n source: this.clipSources.get(clip.name) ?? playbackState.source,\n })\n );\n action.play();\n this.resetClipMonitor(monitor, action.time);\n },\n\n stop: () => {\n action.stop();\n // Fully remove action from mixer to prevent accumulation and weight blending issues\n try { mixer.uncacheAction(clip); } catch {}\n try { mixer.uncacheClip(clip); } catch {}\n this.clipActions.delete(clip.name);\n this.animationActions.delete(clip.name);\n this.animationFinishedCallbacks.delete(clip.name);\n this.playbackState.delete(clip.name);\n this.rendererClipHandles.delete(clip.name);\n this.cleanupClipMonitor(actionId);\n },\n\n pause: () => {\n action.paused = true;\n },\n\n resume: () => {\n action.paused = false;\n },\n\n setWeight: (w: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.weight = typeof w === 'number' && Number.isFinite(w) ? Math.max(0, w) : 1.0;\n action.setEffectiveWeight(next.weight);\n this.setPlaybackState(clip.name, next);\n },\n\n setPlaybackRate: (r: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.playbackRate = Number.isFinite(r) ? Math.max(0, Math.abs(r)) : 1.0;\n this.applyPlaybackState(action, next);\n monitor.direction = next.reverse ? -1 : 1;\n monitor.initialDirection = monitor.direction;\n this.setPlaybackState(clip.name, next);\n },\n\n setLoop: (mode: 'once' | 'repeat' | 'pingpong', repeatCount?: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.loopMode = mode;\n next.loop = mode !== 'once';\n next.repeatCount = repeatCount;\n this.applyPlaybackState(action, next);\n monitor.loopMode = mode;\n this.setPlaybackState(clip.name, next);\n },\n\n setTime: (t: number) => {\n const clamped = Math.max(0, Math.min(clip.duration, t));\n action.time = clamped;\n try { mixer.update(0); } catch {}\n this.syncClipMonitorTime(monitor, clamped, true);\n },\n\n getTime: () => action.time,\n\n getDuration: () => clip.duration,\n\n subscribe: (listener: ClipEventListener) => {\n monitor.listeners.add(listener);\n return () => {\n monitor.listeners.delete(listener);\n };\n },\n\n finished: finishedPromise,\n };\n this.clipHandles.set(clip.name, handle);\n this.rendererClipHandles.set(clip.name, handle);\n\n return handle;\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n return this.playClipDirect(clip, options);\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap } | TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n if ('channels' in snippet) {\n return this.playTypedSnippet(snippet, options);\n }\n if (this.cljsAnimationRuntime) {\n const handle = this.cljsAnimationRuntime.playSnippet(\n snippet.name,\n snippet.curves,\n { ...options, source: options?.source ?? 'snippet' }\n );\n if (!handle) return null;\n this.clipHandles.set(snippet.name, handle);\n return handle;\n }\n const clip = this.snippetToClip(snippet.name, snippet.curves, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'snippet' });\n }\n\n playTypedSnippet(\n snippet: TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n logTypedLipSyncDebug('[Embody Typed LipSync] playTypedSnippet', {\n name: snippet.name,\n channelCount: snippet.channels.length,\n channels: snippet.channels.map(summarizeTypedChannel),\n options: {\n source: options?.source,\n autoVisemeJaw: options?.autoVisemeJaw,\n jawScale: options?.jawScale,\n intensityScale: options?.intensityScale,\n },\n });\n const clip = this.typedSnippetToClip(snippet.name, snippet.channels, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'snippet' });\n }\n\n buildClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n if (this.cljsAnimationRuntime) {\n const handle = this.cljsAnimationRuntime.buildClip(\n clipName,\n curves,\n { ...options, source: options?.source ?? 'clip' }\n );\n if (!handle) return null;\n this.clipHandles.set(clipName, handle);\n return handle;\n }\n\n return this.buildClipDirect(clipName, curves, options);\n }\n\n private buildClipDirect(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n const clip = this.snippetToClip(clipName, curves, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'clip' });\n }\n\n buildTypedClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): ClipHandle | null {\n const clip = this.typedSnippetToClip(clipName, channels, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'clip' });\n }\n\n cleanupSnippet(name: string) {\n if (this.cljsAnimationRuntime) {\n this.cljsAnimationRuntime.cleanupSnippet(name);\n }\n this.cleanupSnippetDirect(name);\n }\n\n private cleanupSnippetDirect(name: string) {\n if (!this.host.getModel()) return;\n for (const [clipName, action] of Array.from(this.clipActions.entries())) {\n if (clipName === name || clipName.startsWith(`${name}_`)) {\n const actionId = this.getActionId(action);\n try {\n action.stop();\n // Fully remove action from mixer to prevent accumulation\n const clip = action.getClip();\n if (clip && this.clipAnimationMixer) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n } catch {}\n this.clipActions.delete(clipName);\n this.animationActions.delete(clipName);\n this.clipHandles.delete(clipName);\n this.rendererClipHandles.delete(clipName);\n this.animationFinishedCallbacks.delete(clipName);\n this.playbackState.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n }\n }\n\n updateClipParams(name: string, params: ClipParamsUpdate): boolean {\n if (this.cljsAnimationRuntime) {\n this.cljsAnimationRuntime.updateClipParams(name, params);\n }\n\n return this.updateClipParamsDirect(name, params);\n }\n\n private updateClipParamsDirect(name: string, params: ClipParamsUpdate): boolean {\n let updated = false;\n const matches = (clipName: string, action?: AnimationAction | null) => {\n if (params.actionId) {\n const aid = action ? this.actionIds.get(action) : this.actionIdToClip.get(params.actionId);\n if (aid && aid === params.actionId) return true;\n }\n return clipName === name || clipName.startsWith(`${name}_`) || clipName.includes(name);\n };\n\n const debugSnapshot = () => ({\n target: name,\n params,\n clipActions: Array.from(this.clipActions.entries()).map(([k, a]) => ({ name: k, actionId: this.getActionId(a) })),\n animationActions: Array.from(this.animationActions.entries()).map(([k, a]) => ({ name: k, actionId: this.getActionId(a) })),\n clipHandles: Array.from(this.clipHandles.entries()).map(([k, h]) => ({ name: k, actionId: h.actionId })),\n mixerActions: [\n ...(this.animationMixer?._actions || []),\n ...(this.clipAnimationMixer?._actions || []),\n ].map((a: AnimationAction) => ({ name: a?.getClip?.()?.name || '', actionId: this.getActionId(a) })),\n });\n\n this.debugClipLog('[Embody] updateClipParams start', debugSnapshot());\n\n const apply = (action: AnimationAction | null | undefined) => {\n if (!action) return;\n const actionId = this.getActionId(action);\n const monitor = actionId ? this.clipMonitors.get(actionId) : undefined;\n const clipName = action.getClip().name;\n const next = this.playbackState.get(clipName)\n ?? this.normalizePlaybackOptions(undefined, { loop: false, source: this.clipSources.get(clipName) ?? 'clip' });\n try { action.paused = false; } catch {}\n if (typeof params.weight === 'number' && Number.isFinite(params.weight)) {\n action.setEffectiveWeight(params.weight);\n next.weight = Math.max(0, params.weight);\n updated = true;\n }\n if (typeof params.rate === 'number' && Number.isFinite(params.rate)) {\n next.playbackRate = Math.max(0, Math.abs(params.rate));\n if (typeof params.reverse === 'boolean') {\n next.reverse = params.reverse;\n }\n const signedRate = next.reverse ? -next.playbackRate : next.playbackRate;\n action.setEffectiveTimeScale(signedRate);\n if (monitor) {\n monitor.direction = next.reverse ? -1 : 1;\n monitor.initialDirection = monitor.direction;\n }\n updated = true;\n }\n if (typeof params.loop === 'boolean' || params.loopMode || params.repeatCount !== undefined) {\n next.loopMode = params.loopMode || (params.loop ? 'repeat' : 'once');\n next.loop = next.loopMode !== 'once';\n next.repeatCount = params.repeatCount;\n this.applyPlaybackState(action, next);\n if (monitor) monitor.loopMode = next.loopMode;\n updated = true;\n }\n this.setPlaybackState(clipName, next);\n };\n\n for (const [clipName, action] of this.clipActions.entries()) {\n if (matches(clipName, action)) {\n apply(action);\n }\n }\n for (const [clipName, action] of this.animationActions.entries()) {\n if (matches(clipName, action)) {\n apply(action);\n }\n }\n\n if (!updated && params.actionId) {\n const clipName = this.actionIdToClip.get(params.actionId);\n if (clipName) {\n const action = this.clipActions.get(clipName) || this.animationActions.get(clipName);\n if (action) apply(action);\n }\n }\n\n this.debugClipLog('[Embody] updateClipParams end', debugSnapshot());\n return updated;\n }\n\n private addMorphTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphKey: string,\n keyframes: ScalarKeyframe[],\n intensityScale: number,\n meshNames?: string[]\n ): void {\n const config = this.host.getConfig();\n const hasExplicitMeshes = meshNames !== undefined;\n const targetMeshNames = hasExplicitMeshes ? meshNames : (config.morphToMesh?.face || []);\n const targetMeshes = targetMeshNames.length\n ? targetMeshNames.map((name) => this.host.getMeshByName(name)).filter(Boolean) as Mesh[]\n : [];\n\n const addTrackForMesh = (mesh: Mesh) => {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl || dict[morphKey] === undefined) return;\n\n const morphIndex = dict[morphKey];\n const inheritedStartValue = keyframes[0]?.inherit ? infl[morphIndex] ?? 0 : undefined;\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(\n Math.max(\n 0,\n Math.min(\n 2,\n this.sampleFinalKeyframeValue(\n keyframes,\n kf.time,\n (intensity) => intensity * intensityScale,\n inheritedStartValue\n )\n )\n )\n );\n }\n\n const trackName = `${mesh.uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n }\n\n private addMorphIndexTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphIndex: number,\n keyframes: ScalarKeyframe[],\n intensityScale: number,\n meshNames?: string[]\n ): void {\n if (!Number.isInteger(morphIndex) || morphIndex < 0) return;\n const config = this.host.getConfig();\n const hasExplicitMeshes = meshNames !== undefined;\n const targetMeshNames = hasExplicitMeshes ? meshNames : (config.morphToMesh?.face || []);\n const targetMeshes = targetMeshNames.length\n ? targetMeshNames.map((name) => this.host.getMeshByName(name)).filter(Boolean) as Mesh[]\n : [];\n\n const addTrackForMesh = (mesh: Mesh) => {\n const infl = mesh.morphTargetInfluences;\n if (!infl || morphIndex < 0 || morphIndex >= infl.length) return;\n const inheritedStartValue = keyframes[0]?.inherit ? infl[morphIndex] ?? 0 : undefined;\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(\n Math.max(\n 0,\n Math.min(\n 2,\n this.sampleFinalKeyframeValue(\n keyframes,\n kf.time,\n (intensity) => intensity * intensityScale,\n inheritedStartValue\n )\n )\n )\n );\n }\n\n const trackName = `${mesh.uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n }\n\n private sampleFinalKeyframeValue(\n keyframes: ScalarKeyframe[],\n t: number,\n toFinalValue: (intensity: number) => number,\n inheritedStartValue?: number\n ): number {\n if (!keyframes.length) return 0;\n const firstValue = inheritedStartValue ?? toFinalValue(keyframes[0].intensity);\n if (t <= keyframes[0].time) return firstValue;\n if (t >= keyframes[keyframes.length - 1].time) {\n return toFinalValue(keyframes[keyframes.length - 1].intensity);\n }\n\n for (let i = 0; i < keyframes.length - 1; i += 1) {\n const a = keyframes[i];\n const b = keyframes[i + 1];\n if (t >= a.time && t <= b.time) {\n const dt = Math.max(1e-6, b.time - a.time);\n const p = (t - a.time) / dt;\n const aValue = i === 0 ? firstValue : toFinalValue(a.intensity);\n const bValue = toFinalValue(b.intensity);\n return aValue + (bValue - aValue) * p;\n }\n }\n\n return 0;\n }\n\n private ensureMixer(): AnimationMixer | null {\n const model = this.host.getModel();\n if (!model) return null;\n\n if (!this.animationMixer) {\n this.animationMixer = new AnimationMixer(model);\n }\n\n if (this.animationMixer && !this.mixerFinishedListenerAttached) {\n this.animationMixer.addEventListener('finished', (event: any) => this.handleMixerFinished(event));\n this.mixerFinishedListenerAttached = true;\n }\n\n return this.animationMixer;\n }\n\n private ensureClipMixer(): AnimationMixer | null {\n const model = this.host.getModel();\n if (!model) return null;\n\n if (!this.clipAnimationMixer) {\n this.clipAnimationMixer = new AnimationMixer(model);\n }\n\n if (this.clipAnimationMixer && !this.clipMixerFinishedListenerAttached) {\n this.clipAnimationMixer.addEventListener('finished', (event: any) => this.handleMixerFinished(event));\n this.clipMixerFinishedListenerAttached = true;\n }\n\n return this.clipAnimationMixer;\n }\n\n private handleMixerFinished(event: any): void {\n const action = event.action as AnimationAction;\n const actionId = this.getActionId(action);\n if (actionId) {\n const monitor = this.clipMonitors.get(actionId);\n if (monitor) {\n monitor.finishedPending = true;\n return;\n }\n }\n const clip = action.getClip();\n const bakedMixerClip = this.bakedMixerClipToSource.get(clip.name);\n if (bakedMixerClip) {\n const group = this.bakedActionGroups.get(bakedMixerClip.sourceClipName);\n if (group && group.pendingFinishedChannels.delete(bakedMixerClip.channel) && group.pendingFinishedChannels.size === 0) {\n group.resolveFinished();\n }\n return;\n }\n const callback = this.animationFinishedCallbacks.get(clip.name);\n if (callback) {\n callback();\n this.animationFinishedCallbacks.delete(clip.name);\n }\n }\n\n private createAnimationHandle(\n clipName: string,\n action: AnimationAction,\n finishedPromise: Promise<void>\n ): AnimationActionHandle {\n return {\n actionId: this.getActionId(action),\n stop: () => this.stopAnimation(clipName),\n pause: () => this.pauseAnimation(clipName),\n resume: () => this.resumeAnimation(clipName),\n setSpeed: (speed: number) => this.setAnimationSpeed(clipName, speed),\n setWeight: (weight: number) => this.setAnimationIntensity(clipName, weight),\n seekTo: (time: number) => this.seekAnimation(clipName, time),\n getState: () => this.getAnimationState(clipName)!,\n crossfadeTo: (targetClip: string, dur?: number) => this.crossfadeTo(targetClip, dur),\n finished: finishedPromise,\n };\n }\n\n private createBakedAnimationHandle(\n clipName: string,\n group: BakedActionGroup\n ): AnimationActionHandle {\n return {\n actionId: group.actionId,\n stop: () => this.stopAnimation(clipName),\n pause: () => this.pauseAnimation(clipName),\n resume: () => this.resumeAnimation(clipName),\n setSpeed: (speed: number) => this.setAnimationSpeed(clipName, speed),\n setWeight: (weight: number) => this.setAnimationIntensity(clipName, weight),\n seekTo: (time: number) => this.seekAnimation(clipName, time),\n getState: () => this.getAnimationState(clipName)!,\n crossfadeTo: (targetClip: string, dur?: number) => this.crossfadeTo(targetClip, dur),\n finished: group.finishedPromise,\n };\n }\n}\n\n/** @deprecated Use ThreeAnimationSystem. */\nexport { ThreeAnimationSystem as AnimationController };\n\n/** @deprecated Use ThreeAnimationSystem. */\nexport { ThreeAnimationSystem as BakedAnimationController };\n","import {\n Box3,\n Vector3,\n} from 'three';\nimport type { AnimationClip, KeyframeTrack, Mesh, Object3D } from 'three';\nimport type { HostModelInspector, ModelDescriptor, MeshId, MorphTargetId, BoneId, Transform } from '../../core/contracts';\nimport type { Profile } from '../../mappings/types';\nimport type { NodeBase, ResolvedBones } from './types';\n\nexport interface ThreeAnimationTrackDescriptor {\n readonly name: string;\n readonly targetName: string;\n readonly property: string;\n readonly type: 'position' | 'rotation' | 'scale' | 'morph' | 'unknown';\n readonly keyframeCount: number;\n readonly valueSize: number;\n readonly valueRange?: { readonly min: readonly number[]; readonly max: readonly number[] };\n}\n\nexport interface ThreeAnimationClipDescriptor {\n readonly name: string;\n readonly duration: number;\n readonly tracks: readonly ThreeAnimationTrackDescriptor[];\n readonly animatedBones: readonly string[];\n readonly animatedMorphs: readonly string[];\n}\n\nexport interface ThreeModelInspectionOptions {\n readonly meshes?: readonly Mesh[];\n readonly profile?: Profile;\n readonly previousBones?: ResolvedBones;\n readonly animations?: readonly AnimationClip[];\n}\n\nexport interface ThreeModelInspection {\n readonly descriptor: ModelDescriptor;\n readonly meshByName: Map<string, Mesh>;\n readonly allMeshes: Mesh[];\n readonly morphMeshes: Mesh[];\n readonly bones: ResolvedBones;\n readonly resolvedFaceMeshes: string[];\n readonly faceMesh: Mesh | null;\n readonly animations: ThreeAnimationClipDescriptor[];\n}\n\ntype MorphTargetEntry = { name: string; index: number };\n\nconst meshId = (value: number) => value as MeshId;\nconst morphTargetId = (value: number) => value as MorphTargetId;\nconst boneId = (value: number) => value as BoneId;\n\nexport class ThreeModelInspector implements HostModelInspector<Object3D> {\n describeModel(model: Object3D): ModelDescriptor {\n return this.inspectModel(model).descriptor;\n }\n\n inspectModel(model: Object3D, options: ThreeModelInspectionOptions = {}): ThreeModelInspection {\n const allMeshes = this.collectMeshes(model);\n const morphMeshes = this.mergeMorphMeshes(options.meshes || [], collectMorphMeshes(model));\n const meshByName = this.buildMeshByName(model);\n const bones = options.profile\n ? this.resolveBones(model, options.profile, options.previousBones)\n : {};\n const resolvedFaceMeshes = options.profile\n ? this.resolveFaceMeshes(morphMeshes, meshByName, bones, options.profile)\n : [];\n const faceMesh = resolvedFaceMeshes.length > 0\n ? meshByName.get(resolvedFaceMeshes[0]) || null\n : null;\n const animations = this.describeAnimations(options.animations || []);\n const descriptor = this.buildDescriptor(model, allMeshes, bones, animations);\n\n return {\n descriptor,\n meshByName,\n allMeshes,\n morphMeshes,\n bones,\n resolvedFaceMeshes,\n faceMesh,\n animations,\n };\n }\n\n collectMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n meshes.push(obj as Mesh);\n }\n });\n return meshes;\n }\n\n buildMeshByName(root: Object3D): Map<string, Mesh> {\n const meshByName = new Map<string, Mesh>();\n root.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n meshByName.set(obj.name, obj as Mesh);\n }\n });\n return meshByName;\n }\n\n resolveBones(root: Object3D, profile: Profile, previousBones: ResolvedBones = {}): ResolvedBones {\n const resolved: ResolvedBones = {};\n\n const snapshot = (obj: Object3D): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const snapshotPreservingBasePose = (obj: Object3D): NodeBase => {\n const existing = Object.values(previousBones).find((entry) => entry?.obj === obj);\n if (!existing) {\n return snapshot(obj);\n }\n\n return {\n obj,\n basePos: { ...existing.basePos },\n baseQuat: existing.baseQuat.clone(),\n baseEuler: { ...existing.baseEuler },\n };\n };\n\n const prefix = profile.bonePrefix || '';\n const suffix = profile.boneSuffix || '';\n const suffixRegex = profile.suffixPattern\n ? new RegExp(profile.suffixPattern)\n : null;\n\n const findNode = (baseName?: string | null): Object3D | undefined => {\n if (!baseName) return undefined;\n\n const directMatch = root.getObjectByName(baseName);\n if (directMatch) return directMatch;\n\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n const fullName = suffix && !prefixedBase.endsWith(suffix)\n ? `${prefixedBase}${suffix}`\n : prefixedBase;\n const exactMatch = root.getObjectByName(fullName);\n if (exactMatch) return exactMatch;\n\n if (suffixRegex) {\n let found: Object3D | undefined;\n root.traverse((obj: any) => {\n if (found) return;\n if (obj.name && obj.name.startsWith(fullName)) {\n const candidateSuffix = obj.name.slice(fullName.length);\n if (candidateSuffix === '' || suffixRegex.test(candidateSuffix)) {\n found = obj;\n }\n }\n });\n if (found) return found;\n }\n\n return undefined;\n };\n\n const addResolvedBone = (key: string, node: Object3D) => {\n const entry = snapshotPreservingBasePose(node);\n resolved[key] = entry;\n if (node.name) {\n resolved[node.name] = entry;\n }\n };\n\n for (const [key, nodeName] of Object.entries(profile.boneNodes || {})) {\n const node = findNode(nodeName);\n if (node) {\n addResolvedBone(key, node);\n if (nodeName) {\n resolved[nodeName] = resolved[key]!;\n }\n }\n }\n\n if (!resolved.EYE_L && profile.eyeMeshNodes) {\n const node = findNode(profile.eyeMeshNodes.LEFT);\n if (node) {\n addResolvedBone('EYE_L', node);\n }\n }\n if (!resolved.EYE_R && profile.eyeMeshNodes) {\n const node = findNode(profile.eyeMeshNodes.RIGHT);\n if (node) {\n addResolvedBone('EYE_R', node);\n }\n }\n\n const referencedNodes = new Set<string>();\n Object.values(profile.auToBones ?? {}).forEach((bindings) => {\n bindings.forEach((binding) => referencedNodes.add(binding.node));\n });\n profile.compositeRotations?.forEach((composite) => referencedNodes.add(composite.node));\n Object.values(profile.continuumPairs ?? {}).forEach((pair) => {\n if (pair?.node) referencedNodes.add(pair.node);\n });\n profile.annotationRegions?.forEach((region) => {\n region.bones?.forEach((boneName) => referencedNodes.add(boneName));\n });\n\n referencedNodes.forEach((nodeKey) => {\n if (resolved[nodeKey]) return;\n const configuredName = profile.boneNodes?.[nodeKey] ?? nodeKey;\n const node = findNode(configuredName);\n if (node) {\n addResolvedBone(nodeKey, node);\n if (configuredName) {\n resolved[configuredName] = resolved[nodeKey]!;\n }\n }\n });\n\n return resolved;\n }\n\n resolveFaceMeshes(\n meshes: readonly Mesh[],\n meshByName: ReadonlyMap<string, Mesh>,\n bones: ResolvedBones,\n profile: Profile\n ): string[] {\n const faceMeshNames = profile.morphToMesh?.face || [];\n const availableMorphMeshes = meshes.filter((m) => hasMorphTargets(m));\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n return [defaultFace.name];\n }\n\n const candidateByMorph = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n if (candidateByMorph) {\n return [candidateByMorph.name];\n }\n\n const headNodeKey = profile.auToBones?.[51]?.[0]?.node\n ?? profile.auToBones?.[52]?.[0]?.node\n ?? profile.compositeRotations?.find((composite) => (\n composite.yaw?.aus.includes(51)\n || composite.yaw?.aus.includes(52)\n || composite.pitch?.aus.includes(53)\n || composite.pitch?.aus.includes(54)\n || composite.roll?.aus.includes(55)\n || composite.roll?.aus.includes(56)\n ))?.node\n ?? 'HEAD';\n const head = bones[headNodeKey]?.obj ?? bones.HEAD?.obj;\n if (head && availableMorphMeshes.length > 0) {\n const headPos = new Vector3();\n (head as any).getWorldPosition?.(headPos);\n const headCandidates = availableMorphMeshes.map((mesh) => {\n const box = new Box3().setFromObject(mesh as any);\n const center = new Vector3();\n box.getCenter(center);\n const distance = box.containsPoint(headPos) ? 0 : center.distanceTo(headPos);\n const morphCount = mesh.morphTargetDictionary\n ? Object.keys(mesh.morphTargetDictionary).length\n : 0;\n const name = mesh.name.toLowerCase();\n const penalty = /eye|occlusion|tear|teeth|tongue|hair|lash/.test(name) ? 10 : 0;\n return { name: mesh.name, distance, morphCount, penalty };\n });\n\n headCandidates.sort((a, b) => {\n if (a.distance !== b.distance) return a.distance - b.distance;\n if (a.penalty !== b.penalty) return a.penalty - b.penalty;\n return b.morphCount - a.morphCount;\n });\n\n const best = headCandidates[0];\n const extras = headCandidates\n .filter((entry) => /brow|eyebrow/.test(entry.name.toLowerCase()))\n .map((entry) => entry.name);\n\n return [best.name, ...extras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n if (availableMorphMeshes.length > 0) {\n const best = availableMorphMeshes.reduce((prev, current) => {\n const prevCount = prev.morphTargetDictionary ? Object.keys(prev.morphTargetDictionary).length : 0;\n const currCount = current.morphTargetDictionary ? Object.keys(current.morphTargetDictionary).length : 0;\n return currCount > prevCount ? current : prev;\n });\n const browExtras = availableMorphMeshes\n .filter((m) => {\n const dict = m.morphTargetDictionary || {};\n const morphKeys = Object.keys(dict);\n return /brow|eyebrow/i.test(m.name) || morphKeys.some((k) => /brow/i.test(k));\n })\n .map((m) => m.name);\n return [best.name, ...browExtras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n return faceMeshNames.filter((name) => meshByName.has(name));\n }\n\n describeAnimations(animations: readonly AnimationClip[]): ThreeAnimationClipDescriptor[] {\n return animations.map((clip) => {\n const tracks = clip.tracks.map((track) => this.describeTrack(track));\n const animatedBones = new Set<string>();\n const animatedMorphs = new Set<string>();\n\n for (const track of tracks) {\n if (track.type === 'rotation' || track.type === 'position') {\n animatedBones.add(track.targetName);\n } else if (track.type === 'morph') {\n animatedMorphs.add(track.name);\n }\n }\n\n return {\n name: clip.name,\n duration: clip.duration,\n tracks,\n animatedBones: Array.from(animatedBones),\n animatedMorphs: Array.from(animatedMorphs),\n };\n });\n }\n\n private mergeMorphMeshes(inputMeshes: readonly Mesh[], collectedMeshes: readonly Mesh[]): Mesh[] {\n const meshByKey = new Map<string, Mesh>();\n const addMesh = (mesh: Mesh) => {\n const key = mesh.name || (mesh as any).uuid;\n if (!meshByKey.has(key)) {\n meshByKey.set(key, mesh);\n }\n };\n\n inputMeshes.forEach(addMesh);\n collectedMeshes.forEach(addMesh);\n return Array.from(meshByKey.values());\n }\n\n private buildDescriptor(\n model: Object3D,\n meshes: readonly Mesh[],\n resolvedBones: ResolvedBones,\n animations: readonly ThreeAnimationClipDescriptor[]\n ): ModelDescriptor {\n const meshIds = new Map<Mesh, MeshId>();\n meshes.forEach((mesh, index) => meshIds.set(mesh, meshId(index + 1)));\n\n const boneObjects = this.collectDescriptorBoneObjects(model, resolvedBones);\n const boneIds = new Map<Object3D, BoneId>();\n boneObjects.forEach((bone, index) => boneIds.set(bone, boneId(index + 1)));\n\n const boneParentIds = new Map<Object3D, BoneId | undefined>();\n for (const bone of boneObjects) {\n boneParentIds.set(bone, this.findNearestDescriptorBoneId(bone.parent, boneIds));\n }\n\n const boneChildIds = new Map<Object3D, BoneId[]>();\n for (const bone of boneObjects) {\n boneChildIds.set(bone, []);\n }\n for (const bone of boneObjects) {\n const parentId = boneParentIds.get(bone);\n if (parentId === undefined) continue;\n const parent = boneObjects.find((candidate) => boneIds.get(candidate) === parentId);\n if (parent) {\n boneChildIds.get(parent)?.push(boneIds.get(bone)!);\n }\n }\n\n const morphTargets = [];\n const morphTargetIdsByMesh = new Map<Mesh, MorphTargetId[]>();\n let nextMorphTargetId = 1;\n for (const mesh of meshes) {\n const ids: MorphTargetId[] = [];\n for (const entry of getMorphTargetEntries(mesh)) {\n const id = morphTargetId(nextMorphTargetId++);\n ids.push(id);\n morphTargets.push({\n id,\n meshId: meshIds.get(mesh)!,\n name: entry.name,\n hostIndex: entry.index,\n });\n }\n morphTargetIdsByMesh.set(mesh, ids);\n }\n\n return {\n id: model.uuid,\n name: model.name || undefined,\n meshes: meshes.map((mesh) => ({\n id: meshIds.get(mesh)!,\n name: mesh.name,\n parentBoneId: this.findNearestDescriptorBoneId(mesh.parent, boneIds),\n morphTargetIds: morphTargetIdsByMesh.get(mesh) || [],\n visible: mesh.visible,\n })),\n morphTargets,\n bones: boneObjects.map((bone) => ({\n id: boneIds.get(bone)!,\n name: bone.name,\n parentId: boneParentIds.get(bone),\n childIds: boneChildIds.get(bone) || [],\n restTransform: objectTransform(bone),\n })),\n metadata: animations.length > 0 ? { animations } : undefined,\n };\n }\n\n private collectDescriptorBoneObjects(model: Object3D, resolvedBones: ResolvedBones): Object3D[] {\n const boneObjects: Object3D[] = [];\n const addBone = (obj: Object3D) => {\n if (!boneObjects.includes(obj)) {\n boneObjects.push(obj);\n }\n };\n\n model.traverse((obj: any) => {\n if (obj.isBone || obj.type === 'Bone') {\n addBone(obj as Object3D);\n }\n });\n\n for (const entry of Object.values(resolvedBones)) {\n if (entry?.obj) {\n addBone(entry.obj);\n }\n }\n\n return boneObjects;\n }\n\n private findNearestDescriptorBoneId(parent: Object3D | null, boneIds: ReadonlyMap<Object3D, BoneId>): BoneId | undefined {\n let current = parent;\n while (current) {\n const id = boneIds.get(current);\n if (id !== undefined) return id;\n current = current.parent;\n }\n return undefined;\n }\n\n private describeTrack(track: KeyframeTrack): ThreeAnimationTrackDescriptor {\n const parts = track.name.split('.');\n const targetName = parts[0];\n const property = parts.slice(1).join('.');\n const type = getTrackType(property);\n const valueSize = track.getValueSize();\n const valueRange = getValueRange(track.values, valueSize);\n\n return {\n name: track.name,\n targetName,\n property,\n type,\n keyframeCount: track.times.length,\n valueSize,\n valueRange,\n };\n }\n}\n\nexport function collectMorphMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n const dict = obj.morphTargetDictionary;\n const infl = obj.morphTargetInfluences;\n if ((dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0)) {\n meshes.push(obj as Mesh);\n }\n }\n });\n return meshes;\n}\n\nfunction hasMorphTargets(mesh: Mesh): boolean {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n return !!(dict && Object.keys(dict).length > 0) || !!(Array.isArray(infl) && infl.length > 0);\n}\n\nfunction getMorphTargetEntries(mesh: Mesh): MorphTargetEntry[] {\n const meshDictionary = mesh.morphTargetDictionary as Record<string, number> | undefined;\n const geometryDictionary = (mesh.geometry as any).morphTargetDictionary as Record<string, number> | undefined;\n const dictionary = meshDictionary || geometryDictionary;\n\n if (dictionary) {\n return Object.entries(dictionary)\n .map(([name, index]) => ({ name, index }))\n .sort((a, b) => a.index - b.index);\n }\n\n const influences = mesh.morphTargetInfluences;\n if (!influences || influences.length === 0) {\n return [];\n }\n\n return influences.map((_, index) => ({ name: `morph_${index}`, index }));\n}\n\nfunction objectTransform(obj: Object3D): Transform {\n return {\n position: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n rotation: { x: obj.quaternion.x, y: obj.quaternion.y, z: obj.quaternion.z, w: obj.quaternion.w },\n scale: { x: obj.scale.x, y: obj.scale.y, z: obj.scale.z },\n };\n}\n\nfunction getTrackType(property: string): ThreeAnimationTrackDescriptor['type'] {\n if (property.includes('position')) return 'position';\n if (property.includes('quaternion') || property.includes('rotation')) return 'rotation';\n if (property.includes('scale')) return 'scale';\n if (property.includes('morphTargetInfluences')) return 'morph';\n return 'unknown';\n}\n\nfunction getValueRange(values: KeyframeTrack['values'], valueSize: number): ThreeAnimationTrackDescriptor['valueRange'] {\n if (values.length === 0) return undefined;\n\n const min = Array(valueSize).fill(Infinity);\n const max = Array(valueSize).fill(-Infinity);\n\n for (let i = 0; i < values.length; i += valueSize) {\n for (let j = 0; j < valueSize; j += 1) {\n const value = values[i + j];\n if (value < min[j]) min[j] = value;\n if (value > max[j]) max[j] = value;\n }\n }\n\n return { min, max };\n}\n","import {\n AdditiveBlending,\n MultiplyBlending,\n NoBlending,\n NormalBlending,\n Quaternion,\n SubtractiveBlending,\n Vector3,\n} from 'three';\nimport type { Material, Mesh, Object3D } from 'three';\nimport type {\n BoneId,\n FrameDelta,\n HostFrameApplier,\n MeshId,\n MorphTargetId,\n Quat,\n Transform,\n Vec3,\n} from '../../core/contracts';\n\nexport interface ThreeMorphTargetBinding {\n readonly meshId: MeshId;\n readonly mesh: Mesh;\n readonly index: number;\n}\n\nexport interface ThreeFrameApplierBindings {\n readonly meshes?: ReadonlyMap<MeshId, Mesh>;\n readonly morphTargets?: ReadonlyMap<MorphTargetId, ThreeMorphTargetBinding>;\n readonly bones?: ReadonlyMap<BoneId, Object3D>;\n}\n\nexport interface ThreeMaterialConfig {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: keyof typeof THREE_BLENDING_MODES;\n}\n\nexport interface ThreeResolvedMaterialConfig {\n renderOrder: number;\n transparent: boolean;\n opacity: number;\n depthWrite: boolean;\n depthTest: boolean;\n blending: keyof typeof THREE_BLENDING_MODES;\n}\n\nexport interface ThreeMeshMaterialConfig {\n readonly material?: ThreeMaterialConfig;\n}\n\nexport const THREE_BLENDING_MODES = {\n Normal: NormalBlending,\n Additive: AdditiveBlending,\n Subtractive: SubtractiveBlending,\n Multiply: MultiplyBlending,\n None: NoBlending,\n} as const;\n\nexport class ThreeFrameApplier implements HostFrameApplier<Object3D> {\n private meshes = new Map<MeshId, Mesh>();\n private morphTargets = new Map<MorphTargetId, ThreeMorphTargetBinding>();\n private bones = new Map<BoneId, Object3D>();\n private originalEmissive = new Map<string, { color: number; intensity: number }>();\n\n constructor(bindings: ThreeFrameApplierBindings = {}) {\n this.setBindings(bindings);\n }\n\n setBindings(bindings: ThreeFrameApplierBindings): void {\n this.meshes = new Map(bindings.meshes || []);\n this.morphTargets = new Map(bindings.morphTargets || []);\n this.bones = new Map(bindings.bones || []);\n }\n\n applyFrameDelta(model: Object3D, frame: FrameDelta): void {\n for (const write of frame.morphTargets || []) {\n const binding = this.morphTargets.get(write.morphTargetId);\n if (!binding) continue;\n this.setMorphTarget(binding, write.value, write.mode);\n }\n\n let wroteTransforms = false;\n for (const write of frame.bones || []) {\n const bone = this.bones.get(write.boneId);\n if (!bone) continue;\n this.applyTransform(bone, write.transform, write.mode);\n wroteTransforms = true;\n }\n\n for (const write of frame.meshes || []) {\n const mesh = this.meshes.get(write.meshId);\n if (!mesh) continue;\n if (typeof write.visible === 'boolean') {\n mesh.visible = write.visible;\n }\n }\n\n // Morph-only frames don't affect matrices; skip the full-tree update.\n if (wroteTransforms) {\n model.updateMatrixWorld(true);\n }\n }\n\n applyPackedMorphFrameDelta(values: ArrayLike<number>, stride = 4): void {\n for (let index = 0; index + stride <= values.length; index += stride) {\n const morphTargetId = values[index + 1] as MorphTargetId;\n const binding = this.morphTargets.get(morphTargetId);\n if (!binding) continue;\n const mode = (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute';\n this.setMorphTarget(binding, values[index + 2] ?? 0, mode);\n }\n }\n\n /** Rows: `[boneId, px, py, pz, qx, qy, qz, qw, flags]`; flags bit0=position, bit1=rotation. */\n applyPackedBoneFrameDelta(values: ArrayLike<number>, stride = 9): void {\n for (let index = 0; index + stride <= values.length; index += stride) {\n const bone = this.bones.get(values[index] as BoneId);\n if (!bone) continue;\n const flags = values[index + 8] ?? 0;\n if (flags & 1) {\n bone.position.set(values[index + 1], values[index + 2], values[index + 3]);\n }\n if (flags & 2) {\n bone.quaternion\n .set(values[index + 4], values[index + 5], values[index + 6], values[index + 7])\n .normalize();\n }\n bone.updateMatrixWorld(false);\n }\n }\n\n applyObjectTransform(\n target: Object3D,\n transform: Transform,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n this.applyTransform(target, transform, mode);\n }\n\n applyMorphTargets(targets: readonly { infl: number[]; idx: number }[], value: number): void {\n for (const target of targets) {\n if (target.idx >= 0 && target.idx < target.infl.length) {\n target.infl[target.idx] = value;\n }\n }\n }\n\n resetMorphTargets(targets: readonly { infl: number[]; idx: number }[]): void {\n this.applyMorphTargets(targets, 0);\n }\n\n setMeshVisible(root: Object3D, meshName: string, visible: boolean): void {\n this.visitNamedMesh(root, meshName, (mesh) => {\n mesh.visible = visible;\n });\n }\n\n highlightMesh(root: Object3D, meshName: string | null, color = 0x00ffff, intensity = 0.5): void {\n root.traverse((obj: any) => {\n if (!obj.isMesh) return;\n\n for (const material of getMaterials(obj.material)) {\n if (!hasEmissive(material)) continue;\n\n if (meshName === null || obj.name !== meshName) {\n const original = this.originalEmissive.get(obj.name);\n if (original) {\n material.emissive.setHex(original.color);\n material.emissiveIntensity = original.intensity;\n }\n continue;\n }\n\n if (!this.originalEmissive.has(obj.name)) {\n this.originalEmissive.set(obj.name, {\n color: material.emissive.getHex(),\n intensity: material.emissiveIntensity || 0,\n });\n }\n material.emissive.setHex(color);\n material.emissiveIntensity = intensity;\n }\n });\n }\n\n getMeshMaterialConfig(root: Object3D, meshName: string): ThreeResolvedMaterialConfig | null {\n let result: ThreeResolvedMaterialConfig | null = null;\n this.visitNamedMesh(root, meshName, (mesh) => {\n const material = getMaterials((mesh as any).material)[0];\n if (!material) return;\n result = {\n renderOrder: mesh.renderOrder,\n transparent: material.transparent,\n opacity: material.opacity,\n depthWrite: material.depthWrite,\n depthTest: material.depthTest,\n blending: getBlendingName(material.blending),\n };\n });\n return result;\n }\n\n setMeshMaterialConfig(root: Object3D, meshName: string, config: ThreeMaterialConfig): void {\n this.visitNamedMesh(root, meshName, (mesh) => {\n this.applyMeshMaterialConfig(mesh, config);\n });\n }\n\n applyMeshMaterialConfigs(\n root: Object3D,\n configs: Readonly<Record<string, ThreeMeshMaterialConfig>>\n ): void {\n root.traverse((obj: any) => {\n if (!obj.isMesh || !obj.name) return;\n const config = configs[obj.name]?.material;\n if (config) {\n this.applyMeshMaterialConfig(obj as Mesh, config);\n }\n });\n }\n\n private applyMeshMaterialConfig(mesh: Mesh, config: ThreeMaterialConfig): void {\n if (typeof config.renderOrder === 'number') {\n mesh.renderOrder = config.renderOrder;\n }\n\n for (const material of getMaterials((mesh as any).material)) {\n if (typeof config.opacity === 'number') {\n material.opacity = config.opacity;\n if (config.opacity < 1 && config.transparent === undefined) {\n material.transparent = true;\n }\n }\n if (typeof config.transparent === 'boolean') {\n material.transparent = config.transparent;\n }\n if (typeof config.depthWrite === 'boolean') {\n material.depthWrite = config.depthWrite;\n }\n if (typeof config.depthTest === 'boolean') {\n material.depthTest = config.depthTest;\n }\n if (config.blending && config.blending in THREE_BLENDING_MODES) {\n material.blending = THREE_BLENDING_MODES[config.blending];\n }\n material.needsUpdate = true;\n }\n }\n\n private setMorphTarget(\n binding: ThreeMorphTargetBinding,\n value: number,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n const influences = binding.mesh.morphTargetInfluences;\n if (!influences || binding.index < 0 || binding.index >= influences.length) {\n return;\n }\n influences[binding.index] = mode === 'additive'\n ? (influences[binding.index] ?? 0) + value\n : value;\n }\n\n private applyTransform(\n target: Object3D,\n transform: Transform,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n if (transform.position) {\n applyVec3(target.position, transform.position, mode);\n }\n if (transform.rotation) {\n applyQuat(target.quaternion, transform.rotation, mode);\n }\n if (transform.scale) {\n applyVec3(target.scale, transform.scale, mode);\n }\n target.updateMatrixWorld(false);\n }\n\n private visitNamedMesh(root: Object3D, meshName: string, visit: (mesh: Mesh) => void): void {\n root.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n visit(obj as Mesh);\n }\n });\n }\n}\n\nfunction applyVec3(target: Vector3, value: Vec3, mode: 'absolute' | 'additive'): void {\n if (mode === 'additive') {\n target.x += value.x;\n target.y += value.y;\n target.z += value.z;\n return;\n }\n target.set(value.x, value.y, value.z);\n}\n\nfunction applyQuat(target: Quaternion, value: Quat, mode: 'absolute' | 'additive'): void {\n const next = new Quaternion(value.x, value.y, value.z, value.w).normalize();\n if (mode === 'additive') {\n target.multiply(next);\n return;\n }\n target.copy(next);\n}\n\nfunction getMaterials(material: Material | Material[] | undefined): Material[] {\n if (!material) return [];\n return Array.isArray(material) ? material : [material];\n}\n\nfunction hasEmissive(material: Material): material is Material & {\n emissive: { getHex(): number; setHex(color: number): void };\n emissiveIntensity: number;\n} {\n return 'emissive' in material;\n}\n\nfunction getBlendingName(value: number): keyof typeof THREE_BLENDING_MODES {\n for (const [name, blending] of Object.entries(THREE_BLENDING_MODES)) {\n if (blending === value) {\n return name as keyof typeof THREE_BLENDING_MODES;\n }\n }\n return 'Normal';\n}\n","import type {\n BoneFrameDelta,\n BoneDescriptor,\n BoneId,\n FrameDelta,\n MeshDescriptor,\n ModelDescriptor,\n MorphTargetDescriptor,\n MorphTargetId,\n Quat,\n Transform,\n Vec3,\n} from './contracts';\nimport type { BoneBinding, BoneKey, CompositeRotation, RotationAxis } from './types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from './compositeAxis';\nimport type { MorphTargetRef, Profile } from '../mappings/types';\nimport {\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getProfileVisemeSlots,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n getVisemeSlotIndex,\n} from '../mappings/visemeSystem';\n\nexport interface TsRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n}\n\ntype MorphTargetLookup = {\n readonly mesh: MeshDescriptor;\n readonly morphTarget: MorphTargetDescriptor;\n};\n\ntype RotationState = Record<string, { pitch: number; yaw: number; roll: number }>;\n\nconst identityQuat: Quat = { x: 0, y: 0, z: 0, w: 1 };\n\nfunction isRotationBoneBinding(binding: BoneBinding | undefined): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } {\n return binding?.channel === 'rx' || binding?.channel === 'ry' || binding?.channel === 'rz';\n}\n\nexport class TsRuntimeCore {\n private profile: Profile;\n private model: ModelDescriptor;\n private auValues: Record<number, number> = {};\n private auBalances: Record<number, number> = {};\n private visemeValues: number[];\n private visemeJawScales: number[];\n private mixWeights: Record<number, number>;\n\n constructor(options: TsRuntimeCoreOptions) {\n this.profile = options.profile;\n this.model = options.model;\n this.visemeValues = new Array(getProfileVisemeSlots(this.profile).length).fill(0);\n this.visemeJawScales = new Array(this.visemeValues.length).fill(1);\n this.mixWeights = { ...this.profile.auMixDefaults };\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.visemeValues = new Array(getProfileVisemeSlots(this.profile).length).fill(0);\n this.visemeJawScales = new Array(this.visemeValues.length).fill(1);\n this.mixWeights = { ...this.profile.auMixDefaults };\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n }\n\n setAU(id: number, value: number, balance?: number): void {\n if (value < 0 && this.profile.continuumPairs) {\n const pairInfo = this.profile.continuumPairs[id];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? id : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : id;\n this.setContinuum(negAU, posAU, pairInfo.isNegative ? -value : value, balance);\n return;\n }\n }\n\n this.auValues[id] = clamp01(value);\n if (balance !== undefined) {\n this.auBalances[id] = clampBalance(balance);\n }\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n setContinuum(negAU: number, posAU: number, continuumValue: number, balance?: number): void {\n const value = Math.max(-1, Math.min(1, continuumValue));\n if (value < 0) {\n this.setAU(posAU, 0, balance);\n this.setAU(negAU, Math.abs(value), balance);\n return;\n }\n if (value > 0) {\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, value, balance);\n return;\n }\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, 0, balance);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale = 1): void {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) return;\n this.visemeValues[visemeIndex] = clamp01(value);\n this.visemeJawScales[visemeIndex] = jawScale;\n }\n\n setVisemeById(slotId: string, value: number, jawScale = 1): void {\n const index = getVisemeSlotIndex(this.profile, slotId);\n if (index < 0) return;\n this.setViseme(index, value, jawScale);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n const morphWrites = new Map<string, NonNullable<FrameDelta['morphTargets']>[number]>();\n this.collectAUWrites(morphWrites);\n this.collectVisemeWrites(morphWrites);\n\n return {\n deltaSeconds,\n morphTargets: Array.from(morphWrites.values()),\n bones: this.collectBoneWrites(),\n };\n }\n\n private collectAUWrites(morphWrites: Map<string, NonNullable<FrameDelta['morphTargets']>[number]>): void {\n for (const [auIdText, entry] of Object.entries(this.profile.auToMorphs || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId) || !entry) continue;\n\n const mixWeight = this.isMixedAU(auId) ? this.getAUMixWeight(auId) : 1;\n const base = clamp01(this.auValues[auId] ?? 0) * mixWeight;\n const { left, right } = computeSideValues(base, this.auBalances[auId]);\n const meshNames = getMeshNamesForAUProfile(this.profile, auId);\n\n for (const morph of entry.left || []) {\n this.addMorphWrites(morphWrites, morph, meshNames, left);\n }\n for (const morph of entry.right || []) {\n this.addMorphWrites(morphWrites, morph, meshNames, right);\n }\n for (const morph of entry.center || []) {\n this.addMorphWrites(morphWrites, morph, meshNames, base);\n }\n }\n }\n\n private collectVisemeWrites(morphWrites: Map<string, NonNullable<FrameDelta['morphTargets']>[number]>): void {\n const meshNames = getMeshNamesForVisemeProfile(this.profile);\n const localMax = new Map<string, NonNullable<FrameDelta['morphTargets']>[number]>();\n\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n for (const bindingTarget of getVisemeBindingTargets(this.profile, index)) {\n const weighted = clamp01(value * bindingTarget.weight);\n for (const resolved of this.resolveMorphTargets(bindingTarget.morph, meshNames)) {\n const key = morphWriteKey(resolved.mesh.id, resolved.morphTarget.id);\n const existing = localMax.get(key);\n if (!existing || weighted > existing.value) {\n localMax.set(key, {\n meshId: resolved.mesh.id,\n morphTargetId: resolved.morphTarget.id,\n value: weighted,\n mode: 'absolute',\n });\n }\n }\n }\n }\n\n for (const [key, write] of localMax) {\n const existing = morphWrites.get(key);\n if (!existing || write.value > existing.value) {\n morphWrites.set(key, write);\n }\n }\n }\n\n private collectBoneWrites(): BoneFrameDelta[] {\n const writes: BoneFrameDelta[] = [];\n const rotations = this.computeRotationState();\n\n for (const composite of this.profile.compositeRotations || []) {\n const bone = this.findBoneDescriptor(composite.node);\n if (!bone) continue;\n const transform = this.evaluateCompositeTransform(bone, composite, rotations[composite.node]);\n if (transform) {\n writes.push({\n boneId: bone.id,\n transform,\n mode: 'absolute',\n space: 'local',\n });\n }\n }\n\n for (const [nodeKey, translation] of Object.entries(this.computeTranslations())) {\n const bone = this.findBoneDescriptor(nodeKey);\n if (!bone) continue;\n const position = addVec3(bone.restTransform?.position, translation);\n upsertBoneWrite(writes, bone.id, { position });\n }\n\n const jawAmount = this.getActiveVisemeJawAmount();\n const jawBinding = this.findAutoVisemeJawBinding();\n const jawBone = jawBinding ? this.findBoneDescriptor(jawBinding.node) : undefined;\n if (jawBone && jawBinding?.maxDegrees && jawBinding.channel) {\n const current = writes.find((write) => write.boneId === jawBone.id);\n if (jawAmount > 1e-6 || !current?.transform.rotation) {\n const rest = jawBone.restTransform?.rotation ?? identityQuat;\n const rotation = jawAmount > 1e-6\n ? multiplyQuat(\n rest,\n quatFromChannel(jawBinding.channel, deg2rad(jawBinding.maxDegrees) * jawAmount * jawBinding.scale)\n )\n : rest;\n upsertBoneWrite(writes, jawBone.id, { rotation });\n }\n }\n\n return writes;\n }\n\n private computeRotationState(): RotationState {\n const rotations: RotationState = {};\n for (const composite of this.profile.compositeRotations || []) {\n rotations[composite.node] = {\n pitch: this.getCompositeAxisValueForNode(composite.node, composite.pitch),\n yaw: this.getCompositeAxisValueForNode(composite.node, composite.yaw),\n roll: this.getCompositeAxisValueForNode(composite.node, composite.roll),\n };\n }\n return rotations;\n }\n\n private evaluateCompositeTransform(\n bone: BoneDescriptor,\n composite: CompositeRotation,\n state: { pitch: number; yaw: number; roll: number } | undefined\n ): Transform | null {\n if (!state) return null;\n let rotation = bone.restTransform?.rotation ?? identityQuat;\n\n const applyAxis = (axisConfig: RotationAxis | null, direction: number) => {\n if (!axisConfig || Math.abs(direction) <= 1e-6) return;\n const binding = getCompositeAxisBinding(\n composite.node as BoneKey,\n axisConfig,\n direction,\n (auId) => this.getEffectiveBoneAUValue(auId, composite.node),\n this.profile.auToBones\n );\n if (!binding?.maxDegrees || !binding.channel) return;\n rotation = multiplyQuat(\n rotation,\n quatFromChannel(binding.channel, deg2rad(binding.maxDegrees) * Math.abs(direction) * binding.scale)\n );\n };\n\n applyAxis(composite.yaw, state.yaw);\n applyAxis(composite.pitch, state.pitch);\n applyAxis(composite.roll, state.roll);\n return { rotation };\n }\n\n private computeTranslations(): Record<string, Vec3> {\n const translations: Record<string, Vec3> = {};\n for (const [auIdText, bindings] of Object.entries(this.profile.auToBones || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n const value = clamp01(this.auValues[auId] ?? 0);\n for (const binding of bindings || []) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n if (binding.maxUnits === undefined) continue;\n const current = translations[binding.node] ?? { x: 0, y: 0, z: 0 };\n translations[binding.node] = current;\n if (value <= 1e-6) continue;\n const offset = clampSigned(value * binding.scale) * binding.maxUnits;\n translations[binding.node] = {\n x: binding.channel === 'tx' ? offset : current.x,\n y: binding.channel === 'ty' ? offset : current.y,\n z: binding.channel === 'tz' ? offset : current.z,\n };\n }\n }\n return translations;\n }\n\n private addMorphWrites(\n morphWrites: Map<string, NonNullable<FrameDelta['morphTargets']>[number]>,\n morph: MorphTargetRef,\n meshNames: string[],\n value: number\n ): void {\n for (const resolved of this.resolveMorphTargets(morph, meshNames)) {\n const key = morphWriteKey(resolved.mesh.id, resolved.morphTarget.id);\n const existing = morphWrites.get(key);\n // Max-combine: several AUs can bind the same morph target; an inactive\n // AU must not clobber an active one in full-state evaluation.\n if (existing && existing.value >= value) continue;\n morphWrites.set(key, {\n meshId: resolved.mesh.id,\n morphTargetId: resolved.morphTarget.id,\n value,\n mode: 'absolute',\n });\n }\n }\n\n private resolveMorphTargets(morph: MorphTargetRef, meshNames: string[]): MorphTargetLookup[] {\n const result: MorphTargetLookup[] = [];\n for (const meshName of meshNames) {\n const mesh = this.model.meshes.find((candidate) => candidate.name === meshName);\n if (!mesh) continue;\n const morphTargets = mesh.morphTargetIds\n .map((id) => this.model.morphTargets.find((candidate) => candidate.id === id))\n .filter((target): target is MorphTargetDescriptor => !!target);\n\n const target = typeof morph === 'number'\n ? morphTargets.find((candidate) => candidate.hostIndex === morph)\n : resolveMorphTargetByName(morphTargets, morph, this.profile);\n if (target) {\n result.push({ mesh, morphTarget: target });\n }\n }\n return result;\n }\n\n private findBoneDescriptor(nodeKey: string): BoneDescriptor | undefined {\n const configuredName = this.profile.boneNodes[nodeKey] || nodeKey;\n const prefix = this.profile.bonePrefix ?? '';\n const suffix = this.profile.boneSuffix ?? '';\n const prefixedName = prefix && !configuredName.startsWith(prefix)\n ? `${prefix}${configuredName}`\n : configuredName;\n const fullName = suffix && !prefixedName.endsWith(suffix)\n ? `${prefixedName}${suffix}`\n : prefixedName;\n const candidates = new Set([nodeKey, configuredName, fullName]);\n return this.model.bones.find((bone) => candidates.has(bone.name));\n }\n\n private findAutoVisemeJawBinding(): (BoneBinding & { channel: 'rx' | 'ry' | 'rz' }) | null {\n const candidates = [\n this.profile.auToBones[103]?.find(isRotationBoneBinding),\n this.profile.auToBones[26]?.find(isRotationBoneBinding),\n ].filter((binding): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } => !!binding);\n return candidates.find((binding) => !!this.findBoneDescriptor(binding.node))\n ?? candidates[0]\n ?? null;\n }\n\n private getActiveVisemeJawAmount(): number {\n const jawAmounts = getVisemeJawAmounts(this.profile) ?? [];\n let jawAmount = 0;\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const jawScale = this.visemeJawScales[index] ?? 1;\n if (Math.abs(jawScale) <= 1e-6) continue;\n jawAmount = Math.max(jawAmount, (jawAmounts[index] ?? 0) * value * jawScale);\n }\n return jawAmount;\n }\n\n private getCompositeAxisValueForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined\n ): number {\n return getCompositeAxisValue(axisConfig, (auId) => this.getEffectiveBoneAUValue(auId, nodeKey));\n }\n\n private getEffectiveBoneAUValue(auId: number, nodeKey: string): number {\n const rawValue = clamp01(this.auValues[auId] ?? 0);\n if (rawValue <= 1e-6) return 0;\n const binding = this.profile.auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n return rawValue * getSideScale(this.auBalances[auId] ?? 0, binding.side);\n }\n\n private getAUMixWeight(auId: number): number {\n return this.mixWeights[auId] ?? this.profile.auMixDefaults?.[auId] ?? 1;\n }\n\n private isMixedAU(auId: number): boolean {\n const morphs = this.profile.auToMorphs[auId];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && this.profile.auToBones[auId]?.length);\n }\n}\n\nfunction resolveMorphTargetByName(\n targets: readonly MorphTargetDescriptor[],\n key: string,\n profile: Profile\n): MorphTargetDescriptor | undefined {\n const prefix = profile.morphPrefix || '';\n const suffix = profile.morphSuffix || '';\n const fullName = prefix + key + suffix;\n const exact = targets.find((target) => target.name === fullName);\n if (exact) return exact;\n\n const suffixRegex = profile.suffixPattern ? new RegExp(profile.suffixPattern) : null;\n if (!suffixRegex) return undefined;\n\n return targets.find((target) => {\n if (!target.name.startsWith(fullName)) return false;\n const candidateSuffix = target.name.slice(fullName.length);\n return candidateSuffix === '' || suffixRegex.test(candidateSuffix);\n });\n}\n\nfunction computeSideValues(base: number, balance?: number): { left: number; right: number } {\n const b = clampBalance(balance ?? 0);\n if (b === 0) return { left: base, right: base };\n if (b < 0) return { left: base, right: base * (1 + b) };\n return { left: base * (1 - b), right: base };\n}\n\nfunction getSideScale(balance: number, side?: BoneBinding['side']): number {\n if (side !== 'left' && side !== 'right') return 1;\n const b = clampBalance(balance);\n if (side === 'left') return b > 0 ? 1 - b : 1;\n return b < 0 ? 1 + b : 1;\n}\n\nfunction addVec3(base: Vec3 | undefined, offset: Vec3): Vec3 {\n return {\n x: (base?.x ?? 0) + offset.x,\n y: (base?.y ?? 0) + offset.y,\n z: (base?.z ?? 0) + offset.z,\n };\n}\n\nfunction upsertBoneWrite(\n writes: BoneFrameDelta[],\n boneId: BoneId,\n transform: Transform\n): void {\n const existingIndex = writes.findIndex((write) => write.boneId === boneId);\n if (existingIndex >= 0) {\n const existing = writes[existingIndex];\n writes[existingIndex] = {\n ...existing,\n transform: {\n ...existing.transform,\n ...transform,\n },\n };\n return;\n }\n\n writes.push({\n boneId,\n transform,\n mode: 'absolute',\n space: 'local',\n });\n}\n\nfunction quatFromChannel(channel: BoneBinding['channel'], radians: number): Quat {\n if (channel === 'rx') return quatFromAxis({ x: 1, y: 0, z: 0 }, radians);\n if (channel === 'ry') return quatFromAxis({ x: 0, y: 1, z: 0 }, radians);\n return quatFromAxis({ x: 0, y: 0, z: 1 }, radians);\n}\n\nfunction quatFromAxis(axis: Vec3, radians: number): Quat {\n const half = radians / 2;\n const s = Math.sin(half);\n return normalizeQuat({\n x: axis.x * s,\n y: axis.y * s,\n z: axis.z * s,\n w: Math.cos(half),\n });\n}\n\nfunction multiplyQuat(a: Quat, b: Quat): Quat {\n return normalizeQuat({\n x: a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,\n y: a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,\n z: a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,\n w: a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,\n });\n}\n\nfunction normalizeQuat(q: Quat): Quat {\n const len = Math.hypot(q.x, q.y, q.z, q.w);\n if (len <= 1e-12) return identityQuat;\n return {\n x: q.x / len,\n y: q.y / len,\n z: q.z / len,\n w: q.w / len,\n };\n}\n\nfunction deg2rad(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return value < 0 ? 0 : value > 1 ? 1 : value;\n}\n\nfunction clampSigned(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return value < -1 ? -1 : value > 1 ? 1 : value;\n}\n\nfunction clampBalance(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(-1, Math.min(1, value));\n}\n\nfunction morphWriteKey(meshId: MeshDescriptor['id'], morphTargetId: MorphTargetId): string {\n return `${meshId}:${morphTargetId}`;\n}\n","import type { NumericArray } from './primitives';\n\nexport const EMBODY_CORE_ABI_VERSION = 1;\n\nexport const PACKED_MORPH_FRAME_DELTA_STRIDE = 4;\nexport const PACKED_MORPH_FRAME_DELTA_FIELDS = [\n 'meshId',\n 'morphTargetId',\n 'value',\n 'mode',\n] as const;\n\nexport const PACKED_BONE_FRAME_DELTA_STRIDE = 9;\nexport const PACKED_BONE_FRAME_DELTA_FIELDS = [\n 'boneId',\n 'positionX',\n 'positionY',\n 'positionZ',\n 'rotationX',\n 'rotationY',\n 'rotationZ',\n 'rotationW',\n 'flags',\n] as const;\n\n/** Packed bone FrameDelta flags: bit 0 = has position, bit 1 = has rotation. */\nexport const PACKED_BONE_FLAG_HAS_POSITION = 1;\nexport const PACKED_BONE_FLAG_HAS_ROTATION = 2;\n\nexport const HAIR_CONFIG_STRIDE = 11;\nexport const HAIR_STATE_STRIDE = 4;\nexport const HAIR_HEAD_STATE_STRIDE = 5;\nexport const HAIR_MORPH_OUTPUT_STRIDE = 6;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;\nexport const MESH_PROPORTIONS_STRIDE = 16;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;\nexport const ANNOTATION_CAMERA_FRAMING_STRIDE = 7;\nexport const CAMERA_FLIGHT_SAMPLE_STRIDE = 7;\nexport const MARKER_VISIBILITY_FACTORS_STRIDE = 3;\nexport const MARKER_ENDPOINT_STRIDE = 3;\n\nexport const HAIR_CONFIG_FIELDS = [\n 'mass',\n 'stiffness',\n 'damping',\n 'gravity',\n 'headInfluence',\n 'windEnabled',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n] as const;\n\nexport const HAIR_STATE_FIELDS = ['x', 'z', 'vx', 'vz'] as const;\nexport const HAIR_HEAD_STATE_FIELDS = ['yaw', 'pitch', 'roll', 'yawVelocity', 'pitchVelocity'] as const;\nexport const HAIR_MORPH_OUTPUT_FIELDS = [\n 'L_Hair_Left',\n 'L_Hair_Right',\n 'L_Hair_Front',\n 'R_Hair_Left',\n 'R_Hair_Right',\n 'R_Hair_Front',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n] as const;\nexport const MESH_PROPORTIONS_FIELDS = [\n 'minX',\n 'minY',\n 'minZ',\n 'maxX',\n 'maxY',\n 'maxZ',\n 'centerX',\n 'centerY',\n 'centerZ',\n 'spanX',\n 'spanY',\n 'spanZ',\n 'verticalHeight',\n 'crossAxisWideSpan',\n 'crossAxisNarrowSpan',\n 'humanoidLikelihood',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n 'confidence',\n 'meshHeight',\n 'templateHeight',\n 'meshCrossAxisWideSpan',\n 'templateCrossAxisWideSpan',\n 'status',\n] as const;\nexport const ANNOTATION_CAMERA_FRAMING_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'distance',\n] as const;\nexport const CAMERA_FLIGHT_SAMPLE_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'done',\n] as const;\nexport const MARKER_VISIBILITY_FACTORS_FIELDS = [\n 'itemOpacityFactor',\n 'labelScaleFactor',\n 'lineOpacityFactor',\n] as const;\nexport const MARKER_ENDPOINT_FIELDS = ['x', 'y', 'z'] as const;\n\nexport type PackedMorphFrameDeltaField = (typeof PACKED_MORPH_FRAME_DELTA_FIELDS)[number];\nexport type HairConfigField = (typeof HAIR_CONFIG_FIELDS)[number];\nexport type HairStateField = (typeof HAIR_STATE_FIELDS)[number];\nexport type HairHeadStateField = (typeof HAIR_HEAD_STATE_FIELDS)[number];\nexport type HairMorphOutputField = (typeof HAIR_MORPH_OUTPUT_FIELDS)[number];\nexport type TemplateSkeletonFitTransformField = (typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS)[number];\nexport type MeshProportionsField = (typeof MESH_PROPORTIONS_FIELDS)[number];\nexport type TemplateSkeletonFitSolutionField = (typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS)[number];\n\nexport interface PackedMorphFrameDelta {\n readonly abiVersion: typeof EMBODY_CORE_ABI_VERSION;\n readonly stride: typeof PACKED_MORPH_FRAME_DELTA_STRIDE;\n readonly fields: typeof PACKED_MORPH_FRAME_DELTA_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairPhysicsState {\n readonly stride: typeof HAIR_STATE_STRIDE;\n readonly fields: typeof HAIR_STATE_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairMorphOutput {\n readonly stride: typeof HAIR_MORPH_OUTPUT_STRIDE;\n readonly fields: typeof HAIR_MORPH_OUTPUT_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitTransform {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedMeshProportions {\n readonly stride: typeof MESH_PROPORTIONS_STRIDE;\n readonly fields: typeof MESH_PROPORTIONS_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitSolution {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;\n readonly values: NumericArray;\n}\n","import type {\n BoneDescriptor,\n BoneFrameDelta,\n BoneId,\n FrameDelta,\n MeshId,\n ModelDescriptor,\n MorphTargetDescriptor,\n MorphTargetFrameDelta,\n MorphTargetId,\n} from './contracts';\nimport {\n PACKED_BONE_FLAG_HAS_POSITION,\n PACKED_BONE_FLAG_HAS_ROTATION,\n PACKED_BONE_FRAME_DELTA_STRIDE,\n PACKED_MORPH_FRAME_DELTA_STRIDE,\n} from './contracts';\nimport type { BoneBinding, RotationAxis } from './types';\nimport { toAUList } from './compositeAxis';\nimport type { MorphTargetRef, Profile } from '../mappings/types';\nimport {\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getProfileVisemeSlots,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n} from '../mappings/visemeSystem';\nimport type { EmbodyCoreWasmModule, WasmRuntimeCoreHandle } from '../wasmTypes';\n\nexport const AU_MORPH_BINDING_STRIDE = 5;\nexport const VISEME_MORPH_BINDING_STRIDE = 4;\n\nexport type MorphBindingSide = 0 | 1 | 2;\n\nconst AXIS_GROUP_NEGATIVE = 0;\nconst AXIS_GROUP_POSITIVE = 1;\nconst AXIS_GROUP_PLAIN = 2;\n\nconst BONE_SIDE_NONE = 0;\nconst BONE_SIDE_LEFT = 1;\nconst BONE_SIDE_RIGHT = 2;\n\nconst ROTATION_CHANNELS = { rx: 0, ry: 1, rz: 2 } as const;\nconst TRANSLATION_CHANNELS = { tx: 0, ty: 1, tz: 2 } as const;\n\nexport interface WasmRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n readonly wasm: EmbodyCoreWasmModule;\n}\n\n/**\n * TypeScript facade over the Rust Wasm RuntimeCore for live morph FrameDelta\n * evaluation. Bones/composites remain on TsRuntimeCore until a later slice.\n */\nexport class WasmRuntimeCore {\n private readonly wasm: EmbodyCoreWasmModule;\n private readonly core: WasmRuntimeCoreHandle;\n private profile: Profile;\n private model: ModelDescriptor;\n\n constructor(options: WasmRuntimeCoreOptions) {\n this.wasm = options.wasm;\n this.profile = options.profile;\n this.model = options.model;\n const RuntimeCtor = options.wasm.RuntimeCore;\n if (!RuntimeCtor) {\n throw new Error('Embody Wasm module does not export RuntimeCore');\n }\n this.core = new RuntimeCtor(0);\n this.reloadBindings();\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.reloadBindings();\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n this.reloadBindings();\n }\n\n setAU(id: number, value: number, balance = 0): void {\n this.core.set_au(id >>> 0, value, balance);\n }\n\n getAU(id: number): number {\n return this.core.get_au(id >>> 0);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.core.set_au_mix_weight(id >>> 0, weight);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale?: number): void {\n this.core.set_viseme(visemeIndex >>> 0, value);\n if (jawScale !== undefined) {\n this.core.set_viseme_jaw_scale(visemeIndex >>> 0, jawScale);\n }\n }\n\n clear(): void {\n this.core.clear();\n }\n\n evaluatePackedMorphFrameDelta(): Float32Array {\n return this.core.evaluate_morph_frame_delta();\n }\n\n evaluatePackedBoneFrameDelta(): Float32Array {\n return this.core.evaluate_bone_frame_delta();\n }\n\n evaluateMorphFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n };\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n bones: unpackBoneFrameDelta(this.evaluatePackedBoneFrameDelta()),\n };\n }\n\n private reloadBindings(): void {\n this.core.configure_with_profile(JSON.stringify(this.profile), JSON.stringify(this.model));\n }\n}\n\nexport function compileMorphBindings(\n profile: Profile,\n model: ModelDescriptor\n): {\n auBindings: Float32Array;\n visemeBindings: Float32Array;\n mixedAus: Uint32Array;\n} {\n const auRows: number[] = [];\n const mixed: number[] = [];\n\n for (const [auIdText, entry] of Object.entries(profile.auToMorphs || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId) || !entry) continue;\n\n const meshNames = getMeshNamesForAUProfile(profile, auId);\n const hasMorphs = !!(entry.left?.length || entry.right?.length || entry.center?.length);\n if (hasMorphs && profile.auToBones?.[auId]?.length) {\n mixed.push(auId);\n }\n\n pushAuSide(auRows, auId, 0, entry.left || [], meshNames, model, profile);\n pushAuSide(auRows, auId, 1, entry.right || [], meshNames, model, profile);\n pushAuSide(auRows, auId, 2, entry.center || [], meshNames, model, profile);\n }\n\n const visemeRows: number[] = [];\n const visemeMeshNames = getMeshNamesForVisemeProfile(profile);\n const slotCount = getProfileVisemeSlots(profile).length;\n for (let index = 0; index < slotCount; index += 1) {\n for (const bindingTarget of getVisemeBindingTargets(profile, index)) {\n for (const resolved of resolveMorphTargets(model, profile, bindingTarget.morph, visemeMeshNames)) {\n visemeRows.push(\n index,\n Number(resolved.mesh.id),\n Number(resolved.morphTarget.id),\n bindingTarget.weight\n );\n }\n }\n }\n\n return {\n auBindings: Float32Array.from(auRows),\n visemeBindings: Float32Array.from(visemeRows),\n mixedAus: Uint32Array.from(mixed),\n };\n}\n\nexport interface CompiledBoneBindings {\n restTransforms: Float32Array;\n compositeAxes: Float32Array;\n translations: Float32Array;\n jawBinding: Float32Array;\n visemeJawAmounts: Float32Array;\n}\n\n/**\n * Compile profile bone mappings into the packed tables the Rust RuntimeCore\n * consumes: rest transforms, composite rotation axes (in yaw/pitch/roll\n * application order), AU translations, and the auto viseme jaw binding.\n * Mirrors the mapping resolution in TsRuntimeCore.collectBoneWrites.\n */\nexport function compileBoneBindings(profile: Profile, model: ModelDescriptor): CompiledBoneBindings {\n const referencedBones = new Map<BoneId, BoneDescriptor>();\n const findBone = (nodeKey: string): BoneDescriptor | undefined => {\n const bone = findBoneDescriptor(profile, model, nodeKey);\n if (bone) referencedBones.set(bone.id, bone);\n return bone;\n };\n\n const boneSideForAU = (auId: number, nodeKey: string): number => {\n const side = profile.auToBones?.[auId]?.find((candidate) => candidate.node === nodeKey)?.side;\n if (side === 'left') return BONE_SIDE_LEFT;\n if (side === 'right') return BONE_SIDE_RIGHT;\n return BONE_SIDE_NONE;\n };\n\n const compositeRows: number[] = [];\n for (const composite of profile.compositeRotations || []) {\n const bone = findBone(composite.node);\n if (!bone) continue;\n\n // Application order must match TsRuntimeCore: yaw, pitch, roll.\n const axes: Array<{ axis: number; config: RotationAxis | null }> = [\n { axis: 1, config: composite.yaw },\n { axis: 0, config: composite.pitch },\n { axis: 2, config: composite.roll },\n ];\n\n for (const { axis, config } of axes) {\n if (!config) continue;\n\n const negativeAUs = toAUList(config.negative);\n const positiveAUs = toAUList(config.positive);\n const hasDirectional = negativeAUs.length > 0 && positiveAUs.length > 0;\n\n const valueRows: number[][] = [];\n if (hasDirectional) {\n for (const auId of negativeAUs) {\n valueRows.push([auId, AXIS_GROUP_NEGATIVE, boneSideForAU(auId, composite.node)]);\n }\n for (const auId of positiveAUs) {\n valueRows.push([auId, AXIS_GROUP_POSITIVE, boneSideForAU(auId, composite.node)]);\n }\n } else {\n for (const auId of config.aus) {\n valueRows.push([auId, AXIS_GROUP_PLAIN, boneSideForAU(auId, composite.node)]);\n }\n }\n\n const bindingRows: number[][] = [];\n const pushBindingRows = (auIds: number[], group: number) => {\n for (const auId of auIds) {\n const binding = profile.auToBones?.[auId]?.find(\n (candidate) => candidate.node === composite.node\n );\n if (!binding?.maxDegrees) continue;\n const channel = ROTATION_CHANNELS[binding.channel as keyof typeof ROTATION_CHANNELS];\n if (channel === undefined) continue;\n bindingRows.push([\n auId,\n group,\n boneSideForAU(auId, composite.node),\n channel,\n binding.scale,\n binding.maxDegrees,\n ]);\n }\n };\n pushBindingRows(negativeAUs, AXIS_GROUP_NEGATIVE);\n pushBindingRows(positiveAUs, AXIS_GROUP_POSITIVE);\n pushBindingRows(config.aus, AXIS_GROUP_PLAIN);\n\n compositeRows.push(\n Number(bone.id),\n axis,\n hasDirectional ? 1 : 0,\n valueRows.length,\n bindingRows.length,\n 0,\n 0,\n 0\n );\n for (const row of valueRows) compositeRows.push(...row);\n for (const row of bindingRows) compositeRows.push(...row);\n }\n }\n\n const translationRows: number[] = [];\n for (const [auIdText, bindings] of Object.entries(profile.auToBones || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n for (const binding of bindings || []) {\n const channel = TRANSLATION_CHANNELS[binding.channel as keyof typeof TRANSLATION_CHANNELS];\n if (channel === undefined || binding.maxUnits === undefined) continue;\n const bone = findBone(binding.node);\n if (!bone) continue;\n translationRows.push(auId, Number(bone.id), channel, binding.scale, binding.maxUnits);\n }\n }\n\n const jawRow: number[] = [];\n const jawBinding = findAutoVisemeJawBinding(profile, model);\n if (jawBinding?.maxDegrees) {\n const bone = findBone(jawBinding.node);\n const channel = ROTATION_CHANNELS[jawBinding.channel as keyof typeof ROTATION_CHANNELS];\n if (bone && channel !== undefined) {\n jawRow.push(Number(bone.id), channel, jawBinding.scale, jawBinding.maxDegrees);\n }\n }\n\n const restRows: number[] = [];\n for (const bone of referencedBones.values()) {\n const position = bone.restTransform?.position;\n const rotation = bone.restTransform?.rotation;\n restRows.push(\n Number(bone.id),\n position?.x ?? 0,\n position?.y ?? 0,\n position?.z ?? 0,\n rotation?.x ?? 0,\n rotation?.y ?? 0,\n rotation?.z ?? 0,\n rotation?.w ?? 1\n );\n }\n\n return {\n restTransforms: Float32Array.from(restRows),\n compositeAxes: Float32Array.from(compositeRows),\n translations: Float32Array.from(translationRows),\n jawBinding: Float32Array.from(jawRow),\n visemeJawAmounts: Float32Array.from(getVisemeJawAmounts(profile) ?? []),\n };\n}\n\nfunction findBoneDescriptor(\n profile: Profile,\n model: ModelDescriptor,\n nodeKey: string\n): BoneDescriptor | undefined {\n const configuredName = profile.boneNodes?.[nodeKey] || nodeKey;\n const prefix = profile.bonePrefix ?? '';\n const suffix = profile.boneSuffix ?? '';\n const prefixedName = prefix && !configuredName.startsWith(prefix)\n ? `${prefix}${configuredName}`\n : configuredName;\n const fullName = suffix && !prefixedName.endsWith(suffix)\n ? `${prefixedName}${suffix}`\n : prefixedName;\n const candidates = new Set([nodeKey, configuredName, fullName]);\n return model.bones.find((bone) => candidates.has(bone.name));\n}\n\nfunction findAutoVisemeJawBinding(\n profile: Profile,\n model: ModelDescriptor\n): (BoneBinding & { channel: 'rx' | 'ry' | 'rz' }) | null {\n const isRotation = (\n binding: BoneBinding | undefined\n ): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } =>\n binding?.channel === 'rx' || binding?.channel === 'ry' || binding?.channel === 'rz';\n\n const candidates = [\n profile.auToBones?.[103]?.find(isRotation),\n profile.auToBones?.[26]?.find(isRotation),\n ].filter((binding): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } => !!binding);\n\n return candidates.find((binding) => !!findBoneDescriptor(profile, model, binding.node))\n ?? candidates[0]\n ?? null;\n}\n\nexport function unpackBoneFrameDelta(values: ArrayLike<number>): BoneFrameDelta[] {\n const stride = PACKED_BONE_FRAME_DELTA_STRIDE;\n const writes: BoneFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n const flags = values[index + 8] ?? 0;\n const hasPosition = (flags & PACKED_BONE_FLAG_HAS_POSITION) !== 0;\n const hasRotation = (flags & PACKED_BONE_FLAG_HAS_ROTATION) !== 0;\n if (!hasPosition && !hasRotation) continue;\n writes.push({\n boneId: values[index] as BoneId,\n transform: {\n ...(hasPosition\n ? { position: { x: values[index + 1], y: values[index + 2], z: values[index + 3] } }\n : {}),\n ...(hasRotation\n ? {\n rotation: {\n x: values[index + 4],\n y: values[index + 5],\n z: values[index + 6],\n w: values[index + 7],\n },\n }\n : {}),\n },\n mode: 'absolute',\n space: 'local',\n });\n }\n return writes;\n}\n\nexport function unpackMorphFrameDelta(values: ArrayLike<number>): MorphTargetFrameDelta[] {\n const stride = PACKED_MORPH_FRAME_DELTA_STRIDE;\n const writes: MorphTargetFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n writes.push({\n meshId: values[index] as MeshId,\n morphTargetId: values[index + 1] as MorphTargetId,\n value: values[index + 2] ?? 0,\n mode: (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute',\n });\n }\n return writes;\n}\n\nfunction pushAuSide(\n rows: number[],\n auId: number,\n side: MorphBindingSide,\n morphs: readonly MorphTargetRef[],\n meshNames: string[],\n model: ModelDescriptor,\n profile: Profile\n): void {\n for (const morph of morphs) {\n for (const resolved of resolveMorphTargets(model, profile, morph, meshNames)) {\n rows.push(\n auId,\n side,\n Number(resolved.mesh.id),\n Number(resolved.morphTarget.id),\n 1\n );\n }\n }\n}\n\nfunction resolveMorphTargets(\n model: ModelDescriptor,\n profile: Profile,\n morph: MorphTargetRef,\n meshNames: string[]\n): Array<{ mesh: ModelDescriptor['meshes'][number]; morphTarget: MorphTargetDescriptor }> {\n const result: Array<{ mesh: ModelDescriptor['meshes'][number]; morphTarget: MorphTargetDescriptor }> = [];\n for (const meshName of meshNames) {\n const mesh = model.meshes.find((candidate) => candidate.name === meshName);\n if (!mesh) continue;\n const morphTargets = mesh.morphTargetIds\n .map((id) => model.morphTargets.find((candidate) => candidate.id === id))\n .filter((target): target is MorphTargetDescriptor => !!target);\n\n const target = typeof morph === 'number'\n ? morphTargets.find((candidate) => candidate.hostIndex === morph)\n : resolveMorphTargetByName(morphTargets, morph, profile);\n if (target) {\n result.push({ mesh, morphTarget: target });\n }\n }\n return result;\n}\n\nfunction resolveMorphTargetByName(\n targets: readonly MorphTargetDescriptor[],\n key: string,\n profile: Profile\n): MorphTargetDescriptor | undefined {\n const prefix = profile.morphPrefix || '';\n const suffix = profile.morphSuffix || '';\n const fullName = prefix + key + suffix;\n const exact = targets.find((target) => target.name === fullName);\n if (exact) return exact;\n\n const suffixRegex = profile.suffixPattern ? new RegExp(profile.suffixPattern) : null;\n if (!suffixRegex) return undefined;\n\n return targets.find((target) => {\n if (!target.name.startsWith(fullName)) return false;\n const candidateSuffix = target.name.slice(fullName.length);\n return candidateSuffix === '' || suffixRegex.test(candidateSuffix);\n });\n}\n","/**\n * Hair / eyebrow material appearance helpers.\n *\n * These are runtime material controls owned by Embody — not Polymer agencies.\n * Agencies govern character behavior; hair materials and physics stay here.\n */\n\nexport interface HairColorAppearance {\n name?: string;\n baseColor: string;\n emissive: string;\n emissiveIntensity: number;\n}\n\nexport interface HairAppearanceState {\n hairColor: Required<Pick<HairColorAppearance, 'baseColor' | 'emissive' | 'emissiveIntensity'>> & {\n name?: string;\n };\n eyebrowColor: Required<Pick<HairColorAppearance, 'baseColor' | 'emissive' | 'emissiveIntensity'>> & {\n name?: string;\n };\n showOutline: boolean;\n outlineColor: string;\n outlineOpacity: number;\n}\n\nexport const HAIR_COLOR_PRESETS: Record<string, Required<HairColorAppearance>> = {\n natural_black: {\n name: 'Natural Black',\n baseColor: '#1a1a1a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_brown: {\n name: 'Natural Brown',\n baseColor: '#4a3728',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_blonde: {\n name: 'Natural Blonde',\n baseColor: '#e6c78a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_red: {\n name: 'Natural Red',\n baseColor: '#8b3a3a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_gray: {\n name: 'Natural Gray',\n baseColor: '#9e9e9e',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_white: {\n name: 'Natural White',\n baseColor: '#f5f5f5',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n neon_blue: {\n name: 'Neon Blue',\n baseColor: '#00ffff',\n emissive: '#0000ff',\n emissiveIntensity: 0.8,\n },\n neon_pink: {\n name: 'Neon Pink',\n baseColor: '#ff00ff',\n emissive: '#ff1493',\n emissiveIntensity: 0.8,\n },\n neon_green: {\n name: 'Neon Green',\n baseColor: '#00ff00',\n emissive: '#00ff00',\n emissiveIntensity: 0.8,\n },\n electric_purple: {\n name: 'Electric Purple',\n baseColor: '#9d00ff',\n emissive: '#9d00ff',\n emissiveIntensity: 0.6,\n },\n fire_orange: {\n name: 'Fire Orange',\n baseColor: '#ff6600',\n emissive: '#ff3300',\n emissiveIntensity: 0.7,\n },\n};\n\nexport const DEFAULT_HAIR_COLOR_APPEARANCE: Required<HairColorAppearance> =\n HAIR_COLOR_PRESETS.natural_brown;\n\nexport function normalizeHairColorAppearance(\n value: HairColorAppearance | string | null | undefined,\n fallback: Required<HairColorAppearance> = DEFAULT_HAIR_COLOR_APPEARANCE,\n): Required<HairColorAppearance> {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.startsWith('#')) {\n return {\n name: fallback.name,\n baseColor: trimmed,\n emissive: fallback.emissive,\n emissiveIntensity: fallback.emissiveIntensity,\n };\n }\n const preset = HAIR_COLOR_PRESETS[trimmed];\n if (preset) return { ...preset };\n }\n\n if (value && typeof value === 'object') {\n return {\n name: typeof value.name === 'string' ? value.name : fallback.name,\n baseColor: typeof value.baseColor === 'string' ? value.baseColor : fallback.baseColor,\n emissive: typeof value.emissive === 'string' ? value.emissive : fallback.emissive,\n emissiveIntensity:\n typeof value.emissiveIntensity === 'number'\n ? value.emissiveIntensity\n : fallback.emissiveIntensity,\n };\n }\n\n return { ...fallback };\n}\n\nexport function colorToCssHex(color: { getHexString(): string } | undefined | null): string | null {\n if (!color || typeof color.getHexString !== 'function') return null;\n return `#${color.getHexString()}`;\n}\n","/**\n * CC4 Preset - Character Creator 4 AU Mappings\n *\n * Complete FACS Action Unit to morph target and bone mappings for CC4 rigs.\n * This includes all the composite rotations, continuum pairs, mesh classifications,\n * and AU metadata that we painstakingly worked through.\n */\n\nimport type { Profile, MeshCategory, BlendingMode, MeshMaterialSettings, MeshInfo, MorphCategory, MorphTargetsBySide, VisemeSlot, MappingEditorSection } from '../mappings/types';\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\n\n// ============================================================================\n// AU TO MORPHS - Maps AU IDs to morph target names\n// ============================================================================\n\nexport const AU_TO_MORPHS: Record<number, MorphTargetsBySide> = {\n 1: {\n left: ['Brow_Raise_Inner_L'],\n right: ['Brow_Raise_Inner_R'],\n center: [],\n },\n 2: {\n left: ['Brow_Raise_Outer_L'],\n right: ['Brow_Raise_Outer_R'],\n center: [],\n },\n 4: {\n left: ['Brow_Drop_L'],\n right: ['Brow_Drop_R'],\n center: [],\n },\n 5: {\n left: ['Eye_Wide_L'],\n right: ['Eye_Wide_R'],\n center: [],\n },\n 6: {\n left: ['Cheek_Raise_L'],\n right: ['Cheek_Raise_R'],\n center: [],\n },\n 7: {\n left: ['Eye_Squint_L'],\n right: ['Eye_Squint_R'],\n center: [],\n },\n 8: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: ['Mouth_Close'],\n },\n 9: {\n left: ['Nose_Sneer_L'],\n right: ['Nose_Sneer_R'],\n center: [],\n },\n 10: {\n left: ['Mouth_Up_Upper_L'],\n right: ['Mouth_Up_Upper_R'],\n center: [],\n },\n 11: {\n left: ['Mouth_Up_Upper_L'],\n right: ['Mouth_Up_Upper_R'],\n center: [],\n },\n 12: {\n left: ['Mouth_Smile_L'],\n right: ['Mouth_Smile_R'],\n center: [],\n },\n 13: {\n left: ['Mouth_Smile_L', 'Mouth_Up_Upper_L'],\n right: ['Mouth_Smile_R', 'Mouth_Up_Upper_R'],\n center: [],\n },\n 14: {\n left: ['Mouth_Dimple_L'],\n right: ['Mouth_Dimple_R'],\n center: [],\n },\n 15: {\n left: ['Mouth_Frown_L'],\n right: ['Mouth_Frown_R'],\n center: [],\n },\n 16: {\n left: ['Mouth_Down_Lower_L'],\n right: ['Mouth_Down_Lower_R'],\n center: [],\n },\n 17: {\n left: [],\n right: [],\n center: ['Mouth_Shrug_Lower'],\n },\n 18: {\n left: [],\n right: [],\n center: ['Mouth_Pucker'],\n },\n 19: {\n left: [],\n right: [],\n center: ['Tongue_Out'],\n },\n 20: {\n left: ['Mouth_Stretch_L'],\n right: ['Mouth_Stretch_R'],\n center: [],\n },\n 22: {\n left: [],\n right: [],\n center: ['Mouth_Funnel'],\n },\n 23: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: [],\n },\n 24: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: [],\n },\n 25: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 26: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 27: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 28: {\n left: [],\n right: [],\n center: ['Mouth_Roll_In_Upper', 'Mouth_Roll_In_Lower'],\n },\n 29: {\n left: [],\n right: [],\n center: ['Jaw_Forward'],\n },\n 30: {\n left: ['Jaw_L'],\n right: [],\n center: [],\n },\n 31: {\n left: [],\n right: [],\n center: [],\n },\n 32: {\n left: [],\n right: [],\n center: ['Mouth_Roll_In_Lower'],\n },\n 34: {\n left: ['Cheek_Puff_L'],\n right: ['Cheek_Puff_R'],\n center: [],\n },\n 35: {\n left: [],\n right: ['Jaw_R'],\n center: [],\n },\n 36: {\n left: ['Tongue_Bulge_L'],\n right: ['Tongue_Bulge_R'],\n center: [],\n },\n 37: {\n left: [],\n right: [],\n center: ['Tongue_Up'],\n },\n 38: {\n left: [],\n right: [],\n center: ['Tongue_Down'],\n },\n 39: {\n left: ['Tongue_L'],\n right: [],\n center: [],\n },\n 40: {\n left: [],\n right: ['Tongue_R'],\n center: [],\n },\n 41: {\n left: [],\n right: [],\n center: [],\n },\n 42: {\n left: [],\n right: [],\n center: [],\n },\n 43: {\n left: ['Eye_Blink_L'],\n right: ['Eye_Blink_R'],\n center: [],\n },\n 45: {\n left: ['Eye_Blink_L'],\n right: ['Eye_Blink_R'],\n center: [],\n },\n 51: {\n left: ['Head_Turn_L'],\n right: [],\n center: [],\n },\n 52: {\n left: [],\n right: ['Head_Turn_R'],\n center: [],\n },\n 53: {\n left: [],\n right: [],\n center: ['Head_Turn_Up'],\n },\n 54: {\n left: [],\n right: [],\n center: ['Head_Turn_Down'],\n },\n 55: {\n left: ['Head_Tilt_L'],\n right: [],\n center: [],\n },\n 56: {\n left: [],\n right: ['Head_Tilt_R'],\n center: [],\n },\n 61: {\n left: ['Eye_L_Look_L'],\n right: ['Eye_R_Look_L'],\n center: [],\n },\n 62: {\n left: ['Eye_L_Look_R'],\n right: ['Eye_R_Look_R'],\n center: [],\n },\n 63: {\n left: ['Eye_L_Look_Up'],\n right: ['Eye_R_Look_Up'],\n center: [],\n },\n 64: {\n left: ['Eye_L_Look_Down'],\n right: ['Eye_R_Look_Down'],\n center: [],\n },\n 65: {\n left: ['Eye_L_Look_L'],\n right: [],\n center: [],\n },\n 66: {\n left: [],\n right: ['Eye_L_Look_R'],\n center: [],\n },\n 67: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Up'],\n },\n 68: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Down'],\n },\n 69: {\n left: ['Eye_R_Look_L'],\n right: [],\n center: [],\n },\n 70: {\n left: [],\n right: ['Eye_R_Look_R'],\n center: [],\n },\n 71: {\n left: [],\n right: [],\n center: ['Eye_R_Look_Up'],\n },\n 72: {\n left: [],\n right: [],\n center: ['Eye_R_Look_Down'],\n },\n 73: {\n left: [],\n right: [],\n center: ['Tongue_Narrow'],\n },\n 74: {\n left: [],\n right: [],\n center: ['Tongue_Wide'],\n },\n 75: {\n left: [],\n right: [],\n center: ['Tongue_Roll'],\n },\n 76: {\n left: [],\n right: [],\n center: ['Tongue_Tip_Up'],\n },\n 77: {\n left: [],\n right: [],\n center: ['Tongue_Tip_Down'],\n },\n 80: {\n left: ['EO Bulge L'],\n right: ['EO Bulge R'],\n center: [],\n },\n 81: {\n left: ['EO Depth L'],\n right: ['EO Depth R'],\n center: [],\n },\n 82: {\n left: ['EO Inner Depth L'],\n right: ['EO Inner Depth R'],\n center: [],\n },\n 83: {\n left: ['EO Inner Height L'],\n right: ['EO Inner Height R'],\n center: [],\n },\n 84: {\n left: ['EO Inner Width L'],\n right: ['EO Inner Width R'],\n center: [],\n },\n 85: {\n left: ['EO Outer Depth L'],\n right: ['EO Outer Depth R'],\n center: [],\n },\n 86: {\n left: ['EO Outer Height L'],\n right: ['EO Outer Height R'],\n center: [],\n },\n 87: {\n left: ['EO Outer Width L'],\n right: ['EO Outer Width R'],\n center: [],\n },\n 88: {\n left: ['EO Upper Depth L'],\n right: ['EO Upper Depth R'],\n center: [],\n },\n 89: {\n left: ['EO Lower Depth L'],\n right: ['EO Lower Depth R'],\n center: [],\n },\n 90: {\n left: ['EO Center Upper Depth L'],\n right: ['EO Center Upper Depth R'],\n center: [],\n },\n 91: {\n left: ['EO Center Upper Height L'],\n right: ['EO Center Upper Height R'],\n center: [],\n },\n 92: {\n left: ['EO Center Lower Depth L'],\n right: ['EO Center Lower Depth R'],\n center: [],\n },\n 93: {\n left: ['EO Center Lower Height L'],\n right: ['EO Center Lower Height R'],\n center: [],\n },\n 94: {\n left: ['EO Inner Upper Depth L'],\n right: ['EO Inner Upper Depth R'],\n center: [],\n },\n 95: {\n left: ['EO Inner Upper Height L'],\n right: ['EO Inner Upper Height R'],\n center: [],\n },\n 96: {\n left: ['EO Inner Lower Depth L'],\n right: ['EO Inner Lower Depth R'],\n center: [],\n },\n 97: {\n left: ['EO Inner Lower Height L'],\n right: ['EO Inner Lower Height R'],\n center: [],\n },\n 98: {\n left: ['EO Outer Upper Depth L'],\n right: ['EO Outer Upper Depth R'],\n center: [],\n },\n 99: {\n left: ['EO Outer Upper Height L'],\n right: ['EO Outer Upper Height R'],\n center: [],\n },\n 100: {\n left: ['EO Outer Lower Depth L'],\n right: ['EO Outer Lower Depth R'],\n center: [],\n },\n 101: {\n left: ['EO Outer Lower Height L'],\n right: ['EO Outer Lower Height R'],\n center: [],\n },\n 102: {\n left: ['EO Duct Depth L'],\n right: ['EO Duct Depth R'],\n center: [],\n },\n};\n\n// ============================================================================\n// BONE NODE NAMES - CC4-specific skeleton hierarchy\n// ============================================================================\n\n/** Bone name prefix used by semantic CC4 profile metadata. */\nexport const CC4_BONE_PREFIX = 'CC_Base_';\n\n/**\n * Suffix pattern regex for fuzzy bone matching.\n * Matches numbered suffixes like _01, _038 (common in Sketchfab exports)\n * and .001, .002 (common in Blender exports).\n */\nexport const CC4_SUFFIX_PATTERN = '_\\\\d+$|\\\\.\\\\d+$';\n\n/** Actual CC4 skeleton node names used by the stock preset. */\nexport const CC4_BONES = {\n EYE_L: 'CC_Base_L_Eye',\n EYE_R: 'CC_Base_R_Eye',\n HEAD: 'CC_Base_Head',\n NECK: 'CC_Base_NeckTwist01',\n NECK_TWIST: 'CC_Base_NeckTwist02',\n JAW: 'CC_Base_JawRoot',\n TONGUE: 'CC_Base_Tongue01',\n SPINE_01: 'CC_Base_Spine01',\n SPINE_02: 'CC_Base_Spine02',\n CLAVICLE_L: 'CC_Base_L_Clavicle',\n CLAVICLE_R: 'CC_Base_R_Clavicle',\n HAND_L: 'CC_Base_L_Hand',\n HAND_R: 'CC_Base_R_Hand',\n FOOT_L: 'CC_Base_L_Foot',\n FOOT_R: 'CC_Base_R_Foot',\n TOEBASE_L: 'CC_Base_L_ToeBase',\n TOEBASE_R: 'CC_Base_R_ToeBase',\n} as const;\n\n/**\n * Semantic bone keys used by profile metadata and annotation regions. Runtime\n * AU/composite bindings may still use concrete CC4 node names directly.\n */\nexport const CC4_BONE_NODES = {\n EYE_L: 'L_Eye',\n EYE_R: 'R_Eye',\n HEAD: 'Head',\n NECK: 'NeckTwist01',\n NECK_TWIST: 'NeckTwist02',\n JAW: 'JawRoot',\n TONGUE: 'Tongue01',\n SPINE_01: 'Spine01',\n SPINE_02: 'Spine02',\n CLAVICLE_L: 'L_Clavicle',\n CLAVICLE_R: 'R_Clavicle',\n HAND_L: 'L_Hand',\n HAND_R: 'R_Hand',\n FOOT_L: 'L_Foot',\n FOOT_R: 'R_Foot',\n TOEBASE_L: 'L_ToeBase',\n TOEBASE_R: 'R_ToeBase',\n // Concrete-name aliases keep existing runtime callers compatible.\n [CC4_BONES.EYE_L]: CC4_BONES.EYE_L,\n [CC4_BONES.EYE_R]: CC4_BONES.EYE_R,\n [CC4_BONES.HEAD]: CC4_BONES.HEAD,\n [CC4_BONES.NECK]: CC4_BONES.NECK,\n [CC4_BONES.NECK_TWIST]: CC4_BONES.NECK_TWIST,\n [CC4_BONES.JAW]: CC4_BONES.JAW,\n [CC4_BONES.TONGUE]: CC4_BONES.TONGUE,\n [CC4_BONES.SPINE_01]: CC4_BONES.SPINE_01,\n [CC4_BONES.SPINE_02]: CC4_BONES.SPINE_02,\n [CC4_BONES.CLAVICLE_L]: CC4_BONES.CLAVICLE_L,\n [CC4_BONES.CLAVICLE_R]: CC4_BONES.CLAVICLE_R,\n [CC4_BONES.HAND_L]: CC4_BONES.HAND_L,\n [CC4_BONES.HAND_R]: CC4_BONES.HAND_R,\n [CC4_BONES.FOOT_L]: CC4_BONES.FOOT_L,\n [CC4_BONES.FOOT_R]: CC4_BONES.FOOT_R,\n [CC4_BONES.TOEBASE_L]: CC4_BONES.TOEBASE_L,\n [CC4_BONES.TOEBASE_R]: CC4_BONES.TOEBASE_R,\n} as const;\n\n// ============================================================================\n// AU TO BONES - Maps AU IDs to bone bindings (CC4 head/eye/jaw/tongue)\n// ============================================================================\n\nexport const BONE_AU_TO_BINDINGS: Record<number, BoneBinding[]> = {\n // Jaw open/close (jaw drop)\n 25: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 20 }],\n 26: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 30 }],\n 27: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 35 }],\n\n // Jaw lateral (left/right)\n 30: [{ node: CC4_BONES.JAW, channel: 'ry', scale: -1, maxDegrees: 15 }],\n 35: [{ node: CC4_BONES.JAW, channel: 'ry', scale: 1, maxDegrees: 15 }],\n\n // Head yaw (turn left/right)\n // AU 51 = Turn Left: positive ry rotation (scale: 1)\n // AU 52 = Turn Right: negative ry rotation (scale: -1)\n 51: [{ node: CC4_BONES.HEAD, channel: 'ry', scale: 1, maxDegrees: 60 }],\n 52: [{ node: CC4_BONES.HEAD, channel: 'ry', scale: -1, maxDegrees: 60 }],\n\n // Head pitch (up/down)\n // AU 53 = Head Up: negative rx rotation (scale: -1)\n // AU 54 = Head Down: positive rx rotation (scale: 1)\n 53: [{ node: CC4_BONES.HEAD, channel: 'rx', scale: -1, maxDegrees: 30 }],\n 54: [{ node: CC4_BONES.HEAD, channel: 'rx', scale: 1, maxDegrees: 30 }],\n\n // Head roll (tilt)\n 55: [{ node: CC4_BONES.HEAD, channel: 'rz', scale: -1, maxDegrees: 25 }],\n 56: [{ node: CC4_BONES.HEAD, channel: 'rz', scale: 1, maxDegrees: 25 }],\n\n // Eyes horizontal (left/right) - CC4 uses rz for yaw\n // AU 61 = Eyes Turn Left = character looks toward THEIR left = viewer's RIGHT\n // AU 62 = Eyes Turn Right = character looks toward THEIR right = viewer's LEFT\n // For CC4 rigs: positive rz = eyes rotate left (look right), negative rz = eyes rotate right (look left)\n 61: [\n { node: CC4_BONES.EYE_L, channel: 'rz', scale: 1, maxDegrees: 25, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rz', scale: 1, maxDegrees: 25, side: 'right' },\n ],\n 62: [\n { node: CC4_BONES.EYE_L, channel: 'rz', scale: -1, maxDegrees: 25, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rz', scale: -1, maxDegrees: 25, side: 'right' },\n ],\n\n // Eyes vertical (up/down) - rx\n // AU 63 = Eyes Up = character looks up\n // AU 64 = Eyes Down = character looks down\n // For CC4 rigs: negative rx = eyes rotate up, positive rx = eyes rotate down\n 63: [\n { node: CC4_BONES.EYE_L, channel: 'rx', scale: -1, maxDegrees: 20, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rx', scale: -1, maxDegrees: 20, side: 'right' },\n ],\n 64: [\n { node: CC4_BONES.EYE_L, channel: 'rx', scale: 1, maxDegrees: 20, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rx', scale: 1, maxDegrees: 20, side: 'right' },\n ],\n 65: [{ node: CC4_BONES.EYE_L, channel: 'rz', scale: 1, maxDegrees: 25, side: 'left' }],\n 66: [{ node: CC4_BONES.EYE_L, channel: 'rz', scale: -1, maxDegrees: 25, side: 'left' }],\n 67: [{ node: CC4_BONES.EYE_L, channel: 'rx', scale: -1, maxDegrees: 20, side: 'left' }],\n 68: [{ node: CC4_BONES.EYE_L, channel: 'rx', scale: 1, maxDegrees: 20, side: 'left' }],\n 69: [{ node: CC4_BONES.EYE_R, channel: 'rz', scale: 1, maxDegrees: 25, side: 'right' }],\n 70: [{ node: CC4_BONES.EYE_R, channel: 'rz', scale: -1, maxDegrees: 25, side: 'right' }],\n 71: [{ node: CC4_BONES.EYE_R, channel: 'rx', scale: -1, maxDegrees: 20, side: 'right' }],\n 72: [{ node: CC4_BONES.EYE_R, channel: 'rx', scale: 1, maxDegrees: 20, side: 'right' }],\n\n // Tongue controls (optional, for rigs that expose them)\n 37: [{ node: CC4_BONES.TONGUE, channel: 'rz', scale: 1, maxDegrees: 20 }],\n 38: [{ node: CC4_BONES.TONGUE, channel: 'rz', scale: -1, maxDegrees: 20 }],\n 39: [{ node: CC4_BONES.TONGUE, channel: 'ry', scale: -1, maxDegrees: 20 }],\n 40: [{ node: CC4_BONES.TONGUE, channel: 'ry', scale: 1, maxDegrees: 20 }],\n 41: [{ node: CC4_BONES.TONGUE, channel: 'rx', scale: -1, maxDegrees: 20 }],\n 42: [{ node: CC4_BONES.TONGUE, channel: 'rx', scale: 1, maxDegrees: 20 }],\n\n};\n\n// ============================================================================\n// LIP-SYNC SUPPORT CONTROL BINDINGS\n// ============================================================================\n\n/**\n * Lip-sync support controls are not FACS AUs. They are semantic controls emitted\n * by speech planning when the runtime needs articulation support that should not\n * activate a visible FACS morph. Control 103 opens the jaw bone for speech while\n * leaving AU 26's Jaw_Open morph untouched.\n *\n * This is kept as a separate preset object so the data model does not pretend\n * lip-sync support controls are ordinary AUs. `CC4_PROFILE_BONE_BINDINGS` folds\n * it into the legacy `Profile.auToBones` field until Embody has the canonical\n * control/binding model tracked in meekmachine/embody#30.\n */\nexport const LIP_SYNC_CONTROL_TO_BINDINGS: Record<number, BoneBinding[]> = {\n 103: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 30 }],\n};\n\n/** Legacy compatibility map consumed by the current runtime profile shape. */\nexport const CC4_PROFILE_BONE_BINDINGS: Record<number, BoneBinding[]> = {\n ...BONE_AU_TO_BINDINGS,\n ...LIP_SYNC_CONTROL_TO_BINDINGS,\n};\n\n// ============================================================================\n// VISEME KEYS - CC4 1:1 Direct viseme morph targets (15)\n// ============================================================================\n\nexport const VISEME_KEYS: string[] = [\n 'AE',\n 'Ah',\n 'B_M_P',\n 'Ch_J',\n 'EE',\n 'Er',\n 'F_V',\n 'Ih',\n 'K_G_H_NG',\n 'Oh',\n 'R',\n 'S_Z',\n 'T_L_D_N',\n 'Th',\n 'W_OO',\n];\n\n/**\n * Jaw opening amounts for each viseme index (0-14).\n * Values are 0-1 representing how much the jaw should open.\n * Used by snippetToClip when autoVisemeJaw is enabled.\n */\nexport const VISEME_JAW_AMOUNTS: number[] = [\n 0.75, // 0: AE\n 0.80, // 1: Ah\n 0.00, // 2: B_M_P\n 0.30, // 3: Ch_J\n 0.20, // 4: EE\n 0.35, // 5: Er\n 0.10, // 6: F_V\n 0.20, // 7: Ih\n 0.35, // 8: K_G_H_NG\n 0.60, // 9: Oh\n 0.35, // 10: R\n 0.10, // 11: S_Z\n 0.30, // 12: T_L_D_N\n 0.15, // 13: Th\n 0.50, // 14: W_OO\n];\n\nexport const CC4_VISEME_SYSTEM_ID = 'cc4-arkit-15';\n\nexport const CC4_VISEME_SLOTS: VisemeSlot[] = [\n {\n id: 'ae',\n label: 'AE',\n order: 0,\n providerIds: { azure: [4], sapi: [4] },\n phonemes: ['AE', 'EH', 'EY', 'UH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ae|eh|ey)([_ .-]|$)'],\n features: { jawOpen: 0.75, lipSpread: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[0],\n },\n {\n id: 'ah',\n label: 'Ah',\n order: 1,\n providerIds: { azure: [1, 2, 9, 11, 12], sapi: [1, 2, 9, 11, 12] },\n phonemes: ['AA', 'AE', 'AH', 'AX', 'AW', 'AY', 'HH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ah|aa|aah|open)([_ .-]|$)'],\n features: { jawOpen: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[1],\n },\n {\n id: 'b-m-p',\n label: 'B_M_P',\n order: 2,\n providerIds: { azure: [0, 21], sapi: [0, 21] },\n phonemes: ['B', 'M', 'P'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(b[_ .-]?m[_ .-]?p|bmp|closed|sil|rest)([_ .-]|$)'],\n features: { jawOpen: 0, lipClosed: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[2],\n },\n {\n id: 'ch-j',\n label: 'Ch_J',\n order: 3,\n providerIds: { azure: [16], sapi: [16] },\n phonemes: ['CH', 'JH', 'SH', 'ZH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ch|j|sh|zh)([_ .-]|$)'],\n features: { jawOpen: 0.3, fricative: 0.6 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[3],\n },\n {\n id: 'ee',\n label: 'EE',\n order: 4,\n providerIds: { azure: [6], sapi: [6] },\n phonemes: ['IY', 'IH', 'IX', 'Y'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ee|iy|y)([_ .-]|$)'],\n features: { jawOpen: 0.2, lipSpread: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[4],\n },\n {\n id: 'er',\n label: 'Er',\n order: 5,\n providerIds: { azure: [5], sapi: [5] },\n phonemes: ['ER'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(er)([_ .-]|$)'],\n features: { jawOpen: 0.35, lipRound: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[5],\n },\n {\n id: 'f-v',\n label: 'F_V',\n order: 6,\n providerIds: { azure: [18], sapi: [18] },\n phonemes: ['F', 'V'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(f[_ .-]?v|fv)([_ .-]|$)'],\n features: { jawOpen: 0.1, fricative: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[6],\n },\n {\n id: 'ih',\n label: 'Ih',\n order: 7,\n providerIds: { azure: [6], sapi: [6] },\n phonemes: ['IH', 'IX'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ih|ix)([_ .-]|$)'],\n features: { jawOpen: 0.2, lipSpread: 0.55 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[7],\n },\n {\n id: 'k-g-h-ng',\n label: 'K_G_H_NG',\n order: 8,\n providerIds: { azure: [20], sapi: [20] },\n phonemes: ['K', 'G', 'NG'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(k[_ .-]?g[_ .-]?h?[_ .-]?ng|kg|ng)([_ .-]|$)'],\n features: { jawOpen: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[8],\n },\n {\n id: 'oh',\n label: 'Oh',\n order: 9,\n providerIds: { azure: [3, 8, 10], sapi: [3, 8, 10] },\n phonemes: ['AO', 'OW', 'OY'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(oh|ao|ow|oy)([_ .-]|$)'],\n features: { jawOpen: 0.6, lipRound: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[9],\n },\n {\n id: 'r',\n label: 'R',\n order: 10,\n providerIds: { azure: [13], sapi: [13] },\n phonemes: ['R'],\n matchers: ['(^|[_ .-])(v|viseme)[_ .-]?r([_ .-]|$)', '(^|[_ .-])r[_ .-]?(sound|viseme)([_ .-]|$)'],\n features: { jawOpen: 0.35, lipRound: 0.5 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[10],\n },\n {\n id: 's-z',\n label: 'S_Z',\n order: 11,\n providerIds: { azure: [15], sapi: [15] },\n phonemes: ['S', 'Z'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(s[_ .-]?z|sz)([_ .-]|$)'],\n features: { jawOpen: 0.1, fricative: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[11],\n },\n {\n id: 't-l-d-n',\n label: 'T_L_D_N',\n order: 12,\n providerIds: { azure: [14, 19], sapi: [14, 19] },\n phonemes: ['T', 'L', 'D', 'N'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(t[_ .-]?l[_ .-]?d[_ .-]?n|tldn)([_ .-]|$)', '(^|[_ .-])(v|viseme)[_ .-]?l([_ .-]|$)'],\n features: { jawOpen: 0.3, tongueTip: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[12],\n },\n {\n id: 'th',\n label: 'Th',\n order: 13,\n providerIds: { azure: [17], sapi: [17] },\n phonemes: ['TH', 'DH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(th|dh)([_ .-]|$)'],\n features: { jawOpen: 0.15, tongueTip: 0.8, fricative: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[13],\n },\n {\n id: 'w-oo',\n label: 'W_OO',\n order: 14,\n providerIds: { azure: [7], sapi: [7] },\n phonemes: ['W', 'UW'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(w[_ .-]?oo|woo|uw|oo)([_ .-]|$)'],\n features: { jawOpen: 0.5, lipRound: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[14],\n },\n];\n\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/** Check if an AU has both morphs and bones (can blend between them) */\nexport const isMixedAU = (id: number): boolean => {\n const morphs = AU_TO_MORPHS[id];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && BONE_AU_TO_BINDINGS[id]?.length);\n};\n\n/** Check if an AU has separate left/right morphs */\nexport const hasLeftRightMorphs = (auId: number): boolean => {\n const morphs = AU_TO_MORPHS[auId];\n return !!(morphs?.left?.length && morphs?.right?.length);\n};\n\n/** Check if an AU has bilateral bone bindings (L and R nodes) in CC4 preset */\nexport const hasLeftRightBones = (auId: number): boolean => {\n const bindings = BONE_AU_TO_BINDINGS[auId];\n return checkBindingsForLeftRight(bindings);\n};\n\n/** Helper to check if bone bindings have L and R nodes */\nexport const checkBindingsForLeftRight = (bindings: BoneBinding[] | undefined): boolean => {\n if (!bindings || bindings.length === 0) return false;\n\n // Check if bindings include both L and R nodes\n const nodes = bindings.map(b => b.node);\n // Match patterns like _L, _R, _L_, _R_, GILL_L, GILL_R, etc.\n const hasLeft = nodes.some(n => /_L$|_L_|GILL_L|_L\\d/i.test(n));\n const hasRight = nodes.some(n => /_R$|_R_|GILL_R|_R\\d/i.test(n));\n\n return hasLeft && hasRight;\n};\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Unified rotation control for bones\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n {\n node: CC4_BONES.JAW,\n pitch: { aus: [25, 26, 27, 103], axis: 'rz' }, // Jaw drop plus speech jaw pseudo-control\n yaw: { aus: [30, 35], axis: 'ry', negative: 30, positive: 35 }, // Jaw lateral (left/right)\n roll: null // Jaw doesn't have roll\n },\n {\n node: CC4_BONES.HEAD,\n pitch: { aus: [54, 53], axis: 'rx', negative: 54, positive: 53 }, // Head down/up\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head turn left/right\n roll: { aus: [55, 56], axis: 'rz', negative: 55, positive: 56 } // Head tilt left/right\n },\n {\n node: CC4_BONES.EYE_L,\n pitch: { aus: [64, 63, 68, 67], axis: 'rx', negative: [64, 68], positive: [63, 67] }, // Eyes down/up\n yaw: { aus: [61, 62, 65, 66], axis: 'rz', negative: [61, 65], positive: [62, 66] }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: CC4_BONES.EYE_R,\n pitch: { aus: [64, 63, 72, 71], axis: 'rx', negative: [64, 72], positive: [63, 71] }, // Eyes down/up\n yaw: { aus: [61, 62, 69, 70], axis: 'rz', negative: [61, 69], positive: [62, 70] }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: CC4_BONES.TONGUE,\n pitch: { aus: [38, 37], axis: 'rz', negative: 38, positive: 37 }, // Tongue down/up\n yaw: { aus: [39, 40], axis: 'ry', negative: 39, positive: 40 }, // Tongue left/right\n roll: { aus: [41, 42], axis: 'rx', negative: 41, positive: 42 } // Tongue tilt left/right\n }\n];\n\n// ============================================================================\n// CONTINUUM PAIRS - Bidirectional AU pair mappings\n// ============================================================================\n\n/**\n * Continuum pair mappings - precomputed from COMPOSITE_ROTATIONS\n * Maps AU ID to its continuum partner info for bidirectional axes\n * (e.g., AU 51 \"Head Left\" is paired with AU 52 \"Head Right\")\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n}> = {\n // Eyes horizontal - both eyes share same AUs (yaw maps to rz via COMPOSITE_ROTATIONS)\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_L },\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_L },\n 65: { pairId: 66, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_L },\n 66: { pairId: 65, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_L },\n 69: { pairId: 70, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_R },\n 70: { pairId: 69, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_R },\n // Eyes vertical (pitch)\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_L },\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_L },\n 68: { pairId: 67, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_L },\n 67: { pairId: 68, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_L },\n 72: { pairId: 71, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_R },\n 71: { pairId: 72, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_R },\n // Head yaw (turn left/right)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: CC4_BONES.HEAD },\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: CC4_BONES.HEAD },\n // Head pitch (up/down)\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: CC4_BONES.HEAD },\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: CC4_BONES.HEAD },\n // Head roll (tilt left/right)\n 55: { pairId: 56, isNegative: true, axis: 'roll', node: CC4_BONES.HEAD },\n 56: { pairId: 55, isNegative: false, axis: 'roll', node: CC4_BONES.HEAD },\n // Jaw yaw (left/right)\n 30: { pairId: 35, isNegative: true, axis: 'yaw', node: CC4_BONES.JAW },\n 35: { pairId: 30, isNegative: false, axis: 'yaw', node: CC4_BONES.JAW },\n // Tongue yaw (left/right)\n 39: { pairId: 40, isNegative: true, axis: 'yaw', node: CC4_BONES.TONGUE },\n 40: { pairId: 39, isNegative: false, axis: 'yaw', node: CC4_BONES.TONGUE },\n // Tongue pitch (up/down)\n 38: { pairId: 37, isNegative: true, axis: 'pitch', node: CC4_BONES.TONGUE },\n 37: { pairId: 38, isNegative: false, axis: 'pitch', node: CC4_BONES.TONGUE },\n // Tongue roll (tilt left/right)\n 41: { pairId: 42, isNegative: true, axis: 'roll', node: CC4_BONES.TONGUE },\n 42: { pairId: 41, isNegative: false, axis: 'roll', node: CC4_BONES.TONGUE },\n // Extended tongue morphs (continuum pairs)\n 73: { pairId: 74, isNegative: true, axis: 'yaw', node: CC4_BONES.TONGUE }, // Tongue Narrow/Wide\n 74: { pairId: 73, isNegative: false, axis: 'yaw', node: CC4_BONES.TONGUE },\n 76: { pairId: 77, isNegative: false, axis: 'pitch', node: CC4_BONES.TONGUE }, // Tongue Tip Up/Down\n 77: { pairId: 76, isNegative: true, axis: 'pitch', node: CC4_BONES.TONGUE },\n};\n\n/**\n * Human-readable labels for continuum pairs\n * Key format: \"negativeAU-positiveAU\"\n * Used by UI components (ContinuumSlider, AUSection) to display friendly axis names\n */\nexport const CONTINUUM_LABELS: Record<string, string> = {\n '61-62': 'Eyes — Horizontal',\n '64-63': 'Eyes — Vertical',\n '65-66': 'Left Eye — Horizontal',\n '68-67': 'Left Eye — Vertical',\n '69-70': 'Right Eye — Horizontal',\n '72-71': 'Right Eye — Vertical',\n '51-52': 'Head — Horizontal',\n '54-53': 'Head — Vertical',\n '55-56': 'Head — Tilt',\n '30-35': 'Jaw — Horizontal',\n '38-37': 'Tongue — Vertical',\n '39-40': 'Tongue — Horizontal',\n '41-42': 'Tongue — Tilt',\n '73-74': 'Tongue — Width',\n '76-77': 'Tongue Tip — Vertical',\n};\n\nexport const CC4_EYE_MESH_NODES = {\n LEFT: 'CC_Base_Eye',\n RIGHT: 'CC_Base_Eye_1'\n} as const;\n\n// ============================================================================\n// AU INFO - Metadata for each Action Unit\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Forehead / Brow (Upper)\n '1': { id:'1', name:'Inner Brow Raiser', muscularBasis:'frontalis (pars medialis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '2': { id:'2', name:'Outer Brow Raiser', muscularBasis:'frontalis (pars lateralis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '4': { id:'4', name:'Brow Lowerer', muscularBasis:'corrugator/depressor supercilii', links:['https://en.wikipedia.org/wiki/Corrugator_supercilii'], faceArea:'Upper', facePart:'Forehead' },\n\n // Eyelids / Eyes (Upper)\n '5': { id:'5', name:'Upper Lid Raiser', muscularBasis:'levator palpebrae superioris', links:['https://en.wikipedia.org/wiki/Levator_palpebrae_superioris'], faceArea:'Upper', facePart:'Eyelids' },\n '6': { id:'6', name:'Cheek Raiser', muscularBasis:'orbicularis oculi (pars orbitalis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Cheeks' },\n '7': { id:'7', name:'Lid Tightener', muscularBasis:'orbicularis oculi (pars palpebralis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Eyelids' },\n '43': { id:'43', name:'Eyes Closed', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '45': { id:'45', name:'Blink', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '61': { id:'61', name:'Eyes Turn Left', faceArea:'Upper', facePart:'Eyes' },\n '62': { id:'62', name:'Eyes Turn Right', faceArea:'Upper', facePart:'Eyes' },\n '63': { id:'63', name:'Eyes Up', faceArea:'Upper', facePart:'Eyes' },\n '64': { id:'64', name:'Eyes Down', faceArea:'Upper', facePart:'Eyes' },\n '65': { id:'65', name:'Left Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '66': { id:'66', name:'Left Eye Look Right', faceArea:'Upper', facePart:'Eyes' },\n '67': { id:'67', name:'Left Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '68': { id:'68', name:'Left Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n '69': { id:'69', name:'Right Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '70': { id:'70', name:'Right Eye Look Right',faceArea:'Upper', facePart:'Eyes' },\n '71': { id:'71', name:'Right Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '72': { id:'72', name:'Right Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n\n // Nose / Cheeks\n '9': { id:'9', name:'Nose Wrinkler', muscularBasis:'levator labii superioris alaeque nasi', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris_alaeque_nasi'], faceArea:'Upper', facePart:'Nose' },\n '34': { id:'34', name:'Cheek Puff', faceArea:'Lower', facePart:'Cheeks' },\n\n // Mouth (Lower)\n '8': { id:'8', name:'Lips Toward Each Other', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '10': { id:'10', name:'Upper Lip Raiser', muscularBasis:'levator labii superioris', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris'], faceArea:'Lower', facePart:'Mouth' },\n '11': { id:'11', name:'Nasolabial Deepener', muscularBasis:'zygomaticus minor', links:['https://en.wikipedia.org/wiki/Zygomaticus_minor'], faceArea:'Lower', facePart:'Cheeks' },\n '12': { id:'12', name:'Lip Corner Puller', muscularBasis:'zygomaticus major', links:['https://en.wikipedia.org/wiki/Zygomaticus_major'], faceArea:'Lower', facePart:'Mouth' },\n '13': { id:'13', name:'Sharp Lip Puller', muscularBasis:'levator anguli oris', links:['https://en.wikipedia.org/wiki/Levator_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '14': { id:'14', name:'Dimpler', muscularBasis:'buccinator', links:['https://en.wikipedia.org/wiki/Buccinator'], faceArea:'Lower', facePart:'Cheeks' },\n '15': { id:'15', name:'Lip Corner Depressor', muscularBasis:'depressor anguli oris', links:['https://en.wikipedia.org/wiki/Depressor_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '16': { id:'16', name:'Lower Lip Depressor', muscularBasis:'depressor labii inferioris', links:['https://en.wikipedia.org/wiki/Depressor_labii_inferioris'], faceArea:'Lower', facePart:'Mouth' },\n '17': { id:'17', name:'Chin Raiser', muscularBasis:'mentalis', links:['https://en.wikipedia.org/wiki/Mentalis'], faceArea:'Lower', facePart:'Chin' },\n '18': { id:'18', name:'Lip Pucker', faceArea:'Lower', facePart:'Mouth' },\n '20': { id:'20', name:'Lip Stretcher', muscularBasis:'risorius + platysma', links:['https://en.wikipedia.org/wiki/Risorius','https://en.wikipedia.org/wiki/Platysma'], faceArea:'Lower', facePart:'Mouth' },\n '22': { id:'22', name:'Lip Funneler', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '23': { id:'23', name:'Lip Tightener', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '24': { id:'24', name:'Lip Presser', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '25': { id:'25', name:'Lips Part', faceArea:'Lower', facePart:'Mouth' },\n '27': { id:'27', name:'Mouth Stretch', muscularBasis:'pterygoids + digastric', links:['https://en.wikipedia.org/wiki/Pterygoid_bone','https://en.wikipedia.org/wiki/Digastric_muscle'], faceArea:'Lower', facePart:'Mouth' },\n '28': { id:'28', name:'Lip Suck', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n\n // Tongue (Lower)\n '19': { id:'19', name:'Tongue Show', faceArea:'Lower', facePart:'Tongue' },\n '36': { id:'36', name:'Tongue Bulge', faceArea:'Lower', facePart:'Tongue' },\n '37': { id:'37', name:'Tongue Up', faceArea:'Lower', facePart:'Tongue' },\n '38': { id:'38', name:'Tongue Down', faceArea:'Lower', facePart:'Tongue' },\n '39': { id:'39', name:'Tongue Left', faceArea:'Lower', facePart:'Tongue' },\n '40': { id:'40', name:'Tongue Right', faceArea:'Lower', facePart:'Tongue' },\n '41': { id:'41', name:'Tongue Tilt Left', faceArea:'Lower', facePart:'Tongue' },\n '42': { id:'42', name:'Tongue Tilt Right', faceArea:'Lower', facePart:'Tongue' },\n // Extended tongue controls (CC4-specific morphs)\n '73': { id:'73', name:'Tongue Narrow', faceArea:'Lower', facePart:'Tongue' },\n '74': { id:'74', name:'Tongue Wide', faceArea:'Lower', facePart:'Tongue' },\n '75': { id:'75', name:'Tongue Roll', faceArea:'Lower', facePart:'Tongue' },\n '76': { id:'76', name:'Tongue Tip Up', faceArea:'Lower', facePart:'Tongue' },\n '77': { id:'77', name:'Tongue Tip Down', faceArea:'Lower', facePart:'Tongue' },\n\n // Jaw (Lower)\n '26': { id:'26', name:'Jaw Drop', muscularBasis:'masseter (relax temporalis)', links:['https://en.wikipedia.org/wiki/Masseter_muscle'], faceArea:'Lower', facePart:'Jaw' },\n '29': { id:'29', name:'Jaw Thrust', faceArea:'Lower', facePart:'Jaw' },\n '30': { id:'30', name:'Jaw Left', faceArea:'Lower', facePart:'Jaw' },\n '31': { id:'31', name:'Jaw Clencher', muscularBasis:'masseter + temporalis', faceArea:'Lower', facePart:'Jaw' },\n '32': { id:'32', name:'Lip Bite', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '35': { id:'35', name:'Jaw Right', faceArea:'Lower', facePart:'Jaw' },\n\n // Head position (M51-M56 in FACS notation)\n '51': { id:'51', name:'Head Turn Left', faceArea:'Upper', facePart:'Head' },\n '52': { id:'52', name:'Head Turn Right', faceArea:'Upper', facePart:'Head' },\n '53': { id:'53', name:'Head Up', faceArea:'Upper', facePart:'Head' },\n '54': { id:'54', name:'Head Down', faceArea:'Upper', facePart:'Head' },\n '55': { id:'55', name:'Head Tilt Left', faceArea:'Upper', facePart:'Head' },\n '56': { id:'56', name:'Head Tilt Right', faceArea:'Upper', facePart:'Head' },\n\n // Eye (Upper) - EO morphs applied to CC_Base_Eye meshes\n '80': { id:'80', name:'Eye Bulge', faceArea:'Upper', facePart:'Eye' },\n '81': { id:'81', name:'Eye Depth', faceArea:'Upper', facePart:'Eye' },\n '82': { id:'82', name:'Eye Inner Depth', faceArea:'Upper', facePart:'Eye' },\n '83': { id:'83', name:'Eye Inner Height', faceArea:'Upper', facePart:'Eye' },\n '84': { id:'84', name:'Eye Inner Width', faceArea:'Upper', facePart:'Eye' },\n '85': { id:'85', name:'Eye Outer Depth', faceArea:'Upper', facePart:'Eye' },\n '86': { id:'86', name:'Eye Outer Height', faceArea:'Upper', facePart:'Eye' },\n '87': { id:'87', name:'Eye Outer Width', faceArea:'Upper', facePart:'Eye' },\n '88': { id:'88', name:'Eye Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '89': { id:'89', name:'Eye Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '90': { id:'90', name:'Eye Center Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '91': { id:'91', name:'Eye Center Upper Height',faceArea:'Upper', facePart:'Eye' },\n '92': { id:'92', name:'Eye Center Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '93': { id:'93', name:'Eye Center Lower Height',faceArea:'Upper', facePart:'Eye' },\n '94': { id:'94', name:'Eye Inner Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '95': { id:'95', name:'Eye Inner Upper Height', faceArea:'Upper', facePart:'Eye' },\n '96': { id:'96', name:'Eye Inner Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '97': { id:'97', name:'Eye Inner Lower Height', faceArea:'Upper', facePart:'Eye' },\n '98': { id:'98', name:'Eye Outer Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '99': { id:'99', name:'Eye Outer Upper Height', faceArea:'Upper', facePart:'Eye' },\n '100': { id:'100', name:'Eye Outer Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '101': { id:'101', name:'Eye Outer Lower Height',faceArea:'Upper', facePart:'Eye' },\n '102': { id:'102', name:'Eye Duct Depth', faceArea:'Upper', facePart:'Eye' },\n};\n\n// ============================================================================\n// MIX DEFAULTS - Morph/bone blend weights\n// ============================================================================\n\n/** Default mix weights (0 = morph only, 1 = bone only) */\nexport const AU_MIX_DEFAULTS: Record<number, number> = {\n 31: 0.7, 32: 0.7, 33: 0.7, 54: 0.7, 55: 0.7, 56: 0.7, // head\n 61: 0.5, 62: 0.5, 63: 0.5, 64: 0.5, // eyes\n 25: 0.5, 26: 0.5, 27: 0.5, // jaw open (lips part, jaw drop, mouth stretch)\n 30: 0.5, 35: 0.5, // jaw left/right\n};\n\n// ============================================================================\n// CC4 MESH CLASSIFICATION\n// Types imported from '../mappings/types'\n// ============================================================================\n\n/** Exact mesh name -> category mapping from the character GLB */\nexport const CC4_MESHES: Record<string, MeshInfo> = {\n // Body (6 meshes, 80 morphs each) - default render order 0\n 'CC_Base_Body_1': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_2': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_3': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_4': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_5': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_6': { category: 'body', morphCount: 80 },\n // Eyes (bone-driven, no morphs) - render first (behind everything)\n 'CC_Base_Eye': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_1': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_2': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_3': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_4': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n // Eye occlusion (94 morphs each) - render on top of eyes with transparency support\n 'CC_Base_EyeOcclusion_1': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n 'CC_Base_EyeOcclusion_2': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n // Tear lines (90 morphs each) - on top of eyes/face\n 'CC_Base_TearLine_1': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n 'CC_Base_TearLine_2': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n // Cornea (no morphs) - render first with eyes\n 'CC_Base_Cornea': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Cornea_1': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n // Teeth (no morphs, follow jaw bone) - default render order\n 'CC_Base_Teeth_1': { category: 'teeth', morphCount: 0 },\n 'CC_Base_Teeth_2': { category: 'teeth', morphCount: 0 },\n // Tongue (23 morphs) - default render order\n 'CC_Base_Tongue': { category: 'tongue', morphCount: 23 },\n // Eyebrows (91 morphs each) - above face\n 'Male_Bushy_1': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n 'Male_Bushy_2': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n // Hair (14 styling morphs each) - render last (on top of everything)\n 'Side_part_wavy_1': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n 'Side_part_wavy_2': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n};\n\n// ============================================================================\n// MORPH TO MESH MAPPING\n// MorphCategory type imported from '../mappings/types'\n// ============================================================================\n\n/** Which mesh each morph category applies to */\nexport const MORPH_TO_MESH: Record<MorphCategory, string[]> = {\n // Face/AU morphs target the main body mesh only.\n // Include both CC4 naming variants (with and without _1/_2 suffixes).\n face: ['CC_Base_Body'],\n viseme: ['CC_Base_Body', 'CC_Base_Body_1'],\n eye: ['CC_Base_EyeOcclusion', 'CC_Base_EyeOcclusion_1', 'CC_Base_EyeOcclusion_2'],\n tongue: ['CC_Base_Tongue', 'CC_Base_Tongue_1'],\n hair: ['Side_part_wavy', 'Side_part_wavy_1', 'Side_part_wavy_2'],\n};\n\n/** Map AU facePart labels to morphToMesh categories for configurable AU mesh routing. */\nexport const AU_FACEPART_TO_MESH_CATEGORY: Record<string, MorphCategory> = {\n Eye: 'eye',\n Eyes: 'eye',\n Eyelids: 'eye',\n Tongue: 'tongue',\n};\n\nexport const CC4_MAPPING_SECTIONS: MappingEditorSection[] = [\n { id: 'Forehead', label: 'Forehead', kind: 'au', order: 0, meshCategory: 'face', facePart: 'Forehead' },\n { id: 'Eyelids', label: 'Eyelids', kind: 'au', order: 1, meshCategory: 'eye', facePart: 'Eyelids' },\n { id: 'Eyes', label: 'Eyes', kind: 'au', order: 2, meshCategory: 'eye', facePart: 'Eyes' },\n { id: 'Cheeks', label: 'Cheeks', kind: 'au', order: 3, meshCategory: 'face', facePart: 'Cheeks' },\n { id: 'Nose', label: 'Nose', kind: 'au', order: 4, meshCategory: 'face', facePart: 'Nose' },\n { id: 'Mouth', label: 'Mouth', kind: 'au', order: 5, meshCategory: 'face', facePart: 'Mouth' },\n { id: 'Chin', label: 'Chin', kind: 'au', order: 6, meshCategory: 'face', facePart: 'Chin' },\n { id: 'Jaw', label: 'Jaw', kind: 'au', order: 7, meshCategory: 'face', facePart: 'Jaw' },\n { id: 'Tongue', label: 'Tongue', kind: 'au', order: 8, meshCategory: 'tongue', facePart: 'Tongue' },\n { id: 'Head', label: 'Head', kind: 'au', order: 9, meshCategory: 'face', facePart: 'Head' },\n { id: 'Joint Controls', label: 'Joint Controls', kind: 'au', order: 10, meshCategory: 'face', facePart: 'Joint Controls' },\n { id: 'Eye', label: 'Eye', kind: 'au', order: 11, meshCategory: 'eye', facePart: 'Eye' },\n { id: 'Hair', label: 'Hair', kind: 'hair', order: 12, meshCategory: 'hair' },\n { id: 'Visemes', label: 'Visemes', kind: 'viseme', order: 13, meshCategory: 'viseme' },\n { id: 'LipSync', label: 'Lip Sync', kind: 'lipSync', order: 14, meshCategory: 'face' },\n { id: 'Unmapped', label: 'Unmapped', kind: 'unmapped', order: 15, meshCategory: 'face' },\n];\n\n// ============================================================================\n// HAIR PHYSICS DEFAULTS\n// ============================================================================\n\nexport const CC4_HAIR_PHYSICS: Profile['hairPhysics'] = {\n stiffness: 7.5,\n damping: 0.18,\n inertia: 3.5,\n gravity: 12,\n responseScale: 2.5,\n idleSwayAmount: 0.12,\n idleSwaySpeed: 1.0,\n windStrength: 0,\n windDirectionX: 1.0,\n windDirectionZ: 0,\n windTurbulence: 0.3,\n windFrequency: 1.4,\n idleClipDuration: 10,\n impulseClipDuration: 1.4,\n direction: {\n yawSign: -1,\n pitchSign: -1,\n },\n morphTargets: {\n swayLeft: { key: 'L_Hair_Left', axis: 'yaw' },\n swayRight: { key: 'L_Hair_Right', axis: 'yaw' },\n swayFront: { key: 'L_Hair_Front', axis: 'pitch' },\n fluffRight: { key: 'Fluffy_Right', axis: 'yaw' },\n fluffBottom: { key: 'Fluffy_Bottom_ALL', axis: 'pitch' },\n headUp: {\n Hairline_High_ALL: { value: 0.45, axis: 'pitch' },\n Length_Short: { value: 0.65, axis: 'pitch' },\n },\n headDown: {\n L_Hair_Front: { value: 2.0, axis: 'pitch' },\n Fluffy_Bottom_ALL: { value: 1.0, axis: 'pitch' },\n },\n },\n};\n\n// ============================================================================\n// CC4_PRESET - Main export for Profile\n// ============================================================================\n\nexport const CC4_PRESET: Profile = {\n name: 'Character Creator 4',\n animalType: 'human',\n // No emoji for humans - uses FaTheaterMasks icon instead\n auToMorphs: AU_TO_MORPHS,\n auToBones: CC4_PROFILE_BONE_BINDINGS,\n boneNodes: CC4_BONE_NODES,\n bonePrefix: CC4_BONE_PREFIX,\n suffixPattern: CC4_SUFFIX_PATTERN,\n morphToMesh: MORPH_TO_MESH,\n auFacePartToMeshCategory: AU_FACEPART_TO_MESH_CATEGORY,\n mappingSections: CC4_MAPPING_SECTIONS,\n visemeKeys: VISEME_KEYS,\n visemeSystemId: CC4_VISEME_SYSTEM_ID,\n visemeSlots: CC4_VISEME_SLOTS,\n visemeMeshCategory: 'viseme',\n visemeJawAmounts: VISEME_JAW_AMOUNTS,\n auMixDefaults: AU_MIX_DEFAULTS,\n auInfo: AU_INFO,\n eyeMeshNodes: CC4_EYE_MESH_NODES,\n meshes: CC4_MESHES,\n continuumPairs: CONTINUUM_PAIRS_MAP,\n continuumLabels: CONTINUUM_LABELS,\n hairPhysics: CC4_HAIR_PHYSICS,\n annotationRegions: [\n {\n name: 'full_body',\n objects: ['*'],\n paddingFactor: 2.0,\n },\n {\n name: 'head',\n bones: ['HEAD', 'JAW'],\n paddingFactor: 1.5,\n children: ['face', 'left_eye', 'right_eye', 'mouth'],\n expandAnimation: 'staggered',\n },\n {\n name: 'face',\n bones: ['HEAD'],\n // meshes: populated by user selection in wizard - varies per character\n paddingFactor: 1.3,\n parent: 'head',\n },\n {\n name: 'left_eye',\n bones: ['EYE_L'],\n paddingFactor: 0.9,\n parent: 'head',\n },\n {\n name: 'right_eye',\n bones: ['EYE_R'],\n paddingFactor: 0.9,\n parent: 'head',\n },\n {\n name: 'mouth',\n bones: ['JAW'],\n paddingFactor: 1.5,\n parent: 'head',\n },\n {\n name: 'upper_body',\n bones: [\n 'SPINE_02',\n 'HEAD',\n 'CLAVICLE_L',\n 'CLAVICLE_R',\n ],\n paddingFactor: 1.6,\n },\n {\n name: 'back',\n bones: ['SPINE_01', 'SPINE_02'],\n paddingFactor: 1.8,\n cameraAngle: 180,\n },\n {\n name: 'left_hand',\n bones: ['HAND_L'],\n paddingFactor: 1.3,\n cameraAngle: 270,\n },\n {\n name: 'right_hand',\n bones: ['HAND_R'],\n paddingFactor: 1.3,\n cameraAngle: 90,\n },\n {\n name: 'left_foot',\n bones: ['FOOT_L', 'TOEBASE_L'],\n paddingFactor: 2.5,\n cameraAngle: 270,\n },\n {\n name: 'right_foot',\n bones: ['FOOT_R', 'TOEBASE_R'],\n paddingFactor: 2.5,\n cameraAngle: 90,\n },\n ],\n};\n\nexport default CC4_PRESET;\n","import { Mesh } from 'three';\nimport type { Object3D } from 'three';\nimport type { ClipHandle, ClipOptions, CurvesMap } from '../../../core/types';\nimport type {\n HairPhysicsDirectionConfig as SharedHairPhysicsDirectionConfig,\n HairMorphTargetsConfig as SharedHairMorphTargetsConfig,\n HairPhysicsRuntimeConfig as SharedHairPhysicsConfig,\n HairPhysicsRuntimeConfigUpdate as SharedHairPhysicsConfigUpdate,\n HairAppearanceState,\n HairColorAppearance,\n} from '../../../interfaces/Hair';\nimport {\n colorToCssHex,\n DEFAULT_HAIR_COLOR_APPEARANCE,\n normalizeHairColorAppearance,\n} from '../../../hair/appearance';\nimport type { HairPhysicsProfileConfig } from '../../../mappings/types';\nimport { CC4_MESHES } from '../../../presets/cc4';\nimport type { EmbodyCoreWasmModule } from '../../../wasmTypes';\n\nexport type HairPhysicsDirectionConfig = SharedHairPhysicsDirectionConfig;\nexport type HairMorphTargets = SharedHairMorphTargetsConfig;\nexport type HairPhysicsConfig = SharedHairPhysicsConfig;\nexport type HairPhysicsConfigUpdate = SharedHairPhysicsConfigUpdate;\n\nexport interface HairPhysicsHost {\n getMeshByName: (name: string) => Mesh | undefined;\n getSelectedHairMeshNames?: () => string[];\n buildClip?: (clipName: string, curves: CurvesMap, options?: ClipOptions) => ClipHandle | null;\n cleanupSnippet?: (name: string) => void;\n}\n\nconst clamp01 = (value: number) => (value < 0 ? 0 : value > 1 ? 1 : value);\n\nexport class HairPhysicsController {\n private host: HairPhysicsHost;\n private core: EmbodyCoreWasmModule | null = null;\n private hairPhysicsEnabled = false;\n private hairPhysicsConfig: HairPhysicsConfig = {\n stiffness: 7.5,\n damping: 0.18,\n inertia: 3.5,\n gravity: 12,\n responseScale: 2.5,\n idleSwayAmount: 0.12,\n idleSwaySpeed: 1.0,\n windStrength: 0,\n windDirectionX: 1.0,\n windDirectionZ: 0,\n windTurbulence: 0.3,\n windFrequency: 1.4,\n idleClipDuration: 10,\n impulseClipDuration: 1.4,\n direction: {\n yawSign: -1,\n pitchSign: -1,\n },\n morphTargets: {\n swayLeft: 'L_Hair_Left',\n swayRight: 'L_Hair_Right',\n swayFront: 'L_Hair_Front',\n fluffRight: 'Fluffy_Right',\n fluffBottom: 'Fluffy_Bottom_ALL',\n headUp: {\n Hairline_High_ALL: 0.45,\n Length_Short: 0.65,\n },\n headDown: {\n L_Hair_Front: 2.0,\n Fluffy_Bottom_ALL: 1.0,\n },\n },\n };\n private readonly idleClipName = 'hair_idle';\n private readonly gravityClipName = 'hair_gravity';\n private readonly impulseClipNames = {\n left: 'hair_impulse_left',\n right: 'hair_impulse_right',\n front: 'hair_impulse_front',\n };\n private idleClipHandle: ClipHandle | null = null;\n private gravityClipHandle: ClipHandle | null = null;\n private idleClipDirty = true;\n private gravityClipDirty = true;\n private impulseClips: { left?: ClipHandle; right?: ClipHandle; front?: ClipHandle } = {};\n private impulseClipDirty = true;\n private impulseEndTimers: Partial<Record<'left' | 'right' | 'front', ReturnType<typeof setTimeout>>> = {};\n private impulseFadeSteps: Partial<Record<'left' | 'right' | 'front', ReturnType<typeof setTimeout>[]>> = {};\n private hasHeadState = false;\n private lastHeadHorizontal = 0;\n private lastHeadVertical = 0;\n private registeredHairObjects = new Map<string, Mesh>();\n private cachedHairMeshNames: string[] | null = null;\n private warnedMissingMorphTargets = new Set<string>();\n private appearance: HairAppearanceState = {\n hairColor: { ...DEFAULT_HAIR_COLOR_APPEARANCE },\n eyebrowColor: { ...DEFAULT_HAIR_COLOR_APPEARANCE },\n showOutline: false,\n outlineColor: '#00ff00',\n outlineOpacity: 1,\n };\n private appearanceSampled = false;\n\n constructor(host: HairPhysicsHost) {\n this.host = host;\n }\n\n /** Attach the Wasm module owned by the engine/session that created this controller. */\n setCore(core: EmbodyCoreWasmModule): void {\n this.core = core;\n }\n\n private requireCore(): EmbodyCoreWasmModule {\n if (!this.core) {\n throw new Error(\n 'HairPhysicsController has no Embody Wasm core. Create the engine with Embody.create() or call setCore() after initEmbodyCore().'\n );\n }\n return this.core;\n }\n\n private isEyebrowMesh(name: string, mesh?: Mesh): boolean {\n const info = CC4_MESHES[name];\n if (info?.category === 'eyebrow') return true;\n if (info?.category === 'hair') return false;\n const lower = name.toLowerCase();\n return lower.includes('eyebrow') || lower.includes('brow');\n }\n\n private sampleColorFromMesh(mesh: Mesh | undefined): HairAppearanceState['hairColor'] | null {\n if (!mesh || !mesh.material || Array.isArray(mesh.material)) return null;\n const mat = mesh.material as typeof mesh.material & {\n color?: { getHexString(): string };\n emissive?: { getHexString(): string };\n emissiveIntensity?: number;\n };\n const baseColor = colorToCssHex(mat.color);\n if (!baseColor) return null;\n return {\n baseColor,\n emissive: colorToCssHex(mat.emissive) ?? '#000000',\n emissiveIntensity: typeof mat.emissiveIntensity === 'number' ? mat.emissiveIntensity : 0,\n };\n }\n\n private ensureAppearanceSampled(): void {\n if (this.appearanceSampled) return;\n this.appearanceSampled = true;\n\n let hairSample: HairAppearanceState['hairColor'] | null = null;\n let browSample: HairAppearanceState['hairColor'] | null = null;\n for (const [name, mesh] of this.registeredHairObjects) {\n if (this.isEyebrowMesh(name, mesh)) {\n browSample ??= this.sampleColorFromMesh(mesh);\n } else {\n hairSample ??= this.sampleColorFromMesh(mesh);\n }\n if (hairSample && browSample) break;\n }\n\n if (hairSample) this.appearance.hairColor = hairSample;\n if (browSample) this.appearance.eyebrowColor = browSample;\n }\n\n private applyColorToCategory(\n category: 'hair' | 'eyebrow',\n color: HairAppearanceState['hairColor'],\n ): void {\n for (const [name, mesh] of this.registeredHairObjects) {\n const isBrow = this.isEyebrowMesh(name, mesh);\n if (category === 'eyebrow' ? !isBrow : isBrow) continue;\n this.applyHairStateToObject(name, {\n color: {\n baseColor: color.baseColor,\n emissive: color.emissive,\n emissiveIntensity: color.emissiveIntensity,\n },\n isEyebrow: isBrow,\n });\n }\n }\n\n getHairAppearance(): HairAppearanceState {\n this.ensureAppearanceSampled();\n return {\n hairColor: { ...this.appearance.hairColor },\n eyebrowColor: { ...this.appearance.eyebrowColor },\n showOutline: this.appearance.showOutline,\n outlineColor: this.appearance.outlineColor,\n outlineOpacity: this.appearance.outlineOpacity,\n };\n }\n\n setHairColor(color: HairColorAppearance | string): void {\n this.ensureAppearanceSampled();\n this.appearance.hairColor = normalizeHairColorAppearance(color, {\n ...DEFAULT_HAIR_COLOR_APPEARANCE,\n ...this.appearance.hairColor,\n name: this.appearance.hairColor.name ?? DEFAULT_HAIR_COLOR_APPEARANCE.name,\n });\n this.applyColorToCategory('hair', this.appearance.hairColor);\n }\n\n setEyebrowColor(color: HairColorAppearance | string): void {\n this.ensureAppearanceSampled();\n this.appearance.eyebrowColor = normalizeHairColorAppearance(color, {\n ...DEFAULT_HAIR_COLOR_APPEARANCE,\n ...this.appearance.eyebrowColor,\n name: this.appearance.eyebrowColor.name ?? DEFAULT_HAIR_COLOR_APPEARANCE.name,\n });\n this.applyColorToCategory('eyebrow', this.appearance.eyebrowColor);\n }\n\n setHairBaseColor(baseColor: string): void {\n this.ensureAppearanceSampled();\n this.setHairColor({\n ...this.appearance.hairColor,\n baseColor,\n });\n }\n\n setEyebrowBaseColor(baseColor: string): void {\n this.ensureAppearanceSampled();\n this.setEyebrowColor({\n ...this.appearance.eyebrowColor,\n baseColor,\n });\n }\n\n setHairGlow(emissive: string, intensity: number): void {\n this.ensureAppearanceSampled();\n this.setHairColor({\n ...this.appearance.hairColor,\n emissive,\n emissiveIntensity: intensity,\n });\n }\n\n setEyebrowGlow(emissive: string, intensity: number): void {\n this.ensureAppearanceSampled();\n this.setEyebrowColor({\n ...this.appearance.eyebrowColor,\n emissive,\n emissiveIntensity: intensity,\n });\n }\n\n setHairOutline(outline: { show: boolean; color?: string; opacity?: number }): void {\n this.ensureAppearanceSampled();\n this.appearance.showOutline = Boolean(outline.show);\n if (outline.color !== undefined) {\n this.appearance.outlineColor = outline.color;\n }\n if (outline.opacity !== undefined) {\n this.appearance.outlineOpacity = outline.opacity;\n }\n const payload = {\n outline: {\n show: this.appearance.showOutline,\n color: this.appearance.outlineColor,\n opacity: this.appearance.outlineOpacity,\n },\n };\n for (const name of this.registeredHairObjects.keys()) {\n this.applyHairStateToObject(name, payload);\n }\n }\n\n clearRegisteredHairObjects(): void {\n this.registeredHairObjects.clear();\n this.cachedHairMeshNames = null;\n this.appearanceSampled = false;\n this.stopIdleClip();\n this.stopGravityClip();\n this.stopImpulseClips();\n this.clearImpulseTimers();\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnedMissingMorphTargets.clear();\n }\n\n registerHairObjects(objects: Object3D[]): Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> {\n this.clearRegisteredHairObjects();\n\n const result: Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> = [];\n\n for (const obj of objects) {\n if (obj instanceof Mesh) {\n const mesh = obj;\n this.registeredHairObjects.set(mesh.name, mesh);\n\n const meshInfo = CC4_MESHES[mesh.name];\n const isEyebrow = meshInfo?.category === 'eyebrow';\n\n result.push({\n name: mesh.name,\n isMesh: true,\n isEyebrow,\n });\n }\n }\n\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n\n return result;\n }\n\n autoRegisterHairMesh(mesh: Mesh, category: 'hair' | 'eyebrow'): void {\n this.registeredHairObjects.set(mesh.name, mesh);\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n mesh.renderOrder = category === 'eyebrow' ? 5 : 10;\n }\n\n getRegisteredHairObjects(): Mesh[] {\n return Array.from(this.registeredHairObjects.values());\n }\n\n setHairPhysicsEnabled(enabled: boolean): void {\n this.hairPhysicsEnabled = enabled;\n if (!enabled) {\n this.stopIdleClip();\n this.stopGravityClip();\n this.stopImpulseClips();\n this.clearImpulseTimers();\n this.hasHeadState = false;\n return;\n }\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n\n isHairPhysicsEnabled(): boolean {\n return this.hairPhysicsEnabled;\n }\n\n setHairPhysicsProfileConfig(hairConfig?: HairPhysicsProfileConfig): void {\n if (!hairConfig) return;\n\n const runtimeConfig: HairPhysicsConfigUpdate = {};\n const numericKeys: Array<keyof HairPhysicsProfileConfig> = [\n 'stiffness',\n 'damping',\n 'inertia',\n 'gravity',\n 'responseScale',\n 'idleSwayAmount',\n 'idleSwaySpeed',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n 'idleClipDuration',\n 'impulseClipDuration',\n ];\n\n for (const key of numericKeys) {\n const value = hairConfig[key];\n if (value !== undefined) {\n (runtimeConfig as Record<string, unknown>)[key] = value;\n }\n }\n\n if (hairConfig.direction) {\n runtimeConfig.direction = { ...hairConfig.direction } as HairPhysicsDirectionConfig;\n }\n\n if (hairConfig.morphTargets) {\n const morphTargets: Partial<HairMorphTargets> = {};\n if (hairConfig.morphTargets.swayLeft) morphTargets.swayLeft = hairConfig.morphTargets.swayLeft.key;\n if (hairConfig.morphTargets.swayRight) morphTargets.swayRight = hairConfig.morphTargets.swayRight.key;\n if (hairConfig.morphTargets.swayFront) morphTargets.swayFront = hairConfig.morphTargets.swayFront.key;\n if (hairConfig.morphTargets.fluffRight) morphTargets.fluffRight = hairConfig.morphTargets.fluffRight.key;\n if (hairConfig.morphTargets.fluffBottom) morphTargets.fluffBottom = hairConfig.morphTargets.fluffBottom.key;\n\n if (hairConfig.morphTargets.headUp) {\n const headUp: Record<string, number> = {};\n for (const [key, value] of Object.entries(hairConfig.morphTargets.headUp)) {\n if (value && typeof value.value === 'number') {\n headUp[key] = value.value;\n }\n }\n if (Object.keys(headUp).length > 0) morphTargets.headUp = headUp;\n }\n\n if (hairConfig.morphTargets.headDown) {\n const headDown: Record<string, number> = {};\n for (const [key, value] of Object.entries(hairConfig.morphTargets.headDown)) {\n if (value && typeof value.value === 'number') {\n headDown[key] = value.value;\n }\n }\n if (Object.keys(headDown).length > 0) morphTargets.headDown = headDown;\n }\n\n if (Object.keys(morphTargets).length > 0) {\n runtimeConfig.morphTargets = morphTargets as HairMorphTargets;\n }\n }\n\n this.setHairPhysicsConfig(runtimeConfig);\n if (hairConfig.enabled !== undefined) {\n this.setHairPhysicsEnabled(Boolean(hairConfig.enabled));\n }\n }\n\n setHairPhysicsConfig(config: HairPhysicsConfigUpdate): void {\n const direction = config.direction\n ? { ...this.hairPhysicsConfig.direction, ...config.direction }\n : this.hairPhysicsConfig.direction;\n\n const morphTargets = config.morphTargets\n ? {\n ...this.hairPhysicsConfig.morphTargets,\n ...config.morphTargets,\n headUp: {\n ...this.hairPhysicsConfig.morphTargets.headUp,\n ...(config.morphTargets.headUp ?? {}),\n },\n headDown: {\n ...this.hairPhysicsConfig.morphTargets.headDown,\n ...(config.morphTargets.headDown ?? {}),\n },\n }\n : this.hairPhysicsConfig.morphTargets;\n\n this.hairPhysicsConfig = { ...this.hairPhysicsConfig, ...config, direction, morphTargets };\n\n const idleKeys: Array<keyof HairPhysicsConfigUpdate> = [\n 'idleSwayAmount',\n 'idleSwaySpeed',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n 'idleClipDuration',\n ];\n const idleChanged = idleKeys.some((key) => config[key] !== undefined);\n const morphTargetsChanged = config.morphTargets !== undefined;\n const directionChanged = config.direction !== undefined;\n\n const impulseKeys: Array<keyof HairPhysicsConfigUpdate> = [\n 'stiffness',\n 'damping',\n 'impulseClipDuration',\n ];\n const impulseChanged = impulseKeys.some((key) => config[key] !== undefined);\n const gravityChanged = morphTargetsChanged;\n\n if (idleChanged || morphTargetsChanged) {\n this.idleClipDirty = true;\n }\n if (impulseChanged || morphTargetsChanged) {\n this.impulseClipDirty = true;\n }\n if (gravityChanged) {\n this.gravityClipDirty = true;\n }\n if (directionChanged) {\n this.hasHeadState = false;\n this.lastHeadHorizontal = 0;\n this.lastHeadVertical = 0;\n }\n\n if (this.hairPhysicsEnabled) {\n if (idleChanged || morphTargetsChanged) this.startIdleClip();\n if (impulseChanged || morphTargetsChanged) this.buildImpulseClips();\n if (gravityChanged) this.startGravityClip();\n }\n if (morphTargetsChanged) {\n this.warnMissingHairMorphTargets();\n }\n }\n\n getHairPhysicsConfig(): HairPhysicsConfig {\n return {\n ...this.hairPhysicsConfig,\n direction: { ...this.hairPhysicsConfig.direction },\n morphTargets: {\n ...this.hairPhysicsConfig.morphTargets,\n headUp: { ...this.hairPhysicsConfig.morphTargets.headUp },\n headDown: { ...this.hairPhysicsConfig.morphTargets.headDown },\n },\n };\n }\n\n validateHairMorphTargets(): string[] {\n const configuredKeys = this.collectConfiguredMorphKeys();\n if (configuredKeys.length === 0) return [];\n\n const availableKeys = this.collectAvailableHairMorphKeys();\n if (availableKeys.size === 0) return [];\n\n return configuredKeys.filter((key) => !availableKeys.has(key));\n }\n\n update(dtSeconds: number): void {\n if (!this.hairPhysicsEnabled) return;\n if (!this.supportsMixerClips()) return;\n }\n\n onHeadRotationChanged(yaw: number, pitch: number): void {\n if (!this.hairPhysicsEnabled) return;\n if (!this.supportsMixerClips()) return;\n this.updateGravityFromHeadPitch(pitch);\n this.triggerHeadImpulse(yaw, pitch);\n }\n\n getHairMorphTargets(meshName?: string): string[] {\n let targetMesh: Mesh | undefined;\n\n if (meshName) {\n targetMesh = this.registeredHairObjects.get(meshName);\n } else {\n const hairMeshNames = this.getHairMeshNames();\n for (const name of hairMeshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n if (mesh) {\n targetMesh = mesh;\n break;\n }\n }\n }\n\n if (!targetMesh) return [];\n\n const dict = targetMesh.morphTargetDictionary;\n if (!dict) return [];\n\n return Object.keys(dict);\n }\n\n private collectConfiguredMorphKeys(): string[] {\n const { morphTargets } = this.hairPhysicsConfig;\n const keys = new Set<string>();\n const addKey = (key?: string) => {\n if (typeof key === 'string' && key.length > 0) keys.add(key);\n };\n\n addKey(morphTargets.swayLeft);\n addKey(morphTargets.swayRight);\n addKey(morphTargets.swayFront);\n addKey(morphTargets.fluffRight);\n addKey(morphTargets.fluffBottom);\n\n if (morphTargets.headUp) {\n Object.keys(morphTargets.headUp).forEach((key) => addKey(key));\n }\n if (morphTargets.headDown) {\n Object.keys(morphTargets.headDown).forEach((key) => addKey(key));\n }\n\n return Array.from(keys);\n }\n\n private collectAvailableHairMorphKeys(): Set<string> {\n const available = new Set<string>();\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) return available;\n\n for (const name of hairMeshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n const dict = mesh?.morphTargetDictionary;\n if (!dict) continue;\n for (const key of Object.keys(dict)) {\n available.add(key);\n }\n }\n\n return available;\n }\n\n private warnMissingHairMorphTargets(): void {\n const missing = this.validateHairMorphTargets();\n if (missing.length === 0) return;\n\n for (const key of missing) {\n if (this.warnedMissingMorphTargets.has(key)) continue;\n this.warnedMissingMorphTargets.add(key);\n console.warn(`[Embody] Hair physics morph \"${key}\" not found on registered hair meshes.`);\n }\n }\n\n setMorphOnMeshes(meshNames: string[], morphKey: string, value: number): void {\n const val = clamp01(value);\n for (const name of meshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n if (!mesh) continue;\n\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n\n const idx = dict[morphKey];\n if (idx !== undefined) {\n infl[idx] = val;\n }\n }\n }\n\n applyHairStateToObject(objectName: string, state: {\n color?: { baseColor: string; emissive: string; emissiveIntensity: number };\n outline?: { show: boolean; color: string; opacity: number };\n visible?: boolean;\n scale?: { x: number; y: number; z: number };\n position?: { x: number; y: number; z: number };\n isEyebrow?: boolean;\n }): void {\n const mesh = this.registeredHairObjects.get(objectName);\n if (!mesh) return;\n\n const obj = mesh;\n\n if (state.visible !== undefined) {\n obj.visible = state.visible;\n }\n\n if (state.scale) {\n obj.scale.set(state.scale.x, state.scale.y, state.scale.z);\n }\n\n if (state.position) {\n obj.position.set(state.position.x, state.position.y, state.position.z);\n }\n\n if (state.color && obj.material && !Array.isArray(obj.material)) {\n const mat = obj.material as typeof obj.material & {\n color?: { set(value: string): void };\n emissive?: { set(value: string): void };\n emissiveIntensity?: number;\n };\n if (mat.color) {\n mat.color.set(state.color.baseColor);\n }\n if (mat.emissive !== undefined) {\n mat.emissive.set(state.color.emissive);\n mat.emissiveIntensity = state.color.emissiveIntensity;\n }\n mat.needsUpdate = true;\n }\n }\n\n private getHairMeshNames(): string[] {\n if (this.cachedHairMeshNames) return this.cachedHairMeshNames;\n\n if (typeof this.host.getSelectedHairMeshNames === 'function') {\n const selectedHairMeshNames = this.host.getSelectedHairMeshNames() || [];\n const resolved = selectedHairMeshNames.filter((name) => {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n return !!mesh;\n });\n this.cachedHairMeshNames = Array.from(new Set(resolved));\n return this.cachedHairMeshNames;\n }\n\n const names: string[] = [];\n this.registeredHairObjects.forEach((mesh, name) => {\n const info = CC4_MESHES[name];\n if (info?.category === 'hair') {\n names.push(name);\n } else if (info?.category !== 'eyebrow') {\n const dict = mesh.morphTargetDictionary;\n if (dict && ('L_Hair_Left' in dict || 'L_Hair_Right' in dict || 'L_Hair_Front' in dict)) {\n names.push(name);\n }\n }\n });\n this.cachedHairMeshNames = names;\n return names;\n }\n\n refreshMeshSelection(): void {\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n }\n\n private supportsMixerClips(): boolean {\n return typeof this.host.buildClip === 'function';\n }\n\n private startIdleClip(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const cfg = this.hairPhysicsConfig;\n const hasWind = cfg.windStrength > 0;\n const hasIdle = cfg.idleSwayAmount > 0;\n if (!hasWind && !hasIdle) {\n this.stopIdleClip();\n this.idleClipDirty = false;\n return;\n }\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopIdleClip();\n this.idleClipDirty = false;\n return;\n }\n\n if (!this.idleClipDirty && this.idleClipHandle) return;\n\n this.stopIdleClip();\n\n const duration = Math.max(0.5, cfg.idleClipDuration);\n const curves = this.buildIdleWindCurves(duration);\n const handle = this.host.buildClip?.(this.idleClipName, curves, {\n loop: true,\n loopMode: 'repeat',\n meshNames: hairMeshNames,\n });\n\n if (!handle) return;\n\n handle.setWeight?.(1);\n this.idleClipHandle = handle;\n this.idleClipDirty = false;\n }\n\n private startGravityClip(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopGravityClip();\n this.gravityClipDirty = false;\n return;\n }\n\n if (!this.gravityClipDirty && this.gravityClipHandle) return;\n\n this.stopGravityClip();\n\n const curves = this.buildGravityCurves();\n if (Object.keys(curves).length === 0) return;\n\n const handle = this.host.buildClip?.(this.gravityClipName, curves, {\n loop: false,\n loopMode: 'once',\n meshNames: hairMeshNames,\n });\n\n if (!handle) return;\n\n handle.setWeight?.(1);\n handle.pause();\n handle.setTime?.(0.5);\n this.gravityClipHandle = handle;\n this.gravityClipDirty = false;\n }\n\n private stopIdleClip(): void {\n if (this.idleClipHandle) {\n const clipName = this.idleClipHandle.clipName;\n this.idleClipHandle.stop();\n this.host.cleanupSnippet?.(clipName);\n this.idleClipHandle = null;\n } else {\n this.host.cleanupSnippet?.(this.idleClipName);\n }\n }\n\n private stopGravityClip(): void {\n if (this.gravityClipHandle) {\n const clipName = this.gravityClipHandle.clipName;\n this.gravityClipHandle.stop();\n this.host.cleanupSnippet?.(clipName);\n this.gravityClipHandle = null;\n } else {\n this.host.cleanupSnippet?.(this.gravityClipName);\n }\n }\n\n private buildImpulseClips(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopImpulseClips();\n this.impulseClipDirty = false;\n return;\n }\n\n if (!this.impulseClipDirty && this.impulseClips.left && this.impulseClips.right && this.impulseClips.front) {\n return;\n }\n\n this.stopImpulseClips();\n\n const duration = Math.max(0.25, this.hairPhysicsConfig.impulseClipDuration);\n const options: ClipOptions = {\n loop: false,\n loopMode: 'once',\n meshNames: hairMeshNames,\n };\n\n const leftHandle = this.host.buildClip?.(\n this.impulseClipNames.left,\n this.buildImpulseCurves(duration, 1, 0),\n options\n );\n const rightHandle = this.host.buildClip?.(\n this.impulseClipNames.right,\n this.buildImpulseCurves(duration, -1, 0),\n options\n );\n const frontHandle = this.host.buildClip?.(\n this.impulseClipNames.front,\n this.buildImpulseCurves(duration, 0, 1),\n options\n );\n\n const primeHandle = (handle: ClipHandle | null | undefined) => {\n if (!handle) return;\n handle.setWeight?.(0);\n handle.pause();\n handle.setTime?.(0);\n };\n\n primeHandle(leftHandle);\n primeHandle(rightHandle);\n primeHandle(frontHandle);\n\n this.impulseClips = {\n left: leftHandle ?? undefined,\n right: rightHandle ?? undefined,\n front: frontHandle ?? undefined,\n };\n this.impulseClipDirty = false;\n }\n\n private stopImpulseClips(): void {\n this.clearImpulseTimers();\n const handles = Object.values(this.impulseClips);\n for (const handle of handles) {\n if (!handle) continue;\n const clipName = handle.clipName;\n handle.stop();\n this.host.cleanupSnippet?.(clipName);\n }\n this.impulseClips = {};\n }\n\n private clearImpulseTimers(slot?: 'left' | 'right' | 'front'): void {\n const slots: Array<'left' | 'right' | 'front'> = slot ? [slot] : ['left', 'right', 'front'];\n for (const key of slots) {\n const endTimer = this.impulseEndTimers[key];\n if (endTimer) {\n clearTimeout(endTimer);\n delete this.impulseEndTimers[key];\n }\n const steps = this.impulseFadeSteps[key];\n if (steps && steps.length > 0) {\n steps.forEach((t) => clearTimeout(t));\n delete this.impulseFadeSteps[key];\n }\n }\n }\n\n private triggerHeadImpulse(headYaw: number, headPitch: number): void {\n const cfg = this.hairPhysicsConfig;\n const signedYaw = headYaw * cfg.direction.yawSign;\n const signedPitch = headPitch * cfg.direction.pitchSign;\n const horizontal = signedYaw * cfg.inertia * cfg.responseScale;\n const vertical = signedPitch * cfg.gravity * 0.25 * cfg.responseScale;\n\n if (!this.hasHeadState) {\n this.hasHeadState = true;\n this.lastHeadHorizontal = horizontal;\n this.lastHeadVertical = vertical;\n return;\n }\n\n const deltaHorizontal = horizontal - this.lastHeadHorizontal;\n const deltaVertical = vertical - this.lastHeadVertical;\n this.lastHeadHorizontal = horizontal;\n this.lastHeadVertical = vertical;\n\n const leftWeight = clamp01(deltaHorizontal > 0 ? deltaHorizontal : 0);\n const rightWeight = clamp01(deltaHorizontal < 0 ? -deltaHorizontal : 0);\n const frontWeight = clamp01(deltaVertical > 0 ? deltaVertical : 0);\n const minTrigger = 0.01;\n\n if (leftWeight <= minTrigger && rightWeight <= minTrigger && frontWeight <= minTrigger) return;\n\n if (this.impulseClipDirty) {\n this.buildImpulseClips();\n }\n\n if (leftWeight > minTrigger) this.playImpulseClip('left', leftWeight);\n if (rightWeight > minTrigger) this.playImpulseClip('right', rightWeight);\n if (frontWeight > minTrigger) this.playImpulseClip('front', frontWeight);\n }\n\n private updateGravityFromHeadPitch(headPitch: number): void {\n if (!this.gravityClipHandle || this.gravityClipDirty) {\n this.startGravityClip();\n }\n if (!this.gravityClipHandle) return;\n\n const signedPitch = headPitch * this.hairPhysicsConfig.direction.pitchSign;\n const clampedPitch = Math.max(-1, Math.min(1, signedPitch));\n const normalized = (clampedPitch + 1) / 2;\n const duration = this.gravityClipHandle.getDuration?.() ?? 1;\n this.gravityClipHandle.setTime?.(normalized * duration);\n }\n\n private playImpulseClip(slot: 'left' | 'right' | 'front', weight: number): void {\n const handle = this.impulseClips[slot];\n if (!handle) return;\n this.clearImpulseTimers(slot);\n handle.setWeight?.(weight);\n handle.play();\n const durationSec = handle.getDuration?.() ?? this.hairPhysicsConfig.impulseClipDuration;\n const durationMs = Math.max(0, durationSec) * 1000;\n const fadeMs = Math.max(80, Math.min(350, durationMs * 0.2));\n this.impulseEndTimers[slot] = setTimeout(() => {\n this.fadeImpulseClip(slot, weight, fadeMs);\n }, durationMs);\n }\n\n private fadeImpulseClip(slot: 'left' | 'right' | 'front', startWeight: number, fadeMs: number): void {\n const handle = this.impulseClips[slot];\n if (!handle) return;\n if (fadeMs <= 0) {\n handle.setWeight?.(0);\n handle.pause();\n handle.setTime?.(0);\n return;\n }\n\n const steps = 6;\n const stepMs = fadeMs / steps;\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n for (let i = 1; i <= steps; i += 1) {\n const timer = setTimeout(() => {\n const nextWeight = startWeight * (1 - i / steps);\n handle.setWeight?.(nextWeight);\n if (i === steps) {\n handle.pause();\n handle.setTime?.(0);\n }\n }, stepMs * i);\n timers.push(timer);\n }\n\n this.impulseFadeSteps[slot] = timers;\n }\n\n private buildIdleWindCurves(durationSec: number): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_idle_curves(JSON.stringify(this.hairCurveConfigJson()), durationSec)\n ) as CurvesMap;\n }\n\n private buildImpulseCurves(durationSec: number, horizontal: number, vertical: number): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_impulse_curves(\n JSON.stringify(this.hairCurveConfigJson()),\n durationSec,\n horizontal,\n vertical\n )\n ) as CurvesMap;\n }\n\n private buildGravityCurves(): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_gravity_curves(JSON.stringify(this.hairCurveConfigJson()))\n ) as CurvesMap;\n }\n\n private hairCurveConfigJson() {\n const cfg = this.hairPhysicsConfig;\n return {\n idleSwayAmount: cfg.idleSwayAmount,\n idleSwaySpeed: cfg.idleSwaySpeed,\n windStrength: cfg.windStrength,\n windDirectionX: cfg.windDirectionX,\n windDirectionZ: cfg.windDirectionZ,\n windTurbulence: cfg.windTurbulence,\n windFrequency: cfg.windFrequency,\n stiffness: cfg.stiffness,\n damping: cfg.damping,\n morphTargets: cfg.morphTargets,\n };\n }\n\n}\n","import type { Profile } from './types';\nimport { initEmbodyCore } from '../wasm';\nimport type { EmbodyCoreWasmModule } from '../wasmTypes';\n\n/**\n * Extend a base preset with a profile extension.\n *\n * Implemented by the Rust Wasm core.\n *\n * Rules:\n * - Scalars: extension wins when provided.\n * - Maps: shallow-merged by key, values cloned.\n * - Mesh entries: merged by mesh name, including nested material settings.\n * - Arrays: replaced when the extension provides them (except annotationRegions).\n * - annotationRegions: merged by region name, with nested camera/style fields preserved.\n */\nexport function mergePresetWithProfile(\n core: EmbodyCoreWasmModule,\n base: Profile,\n extension?: Partial<Profile>\n): Profile {\n if (!extension) {\n return base;\n }\n\n return JSON.parse(\n core.merge_preset_profile(JSON.stringify(base), JSON.stringify(extension))\n ) as Profile;\n}\n\n/** Resolve a preset/profile pair through this package entry's Wasm loader. */\nexport async function extendPresetWithProfile(\n base: Profile,\n extension?: Partial<Profile>\n): Promise<Profile> {\n return mergePresetWithProfile(await initEmbodyCore(), base, extension);\n}\n","/**\n * Betta Fish Preset - Skeletal Animation Mappings\n *\n * Bone mappings for the betta fish model from Sketchfab.\n * This fish has 53 bones and 1 embedded animation (\"Take 01\" swimming).\n * No morph targets/blend shapes - all animation is skeletal.\n *\n * Bone structure (inferred from hierarchy):\n * - Armature_rootJoint: Root\n * - Bone_Armature: Main body root\n * - Bone.001_Armature: Head/Front body\n * - Bone.009-017: Likely eyes/gills area (left/right symmetry)\n * - Bone.002_Armature: Body spine chain\n * - Bone.003 → 004 → 005: Body to tail\n * - Bone.018-045: Tail fins (multiple branching chains)\n * - Bone.046/047: Pectoral fins (left/right)\n * - Bone.006_Armature: Dorsal fin area\n * - Bone.007/008: Dorsal fin bones\n */\n\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\nimport type { AnnotationRegion, MeshInfo, MeshCategory, Profile } from '../mappings/types';\nimport { checkBindingsForLeftRight } from './cc4';\n\n// ============================================================================\n// BONE NAMES - All 53 bones in the fish skeleton\n// Note: Bone names in the GLTF use dots (e.g., \"Bone.001_Armature\")\n// ============================================================================\n\nexport const BONES = [\n \"Armature_rootJoint\",\n \"Bone_Armature\",\n \"Bone.001_Armature\",\n \"Bone.009_Armature\",\n \"Bone.027_Armature\",\n \"Bone.029_Armature\",\n \"Bone.031_Armature\",\n \"Bone.028_Armature\",\n \"Bone.030_Armature\",\n \"Bone.032_Armature\",\n \"Bone.010_Armature\",\n \"Bone.012_Armature\",\n \"Bone.014_Armature\",\n \"Bone.016_Armature\",\n \"Bone.011_Armature\",\n \"Bone.013_Armature\",\n \"Bone.015_Armature\",\n \"Bone.017_Armature\",\n \"Bone.002_Armature\",\n \"Bone.003_Armature\",\n \"Bone.004_Armature\",\n \"Bone.005_Armature\",\n \"Bone.020_Armature\",\n \"Bone.025_Armature\",\n \"Bone.026_Armature\",\n \"Bone.039_Armature\",\n \"Bone.040_Armature\",\n \"Bone.041_Armature\",\n \"Bone.042_Armature\",\n \"Bone.043_Armature\",\n \"Bone.044_Armature\",\n \"Bone.045_Armature\",\n \"Bone.019_Armature\",\n \"Bone.023_Armature\",\n \"Bone.024_Armature\",\n \"Bone.034_Armature\",\n \"Bone.036_Armature\",\n \"Bone.038_Armature\",\n \"Bone.018_Armature\",\n \"Bone.021_Armature\",\n \"Bone.022_Armature\",\n \"Bone.033_Armature\",\n \"Bone.035_Armature\",\n \"Bone.037_Armature\",\n \"Bone.046_Armature\",\n \"Bone.048_Armature\",\n \"Bone.050_Armature\",\n \"Bone.047_Armature\",\n \"Bone.049_Armature\",\n \"Bone.051_Armature\",\n \"Bone.006_Armature\",\n \"Bone.007_Armature\",\n \"Bone.008_Armature\"\n] as const;\n\n// ============================================================================\n// BONE NAME CONFIGURATION\n// Uses prefix/suffix system: 'Bone.' + baseNumber + '_Armature' = 'Bone.001_Armature'\n// ============================================================================\n\nexport const BONE_PREFIX = 'Bone.';\nexport const BONE_SUFFIX = '_Armature';\n\n// ============================================================================\n// SEMANTIC BONE MAPPINGS - Human-readable names for key bones\n// Uses base names that get combined with prefix/suffix\n// Exception: ROOT, BODY_ROOT, and EYE nodes use full names (don't follow pattern)\n// ============================================================================\n\nexport const BONE_NODES = {\n // Root bones (special - don't use prefix/suffix)\n ROOT: 'Armature_rootJoint',\n BODY_ROOT: 'Bone_Armature',\n\n // Head and body (use base names)\n HEAD: '001',\n BODY_FRONT: '002',\n BODY_MID: '003',\n BODY_BACK: '004',\n TAIL_BASE: '005',\n\n // Gills - bilateral (even = left, odd = right)\n GILL_L: '046',\n GILL_L_MID: '048',\n GILL_L_TIP: '050',\n GILL_R: '047',\n GILL_R_MID: '049',\n GILL_R_TIP: '051',\n\n // Dorsal fin (top fin)\n DORSAL_ROOT: '006',\n DORSAL_L: '007',\n DORSAL_R: '008',\n\n // Ventral fins (belly fins)\n VENTRAL_L: '018',\n VENTRAL_L_MID: '021',\n VENTRAL_L_TIP: '022',\n VENTRAL_R: '033',\n VENTRAL_R_MID: '035',\n VENTRAL_R_TIP: '037',\n\n // Pectoral fins - left side chain\n PECTORAL_L_ROOT: '009',\n PECTORAL_L_CHAIN1: '027',\n PECTORAL_L_CHAIN1_MID: '029',\n PECTORAL_L_CHAIN1_TIP: '031',\n PECTORAL_L_CHAIN2: '028',\n PECTORAL_L_CHAIN2_MID: '030',\n PECTORAL_L_CHAIN2_TIP: '032',\n\n // Pectoral fins - right side chain\n PECTORAL_R_ROOT: '010',\n PECTORAL_R_CHAIN1: '012',\n PECTORAL_R_CHAIN1_A: '014',\n PECTORAL_R_CHAIN1_B: '016',\n PECTORAL_R_ROOT2: '011',\n PECTORAL_R_CHAIN2: '013',\n PECTORAL_R_CHAIN2_A: '015',\n PECTORAL_R_CHAIN2_B: '017',\n\n // Eyes (special - mesh name, not bone)\n EYE_L: 'EYES_0',\n EYE_R: 'EYES_0',\n\n // Main tail fins\n TAIL_TOP: '020',\n TAIL_TOP_MID: '025',\n TAIL_TOP_TIP: '026',\n TAIL_MID: '039',\n TAIL_MID_A: '040',\n TAIL_MID_A_TIP: '041',\n TAIL_MID_B: '042',\n TAIL_MID_B_TIP: '043',\n TAIL_MID_C: '044',\n TAIL_MID_C_TIP: '045',\n\n // Side tail chains\n TAIL_SIDE_L: '019',\n TAIL_SIDE_L_MID: '023',\n TAIL_SIDE_L_TIP: '024',\n TAIL_SIDE_R: '034',\n TAIL_SIDE_R_MID: '036',\n TAIL_SIDE_R_TIP: '038',\n} as const;\n\n// ============================================================================\n// AU ID CONSTANTS - Fish \"Action Units\" (analogous to FACS AUs for humans)\n// These use plain numbers like CC4 preset - no special fish-specific types\n// ============================================================================\n\n// Body orientation (AU 2-7)\n// 2 = Turn Left, 3 = Turn Right\n// 4 = Pitch Up, 5 = Pitch Down\n// 6 = Roll Left, 7 = Roll Right\n\n// Tail movements (AU 12-15)\n// 12 = Tail Sweep Left, 13 = Tail Sweep Right\n// 14 = Tail Fin Spread, 15 = Tail Fin Close\n\n// Pectoral fins (AU 20-27)\n// 20 = Pectoral L Up, 21 = Pectoral L Down\n// 22 = Pectoral R Up, 23 = Pectoral R Down\n// 24 = Pectoral L Forward, 25 = Pectoral L Back\n// 26 = Pectoral R Forward, 27 = Pectoral R Back\n\n// Ventral fins (AU 30-33)\n// 30 = Ventral L Up, 31 = Ventral L Down\n// 32 = Ventral R Up, 33 = Ventral R Down\n\n// Head (AU 51-54, matching FACS standard)\n// 51 = Head Turn Left, 52 = Head Turn Right\n// 53 = Head Up, 54 = Head Down\n// (AU 55/56 Head Tilt removed - fish don't have this motion)\n\n// Gills (AU 45-46) - separate L/R, single AU per side (0=closed, 1=flared)\n// 45 = Gill L, 46 = Gill R\n\n// Eye rotation (AU 61-64, like human FACS)\n// 61 = Eyes Left, 62 = Eyes Right\n// 63 = Eyes Up, 64 = Eyes Down\n\n// ============================================================================\n// BONE BINDINGS - Map AU IDs to bone rotations\n// ============================================================================\n\nexport const BONE_BINDINGS: Record<number, BoneBinding[]> = {\n // ========== BODY ORIENTATION (AU 2-7) ==========\n // AU 2: Turn Left\n 2: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: 1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n // AU 3: Turn Right\n 3: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: -1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n // AU 4: Pitch Up\n 4: [\n { node: 'HEAD', channel: 'rx', scale: -1, maxDegrees: 20 },\n { node: 'BODY_FRONT', channel: 'rx', scale: -1, maxDegrees: 5 },\n ],\n // AU 5: Pitch Down\n 5: [\n { node: 'HEAD', channel: 'rx', scale: 1, maxDegrees: 20 },\n { node: 'BODY_FRONT', channel: 'rx', scale: 1, maxDegrees: 5 },\n ],\n // AU 6: Roll Left\n 6: [\n { node: 'BODY_ROOT', channel: 'rz', scale: -1, maxDegrees: 25 },\n ],\n // AU 7: Roll Right\n 7: [\n { node: 'BODY_ROOT', channel: 'rz', scale: 1, maxDegrees: 25 },\n ],\n\n // ========== TAIL (AU 12-15) ==========\n // Tail sweep uses rz (roll axis) to sweep left/right in fish's local space\n // AU 12: Tail Sweep Left\n 12: [\n { node: 'BODY_BACK', channel: 'rz', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_BASE', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'TAIL_TOP', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'TAIL_MID', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 13: Tail Sweep Right\n 13: [\n { node: 'BODY_BACK', channel: 'rz', scale: -1, maxDegrees: 15 },\n { node: 'TAIL_BASE', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'TAIL_TOP', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'TAIL_MID', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n // Tail fin spread/close (fan motion)\n // AU 14: Tail Fin Spread\n 14: [\n { node: 'TAIL_TOP', channel: 'rx', scale: -1, maxDegrees: 20 },\n { node: 'TAIL_SIDE_L', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_SIDE_R', channel: 'rx', scale: -1, maxDegrees: 15 },\n ],\n // AU 15: Tail Fin Close\n 15: [\n { node: 'TAIL_TOP', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_SIDE_L', channel: 'rx', scale: -1, maxDegrees: 12 },\n { node: 'TAIL_SIDE_R', channel: 'rx', scale: 1, maxDegrees: 12 },\n ],\n\n // ========== PECTORAL FINS (AU 20-27, front/head fins) ==========\n // These are the decorative fins attached to the head (bones 009-017)\n // AU 20: Pectoral L Up\n 20: [\n { node: 'PECTORAL_L_ROOT', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'PECTORAL_L_CHAIN1', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'PECTORAL_L_CHAIN2', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 21: Pectoral L Down\n 21: [\n { node: 'PECTORAL_L_ROOT', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'PECTORAL_L_CHAIN1', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'PECTORAL_L_CHAIN2', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n // AU 22: Pectoral R Up\n 22: [\n { node: 'PECTORAL_R_ROOT', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'PECTORAL_R_CHAIN1', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'PECTORAL_R_ROOT2', channel: 'rz', scale: -1, maxDegrees: 40 },\n ],\n // AU 23: Pectoral R Down\n 23: [\n { node: 'PECTORAL_R_ROOT', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'PECTORAL_R_CHAIN1', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'PECTORAL_R_ROOT2', channel: 'rz', scale: 1, maxDegrees: 40 },\n ],\n // AU 24: Pectoral L Forward\n 24: [\n { node: 'PECTORAL_L_ROOT', channel: 'ry', scale: 1, maxDegrees: 30 },\n ],\n // AU 25: Pectoral L Back\n 25: [\n { node: 'PECTORAL_L_ROOT', channel: 'ry', scale: -1, maxDegrees: 30 },\n ],\n // AU 26: Pectoral R Forward\n 26: [\n { node: 'PECTORAL_R_ROOT', channel: 'ry', scale: -1, maxDegrees: 30 },\n ],\n // AU 27: Pectoral R Back\n 27: [\n { node: 'PECTORAL_R_ROOT', channel: 'ry', scale: 1, maxDegrees: 30 },\n ],\n\n // ========== VENTRAL FINS (AU 30-33, belly fins) ==========\n // AU 30: Ventral L Up\n 30: [\n { node: 'VENTRAL_L', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'VENTRAL_L_MID', channel: 'rz', scale: 1, maxDegrees: 15 },\n ],\n // AU 31: Ventral L Down\n 31: [\n { node: 'VENTRAL_L', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'VENTRAL_L_MID', channel: 'rz', scale: -1, maxDegrees: 15 },\n ],\n // AU 32: Ventral R Up\n 32: [\n { node: 'VENTRAL_R', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'VENTRAL_R_MID', channel: 'rz', scale: -1, maxDegrees: 15 },\n ],\n // AU 33: Ventral R Down\n 33: [\n { node: 'VENTRAL_R', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'VENTRAL_R_MID', channel: 'rz', scale: 1, maxDegrees: 15 },\n ],\n\n // ========== GILLS (AU 45-46, separate L/R - 0=closed, 1=flared) ==========\n // AU 45: Gill L\n 45: [\n { node: 'GILL_L', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'GILL_L_MID', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 46: Gill R\n 46: [\n { node: 'GILL_R', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'GILL_R_MID', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n\n // ========== HEAD (AU 51-56, matching FACS standard) ==========\n // AU 51: Head Turn Left\n 51: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: 1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n // AU 52: Head Turn Right\n 52: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: -1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n // AU 53: Head Up\n 53: [\n { node: 'DORSAL_ROOT', channel: 'rx', scale: -1, maxDegrees: 25 },\n { node: 'DORSAL_L', channel: 'rx', scale: -1, maxDegrees: 15 },\n { node: 'DORSAL_R', channel: 'rx', scale: -1, maxDegrees: 15 },\n ],\n // AU 54: Head Down\n 54: [\n { node: 'DORSAL_ROOT', channel: 'rx', scale: 1, maxDegrees: 25 },\n { node: 'DORSAL_L', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'DORSAL_R', channel: 'rx', scale: 1, maxDegrees: 15 },\n ],\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // ========== EYES (AU 61-64, rotate the EYES_0 mesh) ==========\n // Fish has a single combined eyes mesh - both eyes rotate together\n // AU 61: Eyes Left\n 61: [\n { node: 'EYE_L', channel: 'ry', scale: 1, maxDegrees: 25 }, // Look left (yaw)\n ],\n // AU 62: Eyes Right\n 62: [\n { node: 'EYE_L', channel: 'ry', scale: -1, maxDegrees: 25 }, // Look right (yaw)\n ],\n // AU 63: Eyes Up\n 63: [\n { node: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 20 }, // Look up (pitch)\n ],\n // AU 64: Eyes Down\n 64: [\n { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 20 }, // Look down (pitch)\n ],\n};\n\n// ============================================================================\n// FISH AU INFO - Metadata for each action (compatible with loomlarge AUInfo)\n// facePart is used to group controls in the UI\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Body Orientation\n '2': { id: '2', name: 'Turn Left', facePart: 'Body Orientation', muscularBasis: 'Myomere muscles', links: ['https://en.wikipedia.org/wiki/Myomere'] },\n '3': { id: '3', name: 'Turn Right', facePart: 'Body Orientation', muscularBasis: 'Myomere muscles', links: ['https://en.wikipedia.org/wiki/Myomere'] },\n '4': { id: '4', name: 'Pitch Up', facePart: 'Body Orientation', muscularBasis: 'Epaxial muscles', links: ['https://en.wikipedia.org/wiki/Epaxial_muscles'] },\n '5': { id: '5', name: 'Pitch Down', facePart: 'Body Orientation', muscularBasis: 'Hypaxial muscles', links: ['https://en.wikipedia.org/wiki/Hypaxial_muscles'] },\n '6': { id: '6', name: 'Roll Left', facePart: 'Body Orientation', muscularBasis: 'Lateral body muscles', links: ['https://en.wikipedia.org/wiki/Fish_locomotion'] },\n '7': { id: '7', name: 'Roll Right', facePart: 'Body Orientation', muscularBasis: 'Lateral body muscles', links: ['https://en.wikipedia.org/wiki/Fish_locomotion'] },\n\n // Tail (Caudal fin)\n '12': { id: '12', name: 'Tail Sweep Left', facePart: 'Caudal Fin', muscularBasis: 'Caudal fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '13': { id: '13', name: 'Tail Sweep Right', facePart: 'Caudal Fin', muscularBasis: 'Caudal fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '14': { id: '14', name: 'Tail Fin Spread', facePart: 'Caudal Fin', muscularBasis: 'Fin ray muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '15': { id: '15', name: 'Tail Fin Close', facePart: 'Caudal Fin', muscularBasis: 'Fin ray muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n\n // Pectoral Fins (side fins for steering and braking)\n '20': { id: '20', name: 'Pectoral L Up', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '21': { id: '21', name: 'Pectoral L Down', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '22': { id: '22', name: 'Pectoral R Up', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '23': { id: '23', name: 'Pectoral R Down', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '24': { id: '24', name: 'Pectoral L Forward', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '25': { id: '25', name: 'Pectoral L Back', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '26': { id: '26', name: 'Pectoral R Forward', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '27': { id: '27', name: 'Pectoral R Back', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n\n // Ventral/Pelvic Fins (belly fins for stability)\n '30': { id: '30', name: 'Ventral L Up', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '31': { id: '31', name: 'Ventral L Down', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '32': { id: '32', name: 'Ventral R Up', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '33': { id: '33', name: 'Ventral R Down', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n\n // Gills (separate L/R - single AU per side, 0=closed, 1=flared)\n '45': { id: '45', name: 'Gill L', facePart: 'Gills', muscularBasis: 'Opercular muscles', links: ['https://en.wikipedia.org/wiki/Operculum_(fish)'] },\n '46': { id: '46', name: 'Gill R', facePart: 'Gills', muscularBasis: 'Opercular muscles', links: ['https://en.wikipedia.org/wiki/Operculum_(fish)'] },\n\n // Head (AU 51-56, matching FACS standard)\n '51': { id: '51', name: 'Head Turn Left', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '52': { id: '52', name: 'Head Turn Right', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '53': { id: '53', name: 'Head Up', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '54': { id: '54', name: 'Head Down', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // Eye movement (similar to human AU 61-64)\n '61': { id: '61', name: 'Eyes Left', facePart: 'Eyes', muscularBasis: 'Extraocular muscles', links: ['https://en.wikipedia.org/wiki/Extraocular_muscles'] },\n '62': { id: '62', name: 'Eyes Right', facePart: 'Eyes', muscularBasis: 'Extraocular muscles', links: ['https://en.wikipedia.org/wiki/Extraocular_muscles'] },\n '63': { id: '63', name: 'Eyes Up', facePart: 'Eyes', muscularBasis: 'Superior rectus', links: ['https://en.wikipedia.org/wiki/Superior_rectus_muscle'] },\n '64': { id: '64', name: 'Eyes Down', facePart: 'Eyes', muscularBasis: 'Inferior rectus', links: ['https://en.wikipedia.org/wiki/Inferior_rectus_muscle'] },\n};\n\n// ============================================================================\n// CONTINUUM PAIRS - Define which AUs form bidirectional pairs for sliders\n// ============================================================================\n\n/**\n * Continuum pairs - maps AU ID to its partner for bidirectional sliders\n * Format matches loomlarge's CONTINUUM_PAIRS_MAP (animal-agnostic)\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n}> = {\n // Body Orientation (AU 2-7)\n 2: { pairId: 3, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Turn Left ↔ Turn Right\n 3: { pairId: 2, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 5: { pairId: 4, isNegative: true, axis: 'pitch', node: 'HEAD' }, // Pitch Down ↔ Pitch Up\n 4: { pairId: 5, isNegative: false, axis: 'pitch', node: 'HEAD' },\n 6: { pairId: 7, isNegative: true, axis: 'roll', node: 'BODY_ROOT' }, // Roll Left ↔ Roll Right\n 7: { pairId: 6, isNegative: false, axis: 'roll', node: 'BODY_ROOT' },\n\n // Tail (AU 12-15)\n 12: { pairId: 13, isNegative: true, axis: 'roll', node: 'TAIL_BASE' }, // Tail Sweep Left ↔ Right\n 13: { pairId: 12, isNegative: false, axis: 'roll', node: 'TAIL_BASE' },\n 15: { pairId: 14, isNegative: true, axis: 'pitch', node: 'TAIL_TOP' }, // Tail Fin Close ↔ Spread\n 14: { pairId: 15, isNegative: false, axis: 'pitch', node: 'TAIL_TOP' },\n\n // Pectoral Fins (AU 20-27)\n 21: { pairId: 20, isNegative: true, axis: 'roll', node: 'PECTORAL_L_ROOT' }, // Pectoral L Down ↔ Up\n 20: { pairId: 21, isNegative: false, axis: 'roll', node: 'PECTORAL_L_ROOT' },\n 25: { pairId: 24, isNegative: true, axis: 'yaw', node: 'PECTORAL_L_ROOT' }, // Pectoral L Back ↔ Forward\n 24: { pairId: 25, isNegative: false, axis: 'yaw', node: 'PECTORAL_L_ROOT' },\n 23: { pairId: 22, isNegative: true, axis: 'roll', node: 'PECTORAL_R_ROOT' }, // Pectoral R Down ↔ Up\n 22: { pairId: 23, isNegative: false, axis: 'roll', node: 'PECTORAL_R_ROOT' },\n 27: { pairId: 26, isNegative: true, axis: 'yaw', node: 'PECTORAL_R_ROOT' }, // Pectoral R Back ↔ Forward\n 26: { pairId: 27, isNegative: false, axis: 'yaw', node: 'PECTORAL_R_ROOT' },\n\n // Ventral Fins (AU 30-33)\n 31: { pairId: 30, isNegative: true, axis: 'roll', node: 'VENTRAL_L' }, // Ventral L Down ↔ Up\n 30: { pairId: 31, isNegative: false, axis: 'roll', node: 'VENTRAL_L' },\n 33: { pairId: 32, isNegative: true, axis: 'roll', node: 'VENTRAL_R' }, // Ventral R Down ↔ Up\n 32: { pairId: 33, isNegative: false, axis: 'roll', node: 'VENTRAL_R' },\n\n // Head (AU 51-56, matching FACS standard)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Head Turn Left ↔ Right\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: 'DORSAL_ROOT' }, // Head Down ↔ Up\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: 'DORSAL_ROOT' },\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // Gills (AU 45-46) are NOT in continuum - they're single AUs (0=closed, 1=flared)\n // Each side is independent, not paired opposites\n\n // Eye movement (AU 61-64)\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Eyes Left ↔ Right\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: 'HEAD' }, // Eyes Down ↔ Up\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: 'HEAD' },\n};\n\n/**\n * Build continuum label from AU names.\n * Finds common prefix between AU names and extracts the differing part.\n * E.g. \"Head Turn Left\" + \"Head Turn Right\" → \"Head Turn — Left ↔ Right\"\n */\nfunction buildContinuumLabel(negativeAU: AUInfo, positiveAU: AUInfo): string {\n const negName = negativeAU.name;\n const posName = positiveAU.name;\n\n // Find common prefix (word-level)\n const negWords = negName.split(' ');\n const posWords = posName.split(' ');\n\n let commonPrefixWords: string[] = [];\n for (let i = 0; i < Math.min(negWords.length, posWords.length); i++) {\n if (negWords[i] === posWords[i]) {\n commonPrefixWords.push(negWords[i]);\n } else {\n break;\n }\n }\n\n const prefix = commonPrefixWords.join(' ');\n const negSuffix = negWords.slice(commonPrefixWords.length).join(' ');\n const posSuffix = posWords.slice(commonPrefixWords.length).join(' ');\n\n if (prefix && negSuffix && posSuffix) {\n return `${prefix} — ${negSuffix} ↔ ${posSuffix}`;\n }\n\n // Fallback: just combine the names\n return `${negName} ↔ ${posName}`;\n}\n\n/**\n * Get continuum label for a pair, derived from AU_INFO.\n * No need for a separate CONTINUUM_LABELS object.\n */\nexport function getContinuumLabelForPair(negativeId: number, positiveId: number): string {\n const negAU = AU_INFO[String(negativeId)];\n const posAU = AU_INFO[String(positiveId)];\n\n if (!negAU || !posAU) {\n return `AU ${negativeId} ↔ AU ${positiveId}`;\n }\n\n return buildContinuumLabel(negAU, posAU);\n}\n\n/**\n * Build all continuum labels from AU_INFO and CONTINUUM_PAIRS_MAP.\n * This replaces the need for a manually-maintained CONTINUUM_LABELS object.\n */\nexport function buildContinuumLabels(): Record<string, string> {\n const labels: Record<string, string> = {};\n const seen = new Set<string>();\n\n for (const [auIdStr, info] of Object.entries(CONTINUUM_PAIRS_MAP)) {\n if (info.isNegative) {\n const negId = Number(auIdStr);\n const posId = info.pairId;\n const key = `${negId}-${posId}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n labels[key] = getContinuumLabelForPair(negId, posId);\n }\n }\n }\n\n return labels;\n}\n\n// Build labels dynamically from AU_INFO (no separate CONTINUUM_LABELS needed)\nexport const CONTINUUM_LABELS = buildContinuumLabels();\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Defines how AUs map to bone rotation axes\n// This is required for the engine to properly apply bone rotations\n// Uses plain AU ID numbers (animal-agnostic, like CC4 preset)\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n // ========== HEAD & BODY - Combined entry per node (like CC4) ==========\n // AU 51/52 = Head Turn Left/Right (yaw)\n // AU 53/54 = Head Up/Down (pitch) - note: pitch on HEAD is from body AUs 4/5\n // No head tilt for fish - removed AU 55/56\n {\n node: 'HEAD',\n pitch: { aus: [4, 5], axis: 'rx', negative: 5, positive: 4 }, // Body Pitch Up/Down\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_FRONT',\n pitch: { aus: [4, 5], axis: 'rx', negative: 5, positive: 4 }, // Body Pitch Up/Down\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_MID',\n pitch: null,\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_ROOT',\n pitch: null,\n yaw: null,\n roll: { aus: [6, 7], axis: 'rz', negative: 6, positive: 7 }, // Body Roll Left/Right\n },\n\n // ========== TAIL (AU 12-15) ==========\n // Tail sweep uses rz (roll axis) to sweep left/right in fish's local space\n {\n node: 'TAIL_BASE',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 }, // Tail Sweep Left/Right\n },\n {\n node: 'BODY_BACK',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n {\n node: 'TAIL_TOP',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 }, // Tail Fin Spread/Close\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n {\n node: 'TAIL_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n // Side tail fins for spread/close\n {\n node: 'TAIL_SIDE_L',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 },\n yaw: null,\n roll: null,\n },\n {\n node: 'TAIL_SIDE_R',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 },\n yaw: null,\n roll: null,\n },\n\n // ========== PECTORAL FINS (AU 20-27, head-attached decorative fins) ==========\n {\n node: 'PECTORAL_L_ROOT',\n pitch: null,\n yaw: { aus: [24, 25], axis: 'ry', negative: 25, positive: 24 }, // Pectoral L Forward/Back\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 }, // Pectoral L Up/Down\n },\n {\n node: 'PECTORAL_L_CHAIN1',\n pitch: null,\n yaw: null,\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 },\n },\n {\n node: 'PECTORAL_L_CHAIN2',\n pitch: null,\n yaw: null,\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 },\n },\n {\n node: 'PECTORAL_R_ROOT',\n pitch: null,\n yaw: { aus: [26, 27], axis: 'ry', negative: 27, positive: 26 }, // Pectoral R Forward/Back\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 }, // Pectoral R Up/Down\n },\n {\n node: 'PECTORAL_R_ROOT2',\n pitch: null,\n yaw: null,\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 },\n },\n {\n node: 'PECTORAL_R_CHAIN1',\n pitch: null,\n yaw: null,\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 },\n },\n\n // ========== VENTRAL FINS (AU 30-33, belly fins) ==========\n {\n node: 'VENTRAL_L',\n pitch: null,\n yaw: null,\n roll: { aus: [30, 31], axis: 'rz', negative: 31, positive: 30 }, // Ventral L Up/Down\n },\n {\n node: 'VENTRAL_L_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [30, 31], axis: 'rz', negative: 31, positive: 30 },\n },\n {\n node: 'VENTRAL_R',\n pitch: null,\n yaw: null,\n roll: { aus: [32, 33], axis: 'rz', negative: 33, positive: 32 }, // Ventral R Up/Down\n },\n {\n node: 'VENTRAL_R_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [32, 33], axis: 'rz', negative: 33, positive: 32 },\n },\n\n // ========== DORSAL FIN (AU 53/54 - Head Up/Down via dorsal bones) ==========\n // In this fish model, the dorsal bones control the head's vertical movement\n // No head tilt for fish - AU 55/56 removed\n {\n node: 'DORSAL_ROOT',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 }, // Head Up/Down\n yaw: null,\n roll: null,\n },\n {\n node: 'DORSAL_L',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 },\n yaw: null,\n roll: null,\n },\n {\n node: 'DORSAL_R',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 },\n yaw: null,\n roll: null,\n },\n\n // ========== GILLS (AU 45-46, separate L/R - single AU per side, not continuum) ==========\n // AU 45 controls left side only, AU 46 controls right side only\n // These are intensity-only AUs (0=closed, 1=flared) - no negative partner\n {\n node: 'GILL_L',\n pitch: null,\n yaw: null,\n roll: { aus: [45], axis: 'rz', negative: undefined, positive: 45 }, // Gill L\n },\n {\n node: 'GILL_L_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [45], axis: 'rz', negative: undefined, positive: 45 },\n },\n {\n node: 'GILL_R',\n pitch: null,\n yaw: null,\n roll: { aus: [46], axis: 'rz', negative: undefined, positive: 46 }, // Gill R\n },\n {\n node: 'GILL_R_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [46], axis: 'rz', negative: undefined, positive: 46 },\n },\n\n // ========== EYES (AU 61-64) ==========\n // Single EYES_0 mesh rotates both fish eyes together\n {\n node: 'EYE_L',\n pitch: { aus: [63, 64], axis: 'rx', negative: 64, positive: 63 }, // Eyes Up/Down\n yaw: { aus: [61, 62], axis: 'ry', negative: 62, positive: 61 }, // Eyes Left/Right\n roll: null,\n },\n];\n\n\n// ============================================================================\n// EYE MESH NODES - Fallback for eye rotation when no bone exists\n// Fish has a single combined EYES_0 mesh for both eyes\n// ============================================================================\n\nexport const EYE_MESH_NODES = {\n LEFT: 'EYES_0',\n RIGHT: 'EYES_0', // Same mesh, both eyes rotate together\n} as const;\n\n// ============================================================================\n// MESH SETTINGS - Material settings for fish meshes (depthWrite, blending, etc.)\n// ============================================================================\n\nexport const MESHES: Record<string, MeshInfo> = {\n // Body mesh - main fish body with proper depth and blending\n 'BODY_0': {\n category: 'body' as MeshCategory,\n morphCount: 0, // Fish model has no morphs\n material: {\n renderOrder: 20,\n transparent: true,\n opacity: 1,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n // Eyes mesh - render behind body with proper transparency support\n 'EYES_0': {\n category: 'eye' as MeshCategory,\n morphCount: 0,\n material: {\n renderOrder: 17,\n transparent: true,\n opacity: 1,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n // Hidden helper shell from the source asset; keep it suppressed by default\n // so Betta does not rely on a Firestore-only mesh override.\n 'Cube_0': {\n category: 'body' as MeshCategory,\n morphCount: 0,\n material: {\n renderOrder: -20,\n transparent: true,\n opacity: 0,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n};\n\n// ============================================================================\n// ANNOTATION REGIONS - Camera/marker defaults for the fish preset\n// ============================================================================\n\nexport const ANNOTATION_REGIONS: AnnotationRegion[] = [\n {\n name: 'full_body',\n objects: ['*'],\n paddingFactor: 2.5,\n },\n {\n name: 'head',\n bones: ['HEAD'],\n paddingFactor: 1.8,\n children: ['left_eye', 'right_eye', 'mouth'],\n expandAnimation: 'staggered',\n },\n {\n name: 'left_eye',\n meshes: ['EYES_0'],\n parent: 'head',\n paddingFactor: 1.4,\n cameraAngle: 270,\n },\n {\n name: 'right_eye',\n meshes: ['EYES_0'],\n parent: 'head',\n paddingFactor: 1.4,\n cameraAngle: 90,\n },\n {\n name: 'mouth',\n bones: ['HEAD'],\n parent: 'head',\n paddingFactor: 1.5,\n },\n {\n name: 'body',\n bones: ['BODY_FRONT', 'BODY_MID', 'BODY_BACK'],\n paddingFactor: 1.8,\n },\n {\n name: 'tail',\n bones: ['TAIL_BASE', 'TAIL_TOP', 'TAIL_MID'],\n paddingFactor: 1.6,\n },\n {\n name: 'dorsal_fin',\n bones: ['DORSAL_ROOT', 'DORSAL_L', 'DORSAL_R'],\n paddingFactor: 1.8,\n },\n {\n name: 'pectoral_fins',\n bones: ['PECTORAL_L_ROOT', 'PECTORAL_R_ROOT'],\n paddingFactor: 1.8,\n children: ['pectoral_fin_left', 'pectoral_fin_right'],\n expandAnimation: 'outward',\n },\n {\n name: 'pectoral_fin_left',\n bones: ['PECTORAL_L_ROOT', 'PECTORAL_L_CHAIN1', 'PECTORAL_L_CHAIN2'],\n parent: 'pectoral_fins',\n paddingFactor: 1.6,\n cameraAngle: 270,\n },\n {\n name: 'pectoral_fin_right',\n bones: ['PECTORAL_R_ROOT', 'PECTORAL_R_CHAIN1', 'PECTORAL_R_ROOT2'],\n parent: 'pectoral_fins',\n paddingFactor: 1.6,\n cameraAngle: 90,\n },\n {\n name: 'ventral_fins',\n bones: ['VENTRAL_L', 'VENTRAL_R'],\n paddingFactor: 1.6,\n },\n {\n name: 'gills',\n bones: ['GILL_L', 'GILL_R'],\n paddingFactor: 1.6,\n children: ['gill_left', 'gill_right'],\n expandAnimation: 'outward',\n },\n {\n name: 'gill_left',\n bones: ['GILL_L', 'GILL_L_MID', 'GILL_L_TIP'],\n parent: 'gills',\n paddingFactor: 1.4,\n cameraAngle: 270,\n style: { lineDirection: 'left' },\n },\n {\n name: 'gill_right',\n bones: ['GILL_R', 'GILL_R_MID', 'GILL_R_TIP'],\n parent: 'gills',\n paddingFactor: 1.4,\n cameraAngle: 90,\n style: { lineDirection: 'right' },\n },\n];\n\n// ============================================================================\n// PRESET EXPORT\n// ============================================================================\n\nconst BETTA_FISH_PROFILE: Profile = {\n name: 'Betta Fish',\n animalType: 'fish',\n emoji: '🐟',\n auToBones: BONE_BINDINGS,\n boneNodes: BONE_NODES,\n // Prefix/suffix for bone resolution: 'Bone.' + '001' + '_Armature' = 'Bone.001_Armature'\n bonePrefix: BONE_PREFIX,\n boneSuffix: BONE_SUFFIX,\n // Suffix pattern for fuzzy matching (Sketchfab/Blender exports)\n suffixPattern: '_\\\\d+$|\\\\.\\\\d+$',\n auToMorphs: {} as Record<number, import('../mappings/types').MorphTargetsBySide>,\n morphToMesh: {} as Record<string, string[]>,\n visemeKeys: [] as string[],\n auInfo: AU_INFO,\n compositeRotations: COMPOSITE_ROTATIONS,\n eyeMeshNodes: EYE_MESH_NODES,\n meshes: MESHES,\n annotationRegions: ANNOTATION_REGIONS,\n auMixDefaults: {} as Record<number, number>, // No mixed AUs (morph+bone) in this model\n continuumPairs: CONTINUUM_PAIRS_MAP,\n continuumLabels: CONTINUUM_LABELS,\n};\n\nexport const BETTA_FISH_PRESET = {\n ...BETTA_FISH_PROFILE,\n bones: BONES,\n boneBindings: BONE_BINDINGS,\n actionInfo: AU_INFO,\n};\n\n/**\n * Check if an AU has bilateral bone bindings (L and R nodes)\n * Used to determine if a balance slider should be shown\n */\nexport const hasLeftRightBones = (auId: number): boolean => {\n const bindings = BONE_BINDINGS[auId];\n return checkBindingsForLeftRight(bindings);\n};\n\nexport default BETTA_FISH_PRESET;\n\n// ============================================================================\n// LEGACY ALIASES - For backwards compatibility with existing code\n// ============================================================================\n\n// Deprecated alias: the fish preset is now a single preset object, not a\n// parallel \"mapping config\" that differs from the real preset.\nexport const AU_MAPPING_CONFIG = BETTA_FISH_PRESET;\n\nexport const ACTION_INFO = AU_INFO;\nexport const FISH_BONES = BONES;\nexport const FISH_BONE_NODES = BONE_NODES;\nexport const FISH_BONE_BINDINGS = BONE_BINDINGS;\nexport const FISH_AU_INFO = AU_INFO;\nexport const FISH_ACTION_INFO = ACTION_INFO;\nexport const FISH_CONTINUUM_PAIRS_MAP = CONTINUUM_PAIRS_MAP;\nexport const FISH_CONTINUUM_LABELS = CONTINUUM_LABELS;\nexport const FISH_COMPOSITE_ROTATIONS = COMPOSITE_ROTATIONS;\nexport const FISH_EYE_MESH_NODES = EYE_MESH_NODES;\nexport const FISH_MESHES = MESHES;\nexport const FISH_AU_MAPPING_CONFIG = BETTA_FISH_PRESET;\nexport const fishHasLeftRightBones = hasLeftRightBones;\n","import type { Profile } from '../mappings/types';\nimport { BETTA_FISH_PRESET } from './bettaFish';\nimport { CC4_PRESET } from './cc4';\n\n/**\n * Authoring registry for presets embedded in the Rust/Wasm package.\n *\n * Preset IDs are data identifiers. Runtime code must look them up through the\n * generated Wasm registry rather than branching on individual characters.\n */\nexport const EMBEDDED_PRESETS = {\n cc4: CC4_PRESET,\n fish: BETTA_FISH_PRESET,\n} as const satisfies Record<string, Profile>;\n\nexport type EmbeddedPresetId = keyof typeof EMBEDDED_PRESETS;\n\nexport function getEmbeddedPreset(presetId: string): Profile | undefined {\n const normalized = presetId.trim().toLowerCase();\n return (EMBEDDED_PRESETS as Record<string, Profile>)[normalized];\n}\n","/**\n * Embody - Preset Exports\n *\n * All AU presets are exported from here.\n * Frontend passes a presetType string and Embody looks up or extends the preset internally.\n */\n\n// CC4 preset (default for humanoid characters)\nexport { CC4_PRESET, default } from './cc4';\nexport * from './cc4';\n\nimport type { Profile } from '../mappings/types';\nimport {\n extendPresetWithProfile,\n mergePresetWithProfile,\n} from '../mappings/extendPresetWithProfile';\nexport {\n extendPresetWithProfile,\n mergePresetWithProfile,\n} from '../mappings/extendPresetWithProfile';\n\n// Betta fish preset (skeletal animation, no morphs)\nexport { BETTA_FISH_PRESET, AU_MAPPING_CONFIG, FISH_AU_MAPPING_CONFIG } from './bettaFish';\nexport {\n EMBEDDED_PRESETS,\n getEmbeddedPreset,\n} from './registry';\nexport type { EmbeddedPresetId } from './registry';\n\n// Re-export fish-specific items with FISH_ prefix to avoid conflicts\nexport {\n BONE_NODES as FISH_BONE_NODES,\n BONE_BINDINGS as FISH_BONE_BINDINGS,\n COMPOSITE_ROTATIONS as FISH_COMPOSITE_ROTATIONS,\n EYE_MESH_NODES as FISH_EYE_MESH_NODES,\n} from './bettaFish';\n\n/**\n * Preset types that can be passed to Embody\n */\nimport {\n getEmbeddedPreset,\n type EmbeddedPresetId,\n} from './registry';\n\nexport type PresetType = EmbeddedPresetId | 'skeletal' | 'custom';\n\n// Import CC4_PRESET at module level for getPreset\nimport { CC4_PRESET } from './cc4';\n\n/**\n * Get a preset by type name.\n * This allows frontend to pass a string instead of importing the full preset.\n */\nexport function getPreset(presetType: PresetType | string | undefined) {\n const compatibilityId = presetType === 'skeletal' ? 'fish' : presetType;\n return compatibilityId\n ? getEmbeddedPreset(compatibilityId) ?? CC4_PRESET\n : CC4_PRESET;\n}\n\n// Backwards-compatible lookup alias retained for LoomLarge consumers.\nexport const resolvePreset = getPreset;\n\n/**\n * Get a preset, then extend it with an optional profile.\n */\nexport async function getPresetWithProfile(\n presetType: PresetType | string | undefined,\n profile?: Partial<Profile>\n): Promise<Profile> {\n return extendPresetWithProfile(getPreset(presetType), profile);\n}\n\n// Backwards-compatible extension alias retained for LoomLarge consumers.\nexport const resolvePresetWithOverrides = getPresetWithProfile;\n","/**\n * Embody - Three.js Implementation\n *\n * Default implementation of the Embody runtime interface for Three.js.\n * Controls 3D character facial animation using Action Units (AUs),\n * morph targets, visemes, and bone transformations.\n */\n\nimport {\n BufferAttribute,\n Quaternion,\n Vector3,\n Box3,\n Clock,\n} from 'three';\nimport type { Mesh, Object3D, AnimationClip } from 'three';\nimport type {\n EmbodyRuntime,\n ReadyPayload,\n EmbodyConfig,\n} from '../../interfaces/EmbodyRuntime';\nimport type { MeshInfo, MorphTargetRef, Profile } from '../../mappings/types';\nimport type {\n TransitionHandle,\n BoneKey,\n RotationsState,\n AnimationPlayOptions,\n AnimationClipInfo,\n AnimationState,\n AnimationActionHandle,\n CurvesMap,\n ClipOptions,\n ClipHandle,\n Snippet,\n SnippetChannel,\n TypedSnippet,\n CompositeRotation,\n RotationAxis,\n AnimationBlendMode,\n MorphTargetDelta,\n AddMorphTargetOptions,\n} from '../../core/types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from '../../core/compositeAxis';\nimport { ThreeAnimationRuntime, ThreeAnimationSystem } from './ThreeAnimationRuntime';\nimport { getSideScale } from './balanceUtils';\nimport { ThreeModelInspector } from './ThreeModelInspector';\nimport { ThreeFrameApplier, type ThreeFrameApplierBindings, type ThreeMaterialConfig, type ThreeResolvedMaterialConfig } from './ThreeFrameApplier';\nimport { TsRuntimeCore } from '../../core/TsRuntimeCore';\nimport { WasmRuntimeCore } from '../../core/WasmRuntimeCore';\nimport type { ModelDescriptor } from '../../core/contracts';\nimport { initEmbodyCore } from '../../wasm';\nimport { HairPhysicsController, type HairPhysicsConfig, type HairPhysicsConfigUpdate } from './hair/HairPhysicsController';\nimport { CC4_PRESET, CC4_MESHES, COMPOSITE_ROTATIONS as CC4_COMPOSITE_ROTATIONS } from '../../presets/cc4';\nimport { getPreset } from '../../presets';\nimport { mergePresetWithProfile } from '../../mappings/extendPresetWithProfile';\nimport {\n getProfileVisemeSlots,\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n getVisemeSlotIndex,\n} from '../../mappings/visemeSystem';\nimport type { NodeBase, ResolvedBones } from './types';\n\nconst deg2rad = (d: number) => (d * Math.PI) / 180;\n\n// Axis vectors for quaternion rotation (like stable version)\nconst X_AXIS = new Vector3(1, 0, 0);\nconst Y_AXIS = new Vector3(0, 1, 0);\nconst Z_AXIS = new Vector3(0, 0, 1);\n\n/**\n * Build AU to composite map from composite rotations config.\n * Maps AU ID to { nodes, axis } so we know which semantic axis (pitch/yaw/roll) to use.\n */\nfunction buildAUToCompositeMap(composites: CompositeRotation[]): Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }> {\n const map = new Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }>();\n composites.forEach(comp => {\n (['pitch', 'yaw', 'roll'] as const).forEach(axisName => {\n const axisConfig = comp[axisName];\n if (axisConfig) {\n axisConfig.aus.forEach(auId => {\n const existing = map.get(auId);\n if (existing) {\n existing.nodes.push(comp.node);\n } else {\n map.set(auId, { nodes: [comp.node], axis: axisName });\n }\n });\n }\n });\n });\n return map;\n}\n\nfunction clamp01(x: number) {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\ntype MorphTargetHandle = { infl: number[]; idx: number };\ntype WeightedMorphTargetHandle = MorphTargetHandle & { weight: number };\ntype ResolvedMorphTargetsBySide = {\n left: MorphTargetHandle[];\n right: MorphTargetHandle[];\n center: MorphTargetHandle[];\n};\n\nexport class Embody implements EmbodyRuntime {\n // Optional hook for animation schedulers.\n onSnippetEnd?: (name: string) => void;\n\n /**\n * Create an engine with Rust-owned preset/profile resolution.\n *\n * Prefer this factory whenever a profile patch must be merged onto a preset.\n * The sync constructor accepts either a presetType with no patch, or an\n * already-resolved profile.\n */\n static async create(\n config: EmbodyConfig = {},\n animation?: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n }\n ): Promise<Embody> {\n const core = await initEmbodyCore();\n const basePreset = config.presetType ? getPreset(config.presetType) : CC4_PRESET;\n const resolvedProfile = mergePresetWithProfile(core, basePreset, config.profile);\n const engine = new Embody(\n {\n profile: resolvedProfile,\n animationRuntimeFactory: config.animationRuntimeFactory,\n },\n animation\n );\n engine.attachWasmCore(core);\n return engine;\n }\n\n // Configuration\n private config: Profile;\n\n // Animation driver (injectable)\n private animation: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n };\n\n // Composite rotation mappings (built from config or default CC4)\n private compositeRotations: CompositeRotation[];\n private auToCompositeMap: Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }>;\n\n // State\n private auValues: Record<number, number> = {};\n private auBalances: Record<number, number> = {}; // Balance values per AU (-1 to 1)\n private rigReady = false;\n private missingBoneWarnings = new Set<string>();\n\n // Rotation state\n private rotations: RotationsState = {};\n private pendingCompositeNodes = new Set<string>();\n private isPaused = false;\n private translations: Record<string, { x: number; y: number; z: number }> = {};\n\n // Mesh references\n private faceMesh: Mesh | null = null;\n private resolvedFaceMeshes: string[] = [];\n private meshes: Mesh[] = [];\n private model: Object3D | null = null;\n private meshByName = new Map<string, Mesh>();\n private morphKeyCache = new Map<string, MorphTargetHandle[]>();\n private morphIndexCache = new Map<string, MorphTargetHandle[]>();\n private resolvedAUMorphTargets = new Map<number, ResolvedMorphTargetsBySide>();\n private resolvedVisemeTargets: WeightedMorphTargetHandle[][] = [];\n\n // Bones\n private bones: ResolvedBones = {};\n private mixWeights: Record<number, number> = {};\n\n // Viseme state\n private visemeValues: number[] = [];\n private visemeJawScales: number[] = [];\n\n\n // Viseme jaw amounts\n private static readonly VISEME_JAW_AMOUNTS: number[] = [\n 0.15, 0.35, 0.25, 0.70, 0.55, 0.30, 0.10, 0.20, 0.08,\n 0.12, 0.18, 0.02, 0.25, 0.60, 0.40,\n ];\n\n private animationController: ThreeAnimationSystem;\n private hairPhysics: HairPhysicsController;\n private modelInspector = new ThreeModelInspector();\n private frameApplier = new ThreeFrameApplier();\n private modelDescriptor: ModelDescriptor | null = null;\n private tsRuntimeCore: TsRuntimeCore | null = null;\n private wasmRuntimeCore: WasmRuntimeCore | null = null;\n private framePathReady = false;\n\n // Internal animation loop\n private clock = new Clock(false); // Don't auto-start\n private animationFrameId: number | null = null;\n private isRunning = false;\n\n constructor(\n config: EmbodyConfig = {},\n animation?: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n }\n ) {\n // Sync construction does not merge profile patches. Use Embody.create() for\n // preset + override resolution through the Rust Wasm core.\n this.config = config.profile\n ? (config.profile as Profile)\n : config.presetType\n ? getPreset(config.presetType)\n : CC4_PRESET;\n this.mixWeights = { ...this.config.auMixDefaults };\n this.syncVisemeRuntimeState();\n this.animation = animation || new ThreeAnimationRuntime();\n\n // Use config's composite rotations or default to CC4\n this.compositeRotations = this.config.compositeRotations || CC4_COMPOSITE_ROTATIONS;\n this.auToCompositeMap = buildAUToCompositeMap(this.compositeRotations);\n\n this.animationController = new ThreeAnimationSystem({\n getModel: () => this.model,\n getMeshes: () => this.meshes,\n getMeshByName: (name) => this.meshByName.get(name),\n getMeshNamesForAU: (auId) => this.getMeshNamesForAU(auId),\n getMeshNamesForViseme: () => this.getMeshNamesForViseme(),\n getCurrentAUValue: (auId) => this.getAU(auId),\n getCurrentVisemeValue: (visemeIndex) => this.visemeValues[visemeIndex] ?? 0,\n getCurrentMorphValue: (morphKey, meshNames) => this.getMorphValueForMeshes(morphKey, meshNames),\n getCurrentMorphIndexValue: (morphIndex, meshNames) => this.getMorphValueByIndexForMeshes(morphIndex, meshNames),\n getCurrentBoneQuaternion: (nodeKey) => this.bones[nodeKey]?.obj.quaternion.clone() ?? null,\n getCurrentBonePositionValue: (nodeKey, axis) => this.bones[nodeKey]?.obj.position[axis] ?? null,\n getBones: () => this.bones,\n getConfig: () => this.config,\n getCompositeRotations: () => this.compositeRotations,\n computeSideValues: (base, balance) => this.computeSideValues(base, balance),\n getAUMixWeight: (auId) => this.getAUMixWeight(auId),\n isMixedAU: (auId) => this.isMixedAU(auId),\n reapplyProceduralState: () => this.reapplyProceduralStateAfterBakedUpdate(),\n }, {\n animationRuntimeFactory: config.animationRuntimeFactory,\n });\n\n this.hairPhysics = new HairPhysicsController({\n getMeshByName: (name) => this.meshByName.get(name),\n getSelectedHairMeshNames: () => this.config.morphToMesh?.hair || [],\n // Hair physics reuses the shared mixer-backed clip builder.\n buildClip: (clipName, curves, options) => this.animationController.buildClip(clipName, curves, options),\n cleanupSnippet: (name) => this.animationController.cleanupSnippet(name),\n });\n\n this.applyHairPhysicsProfileConfig();\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n onReady(payload: ReadyPayload): void {\n const { meshes, model } = payload;\n const inspection = this.modelInspector.inspectModel(model, {\n meshes,\n profile: this.config,\n previousBones: this.bones,\n });\n\n this.meshes = inspection.morphMeshes;\n this.model = model;\n this.meshByName = inspection.meshByName;\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n\n // Resolve bones\n this.bones = inspection.bones;\n this.rigReady = true;\n this.missingBoneWarnings.clear();\n this.initBoneRotations();\n\n // Find primary face mesh (use head bone proximity when available)\n this.resolvedFaceMeshes = inspection.resolvedFaceMeshes;\n this.faceMesh = inspection.faceMesh;\n\n // Auto-detect face morph meshes only if preset/profile doesn't define them.\n // When morphToMesh.face is already configured (e.g., CC4 preset specifies\n // body + eyebrows + occlusion + tear lines), trust that configuration.\n //\n // Important: Use only resolved face candidates here. Using all morph-capable\n // meshes makes AU/morph transitions spill into unrelated meshes.\n if (!this.config.morphToMesh?.face || this.config.morphToMesh.face.length === 0) {\n const faceMeshNames = this.resolvedFaceMeshes\n .filter((name) => this.meshByName.has(name));\n\n if (faceMeshNames.length > 0) {\n this.config.morphToMesh = {\n ...this.config.morphToMesh,\n face: Array.from(new Set(faceMeshNames)),\n };\n }\n }\n\n this.rebuildMorphTargetsCache();\n this.bindHostNeutralRuntime(inspection);\n\n if (this.resolvedFaceMeshes.length > 0) {\n for (const faceName of this.resolvedFaceMeshes) {\n const faceMesh = this.meshByName.get(faceName);\n const morphKeys = faceMesh?.morphTargetDictionary\n ? Object.keys(faceMesh.morphTargetDictionary)\n : [];\n console.log('[Embody] Face mesh resolved:', faceName);\n console.log('[Embody] Face mesh morphs:', morphKeys);\n }\n } else {\n console.log('[Embody] No face mesh resolved from morph targets.');\n }\n\n // Apply render order and material settings from CC4_MESHES\n this.applyMeshMaterialSettings(model);\n }\n\n private bindHostNeutralRuntime(inspection: ReturnType<ThreeModelInspector['inspectModel']>): void {\n this.modelDescriptor = inspection.descriptor;\n this.frameApplier.setBindings(buildFrameApplierBindings(inspection));\n this.tsRuntimeCore = new TsRuntimeCore({\n profile: this.config,\n model: inspection.descriptor,\n });\n this.syncRuntimeCoreState();\n this.framePathReady = true;\n\n void initEmbodyCore()\n .then((wasm) => {\n if (!this.modelDescriptor) return;\n this.attachWasmCore(wasm);\n this.wasmRuntimeCore = new WasmRuntimeCore({\n profile: this.config,\n model: this.modelDescriptor,\n wasm,\n });\n this.syncRuntimeCoreState();\n })\n .catch(() => {\n // Vitest and some hosts cannot resolve the package wasm dynamic import; TsRuntimeCore remains the morph path.\n this.wasmRuntimeCore = null;\n });\n }\n\n private attachWasmCore(core: Awaited<ReturnType<typeof initEmbodyCore>>): void {\n this.hairPhysics.setCore(core);\n }\n\n private syncRuntimeCoreState(): void {\n if (this.tsRuntimeCore) {\n this.tsRuntimeCore.setProfile(this.config);\n if (this.modelDescriptor) {\n this.tsRuntimeCore.setModelDescriptor(this.modelDescriptor);\n }\n for (const [auIdText, value] of Object.entries(this.auValues)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.tsRuntimeCore.setAU(auId, value, this.auBalances[auId]);\n }\n for (const [auIdText, weight] of Object.entries(this.mixWeights)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.tsRuntimeCore.setAUMixWeight(auId, weight);\n }\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n this.tsRuntimeCore.setViseme(index, this.visemeValues[index] ?? 0, this.visemeJawScales[index] ?? 1);\n }\n }\n\n if (this.wasmRuntimeCore) {\n this.wasmRuntimeCore.setProfile(this.config);\n if (this.modelDescriptor) {\n this.wasmRuntimeCore.setModelDescriptor(this.modelDescriptor);\n }\n this.wasmRuntimeCore.clear();\n for (const [auIdText, value] of Object.entries(this.auValues)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.wasmRuntimeCore.setAU(auId, value, this.auBalances[auId] ?? 0);\n }\n for (const [auIdText, weight] of Object.entries(this.mixWeights)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.wasmRuntimeCore.setAUMixWeight(auId, weight);\n }\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n this.wasmRuntimeCore.setViseme(index, this.visemeValues[index] ?? 0);\n }\n }\n }\n\n /**\n * Re-inspect the current model and push a fresh ModelDescriptor into the\n * runtime cores and frame applier. Needed whenever host-side morph targets\n * or meshes change after onReady (e.g. addMorphTarget).\n */\n private refreshHostNeutralModelDescriptor(): void {\n if (!this.model || !this.framePathReady) return;\n const inspection = this.modelInspector.inspectModel(this.model, {\n meshes: this.meshes,\n profile: this.config,\n previousBones: this.bones,\n });\n this.modelDescriptor = inspection.descriptor;\n this.frameApplier.setBindings(buildFrameApplierBindings(inspection));\n this.tsRuntimeCore?.setModelDescriptor(inspection.descriptor);\n this.wasmRuntimeCore?.setModelDescriptor(inspection.descriptor);\n }\n\n private applyLiveMorphFrameDelta(): boolean {\n if (!this.framePathReady || !this.model) return false;\n\n if (this.wasmRuntimeCore) {\n // Morph influence writes never touch transforms, so no matrix update.\n this.frameApplier.applyPackedMorphFrameDelta(\n this.wasmRuntimeCore.evaluatePackedMorphFrameDelta()\n );\n return true;\n }\n\n if (this.tsRuntimeCore) {\n const frame = this.tsRuntimeCore.evaluateFrameDelta();\n this.frameApplier.applyFrameDelta(this.model, {\n morphTargets: frame.morphTargets,\n });\n return true;\n }\n\n return false;\n }\n\n private rebuildMorphTargetsCache(): void {\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n this.resolvedAUMorphTargets.clear();\n this.resolvedVisemeTargets = [];\n\n if (!this.meshes.length) return;\n\n const resolveTargetsForKeys = (keys: MorphTargetRef[], meshNames: string[]): MorphTargetHandle[] => {\n if (!keys || keys.length === 0) return [];\n const targets: MorphTargetHandle[] = [];\n for (const key of keys) {\n const resolved = typeof key === 'number'\n ? this.resolveMorphTargetsByIndex(key, meshNames)\n : this.resolveMorphTargets(key, meshNames);\n if (resolved.length > 0) {\n targets.push(...resolved);\n }\n }\n return targets;\n };\n\n for (const [auIdStr, entry] of Object.entries(this.config.auToMorphs || {})) {\n const auId = Number(auIdStr);\n if (Number.isNaN(auId) || !entry) continue;\n const meshNames = this.getMeshNamesForAU(auId);\n const resolved: ResolvedMorphTargetsBySide = {\n left: resolveTargetsForKeys(entry.left, meshNames),\n right: resolveTargetsForKeys(entry.right, meshNames),\n center: resolveTargetsForKeys(entry.center, meshNames),\n };\n this.resolvedAUMorphTargets.set(auId, resolved);\n }\n\n for (let i = 0; i < getProfileVisemeSlots(this.config).length; i += 1) {\n const visemeMeshNames = this.getMeshNamesForViseme();\n const targets: WeightedMorphTargetHandle[] = [];\n for (const bindingTarget of getVisemeBindingTargets(this.config, i)) {\n const resolved = typeof bindingTarget.morph === 'number'\n ? this.resolveMorphTargetsByIndex(bindingTarget.morph, visemeMeshNames)\n : this.resolveMorphTargets(bindingTarget.morph, visemeMeshNames);\n for (const target of resolved) {\n targets.push({ ...target, weight: bindingTarget.weight });\n }\n }\n this.resolvedVisemeTargets[i] = targets;\n }\n }\n\n private resolveFaceMeshes(meshes: Mesh[]): string[] {\n const faceMeshNames = this.config.morphToMesh?.face || [];\n const availableMorphMeshes = meshes.filter((m) => {\n const dict = m.morphTargetDictionary;\n const infl = m.morphTargetInfluences;\n return (dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0);\n });\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n return [defaultFace.name];\n }\n\n const candidateByMorph = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n if (candidateByMorph) {\n return [candidateByMorph.name];\n }\n\n const head = this.bones[this.getHeadBoneNodeKey()]?.obj ?? this.bones.HEAD?.obj;\n if (head && availableMorphMeshes.length > 0) {\n const headPos = new Vector3();\n (head as any).getWorldPosition?.(headPos);\n const headCandidates = availableMorphMeshes.map((mesh) => {\n const box = new Box3().setFromObject(mesh as any);\n const center = new Vector3();\n box.getCenter(center);\n const distance = box.containsPoint(headPos) ? 0 : center.distanceTo(headPos);\n const morphCount = mesh.morphTargetDictionary\n ? Object.keys(mesh.morphTargetDictionary).length\n : 0;\n const name = mesh.name.toLowerCase();\n const penalty = /eye|occlusion|tear|teeth|tongue|hair|lash/.test(name) ? 10 : 0;\n return { name: mesh.name, distance, morphCount, penalty };\n });\n\n headCandidates.sort((a, b) => {\n if (a.distance !== b.distance) return a.distance - b.distance;\n if (a.penalty !== b.penalty) return a.penalty - b.penalty;\n return b.morphCount - a.morphCount;\n });\n\n const best = headCandidates[0];\n const extras = headCandidates\n .filter((entry) => /brow|eyebrow/.test(entry.name.toLowerCase()))\n .map((entry) => entry.name);\n\n return [best.name, ...extras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n if (availableMorphMeshes.length > 0) {\n const best = availableMorphMeshes.reduce((prev, current) => {\n const prevCount = prev.morphTargetDictionary ? Object.keys(prev.morphTargetDictionary).length : 0;\n const currCount = current.morphTargetDictionary ? Object.keys(current.morphTargetDictionary).length : 0;\n return currCount > prevCount ? current : prev;\n });\n const browExtras = availableMorphMeshes\n .filter((m) => {\n const dict = m.morphTargetDictionary || {};\n const morphKeys = Object.keys(dict);\n return /brow|eyebrow/i.test(m.name) || morphKeys.some((k) => /brow/i.test(k));\n })\n .map((m) => m.name);\n return [best.name, ...browExtras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n return [];\n }\n\n update(deltaSeconds: number): void {\n const dtSeconds = Math.max(0, deltaSeconds || 0);\n if (dtSeconds <= 0 || this.isPaused) return;\n\n this.animation.tick(dtSeconds);\n this.flushPendingComposites();\n\n this.animationController.update(dtSeconds);\n this.hairPhysics.update(dtSeconds);\n }\n\n /** Start the internal animation loop using Three.js Clock */\n start(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n this.clock.start();\n\n const tick = () => {\n if (!this.isRunning) return;\n const delta = this.clock.getDelta();\n this.update(delta);\n this.animationFrameId = requestAnimationFrame(tick);\n };\n\n this.animationFrameId = requestAnimationFrame(tick);\n }\n\n /** Stop the internal animation loop */\n stop(): void {\n this.isRunning = false;\n this.clock.stop();\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n\n dispose(): void {\n this.stop();\n this.clearTransitions();\n this.animationController.dispose();\n this.meshes = [];\n this.model = null;\n this.bones = {};\n this.modelDescriptor = null;\n this.tsRuntimeCore = null;\n this.wasmRuntimeCore = null;\n this.framePathReady = false;\n }\n\n // ============================================================================\n // AU CONTROL\n // ============================================================================\n\n setAU(id: number | string, v: number, balance?: number): void {\n if (typeof id === 'string') {\n const match = id.match(/^(\\d+)([LR])$/i);\n if (match) {\n const au = Number(match[1]);\n const side = match[2].toUpperCase() as 'L' | 'R';\n const sideBalance = side === 'L' ? -1 : 1;\n this.setAU(au, v, sideBalance);\n return;\n }\n const n = Number(id);\n if (!Number.isNaN(n)) {\n this.setAU(n, v, balance);\n }\n return;\n }\n\n // Handle negative values for continuum pairs:\n // If v < 0 and this AU has a continuum pair, forward to setContinuum\n if (v < 0 && this.config.continuumPairs) {\n const pairInfo = this.config.continuumPairs[id];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? id : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : id;\n const continuumValue = pairInfo.isNegative ? -v : v;\n this.setContinuum(negAU, posAU, continuumValue, balance);\n return;\n }\n }\n\n this.auValues[id] = v;\n // Store balance for this AU (used by bilateral bone AUs like fish gills)\n if (balance !== undefined) {\n this.auBalances[id] = balance;\n }\n\n this.tsRuntimeCore?.setAU(id, v, balance);\n this.wasmRuntimeCore?.setAU(id, v, balance ?? this.auBalances[id] ?? 0);\n\n const appliedViaFrame = this.applyLiveMorphFrameDelta();\n if (!appliedViaFrame) {\n const resolvedMorphTargets = this.resolvedAUMorphTargets.get(id);\n const { left: leftKeys, right: rightKeys, center: centerKeys } = this.getAUMorphsBySide(id);\n\n if (resolvedMorphTargets) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (resolvedMorphTargets.left.length || resolvedMorphTargets.right.length) {\n this.applyMorphTargets(resolvedMorphTargets.left, leftVal);\n this.applyMorphTargets(resolvedMorphTargets.right, rightVal);\n }\n\n this.applyMorphTargets(resolvedMorphTargets.center, base);\n } else if (leftKeys.length || rightKeys.length || centerKeys.length) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const meshNames = this.getMeshNamesForAU(id);\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, leftVal, meshNames);\n else this.setMorph(k, leftVal, meshNames);\n }\n for (const k of rightKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, rightVal, meshNames);\n else this.setMorph(k, rightVal, meshNames);\n }\n }\n\n for (const k of centerKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, base, meshNames);\n else this.setMorph(k, base, meshNames);\n }\n }\n }\n\n // Check if this AU affects composite rotations\n const compositeInfo = this.auToCompositeMap.get(id);\n\n if (compositeInfo) {\n // This AU affects composite bone rotations - use axis from compositeRotations\n for (const nodeKey of compositeInfo.nodes) {\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) continue;\n\n const axisConfig = config[compositeInfo.axis];\n if (!axisConfig) continue;\n\n const axisValue = this.getCompositeAxisValueForNode(nodeKey, axisConfig);\n this.updateBoneRotation(nodeKey, compositeInfo.axis, axisValue);\n this.pendingCompositeNodes.add(nodeKey);\n }\n }\n\n // Handle translations (non-composite)\n const bindings = this.config.auToBones[id];\n if (bindings) {\n for (const binding of bindings) {\n if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n this.updateBoneTranslation(binding.node, binding.channel, v * binding.scale, binding.maxUnits);\n }\n }\n }\n }\n }\n\n transitionAU(id: number | string, to: number, durationMs = 200, balance?: number): TransitionHandle {\n const numId = typeof id === 'string' ? Number(id.replace(/[^\\d]/g, '')) : id;\n\n // Handle negative values for continuum pairs:\n // If to < 0 and this AU has a continuum pair, forward to transitionContinuum\n if (to < 0 && this.config.continuumPairs) {\n const pairInfo = this.config.continuumPairs[numId];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? numId : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : numId;\n const continuumValue = pairInfo.isNegative ? -to : to;\n return this.transitionContinuum(negAU, posAU, continuumValue, durationMs, balance);\n }\n }\n\n const target = clamp01(to);\n\n if (balance !== undefined) {\n this.auBalances[numId] = balance;\n }\n const storedBalance = this.auBalances[numId] ?? 0;\n\n const { left: leftKeys, right: rightKeys, center: centerKeys } = this.getAUMorphsBySide(numId);\n const bindings = this.config.auToBones[numId] || [];\n\n const mixWeight = this.isMixedAU(numId) ? this.getAUMixWeight(numId) : 1.0;\n const base = target * mixWeight;\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, storedBalance);\n\n this.auValues[numId] = target;\n\n const handles: TransitionHandle[] = [];\n const meshNames = this.getMeshNamesForAU(numId);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, leftVal, durationMs, meshNames)\n : this.transitionMorph(k, leftVal, durationMs, meshNames)\n );\n }\n for (const k of rightKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, rightVal, durationMs, meshNames)\n : this.transitionMorph(k, rightVal, durationMs, meshNames)\n );\n }\n }\n\n for (const k of centerKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, base, durationMs, meshNames)\n : this.transitionMorph(k, base, durationMs, meshNames)\n );\n }\n\n // Handle bone rotations using auToCompositeMap\n const compositeInfo = this.auToCompositeMap.get(numId);\n if (compositeInfo) {\n for (const nodeKey of compositeInfo.nodes) {\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) continue;\n\n const axisConfig = config[compositeInfo.axis];\n if (!axisConfig) continue;\n\n const axisValue = this.getCompositeAxisValueForNode(nodeKey, axisConfig);\n handles.push(this.transitionBoneRotation(nodeKey, compositeInfo.axis, axisValue, durationMs));\n }\n }\n\n // Handle translations\n for (const binding of bindings) {\n if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n handles.push(this.transitionBoneTranslation(binding.node, binding.channel, target * binding.scale, binding.maxUnits, durationMs));\n }\n }\n }\n\n return this.combineHandles(handles);\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n getCompositeRotations(): CompositeRotation[] {\n return this.compositeRotations;\n }\n\n // ============================================================================\n // CONTINUUM CONTROL (for paired AUs like eyes left/right, head up/down)\n // ============================================================================\n\n /**\n * Set a continuum AU pair immediately (no animation).\n *\n * Sign convention:\n * - Negative value (-1 to 0): activates negAU (e.g., head left, eyes left)\n * - Positive value (0 to +1): activates posAU (e.g., head right, eyes right)\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Value from -1 (full negative) to +1 (full positive)\n * @param balance - Optional L/R balance for bilateral morphs\n */\n setContinuum(negAU: number, posAU: number, continuumValue: number, balance?: number): void {\n const value = Math.max(-1, Math.min(1, continuumValue));\n\n if (value < 0) {\n this.setAU(posAU, 0, balance);\n this.setAU(negAU, Math.abs(value), balance);\n return;\n }\n if (value > 0) {\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, value, balance);\n return;\n }\n\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, 0, balance);\n }\n\n /**\n * Smoothly transition a continuum AU pair (e.g., eyes left/right, head up/down).\n * Takes a continuum value from -1 to +1 and internally manages both AU values.\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Target value from -1 (full negative) to +1 (full positive)\n * @param durationMs - Transition duration in milliseconds\n * @param balance - Optional L/R balance for bilateral morphs\n */\n transitionContinuum(negAU: number, posAU: number, continuumValue: number, durationMs = 200, balance?: number): TransitionHandle {\n const target = Math.max(-1, Math.min(1, continuumValue));\n const driverKey = `continuum_${negAU}_${posAU}`;\n\n // Get current continuum value: positive if posAU active, negative if negAU active\n const currentNeg = this.auValues[negAU] ?? 0;\n const currentPos = this.auValues[posAU] ?? 0;\n const currentContinuum = currentPos - currentNeg;\n\n return this.animation.addTransition(driverKey, currentContinuum, target, durationMs, (value) => this.setContinuum(negAU, posAU, value, balance));\n }\n\n // ============================================================================\n // MORPH CONTROL\n // ============================================================================\n\n addMorphTarget(target: MorphTargetDelta, options: AddMorphTargetOptions = {}): number {\n this.validateMorphTargetDelta(target, options);\n const staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n const index = this.applyMorphTargetDelta(target, options);\n this.refreshMorphTargets([target.meshName]);\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n return index;\n }\n\n addMorphTargets(targets: MorphTargetDelta[], options: AddMorphTargetOptions = {}): Record<string, number> {\n if (targets.length === 0) return {};\n\n const batchKeys = new Set<string>();\n const batchRelativeModeByMesh = new Map<string, boolean>();\n for (const target of targets) {\n const key = `${target.meshName}:${target.name}`;\n if (batchKeys.has(key)) {\n throw new Error(`Morph target \"${target.name}\" for mesh \"${target.meshName}\" appears more than once in the same batch.`);\n }\n batchKeys.add(key);\n this.validateMorphTargetDelta(target, options);\n const targetIsRelative = target.relative !== false;\n const batchRelativeMode = batchRelativeModeByMesh.get(target.meshName);\n if (batchRelativeMode !== undefined && batchRelativeMode !== targetIsRelative) {\n throw new Error(`Cannot mix relative and absolute morph targets for mesh \"${target.meshName}\" in the same batch.`);\n }\n batchRelativeModeByMesh.set(target.meshName, targetIsRelative);\n }\n\n const staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n const result: Record<string, number> = {};\n const touchedMeshes = new Set<string>();\n\n try {\n for (const target of targets) {\n const index = this.applyMorphTargetDelta(target, options);\n touchedMeshes.add(target.meshName);\n result[`${target.meshName}:${target.name}`] = index;\n }\n } finally {\n if (touchedMeshes.size > 0) {\n this.refreshMorphTargets(Array.from(touchedMeshes));\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n }\n }\n\n return result;\n }\n\n ensureMorphInfluence(meshName: string, morphName: string): number {\n const mesh = this.requireNamedMesh(meshName);\n const dict = this.getMeshMorphDictionary(mesh);\n const existing = dict[morphName];\n if (existing !== undefined) return existing;\n\n const position = mesh.geometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot create morph target \"${morphName}\" on mesh \"${meshName}\": geometry has no position attribute.`);\n }\n\n return this.addMorphTarget({\n meshName,\n name: morphName,\n position: new Float32Array(position.count * position.itemSize),\n relative: true,\n });\n }\n\n refreshMorphTargets(_meshNames?: string[]): void {\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n\n if (this.model) {\n this.meshByName.clear();\n this.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n this.meshByName.set(obj.name, obj);\n }\n });\n this.meshes = collectMorphMeshes(this.model);\n }\n\n this.rebuildMorphTargetsCache();\n this.refreshHostNeutralModelDescriptor();\n this.hairPhysics.refreshMeshSelection();\n }\n\n /**\n * Set a morph target value.\n *\n * Fast paths (in order of speed):\n * 1. Pass pre-resolved { infl, idx } array directly - zero lookups\n * 2. String key with cache hit - one Map lookup\n * 3. String key cache miss - dictionary lookup, then cached for next time\n */\n setMorph(key: string, v: number, meshNames?: string[]): void;\n setMorph(key: string, v: number, targets: { infl: number[]; idx: number }[]): void;\n setMorph(\n key: string,\n v: number,\n meshNamesOrTargets?: string[] | { infl: number[]; idx: number }[]\n ): void {\n const val = clamp01(v);\n\n // Fast path: pre-resolved targets array (from transitionMorph)\n if (Array.isArray(meshNamesOrTargets) && meshNamesOrTargets.length > 0 && typeof meshNamesOrTargets[0] === 'object' && 'infl' in meshNamesOrTargets[0]) {\n const targets = meshNamesOrTargets as { infl: number[]; idx: number }[];\n this.applyMorphTargets(targets, val);\n return;\n }\n\n const meshNames = meshNamesOrTargets as string[] | undefined;\n const targets = this.resolveMorphTargets(key, meshNames);\n if (targets.length === 0) return;\n this.applyMorphTargets(targets, val);\n }\n\n setMorphInfluence(index: number, v: number, meshNames?: string[]): void {\n const val = clamp01(v);\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n if (targets.length === 0) return;\n this.applyMorphTargets(targets, val);\n }\n\n /**\n * Resolve morph key to direct targets for ultra-fast repeated access.\n * Use this when you need to set the same morph many times (e.g., in animation loops).\n */\n private resolveMorphTargetIndex(\n dict: Record<string, number> | undefined,\n key: string\n ): number | undefined {\n if (!dict) return undefined;\n\n const prefix = this.config.morphPrefix || '';\n const suffix = this.config.morphSuffix || '';\n const fullName = prefix + key + suffix;\n\n // Validation treats the configured full name as the source of truth, so runtime\n // mirrors that ordering and only accepts suffix-pattern variants after an exact hit.\n // We intentionally do not fall back to the bare key here because that would let a\n // prefixed profile appear valid at runtime while validation still reports a miss.\n const exactIndex = dict[fullName];\n if (exactIndex !== undefined) {\n return exactIndex;\n }\n\n const suffixRegex = this.config.suffixPattern\n ? new RegExp(this.config.suffixPattern)\n : null;\n if (!suffixRegex) {\n return undefined;\n }\n\n for (const [candidate, index] of Object.entries(dict)) {\n if (!candidate.startsWith(fullName)) continue;\n const candidateSuffix = candidate.slice(fullName.length);\n if (candidateSuffix === '' || suffixRegex.test(candidateSuffix)) {\n return index;\n }\n }\n\n return undefined;\n }\n\n resolveMorphTargets(key: string, meshNames?: string[]): { infl: number[]; idx: number }[] {\n // Cache key includes mesh names to avoid conflicts between face and hair morphs\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n const cacheKey = this.getMorphKeyCacheKey(key, meshNames);\n\n // Check cache first\n const cached = this.morphKeyCache.get(cacheKey);\n if (cached) return cached;\n\n // Resolve and cache\n const targets: { infl: number[]; idx: number }[] = [];\n\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) {\n targets.push({ infl, idx });\n }\n }\n\n if (targets.length > 0) {\n this.morphKeyCache.set(cacheKey, targets);\n }\n return targets;\n }\n\n resolveMorphTargetsByIndex(index: number, meshNames?: string[]): { infl: number[]; idx: number }[] {\n const idx = Number.isInteger(index) && index >= 0 ? index : null;\n if (idx === null) return [];\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n const cacheKey = this.getMorphIndexCacheKey(idx, meshNames);\n\n const cached = this.morphIndexCache.get(cacheKey);\n if (cached) return cached;\n\n const targets: { infl: number[]; idx: number }[] = [];\n\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const infl = mesh.morphTargetInfluences;\n if (!infl || idx >= infl.length) continue;\n targets.push({ infl, idx });\n }\n\n if (targets.length > 0) {\n this.morphIndexCache.set(cacheKey, targets);\n }\n return targets;\n }\n\n transitionMorph(key: string, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = meshNames?.length\n ? `morph_${this.getMorphKeyCacheKey(key, meshNames)}`\n : `morph_${this.getMorphKeyCacheKey(key)}`;\n const target = clamp01(to);\n\n // Pre-resolve targets once, then use direct access during animation\n const targets = this.resolveMorphTargets(key, meshNames);\n\n // Get \"from\" value from the resolved targets (more accurate for hair meshes)\n const from = targets.length > 0 ? (targets[0].infl[targets[0].idx] ?? 0) : this.getMorphValue(key);\n\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => {\n // Ultra-fast path: direct array access, no lookups\n const val = clamp01(value);\n this.applyMorphTargets(targets, val);\n });\n }\n\n transitionMorphInfluence(index: number, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = meshNames?.length\n ? `morph_${this.getMorphIndexCacheKey(index, meshNames)}`\n : `morph_${this.getMorphIndexCacheKey(index)}`;\n const target = clamp01(to);\n\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n const from = targets.length > 0 ? (targets[0].infl[targets[0].idx] ?? 0) : this.getMorphValueByIndex(index);\n\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => {\n const val = clamp01(value);\n this.applyMorphTargets(targets, val);\n });\n }\n\n // ============================================================================\n // VISEME CONTROL\n // ============================================================================\n\n setViseme(visemeIndex: number, value: number, jawScale = 1.0): void {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) return;\n\n const val = clamp01(value);\n this.visemeValues[visemeIndex] = val;\n this.visemeJawScales[visemeIndex] = jawScale;\n this.applyVisemeRuntimeState();\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n\n const target = clamp01(to);\n const from = this.visemeValues[visemeIndex] ?? 0;\n this.visemeJawScales[visemeIndex] = jawScale;\n\n return this.animation.addTransition(\n `viseme_value_${visemeIndex}`,\n from,\n target,\n durationMs,\n (value) => {\n this.visemeValues[visemeIndex] = clamp01(value);\n this.visemeJawScales[visemeIndex] = jawScale;\n this.applyVisemeRuntimeState();\n }\n );\n }\n\n setVisemeById(slotId: string, value: number, jawScale = 1.0): void {\n const index = getVisemeSlotIndex(this.config, slotId);\n if (index < 0) return;\n this.setViseme(index, value, jawScale);\n }\n\n transitionVisemeById(slotId: string, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n const index = getVisemeSlotIndex(this.config, slotId);\n if (index < 0) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n return this.transitionViseme(index, to, durationMs, jawScale);\n }\n\n // ============================================================================\n // MIX WEIGHT CONTROL\n // ============================================================================\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n this.tsRuntimeCore?.setAUMixWeight(id, weight);\n this.wasmRuntimeCore?.setAUMixWeight(id, weight);\n const v = this.auValues[id] ?? 0;\n if (v > 0) this.setAU(id, v);\n\n const boneBindings = this.config.auToBones[id];\n if (boneBindings) {\n for (const binding of boneBindings) {\n this.pendingCompositeNodes.add(binding.node);\n }\n }\n }\n\n getAUMixWeight(id: number): number {\n return this.mixWeights[id] ?? this.config.auMixDefaults?.[id] ?? 1.0;\n }\n\n /**\n * Check if an AU has bilateral bone bindings (left + right side hints).\n * Used to determine if a balance slider should be shown for bone-only bilateral AUs.\n */\n hasLeftRightBones(auId: number): boolean {\n const bindings = this.config.auToBones[auId] || [];\n const hasLeft = bindings.some((binding) => binding.side === 'left');\n const hasRight = bindings.some((binding) => binding.side === 'right');\n return hasLeft && hasRight;\n }\n\n // ============================================================================\n // PLAYBACK CONTROL\n // ============================================================================\n\n pause(): void { this.isPaused = true; }\n resume(): void { this.isPaused = false; }\n getPaused(): boolean { return this.isPaused; }\n clearTransitions(): void { this.animation.clearTransitions(); }\n getActiveTransitionCount(): number { return this.animation.getActiveTransitionCount(); }\n\n resetToNeutral(): void {\n this.auValues = {};\n const visemeCount = getProfileVisemeSlots(this.config).length;\n this.visemeValues = new Array(visemeCount).fill(0);\n this.visemeJawScales = new Array(visemeCount).fill(1);\n this.translations = {};\n this.initBoneRotations();\n this.clearTransitions();\n\n const morphTargetsToReset: MorphTargetHandle[] = [];\n for (const m of this.meshes) {\n const infl = m.morphTargetInfluences;\n if (!infl) continue;\n for (let i = 0; i < infl.length; i++) {\n morphTargetsToReset.push({ infl, idx: i });\n }\n }\n this.frameApplier.resetMorphTargets(morphTargetsToReset);\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n }\n\n private reinitializeRuntimeStateFromCurrentControls(staleMorphTargets: MorphTargetHandle[] = []): void {\n this.clearTransitions();\n this.resetMorphTargetHandles(staleMorphTargets);\n this.translations = {};\n this.initBoneRotations();\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n\n for (const [auIdStr, value] of Object.entries(this.auValues)) {\n if (value <= 0) continue;\n const auId = Number(auIdStr);\n if (Number.isNaN(auId)) continue;\n this.setAU(auId, value, this.auBalances[auId]);\n }\n\n this.applyVisemeRuntimeState();\n\n if (this.model) {\n this.flushPendingComposites();\n this.model.updateMatrixWorld(true);\n }\n }\n\n private reapplyProceduralStateAfterBakedUpdate(): void {\n if (!this.model) {\n return;\n }\n\n let hasActiveOverrides = false;\n\n for (const [auIdStr, value] of Object.entries(this.auValues)) {\n if (value <= 0) continue;\n const auId = Number(auIdStr);\n if (Number.isNaN(auId)) continue;\n hasActiveOverrides = true;\n this.setAU(auId, value, this.auBalances[auId]);\n }\n\n for (let visemeIndex = 0; visemeIndex < this.visemeValues.length; visemeIndex += 1) {\n const value = this.visemeValues[visemeIndex] ?? 0;\n if (value <= 0) continue;\n hasActiveOverrides = true;\n this.setViseme(visemeIndex, value, this.visemeJawScales[visemeIndex] ?? 1);\n }\n\n if (!hasActiveOverrides) {\n return;\n }\n\n this.flushPendingComposites();\n this.model.updateMatrixWorld(true);\n }\n\n // ============================================================================\n // MESH CONTROL\n // ============================================================================\n\n getMeshList(): MeshInfo[] {\n if (!this.model) return [];\n const result: MeshInfo[] = [];\n this.model.traverse((obj: any) => {\n if (obj.isMesh) {\n const meshInfo = CC4_MESHES[obj.name];\n result.push({\n name: obj.name,\n visible: obj.visible,\n morphCount: obj.morphTargetInfluences?.length || 0,\n category: meshInfo?.category || 'other',\n });\n }\n });\n return result;\n }\n\n /** Get all morph targets grouped by mesh name */\n getMorphTargets(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n if (dict) {\n result[mesh.name] = Object.keys(dict).sort();\n }\n }\n return result;\n }\n\n /** Get morph target indices mapped to labels for each mesh */\n getMorphTargetIndices(): Record<string, { index: number; name: string }[]> {\n const result: Record<string, { index: number; name: string }[]> = {};\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n if (!dict) continue;\n\n const entries = Object.entries(dict).map(([name, index]) => ({\n name,\n index,\n }));\n\n entries.sort((a, b) => a.index - b.index);\n result[mesh.name] = entries;\n }\n return result;\n }\n\n /** Get all resolved bone names and their current transforms */\n getBones(): Record<string, { position: [number, number, number]; rotation: [number, number, number] }> {\n const result: Record<string, { position: [number, number, number]; rotation: [number, number, number] }> = {};\n for (const name of Object.keys(this.bones)) {\n const entry = this.bones[name];\n if (entry) {\n const pos = entry.obj.position;\n const rot = entry.obj.rotation;\n result[name] = {\n position: [pos.x, pos.y, pos.z],\n rotation: [rot.x * 180 / Math.PI, rot.y * 180 / Math.PI, rot.z * 180 / Math.PI],\n };\n }\n }\n return result;\n }\n\n setMeshVisible(meshName: string, visible: boolean): void {\n if (!this.model) return;\n this.frameApplier.setMeshVisible(this.model, meshName, visible);\n }\n\n /**\n * Highlight a mesh with an emissive glow effect\n * @param meshName - Name of the mesh to highlight (null to clear all highlights)\n * @param color - Highlight color (default: cyan 0x00ffff)\n * @param intensity - Emissive intensity (default: 0.5)\n */\n highlightMesh(meshName: string | null, color: number = 0x00ffff, intensity: number = 0.5): void {\n if (!this.model) return;\n this.frameApplier.highlightMesh(this.model, meshName, color, intensity);\n }\n\n /** Get material config for a mesh */\n getMeshMaterialConfig(meshName: string): ThreeResolvedMaterialConfig | null {\n if (!this.model) return null;\n return this.frameApplier.getMeshMaterialConfig(this.model, meshName);\n }\n\n /** Set material config for a mesh */\n setMeshMaterialConfig(meshName: string, config: ThreeMaterialConfig): void {\n if (!this.model) return;\n this.frameApplier.setMeshMaterialConfig(this.model, meshName, config);\n }\n\n // ============================================================================\n // CONFIGURATION\n // ============================================================================\n\n private applyHairPhysicsProfileConfig(): void {\n this.hairPhysics.setHairPhysicsProfileConfig(this.config.hairPhysics);\n }\n\n setProfile(profile: Profile): void {\n this.config = profile;\n this.compositeRotations = this.config.compositeRotations || CC4_COMPOSITE_ROTATIONS;\n this.auToCompositeMap = buildAUToCompositeMap(this.compositeRotations);\n this.mixWeights = { ...profile.auMixDefaults };\n this.syncVisemeRuntimeState();\n let staleMorphTargets: MorphTargetHandle[] = [];\n if (this.model) {\n staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n this.bones = this.resolveBones(this.model);\n this.missingBoneWarnings.clear();\n this.rebuildMorphTargetsCache();\n this.tsRuntimeCore?.setProfile(this.config);\n this.wasmRuntimeCore?.setProfile(this.config);\n this.refreshHostNeutralModelDescriptor();\n }\n this.hairPhysics.refreshMeshSelection();\n this.applyHairPhysicsProfileConfig();\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n }\n\n getProfile(): Profile { return this.config; }\n\n /**\n * Get the mesh names that should receive morph influences for a given AU.\n * Routing is driven by `auFacePartToMeshCategory` in profile config.\n */\n getMeshNamesForAU(auId: number): string[] {\n return getMeshNamesForAUProfile(this.config, auId);\n }\n\n getMeshNamesForViseme(): string[] {\n return getMeshNamesForVisemeProfile(this.config);\n }\n\n // ============================================================================\n // HAIR PHYSICS\n // ============================================================================\n\n registerHairObjects(objects: Object3D[]): Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> {\n return this.hairPhysics.registerHairObjects(objects);\n }\n\n getRegisteredHairObjects(): Mesh[] {\n return this.hairPhysics.getRegisteredHairObjects();\n }\n\n setHairPhysicsEnabled(enabled: boolean): void {\n this.hairPhysics.setHairPhysicsEnabled(enabled);\n if (enabled) {\n const head = this.getHeadRotation();\n this.hairPhysics.onHeadRotationChanged(head.yaw, head.pitch);\n }\n }\n\n isHairPhysicsEnabled(): boolean {\n return this.hairPhysics.isHairPhysicsEnabled();\n }\n\n setHairPhysicsConfig(config: HairPhysicsConfigUpdate): void {\n this.hairPhysics.setHairPhysicsConfig(config);\n }\n\n getHairPhysicsConfig(): HairPhysicsConfig {\n return this.hairPhysics.getHairPhysicsConfig();\n }\n\n validateHairMorphTargets(): string[] {\n return this.hairPhysics.validateHairMorphTargets();\n }\n\n /** Get head rotation values for hair physics (range -1 to 1) */\n getHeadRotation(): { yaw: number; pitch: number; roll: number } {\n const headNodeKey = this.getHeadBoneNodeKey();\n const headRotation = this.rotations[headNodeKey] ?? this.rotations.HEAD;\n return {\n yaw: headRotation?.yaw ?? 0,\n pitch: headRotation?.pitch ?? 0,\n roll: headRotation?.roll ?? 0,\n };\n }\n\n updateHairPhysics(dt: number): void {\n this.hairPhysics.update(dt);\n }\n\n getHairMorphTargets(meshName?: string): string[] {\n return this.hairPhysics.getHairMorphTargets(meshName);\n }\n\n setMorphOnMeshes(meshNames: string[], morphKey: string, value: number): void {\n this.hairPhysics.setMorphOnMeshes(meshNames, morphKey, value);\n }\n\n applyHairStateToObject(objectName: string, state: {\n color?: { baseColor: string; emissive: string; emissiveIntensity: number };\n outline?: { show: boolean; color: string; opacity: number };\n visible?: boolean;\n scale?: { x: number; y: number; z: number };\n position?: { x: number; y: number; z: number };\n isEyebrow?: boolean;\n }): void {\n this.hairPhysics.applyHairStateToObject(objectName, state);\n }\n\n getHairAppearance() {\n return this.hairPhysics.getHairAppearance();\n }\n\n setHairColor(color: Parameters<HairPhysicsController['setHairColor']>[0]): void {\n this.hairPhysics.setHairColor(color);\n }\n\n setEyebrowColor(color: Parameters<HairPhysicsController['setEyebrowColor']>[0]): void {\n this.hairPhysics.setEyebrowColor(color);\n }\n\n setHairBaseColor(baseColor: string): void {\n this.hairPhysics.setHairBaseColor(baseColor);\n }\n\n setEyebrowBaseColor(baseColor: string): void {\n this.hairPhysics.setEyebrowBaseColor(baseColor);\n }\n\n setHairGlow(emissive: string, intensity: number): void {\n this.hairPhysics.setHairGlow(emissive, intensity);\n }\n\n setEyebrowGlow(emissive: string, intensity: number): void {\n this.hairPhysics.setEyebrowGlow(emissive, intensity);\n }\n\n setHairOutline(outline: { show: boolean; color?: string; opacity?: number }): void {\n this.hairPhysics.setHairOutline(outline);\n }\n\n // ============================================================================\n // PRIVATE METHODS\n // ============================================================================\n\n private computeSideValues(base: number, balance?: number): { left: number; right: number } {\n const b = Math.max(-1, Math.min(1, balance ?? 0));\n if (b === 0) return { left: base, right: base };\n if (b < 0) return { left: base, right: base * (1 + b) };\n return { left: base * (1 - b), right: base };\n }\n\n private getAUMorphsBySide(\n auId: number\n ): { left: MorphTargetRef[]; right: MorphTargetRef[]; center: MorphTargetRef[] } {\n const entry = this.config.auToMorphs[auId];\n return {\n left: entry ? [...entry.left] : [],\n right: entry ? [...entry.right] : [],\n center: entry ? [...entry.center] : [],\n };\n }\n\n private applyMorphTargets(targets: MorphTargetHandle[], val: number): void {\n this.frameApplier.applyMorphTargets(targets, val);\n }\n\n private applyVisemeRuntimeState(): void {\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n this.tsRuntimeCore?.setViseme(index, this.visemeValues[index] ?? 0, this.visemeJawScales[index] ?? 1);\n this.wasmRuntimeCore?.setViseme(index, this.visemeValues[index] ?? 0);\n }\n\n if (!this.applyLiveMorphFrameDelta()) {\n for (const targets of this.resolvedVisemeTargets) {\n this.frameApplier.resetMorphTargets(targets || []);\n }\n\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const targets = this.resolvedVisemeTargets[index] || [];\n for (const target of targets) {\n if (target.idx >= target.infl.length) continue;\n const weighted = clamp01(value * target.weight);\n this.frameApplier.applyMorphTargets(\n [target],\n Math.max(target.infl[target.idx] ?? 0, weighted)\n );\n }\n }\n }\n\n this.updateBoneRotation(this.getJawBoneNodeKey(), 'pitch', this.getActiveVisemeJawAmount());\n }\n\n private getJawBoneNodeKey(): BoneKey {\n const candidates = [\n this.config.auToBones[103]?.[0]?.node,\n this.config.auToBones[26]?.[0]?.node,\n 'JAW',\n ].filter((node): node is BoneKey => !!node);\n return candidates.find((node) => !!this.bones[node])\n ?? candidates[0]\n ?? 'JAW';\n }\n\n private getHeadBoneNodeKey(): BoneKey {\n const candidates = [\n this.config.auToBones[51]?.[0]?.node,\n this.config.auToBones[52]?.[0]?.node,\n this.compositeRotations.find((composite) => (\n composite.yaw?.aus.includes(51)\n || composite.yaw?.aus.includes(52)\n || composite.pitch?.aus.includes(53)\n || composite.pitch?.aus.includes(54)\n || composite.roll?.aus.includes(55)\n || composite.roll?.aus.includes(56)\n ))?.node\n ?? null,\n 'HEAD',\n ].filter((node): node is BoneKey => !!node);\n return candidates.find((node) => !!this.bones[node])\n ?? candidates[0]\n ?? 'HEAD';\n }\n\n private getActiveVisemeJawAmount(): number {\n let jawAmount = 0;\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const jawScale = this.visemeJawScales[index] ?? 1;\n if (Math.abs(jawScale) <= 1e-6) continue;\n jawAmount = Math.max(jawAmount, this.getVisemeJawAmount(index) * value * jawScale);\n }\n return jawAmount;\n }\n\n private getMorphValue(key: string): number {\n if (this.faceMesh) {\n const dict = this.faceMesh.morphTargetDictionary;\n const infl = this.faceMesh.morphTargetInfluences;\n if (dict && infl) {\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private getMorphValueForMeshes(key: string, meshNames?: string[]): number {\n const targets = this.resolveMorphTargets(key, meshNames);\n if (targets.length > 0) {\n return targets[0].infl[targets[0].idx] ?? 0;\n }\n return this.getMorphValue(key);\n }\n\n private getMorphValueByIndex(index: number): number {\n const idx = Number.isInteger(index) && index >= 0 ? index : null;\n if (idx === null) return 0;\n if (this.faceMesh) {\n const infl = this.faceMesh.morphTargetInfluences;\n if (infl && idx < infl.length) {\n return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const infl = mesh.morphTargetInfluences;\n if (!infl) continue;\n if (idx < infl.length) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private getMorphValueByIndexForMeshes(index: number, meshNames?: string[]): number {\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n if (targets.length > 0) {\n return targets[0].infl[targets[0].idx] ?? 0;\n }\n return this.getMorphValueByIndex(index);\n }\n\n private validateMorphTargetDelta(target: MorphTargetDelta, options: AddMorphTargetOptions): void {\n const mesh = this.requireNamedMesh(target.meshName);\n const geometry = mesh.geometry;\n const position = geometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot add morph target \"${target.name}\" to mesh \"${target.meshName}\": geometry has no position attribute.`);\n }\n if (!target.name || !target.name.trim()) {\n throw new Error(`Cannot add morph target to mesh \"${target.meshName}\": target name is required.`);\n }\n\n const existingIndex = this.getMeshMorphDictionary(mesh)[target.name];\n if (existingIndex !== undefined && options.replace !== true) {\n throw new Error(`Morph target \"${target.name}\" already exists on mesh \"${target.meshName}\". Pass replace: true to overwrite it.`);\n }\n\n this.assertMorphAttributeDataLength(target.name, 'position', target.position, position.itemSize, position.count);\n const normal = geometry.getAttribute('normal');\n if (target.normal) {\n this.assertMorphAttributeDataLength(target.name, 'normal', target.normal, normal?.itemSize ?? 3, position.count);\n }\n const tangent = geometry.getAttribute('tangent');\n if (target.tangent) {\n this.assertMorphAttributeDataLength(target.name, 'tangent', target.tangent, tangent?.itemSize ?? 4, position.count);\n }\n this.assertCompatibleMorphTargetMode(geometry, target);\n }\n\n private applyMorphTargetDelta(target: MorphTargetDelta, options: AddMorphTargetOptions): number {\n const mesh = this.requireNamedMesh(target.meshName);\n const sourceGeometry = mesh.geometry;\n const position = sourceGeometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot add morph target \"${target.name}\" to mesh \"${target.meshName}\": geometry has no position attribute.`);\n }\n if (!target.name || !target.name.trim()) {\n throw new Error(`Cannot add morph target to mesh \"${target.meshName}\": target name is required.`);\n }\n\n const replace = options.replace === true;\n const resetInfluence = options.resetInfluence !== false;\n const forceGeometryReplacement = options.forceGeometryReplacement !== false;\n const previousInfluences = mesh.morphTargetInfluences ? [...mesh.morphTargetInfluences] : [];\n const previousDictionary = this.getMeshMorphDictionary(mesh);\n const existingIndex = previousDictionary[target.name];\n\n if (existingIndex !== undefined && !replace) {\n throw new Error(`Morph target \"${target.name}\" already exists on mesh \"${target.meshName}\". Pass replace: true to overwrite it.`);\n }\n this.assertCompatibleMorphTargetMode(sourceGeometry, target);\n\n const geometry = forceGeometryReplacement ? sourceGeometry.clone() : sourceGeometry;\n const dictionary = { ...previousDictionary };\n const usedIndices = Object.values(dictionary).filter(Number.isInteger);\n const existingAttributeTargetCount = Math.max(\n 0,\n ...Object.values(geometry.morphAttributes).map((attributes) => attributes?.length ?? 0)\n );\n const nextIndex = Math.max(existingAttributeTargetCount, usedIndices.length ? Math.max(...usedIndices) + 1 : 0);\n const index = existingIndex ?? nextIndex;\n dictionary[target.name] = index;\n\n this.setMorphAttributeAtIndex(geometry, 'position', target.position, position.itemSize, position.count, index, target.name);\n\n const normal = geometry.getAttribute('normal');\n if (target.normal) {\n this.setMorphAttributeAtIndex(geometry, 'normal', target.normal, normal?.itemSize ?? 3, position.count, index, target.name);\n } else {\n this.setZeroMorphAttributeAtIndex(geometry, 'normal', normal?.itemSize ?? 3, position.count, index, target.name);\n }\n\n const tangent = geometry.getAttribute('tangent');\n if (target.tangent) {\n this.setMorphAttributeAtIndex(geometry, 'tangent', target.tangent, tangent?.itemSize ?? 4, position.count, index, target.name);\n } else {\n this.setZeroMorphAttributeAtIndex(geometry, 'tangent', tangent?.itemSize ?? 4, position.count, index, target.name);\n }\n const color = geometry.getAttribute('color');\n const existingColorMorph = geometry.morphAttributes.color?.find(Boolean);\n this.setZeroMorphAttributeAtIndex(\n geometry,\n 'color',\n color?.itemSize ?? existingColorMorph?.itemSize ?? 3,\n position.count,\n index,\n target.name\n );\n\n geometry.morphTargetsRelative = target.relative !== false;\n (geometry as any).morphTargetDictionary = dictionary;\n\n if (forceGeometryReplacement) {\n mesh.geometry = geometry;\n sourceGeometry.dispose();\n }\n\n const influenceLength = Math.max(previousInfluences.length, index + 1);\n const influences = previousInfluences.slice(0, influenceLength);\n while (influences.length < influenceLength) {\n influences.push(0);\n }\n if (resetInfluence) {\n influences[index] = 0;\n }\n\n mesh.morphTargetDictionary = dictionary;\n mesh.morphTargetInfluences = influences;\n this.addRuntimeMorphMesh(mesh);\n\n if (!this.config.morphToMesh?.face?.length) {\n this.config.morphToMesh = {\n ...this.config.morphToMesh,\n face: [mesh.name],\n };\n }\n\n return index;\n }\n\n private requireNamedMesh(meshName: string): Mesh {\n const mesh = this.meshByName.get(meshName);\n if (mesh) return mesh;\n\n if (this.model) {\n let found: Mesh | null = null;\n this.model.traverse((obj: any) => {\n if (!found && obj.isMesh && obj.name === meshName) {\n found = obj as Mesh;\n }\n });\n if (found) {\n this.meshByName.set(meshName, found);\n return found;\n }\n }\n\n throw new Error(`Mesh \"${meshName}\" was not found in the current model.`);\n }\n\n private getMeshMorphDictionary(mesh: Mesh): Record<string, number> {\n const meshDictionary = mesh.morphTargetDictionary as Record<string, number> | undefined;\n const geometryDictionary = (mesh.geometry as any).morphTargetDictionary as Record<string, number> | undefined;\n const dictionary = meshDictionary || geometryDictionary || {};\n mesh.morphTargetDictionary = dictionary;\n (mesh.geometry as any).morphTargetDictionary = dictionary;\n return dictionary;\n }\n\n private assertMorphAttributeDataLength(\n name: string,\n semantic: string,\n data: Float32Array | number[],\n itemSize: number,\n vertexCount: number\n ): void {\n const expectedLength = vertexCount * itemSize;\n if (data.length !== expectedLength) {\n throw new Error(\n `Morph target \"${name}\" ${semantic} data has ${data.length} values; expected ${expectedLength} ` +\n `(${vertexCount} vertices * itemSize ${itemSize}).`\n );\n }\n }\n\n private assertCompatibleMorphTargetMode(geometry: Mesh['geometry'], target: MorphTargetDelta): void {\n const hasExistingMorphTargets = Object.values(geometry.morphAttributes).some((attributes) => (attributes?.length ?? 0) > 0);\n if (!hasExistingMorphTargets) return;\n\n const targetIsRelative = target.relative !== false;\n if (geometry.morphTargetsRelative !== targetIsRelative) {\n const existingMode = geometry.morphTargetsRelative ? 'relative' : 'absolute';\n const targetMode = targetIsRelative ? 'relative' : 'absolute';\n throw new Error(\n `Cannot add ${targetMode} morph target \"${target.name}\" to mesh \"${target.meshName}\" because existing morph targets are ${existingMode}.`\n );\n }\n }\n\n private setMorphAttributeAtIndex(\n geometry: Mesh['geometry'],\n semantic: string,\n data: Float32Array | number[],\n itemSize: number,\n vertexCount: number,\n index: number,\n name: string\n ): void {\n this.assertMorphAttributeDataLength(name, semantic, data, itemSize, vertexCount);\n\n const expectedLength = vertexCount * itemSize;\n const attributes = geometry.morphAttributes[semantic] ? [...geometry.morphAttributes[semantic]] : [];\n while (attributes.length < index) {\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = `morph_${attributes.length}`;\n attributes.push(empty);\n }\n\n const values = data instanceof Float32Array ? new Float32Array(data) : Float32Array.from(data);\n const attribute = new BufferAttribute(values, itemSize);\n (attribute as any).name = name;\n attributes[index] = attribute;\n geometry.morphAttributes[semantic] = attributes;\n }\n\n private setZeroMorphAttributeAtIndex(\n geometry: Mesh['geometry'],\n semantic: string,\n itemSize: number,\n vertexCount: number,\n index: number,\n name: string\n ): void {\n if (!geometry.morphAttributes[semantic]?.length) return;\n\n const expectedLength = vertexCount * itemSize;\n const attributes = [...geometry.morphAttributes[semantic]];\n while (attributes.length < index) {\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = `morph_${attributes.length}`;\n attributes.push(empty);\n }\n\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = name;\n attributes[index] = empty;\n geometry.morphAttributes[semantic] = attributes;\n }\n\n private addRuntimeMorphMesh(mesh: Mesh): void {\n const key = mesh.name || (mesh as any).uuid;\n const exists = this.meshes.some((candidate) => (candidate.name || (candidate as any).uuid) === key);\n if (!exists) {\n this.meshes.push(mesh);\n }\n }\n\n private getMorphKeyCacheKey(key: string, meshNames?: string[]): string {\n return meshNames?.length ? `key:${key}@${meshNames.join(',')}` : `key:${key}`;\n }\n\n private getMorphIndexCacheKey(index: number, meshNames?: string[]): string {\n return meshNames?.length ? `idx:${index}@${meshNames.join(',')}` : `idx:${index}`;\n }\n\n private syncVisemeRuntimeState(): void {\n const visemeCount = getProfileVisemeSlots(this.config).length;\n this.visemeValues = Array.from(\n { length: visemeCount },\n (_, index) => this.visemeValues[index] ?? 0\n );\n this.visemeJawScales = Array.from(\n { length: visemeCount },\n (_, index) => this.visemeJawScales[index] ?? 1\n );\n }\n\n private getVisemeJawAmount(visemeIndex: number): number {\n return getVisemeJawAmounts(this.config)?.[visemeIndex]\n ?? this.config.visemeJawAmounts?.[visemeIndex]\n ?? Embody.VISEME_JAW_AMOUNTS[visemeIndex]\n ?? 0;\n }\n\n private collectResolvedExpressionMorphTargets(): MorphTargetHandle[] {\n const targets: MorphTargetHandle[] = [];\n\n for (const resolved of this.resolvedAUMorphTargets.values()) {\n targets.push(...resolved.left, ...resolved.right, ...resolved.center);\n }\n\n for (const resolved of this.resolvedVisemeTargets) {\n if (resolved?.length) {\n targets.push(...resolved);\n }\n }\n\n return targets;\n }\n\n private resetMorphTargetHandles(targets: MorphTargetHandle[]): void {\n this.frameApplier.resetMorphTargets(targets);\n }\n\n private isMixedAU(id: number): boolean {\n const morphs = this.config.auToMorphs[id];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && this.config.auToBones[id]?.length);\n }\n\n private getEffectiveBoneAUValue(auId: number, nodeKey: string): number {\n const rawValue = clamp01(this.auValues[auId] ?? 0);\n if (rawValue <= 1e-6) return 0;\n\n const binding = this.config.auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n\n return rawValue * getSideScale(this.auBalances[auId] ?? 0, binding.side);\n }\n\n private getCompositeAxisValueForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined\n ): number {\n return getCompositeAxisValue(axisConfig, (auId: number) => this.getEffectiveBoneAUValue(auId, nodeKey));\n }\n\n private getCompositeAxisBindingForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined,\n direction: number\n ) {\n return getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n direction,\n (auId: number) => this.getEffectiveBoneAUValue(auId, nodeKey),\n this.config.auToBones\n );\n }\n\n private initBoneRotations(): void {\n this.rotations = {};\n this.pendingCompositeNodes.clear();\n\n const allBoneKeys = Array.from(\n new Set(Object.values(this.config.auToBones).flat().map((binding) => binding.node))\n );\n\n for (const node of allBoneKeys) {\n this.rotations[node] = { pitch: 0, yaw: 0, roll: 0 };\n this.pendingCompositeNodes.add(node);\n }\n }\n\n /** Update rotation state - just stores -1 to 1 value like stable version */\n private updateBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', value: number): void {\n if (!this.rotations[nodeKey]) return;\n this.rotations[nodeKey][axis] = Math.max(-1, Math.min(1, value));\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private updateBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', value: number, maxUnits: number): void {\n if (!this.translations[nodeKey]) this.translations[nodeKey] = { x: 0, y: 0, z: 0 };\n const clamped = Math.max(-1, Math.min(1, value));\n const offset = clamped * maxUnits;\n if (channel === 'tx') this.translations[nodeKey].x = offset;\n else if (channel === 'ty') this.translations[nodeKey].y = offset;\n else this.translations[nodeKey].z = offset;\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private transitionBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', to: number, durationMs = 200): TransitionHandle {\n const transitionKey = `bone_${nodeKey}_${axis}`;\n const from = this.rotations[nodeKey]?.[axis] ?? 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneRotation(nodeKey, axis, value));\n }\n\n private transitionBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', to: number, maxUnits: number, durationMs = 200): TransitionHandle {\n const transitionKey = `boneT_${nodeKey}_${channel}`;\n const current = this.translations[nodeKey] || { x: 0, y: 0, z: 0 };\n const currentOffset = channel === 'tx' ? current.x : channel === 'ty' ? current.y : current.z;\n const from = maxUnits !== 0 ? Math.max(-1, Math.min(1, currentOffset / maxUnits)) : 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneTranslation(nodeKey, channel, value, maxUnits));\n }\n\n private flushPendingComposites(): void {\n if (this.pendingCompositeNodes.size === 0) return;\n\n const headNodeKey = this.getHeadBoneNodeKey();\n const headChanged = this.pendingCompositeNodes.has(headNodeKey) || this.pendingCompositeNodes.has('HEAD');\n\n for (const nodeKey of this.pendingCompositeNodes) {\n this.applyCompositeRotation(nodeKey as BoneKey);\n }\n this.pendingCompositeNodes.clear();\n\n // Update hair when head rotation changes\n if (headChanged && this.hairPhysics.isHairPhysicsEnabled()) {\n const headRotation = this.rotations[headNodeKey] ?? this.rotations.HEAD;\n this.hairPhysics.onHeadRotationChanged(\n headRotation?.yaw ?? 0,\n headRotation?.pitch ?? 0\n );\n }\n }\n\n /**\n * Apply composite rotation using quaternion composition like stable version.\n * Looks up maxDegrees and channel from BONE_AU_TO_BINDINGS.\n */\n private applyCompositeRotation(nodeKey: BoneKey): void {\n const entry = this.bones[nodeKey];\n if (!entry || !this.model) {\n if (!entry && this.rigReady && !this.missingBoneWarnings.has(nodeKey)) {\n this.missingBoneWarnings.add(nodeKey);\n }\n return;\n }\n\n const { obj, basePos, baseQuat } = entry;\n const rotState = this.rotations[nodeKey];\n if (!rotState) {\n return;\n }\n\n // Find the composite rotation config for this node\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) {\n return;\n }\n\n // Helper to get Vector3 axis from channel\n const getAxis = (channel: 'rx' | 'ry' | 'rz') =>\n channel === 'rx' ? X_AXIS : channel === 'ry' ? Y_AXIS : Z_AXIS;\n\n // Build composite quaternion from base\n const compositeQ = new Quaternion().copy(baseQuat);\n\n // Apply yaw rotation\n if (config.yaw && rotState.yaw !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.yaw, rotState.yaw);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.yaw) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n // Apply pitch rotation\n if (config.pitch && rotState.pitch !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.pitch, rotState.pitch);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.pitch) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n // Apply roll rotation\n if (config.roll && rotState.roll !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.roll, rotState.roll);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.roll) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n const t = this.translations[nodeKey];\n this.frameApplier.applyObjectTransform(obj, {\n position: {\n x: basePos.x + (t?.x ?? 0),\n y: basePos.y + (t?.y ?? 0),\n z: basePos.z + (t?.z ?? 0),\n },\n rotation: {\n x: compositeQ.x,\n y: compositeQ.y,\n z: compositeQ.z,\n w: compositeQ.w,\n },\n });\n this.model.updateMatrixWorld(true);\n }\n\n private resolveBones(root: Object3D): ResolvedBones {\n const resolved: ResolvedBones = {};\n const previousBones = this.bones;\n\n const snapshot = (obj: any): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const snapshotPreservingBasePose = (obj: Object3D): NodeBase => {\n const existing = Object.values(previousBones).find((entry) => entry?.obj === obj);\n if (!existing) {\n return snapshot(obj);\n }\n\n return {\n obj,\n basePos: { ...existing.basePos },\n baseQuat: existing.baseQuat.clone(),\n baseEuler: { ...existing.baseEuler },\n };\n };\n\n // Build suffix regex from config pattern\n const prefix = this.config.bonePrefix || '';\n const suffix = this.config.boneSuffix || '';\n const suffixRegex = this.config.suffixPattern\n ? new RegExp(this.config.suffixPattern)\n : null;\n\n const findNode = (baseName?: string | null): Object3D | undefined => {\n if (!baseName) return undefined;\n\n const directMatch = root.getObjectByName(baseName);\n if (directMatch) return directMatch;\n\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n const fullName = suffix && !prefixedBase.endsWith(suffix)\n ? `${prefixedBase}${suffix}`\n : prefixedBase;\n\n const exactMatch = root.getObjectByName(fullName);\n if (exactMatch) return exactMatch;\n\n // Try fuzzy match with suffix pattern if configured\n if (suffixRegex) {\n let found: Object3D | undefined;\n root.traverse((obj: any) => {\n if (found) return; // Already found\n if (obj.name && obj.name.startsWith(fullName)) {\n const suffix = obj.name.slice(fullName.length);\n // Match if suffix is empty or matches the pattern\n if (suffix === '' || suffixRegex.test(suffix)) {\n found = obj;\n }\n }\n });\n if (found) return found;\n }\n\n return undefined;\n };\n\n const addResolvedBone = (key: string, node: Object3D) => {\n const entry = snapshotPreservingBasePose(node);\n resolved[key] = entry;\n if (node.name) {\n resolved[node.name] = entry;\n }\n };\n\n for (const [key, nodeName] of Object.entries(this.config.boneNodes)) {\n const node = findNode(nodeName);\n if (node) {\n addResolvedBone(key, node);\n if (nodeName) {\n resolved[nodeName] = resolved[key]!;\n }\n }\n }\n\n if (!resolved.EYE_L && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.LEFT);\n if (node) {\n addResolvedBone('EYE_L', node);\n }\n }\n if (!resolved.EYE_R && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.RIGHT);\n if (node) {\n addResolvedBone('EYE_R', node);\n }\n }\n\n const referencedNodes = new Set<string>();\n Object.values(this.config.auToBones ?? {}).forEach((bindings) => {\n bindings.forEach((binding) => referencedNodes.add(binding.node));\n });\n this.compositeRotations.forEach((composite) => referencedNodes.add(composite.node));\n Object.values(this.config.continuumPairs ?? {}).forEach((pair) => {\n if (pair?.node) referencedNodes.add(pair.node);\n });\n this.config.annotationRegions?.forEach((region) => {\n region.bones?.forEach((boneName) => referencedNodes.add(boneName));\n });\n\n referencedNodes.forEach((nodeKey) => {\n if (resolved[nodeKey]) return;\n const configuredName = this.config.boneNodes?.[nodeKey] ?? nodeKey;\n const node = findNode(configuredName);\n if (node) {\n addResolvedBone(nodeKey, node);\n if (configuredName) {\n resolved[configuredName] = resolved[nodeKey]!;\n }\n }\n });\n\n return resolved;\n }\n\n private combineHandles(handles: TransitionHandle[]): TransitionHandle {\n if (handles.length === 0) return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n if (handles.length === 1) return handles[0];\n return {\n promise: Promise.all(handles.map((h) => h.promise)).then(() => {}),\n pause: () => handles.forEach((h) => h.pause()),\n resume: () => handles.forEach((h) => h.resume()),\n cancel: () => handles.forEach((h) => h.cancel()),\n };\n }\n\n /**\n * Apply render order and material settings from CC4_MESHES to all meshes.\n * This ensures proper layering (e.g., hair renders on top of eyebrows).\n * Also auto-registers hair and eyebrow meshes for hair physics.\n */\n private applyMeshMaterialSettings(root: Object3D): void {\n // Clear and rebuild hair object registry\n this.hairPhysics.clearRegisteredHairObjects();\n\n root.traverse((obj: any) => {\n if (!obj.isMesh || !obj.name) return;\n\n // Merge config.meshes (user overrides) with CC4_MESHES (preset defaults).\n // User overrides may only contain material settings, so always merge with\n // the preset to preserve category and other fields needed for registration.\n const configMesh = this.config.meshes?.[obj.name];\n const presetMesh = CC4_MESHES[obj.name];\n const meshInfo = configMesh && presetMesh ? { ...presetMesh, ...configMesh } : configMesh ?? presetMesh;\n const category = meshInfo?.category;\n\n // Auto-register hair and eyebrow meshes for hair physics\n if (category === 'hair' || category === 'eyebrow') {\n this.hairPhysics.autoRegisterHairMesh(obj as Mesh, category);\n }\n\n if (!meshInfo?.material) return;\n\n this.frameApplier.setMeshMaterialConfig(root, obj.name, meshInfo.material as ThreeMaterialConfig);\n });\n\n }\n\n // ============================================================================\n // MIXER / CLIP CONTROL\n // ============================================================================\n\n loadAnimationClips(clips: unknown[]): void {\n this.animationController.loadAnimationClips(clips);\n }\n\n getAnimationClips(): AnimationClipInfo[] {\n return this.animationController.getAnimationClips();\n }\n\n removeAnimationClip(clipName: string): boolean {\n return this.animationController.removeAnimationClip(clipName);\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.animationController.playAnimation(clipName, options);\n }\n\n stopAnimation(clipName: string): void {\n this.animationController.stopAnimation(clipName);\n }\n\n stopAllAnimations(): void {\n this.animationController.stopAllAnimations();\n }\n\n pauseAnimation(clipName: string): void {\n this.animationController.pauseAnimation(clipName);\n }\n\n resumeAnimation(clipName: string): void {\n this.animationController.resumeAnimation(clipName);\n }\n\n pauseAllAnimations(): void {\n this.animationController.pauseAllAnimations();\n }\n\n resumeAllAnimations(): void {\n this.animationController.resumeAllAnimations();\n }\n\n setAnimationSpeed(clipName: string, speed: number): void {\n this.animationController.setAnimationSpeed(clipName, speed);\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n this.animationController.setAnimationIntensity(clipName, intensity);\n }\n\n setAnimationLoopMode(clipName: string, loopMode: 'repeat' | 'once' | 'pingpong'): void {\n this.animationController.setAnimationLoopMode(clipName, loopMode);\n }\n\n setAnimationRepeatCount(clipName: string, repeatCount?: number): void {\n this.animationController.setAnimationRepeatCount(clipName, repeatCount);\n }\n\n setAnimationReverse(clipName: string, reverse: boolean): void {\n this.animationController.setAnimationReverse(clipName, reverse);\n }\n\n setAnimationBlendMode(clipName: string, blendMode: AnimationBlendMode): void {\n this.animationController.setAnimationBlendMode(clipName, blendMode);\n }\n\n seekAnimation(clipName: string, time: number): void {\n this.animationController.seekAnimation(clipName, time);\n }\n\n setAnimationTimeScale(timeScale: number): void {\n this.animationController.setAnimationTimeScale(timeScale);\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n return this.animationController.getAnimationState(clipName);\n }\n\n getPlayingAnimations(): AnimationState[] {\n return this.animationController.getPlayingAnimations();\n }\n\n crossfadeTo(clipName: string, duration = 0.3, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.animationController.crossfadeTo(clipName, duration, options);\n }\n\n snippetToClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): AnimationClip | null {\n return this.animationController.snippetToClip(clipName, curves, options);\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n return this.animationController.playClip(clip, options);\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap } | TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.playSnippet(snippet, options);\n }\n\n playTypedSnippet(\n snippet: TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.playTypedSnippet(snippet, options);\n }\n\n buildClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.buildClip(clipName, curves, options);\n }\n\n buildTypedClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.buildTypedClip(clipName, channels, options);\n }\n\n typedSnippetToClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): AnimationClip | null {\n return this.animationController.typedSnippetToClip(clipName, channels, options);\n }\n\n cleanupSnippet(name: string) {\n this.animationController.cleanupSnippet(name);\n }\n\n updateClipParams(\n name: string,\n params: { weight?: number; rate?: number; loop?: boolean; loopMode?: 'once' | 'repeat' | 'pingpong'; repeatCount?: number; reverse?: boolean; actionId?: string }\n ): boolean {\n return this.animationController.updateClipParams(name, params);\n }\n\n /**\n * Check if curves can be played through buildClip.\n * Returns false if curves contain data that cannot be converted to mixer tracks.\n */\n supportsClipCurves(\n curves: Record<string, Array<{ time: number; intensity: number; inherit?: boolean }>>\n ): boolean {\n // Currently all curve-based playback is supported - bone AUs are handled via\n // quaternion tracks in the generated clip\n return Object.keys(curves).length > 0;\n }\n}\n\n/**\n * Helper function to collect meshes with morph targets from a scene.\n */\nexport function collectMorphMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n const dict = obj.morphTargetDictionary;\n const infl = obj.morphTargetInfluences;\n if ((dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0)) {\n meshes.push(obj);\n }\n }\n });\n return meshes;\n}\n\nexport function buildFrameApplierBindings(\n inspection: ReturnType<ThreeModelInspector['inspectModel']>\n): ThreeFrameApplierBindings {\n const meshes = new Map<import('../../core/contracts').MeshId, Mesh>();\n for (const meshDesc of inspection.descriptor.meshes) {\n const mesh = inspection.meshByName.get(meshDesc.name)\n || inspection.allMeshes.find((candidate) => candidate.name === meshDesc.name);\n if (mesh) {\n meshes.set(meshDesc.id, mesh);\n }\n }\n\n const morphTargets = new Map<\n import('../../core/contracts').MorphTargetId,\n { meshId: import('../../core/contracts').MeshId; mesh: Mesh; index: number }\n >();\n for (const morph of inspection.descriptor.morphTargets) {\n const mesh = meshes.get(morph.meshId);\n if (!mesh || morph.hostIndex === undefined) continue;\n morphTargets.set(morph.id, {\n meshId: morph.meshId,\n mesh,\n index: morph.hostIndex,\n });\n }\n\n const bonesByName = new Map<string, Object3D>();\n for (const entry of Object.values(inspection.bones)) {\n if (entry?.obj?.name) {\n bonesByName.set(entry.obj.name, entry.obj);\n }\n }\n if (inspection.allMeshes[0]?.parent) {\n let root: Object3D | null = inspection.allMeshes[0];\n while (root?.parent) root = root.parent;\n root?.traverse((obj) => {\n if (obj.name && !bonesByName.has(obj.name)) {\n bonesByName.set(obj.name, obj);\n }\n });\n }\n\n const bones = new Map<import('../../core/contracts').BoneId, Object3D>();\n for (const boneDesc of inspection.descriptor.bones) {\n const bone = bonesByName.get(boneDesc.name);\n if (bone) {\n bones.set(boneDesc.id, bone);\n }\n }\n\n return { meshes, morphTargets, bones };\n}\n","import {\n AnimationClip,\n NumberKeyframeTrack,\n QuaternionKeyframeTrack,\n VectorKeyframeTrack,\n} from 'three';\nimport type { Object3D } from 'three';\nimport type {\n BoneId,\n ClipIR,\n ClipTrackIR,\n MeshId,\n MorphTargetId,\n NumericArray,\n} from '../../core/contracts';\n\nexport interface ThreeClipMeshBinding {\n readonly trackName: string;\n}\n\nexport interface ThreeClipMorphTargetBinding {\n readonly meshId: MeshId;\n readonly index: number;\n}\n\nexport interface ThreeClipAdapterBindings {\n readonly meshes?: ReadonlyMap<MeshId, Object3D | ThreeClipMeshBinding>;\n readonly morphTargets?: ReadonlyMap<MorphTargetId, ThreeClipMorphTargetBinding>;\n readonly bones?: ReadonlyMap<BoneId, Object3D | string>;\n}\n\nexport class ThreeClipAdapter {\n private meshes = new Map<MeshId, Object3D | ThreeClipMeshBinding>();\n private morphTargets = new Map<MorphTargetId, ThreeClipMorphTargetBinding>();\n private bones = new Map<BoneId, Object3D | string>();\n\n constructor(bindings: ThreeClipAdapterBindings = {}) {\n this.setBindings(bindings);\n }\n\n setBindings(bindings: ThreeClipAdapterBindings): void {\n this.meshes = new Map(bindings.meshes || []);\n this.morphTargets = new Map(bindings.morphTargets || []);\n this.bones = new Map(bindings.bones || []);\n }\n\n toAnimationClip(clip: ClipIR): AnimationClip {\n return new AnimationClip(\n clip.name,\n clip.durationSeconds,\n clip.tracks.map((track) => this.toKeyframeTrack(track)).filter((track): track is NonNullable<typeof track> => !!track)\n );\n }\n\n private toKeyframeTrack(track: ClipTrackIR) {\n if (track.target.kind === 'morphTarget') {\n const morph = this.morphTargets.get(track.target.morphTargetId);\n const mesh = this.meshes.get(track.target.meshId);\n if (!morph || !mesh) return null;\n return new NumberKeyframeTrack(\n `${getTrackName(mesh)}.morphTargetInfluences[${morph.index}]`,\n toArray(track.times),\n toArray(track.values)\n );\n }\n\n if (track.target.kind === 'boneTransform') {\n const bone = this.bones.get(track.target.boneId);\n if (!bone) return null;\n const targetName = getTrackName(bone);\n const times = toArray(track.times);\n const values = toArray(track.values);\n\n if (track.target.property === 'rotation') {\n return new QuaternionKeyframeTrack(`${targetName}.quaternion`, times, values);\n }\n if (track.target.property === 'position') {\n return new VectorKeyframeTrack(`${targetName}.position`, times, values);\n }\n return new VectorKeyframeTrack(`${targetName}.scale`, times, values);\n }\n\n if (track.target.kind === 'meshVisibility') {\n const mesh = this.meshes.get(track.target.meshId);\n if (!mesh) return null;\n return new NumberKeyframeTrack(`${getTrackName(mesh)}.visible`, toArray(track.times), toArray(track.values));\n }\n\n return null;\n }\n}\n\nfunction getTrackName(value: Object3D | string | ThreeClipMeshBinding): string {\n if (typeof value === 'string') return value;\n if ('trackName' in value) return value.trackName;\n return value.uuid || value.name;\n}\n\nfunction toArray(values: NumericArray): number[] {\n return Array.from(values);\n}\n","/**\n * Default Three.js scene host for Embody characters.\n *\n * Creates renderer / scene / camera / lighting / shadow plane and mounts the\n * canvas into a caller-supplied HTMLElement. Advanced callers can skip this\n * and inject an existing Three.js scene via createCharacterHost.\n */\n\nimport {\n ACESFilmicToneMapping,\n Color,\n DirectionalLight,\n HemisphereLight,\n MathUtils,\n Mesh,\n PCFSoftShadowMap,\n PerspectiveCamera,\n PlaneGeometry,\n PMREMGenerator,\n Scene,\n ShadowMaterial,\n SRGBColorSpace,\n WebGLRenderer,\n type Texture,\n type WebGLRenderTarget,\n} from 'three';\nimport { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';\n\nexport type DefaultCharacterLightingPresetId =\n | 'cleanStudio'\n | 'softFill'\n | 'inspection'\n | 'contrast';\n\nexport interface DefaultCharacterLightingSettings {\n envMapEnabled: boolean;\n environmentIntensity: number;\n environmentBlur: number;\n exposure: number;\n ambientIntensity: number;\n keyIntensity: number;\n fillIntensity: number;\n rimIntensity: number;\n shadowOpacity: number;\n}\n\nexport interface DefaultCharacterLightingController {\n getSettings: () => DefaultCharacterLightingSettings;\n getEnvironmentTexture: () => Texture | null;\n setSettings: (patch: Partial<DefaultCharacterLightingSettings>) => DefaultCharacterLightingSettings;\n setPreset: (presetId: DefaultCharacterLightingPresetId) => DefaultCharacterLightingSettings;\n subscribe: (listener: (settings: DefaultCharacterLightingSettings) => void) => () => void;\n dispose: () => void;\n}\n\nexport type CharacterSceneTypeId = 'studio' | 'showcase' | 'inspection' | 'void';\n\n/** A named bundle of scene defaults (background, lighting preset, shadow plane). */\nexport interface CharacterSceneTypeDefinition {\n id: CharacterSceneTypeId;\n label: string;\n description: string;\n /** Scene background color (hex), or null for a transparent canvas. */\n background: number | null;\n lightingPreset: DefaultCharacterLightingPresetId;\n shadowPlane: boolean;\n}\n\nexport interface DefaultCharacterSceneOptions {\n /** Named scene type providing background/lighting/shadow defaults. Default: 'studio' */\n type?: CharacterSceneTypeId;\n /** Perspective camera FOV. Default: 45 */\n cameraFov?: number;\n /** Cap device pixel ratio. Default: 1.5 */\n pixelRatioCap?: number;\n /** Enable shadow maps. Default: true */\n shadows?: boolean;\n /** Add a ground shadow receiver. Default: from scene type */\n shadowPlane?: boolean;\n /** Scene background color (hex or CSS string), or null for transparent. Default: from scene type */\n background?: number | string | null;\n /** Initial lighting settings / overrides */\n lighting?: Partial<DefaultCharacterLightingSettings>;\n /** Lighting preset applied before lighting overrides. Default: from scene type */\n lightingPreset?: DefaultCharacterLightingPresetId;\n /** Listen for window resize. Default: true */\n manageResize?: boolean;\n}\n\nexport interface DefaultCharacterScene {\n container: HTMLElement;\n scene: Scene;\n renderer: WebGLRenderer;\n camera: PerspectiveCamera;\n lighting: DefaultCharacterLightingController;\n shadowPlane: Mesh | null;\n /** Resolved scene type used for defaults. */\n sceneType: CharacterSceneTypeId;\n ownsScene: true;\n resize: () => void;\n dispose: () => void;\n}\n\nexport const DEFAULT_CHARACTER_SCENE_TYPE_ID: CharacterSceneTypeId = 'studio';\n\nexport const CHARACTER_SCENE_TYPES: Record<CharacterSceneTypeId, CharacterSceneTypeDefinition> = {\n studio: {\n id: 'studio',\n label: 'Studio',\n description: 'Transparent background, soft studio lighting, ground shadow.',\n background: null,\n lightingPreset: 'cleanStudio',\n shadowPlane: true,\n },\n showcase: {\n id: 'showcase',\n label: 'Showcase',\n description: 'Dark backdrop with contrasty key/rim lighting for presentation shots.',\n background: 0x101216,\n lightingPreset: 'contrast',\n shadowPlane: true,\n },\n inspection: {\n id: 'inspection',\n label: 'Inspection',\n description: 'Bright, even lighting on a light backdrop for close-up review.',\n background: 0xe8eaed,\n lightingPreset: 'inspection',\n shadowPlane: true,\n },\n void: {\n id: 'void',\n label: 'Void',\n description: 'Transparent background, soft fill lighting, no ground shadow.',\n background: null,\n lightingPreset: 'softFill',\n shadowPlane: false,\n },\n};\n\nexport const CHARACTER_SCENE_TYPE_IDS: readonly CharacterSceneTypeId[] = [\n 'studio',\n 'showcase',\n 'inspection',\n 'void',\n];\n\nconst LIGHT_NAMES = {\n ambient: 'embodyCharacterAmbientHemisphereLight',\n key: 'embodyCharacterKeyLight',\n fill: 'embodyCharacterFillLight',\n rim: 'embodyCharacterRimLight',\n} as const;\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_ID: DefaultCharacterLightingPresetId = 'cleanStudio';\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESETS: Record<\n DefaultCharacterLightingPresetId,\n { id: DefaultCharacterLightingPresetId; label: string; settings: DefaultCharacterLightingSettings }\n> = {\n cleanStudio: {\n id: 'cleanStudio',\n label: 'Soft Studio',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.24,\n environmentBlur: 0.04,\n exposure: 1.08,\n ambientIntensity: 0.32,\n keyIntensity: 0.52,\n fillIntensity: 0.18,\n rimIntensity: 0.08,\n shadowOpacity: 0.22,\n },\n },\n softFill: {\n id: 'softFill',\n label: 'Soft Fill',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.3,\n environmentBlur: 0.04,\n exposure: 1.1,\n ambientIntensity: 0.38,\n keyIntensity: 0.44,\n fillIntensity: 0.24,\n rimIntensity: 0.1,\n shadowOpacity: 0.18,\n },\n },\n inspection: {\n id: 'inspection',\n label: 'Inspection',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.45,\n environmentBlur: 0.035,\n exposure: 1.18,\n ambientIntensity: 0.48,\n keyIntensity: 0.58,\n fillIntensity: 0.32,\n rimIntensity: 0.14,\n shadowOpacity: 0.12,\n },\n },\n contrast: {\n id: 'contrast',\n label: 'Contrast',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.2,\n environmentBlur: 0.035,\n exposure: 1.08,\n ambientIntensity: 0.25,\n keyIntensity: 0.7,\n fillIntensity: 0.12,\n rimIntensity: 0.22,\n shadowOpacity: 0.28,\n },\n },\n};\n\nexport const DEFAULT_CHARACTER_LIGHTING_SETTINGS: DefaultCharacterLightingSettings = {\n ...DEFAULT_CHARACTER_LIGHTING_PRESETS[DEFAULT_CHARACTER_LIGHTING_PRESET_ID].settings,\n};\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_IDS: readonly DefaultCharacterLightingPresetId[] = [\n 'cleanStudio',\n 'softFill',\n 'inspection',\n 'contrast',\n];\n\nfunction cloneSettings(settings: DefaultCharacterLightingSettings): DefaultCharacterLightingSettings {\n return { ...settings };\n}\n\nfunction clampFinite(value: unknown, min: number, max: number, fallback: number): number {\n const numeric = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numeric)) return fallback;\n return MathUtils.clamp(numeric, min, max);\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === 'boolean' ? value : fallback;\n}\n\ntype DefaultCharacterLightingSettingsInput = Partial<\n Record<keyof DefaultCharacterLightingSettings, unknown>\n>;\n\nfunction normalizeSettings(\n settings: DefaultCharacterLightingSettingsInput,\n): DefaultCharacterLightingSettings {\n return {\n envMapEnabled: normalizeBoolean(settings.envMapEnabled, DEFAULT_CHARACTER_LIGHTING_SETTINGS.envMapEnabled),\n environmentIntensity: clampFinite(\n settings.environmentIntensity,\n 0,\n 1.5,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentIntensity,\n ),\n environmentBlur: clampFinite(\n settings.environmentBlur,\n 0,\n 0.04,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentBlur,\n ),\n exposure: clampFinite(settings.exposure, 0.6, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.exposure),\n ambientIntensity: clampFinite(\n settings.ambientIntensity,\n 0,\n 1.4,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.ambientIntensity,\n ),\n keyIntensity: clampFinite(settings.keyIntensity, 0, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.keyIntensity),\n fillIntensity: clampFinite(settings.fillIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.fillIntensity),\n rimIntensity: clampFinite(settings.rimIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.rimIntensity),\n shadowOpacity: clampFinite(settings.shadowOpacity, 0, 0.5, DEFAULT_CHARACTER_LIGHTING_SETTINGS.shadowOpacity),\n };\n}\n\n/**\n * Normalize persisted / untrusted lighting settings (e.g. profile JSON).\n * Returns null when the value is not a plain object.\n */\nexport function normalizeDefaultCharacterLightingSettings(\n value: unknown,\n): DefaultCharacterLightingSettings | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n\n return normalizeSettings(value as DefaultCharacterLightingSettingsInput);\n}\n\nfunction setRendererLighting(renderer: WebGLRenderer, settings: DefaultCharacterLightingSettings): void {\n renderer.outputColorSpace = SRGBColorSpace;\n renderer.toneMapping = ACESFilmicToneMapping;\n renderer.toneMappingExposure = settings.exposure;\n}\n\nfunction updateShadowPlaneOpacity(scene: Scene, opacity: number): void {\n const shadowPlane = scene.getObjectByName('shadowPlane');\n if (!(shadowPlane instanceof Mesh)) return;\n\n const materials = Array.isArray(shadowPlane.material) ? shadowPlane.material : [shadowPlane.material];\n materials.forEach((material) => {\n if (material instanceof ShadowMaterial) {\n material.opacity = opacity;\n material.needsUpdate = true;\n }\n });\n}\n\nfunction createLightRig(scene: Scene) {\n const ambient = new HemisphereLight(0xf7fbff, 0x6b7280, 0);\n ambient.name = LIGHT_NAMES.ambient;\n ambient.position.set(0, 8, 0);\n scene.add(ambient);\n\n const key = new DirectionalLight(0xfffbf4, 0);\n key.name = LIGHT_NAMES.key;\n key.position.set(4.5, 7.5, 6.2);\n key.castShadow = true;\n key.shadow.mapSize.width = 2048;\n key.shadow.mapSize.height = 2048;\n key.shadow.camera.near = 0.5;\n key.shadow.camera.far = 50;\n key.shadow.camera.left = -10;\n key.shadow.camera.right = 10;\n key.shadow.camera.top = 10;\n key.shadow.camera.bottom = -10;\n key.shadow.bias = -0.0001;\n key.shadow.radius = 4;\n scene.add(key);\n\n const fill = new DirectionalLight(0xe8f0ff, 0);\n fill.name = LIGHT_NAMES.fill;\n fill.position.set(-5.5, 4.2, 4.5);\n scene.add(fill);\n\n const rim = new DirectionalLight(0xdde8ff, 0);\n rim.name = LIGHT_NAMES.rim;\n rim.position.set(-3.5, 4.8, -5.4);\n scene.add(rim);\n\n return { ambient, key, fill, rim };\n}\n\nexport function createShadowPlane(\n scene: Scene,\n options: { size?: number; opacity?: number; yPosition?: number } = {},\n): Mesh {\n const { size = 20, opacity = 0.3, yPosition = -0.01 } = options;\n const shadowPlane = new Mesh(\n new PlaneGeometry(size, size),\n new ShadowMaterial({ opacity }),\n );\n shadowPlane.rotation.x = -Math.PI / 2;\n shadowPlane.position.y = yPosition;\n shadowPlane.receiveShadow = true;\n shadowPlane.name = 'shadowPlane';\n scene.add(shadowPlane);\n return shadowPlane;\n}\n\nexport function createDefaultCharacterLighting(\n scene: Scene,\n renderer: WebGLRenderer,\n initialSettings: Partial<DefaultCharacterLightingSettings> = DEFAULT_CHARACTER_LIGHTING_SETTINGS,\n): DefaultCharacterLightingController {\n const lights = createLightRig(scene);\n const pmremGenerator = new PMREMGenerator(renderer);\n const listeners = new Set<(settings: DefaultCharacterLightingSettings) => void>();\n let environmentTarget: WebGLRenderTarget | null = null;\n let settings = normalizeSettings(initialSettings);\n\n const notify = () => {\n const nextSettings = cloneSettings(settings);\n listeners.forEach((listener) => listener(nextSettings));\n };\n\n const disposeEnvironmentTarget = () => {\n environmentTarget?.dispose();\n environmentTarget = null;\n };\n\n const rebuildEnvironment = () => {\n disposeEnvironmentTarget();\n if (!settings.envMapEnabled) {\n scene.environment = null;\n scene.environmentIntensity = 0;\n return;\n }\n\n const roomEnvironment = new RoomEnvironment();\n try {\n environmentTarget = pmremGenerator.fromScene(roomEnvironment, settings.environmentBlur);\n } finally {\n roomEnvironment.dispose();\n }\n\n scene.environment = environmentTarget.texture;\n scene.environmentIntensity = settings.environmentIntensity;\n };\n\n const applySettings = () => {\n setRendererLighting(renderer, settings);\n scene.environmentIntensity = settings.envMapEnabled ? settings.environmentIntensity : 0;\n lights.ambient.intensity = settings.ambientIntensity;\n lights.key.intensity = settings.keyIntensity;\n lights.fill.intensity = settings.fillIntensity;\n lights.rim.intensity = settings.rimIntensity;\n updateShadowPlaneOpacity(scene, settings.shadowOpacity);\n };\n\n rebuildEnvironment();\n applySettings();\n\n const setSettings = (\n patch: Partial<DefaultCharacterLightingSettings>,\n ): DefaultCharacterLightingSettings => {\n const nextSettings = normalizeSettings({ ...settings, ...patch });\n const shouldRebuildEnvironment =\n nextSettings.envMapEnabled !== settings.envMapEnabled ||\n nextSettings.environmentBlur !== settings.environmentBlur;\n\n settings = nextSettings;\n if (shouldRebuildEnvironment) {\n rebuildEnvironment();\n }\n applySettings();\n notify();\n return cloneSettings(settings);\n };\n\n return {\n getSettings: () => cloneSettings(settings),\n getEnvironmentTexture: () => environmentTarget?.texture ?? null,\n setSettings,\n setPreset: (presetId) => {\n const preset = DEFAULT_CHARACTER_LIGHTING_PRESETS[presetId];\n if (!preset) return cloneSettings(settings);\n return setSettings(preset.settings);\n },\n subscribe: (listener) => {\n listeners.add(listener);\n listener(cloneSettings(settings));\n return () => {\n listeners.delete(listener);\n };\n },\n dispose: () => {\n listeners.clear();\n disposeEnvironmentTarget();\n pmremGenerator.dispose();\n scene.environment = null;\n scene.remove(lights.ambient, lights.key, lights.fill, lights.rim);\n },\n };\n}\n\nfunction resolveContainerSize(container: HTMLElement): { width: number; height: number } {\n const width = container.clientWidth || (typeof window !== 'undefined' ? window.innerWidth : 1);\n const height = container.clientHeight || (typeof window !== 'undefined' ? window.innerHeight : 1);\n return {\n width: Math.max(1, width),\n height: Math.max(1, height),\n };\n}\n\nfunction setPixelRatio(renderer: WebGLRenderer, pixelRatioCap: number): void {\n const deviceRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n renderer.setPixelRatio(Math.min(deviceRatio, pixelRatioCap));\n}\n\n/**\n * Create a default Embody character scene mounted into `container`.\n */\nexport function createDefaultCharacterScene(\n container: HTMLElement,\n options: DefaultCharacterSceneOptions = {},\n): DefaultCharacterScene {\n const sceneType =\n CHARACTER_SCENE_TYPES[options.type ?? DEFAULT_CHARACTER_SCENE_TYPE_ID]\n ?? CHARACTER_SCENE_TYPES[DEFAULT_CHARACTER_SCENE_TYPE_ID];\n const {\n cameraFov = 45,\n pixelRatioCap = 1.5,\n shadows = true,\n shadowPlane: enableShadowPlane = sceneType.shadowPlane,\n background = sceneType.background,\n lightingPreset = sceneType.lightingPreset,\n lighting: lightingOverrides = {},\n manageResize = true,\n } = options;\n\n const { width, height } = resolveContainerSize(container);\n\n const renderer = new WebGLRenderer({\n alpha: true,\n antialias: true,\n powerPreference: 'high-performance',\n });\n setPixelRatio(renderer, pixelRatioCap);\n renderer.setSize(width, height, true);\n renderer.shadowMap.enabled = shadows;\n renderer.shadowMap.type = PCFSoftShadowMap;\n container.appendChild(renderer.domElement);\n renderer.domElement.style.display = 'block';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n\n const scene = new Scene();\n scene.background = background === null || background === undefined ? null : new Color(background);\n\n const camera = new PerspectiveCamera(cameraFov, width / height, 0.1, 1000);\n\n const presetSettings = DEFAULT_CHARACTER_LIGHTING_PRESETS[lightingPreset]?.settings\n ?? DEFAULT_CHARACTER_LIGHTING_SETTINGS;\n const lighting = createDefaultCharacterLighting(scene, renderer, {\n ...presetSettings,\n ...lightingOverrides,\n });\n\n const shadowPlane = enableShadowPlane\n ? createShadowPlane(scene, { opacity: lighting.getSettings().shadowOpacity })\n : null;\n\n const resize = () => {\n const next = resolveContainerSize(container);\n camera.aspect = next.width / next.height;\n camera.updateProjectionMatrix();\n setPixelRatio(renderer, pixelRatioCap);\n renderer.setSize(next.width, next.height, false);\n };\n\n const onResize = () => resize();\n if (manageResize && typeof window !== 'undefined') {\n window.addEventListener('resize', onResize);\n }\n\n return {\n container,\n scene,\n renderer,\n camera,\n lighting,\n shadowPlane,\n sceneType: sceneType.id,\n ownsScene: true,\n resize,\n dispose: () => {\n if (manageResize && typeof window !== 'undefined') {\n window.removeEventListener('resize', onResize);\n }\n lighting.dispose();\n if (shadowPlane) {\n scene.remove(shadowPlane);\n shadowPlane.geometry.dispose();\n const material = shadowPlane.material;\n if (Array.isArray(material)) {\n material.forEach((entry) => entry.dispose());\n } else {\n material.dispose();\n }\n }\n if (renderer.domElement.parentElement === container) {\n container.removeChild(renderer.domElement);\n }\n renderer.dispose();\n },\n };\n}\n","/**\n * Character model loader for Embody hosts.\n *\n * Loads GLB/GLTF (optional Draco) and FBX, collects morph meshes, and provides\n * dispose helpers. App-specific asset routing (CDN aliases, HTML probing) stays\n * outside Embody — pass a resolved URL or ArrayBuffer.\n */\n\nimport {\n Box3,\n type AnimationClip,\n type Mesh,\n type Object3D,\n type Scene,\n} from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { GLTFLoader, type GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { collectMorphMeshes } from './Embody';\n\nexport interface CharacterModelLoadResult {\n model: Object3D;\n meshes: Mesh[];\n animations: AnimationClip[];\n gltf: GLTF | null;\n}\n\nexport interface CharacterModelLoadOptions {\n /** Load progress callback (0-100). */\n onProgress?: (progress: number) => void;\n /** Enable shadow casting on meshes. Default: true */\n castShadows?: boolean;\n /** Draco decoder base path. Default: '/draco-gltf/' */\n dracoDecoderPath?: string;\n}\n\nexport interface CharacterModelTransform {\n modelOffset?: { x?: number; y?: number; z?: number };\n modelRotation?: { x?: number; y?: number; z?: number };\n /**\n * Positive finite uniform scale applied to the model root.\n * Omit this field to preserve the scale authored in the model asset.\n */\n modelScale?: number;\n /** Lift model so its lowest point clears this Y value. */\n modelGroundClearance?: number;\n}\n\nconst DEFAULT_DRACO_DECODER_PATH = '/draco-gltf/';\n\nlet sharedDracoLoader: DRACOLoader | null = null;\nlet sharedDracoPath: string | null = null;\nlet sharedGltfLoader: GLTFLoader | null = null;\nlet sharedFbxLoader: FBXLoader | null = null;\n\nfunction getDracoLoader(decoderPath: string): DRACOLoader {\n if (!sharedDracoLoader || sharedDracoPath !== decoderPath) {\n sharedDracoLoader?.dispose();\n sharedDracoLoader = new DRACOLoader()\n .setDecoderPath(decoderPath.endsWith('/') ? decoderPath : `${decoderPath}/`)\n .setDecoderConfig({ type: 'wasm' });\n sharedDracoPath = decoderPath;\n sharedGltfLoader = null;\n }\n return sharedDracoLoader;\n}\n\nfunction getGltfLoader(decoderPath: string): GLTFLoader {\n if (!sharedGltfLoader || sharedDracoPath !== decoderPath) {\n const loader = new GLTFLoader();\n loader.setDRACOLoader(getDracoLoader(decoderPath));\n sharedGltfLoader = loader;\n }\n return sharedGltfLoader;\n}\n\nfunction getFbxLoader(): FBXLoader {\n if (!sharedFbxLoader) {\n sharedFbxLoader = new FBXLoader();\n }\n return sharedFbxLoader;\n}\n\nfunction createDistinctProgressReporter(\n onProgress?: (progress: number) => void,\n): ((progress: number) => void) | undefined {\n if (!onProgress) return undefined;\n\n let lastProgress: number | null = null;\n return (progress: number) => {\n if (!Number.isFinite(progress)) return;\n const normalized = Math.min(100, Math.max(0, Math.round(progress)));\n if (normalized === lastProgress) return;\n lastProgress = normalized;\n onProgress(normalized);\n };\n}\n\nfunction isFbxUrl(url: string): boolean {\n const lowercaseUrl = url.toLowerCase();\n return lowercaseUrl.endsWith('.fbx') || lowercaseUrl.includes('.fbx?');\n}\n\nfunction prepareLoadedModel(model: Object3D, castShadows: boolean): Mesh[] {\n model.traverse((obj) => {\n const mesh = obj as Mesh;\n if (!mesh.isMesh) return;\n if (castShadows) {\n mesh.castShadow = true;\n }\n });\n return collectMorphMeshes(model);\n}\n\n/**\n * Apply optional placement transforms used by character profiles.\n */\nexport function applyCharacterModelTransform(\n model: Object3D,\n transform: CharacterModelTransform = {},\n): void {\n const { modelOffset, modelRotation, modelScale, modelGroundClearance } = transform;\n\n if (modelOffset) {\n model.position.set(modelOffset.x ?? 0, modelOffset.y ?? 0, modelOffset.z ?? 0);\n }\n\n if (modelRotation) {\n const deg2rad = Math.PI / 180;\n model.rotation.set(\n (modelRotation.x ?? 0) * deg2rad,\n (modelRotation.y ?? 0) * deg2rad,\n (modelRotation.z ?? 0) * deg2rad,\n );\n }\n\n if (modelScale !== undefined && Number.isFinite(modelScale) && modelScale > 0) {\n model.scale.setScalar(modelScale);\n }\n\n // Apply ground clearance after scale so the bounds reflect the final size.\n if (modelGroundClearance !== undefined && Number.isFinite(modelGroundClearance)) {\n model.updateMatrixWorld(true);\n const bounds = new Box3().setFromObject(model);\n if (Number.isFinite(bounds.min.y) && bounds.min.y < modelGroundClearance) {\n model.position.y += modelGroundClearance - bounds.min.y;\n }\n }\n}\n\n/**\n * Dispose a model graph and remove it from a scene when present.\n *\n * Handles any renderable object (Mesh, Points, Line, ...) and releases\n * textures referenced by materials.\n */\nexport function disposeCharacterModel(scene: Scene | null, model: Object3D): void {\n scene?.remove(model);\n model.traverse((obj) => {\n const holder = obj as Object3D & {\n geometry?: { dispose?: () => void };\n material?: MaterialLike | MaterialLike[];\n };\n holder.geometry?.dispose?.();\n if (!holder.material) return;\n const materials = Array.isArray(holder.material) ? holder.material : [holder.material];\n materials.forEach(disposeMaterialWithTextures);\n });\n}\n\ninterface MaterialLike {\n dispose?: () => void;\n}\n\nfunction disposeMaterialWithTextures(material: MaterialLike): void {\n Object.values(material as Record<string, unknown>).forEach((value) => {\n const texture = value as { isTexture?: boolean; dispose?: () => void } | null;\n if (texture?.isTexture && typeof texture.dispose === 'function') {\n texture.dispose();\n }\n });\n material.dispose?.();\n}\n\nfunction loadGltf(\n url: string,\n options: CharacterModelLoadOptions,\n): Promise<CharacterModelLoadResult> {\n const { onProgress, castShadows = true, dracoDecoderPath = DEFAULT_DRACO_DECODER_PATH } = options;\n const reportProgress = createDistinctProgressReporter(onProgress);\n const loader = getGltfLoader(dracoDecoderPath);\n\n return new Promise((resolve, reject) => {\n loader.load(\n url,\n (gltf: GLTF) => {\n const model = gltf.scene;\n resolve({\n model,\n meshes: prepareLoadedModel(model, castShadows),\n animations: gltf.animations || [],\n gltf,\n });\n },\n (progressEvent: ProgressEvent) => {\n if (progressEvent.lengthComputable) {\n reportProgress?.((progressEvent.loaded / progressEvent.total) * 100);\n }\n },\n (error: unknown) => reject(error),\n );\n });\n}\n\nfunction loadFbx(\n url: string,\n options: CharacterModelLoadOptions,\n): Promise<CharacterModelLoadResult> {\n const { onProgress, castShadows = true } = options;\n const reportProgress = createDistinctProgressReporter(onProgress);\n const loader = getFbxLoader();\n\n return new Promise((resolve, reject) => {\n loader.load(\n url,\n (fbxGroup) => {\n resolve({\n model: fbxGroup,\n meshes: prepareLoadedModel(fbxGroup, castShadows),\n animations: fbxGroup.animations || [],\n gltf: null,\n });\n },\n (progressEvent: ProgressEvent) => {\n if (progressEvent.lengthComputable) {\n reportProgress?.((progressEvent.loaded / progressEvent.total) * 100);\n }\n },\n (error: unknown) => reject(error),\n );\n });\n}\n\n/**\n * Load a character model from a URL (GLB/GLTF or FBX).\n */\nexport function loadCharacterModel(\n url: string,\n options: CharacterModelLoadOptions = {},\n): Promise<CharacterModelLoadResult> {\n if (isFbxUrl(url)) {\n return loadFbx(url, options);\n }\n return loadGltf(url, options);\n}\n\n/**\n * Parse a character model from an already-fetched ArrayBuffer.\n */\nexport function parseCharacterModel(\n data: ArrayBuffer,\n resourcePath = '',\n options: CharacterModelLoadOptions = {},\n): Promise<CharacterModelLoadResult> {\n const { castShadows = true, dracoDecoderPath = DEFAULT_DRACO_DECODER_PATH } = options;\n const loader = getGltfLoader(dracoDecoderPath);\n\n return new Promise((resolve, reject) => {\n loader.parse(\n data,\n resourcePath,\n (gltf: GLTF) => {\n const model = gltf.scene;\n resolve({\n model,\n meshes: prepareLoadedModel(model, castShadows),\n animations: gltf.animations || [],\n gltf,\n });\n },\n (error: unknown) => reject(error),\n );\n });\n}\n","/**\n * High-level character host: default scene + model load + Embody binding.\n *\n * Default path: pass a container HTMLElement + character model URL.\n * Advanced path: inject an existing Three.js scene/renderer/camera.\n */\n\nimport {\n Box3,\n MathUtils,\n Vector3,\n type AnimationClip,\n type Camera,\n type Mesh,\n type Object3D,\n type PerspectiveCamera,\n type Scene,\n type WebGLRenderer,\n} from 'three';\nimport type { EmbodyConfig } from '../../interfaces/EmbodyRuntime';\nimport { getPresetWithProfile } from '../../presets';\nimport { Embody } from './Embody';\nimport {\n createDefaultCharacterScene,\n type DefaultCharacterLightingController,\n type DefaultCharacterSceneOptions,\n} from './characterScene';\nimport {\n applyCharacterModelTransform,\n disposeCharacterModel,\n loadCharacterModel,\n type CharacterModelLoadOptions,\n type CharacterModelTransform,\n} from './modelLoader';\n\nexport interface CharacterHostCharacterOptions extends CharacterModelTransform {\n /** Resolved model URL (GLB/GLTF/FBX). */\n modelUrl: string;\n /** Optional Embody preset / profile (also accepted via `embody`). */\n presetType?: EmbodyConfig['presetType'];\n profile?: EmbodyConfig['profile'];\n}\n\nexport interface CharacterHostExternalScene {\n scene: Scene;\n renderer: WebGLRenderer;\n camera: Camera;\n /**\n * When true, host appends `renderer.domElement` into `container` if it is not\n * already mounted. Default: false.\n */\n mountCanvas?: boolean;\n /** When true, host listens for window resize. Default: false for external. */\n manageResize?: boolean;\n}\n\nexport interface CharacterHostOptions {\n /** Element that receives the WebGL canvas in the default scene path. */\n container: HTMLElement;\n /** Character to load and bind. */\n character: CharacterHostCharacterOptions;\n /** Embody runtime config. `presetType` / `profile` on character win when both set. */\n embody?: EmbodyConfig;\n /** Default-scene options (ignored when `external` is provided). */\n scene?: DefaultCharacterSceneOptions;\n /** Advanced: inject an existing Three.js scene instead of creating one. */\n external?: CharacterHostExternalScene;\n /** Model loader options (progress, Draco path, shadows). */\n loader?: CharacterModelLoadOptions;\n /** Call `engine.start()` after binding. Default: true */\n autoStart?: boolean;\n /**\n * Run a requestAnimationFrame render loop (`renderer.render(scene, camera)`).\n * Default: true when Embody owns the scene, false when `external` is given.\n */\n renderLoop?: boolean;\n /**\n * Frame the camera on the loaded model (position + lookAt). Applies on every\n * `setCharacter`. Default: true when Embody owns the scene, false otherwise.\n */\n autoFrame?: boolean;\n}\n\nexport interface CharacterHost {\n engine: Embody;\n scene: Scene;\n renderer: WebGLRenderer;\n camera: Camera | PerspectiveCamera;\n model: Object3D;\n meshes: Mesh[];\n animations: AnimationClip[];\n lighting: DefaultCharacterLightingController | null;\n /** True when Embody created and owns the default scene/renderer. */\n ownsScene: boolean;\n container: HTMLElement;\n /** Replace the loaded character while keeping the same scene/engine. */\n setCharacter: (character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions) => Promise<void>;\n resize: () => void;\n dispose: () => void;\n}\n\nfunction resolveEmbodyConfig(\n options: CharacterHostOptions,\n character: CharacterHostCharacterOptions,\n): EmbodyConfig {\n return {\n ...(options.embody ?? {}),\n ...(character.presetType ? { presetType: character.presetType } : {}),\n ...(character.profile ? { profile: character.profile } : {}),\n };\n}\n\nconst AUTO_FRAME_PADDING = 1.2;\n\n/** Position a perspective camera so the whole model is in view. */\nfunction frameCameraOnModel(camera: Camera | PerspectiveCamera, model: Object3D): void {\n if (!('isPerspectiveCamera' in camera) || !(camera as PerspectiveCamera).isPerspectiveCamera) {\n return;\n }\n const perspective = camera as PerspectiveCamera;\n\n model.updateMatrixWorld(true);\n const bounds = new Box3().setFromObject(model);\n if (bounds.isEmpty()) return;\n\n const size = bounds.getSize(new Vector3());\n const center = bounds.getCenter(new Vector3());\n const halfFov = MathUtils.degToRad(perspective.fov) / 2;\n const aspect = perspective.aspect > 0 ? perspective.aspect : 1;\n const fitHeight = Math.max(size.y, 1e-3);\n const fitWidth = Math.max(size.x, 1e-3) / aspect;\n const distance = ((Math.max(fitHeight, fitWidth) / 2) / Math.tan(halfFov)) * AUTO_FRAME_PADDING;\n\n perspective.position.set(center.x, center.y + size.y * 0.05, center.z + distance);\n perspective.near = Math.max(distance / 100, 0.01);\n perspective.far = Math.max(distance * 10, 100);\n perspective.updateProjectionMatrix();\n perspective.lookAt(center);\n}\n\nfunction bindModelToEngine(\n engine: Embody,\n model: Object3D,\n meshes: Mesh[],\n animations: AnimationClip[],\n): void {\n engine.onReady({ meshes, model });\n if (animations.length > 0) {\n engine.loadAnimationClips(animations);\n }\n}\n\n/**\n * Create a character host.\n *\n * Default: Embody creates the Three.js scene inside `container` and loads\n * `character.modelUrl`. Advanced: pass `external` with an existing scene.\n */\nexport async function createCharacterHost(options: CharacterHostOptions): Promise<CharacterHost> {\n const {\n container,\n character,\n external,\n scene: sceneOptions,\n loader: loaderOptions = {},\n autoStart = true,\n } = options;\n\n if (!container) {\n throw new Error('createCharacterHost requires a container HTMLElement');\n }\n if (!character?.modelUrl) {\n throw new Error('createCharacterHost requires character.modelUrl');\n }\n\n let scene: Scene;\n let renderer: WebGLRenderer;\n let camera: Camera | PerspectiveCamera;\n let lighting: DefaultCharacterLightingController | null = null;\n let ownsScene = false;\n let disposeDefaultScene: (() => void) | null = null;\n let resizeImpl: () => void = () => undefined;\n let removeResizeListener: (() => void) | null = null;\n\n if (external) {\n scene = external.scene;\n renderer = external.renderer;\n camera = external.camera;\n ownsScene = false;\n\n if (external.mountCanvas && renderer.domElement.parentElement !== container) {\n container.appendChild(renderer.domElement);\n }\n\n resizeImpl = () => {\n const width = Math.max(1, container.clientWidth || (typeof window !== 'undefined' ? window.innerWidth : 1));\n const height = Math.max(1, container.clientHeight || (typeof window !== 'undefined' ? window.innerHeight : 1));\n if ('isPerspectiveCamera' in camera && (camera as PerspectiveCamera).isPerspectiveCamera) {\n const perspective = camera as PerspectiveCamera;\n perspective.aspect = width / height;\n perspective.updateProjectionMatrix();\n }\n renderer.setSize(width, height, false);\n };\n\n if (external.manageResize && typeof window !== 'undefined') {\n const onResize = () => resizeImpl();\n window.addEventListener('resize', onResize);\n removeResizeListener = () => window.removeEventListener('resize', onResize);\n }\n } else {\n const defaultScene = createDefaultCharacterScene(container, sceneOptions);\n scene = defaultScene.scene;\n renderer = defaultScene.renderer;\n camera = defaultScene.camera;\n lighting = defaultScene.lighting;\n ownsScene = true;\n disposeDefaultScene = defaultScene.dispose;\n resizeImpl = defaultScene.resize;\n }\n\n const shouldRenderLoop = options.renderLoop ?? !external;\n const shouldAutoFrame = options.autoFrame ?? !external;\n\n let renderFrameId: number | null = null;\n const startRenderLoop = () => {\n if (!shouldRenderLoop || renderFrameId !== null || typeof requestAnimationFrame === 'undefined') {\n return;\n }\n const renderFrame = () => {\n renderFrameId = requestAnimationFrame(renderFrame);\n renderer.render(scene, camera);\n };\n renderFrameId = requestAnimationFrame(renderFrame);\n };\n const stopRenderLoop = () => {\n if (renderFrameId !== null) {\n cancelAnimationFrame(renderFrameId);\n renderFrameId = null;\n }\n };\n\n const engine = await Embody.create(resolveEmbodyConfig(options, character));\n\n let model: Object3D | null = null;\n let meshes: Mesh[] = [];\n let animations: AnimationClip[] = [];\n let hasBoundCharacter = false;\n let activeCharacterKey = '';\n\n const characterConfigKey = (value: CharacterHostCharacterOptions): string =>\n JSON.stringify({\n modelUrl: value.modelUrl,\n presetType: value.presetType ?? null,\n profile: value.profile ?? null,\n modelOffset: value.modelOffset ?? null,\n modelRotation: value.modelRotation ?? null,\n modelScale: value.modelScale ?? null,\n modelGroundClearance: value.modelGroundClearance ?? null,\n });\n\n const setCharacter = async (\n nextCharacter: CharacterHostCharacterOptions,\n nextLoader: CharacterModelLoadOptions = loaderOptions,\n ): Promise<void> => {\n if (!nextCharacter?.modelUrl) {\n throw new Error('setCharacter requires character.modelUrl');\n }\n\n const loaded = await loadCharacterModel(nextCharacter.modelUrl, {\n ...loaderOptions,\n ...nextLoader,\n });\n\n applyCharacterModelTransform(loaded.model, nextCharacter);\n\n if (model) {\n disposeCharacterModel(scene, model);\n }\n\n model = loaded.model;\n meshes = loaded.meshes;\n animations = loaded.animations;\n scene.add(model);\n\n if (shouldAutoFrame) {\n frameCameraOnModel(camera, model);\n }\n\n const nextKey = characterConfigKey(nextCharacter);\n const shouldSwapProfile =\n hasBoundCharacter &&\n nextKey !== activeCharacterKey &&\n Boolean(nextCharacter.presetType || nextCharacter.profile);\n\n if (shouldSwapProfile) {\n // Swap presets in place so callers keep a stable `engine` reference.\n const config = resolveEmbodyConfig(options, nextCharacter);\n engine.setProfile(await getPresetWithProfile(config.presetType, config.profile));\n }\n\n bindModelToEngine(engine, model, meshes, animations);\n hasBoundCharacter = true;\n activeCharacterKey = nextKey;\n };\n\n try {\n await setCharacter(character, loaderOptions);\n } catch (error) {\n disposeDefaultScene?.();\n removeResizeListener?.();\n engine.dispose();\n throw error;\n }\n\n if (autoStart) {\n engine.start();\n }\n startRenderLoop();\n\n return {\n engine,\n get scene() {\n return scene;\n },\n get renderer() {\n return renderer;\n },\n get camera() {\n return camera;\n },\n get model() {\n if (!model) throw new Error('Character host has no model bound');\n return model;\n },\n get meshes() {\n return meshes;\n },\n get animations() {\n return animations;\n },\n get lighting() {\n return lighting;\n },\n ownsScene,\n container,\n setCharacter,\n resize: () => resizeImpl(),\n dispose: () => {\n stopRenderLoop();\n engine.stop();\n engine.dispose();\n if (model) {\n disposeCharacterModel(scene, model);\n model = null;\n }\n removeResizeListener?.();\n if (ownsScene) {\n disposeDefaultScene?.();\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/compositeAxis.ts","../src/mappings/visemeSystem.ts","../src/engines/three/balanceUtils.ts","../src/engines/three/bakedClipPartitioning.ts","../src/engines/three/ThreeAnimationRuntime.ts","../src/engines/three/ThreeModelInspector.ts","../src/engines/three/ThreeFrameApplier.ts","../src/core/contracts/abi.ts","../src/core/WasmRuntimeCore.ts","../src/hair/appearance.ts","../src/presets/cc4.ts","../src/engines/three/hair/HairPhysicsController.ts","../src/mappings/extendPresetWithProfile.ts","../src/presets/bettaFish.ts","../src/presets/registry.ts","../src/presets/index.ts","../src/engines/three/Embody.ts","../src/engines/three/ThreeClipAdapter.ts","../src/engines/three/characterScene.ts","../src/engines/three/modelLoader.ts","../src/engines/three/characterHost.ts"],"names":["PropertyBinding","AnimationClip","action","duration","state","loopMode","playbackRate","reverse","Vector3","morphTargetId","Quaternion","AU_INFO","CONTINUUM_PAIRS_MAP","CONTINUUM_LABELS","COMPOSITE_ROTATIONS","X_AXIS","Y_AXIS","Z_AXIS","clamp01","initEmbodyCore","Box3","collectMorphMeshes","targets","empty","suffix","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","Mesh","deg2rad","MathUtils"],"mappings":"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","file":"three.js","sourcesContent":["import type { AUSelector, BoneBinding, RotationAxis } from './types';\n\nexport function toAUList(value?: AUSelector): number[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction findBoneBindingForNode(\n auToBones: Record<number, BoneBinding[]>,\n auId: number,\n nodeKey: string\n): BoneBinding | null {\n return auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n}\n\nexport function getCompositeAxisValue(\n axisConfig: RotationAxis | null | undefined,\n getValue: (auId: number) => number\n): number {\n if (!axisConfig) return 0;\n\n const negativeAUs = toAUList(axisConfig.negative);\n const positiveAUs = toAUList(axisConfig.positive);\n\n if (negativeAUs.length > 0 && positiveAUs.length > 0) {\n const negativeValue = Math.max(...negativeAUs.map(getValue), 0);\n const positiveValue = Math.max(...positiveAUs.map(getValue), 0);\n return positiveValue - negativeValue;\n }\n\n if (axisConfig.aus.length > 1) {\n return Math.max(...axisConfig.aus.map(getValue), 0);\n }\n\n return getValue(axisConfig.aus[0]);\n}\n\nexport function getCompositeAxisBinding(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined,\n direction: number,\n getValue: (auId: number) => number,\n auToBones: Record<number, BoneBinding[]>\n): BoneBinding | null {\n if (!axisConfig) return null;\n\n const directionalAUs = direction < 0 ? toAUList(axisConfig.negative) : toAUList(axisConfig.positive);\n const candidates = directionalAUs.length > 0 ? directionalAUs : axisConfig.aus;\n const ranked = [...candidates].sort((a, b) => getValue(b) - getValue(a));\n\n for (const auId of ranked) {\n const binding = findBoneBindingForNode(auToBones, auId, nodeKey);\n if (binding) return binding;\n }\n\n return null;\n}\n","import type {\n MappingEditorModel,\n MappingEditorSection,\n MorphCandidate,\n MorphCandidateMatch,\n MorphTargetRef,\n Profile,\n VisemeBinding,\n VisemeSlot,\n} from './types';\n\nfunction hasOwn<T extends object>(value: T | undefined, key: string): boolean {\n return Boolean(value && Object.prototype.hasOwnProperty.call(value, key));\n}\n\nfunction toSlotId(label: string, index: number): string {\n const normalized = label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return normalized || `viseme-${index}`;\n}\n\nfunction bindingTargets(binding: VisemeBinding | undefined): MorphTargetRef[] {\n if (!binding) return [];\n const targets = binding.targets?.map((target) => target.morph).filter((morph) => morph !== '');\n if (targets && targets.length > 0) return targets;\n return binding.morph !== undefined && binding.morph !== '' ? [binding.morph] : [];\n}\n\nexport interface ResolvedVisemeBindingTarget {\n morph: MorphTargetRef;\n weight: number;\n}\n\nfunction normalizeBindingWeight(weight: number | undefined): number {\n return Number.isFinite(weight) ? Math.max(0, weight ?? 1) : 1;\n}\n\nexport function getProfileVisemeSlots(profile: Profile): VisemeSlot[] {\n if (profile.visemeSlots && profile.visemeSlots.length > 0) {\n return [...profile.visemeSlots].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n\n return (profile.visemeKeys || []).map((key, index) => {\n const label = typeof key === 'string' && key ? key : `Viseme ${index}`;\n return {\n id: toSlotId(label, index),\n label,\n order: index,\n defaultJawAmount: profile.visemeJawAmounts?.[index],\n };\n });\n}\n\nexport function getVisemeSlotIndex(profile: Profile, slotId: string): number {\n return getProfileVisemeSlots(profile).findIndex((slot) => slot.id === slotId);\n}\n\nexport function compileVisemeKeys(profile: Profile): MorphTargetRef[] {\n const slots = getProfileVisemeSlots(profile);\n if (!profile.visemeBindings) return [...(profile.visemeKeys || [])];\n\n return slots.map((slot, index) => {\n const target = bindingTargets(profile.visemeBindings?.[slot.id])[0];\n return target ?? profile.visemeKeys?.[index] ?? '';\n });\n}\n\nexport function getVisemeBindingTargets(profile: Profile, visemeIndex: number): ResolvedVisemeBindingTarget[] {\n const slots = getProfileVisemeSlots(profile);\n const slot = slots[visemeIndex];\n const binding = slot ? profile.visemeBindings?.[slot.id] : undefined;\n\n const boundTargets = binding?.targets\n ?.filter((target) => target.morph !== undefined && target.morph !== '')\n .map((target) => ({\n morph: target.morph,\n weight: normalizeBindingWeight(target.weight),\n }));\n\n if (boundTargets && boundTargets.length > 0) {\n return boundTargets;\n }\n\n if (binding?.morph !== undefined && binding.morph !== '') {\n return [{ morph: binding.morph, weight: 1 }];\n }\n\n const legacyTarget = profile.visemeKeys?.[visemeIndex];\n return legacyTarget !== undefined && legacyTarget !== ''\n ? [{ morph: legacyTarget, weight: 1 }]\n : [];\n}\n\nexport function getVisemeJawAmounts(profile: Profile): number[] | undefined {\n const slots = getProfileVisemeSlots(profile);\n if (slots.length === 0) return profile.visemeJawAmounts ? [...profile.visemeJawAmounts] : undefined;\n return slots.map((slot, index) => slot.defaultJawAmount ?? profile.visemeJawAmounts?.[index] ?? 0);\n}\n\nexport function resolveVisemeMeshCategory(profile: Profile): string {\n const morphToMesh = profile.morphToMesh || {};\n if (profile.visemeMeshCategory) return profile.visemeMeshCategory;\n if (hasOwn(morphToMesh, 'viseme')) return 'viseme';\n return 'face';\n}\n\nexport function getMeshNamesForVisemeProfile(profile: Profile): string[] {\n const morphToMesh: Record<string, string[]> = profile.morphToMesh || {};\n const category = resolveVisemeMeshCategory(profile);\n if (hasOwn(morphToMesh, category)) {\n return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n }\n return profile.visemeMeshCategory ? [] : [...(morphToMesh.face || [])];\n}\n\nexport function getMeshNamesForAUProfile(profile: Profile, auId: number): string[] {\n const morphToMesh = profile.morphToMesh || {};\n const facePart = profile.auInfo?.[String(auId)]?.facePart;\n const category = facePart ? profile.auFacePartToMeshCategory?.[facePart] : undefined;\n if (category) return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n return [...(morphToMesh.face || [])];\n}\n\nfunction compileMatcher(pattern: string): RegExp | null {\n try {\n return new RegExp(pattern, 'i');\n } catch {\n return null;\n }\n}\n\nfunction classifyVisemeMorph(morphName: string, profile: Profile): MorphCandidateMatch[] {\n const slots = getProfileVisemeSlots(profile);\n const matches: MorphCandidateMatch[] = [];\n\n for (const slot of slots) {\n const explicitTargets = bindingTargets(profile.visemeBindings?.[slot.id]);\n if (explicitTargets.some((target) => String(target).toLowerCase() === morphName.toLowerCase())) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 1,\n reason: 'explicit',\n });\n continue;\n }\n\n for (const pattern of slot.matchers || []) {\n const matcher = compileMatcher(pattern);\n if (matcher?.test(morphName)) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 0.75,\n reason: 'regex',\n pattern,\n });\n }\n }\n }\n\n return matches;\n}\n\nexport function buildMappingEditorModel(profile: Profile, morphNames: string[] = []): MappingEditorModel {\n const sections = new Map<string, MappingEditorSection>();\n const configuredSections = profile.mappingSections || [];\n const configuredById = new Map(configuredSections.map((section) => [section.id, section]));\n let nextOrder = configuredSections.length;\n\n for (const section of configuredSections) {\n sections.set(section.id, { ...section });\n }\n\n const getOrder = (id: string, fallback?: number): number => {\n const configured = configuredById.get(id);\n if (configured) return configured.order;\n if (fallback !== undefined) return fallback;\n const order = nextOrder;\n nextOrder += 1;\n return order;\n };\n\n const auSectionOrders = new Map<string, number>();\n for (const [auId, info] of Object.entries(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n auSectionOrders.set(label, Math.min(auSectionOrders.get(label) ?? Number.MAX_SAFE_INTEGER, Number(auId)));\n }\n if (configuredSections.length === 0 && auSectionOrders.size > 0) {\n nextOrder = Math.max(...auSectionOrders.values()) + 1;\n }\n\n for (const info of Object.values(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n const configured = configuredById.get(label);\n const meshCategory = profile.auFacePartToMeshCategory?.[label] || 'face';\n sections.set(label, {\n ...configured,\n id: label,\n label: configured?.label || label,\n kind: 'au',\n order: getOrder(label, auSectionOrders.get(label)),\n meshCategory: configured?.meshCategory || meshCategory,\n facePart: label,\n });\n }\n\n const configuredVisemes = configuredById.get('Visemes');\n sections.set('Visemes', {\n ...configuredVisemes,\n id: 'Visemes',\n label: configuredVisemes?.label || 'Visemes',\n kind: 'viseme',\n order: getOrder('Visemes'),\n meshCategory: configuredVisemes?.meshCategory || resolveVisemeMeshCategory(profile),\n });\n\n if (hasOwn(profile.morphToMesh, 'hair')) {\n const configuredHair = configuredById.get('Hair');\n sections.set('Hair', {\n ...configuredHair,\n id: 'Hair',\n label: configuredHair?.label || 'Hair',\n kind: 'hair',\n order: getOrder('Hair'),\n meshCategory: configuredHair?.meshCategory || 'hair',\n });\n }\n\n const configuredUnmapped = configuredById.get('Unmapped');\n sections.set('Unmapped', {\n ...configuredUnmapped,\n id: 'Unmapped',\n label: configuredUnmapped?.label || 'Unmapped',\n kind: 'unmapped',\n order: getOrder('Unmapped'),\n meshCategory: configuredUnmapped?.meshCategory || 'face',\n });\n\n const candidates: MorphCandidate[] = morphNames.map((morph) => {\n const matches = classifyVisemeMorph(morph, profile);\n if (matches.length === 0) {\n return { morph, sectionId: 'Unmapped', kind: 'unmapped', matches };\n }\n const explicit = matches.filter((match) => match.reason === 'explicit');\n if (explicit.length > 0) {\n return { morph, sectionId: 'Visemes', kind: 'explicit', matches: explicit };\n }\n return {\n morph,\n sectionId: 'Visemes',\n kind: matches.length > 1 ? 'conflict' : 'candidate',\n matches,\n };\n });\n\n return {\n sections: Array.from(sections.values()).sort((a, b) => a.order - b.order || a.label.localeCompare(b.label)),\n candidates,\n };\n}\n\nexport interface ProviderVisemeEvent {\n provider: string;\n id?: string | number;\n phoneme?: string;\n}\n\nexport interface ProviderVisemeMatch {\n slotId: string;\n index: number;\n confidence: number;\n reason: 'provider' | 'phoneme' | 'rest' | 'none';\n}\n\nexport function mapProviderVisemeToSlot(profile: Profile, event: ProviderVisemeEvent): ProviderVisemeMatch | null {\n const slots = getProfileVisemeSlots(profile);\n const provider = event.provider.toLowerCase();\n\n if (event.id !== undefined) {\n const id = String(event.id);\n const index = slots.findIndex((slot) =>\n (slot.providerIds?.[provider] || []).some((candidate) => String(candidate) === id)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 1, reason: 'provider' };\n }\n }\n\n if (event.phoneme) {\n const phoneme = event.phoneme.toLowerCase();\n const index = slots.findIndex((slot) =>\n (slot.phonemes || []).some((candidate) => candidate.toLowerCase() === phoneme)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 0.8, reason: 'phoneme' };\n }\n }\n\n const restIndex = slots.findIndex((slot) => slot.id === 'rest' || slot.features?.lipClosed === 1);\n if (restIndex >= 0) {\n return { slotId: slots[restIndex].id, index: restIndex, confidence: 0.25, reason: 'rest' };\n }\n\n return null;\n}\n","export function clampBalance(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(-1, Math.min(1, value));\n}\n\nexport function getSideScale(\n balance: number,\n side?: 'left' | 'right'\n): number {\n if (side !== 'left' && side !== 'right') return 1;\n\n const clamped = clampBalance(balance);\n if (side === 'left') {\n return clamped > 0 ? 1 - clamped : 1;\n }\n return clamped < 0 ? 1 + clamped : 1;\n}\n\nexport function resolveCurveBalance(\n curveId: string,\n globalBalance: number,\n balanceMap?: Record<string, number>\n): number {\n if (balanceMap && Object.prototype.hasOwnProperty.call(balanceMap, curveId)) {\n return clampBalance(Number(balanceMap[curveId]));\n }\n return clampBalance(globalBalance);\n}\n","import {\n AnimationClip,\n KeyframeTrack,\n Object3D,\n PropertyBinding,\n} from 'three';\nimport type {\n AnimationBlendMode,\n BakedClipChannel,\n BakedClipChannelInfo,\n} from '../../core/types';\nimport type { ResolvedBones } from './types';\n\nconst MIXER_CLIP_PREFIX = '__embody_baked_partition__/';\nconst FACE_SAFE_TARGET_RE = /(head|neck|jaw|eye|brow|lid|mouth|lip|face|cheek|nose|tongue|teeth)/i;\nconst BODY_LIKE_TARGET_RE = /(root|armature|hips?|pelvis|spine|waist|chest|torso|shoulder|arm|forearm|hand|finger|leg|thigh|calf|knee|foot|toe|tail|wing|fin|body|abdomen|clavicle)/i;\nconst SCENE_LIKE_TARGET_RE = /(camera|cam|scene|world|global|origin|pivot|cube)/i;\nconst CHANNEL_ORDER: BakedClipChannel[] = ['face', 'body', 'scene'];\n\nexport interface PartitionedBakedMixerClip {\n channel: BakedClipChannel;\n clip: AnimationClip;\n}\n\nexport interface PartitionedBakedClip {\n sourceClip: AnimationClip;\n channels: BakedClipChannelInfo[];\n mixerClips: PartitionedBakedMixerClip[];\n}\n\ntype ParsedTrackTarget = {\n propertyName: string;\n target: Object3D | null;\n targetName: string;\n};\n\nfunction getMixerClipName(sourceClipName: string, channel: BakedClipChannel): string {\n return `${MIXER_CLIP_PREFIX}${sourceClipName}/${channel}`;\n}\n\nfunction parseTrackTarget(trackName: string, model: Object3D): ParsedTrackTarget | null {\n let parsed: ReturnType<typeof PropertyBinding.parseTrackName>;\n\n try {\n parsed = PropertyBinding.parseTrackName(trackName);\n } catch {\n return null;\n }\n\n const targetKey = parsed.objectName === 'bones' && parsed.objectIndex\n ? String(parsed.objectIndex)\n : parsed.nodeName;\n const target = targetKey\n ? model.getObjectByProperty('uuid', targetKey) ?? PropertyBinding.findNode(model, targetKey)\n : null;\n\n return {\n propertyName: parsed.propertyName,\n target,\n targetName: target?.name ?? parsed.nodeName ?? '',\n };\n}\n\nfunction isSceneTrackTarget(target: Object3D | null, targetName: string): boolean {\n if (!target) return true;\n if ((target as { isCamera?: boolean }).isCamera) return true;\n return SCENE_LIKE_TARGET_RE.test(targetName);\n}\n\nfunction isFaceSafeTransformTarget(\n target: Object3D | null,\n targetName: string,\n safeTransformTargets: Set<Object3D>\n): boolean {\n if (target && safeTransformTargets.has(target)) {\n return true;\n }\n if (!targetName) {\n return false;\n }\n if (BODY_LIKE_TARGET_RE.test(targetName) || SCENE_LIKE_TARGET_RE.test(targetName)) {\n return false;\n }\n return FACE_SAFE_TARGET_RE.test(targetName);\n}\n\nexport function classifyBakedTrack(\n track: KeyframeTrack,\n model: Object3D,\n bones: ResolvedBones\n): BakedClipChannel {\n const parsed = parseTrackTarget(track.name, model);\n if (!parsed) {\n return 'scene';\n }\n\n if (parsed.propertyName === 'morphTargetInfluences' || parsed.propertyName === 'weights') {\n return 'face';\n }\n\n if (isSceneTrackTarget(parsed.target, parsed.targetName)) {\n return 'scene';\n }\n\n if (parsed.propertyName === 'quaternion') {\n const safeTransformTargets = new Set(\n Object.values(bones)\n .map((entry) => entry?.obj)\n .filter((entry): entry is Object3D => !!entry)\n );\n\n if (isFaceSafeTransformTarget(parsed.target, parsed.targetName, safeTransformTargets)) {\n return 'face';\n }\n }\n\n return 'body';\n}\n\nexport function resolveBakedChannelBlendMode(\n channel: BakedClipChannel,\n requestedBlendMode: AnimationBlendMode\n): AnimationBlendMode | undefined {\n if (channel === 'face') {\n return requestedBlendMode === 'additive' ? 'additive' : 'replace';\n }\n if (channel === 'body') {\n return 'replace';\n }\n return undefined;\n}\n\nexport function resolveBakedAggregateBlendMode(\n channels: BakedClipChannelInfo[],\n requestedBlendMode: AnimationBlendMode\n): AnimationBlendMode {\n if (requestedBlendMode !== 'additive') {\n return 'replace';\n }\n\n return channels.some((channel) => (\n channel.channel === 'face'\n && channel.playable\n && channel.trackCount > 0\n ))\n ? 'additive'\n : 'replace';\n}\n\nexport function partitionBakedClip(\n clip: AnimationClip,\n model: Object3D,\n bones: ResolvedBones\n): PartitionedBakedClip {\n const tracksByChannel = new Map<BakedClipChannel, KeyframeTrack[]>(\n CHANNEL_ORDER.map((channel) => [channel, []])\n );\n\n for (const track of clip.tracks) {\n const channel = classifyBakedTrack(track, model, bones);\n tracksByChannel.get(channel)?.push(track.clone());\n }\n\n const mixerClips: PartitionedBakedMixerClip[] = [];\n const channels: BakedClipChannelInfo[] = [];\n\n for (const channel of CHANNEL_ORDER) {\n const tracks = tracksByChannel.get(channel) ?? [];\n if (tracks.length === 0) {\n continue;\n }\n\n const playable = channel !== 'scene';\n const blendMode = resolveBakedChannelBlendMode(channel, 'additive');\n channels.push({\n channel,\n trackCount: tracks.length,\n playable,\n blendMode,\n });\n\n if (!playable) {\n continue;\n }\n\n mixerClips.push({\n channel,\n clip: new AnimationClip(getMixerClipName(clip.name, channel), clip.duration, tracks),\n });\n }\n\n return {\n sourceClip: clip,\n channels,\n mixerClips,\n };\n}\n","/**\n * ThreeAnimationRuntime - Lerp-based animation driver\n *\n * Internal driver for time-based interpolation with easing functions.\n */\n\nimport {\n AnimationMixer,\n AnimationAction,\n AnimationClip,\n AnimationUtils,\n NumberKeyframeTrack,\n PropertyBinding,\n QuaternionKeyframeTrack,\n AdditiveAnimationBlendMode,\n LoopRepeat,\n LoopPingPong,\n LoopOnce,\n NormalAnimationBlendMode,\n Quaternion,\n Vector3,\n VectorKeyframeTrack,\n} from 'three';\nimport type { KeyframeTrack, Mesh, Object3D } from 'three';\nimport type {\n TransitionHandle,\n AnimationPlayOptions,\n AnimationClipInfo,\n AnimationState,\n AnimationActionHandle,\n CurvesMap,\n ClipOptions,\n ClipEventListener,\n ClipHandle,\n Snippet,\n BoneKey,\n CompositeRotation,\n RotationAxis,\n AnimationSource,\n AnimationBlendMode,\n BakedClipChannel,\n BakedClipChannelInfo,\n AnimationEasing,\n CurvePoint,\n SnippetChannel,\n TypedSnippet,\n BoneBinding,\n EmbodyAnimationRuntime,\n EmbodyAnimationRuntimeConnector,\n EmbodyAnimationRuntimeFactory,\n} from '../../core/types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from '../../core/compositeAxis';\nimport type { Profile } from '../../mappings/types';\nimport {\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getProfileVisemeSlots,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n} from '../../mappings/visemeSystem';\nimport type { ResolvedBones } from './types';\nimport { getSideScale, resolveCurveBalance } from './balanceUtils';\nimport {\n partitionBakedClip,\n resolveBakedAggregateBlendMode,\n resolveBakedChannelBlendMode,\n type PartitionedBakedClip,\n} from './bakedClipPartitioning';\n\ntype Transition = {\n key: string;\n from: number;\n to: number;\n duration: number; // seconds\n elapsed: number; // seconds\n apply: (value: number) => void;\n easing: (t: number) => number;\n resolve?: () => void; // Called when transition completes\n paused: boolean; // Individual pause state\n};\n\nconst easeInOutQuad = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\n// Smoother cubic easing - better for viseme transitions\nconst easeInOutCubic = (t: number) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n// Export easing functions for external use\nexport { easeInOutQuad, easeInOutCubic };\n\nfunction debugFlagEnabled(name: string): boolean {\n try {\n const locationLike = (globalThis as { location?: { search?: string } }).location;\n const search = typeof locationLike?.search === 'string' ? locationLike.search : '';\n if (!search) return false;\n const value = new URLSearchParams(search).get(name);\n return value === '1' || value === 'true';\n } catch {\n return false;\n }\n}\n\nfunction typedLipSyncDebugEnabled(): boolean {\n return debugFlagEnabled('polymerVocalDebug') || debugFlagEnabled('polymerLipSyncDebug');\n}\n\nfunction logTypedLipSyncDebug(label: string, payload: unknown): void {\n if (!typedLipSyncDebugEnabled()) return;\n try {\n console.info(`${label} ${JSON.stringify(payload)}`);\n } catch {\n console.info(label, payload);\n }\n}\n\nfunction summarizeKeyframes(keyframes: ScalarKeyframe[]) {\n return {\n frames: keyframes.length,\n firstSec: keyframes[0]?.time ?? null,\n lastSec: keyframes[keyframes.length - 1]?.time ?? null,\n peak: keyframes.reduce((max, frame) => Math.max(max, Number.isFinite(frame.intensity) ? frame.intensity : 0), 0),\n };\n}\n\nfunction summarizeTypedChannel(channel: SnippetChannel) {\n return {\n target: channel.target,\n intensityScale: channel.intensityScale ?? 1,\n ...summarizeKeyframes(channel.keyframes ?? []),\n };\n}\n\nfunction summarizeBindingTarget(bindingTarget: ReturnType<typeof getVisemeBindingTargets>[number]) {\n return {\n morph: bindingTarget.morph,\n weight: bindingTarget.weight,\n };\n}\n\nexport class ThreeAnimationRuntime {\n private transitions = new Map<string, Transition>();\n\n /**\n * Tick all active transitions by dt seconds.\n * Applies eased interpolation and removes completed transitions.\n * Respects individual transition pause state.\n */\n tick(dtSeconds: number): void {\n if (dtSeconds <= 0) return;\n\n const completed: string[] = [];\n\n this.transitions.forEach((t, key) => {\n // Skip paused transitions\n if (t.paused) return;\n\n t.elapsed += dtSeconds;\n const progress = Math.min(t.elapsed / t.duration, 1.0);\n const easedProgress = t.easing(progress);\n\n // Interpolate and apply\n const value = t.from + (t.to - t.from) * easedProgress;\n t.apply(value);\n\n // Check completion\n if (progress >= 1.0) {\n completed.push(key);\n t.resolve?.();\n }\n });\n\n // Remove completed transitions\n completed.forEach(key => this.transitions.delete(key));\n }\n\n /**\n * Add or replace a transition for the given key.\n * If a transition with the same key exists, it is cancelled and replaced.\n * @returns TransitionHandle with { promise, pause, resume, cancel }\n */\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing: (t: number) => number = easeInOutQuad\n ): TransitionHandle {\n // Convert to seconds once here - all callers pass milliseconds\n const durationSec = durationMs / 1000;\n\n // Cancel existing transition for this key\n const existing = this.transitions.get(key);\n if (existing?.resolve) {\n existing.resolve(); // Resolve immediately (cancelled)\n }\n\n // Instant transition if duration is 0 or values are equal\n if (durationSec <= 0 || Math.abs(to - from) < 1e-6) {\n apply(to);\n return {\n promise: Promise.resolve(),\n pause: () => {},\n resume: () => {},\n cancel: () => {},\n };\n }\n\n const promise = new Promise<void>((resolve) => {\n const transitionObj: Transition = {\n key,\n from,\n to,\n duration: durationSec,\n elapsed: 0,\n apply,\n easing,\n resolve,\n paused: false,\n };\n this.transitions.set(key, transitionObj);\n });\n\n return {\n promise,\n pause: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = true;\n },\n resume: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = false;\n },\n cancel: () => {\n const t = this.transitions.get(key);\n if (t) {\n t.resolve?.();\n this.transitions.delete(key);\n }\n },\n };\n }\n\n /** Clear all running transitions. */\n clearTransitions(): void {\n this.transitions.forEach(t => t.resolve?.());\n this.transitions.clear();\n }\n\n /** Get count of active transitions. */\n getActiveTransitionCount(): number {\n return this.transitions.size;\n }\n}\n\nexport interface ThreeAnimationSystemHost {\n getModel: () => Object3D | null;\n getMeshes: () => Mesh[];\n getMeshByName: (name: string) => Mesh | undefined;\n getMeshNamesForAU?: (auId: number) => string[];\n getMeshNamesForViseme?: () => string[];\n getCurrentAUValue?: (auId: number) => number;\n getCurrentVisemeValue?: (visemeIndex: number) => number;\n getCurrentMorphValue?: (morphKey: string, meshNames?: string[]) => number;\n getCurrentMorphIndexValue?: (morphIndex: number, meshNames?: string[]) => number;\n getCurrentBoneQuaternion?: (nodeKey: string) => Quaternion | null;\n getCurrentBonePositionValue?: (nodeKey: string, axis: 'x' | 'y' | 'z') => number | null;\n getBones: () => ResolvedBones;\n getConfig: () => Profile;\n getCompositeRotations: () => CompositeRotation[];\n computeSideValues: (base: number, balance?: number) => { left: number; right: number };\n getAUMixWeight: (auId: number) => number;\n isMixedAU: (auId: number) => boolean;\n reapplyProceduralState?: () => void;\n}\n\n/** @deprecated Use ThreeAnimationSystemHost. */\nexport type AnimationControllerHost = ThreeAnimationSystemHost;\n\n/** @deprecated Use ThreeAnimationSystemHost. */\nexport type BakedAnimationHost = ThreeAnimationSystemHost;\n\nexport type ThreeAnimationSystemOptions = {\n animationRuntimeFactory?: EmbodyAnimationRuntimeFactory;\n};\n\n// Lightweight unique id for mixer actions/handles\nconst makeActionId = () => `act_${Math.random().toString(36).slice(2, 8)}_${Date.now().toString(36)}`;\nconst X_AXIS = new Vector3(1, 0, 0);\nconst Y_AXIS = new Vector3(0, 1, 0);\nconst Z_AXIS = new Vector3(0, 0, 1);\nconst CLIP_EVENT_METADATA_KEY = '__embodyClipEvents';\nconst CLIP_EVENT_EPSILON = 1e-4;\n\ntype RotationBoneBinding = BoneBinding & { channel: 'rx' | 'ry' | 'rz' };\n\nfunction isRotationBoneBinding(binding: BoneBinding | undefined): binding is RotationBoneBinding {\n return binding?.channel === 'rx' || binding?.channel === 'ry' || binding?.channel === 'rz';\n}\n\nfunction getAutoVisemeJawBinding(config: Profile, bones?: ResolvedBones): RotationBoneBinding | null {\n const candidates = [\n config.auToBones[103]?.find(isRotationBoneBinding),\n config.auToBones[26]?.find(isRotationBoneBinding),\n ].filter((binding): binding is RotationBoneBinding => !!binding);\n if (bones) {\n return candidates.find((binding) => !!bones[binding.node]) ?? candidates[0] ?? null;\n }\n return candidates[0] ?? null;\n}\n\nfunction axisVectorForRotationChannel(channel: 'rx' | 'ry' | 'rz'): Vector3 {\n return channel === 'rx' ? X_AXIS : channel === 'ry' ? Y_AXIS : Z_AXIS;\n}\n\ntype ClipEventMetadata = {\n keyframeTimes: number[];\n};\n\ntype ScalarKeyframe = Pick<CurvePoint, 'time' | 'intensity' | 'inherit'>;\n\ntype ClipMonitor = {\n action: AnimationAction;\n actionId: string;\n clip: AnimationClip;\n clipName: string;\n duration: number;\n keyframeTimes: number[];\n listeners: Set<ClipEventListener>;\n initialDirection: 1 | -1;\n direction: 1 | -1;\n iteration: number;\n lastTime: number;\n lastKeyframeIndex: number;\n loopMode: 'once' | 'repeat' | 'pingpong';\n finishedPending: boolean;\n cleanedUp: boolean;\n resolveFinished: () => void;\n};\n\ntype NormalizedPlaybackState = {\n source: AnimationSource;\n loop: boolean;\n loopMode: 'repeat' | 'pingpong' | 'once';\n repeatCount?: number;\n reverse: boolean;\n playbackRate: number;\n weight: number;\n balance: number;\n requestedBlendMode: AnimationBlendMode;\n blendMode: AnimationBlendMode;\n easing: AnimationEasing;\n};\n\ntype BakedActionGroup = {\n actionId: string;\n channelActions: Map<BakedClipChannel, AnimationAction>;\n pendingFinishedChannels: Set<BakedClipChannel>;\n finishedPromise: Promise<void>;\n resolveFinished: () => void;\n};\n\ntype DynamicClipSource = {\n clipName: string;\n curves?: CurvesMap;\n channels?: SnippetChannel[];\n options?: ClipOptions;\n hasInheritedStart: boolean;\n};\n\ntype ClipParamsUpdate = {\n weight?: number;\n rate?: number;\n loop?: boolean;\n loopMode?: 'once' | 'repeat' | 'pingpong';\n repeatCount?: number;\n reverse?: boolean;\n actionId?: string;\n};\n\nconst ADDITIVE_BAKED_MIXER_CLIP_SUFFIX = '__embody_additive_delta';\n\nexport class ThreeAnimationSystem {\n private host: ThreeAnimationSystemHost;\n // Clip-backed snippets need a later mixer pass so they can override baked additive tracks.\n private animationMixer: AnimationMixer | null = null;\n private clipAnimationMixer: AnimationMixer | null = null;\n private mixerFinishedListenerAttached = false;\n private clipMixerFinishedListenerAttached = false;\n private animationClips: AnimationClip[] = [];\n private bakedSourceClips = new Map<string, PartitionedBakedClip>();\n private bakedMixerActions = new Map<string, AnimationAction>();\n private bakedAdditiveMixerClips = new Map<string, AnimationClip>();\n private bakedActionGroups = new Map<string, BakedActionGroup>();\n private bakedMixerClipToSource = new Map<string, { sourceClipName: string; channel: BakedClipChannel }>();\n private animationActions = new Map<string, AnimationAction>();\n private animationFinishedCallbacks = new Map<string, () => void>();\n private clipActions = new Map<string, AnimationAction>();\n private clipHandles = new Map<string, ClipHandle>();\n private rendererClipHandles = new Map<string, ClipHandle>();\n private clipSources = new Map<string, AnimationSource>();\n private playbackState = new Map<string, NormalizedPlaybackState>();\n private actionIds = new WeakMap<AnimationAction, string>();\n private actionIdToClip = new Map<string, string>();\n private clipMonitors = new Map<string, ClipMonitor>();\n private dynamicClipSources = new WeakMap<AnimationClip, DynamicClipSource>();\n private cljsAnimationRuntime: EmbodyAnimationRuntime | null = null;\n\n constructor(host: ThreeAnimationSystemHost, options: ThreeAnimationSystemOptions = {}) {\n this.host = host;\n if (options.animationRuntimeFactory) {\n this.cljsAnimationRuntime = options.animationRuntimeFactory(\n { owner: 'ThreeAnimationSystem' },\n this.createRuntimeConnector()\n );\n }\n }\n\n private shouldDebugClipLogs(): boolean {\n const globalLocation = typeof window !== 'undefined' ? window.location : undefined;\n const search = globalLocation?.search ?? '';\n return search.includes('polymerVocalDebug=1')\n || search.includes('embodyDebug=1');\n }\n\n private debugClipLog(...args: unknown[]): void {\n if (this.shouldDebugClipLogs()) {\n console.log(...args);\n }\n }\n\n private createRuntimeConnector(): EmbodyAnimationRuntimeConnector {\n return {\n buildClip: (clipName, curves, options) => {\n const handle = this.buildClipDirect(clipName, curves, options);\n if (!handle) return null;\n this.rendererClipHandles.set(clipName, handle);\n handle.subscribe?.((event) => {\n this.cljsAnimationRuntime?.acceptClipEvent(event);\n });\n return {\n actionId: handle.actionId,\n duration: handle.getDuration(),\n time: handle.getTime(),\n };\n },\n stopClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.stop();\n this.rendererClipHandles.delete(clipName);\n },\n pauseClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.pause();\n },\n resumeClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.resume();\n },\n setClipWeight: (clipName, weight) => {\n this.rendererClipHandles.get(clipName)?.setWeight?.(weight);\n },\n setClipPlaybackRate: (clipName, rate) => {\n this.rendererClipHandles.get(clipName)?.setPlaybackRate?.(rate);\n },\n setClipLoop: (clipName, mode, repeatCount) => {\n this.rendererClipHandles.get(clipName)?.setLoop?.(mode, repeatCount);\n },\n setClipTime: (clipName, time) => {\n this.rendererClipHandles.get(clipName)?.setTime?.(time);\n },\n getClipTime: (clipName) => this.rendererClipHandles.get(clipName)?.getTime() ?? 0,\n getClipDuration: (clipName) => this.rendererClipHandles.get(clipName)?.getDuration() ?? 0,\n updateClipParams: (clipName, params) => this.updateClipParamsDirect(clipName, params as ClipParamsUpdate),\n cleanupSnippet: (clipName) => this.cleanupSnippetDirect(clipName),\n };\n }\n\n getRuntimeSnapshot(): Record<string, unknown> | null {\n return this.cljsAnimationRuntime?.snapshot() ?? null;\n }\n\n private getActionId(action?: AnimationAction | null): string | undefined {\n if (!action) return undefined;\n return this.actionIds.get(action) ?? action.__actionId;\n }\n\n private setActionId(action: AnimationAction, clipName: string): string {\n const actionId = makeActionId();\n this.actionIds.set(action, actionId);\n this.actionIdToClip.set(actionId, clipName);\n action.__actionId = actionId;\n return actionId;\n }\n\n private clearActionId(action?: AnimationAction | null): void {\n if (!action) return;\n const actionId = this.getActionId(action);\n if (actionId) {\n this.actionIdToClip.delete(actionId);\n }\n this.actionIds.delete(action);\n delete action.__actionId;\n }\n\n private uncacheClip(\n clip?: AnimationClip | null,\n mixer: AnimationMixer | null = this.animationMixer\n ): void {\n if (!clip || !mixer) return;\n try {\n mixer.uncacheClip(clip);\n } catch {}\n }\n\n private uncacheAction(\n action?: AnimationAction | null,\n mixer: AnimationMixer | null = this.animationMixer\n ): void {\n if (!action || !mixer) return;\n try {\n const clip = action.getClip();\n if (clip) {\n mixer.uncacheAction(clip);\n mixer.uncacheClip(clip);\n }\n } catch {}\n }\n\n private releaseBakedMixerAction(mixerClipName: string): void {\n const action = this.bakedMixerActions.get(mixerClipName);\n if (!action) return;\n try {\n action.stop();\n } catch {}\n this.uncacheAction(action);\n this.clearActionId(action);\n this.bakedMixerActions.delete(mixerClipName);\n }\n\n private clearBakedAdditiveMixerClip(mixerClipName: string): void {\n const clip = this.bakedAdditiveMixerClips.get(mixerClipName);\n if (!clip) return;\n this.uncacheClip(clip);\n this.bakedAdditiveMixerClips.delete(mixerClipName);\n }\n\n private clearAllBakedAdditiveMixerClips(): void {\n for (const mixerClipName of Array.from(this.bakedAdditiveMixerClips.keys())) {\n this.clearBakedAdditiveMixerClip(mixerClipName);\n }\n }\n\n private resolveTrackTarget(\n model: Object3D,\n parsed: ReturnType<typeof PropertyBinding.parseTrackName>\n ): Object3D | null {\n const targetKey = parsed.objectName === 'bones' && parsed.objectIndex\n ? parsed.objectIndex\n : parsed.nodeName;\n if (!targetKey) {\n return null;\n }\n return model.getObjectByProperty('uuid', targetKey)\n ?? PropertyBinding.findNode(model, targetKey)\n ?? null;\n }\n\n private getMorphTrackBaseValue(\n target: Object3D | null,\n propertyIndex: string | number | undefined\n ): number {\n if (!target) {\n return 0;\n }\n\n const meshTarget = target as Mesh & {\n morphTargetInfluences?: number[];\n morphTargetDictionary?: Record<string, number>;\n };\n const influences = meshTarget.morphTargetInfluences;\n if (!influences) {\n return 0;\n }\n\n let morphIndex: number | undefined;\n if (typeof propertyIndex === 'number' && Number.isInteger(propertyIndex)) {\n morphIndex = propertyIndex;\n } else if (typeof propertyIndex === 'string') {\n if (/^\\d+$/.test(propertyIndex)) {\n morphIndex = Number(propertyIndex);\n } else {\n morphIndex = meshTarget.morphTargetDictionary?.[propertyIndex];\n }\n }\n\n if (morphIndex === undefined) {\n return 0;\n }\n\n return influences[morphIndex] ?? 0;\n }\n\n private canCreateFirstFrameReferenceTrack(track: KeyframeTrack): boolean {\n const valueSize = track.getValueSize();\n if (!Number.isFinite(valueSize) || valueSize <= 0 || track.values.length < valueSize) {\n return false;\n }\n\n return track.ValueTypeName === 'number'\n || track.ValueTypeName === 'quaternion'\n || track.ValueTypeName === 'vector';\n }\n\n private createFirstFrameReferenceTrack(track: KeyframeTrack): KeyframeTrack | null {\n const valueSize = track.getValueSize();\n if (!this.canCreateFirstFrameReferenceTrack(track)) {\n return null;\n }\n\n const values = Array.from(track.values.slice(0, valueSize));\n if (track.ValueTypeName === 'number') {\n return new NumberKeyframeTrack(track.name, [0], values);\n }\n if (track.ValueTypeName === 'quaternion') {\n return new QuaternionKeyframeTrack(track.name, [0], values);\n }\n if (track.ValueTypeName === 'vector') {\n return new VectorKeyframeTrack(track.name, [0], values);\n }\n return null;\n }\n\n private createAdditiveReferenceTrack(\n track: KeyframeTrack,\n model: Object3D\n ): KeyframeTrack | null {\n const trackName = typeof track?.name === 'string' ? track.name : '';\n if (!trackName) {\n return null;\n }\n\n let parsed: ReturnType<typeof PropertyBinding.parseTrackName>;\n try {\n parsed = PropertyBinding.parseTrackName(trackName);\n } catch {\n return null;\n }\n\n const target = this.resolveTrackTarget(model, parsed);\n if (parsed.propertyName === 'morphTargetInfluences') {\n return new NumberKeyframeTrack(\n track.name,\n [0],\n [this.getMorphTrackBaseValue(target, parsed.propertyIndex)]\n );\n }\n\n return this.createFirstFrameReferenceTrack(track);\n }\n\n private createAdditiveMixerClip(mixerClip: AnimationClip): AnimationClip | null {\n const model = this.host.getModel();\n if (!model) {\n return null;\n }\n\n const additiveTracks: KeyframeTrack[] = [];\n const referenceTracks: KeyframeTrack[] = [];\n for (const track of mixerClip.tracks) {\n const referenceTrack = this.createAdditiveReferenceTrack(track, model);\n if (!referenceTrack) {\n continue;\n }\n additiveTracks.push(track.clone());\n referenceTracks.push(referenceTrack);\n }\n\n const additiveClip = new AnimationClip(\n `${mixerClip.name}${ADDITIVE_BAKED_MIXER_CLIP_SUFFIX}`,\n mixerClip.duration,\n additiveTracks\n );\n if (additiveTracks.length > 0) {\n const referenceClip = new AnimationClip(\n `${mixerClip.name}${ADDITIVE_BAKED_MIXER_CLIP_SUFFIX}_reference`,\n 0,\n referenceTracks\n );\n AnimationUtils.makeClipAdditive(additiveClip, 0, referenceClip);\n }\n return additiveClip;\n }\n\n private getOrCreateBakedAdditiveMixerClip(mixerClip: AnimationClip): AnimationClip | null {\n const cached = this.bakedAdditiveMixerClips.get(mixerClip.name);\n if (cached) {\n return cached;\n }\n\n const additiveClip = this.createAdditiveMixerClip(mixerClip);\n if (!additiveClip) {\n return null;\n }\n this.bakedAdditiveMixerClips.set(mixerClip.name, additiveClip);\n return additiveClip;\n }\n\n private setClipEventMetadata(clip: AnimationClip, metadata: ClipEventMetadata) {\n const userData = ((clip as any).userData ??= {});\n userData[CLIP_EVENT_METADATA_KEY] = metadata;\n }\n\n private getClipEventMetadata(clip: AnimationClip): ClipEventMetadata {\n const userData = (clip as any).userData;\n const keyframeTimes = Array.isArray(userData?.[CLIP_EVENT_METADATA_KEY]?.keyframeTimes)\n ? userData[CLIP_EVENT_METADATA_KEY].keyframeTimes.filter((time: unknown): time is number => Number.isFinite(time as number))\n : [];\n return { keyframeTimes };\n }\n\n private curvesHaveInheritedStart(curves: CurvesMap): boolean {\n return Object.values(curves).some((curve) => !!curve?.[0]?.inherit);\n }\n\n private channelsHaveInheritedStart(channels: readonly SnippetChannel[]): boolean {\n return channels.some((channel) => !!channel.keyframes?.[0]?.inherit);\n }\n\n private rebuildDynamicClip(source: DynamicClipSource): AnimationClip | null {\n if (source.channels) {\n return this.typedSnippetToClip(source.clipName, source.channels, source.options);\n }\n if (source.curves) {\n return this.snippetToClip(source.clipName, source.curves, source.options);\n }\n return null;\n }\n\n private resolveInheritedClipForPlayback(clip: AnimationClip): AnimationClip {\n const source = this.dynamicClipSources.get(clip);\n if (!source?.hasInheritedStart) {\n return clip;\n }\n return this.rebuildDynamicClip(source) ?? clip;\n }\n\n private getKeyframeIndex(times: number[], currentTime: number) {\n if (!times.length) return -1;\n const target = Math.max(0, currentTime) + 1e-3;\n let lo = 0;\n let hi = times.length - 1;\n let idx = 0;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n if (times[mid] <= target) {\n idx = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return idx;\n }\n\n private emitClipEvent(monitor: ClipMonitor, event: Parameters<ClipEventListener>[0]) {\n for (const listener of Array.from(monitor.listeners)) {\n try {\n listener(event);\n } catch (error) {\n console.error('[Embody] clip event listener failed', error);\n }\n }\n }\n\n private emitKeyframesForRange(\n monitor: ClipMonitor,\n startTime: number,\n endTime: number,\n direction: 1 | -1,\n includeStart: boolean\n ) {\n if (!monitor.keyframeTimes.length) return;\n\n const times = direction === 1 ? monitor.keyframeTimes : [...monitor.keyframeTimes].reverse();\n for (const time of times) {\n const matchesForward = direction === 1\n && (includeStart ? time >= startTime - CLIP_EVENT_EPSILON : time > startTime + CLIP_EVENT_EPSILON)\n && time <= endTime + CLIP_EVENT_EPSILON;\n const matchesReverse = direction === -1\n && (includeStart ? time <= startTime + CLIP_EVENT_EPSILON : time < startTime - CLIP_EVENT_EPSILON)\n && time >= endTime - CLIP_EVENT_EPSILON;\n if (!matchesForward && !matchesReverse) continue;\n\n const keyframeIndex = monitor.keyframeTimes.indexOf(time);\n monitor.lastKeyframeIndex = keyframeIndex;\n this.emitClipEvent(monitor, {\n type: 'keyframe',\n clipName: monitor.clipName,\n keyframeIndex,\n totalKeyframes: monitor.keyframeTimes.length,\n currentTime: time,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n }\n }\n\n private resetClipMonitor(monitor: ClipMonitor, currentTime: number) {\n monitor.iteration = 0;\n monitor.direction = monitor.initialDirection;\n monitor.lastTime = currentTime;\n monitor.lastKeyframeIndex = this.getKeyframeIndex(monitor.keyframeTimes, currentTime);\n monitor.finishedPending = false;\n }\n\n private syncClipMonitorTime(monitor: ClipMonitor, currentTime: number, emitSeek = false) {\n const clamped = Math.max(0, Math.min(monitor.duration, currentTime));\n monitor.lastTime = clamped;\n monitor.lastKeyframeIndex = this.getKeyframeIndex(monitor.keyframeTimes, clamped);\n if (emitSeek) {\n this.emitClipEvent(monitor, {\n type: 'seek',\n clipName: monitor.clipName,\n currentTime: clamped,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n }\n }\n\n private cleanupClipMonitor(actionId: string, options: { resolveFinished?: boolean } = {}) {\n const monitor = this.clipMonitors.get(actionId);\n if (!monitor || monitor.cleanedUp) return;\n const { resolveFinished = true } = options;\n monitor.cleanedUp = true;\n try { monitor.action.paused = true; } catch {}\n if (resolveFinished) {\n monitor.resolveFinished();\n }\n monitor.listeners.clear();\n this.clipMonitors.delete(actionId);\n this.actionIdToClip.delete(actionId);\n }\n\n private advanceClipMonitor(monitor: ClipMonitor, previousTime: number) {\n if (monitor.cleanedUp || (monitor.action.paused && !monitor.finishedPending)) return;\n\n const currentTime = Math.max(0, Math.min(monitor.duration, monitor.action.time));\n const delta = currentTime - previousTime;\n\n if (monitor.loopMode === 'pingpong') {\n const movingForward = monitor.direction === 1;\n const bouncedAtEnd = movingForward && delta < -CLIP_EVENT_EPSILON;\n const bouncedAtStart = !movingForward && delta > CLIP_EVENT_EPSILON;\n\n if (bouncedAtEnd) {\n this.emitKeyframesForRange(monitor, previousTime, monitor.duration, 1, false);\n monitor.direction = -1;\n this.emitKeyframesForRange(monitor, monitor.duration, currentTime, -1, false);\n } else if (bouncedAtStart) {\n this.emitKeyframesForRange(monitor, previousTime, 0, -1, false);\n monitor.direction = 1;\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: 0,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, 0, currentTime, 1, false);\n } else if (delta > CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, 1, false);\n monitor.direction = 1;\n } else if (delta < -CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, -1, false);\n monitor.direction = -1;\n }\n } else if (monitor.direction === 1) {\n const wrapped = currentTime + CLIP_EVENT_EPSILON < previousTime;\n if (wrapped) {\n this.emitKeyframesForRange(monitor, previousTime, monitor.duration, 1, false);\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: 0,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, 0, currentTime, 1, true);\n } else if (delta > CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, 1, false);\n }\n } else {\n const wrapped = currentTime > previousTime + CLIP_EVENT_EPSILON;\n if (wrapped) {\n this.emitKeyframesForRange(monitor, previousTime, 0, -1, false);\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: monitor.duration,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, monitor.duration, currentTime, -1, true);\n } else if (delta < -CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, -1, false);\n }\n }\n\n this.syncClipMonitorTime(monitor, currentTime);\n }\n\n private normalizePlaybackOptions(\n options: AnimationPlayOptions | ClipOptions | undefined,\n defaults: { loop: boolean; source: AnimationSource }\n ): NormalizedPlaybackState {\n const clipOptions = options as ClipOptions | undefined;\n const rawRate = options?.playbackRate ?? options?.speed ?? 1.0;\n const playbackRate = Number.isFinite(rawRate) ? Math.max(0, Math.abs(rawRate)) : 1.0;\n const rawWeight = options?.weight ?? options?.intensity ?? clipOptions?.mixerWeight ?? 1.0;\n const weight = Number.isFinite(rawWeight) ? Math.max(0, rawWeight) : 1.0;\n const loopMode = options?.loopMode\n ?? (typeof options?.loop === 'boolean'\n ? (options.loop ? 'repeat' : 'once')\n : (defaults.loop ? 'repeat' : 'once'));\n const requestedBlendMode = options?.blendMode ?? (clipOptions?.mixerAdditive ? 'additive' : 'replace');\n return {\n source: options?.source ?? defaults.source,\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: options?.repeatCount,\n reverse: !!options?.reverse,\n playbackRate,\n weight,\n balance: Number.isFinite(options?.balance) ? options?.balance ?? 0 : 0,\n requestedBlendMode,\n blendMode: requestedBlendMode,\n easing: options?.easing ?? 'linear',\n };\n }\n\n private applyPlaybackState(action: AnimationAction, state: NormalizedPlaybackState): void {\n const signedRate = state.reverse ? -state.playbackRate : state.playbackRate;\n action.setEffectiveTimeScale(signedRate);\n action.setEffectiveWeight(state.weight);\n action.blendMode = state.blendMode === 'additive'\n ? AdditiveAnimationBlendMode\n : NormalAnimationBlendMode;\n\n const reps = state.repeatCount ?? Infinity;\n if (state.loopMode === 'pingpong') {\n action.setLoop(LoopPingPong, reps);\n } else if (state.loopMode === 'once') {\n action.setLoop(LoopOnce, 1);\n } else {\n action.setLoop(LoopRepeat, reps);\n }\n action.clampWhenFinished = state.loopMode === 'once';\n }\n\n private setPlaybackState(clipName: string, state: NormalizedPlaybackState): void {\n this.playbackState.set(clipName, state);\n this.clipSources.set(clipName, state.source);\n }\n\n private getPlaybackStateSnapshot(\n clipName: string,\n defaults: { loop: boolean; source: AnimationSource }\n ): NormalizedPlaybackState {\n const existing = this.playbackState.get(clipName);\n if (existing) {\n return { ...existing };\n }\n return this.normalizePlaybackOptions(undefined, defaults);\n }\n\n private mergePlaybackOptions(\n current: NormalizedPlaybackState,\n options: AnimationPlayOptions | ClipOptions | undefined\n ): NormalizedPlaybackState {\n if (!options) {\n return current;\n }\n const next = { ...current };\n const clipOptions = options as ClipOptions | undefined;\n const loopMode = options.loopMode\n ?? (typeof options.loop === 'boolean' ? (options.loop ? 'repeat' : 'once') : undefined);\n\n if (options.source) next.source = options.source;\n if (loopMode) {\n next.loopMode = loopMode;\n next.loop = loopMode !== 'once';\n }\n if (options.repeatCount !== undefined) {\n next.repeatCount = Number.isFinite(options.repeatCount)\n ? Math.max(0, options.repeatCount ?? 0)\n : undefined;\n }\n if (typeof options.reverse === 'boolean') {\n next.reverse = options.reverse;\n }\n\n const rate = options.playbackRate ?? options.speed;\n if (rate !== undefined) {\n next.playbackRate = Number.isFinite(rate) ? Math.max(0, Math.abs(rate)) : current.playbackRate;\n }\n\n const weight = options.weight ?? options.intensity ?? clipOptions?.mixerWeight;\n if (weight !== undefined) {\n next.weight = Number.isFinite(weight) ? Math.max(0, weight) : current.weight;\n }\n\n if (typeof options.balance === 'number' && Number.isFinite(options.balance)) {\n next.balance = Math.max(-1, Math.min(1, options.balance));\n }\n\n if (options.blendMode) {\n next.requestedBlendMode = options.blendMode;\n } else if (typeof clipOptions?.mixerAdditive === 'boolean') {\n next.requestedBlendMode = clipOptions.mixerAdditive ? 'additive' : 'replace';\n }\n next.blendMode = next.requestedBlendMode;\n\n if (options.easing) {\n next.easing = options.easing;\n }\n\n return next;\n }\n\n private isBakedSourceClip(clipName: string): boolean {\n return this.bakedSourceClips.has(clipName);\n }\n\n private getBakedSourceClip(clipName: string): PartitionedBakedClip | undefined {\n return this.bakedSourceClips.get(clipName);\n }\n\n private getBakedChannelInfo(\n clipName: string,\n playbackState?: NormalizedPlaybackState\n ): BakedClipChannelInfo[] | undefined {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return undefined;\n }\n\n const requestedBlendMode = playbackState?.requestedBlendMode ?? 'replace';\n return bakedClip.channels.map((channel) => ({\n ...channel,\n blendMode: resolveBakedChannelBlendMode(channel.channel, requestedBlendMode),\n }));\n }\n\n private getBakedAggregateBlendMode(\n clipName: string,\n playbackState?: NormalizedPlaybackState\n ): AnimationBlendMode {\n const channels = this.getBakedChannelInfo(clipName, playbackState);\n if (!channels) {\n return playbackState?.requestedBlendMode ?? playbackState?.blendMode ?? 'replace';\n }\n return resolveBakedAggregateBlendMode(\n channels,\n playbackState?.requestedBlendMode ?? 'replace'\n );\n }\n\n private applyPlaybackStateToBakedAction(\n action: AnimationAction,\n state: NormalizedPlaybackState,\n channel: BakedClipChannel\n ): void {\n this.applyPlaybackState(action, {\n ...state,\n blendMode: resolveBakedChannelBlendMode(channel, state.requestedBlendMode) ?? 'replace',\n });\n }\n\n private resolveStartTime(\n duration: number,\n state: NormalizedPlaybackState,\n explicitStartTime?: number\n ): number {\n if (typeof explicitStartTime === 'number' && Number.isFinite(explicitStartTime)) {\n return Math.max(0, Math.min(duration, explicitStartTime));\n }\n if (state.reverse && state.loopMode === 'once') {\n return duration;\n }\n return 0;\n }\n\n private getOrCreateBakedMixerAction(\n sourceClipName: string,\n channel: BakedClipChannel,\n blendMode: AnimationBlendMode = 'replace'\n ): AnimationAction | null {\n const bakedClip = this.getBakedSourceClip(sourceClipName);\n const mixerClip = bakedClip?.mixerClips.find((entry) => entry.channel === channel)?.clip;\n if (!mixerClip) {\n return null;\n }\n\n const desiredClip = blendMode === 'additive'\n ? this.getOrCreateBakedAdditiveMixerClip(mixerClip)\n : mixerClip;\n if (!desiredClip) {\n return null;\n }\n\n const existing = this.bakedMixerActions.get(mixerClip.name);\n if (existing?.getClip() === desiredClip) {\n return existing;\n }\n\n this.ensureMixer();\n if (!this.animationMixer) {\n return null;\n }\n\n if (existing) {\n this.releaseBakedMixerAction(mixerClip.name);\n }\n\n const action = this.animationMixer.clipAction(desiredClip);\n this.bakedMixerActions.set(mixerClip.name, action);\n return action;\n }\n\n private getRepresentativeBakedAction(clipName: string): AnimationAction | null {\n const group = this.bakedActionGroups.get(clipName);\n if (!group) {\n return null;\n }\n return group.channelActions.values().next().value ?? null;\n }\n\n private createBakedActionGroup(\n clipName: string,\n playbackState: NormalizedPlaybackState\n ): BakedActionGroup | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return null;\n }\n\n const channelActions = new Map<BakedClipChannel, AnimationAction>();\n for (const mixerClip of bakedClip.mixerClips) {\n const channelBlendMode = resolveBakedChannelBlendMode(\n mixerClip.channel,\n playbackState.requestedBlendMode\n ) ?? 'replace';\n const action = this.getOrCreateBakedMixerAction(\n clipName,\n mixerClip.channel,\n channelBlendMode\n );\n if (action) {\n channelActions.set(mixerClip.channel, action);\n }\n }\n\n if (channelActions.size === 0) {\n return null;\n }\n\n let resolveFinished = () => {};\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n\n return {\n actionId: makeActionId(),\n channelActions,\n pendingFinishedChannels: playbackState.loopMode === 'once'\n ? new Set(channelActions.keys())\n : new Set<BakedClipChannel>(),\n finishedPromise,\n resolveFinished,\n };\n }\n\n private getMeshNamesForAU(auId: number, config: Profile, explicitMeshNames?: string[]): string[] {\n if (explicitMeshNames && explicitMeshNames.length > 0) {\n return explicitMeshNames;\n }\n\n if (typeof this.host.getMeshNamesForAU === 'function') {\n return this.host.getMeshNamesForAU(auId) || [];\n }\n\n return getMeshNamesForAUProfile(config, auId);\n }\n\n private getMeshNamesForViseme(config: Profile, explicitMeshNames?: string[]): string[] {\n if (explicitMeshNames && explicitMeshNames.length > 0) {\n return explicitMeshNames;\n }\n\n if (typeof this.host.getMeshNamesForViseme === 'function') {\n return this.host.getMeshNamesForViseme() || [];\n }\n\n return getMeshNamesForVisemeProfile(config);\n }\n\n private hasActiveAdditivePlayback(): boolean {\n for (const [clipName, group] of this.bakedActionGroups) {\n const state = this.playbackState.get(clipName);\n if (state?.blendMode !== 'additive') {\n continue;\n }\n for (const action of group.channelActions.values()) {\n if (action.isRunning() && !action.paused) {\n return true;\n }\n }\n }\n\n for (const [clipName, action] of this.animationActions) {\n const state = this.playbackState.get(clipName);\n if (state?.blendMode !== 'additive') {\n continue;\n }\n if (action.isRunning() && !action.paused) {\n return true;\n }\n }\n\n return false;\n }\n\n update(dtSeconds: number): void {\n if (this.animationMixer) {\n this.animationMixer.update(dtSeconds);\n }\n\n if (this.clipAnimationMixer) {\n const snapshots = Array.from(this.clipMonitors.values()).map((monitor) => ({\n actionId: monitor.actionId,\n previousTime: monitor.action.time,\n }));\n this.clipAnimationMixer.update(dtSeconds);\n for (const { actionId, previousTime } of snapshots) {\n const monitor = this.clipMonitors.get(actionId);\n if (!monitor) continue;\n this.advanceClipMonitor(monitor, previousTime);\n if (monitor.finishedPending) {\n const finalTime = Math.max(0, Math.min(monitor.duration, monitor.action.time));\n this.syncClipMonitorTime(monitor, finalTime);\n this.emitClipEvent(monitor, {\n type: 'completed',\n clipName: monitor.clipName,\n currentTime: finalTime,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n this.cleanupClipMonitor(actionId);\n }\n }\n }\n\n if (this.hasActiveAdditivePlayback()) {\n this.host.reapplyProceduralState?.();\n }\n }\n\n dispose(): void {\n this.stopAllAnimations();\n this.clearAllBakedAdditiveMixerClips();\n if (this.animationMixer) {\n this.animationMixer.stopAllAction();\n this.animationMixer = null;\n }\n if (this.clipAnimationMixer) {\n this.clipAnimationMixer.stopAllAction();\n this.clipAnimationMixer = null;\n }\n this.mixerFinishedListenerAttached = false;\n this.clipMixerFinishedListenerAttached = false;\n this.animationClips = [];\n this.bakedSourceClips.clear();\n this.bakedMixerActions.clear();\n this.bakedAdditiveMixerClips.clear();\n this.bakedActionGroups.clear();\n this.bakedMixerClipToSource.clear();\n this.animationActions.clear();\n this.animationFinishedCallbacks.clear();\n this.clipActions.clear();\n this.clipHandles.clear();\n this.clipSources.clear();\n this.playbackState.clear();\n this.clipMonitors.clear();\n }\n\n loadAnimationClips(clips: unknown[]): void {\n const model = this.host.getModel();\n if (!model) {\n console.warn('Embody: Cannot load animation clips before calling onReady()');\n return;\n }\n\n for (const clipName of this.bakedSourceClips.keys()) {\n this.stopAnimation(clipName);\n }\n if (this.animationMixer) {\n for (const bakedClip of this.bakedSourceClips.values()) {\n for (const mixerClip of bakedClip.mixerClips) {\n this.releaseBakedMixerAction(mixerClip.clip.name);\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n try {\n this.animationMixer.uncacheAction(mixerClip.clip);\n } catch {}\n try {\n this.animationMixer.uncacheClip(mixerClip.clip);\n } catch {}\n }\n }\n }\n this.clearAllBakedAdditiveMixerClips();\n\n for (const clipName of this.bakedSourceClips.keys()) {\n this.playbackState.delete(clipName);\n this.clipSources.delete(clipName);\n }\n\n this.bakedSourceClips.clear();\n this.bakedMixerActions.clear();\n this.bakedActionGroups.clear();\n this.bakedMixerClipToSource.clear();\n\n this.ensureMixer();\n const partitionedClips = (clips as AnimationClip[]).map((clip) => (\n partitionBakedClip(clip, model, this.host.getBones())\n ));\n\n this.animationClips = partitionedClips.map((clip) => clip.sourceClip);\n for (const bakedClip of partitionedClips) {\n this.bakedSourceClips.set(bakedClip.sourceClip.name, bakedClip);\n this.clipSources.set(bakedClip.sourceClip.name, 'baked');\n for (const mixerClip of bakedClip.mixerClips) {\n this.bakedMixerClipToSource.set(mixerClip.clip.name, {\n sourceClipName: bakedClip.sourceClip.name,\n channel: mixerClip.channel,\n });\n }\n }\n }\n\n getAnimationClips(): AnimationClipInfo[] {\n return this.animationClips.map(clip => ({\n name: clip.name,\n duration: clip.duration,\n trackCount: clip.tracks.length,\n source: this.clipSources.get(clip.name) ?? 'baked',\n channels: this.getBakedSourceClip(clip.name)?.channels,\n }));\n }\n\n removeAnimationClip(clipName: string): boolean {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return false;\n }\n\n this.stopAnimation(clipName);\n\n if (this.animationMixer) {\n for (const mixerClip of bakedClip.mixerClips) {\n const action = this.bakedMixerActions.get(mixerClip.clip.name);\n this.releaseBakedMixerAction(mixerClip.clip.name);\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n try {\n this.animationMixer.uncacheAction(mixerClip.clip);\n } catch {}\n try {\n this.animationMixer.uncacheClip(mixerClip.clip);\n } catch {}\n this.bakedMixerClipToSource.delete(mixerClip.clip.name);\n const actionId = this.getActionId(action);\n if (actionId && action) {\n this.actionIdToClip.delete(actionId);\n this.actionIds.delete(action);\n }\n }\n }\n for (const mixerClip of bakedClip.mixerClips) {\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n this.bakedMixerActions.delete(mixerClip.clip.name);\n }\n\n this.animationClips = this.animationClips.filter((entry) => entry.name !== clipName);\n this.bakedSourceClips.delete(clipName);\n this.bakedActionGroups.delete(clipName);\n this.playbackState.delete(clipName);\n this.clipSources.delete(clipName);\n\n return true;\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n console.warn(`Embody: Animation clip \"${clipName}\" not found`);\n return null;\n }\n\n const playbackState = this.mergePlaybackOptions(\n this.getPlaybackStateSnapshot(clipName, { loop: true, source: 'baked' }),\n options\n );\n playbackState.blendMode = this.getBakedAggregateBlendMode(clipName, playbackState);\n const actionGroup = this.createBakedActionGroup(clipName, playbackState);\n if (!actionGroup) {\n console.warn(`Embody: Animation clip \"${clipName}\" has no character mixer channels to play`);\n return null;\n }\n\n const crossfadeDuration = options.crossfadeDuration ?? 0;\n const clampWhenFinished = options.clampWhenFinished ?? playbackState.loopMode === 'once';\n const startTime = this.resolveStartTime(bakedClip.sourceClip.duration, playbackState, options.startTime);\n\n for (const [channel, action] of actionGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, playbackState, channel);\n action.clampWhenFinished = clampWhenFinished;\n\n if (crossfadeDuration > 0) {\n action.reset();\n action.fadeIn(crossfadeDuration);\n } else {\n action.reset();\n }\n action.time = startTime;\n action.play();\n }\n\n this.bakedActionGroups.set(clipName, actionGroup);\n this.setPlaybackState(clipName, playbackState);\n return this.createBakedAnimationHandle(clipName, actionGroup);\n }\n\n stopAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.stop();\n try { action.paused = false; } catch {}\n }\n this.bakedActionGroups.delete(clipName);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const actionId = this.getActionId(action);\n const isBaked = (this.clipSources.get(clipName) ?? 'baked') === 'baked';\n action.stop();\n if (!isBaked && this.clipAnimationMixer) {\n try {\n const clip = action.getClip();\n if (clip) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n } catch {}\n }\n if (!isBaked) {\n this.animationActions.delete(clipName);\n this.playbackState.delete(clipName);\n } else {\n try { action.paused = false; } catch {}\n }\n this.animationFinishedCallbacks.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n const clipAction = this.clipActions.get(clipName);\n if (clipAction && clipAction !== action) {\n const actionId = this.getActionId(clipAction);\n try {\n clipAction.stop();\n if (this.clipAnimationMixer) {\n const clip = clipAction.getClip();\n if (clip) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n }\n } catch {}\n this.clipActions.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n if (this.clipActions.get(clipName) === action) {\n this.clipActions.delete(clipName);\n }\n this.clipHandles.delete(clipName);\n }\n\n stopAllAnimations(): void {\n for (const clipName of new Set([\n ...this.bakedActionGroups.keys(),\n ...this.animationActions.keys(),\n ...this.clipActions.keys(),\n ])) {\n this.stopAnimation(clipName);\n }\n }\n\n pauseAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.paused = true;\n }\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = true;\n }\n }\n\n resumeAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.paused = false;\n }\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = false;\n }\n }\n\n pauseAllAnimations(): void {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.isRunning()) {\n action.paused = true;\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.isRunning()) {\n action.paused = true;\n }\n }\n }\n\n resumeAllAnimations(): void {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.paused) {\n action.paused = false;\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.paused) {\n action.paused = false;\n }\n }\n }\n\n setAnimationSpeed(clipName: string, speed: number): void {\n if (this.isBakedSourceClip(clipName)) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n next.playbackRate = Number.isFinite(speed) ? Math.max(0, Math.abs(speed)) : 1.0;\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'clip',\n });\n next.playbackRate = Number.isFinite(speed) ? Math.max(0, Math.abs(speed)) : 1.0;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n if (this.isBakedSourceClip(clipName)) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n next.weight = Number.isFinite(intensity) ? Math.max(0, intensity) : 1.0;\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'clip',\n });\n next.weight = Number.isFinite(intensity) ? Math.max(0, intensity) : 1.0;\n action.setEffectiveWeight(next.weight);\n this.setPlaybackState(clipName, next);\n }\n }\n\n setAnimationLoopMode(clipName: string, loopMode: 'repeat' | 'once' | 'pingpong'): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.loopMode = loopMode;\n next.loop = loopMode !== 'once';\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationRepeatCount(clipName: string, repeatCount?: number): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.repeatCount = typeof repeatCount === 'number' && Number.isFinite(repeatCount)\n ? Math.max(0, repeatCount)\n : undefined;\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationReverse(clipName: string, reverse: boolean): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.reverse = !!reverse;\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationBlendMode(clipName: string, blendMode: AnimationBlendMode): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.requestedBlendMode = blendMode;\n\n if (this.isBakedSourceClip(clipName)) {\n next.blendMode = this.getBakedAggregateBlendMode(clipName, next);\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, currentAction] of Array.from(bakedGroup.channelActions)) {\n const channelBlendMode = resolveBakedChannelBlendMode(channel, next.requestedBlendMode) ?? 'replace';\n const previousTime = currentAction.time;\n const wasActive = currentAction.isRunning() || currentAction.paused;\n const wasPaused = currentAction.paused;\n const action = this.getOrCreateBakedMixerAction(clipName, channel, channelBlendMode);\n if (!action) {\n bakedGroup.channelActions.delete(channel);\n continue;\n }\n\n this.applyPlaybackStateToBakedAction(action, next, channel);\n action.time = Math.max(0, Math.min(action.getClip().duration, previousTime));\n if (action !== currentAction && wasActive) {\n action.play();\n }\n action.paused = wasPaused;\n bakedGroup.channelActions.set(channel, action);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n next.blendMode = blendMode;\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n seekAnimation(clipName: string, time: number): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n const state = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n const duration = this.getBakedSourceClip(clipName)?.sourceClip.duration ?? 0;\n const clamped = Math.max(0, Math.min(duration, Number.isFinite(time) ? time : 0));\n for (const action of bakedGroup.channelActions.values()) {\n action.time = clamped;\n }\n try {\n this.animationMixer?.update(0);\n this.clipAnimationMixer?.update(0);\n if (state.blendMode === 'additive') {\n this.host.reapplyProceduralState?.();\n }\n } catch {}\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n const duration = action.getClip().duration;\n action.time = Math.max(0, Math.min(duration, Number.isFinite(time) ? time : 0));\n try {\n this.clipAnimationMixer?.update(0);\n const state = this.playbackState.get(clipName);\n if (state?.blendMode === 'additive') {\n this.host.reapplyProceduralState?.();\n }\n } catch {}\n }\n\n setAnimationTimeScale(timeScale: number): void {\n if (this.animationMixer) {\n this.animationMixer.timeScale = timeScale;\n }\n if (this.clipAnimationMixer) {\n this.clipAnimationMixer.timeScale = timeScale;\n }\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (bakedClip) {\n const state = this.playbackState.get(clipName);\n const action = this.getRepresentativeBakedAction(clipName);\n if (!state && !action) {\n return null;\n }\n const loopMode = state?.loopMode\n ?? (action?.loop === LoopPingPong ? 'pingpong' : action?.loop === LoopOnce ? 'once' : 'repeat');\n const playbackRate = state?.playbackRate ?? Math.abs(action?.getEffectiveTimeScale?.() ?? 1);\n const reverse = state?.reverse ?? ((action?.getEffectiveTimeScale?.() ?? 1) < 0);\n const pausedValues = this.bakedActionGroups.get(clipName)\n ? Array.from(this.bakedActionGroups.get(clipName)!.channelActions.values()).map((entry) => entry.paused)\n : [];\n\n return {\n name: bakedClip.sourceClip.name,\n actionId: this.bakedActionGroups.get(clipName)?.actionId,\n source: state?.source ?? this.clipSources.get(clipName) ?? 'baked',\n isPlaying: this.bakedActionGroups.get(clipName)\n ? Array.from(this.bakedActionGroups.get(clipName)!.channelActions.values()).some((entry) => entry.isRunning() && !entry.paused)\n : false,\n isPaused: pausedValues.length > 0 ? pausedValues.every(Boolean) : false,\n time: action?.time ?? 0,\n duration: bakedClip.sourceClip.duration,\n speed: playbackRate,\n playbackRate,\n reverse,\n weight: state?.weight ?? action?.getEffectiveWeight?.() ?? 1,\n balance: state?.balance ?? 0,\n requestedBlendMode: state?.requestedBlendMode ?? 'replace',\n blendMode: this.getBakedAggregateBlendMode(clipName, state),\n channels: this.getBakedChannelInfo(clipName, state),\n easing: state?.easing ?? 'linear',\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: state?.repeatCount,\n isLooping: loopMode !== 'once',\n };\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return null;\n\n const clip = action.getClip();\n const state = this.playbackState.get(clipName);\n const loopMode = state?.loopMode\n ?? (action.loop === LoopPingPong ? 'pingpong' : action.loop === LoopOnce ? 'once' : 'repeat');\n const playbackRate = state?.playbackRate ?? Math.abs(action.getEffectiveTimeScale());\n const reverse = state?.reverse ?? action.getEffectiveTimeScale() < 0;\n return {\n name: clip.name,\n actionId: this.getActionId(action),\n source: state?.source ?? this.clipSources.get(clip.name) ?? 'baked',\n isPlaying: action.isRunning() && !action.paused,\n isPaused: action.paused,\n time: action.time,\n duration: clip.duration,\n speed: playbackRate,\n playbackRate,\n reverse,\n weight: state?.weight ?? action.getEffectiveWeight(),\n balance: state?.balance ?? 0,\n requestedBlendMode: state?.requestedBlendMode ?? state?.blendMode ?? 'replace',\n blendMode: state?.blendMode ?? 'replace',\n channels: state?.source === 'baked' ? this.getBakedChannelInfo(clipName, state) : undefined,\n easing: state?.easing ?? 'linear',\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: state?.repeatCount,\n isLooping: loopMode !== 'once',\n };\n }\n\n getPlayingAnimations(): AnimationState[] {\n const playing: AnimationState[] = [];\n for (const name of this.bakedActionGroups.keys()) {\n const state = this.getAnimationState(name);\n if (state?.isPlaying) {\n playing.push(state);\n }\n }\n for (const [name, action] of this.animationActions) {\n if (action.isRunning()) {\n const state = this.getAnimationState(name);\n if (state) playing.push(state);\n }\n }\n return playing;\n }\n\n crossfadeTo(clipName: string, duration = 0.3, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.isRunning()) {\n action.fadeOut(duration);\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.isRunning()) {\n action.fadeOut(duration);\n }\n }\n\n return this.playAnimation(clipName, {\n ...options,\n crossfadeDuration: duration,\n });\n }\n\n snippetToClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): AnimationClip | null {\n const config = this.host.getConfig();\n if (!this.host.getModel()) {\n console.warn(`[Embody] snippetToClip: No model loaded for \"${clipName}\"`);\n return null;\n }\n if (Object.keys(curves).length === 0) {\n console.warn(`[Embody] snippetToClip: Empty curves for \"${clipName}\"`);\n return null;\n }\n\n const tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack> = [];\n const intensityScale = options?.intensityScale ?? 1.0;\n const globalBalance = options?.balance ?? 0;\n const balanceMap = options?.balanceMap;\n const meshNames = options?.meshNames;\n const visemeSlotCount = getProfileVisemeSlots(config).length;\n let maxTime = 0;\n\n const isNumericAU = (id: string) => /^\\d+$/.test(id);\n const isVisemeIndex = (id: string) => {\n if (options?.snippetCategory !== 'visemeSnippet') return false;\n const num = Number(id);\n return !Number.isNaN(num) && num >= 0 && num < visemeSlotCount;\n };\n\n const hasInheritedStart = (arr: ScalarKeyframe[] | undefined) => !!arr?.[0]?.inherit;\n const clampIntensity = (v: number) => Math.max(0, Math.min(2, v));\n const sampleCurve = (curveId: string, t: number) => {\n const arr = curves[curveId];\n if (!arr) return 0;\n let inheritedStartValue: number | undefined;\n if (hasInheritedStart(arr)) {\n if (isVisemeIndex(curveId)) {\n inheritedStartValue = this.host.getCurrentVisemeValue?.(Number(curveId));\n } else if (isNumericAU(curveId)) {\n inheritedStartValue = this.host.getCurrentAUValue?.(Number(curveId));\n }\n }\n return clampIntensity(\n this.sampleFinalKeyframeValue(\n arr,\n t,\n (intensity) => intensity * intensityScale,\n inheritedStartValue === undefined ? undefined : clampIntensity(inheritedStartValue)\n )\n );\n };\n\n const keyframeTimes = (() => {\n const times = new Set<number>();\n Object.values(curves).forEach((arr) => {\n arr.forEach((kf) => times.add(kf.time));\n });\n return Array.from(times).sort((a, b) => a - b);\n })();\n\n for (const [curveId, keyframes] of Object.entries(curves)) {\n if (!keyframes || keyframes.length === 0) continue;\n\n const curveMaxTime = keyframes[keyframes.length - 1].time;\n if (curveMaxTime > maxTime) maxTime = curveMaxTime;\n\n if (isNumericAU(curveId)) {\n const auId = Number(curveId);\n\n if (isVisemeIndex(curveId)) {\n const visemeMeshNames = this.getMeshNamesForViseme(config, meshNames);\n for (const target of getVisemeBindingTargets(config, auId)) {\n const effectiveScale = intensityScale * target.weight;\n if (typeof target.morph === 'number') {\n this.addMorphIndexTracks(tracks, target.morph, keyframes, effectiveScale, visemeMeshNames);\n } else if (target.morph) {\n this.addMorphTracks(tracks, target.morph, keyframes, effectiveScale, visemeMeshNames);\n }\n }\n } else {\n const auMeshNames = this.getMeshNamesForAU(auId, config, meshNames);\n const morphsBySide = config.auToMorphs[auId];\n const mixWeight = this.host.isMixedAU(auId) ? this.host.getAUMixWeight(auId) : 1.0;\n\n const leftKeys = morphsBySide?.left ?? [];\n const rightKeys = morphsBySide?.right ?? [];\n const centerKeys = morphsBySide?.center ?? [];\n\n const curveBalance = resolveCurveBalance(curveId, globalBalance, balanceMap);\n\n for (const morphKey of leftKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (curveBalance > 0) effectiveScale *= (1 - curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n for (const morphKey of rightKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (curveBalance < 0) effectiveScale *= (1 + curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n for (const morphKey of centerKeys) {\n const effectiveScale = intensityScale * mixWeight;\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n }\n } else {\n this.addMorphTracks(tracks, curveId, keyframes, intensityScale, meshNames);\n }\n }\n\n // Auto-generate jaw bone rotation from viseme curves when enabled\n // This replicates transitionViseme behavior for clip-based playback\n const autoVisemeJaw = options?.autoVisemeJaw !== false; // Default true\n const jawScale = options?.jawScale ?? 1.0;\n const visemeJawAmounts = getVisemeJawAmounts(config);\n const bones = this.host.getBones();\n const autoVisemeJawBinding = getAutoVisemeJawBinding(config, bones);\n const autoVisemeJawNodeKey = autoVisemeJawBinding?.node as BoneKey | undefined;\n let autoVisemeJawHandledJaw = false;\n\n if (\n autoVisemeJaw &&\n jawScale > 0 &&\n visemeJawAmounts &&\n autoVisemeJawBinding &&\n options?.snippetCategory === 'visemeSnippet' &&\n keyframeTimes.length > 0\n ) {\n const jawEntry = bones[autoVisemeJawBinding.node] ?? bones.JAW;\n\n if (jawEntry) {\n autoVisemeJawHandledJaw = true;\n // Sample all viseme curves at each keyframe time and compute weighted jaw amount\n const jawValues: number[] = [];\n const inheritedJawStart = keyframeTimes.length > 0\n && Array.from({ length: visemeSlotCount }, (_, index) => curves[String(index)])\n .some((curve) => hasInheritedStart(curve));\n const currentJawQ = inheritedJawStart\n ? this.host.getCurrentBoneQuaternion?.(autoVisemeJawBinding.node) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentJawQ) {\n jawValues.push(currentJawQ.x, currentJawQ.y, currentJawQ.z, currentJawQ.w);\n continue;\n }\n let jawAmount = 0;\n\n // Sum contributions from all active visemes at time t\n for (let visemeIdx = 0; visemeIdx < visemeSlotCount; visemeIdx++) {\n const visemeCurve = curves[String(visemeIdx)];\n if (!visemeCurve) continue;\n\n const visemeValue = sampleCurve(String(visemeIdx), t);\n if (visemeValue > 0 && visemeIdx < visemeJawAmounts.length) {\n // Take max jaw amount across all active visemes (like transitionViseme)\n const visemeJaw = visemeJawAmounts[visemeIdx] * visemeValue * jawScale;\n if (visemeJaw > jawAmount) {\n jawAmount = visemeJaw;\n }\n }\n }\n\n const maxDegrees = autoVisemeJawBinding.maxDegrees ?? 30;\n const radians = (maxDegrees * Math.PI / 180) * jawAmount;\n const jawQ = new Quaternion().copy(jawEntry.baseQuat);\n jawQ.multiply(new Quaternion().setFromAxisAngle(\n axisVectorForRotationChannel(autoVisemeJawBinding.channel),\n radians * autoVisemeJawBinding.scale\n ));\n\n jawValues.push(jawQ.x, jawQ.y, jawQ.z, jawQ.w);\n }\n\n const trackName = `${jawEntry.obj.uuid}.quaternion`;\n tracks.push(new QuaternionKeyframeTrack(trackName, keyframeTimes, jawValues));\n }\n }\n\n if (keyframeTimes.length > 0) {\n const compositeRotations = this.host.getCompositeRotations();\n const hasCurveAU = new Set<number>(\n Object.keys(curves)\n .filter(isNumericAU)\n .map((id) => Number(id))\n );\n\n const getAxisBinding = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n axisValue: number,\n t: number\n ) => {\n return getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n axisValue,\n (auId: number) => getAxisSampleForNode(auId, nodeKey, t),\n config.auToBones\n );\n };\n\n const getAxisSampleForNode = (\n auId: number,\n nodeKey: BoneKey,\n t: number\n ) => {\n const rawValue = sampleCurve(String(auId), t);\n if (rawValue <= 1e-6) return 0;\n\n const binding = config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n\n const curveBalance = resolveCurveBalance(String(auId), globalBalance, balanceMap);\n return rawValue * getSideScale(curveBalance, binding.side);\n };\n\n const getAxisValue = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n t: number\n ) =>\n getCompositeAxisValue(axisConfig, (auId: number) => getAxisSampleForNode(auId, nodeKey, t));\n\n for (const composite of compositeRotations) {\n const nodeKey = composite.node as BoneKey;\n\n if (autoVisemeJawHandledJaw && (nodeKey === autoVisemeJawNodeKey || nodeKey === 'JAW')) {\n continue;\n }\n\n const entry = bones[nodeKey];\n if (!entry) {\n console.log(`[snippetToClip] Skipping composite for \"${nodeKey}\" - bone not resolved`);\n continue;\n }\n\n const relevantAUs = new Set<number>();\n [composite.pitch, composite.yaw, composite.roll]\n .filter(Boolean)\n .forEach((axisConfig) => {\n axisConfig!.aus.forEach((auId) => {\n if (hasCurveAU.has(auId)) relevantAUs.add(auId);\n });\n });\n\n if (relevantAUs.size === 0) {\n continue;\n }\n\n const values: number[] = [];\n const currentBoneQ = Array.from(relevantAUs).some((auId) => hasInheritedStart(curves[String(auId)]))\n ? this.host.getCurrentBoneQuaternion?.(nodeKey) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentBoneQ) {\n values.push(currentBoneQ.x, currentBoneQ.y, currentBoneQ.z, currentBoneQ.w);\n continue;\n }\n const compositeQ = new Quaternion().copy(entry.baseQuat);\n\n const applyAxis = (\n axisConfig: RotationAxis | null | undefined\n ) => {\n if (!axisConfig) return;\n let axisValue = getAxisValue(nodeKey, axisConfig, t);\n if (Math.abs(axisValue) <= 1e-6) return;\n\n const binding = getAxisBinding(nodeKey, axisConfig, axisValue, t);\n if (!binding?.maxDegrees || !binding.channel) return;\n\n const radians = (binding.maxDegrees * Math.PI / 180) * Math.abs(axisValue) * binding.scale;\n const axis = binding.channel === 'rx' ? X_AXIS : binding.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n };\n\n applyAxis(composite.yaw);\n applyAxis(composite.pitch);\n applyAxis(composite.roll);\n\n values.push(compositeQ.x, compositeQ.y, compositeQ.z, compositeQ.w);\n }\n\n const trackName = `${entry.obj.uuid}.quaternion`;\n tracks.push(new QuaternionKeyframeTrack(trackName, keyframeTimes, values));\n }\n\n for (const curveId of Object.keys(curves)) {\n if (!isNumericAU(curveId)) continue;\n const auId = Number(curveId);\n const bindings = config.auToBones[auId] || [];\n const curve = curves[curveId];\n if (!curve || curve.length === 0) continue;\n\n for (const binding of bindings) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n const entry = bones[binding.node as BoneKey];\n if (!entry || binding.maxUnits === undefined) continue;\n\n const axisIndex: 'x' | 'y' | 'z' = binding.channel === 'tx' ? 'x' : binding.channel === 'ty' ? 'y' : 'z';\n const basePos = entry.basePos[axisIndex];\n const inheritedStartValue = curve[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(binding.node, axisIndex) ?? entry.obj.position[axisIndex]\n : undefined;\n const values: number[] = [];\n\n for (const t of keyframeTimes) {\n values.push(\n this.sampleFinalKeyframeValue(\n curve,\n t,\n (intensity) => {\n const v = clampIntensity(intensity * intensityScale);\n return basePos + (v * binding.maxUnits! * binding.scale);\n },\n inheritedStartValue\n )\n );\n }\n\n const trackName = `${entry.obj.uuid}.position[${axisIndex}]`;\n tracks.push(new NumberKeyframeTrack(trackName, keyframeTimes, values));\n }\n }\n }\n\n if (tracks.length === 0) {\n console.warn(`[Embody] snippetToClip: No tracks created for \"${clipName}\"`);\n return null;\n }\n\n const clip = new AnimationClip(clipName, maxTime, tracks);\n this.setClipEventMetadata(clip, { keyframeTimes });\n this.dynamicClipSources.set(clip, {\n clipName,\n curves,\n options,\n hasInheritedStart: this.curvesHaveInheritedStart(curves),\n });\n this.debugClipLog(`[Embody] snippetToClip: Created clip \"${clipName}\" with ${tracks.length} tracks, duration ${maxTime.toFixed(2)}s`);\n\n return clip;\n }\n\n typedSnippetToClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): AnimationClip | null {\n const config = this.host.getConfig();\n if (!this.host.getModel()) {\n console.warn(`[Embody] typedSnippetToClip: No model loaded for \"${clipName}\"`);\n return null;\n }\n if (channels.length === 0) {\n console.warn(`[Embody] typedSnippetToClip: Empty channels for \"${clipName}\"`);\n return null;\n }\n\n const tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack> = [];\n const intensityScale = options?.intensityScale ?? 1.0;\n const globalBalance = options?.balance ?? 0;\n const balanceMap = options?.balanceMap;\n const meshNames = options?.meshNames;\n const bones = this.host.getBones();\n type ProfileMappedTarget =\n | Extract<SnippetChannel['target'], { type: 'au' }>\n | Extract<SnippetChannel['target'], { type: 'lipSync' }>;\n const isProfileMappedTarget = (target: SnippetChannel['target']): target is ProfileMappedTarget =>\n target.type === 'au' || target.type === 'lipSync';\n const isProfileMappedChannel = (channel: SnippetChannel): channel is SnippetChannel & { target: ProfileMappedTarget } =>\n isProfileMappedTarget(channel.target);\n const visemeChannels = channels.filter((channel) => channel.target.type === 'viseme');\n const lipSyncChannels = channels.filter((channel) => channel.target.type === 'lipSync');\n const auChannels = channels.filter((channel) => channel.target.type === 'au');\n const profileMappedChannels = channels.filter(isProfileMappedChannel);\n let maxTime = 0;\n\n logTypedLipSyncDebug('[Embody Typed LipSync] typedSnippetToClip input', {\n clipName,\n channelCount: channels.length,\n visemeChannels: visemeChannels.map(summarizeTypedChannel),\n lipSyncChannels: lipSyncChannels.map(summarizeTypedChannel),\n auChannels: auChannels.map(summarizeTypedChannel),\n options: {\n source: options?.source,\n autoVisemeJaw: options?.autoVisemeJaw,\n jawScale: options?.jawScale,\n intensityScale: options?.intensityScale,\n snippetCategory: options?.snippetCategory,\n },\n });\n\n const hasInheritedStart = (arr: ScalarKeyframe[] | undefined) => !!arr?.[0]?.inherit;\n const clampIntensity = (v: number) => Math.max(0, Math.min(2, v));\n const channelScale = (channel: SnippetChannel) => intensityScale * (channel.intensityScale ?? 1);\n\n const keyframeTimes = (() => {\n const times = new Set<number>();\n channels.forEach((channel) => {\n channel.keyframes.forEach((kf) => times.add(kf.time));\n });\n return Array.from(times).sort((a, b) => a - b);\n })();\n\n const sampleTypedChannel = (\n channel: SnippetChannel,\n t: number\n ) => {\n let inheritedStartValue: number | undefined;\n if (hasInheritedStart(channel.keyframes)) {\n const target = channel.target;\n if (target.type === 'viseme') {\n inheritedStartValue = this.host.getCurrentVisemeValue?.(target.id);\n } else if (target.type === 'au') {\n inheritedStartValue = this.host.getCurrentAUValue?.(target.id);\n } else if (target.type === 'morph') {\n inheritedStartValue = typeof target.id === 'number'\n ? this.host.getCurrentMorphIndexValue?.(target.id, target.meshNames ?? meshNames)\n : this.host.getCurrentMorphValue?.(target.id, target.meshNames ?? meshNames);\n } else if (target.type === 'bone' && (target.channel === 'tx' || target.channel === 'ty' || target.channel === 'tz')) {\n const axis = target.channel === 'tx' ? 'x' : target.channel === 'ty' ? 'y' : 'z';\n inheritedStartValue = this.host.getCurrentBonePositionValue?.(target.id, axis) ?? undefined;\n }\n }\n return clampIntensity(\n this.sampleFinalKeyframeValue(\n channel.keyframes,\n t,\n (intensity) => intensity * channelScale(channel),\n inheritedStartValue === undefined ? undefined : clampIntensity(inheritedStartValue)\n )\n );\n };\n\n for (const channel of channels) {\n if (!channel.keyframes || channel.keyframes.length === 0) continue;\n\n const curveMaxTime = channel.keyframes[channel.keyframes.length - 1].time;\n if (curveMaxTime > maxTime) maxTime = curveMaxTime;\n const target = channel.target;\n\n if (target.type === 'viseme') {\n const visemeMeshNames = this.getMeshNamesForViseme(config, target.meshNames ?? meshNames);\n const bindingTargets = getVisemeBindingTargets(config, target.id);\n const tracksBefore = tracks.length;\n for (const bindingTarget of bindingTargets) {\n const effectiveScale = channelScale(channel) * bindingTarget.weight;\n if (typeof bindingTarget.morph === 'number') {\n this.addMorphIndexTracks(tracks, bindingTarget.morph, channel.keyframes, effectiveScale, visemeMeshNames);\n } else if (bindingTarget.morph) {\n this.addMorphTracks(tracks, bindingTarget.morph, channel.keyframes, effectiveScale, visemeMeshNames);\n }\n }\n logTypedLipSyncDebug('[Embody Typed LipSync] viseme binding', {\n clipName,\n visemeId: target.id,\n meshNames: visemeMeshNames,\n bindingCount: bindingTargets.length,\n bindings: bindingTargets.map(summarizeBindingTarget),\n keyframes: summarizeKeyframes(channel.keyframes),\n tracksBefore,\n tracksAfter: tracks.length,\n });\n continue;\n }\n\n if (isProfileMappedTarget(target)) {\n const controlMeshNames = this.getMeshNamesForAU(target.id, config, meshNames);\n const morphsBySide = config.auToMorphs[target.id];\n const mixWeight = this.host.isMixedAU(target.id) ? this.host.getAUMixWeight(target.id) : 1.0;\n const curveBalance = target.type === 'au'\n ? target.balance ?? resolveCurveBalance(String(target.id), globalBalance, balanceMap)\n : resolveCurveBalance(String(target.id), globalBalance, balanceMap);\n\n for (const morphKey of morphsBySide?.left ?? []) {\n let effectiveScale = channelScale(channel) * mixWeight;\n if (curveBalance > 0) effectiveScale *= (1 - curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n for (const morphKey of morphsBySide?.right ?? []) {\n let effectiveScale = channelScale(channel) * mixWeight;\n if (curveBalance < 0) effectiveScale *= (1 + curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n for (const morphKey of morphsBySide?.center ?? []) {\n const effectiveScale = channelScale(channel) * mixWeight;\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n continue;\n }\n\n if (target.type === 'morph') {\n const targetMeshes = target.meshNames ?? meshNames;\n if (typeof target.id === 'number') {\n this.addMorphIndexTracks(tracks, target.id, channel.keyframes, channelScale(channel), targetMeshes);\n } else {\n this.addMorphTracks(tracks, target.id, channel.keyframes, channelScale(channel), targetMeshes);\n }\n continue;\n }\n\n if (target.type === 'bone') {\n const entry = bones[target.id];\n if (!entry) continue;\n const scale = target.scale ?? 1;\n if (target.channel === 'rx' || target.channel === 'ry' || target.channel === 'rz') {\n const axis = target.channel === 'rx' ? X_AXIS : target.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const maxDegrees = target.maxDegrees ?? 30;\n const inheritedStart = hasInheritedStart(channel.keyframes)\n ? this.host.getCurrentBoneQuaternion?.(target.id) ?? null\n : null;\n const times = channel.keyframes.map((frame) => frame.time);\n const values: number[] = [];\n for (let index = 0; index < channel.keyframes.length; index += 1) {\n if (index === 0 && inheritedStart) {\n values.push(inheritedStart.x, inheritedStart.y, inheritedStart.z, inheritedStart.w);\n continue;\n }\n const intensity = clampIntensity(channel.keyframes[index].intensity * channelScale(channel));\n const radians = (maxDegrees * Math.PI / 180) * intensity * scale;\n const q = new Quaternion().copy(entry.baseQuat);\n q.multiply(new Quaternion().setFromAxisAngle(axis, radians));\n values.push(q.x, q.y, q.z, q.w);\n }\n tracks.push(new QuaternionKeyframeTrack(`${entry.obj.uuid}.quaternion`, times, values));\n } else {\n const axis = target.channel === 'tx' ? 'x' : target.channel === 'ty' ? 'y' : 'z';\n const maxUnits = target.maxUnits ?? 1;\n const inheritedStart = channel.keyframes[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(target.id, axis) ?? entry.obj.position[axis]\n : undefined;\n const values = channel.keyframes.map((frame, index) => {\n if (index === 0 && inheritedStart !== undefined) return inheritedStart;\n const intensity = clampIntensity(frame.intensity * channelScale(channel));\n return entry.basePos[axis] + intensity * maxUnits * scale;\n });\n tracks.push(new NumberKeyframeTrack(\n `${entry.obj.uuid}.position[${axis}]`,\n channel.keyframes.map((frame) => frame.time),\n values\n ));\n }\n continue;\n }\n\n const unsupportedType = String((target as { type?: unknown }).type ?? 'unknown');\n console.warn(`[Embody] typedSnippetToClip: Unsupported typed snippet target \"${unsupportedType}\" in \"${clipName}\"`);\n }\n\n const autoVisemeJaw = options?.autoVisemeJaw === true;\n const jawScale = options?.jawScale ?? 1.0;\n const visemeJawAmounts = getVisemeJawAmounts(config);\n const autoVisemeJawBinding = getAutoVisemeJawBinding(config, bones);\n const autoVisemeJawNodeKey = autoVisemeJawBinding?.node as BoneKey | undefined;\n let autoVisemeJawHandledJaw = false;\n if (autoVisemeJaw && jawScale > 0 && visemeJawAmounts && autoVisemeJawBinding && visemeChannels.length > 0 && keyframeTimes.length > 0) {\n const jawEntry = bones[autoVisemeJawBinding.node] ?? bones.JAW;\n if (jawEntry) {\n autoVisemeJawHandledJaw = true;\n const jawValues: number[] = [];\n const inheritedJawStart = visemeChannels.some((channel) => hasInheritedStart(channel.keyframes));\n const currentJawQ = inheritedJawStart ? this.host.getCurrentBoneQuaternion?.(autoVisemeJawBinding.node) ?? null : null;\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentJawQ) {\n jawValues.push(currentJawQ.x, currentJawQ.y, currentJawQ.z, currentJawQ.w);\n continue;\n }\n let jawAmount = 0;\n for (const channel of visemeChannels) {\n const target = channel.target;\n if (target.type !== 'viseme') continue;\n if (target.id < 0 || target.id >= visemeJawAmounts.length) continue;\n const visemeValue = sampleTypedChannel(channel, t);\n const visemeJaw = visemeJawAmounts[target.id] * visemeValue * jawScale;\n if (visemeJaw > jawAmount) jawAmount = visemeJaw;\n }\n const maxDegrees = autoVisemeJawBinding.maxDegrees ?? 30;\n const radians = (maxDegrees * Math.PI / 180) * jawAmount;\n const jawQ = new Quaternion().copy(jawEntry.baseQuat);\n jawQ.multiply(new Quaternion().setFromAxisAngle(\n axisVectorForRotationChannel(autoVisemeJawBinding.channel),\n radians * autoVisemeJawBinding.scale\n ));\n jawValues.push(jawQ.x, jawQ.y, jawQ.z, jawQ.w);\n }\n tracks.push(new QuaternionKeyframeTrack(`${jawEntry.obj.uuid}.quaternion`, keyframeTimes, jawValues));\n }\n }\n\n if (keyframeTimes.length > 0 && profileMappedChannels.length > 0) {\n const compositeRotations = this.host.getCompositeRotations();\n const hasChannelAU = new Set<number>(\n profileMappedChannels.map((channel) => channel.target.id)\n );\n const channelsByAU = new Map<number, SnippetChannel[]>();\n profileMappedChannels.forEach((channel) => {\n const existing = channelsByAU.get(channel.target.id) ?? [];\n existing.push(channel);\n channelsByAU.set(channel.target.id, existing);\n });\n\n const getAxisSampleForNode = (\n auId: number,\n nodeKey: BoneKey,\n t: number\n ) => {\n const channelsForAU = channelsByAU.get(auId);\n if (!channelsForAU) return 0;\n\n let value = 0;\n for (const channel of channelsForAU) {\n if (!isProfileMappedTarget(channel.target)) continue;\n const rawValue = sampleTypedChannel(channel, t);\n if (rawValue <= 1e-6) continue;\n\n const binding = config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n if (!binding?.side) {\n value = Math.max(value, rawValue);\n continue;\n }\n\n const curveBalance = channel.target.type === 'au'\n ? channel.target.balance ?? resolveCurveBalance(String(auId), globalBalance, balanceMap)\n : resolveCurveBalance(String(auId), globalBalance, balanceMap);\n value = Math.max(value, rawValue * getSideScale(curveBalance, binding.side));\n }\n return value;\n };\n\n const getAxisValue = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n t: number\n ) =>\n getCompositeAxisValue(axisConfig, (auId: number) => getAxisSampleForNode(auId, nodeKey, t));\n\n const getAxisBinding = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n axisValue: number,\n t: number\n ) => getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n axisValue,\n (auId: number) => getAxisSampleForNode(auId, nodeKey, t),\n config.auToBones\n );\n\n for (const composite of compositeRotations) {\n const nodeKey = composite.node as BoneKey;\n\n if (autoVisemeJawHandledJaw && (nodeKey === autoVisemeJawNodeKey || nodeKey === 'JAW')) {\n continue;\n }\n\n const entry = bones[nodeKey];\n if (!entry) {\n this.debugClipLog(`[typedSnippetToClip] Skipping composite for \"${nodeKey}\" - bone not resolved`);\n continue;\n }\n\n const relevantAUs = new Set<number>();\n [composite.pitch, composite.yaw, composite.roll]\n .filter(Boolean)\n .forEach((axisConfig) => {\n axisConfig!.aus.forEach((auId) => {\n if (hasChannelAU.has(auId)) relevantAUs.add(auId);\n });\n });\n\n if (relevantAUs.size === 0) {\n continue;\n }\n\n const values: number[] = [];\n const currentBoneQ = Array.from(relevantAUs).some((auId) =>\n channelsByAU.get(auId)?.some((channel) => hasInheritedStart(channel.keyframes))\n )\n ? this.host.getCurrentBoneQuaternion?.(nodeKey) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentBoneQ) {\n values.push(currentBoneQ.x, currentBoneQ.y, currentBoneQ.z, currentBoneQ.w);\n continue;\n }\n\n const compositeQ = new Quaternion().copy(entry.baseQuat);\n\n const applyAxis = (\n axisConfig: RotationAxis | null | undefined\n ) => {\n if (!axisConfig) return;\n const axisValue = getAxisValue(nodeKey, axisConfig, t);\n if (Math.abs(axisValue) <= 1e-6) return;\n\n const binding = getAxisBinding(nodeKey, axisConfig, axisValue, t);\n if (!binding?.maxDegrees || !binding.channel) return;\n\n const radians = (binding.maxDegrees * Math.PI / 180) * Math.abs(axisValue) * binding.scale;\n const axis = binding.channel === 'rx' ? X_AXIS : binding.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n };\n\n applyAxis(composite.yaw);\n applyAxis(composite.pitch);\n applyAxis(composite.roll);\n\n values.push(compositeQ.x, compositeQ.y, compositeQ.z, compositeQ.w);\n }\n\n tracks.push(new QuaternionKeyframeTrack(`${entry.obj.uuid}.quaternion`, keyframeTimes, values));\n }\n\n for (const channel of profileMappedChannels) {\n const auId = channel.target.id;\n const bindings = config.auToBones[auId] || [];\n\n for (const binding of bindings) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n const entry = bones[binding.node as BoneKey];\n if (!entry || binding.maxUnits === undefined) continue;\n\n const axisIndex: 'x' | 'y' | 'z' = binding.channel === 'tx' ? 'x' : binding.channel === 'ty' ? 'y' : 'z';\n const basePos = entry.basePos[axisIndex];\n const inheritedStartValue = channel.keyframes[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(binding.node, axisIndex) ?? entry.obj.position[axisIndex]\n : undefined;\n const values: number[] = [];\n\n for (const t of keyframeTimes) {\n const rawValue = sampleTypedChannel(channel, t);\n const curveBalance = channel.target.type === 'au'\n ? channel.target.balance ?? resolveCurveBalance(String(auId), globalBalance, balanceMap)\n : resolveCurveBalance(String(auId), globalBalance, balanceMap);\n const sideScale = binding.side ? getSideScale(curveBalance, binding.side) : 1;\n const value = clampIntensity(rawValue * sideScale);\n values.push(\n inheritedStartValue !== undefined && t === keyframeTimes[0]\n ? inheritedStartValue\n : basePos + (value * binding.maxUnits * binding.scale)\n );\n }\n\n tracks.push(new NumberKeyframeTrack(`${entry.obj.uuid}.position[${axisIndex}]`, keyframeTimes, values));\n }\n }\n }\n\n if (tracks.length === 0) {\n console.warn(`[Embody] typedSnippetToClip: No tracks created for \"${clipName}\"`);\n return null;\n }\n\n const clip = new AnimationClip(clipName, maxTime, tracks);\n this.setClipEventMetadata(clip, { keyframeTimes });\n this.dynamicClipSources.set(clip, {\n clipName,\n channels,\n options,\n hasInheritedStart: this.channelsHaveInheritedStart(channels),\n });\n logTypedLipSyncDebug('[Embody Typed LipSync] clip created', {\n clipName,\n trackCount: tracks.length,\n durationSec: maxTime,\n visemeIds: visemeChannels.map((channel) => channel.target.type === 'viseme' ? channel.target.id : null),\n lipSyncIds: lipSyncChannels.map((channel) => channel.target.type === 'lipSync' ? channel.target.id : null),\n auIds: auChannels.map((channel) => channel.target.type === 'au' ? channel.target.id : null),\n });\n this.debugClipLog(`[Embody] typedSnippetToClip: Created clip \"${clipName}\" with ${tracks.length} tracks, duration ${maxTime.toFixed(2)}s`);\n\n return clip;\n }\n\n private playClipDirect(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n const mixer = this.ensureClipMixer();\n\n if (!mixer) {\n console.warn('[Embody] playClip: No model loaded, cannot create mixer');\n return null;\n }\n const hasInheritedStart = !!this.dynamicClipSources.get(clip)?.hasInheritedStart;\n clip = this.resolveInheritedClipForPlayback(clip);\n\n const playbackState = this.mergePlaybackOptions(\n this.getPlaybackStateSnapshot(clip.name, {\n loop: false,\n source: options?.source ?? 'clip',\n }),\n options\n );\n const startTime = this.resolveStartTime(clip.duration, playbackState, options?.startTime);\n\n let action: AnimationAction;\n let actionId: string;\n let existingAction = this.clipActions.get(clip.name);\n if (existingAction && hasInheritedStart && existingAction.getClip() !== clip) {\n const previousClip = existingAction.getClip();\n const previousActionId = this.getActionId(existingAction);\n try { existingAction.stop(); } catch {}\n try { mixer.uncacheAction(previousClip); } catch {}\n try { mixer.uncacheClip(previousClip); } catch {}\n if (previousActionId) this.cleanupClipMonitor(previousActionId);\n this.clipActions.delete(clip.name);\n this.animationActions.delete(clip.name);\n existingAction = undefined;\n }\n if (existingAction) {\n action = existingAction;\n actionId = this.getActionId(action) ?? this.setActionId(action, clip.name);\n } else {\n action = mixer.clipAction(clip);\n actionId = this.setActionId(action, clip.name);\n }\n\n const existingClip = this.animationClips.find(c => c.name === clip.name);\n if (!existingClip) {\n this.animationClips.push(clip);\n }\n this.applyPlaybackState(action, playbackState);\n\n this.cleanupClipMonitor(actionId);\n\n let resolveFinished!: () => void;\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n const createMonitor = (\n listeners = new Set<ClipEventListener>(),\n state = this.playbackState.get(clip.name) ?? playbackState\n ): ClipMonitor => {\n const keyframeTimes = this.getClipEventMetadata(clip).keyframeTimes;\n const initialDirection: 1 | -1 = state.reverse ? -1 : 1;\n return {\n action,\n actionId,\n clip,\n clipName: clip.name,\n duration: clip.duration,\n keyframeTimes,\n listeners,\n initialDirection,\n direction: initialDirection,\n iteration: 0,\n lastTime: Math.max(0, Math.min(clip.duration, action.time)),\n lastKeyframeIndex: this.getKeyframeIndex(keyframeTimes, action.time),\n loopMode: state.loopMode,\n finishedPending: false,\n cleanedUp: false,\n resolveFinished,\n };\n };\n let monitor = createMonitor();\n this.clipMonitors.set(actionId, monitor);\n\n action.reset();\n action.time = startTime;\n action.play();\n this.resetClipMonitor(monitor, action.time);\n\n this.clipActions.set(clip.name, action);\n this.animationActions.set(clip.name, action);\n this.setPlaybackState(clip.name, playbackState);\n this.debugClipLog(`[Embody] playClip: Playing \"${clip.name}\" (rate: ${playbackState.playbackRate}, loop: ${playbackState.loop}, actionId: ${actionId})`);\n\n const handle: ClipHandle = {\n clipName: clip.name,\n actionId,\n\n play: () => {\n const source = this.dynamicClipSources.get(clip);\n if (source?.hasInheritedStart) {\n const listeners = new Set(monitor.listeners);\n const nextClip = this.rebuildDynamicClip(source);\n if (nextClip) {\n try { action.stop(); } catch {}\n try { mixer.uncacheAction(clip); } catch {}\n try { mixer.uncacheClip(clip); } catch {}\n this.cleanupClipMonitor(actionId, { resolveFinished: false });\n clip = nextClip;\n action = mixer.clipAction(clip);\n actionId = this.setActionId(action, clip.name);\n handle.actionId = actionId;\n const nextPlaybackState = this.playbackState.get(clip.name) ?? playbackState;\n this.applyPlaybackState(action, nextPlaybackState);\n monitor = createMonitor(listeners, nextPlaybackState);\n this.clipMonitors.set(actionId, monitor);\n this.clipActions.set(clip.name, action);\n this.animationActions.set(clip.name, action);\n }\n }\n action.reset();\n action.time = this.resolveStartTime(\n clip.duration,\n this.getPlaybackStateSnapshot(clip.name, {\n loop: false,\n source: this.clipSources.get(clip.name) ?? playbackState.source,\n })\n );\n action.play();\n this.resetClipMonitor(monitor, action.time);\n },\n\n stop: () => {\n action.stop();\n // Fully remove action from mixer to prevent accumulation and weight blending issues\n try { mixer.uncacheAction(clip); } catch {}\n try { mixer.uncacheClip(clip); } catch {}\n this.clipActions.delete(clip.name);\n this.animationActions.delete(clip.name);\n this.animationFinishedCallbacks.delete(clip.name);\n this.playbackState.delete(clip.name);\n this.rendererClipHandles.delete(clip.name);\n this.cleanupClipMonitor(actionId);\n },\n\n pause: () => {\n action.paused = true;\n },\n\n resume: () => {\n action.paused = false;\n },\n\n setWeight: (w: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.weight = typeof w === 'number' && Number.isFinite(w) ? Math.max(0, w) : 1.0;\n action.setEffectiveWeight(next.weight);\n this.setPlaybackState(clip.name, next);\n },\n\n setPlaybackRate: (r: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.playbackRate = Number.isFinite(r) ? Math.max(0, Math.abs(r)) : 1.0;\n this.applyPlaybackState(action, next);\n monitor.direction = next.reverse ? -1 : 1;\n monitor.initialDirection = monitor.direction;\n this.setPlaybackState(clip.name, next);\n },\n\n setLoop: (mode: 'once' | 'repeat' | 'pingpong', repeatCount?: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.loopMode = mode;\n next.loop = mode !== 'once';\n next.repeatCount = repeatCount;\n this.applyPlaybackState(action, next);\n monitor.loopMode = mode;\n this.setPlaybackState(clip.name, next);\n },\n\n setTime: (t: number) => {\n const clamped = Math.max(0, Math.min(clip.duration, t));\n action.time = clamped;\n try { mixer.update(0); } catch {}\n this.syncClipMonitorTime(monitor, clamped, true);\n },\n\n getTime: () => action.time,\n\n getDuration: () => clip.duration,\n\n subscribe: (listener: ClipEventListener) => {\n monitor.listeners.add(listener);\n return () => {\n monitor.listeners.delete(listener);\n };\n },\n\n finished: finishedPromise,\n };\n this.clipHandles.set(clip.name, handle);\n this.rendererClipHandles.set(clip.name, handle);\n\n return handle;\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n return this.playClipDirect(clip, options);\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap } | TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n if ('channels' in snippet) {\n return this.playTypedSnippet(snippet, options);\n }\n if (this.cljsAnimationRuntime) {\n const handle = this.cljsAnimationRuntime.playSnippet(\n snippet.name,\n snippet.curves,\n { ...options, source: options?.source ?? 'snippet' }\n );\n if (!handle) return null;\n this.clipHandles.set(snippet.name, handle);\n return handle;\n }\n const clip = this.snippetToClip(snippet.name, snippet.curves, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'snippet' });\n }\n\n playTypedSnippet(\n snippet: TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n logTypedLipSyncDebug('[Embody Typed LipSync] playTypedSnippet', {\n name: snippet.name,\n channelCount: snippet.channels.length,\n channels: snippet.channels.map(summarizeTypedChannel),\n options: {\n source: options?.source,\n autoVisemeJaw: options?.autoVisemeJaw,\n jawScale: options?.jawScale,\n intensityScale: options?.intensityScale,\n },\n });\n const clip = this.typedSnippetToClip(snippet.name, snippet.channels, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'snippet' });\n }\n\n buildClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n if (this.cljsAnimationRuntime) {\n const handle = this.cljsAnimationRuntime.buildClip(\n clipName,\n curves,\n { ...options, source: options?.source ?? 'clip' }\n );\n if (!handle) return null;\n this.clipHandles.set(clipName, handle);\n return handle;\n }\n\n return this.buildClipDirect(clipName, curves, options);\n }\n\n private buildClipDirect(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n const clip = this.snippetToClip(clipName, curves, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'clip' });\n }\n\n buildTypedClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): ClipHandle | null {\n const clip = this.typedSnippetToClip(clipName, channels, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'clip' });\n }\n\n cleanupSnippet(name: string) {\n if (this.cljsAnimationRuntime) {\n this.cljsAnimationRuntime.cleanupSnippet(name);\n }\n this.cleanupSnippetDirect(name);\n }\n\n private cleanupSnippetDirect(name: string) {\n if (!this.host.getModel()) return;\n for (const [clipName, action] of Array.from(this.clipActions.entries())) {\n if (clipName === name || clipName.startsWith(`${name}_`)) {\n const actionId = this.getActionId(action);\n try {\n action.stop();\n // Fully remove action from mixer to prevent accumulation\n const clip = action.getClip();\n if (clip && this.clipAnimationMixer) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n } catch {}\n this.clipActions.delete(clipName);\n this.animationActions.delete(clipName);\n this.clipHandles.delete(clipName);\n this.rendererClipHandles.delete(clipName);\n this.animationFinishedCallbacks.delete(clipName);\n this.playbackState.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n }\n }\n\n updateClipParams(name: string, params: ClipParamsUpdate): boolean {\n if (this.cljsAnimationRuntime) {\n this.cljsAnimationRuntime.updateClipParams(name, params);\n }\n\n return this.updateClipParamsDirect(name, params);\n }\n\n private updateClipParamsDirect(name: string, params: ClipParamsUpdate): boolean {\n let updated = false;\n const matches = (clipName: string, action?: AnimationAction | null) => {\n if (params.actionId) {\n const aid = action ? this.actionIds.get(action) : this.actionIdToClip.get(params.actionId);\n if (aid && aid === params.actionId) return true;\n }\n return clipName === name || clipName.startsWith(`${name}_`) || clipName.includes(name);\n };\n\n const debugSnapshot = () => ({\n target: name,\n params,\n clipActions: Array.from(this.clipActions.entries()).map(([k, a]) => ({ name: k, actionId: this.getActionId(a) })),\n animationActions: Array.from(this.animationActions.entries()).map(([k, a]) => ({ name: k, actionId: this.getActionId(a) })),\n clipHandles: Array.from(this.clipHandles.entries()).map(([k, h]) => ({ name: k, actionId: h.actionId })),\n mixerActions: [\n ...(this.animationMixer?._actions || []),\n ...(this.clipAnimationMixer?._actions || []),\n ].map((a: AnimationAction) => ({ name: a?.getClip?.()?.name || '', actionId: this.getActionId(a) })),\n });\n\n this.debugClipLog('[Embody] updateClipParams start', debugSnapshot());\n\n const apply = (action: AnimationAction | null | undefined) => {\n if (!action) return;\n const actionId = this.getActionId(action);\n const monitor = actionId ? this.clipMonitors.get(actionId) : undefined;\n const clipName = action.getClip().name;\n const next = this.playbackState.get(clipName)\n ?? this.normalizePlaybackOptions(undefined, { loop: false, source: this.clipSources.get(clipName) ?? 'clip' });\n try { action.paused = false; } catch {}\n if (typeof params.weight === 'number' && Number.isFinite(params.weight)) {\n action.setEffectiveWeight(params.weight);\n next.weight = Math.max(0, params.weight);\n updated = true;\n }\n if (typeof params.rate === 'number' && Number.isFinite(params.rate)) {\n next.playbackRate = Math.max(0, Math.abs(params.rate));\n if (typeof params.reverse === 'boolean') {\n next.reverse = params.reverse;\n }\n const signedRate = next.reverse ? -next.playbackRate : next.playbackRate;\n action.setEffectiveTimeScale(signedRate);\n if (monitor) {\n monitor.direction = next.reverse ? -1 : 1;\n monitor.initialDirection = monitor.direction;\n }\n updated = true;\n }\n if (typeof params.loop === 'boolean' || params.loopMode || params.repeatCount !== undefined) {\n next.loopMode = params.loopMode || (params.loop ? 'repeat' : 'once');\n next.loop = next.loopMode !== 'once';\n next.repeatCount = params.repeatCount;\n this.applyPlaybackState(action, next);\n if (monitor) monitor.loopMode = next.loopMode;\n updated = true;\n }\n this.setPlaybackState(clipName, next);\n };\n\n for (const [clipName, action] of this.clipActions.entries()) {\n if (matches(clipName, action)) {\n apply(action);\n }\n }\n for (const [clipName, action] of this.animationActions.entries()) {\n if (matches(clipName, action)) {\n apply(action);\n }\n }\n\n if (!updated && params.actionId) {\n const clipName = this.actionIdToClip.get(params.actionId);\n if (clipName) {\n const action = this.clipActions.get(clipName) || this.animationActions.get(clipName);\n if (action) apply(action);\n }\n }\n\n this.debugClipLog('[Embody] updateClipParams end', debugSnapshot());\n return updated;\n }\n\n private addMorphTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphKey: string,\n keyframes: ScalarKeyframe[],\n intensityScale: number,\n meshNames?: string[]\n ): void {\n const config = this.host.getConfig();\n const hasExplicitMeshes = meshNames !== undefined;\n const targetMeshNames = hasExplicitMeshes ? meshNames : (config.morphToMesh?.face || []);\n const targetMeshes = targetMeshNames.length\n ? targetMeshNames.map((name) => this.host.getMeshByName(name)).filter(Boolean) as Mesh[]\n : [];\n\n const addTrackForMesh = (mesh: Mesh) => {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl || dict[morphKey] === undefined) return;\n\n const morphIndex = dict[morphKey];\n const inheritedStartValue = keyframes[0]?.inherit ? infl[morphIndex] ?? 0 : undefined;\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(\n Math.max(\n 0,\n Math.min(\n 2,\n this.sampleFinalKeyframeValue(\n keyframes,\n kf.time,\n (intensity) => intensity * intensityScale,\n inheritedStartValue\n )\n )\n )\n );\n }\n\n const trackName = `${mesh.uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n }\n\n private addMorphIndexTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphIndex: number,\n keyframes: ScalarKeyframe[],\n intensityScale: number,\n meshNames?: string[]\n ): void {\n if (!Number.isInteger(morphIndex) || morphIndex < 0) return;\n const config = this.host.getConfig();\n const hasExplicitMeshes = meshNames !== undefined;\n const targetMeshNames = hasExplicitMeshes ? meshNames : (config.morphToMesh?.face || []);\n const targetMeshes = targetMeshNames.length\n ? targetMeshNames.map((name) => this.host.getMeshByName(name)).filter(Boolean) as Mesh[]\n : [];\n\n const addTrackForMesh = (mesh: Mesh) => {\n const infl = mesh.morphTargetInfluences;\n if (!infl || morphIndex < 0 || morphIndex >= infl.length) return;\n const inheritedStartValue = keyframes[0]?.inherit ? infl[morphIndex] ?? 0 : undefined;\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(\n Math.max(\n 0,\n Math.min(\n 2,\n this.sampleFinalKeyframeValue(\n keyframes,\n kf.time,\n (intensity) => intensity * intensityScale,\n inheritedStartValue\n )\n )\n )\n );\n }\n\n const trackName = `${mesh.uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n }\n\n private sampleFinalKeyframeValue(\n keyframes: ScalarKeyframe[],\n t: number,\n toFinalValue: (intensity: number) => number,\n inheritedStartValue?: number\n ): number {\n if (!keyframes.length) return 0;\n const firstValue = inheritedStartValue ?? toFinalValue(keyframes[0].intensity);\n if (t <= keyframes[0].time) return firstValue;\n if (t >= keyframes[keyframes.length - 1].time) {\n return toFinalValue(keyframes[keyframes.length - 1].intensity);\n }\n\n for (let i = 0; i < keyframes.length - 1; i += 1) {\n const a = keyframes[i];\n const b = keyframes[i + 1];\n if (t >= a.time && t <= b.time) {\n const dt = Math.max(1e-6, b.time - a.time);\n const p = (t - a.time) / dt;\n const aValue = i === 0 ? firstValue : toFinalValue(a.intensity);\n const bValue = toFinalValue(b.intensity);\n return aValue + (bValue - aValue) * p;\n }\n }\n\n return 0;\n }\n\n private ensureMixer(): AnimationMixer | null {\n const model = this.host.getModel();\n if (!model) return null;\n\n if (!this.animationMixer) {\n this.animationMixer = new AnimationMixer(model);\n }\n\n if (this.animationMixer && !this.mixerFinishedListenerAttached) {\n this.animationMixer.addEventListener('finished', (event: any) => this.handleMixerFinished(event));\n this.mixerFinishedListenerAttached = true;\n }\n\n return this.animationMixer;\n }\n\n private ensureClipMixer(): AnimationMixer | null {\n const model = this.host.getModel();\n if (!model) return null;\n\n if (!this.clipAnimationMixer) {\n this.clipAnimationMixer = new AnimationMixer(model);\n }\n\n if (this.clipAnimationMixer && !this.clipMixerFinishedListenerAttached) {\n this.clipAnimationMixer.addEventListener('finished', (event: any) => this.handleMixerFinished(event));\n this.clipMixerFinishedListenerAttached = true;\n }\n\n return this.clipAnimationMixer;\n }\n\n private handleMixerFinished(event: any): void {\n const action = event.action as AnimationAction;\n const actionId = this.getActionId(action);\n if (actionId) {\n const monitor = this.clipMonitors.get(actionId);\n if (monitor) {\n monitor.finishedPending = true;\n return;\n }\n }\n const clip = action.getClip();\n const bakedMixerClip = this.bakedMixerClipToSource.get(clip.name);\n if (bakedMixerClip) {\n const group = this.bakedActionGroups.get(bakedMixerClip.sourceClipName);\n if (group && group.pendingFinishedChannels.delete(bakedMixerClip.channel) && group.pendingFinishedChannels.size === 0) {\n group.resolveFinished();\n }\n return;\n }\n const callback = this.animationFinishedCallbacks.get(clip.name);\n if (callback) {\n callback();\n this.animationFinishedCallbacks.delete(clip.name);\n }\n }\n\n private createAnimationHandle(\n clipName: string,\n action: AnimationAction,\n finishedPromise: Promise<void>\n ): AnimationActionHandle {\n return {\n actionId: this.getActionId(action),\n stop: () => this.stopAnimation(clipName),\n pause: () => this.pauseAnimation(clipName),\n resume: () => this.resumeAnimation(clipName),\n setSpeed: (speed: number) => this.setAnimationSpeed(clipName, speed),\n setWeight: (weight: number) => this.setAnimationIntensity(clipName, weight),\n seekTo: (time: number) => this.seekAnimation(clipName, time),\n getState: () => this.getAnimationState(clipName)!,\n crossfadeTo: (targetClip: string, dur?: number) => this.crossfadeTo(targetClip, dur),\n finished: finishedPromise,\n };\n }\n\n private createBakedAnimationHandle(\n clipName: string,\n group: BakedActionGroup\n ): AnimationActionHandle {\n return {\n actionId: group.actionId,\n stop: () => this.stopAnimation(clipName),\n pause: () => this.pauseAnimation(clipName),\n resume: () => this.resumeAnimation(clipName),\n setSpeed: (speed: number) => this.setAnimationSpeed(clipName, speed),\n setWeight: (weight: number) => this.setAnimationIntensity(clipName, weight),\n seekTo: (time: number) => this.seekAnimation(clipName, time),\n getState: () => this.getAnimationState(clipName)!,\n crossfadeTo: (targetClip: string, dur?: number) => this.crossfadeTo(targetClip, dur),\n finished: group.finishedPromise,\n };\n }\n}\n\n/** @deprecated Use ThreeAnimationSystem. */\nexport { ThreeAnimationSystem as AnimationController };\n\n/** @deprecated Use ThreeAnimationSystem. */\nexport { ThreeAnimationSystem as BakedAnimationController };\n","import {\n Box3,\n Vector3,\n} from 'three';\nimport type { AnimationClip, KeyframeTrack, Mesh, Object3D } from 'three';\nimport type { HostModelInspector, ModelDescriptor, MeshId, MorphTargetId, BoneId, Transform } from '../../core/contracts';\nimport type { Profile } from '../../mappings/types';\nimport type { NodeBase, ResolvedBones } from './types';\n\nexport interface ThreeAnimationTrackDescriptor {\n readonly name: string;\n readonly targetName: string;\n readonly property: string;\n readonly type: 'position' | 'rotation' | 'scale' | 'morph' | 'unknown';\n readonly keyframeCount: number;\n readonly valueSize: number;\n readonly valueRange?: { readonly min: readonly number[]; readonly max: readonly number[] };\n}\n\nexport interface ThreeAnimationClipDescriptor {\n readonly name: string;\n readonly duration: number;\n readonly tracks: readonly ThreeAnimationTrackDescriptor[];\n readonly animatedBones: readonly string[];\n readonly animatedMorphs: readonly string[];\n}\n\nexport interface ThreeModelInspectionOptions {\n readonly meshes?: readonly Mesh[];\n readonly profile?: Profile;\n readonly previousBones?: ResolvedBones;\n readonly animations?: readonly AnimationClip[];\n}\n\nexport interface ThreeModelInspection {\n readonly descriptor: ModelDescriptor;\n readonly meshByName: Map<string, Mesh>;\n readonly allMeshes: Mesh[];\n readonly morphMeshes: Mesh[];\n readonly bones: ResolvedBones;\n readonly resolvedFaceMeshes: string[];\n readonly faceMesh: Mesh | null;\n readonly animations: ThreeAnimationClipDescriptor[];\n}\n\ntype MorphTargetEntry = { name: string; index: number };\n\nconst meshId = (value: number) => value as MeshId;\nconst morphTargetId = (value: number) => value as MorphTargetId;\nconst boneId = (value: number) => value as BoneId;\n\nexport class ThreeModelInspector implements HostModelInspector<Object3D> {\n describeModel(model: Object3D): ModelDescriptor {\n return this.inspectModel(model).descriptor;\n }\n\n inspectModel(model: Object3D, options: ThreeModelInspectionOptions = {}): ThreeModelInspection {\n const allMeshes = this.collectMeshes(model);\n const morphMeshes = this.mergeMorphMeshes(options.meshes || [], collectMorphMeshes(model));\n const meshByName = this.buildMeshByName(model);\n const bones = options.profile\n ? this.resolveBones(model, options.profile, options.previousBones)\n : {};\n const resolvedFaceMeshes = options.profile\n ? this.resolveFaceMeshes(morphMeshes, meshByName, bones, options.profile)\n : [];\n const faceMesh = resolvedFaceMeshes.length > 0\n ? meshByName.get(resolvedFaceMeshes[0]) || null\n : null;\n const animations = this.describeAnimations(options.animations || []);\n const descriptor = this.buildDescriptor(model, allMeshes, bones, animations);\n\n return {\n descriptor,\n meshByName,\n allMeshes,\n morphMeshes,\n bones,\n resolvedFaceMeshes,\n faceMesh,\n animations,\n };\n }\n\n collectMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n meshes.push(obj as Mesh);\n }\n });\n return meshes;\n }\n\n buildMeshByName(root: Object3D): Map<string, Mesh> {\n const meshByName = new Map<string, Mesh>();\n root.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n meshByName.set(obj.name, obj as Mesh);\n }\n });\n return meshByName;\n }\n\n resolveBones(root: Object3D, profile: Profile, previousBones: ResolvedBones = {}): ResolvedBones {\n const resolved: ResolvedBones = {};\n\n const snapshot = (obj: Object3D): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const snapshotPreservingBasePose = (obj: Object3D): NodeBase => {\n const existing = Object.values(previousBones).find((entry) => entry?.obj === obj);\n if (!existing) {\n return snapshot(obj);\n }\n\n return {\n obj,\n basePos: { ...existing.basePos },\n baseQuat: existing.baseQuat.clone(),\n baseEuler: { ...existing.baseEuler },\n };\n };\n\n const prefix = profile.bonePrefix || '';\n const suffix = profile.boneSuffix || '';\n const suffixRegex = profile.suffixPattern\n ? new RegExp(profile.suffixPattern)\n : null;\n\n const findNode = (baseName?: string | null): Object3D | undefined => {\n if (!baseName) return undefined;\n\n const directMatch = root.getObjectByName(baseName);\n if (directMatch) return directMatch;\n\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n const fullName = suffix && !prefixedBase.endsWith(suffix)\n ? `${prefixedBase}${suffix}`\n : prefixedBase;\n const exactMatch = root.getObjectByName(fullName);\n if (exactMatch) return exactMatch;\n\n if (suffixRegex) {\n let found: Object3D | undefined;\n root.traverse((obj: any) => {\n if (found) return;\n if (obj.name && obj.name.startsWith(fullName)) {\n const candidateSuffix = obj.name.slice(fullName.length);\n if (candidateSuffix === '' || suffixRegex.test(candidateSuffix)) {\n found = obj;\n }\n }\n });\n if (found) return found;\n }\n\n return undefined;\n };\n\n const addResolvedBone = (key: string, node: Object3D) => {\n const entry = snapshotPreservingBasePose(node);\n resolved[key] = entry;\n if (node.name) {\n resolved[node.name] = entry;\n }\n };\n\n for (const [key, nodeName] of Object.entries(profile.boneNodes || {})) {\n const node = findNode(nodeName);\n if (node) {\n addResolvedBone(key, node);\n if (nodeName) {\n resolved[nodeName] = resolved[key]!;\n }\n }\n }\n\n if (!resolved.EYE_L && profile.eyeMeshNodes) {\n const node = findNode(profile.eyeMeshNodes.LEFT);\n if (node) {\n addResolvedBone('EYE_L', node);\n }\n }\n if (!resolved.EYE_R && profile.eyeMeshNodes) {\n const node = findNode(profile.eyeMeshNodes.RIGHT);\n if (node) {\n addResolvedBone('EYE_R', node);\n }\n }\n\n const referencedNodes = new Set<string>();\n Object.values(profile.auToBones ?? {}).forEach((bindings) => {\n bindings.forEach((binding) => referencedNodes.add(binding.node));\n });\n profile.compositeRotations?.forEach((composite) => referencedNodes.add(composite.node));\n Object.values(profile.continuumPairs ?? {}).forEach((pair) => {\n if (pair?.node) referencedNodes.add(pair.node);\n });\n profile.annotationRegions?.forEach((region) => {\n region.bones?.forEach((boneName) => referencedNodes.add(boneName));\n });\n\n referencedNodes.forEach((nodeKey) => {\n if (resolved[nodeKey]) return;\n const configuredName = profile.boneNodes?.[nodeKey] ?? nodeKey;\n const node = findNode(configuredName);\n if (node) {\n addResolvedBone(nodeKey, node);\n if (configuredName) {\n resolved[configuredName] = resolved[nodeKey]!;\n }\n }\n });\n\n return resolved;\n }\n\n resolveFaceMeshes(\n meshes: readonly Mesh[],\n meshByName: ReadonlyMap<string, Mesh>,\n bones: ResolvedBones,\n profile: Profile\n ): string[] {\n const faceMeshNames = profile.morphToMesh?.face || [];\n const availableMorphMeshes = meshes.filter((m) => hasMorphTargets(m));\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n return [defaultFace.name];\n }\n\n const candidateByMorph = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n if (candidateByMorph) {\n return [candidateByMorph.name];\n }\n\n const headNodeKey = profile.auToBones?.[51]?.[0]?.node\n ?? profile.auToBones?.[52]?.[0]?.node\n ?? profile.compositeRotations?.find((composite) => (\n composite.yaw?.aus.includes(51)\n || composite.yaw?.aus.includes(52)\n || composite.pitch?.aus.includes(53)\n || composite.pitch?.aus.includes(54)\n || composite.roll?.aus.includes(55)\n || composite.roll?.aus.includes(56)\n ))?.node\n ?? 'HEAD';\n const head = bones[headNodeKey]?.obj ?? bones.HEAD?.obj;\n if (head && availableMorphMeshes.length > 0) {\n const headPos = new Vector3();\n (head as any).getWorldPosition?.(headPos);\n const headCandidates = availableMorphMeshes.map((mesh) => {\n const box = new Box3().setFromObject(mesh as any);\n const center = new Vector3();\n box.getCenter(center);\n const distance = box.containsPoint(headPos) ? 0 : center.distanceTo(headPos);\n const morphCount = mesh.morphTargetDictionary\n ? Object.keys(mesh.morphTargetDictionary).length\n : 0;\n const name = mesh.name.toLowerCase();\n const penalty = /eye|occlusion|tear|teeth|tongue|hair|lash/.test(name) ? 10 : 0;\n return { name: mesh.name, distance, morphCount, penalty };\n });\n\n headCandidates.sort((a, b) => {\n if (a.distance !== b.distance) return a.distance - b.distance;\n if (a.penalty !== b.penalty) return a.penalty - b.penalty;\n return b.morphCount - a.morphCount;\n });\n\n const best = headCandidates[0];\n const extras = headCandidates\n .filter((entry) => /brow|eyebrow/.test(entry.name.toLowerCase()))\n .map((entry) => entry.name);\n\n return [best.name, ...extras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n if (availableMorphMeshes.length > 0) {\n const best = availableMorphMeshes.reduce((prev, current) => {\n const prevCount = prev.morphTargetDictionary ? Object.keys(prev.morphTargetDictionary).length : 0;\n const currCount = current.morphTargetDictionary ? Object.keys(current.morphTargetDictionary).length : 0;\n return currCount > prevCount ? current : prev;\n });\n const browExtras = availableMorphMeshes\n .filter((m) => {\n const dict = m.morphTargetDictionary || {};\n const morphKeys = Object.keys(dict);\n return /brow|eyebrow/i.test(m.name) || morphKeys.some((k) => /brow/i.test(k));\n })\n .map((m) => m.name);\n return [best.name, ...browExtras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n return faceMeshNames.filter((name) => meshByName.has(name));\n }\n\n describeAnimations(animations: readonly AnimationClip[]): ThreeAnimationClipDescriptor[] {\n return animations.map((clip) => {\n const tracks = clip.tracks.map((track) => this.describeTrack(track));\n const animatedBones = new Set<string>();\n const animatedMorphs = new Set<string>();\n\n for (const track of tracks) {\n if (track.type === 'rotation' || track.type === 'position') {\n animatedBones.add(track.targetName);\n } else if (track.type === 'morph') {\n animatedMorphs.add(track.name);\n }\n }\n\n return {\n name: clip.name,\n duration: clip.duration,\n tracks,\n animatedBones: Array.from(animatedBones),\n animatedMorphs: Array.from(animatedMorphs),\n };\n });\n }\n\n private mergeMorphMeshes(inputMeshes: readonly Mesh[], collectedMeshes: readonly Mesh[]): Mesh[] {\n const meshByKey = new Map<string, Mesh>();\n const addMesh = (mesh: Mesh) => {\n const key = mesh.name || (mesh as any).uuid;\n if (!meshByKey.has(key)) {\n meshByKey.set(key, mesh);\n }\n };\n\n inputMeshes.forEach(addMesh);\n collectedMeshes.forEach(addMesh);\n return Array.from(meshByKey.values());\n }\n\n private buildDescriptor(\n model: Object3D,\n meshes: readonly Mesh[],\n resolvedBones: ResolvedBones,\n animations: readonly ThreeAnimationClipDescriptor[]\n ): ModelDescriptor {\n const meshIds = new Map<Mesh, MeshId>();\n meshes.forEach((mesh, index) => meshIds.set(mesh, meshId(index + 1)));\n\n const boneObjects = this.collectDescriptorBoneObjects(model, resolvedBones);\n const boneIds = new Map<Object3D, BoneId>();\n boneObjects.forEach((bone, index) => boneIds.set(bone, boneId(index + 1)));\n\n const boneParentIds = new Map<Object3D, BoneId | undefined>();\n for (const bone of boneObjects) {\n boneParentIds.set(bone, this.findNearestDescriptorBoneId(bone.parent, boneIds));\n }\n\n const boneChildIds = new Map<Object3D, BoneId[]>();\n for (const bone of boneObjects) {\n boneChildIds.set(bone, []);\n }\n for (const bone of boneObjects) {\n const parentId = boneParentIds.get(bone);\n if (parentId === undefined) continue;\n const parent = boneObjects.find((candidate) => boneIds.get(candidate) === parentId);\n if (parent) {\n boneChildIds.get(parent)?.push(boneIds.get(bone)!);\n }\n }\n\n const morphTargets = [];\n const morphTargetIdsByMesh = new Map<Mesh, MorphTargetId[]>();\n let nextMorphTargetId = 1;\n for (const mesh of meshes) {\n const ids: MorphTargetId[] = [];\n for (const entry of getMorphTargetEntries(mesh)) {\n const id = morphTargetId(nextMorphTargetId++);\n ids.push(id);\n morphTargets.push({\n id,\n meshId: meshIds.get(mesh)!,\n name: entry.name,\n hostIndex: entry.index,\n });\n }\n morphTargetIdsByMesh.set(mesh, ids);\n }\n\n return {\n id: model.uuid,\n name: model.name || undefined,\n meshes: meshes.map((mesh) => ({\n id: meshIds.get(mesh)!,\n name: mesh.name,\n parentBoneId: this.findNearestDescriptorBoneId(mesh.parent, boneIds),\n morphTargetIds: morphTargetIdsByMesh.get(mesh) || [],\n visible: mesh.visible,\n })),\n morphTargets,\n bones: boneObjects.map((bone) => ({\n id: boneIds.get(bone)!,\n name: bone.name,\n parentId: boneParentIds.get(bone),\n childIds: boneChildIds.get(bone) || [],\n restTransform: objectTransform(bone),\n })),\n metadata: animations.length > 0 ? { animations } : undefined,\n };\n }\n\n private collectDescriptorBoneObjects(model: Object3D, resolvedBones: ResolvedBones): Object3D[] {\n const boneObjects: Object3D[] = [];\n const addBone = (obj: Object3D) => {\n if (!boneObjects.includes(obj)) {\n boneObjects.push(obj);\n }\n };\n\n model.traverse((obj: any) => {\n if (obj.isBone || obj.type === 'Bone') {\n addBone(obj as Object3D);\n }\n });\n\n for (const entry of Object.values(resolvedBones)) {\n if (entry?.obj) {\n addBone(entry.obj);\n }\n }\n\n return boneObjects;\n }\n\n private findNearestDescriptorBoneId(parent: Object3D | null, boneIds: ReadonlyMap<Object3D, BoneId>): BoneId | undefined {\n let current = parent;\n while (current) {\n const id = boneIds.get(current);\n if (id !== undefined) return id;\n current = current.parent;\n }\n return undefined;\n }\n\n private describeTrack(track: KeyframeTrack): ThreeAnimationTrackDescriptor {\n const parts = track.name.split('.');\n const targetName = parts[0];\n const property = parts.slice(1).join('.');\n const type = getTrackType(property);\n const valueSize = track.getValueSize();\n const valueRange = getValueRange(track.values, valueSize);\n\n return {\n name: track.name,\n targetName,\n property,\n type,\n keyframeCount: track.times.length,\n valueSize,\n valueRange,\n };\n }\n}\n\nexport function collectMorphMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n const dict = obj.morphTargetDictionary;\n const infl = obj.morphTargetInfluences;\n if ((dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0)) {\n meshes.push(obj as Mesh);\n }\n }\n });\n return meshes;\n}\n\nfunction hasMorphTargets(mesh: Mesh): boolean {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n return !!(dict && Object.keys(dict).length > 0) || !!(Array.isArray(infl) && infl.length > 0);\n}\n\nfunction getMorphTargetEntries(mesh: Mesh): MorphTargetEntry[] {\n const meshDictionary = mesh.morphTargetDictionary as Record<string, number> | undefined;\n const geometryDictionary = (mesh.geometry as any).morphTargetDictionary as Record<string, number> | undefined;\n const dictionary = meshDictionary || geometryDictionary;\n\n if (dictionary) {\n return Object.entries(dictionary)\n .map(([name, index]) => ({ name, index }))\n .sort((a, b) => a.index - b.index);\n }\n\n const influences = mesh.morphTargetInfluences;\n if (!influences || influences.length === 0) {\n return [];\n }\n\n return influences.map((_, index) => ({ name: `morph_${index}`, index }));\n}\n\nfunction objectTransform(obj: Object3D): Transform {\n return {\n position: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n rotation: { x: obj.quaternion.x, y: obj.quaternion.y, z: obj.quaternion.z, w: obj.quaternion.w },\n scale: { x: obj.scale.x, y: obj.scale.y, z: obj.scale.z },\n };\n}\n\nfunction getTrackType(property: string): ThreeAnimationTrackDescriptor['type'] {\n if (property.includes('position')) return 'position';\n if (property.includes('quaternion') || property.includes('rotation')) return 'rotation';\n if (property.includes('scale')) return 'scale';\n if (property.includes('morphTargetInfluences')) return 'morph';\n return 'unknown';\n}\n\nfunction getValueRange(values: KeyframeTrack['values'], valueSize: number): ThreeAnimationTrackDescriptor['valueRange'] {\n if (values.length === 0) return undefined;\n\n const min = Array(valueSize).fill(Infinity);\n const max = Array(valueSize).fill(-Infinity);\n\n for (let i = 0; i < values.length; i += valueSize) {\n for (let j = 0; j < valueSize; j += 1) {\n const value = values[i + j];\n if (value < min[j]) min[j] = value;\n if (value > max[j]) max[j] = value;\n }\n }\n\n return { min, max };\n}\n","import {\n AdditiveBlending,\n MultiplyBlending,\n NoBlending,\n NormalBlending,\n Quaternion,\n SubtractiveBlending,\n Vector3,\n} from 'three';\nimport type { Material, Mesh, Object3D } from 'three';\nimport type {\n BoneId,\n FrameDelta,\n HostFrameApplier,\n MeshId,\n MorphTargetId,\n Quat,\n Transform,\n Vec3,\n} from '../../core/contracts';\n\nexport interface ThreeMorphTargetBinding {\n readonly meshId: MeshId;\n readonly mesh: Mesh;\n readonly index: number;\n}\n\nexport interface ThreeFrameApplierBindings {\n readonly meshes?: ReadonlyMap<MeshId, Mesh>;\n readonly morphTargets?: ReadonlyMap<MorphTargetId, ThreeMorphTargetBinding>;\n readonly bones?: ReadonlyMap<BoneId, Object3D>;\n}\n\nexport interface ThreeMaterialConfig {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: keyof typeof THREE_BLENDING_MODES;\n}\n\nexport interface ThreeResolvedMaterialConfig {\n renderOrder: number;\n transparent: boolean;\n opacity: number;\n depthWrite: boolean;\n depthTest: boolean;\n blending: keyof typeof THREE_BLENDING_MODES;\n}\n\nexport interface ThreeMeshMaterialConfig {\n readonly material?: ThreeMaterialConfig;\n}\n\nexport const THREE_BLENDING_MODES = {\n Normal: NormalBlending,\n Additive: AdditiveBlending,\n Subtractive: SubtractiveBlending,\n Multiply: MultiplyBlending,\n None: NoBlending,\n} as const;\n\nexport class ThreeFrameApplier implements HostFrameApplier<Object3D> {\n private meshes = new Map<MeshId, Mesh>();\n private morphTargets = new Map<MorphTargetId, ThreeMorphTargetBinding>();\n private bones = new Map<BoneId, Object3D>();\n private originalEmissive = new Map<string, { color: number; intensity: number }>();\n\n constructor(bindings: ThreeFrameApplierBindings = {}) {\n this.setBindings(bindings);\n }\n\n setBindings(bindings: ThreeFrameApplierBindings): void {\n this.meshes = new Map(bindings.meshes || []);\n this.morphTargets = new Map(bindings.morphTargets || []);\n this.bones = new Map(bindings.bones || []);\n }\n\n applyFrameDelta(model: Object3D, frame: FrameDelta): void {\n for (const write of frame.morphTargets || []) {\n const binding = this.morphTargets.get(write.morphTargetId);\n if (!binding) continue;\n this.setMorphTarget(binding, write.value, write.mode);\n }\n\n let wroteTransforms = false;\n for (const write of frame.bones || []) {\n const bone = this.bones.get(write.boneId);\n if (!bone) continue;\n this.applyTransform(bone, write.transform, write.mode);\n wroteTransforms = true;\n }\n\n for (const write of frame.meshes || []) {\n const mesh = this.meshes.get(write.meshId);\n if (!mesh) continue;\n if (typeof write.visible === 'boolean') {\n mesh.visible = write.visible;\n }\n }\n\n // Morph-only frames don't affect matrices; skip the full-tree update.\n if (wroteTransforms) {\n model.updateMatrixWorld(true);\n }\n }\n\n applyPackedMorphFrameDelta(values: ArrayLike<number>, stride = 4): void {\n for (let index = 0; index + stride <= values.length; index += stride) {\n const morphTargetId = values[index + 1] as MorphTargetId;\n const binding = this.morphTargets.get(morphTargetId);\n if (!binding) continue;\n const mode = (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute';\n this.setMorphTarget(binding, values[index + 2] ?? 0, mode);\n }\n }\n\n /** Rows: `[boneId, px, py, pz, qx, qy, qz, qw, flags]`; flags bit0=position, bit1=rotation. */\n applyPackedBoneFrameDelta(values: ArrayLike<number>, stride = 9): void {\n for (let index = 0; index + stride <= values.length; index += stride) {\n const bone = this.bones.get(values[index] as BoneId);\n if (!bone) continue;\n const flags = values[index + 8] ?? 0;\n if (flags & 1) {\n bone.position.set(values[index + 1], values[index + 2], values[index + 3]);\n }\n if (flags & 2) {\n bone.quaternion\n .set(values[index + 4], values[index + 5], values[index + 6], values[index + 7])\n .normalize();\n }\n bone.updateMatrixWorld(false);\n }\n }\n\n applyObjectTransform(\n target: Object3D,\n transform: Transform,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n this.applyTransform(target, transform, mode);\n }\n\n applyMorphTargets(targets: readonly { infl: number[]; idx: number }[], value: number): void {\n for (const target of targets) {\n if (target.idx >= 0 && target.idx < target.infl.length) {\n target.infl[target.idx] = value;\n }\n }\n }\n\n resetMorphTargets(targets: readonly { infl: number[]; idx: number }[]): void {\n this.applyMorphTargets(targets, 0);\n }\n\n setMeshVisible(root: Object3D, meshName: string, visible: boolean): void {\n this.visitNamedMesh(root, meshName, (mesh) => {\n mesh.visible = visible;\n });\n }\n\n highlightMesh(root: Object3D, meshName: string | null, color = 0x00ffff, intensity = 0.5): void {\n root.traverse((obj: any) => {\n if (!obj.isMesh) return;\n\n for (const material of getMaterials(obj.material)) {\n if (!hasEmissive(material)) continue;\n\n if (meshName === null || obj.name !== meshName) {\n const original = this.originalEmissive.get(obj.name);\n if (original) {\n material.emissive.setHex(original.color);\n material.emissiveIntensity = original.intensity;\n }\n continue;\n }\n\n if (!this.originalEmissive.has(obj.name)) {\n this.originalEmissive.set(obj.name, {\n color: material.emissive.getHex(),\n intensity: material.emissiveIntensity || 0,\n });\n }\n material.emissive.setHex(color);\n material.emissiveIntensity = intensity;\n }\n });\n }\n\n getMeshMaterialConfig(root: Object3D, meshName: string): ThreeResolvedMaterialConfig | null {\n let result: ThreeResolvedMaterialConfig | null = null;\n this.visitNamedMesh(root, meshName, (mesh) => {\n const material = getMaterials((mesh as any).material)[0];\n if (!material) return;\n result = {\n renderOrder: mesh.renderOrder,\n transparent: material.transparent,\n opacity: material.opacity,\n depthWrite: material.depthWrite,\n depthTest: material.depthTest,\n blending: getBlendingName(material.blending),\n };\n });\n return result;\n }\n\n setMeshMaterialConfig(root: Object3D, meshName: string, config: ThreeMaterialConfig): void {\n this.visitNamedMesh(root, meshName, (mesh) => {\n this.applyMeshMaterialConfig(mesh, config);\n });\n }\n\n applyMeshMaterialConfigs(\n root: Object3D,\n configs: Readonly<Record<string, ThreeMeshMaterialConfig>>\n ): void {\n root.traverse((obj: any) => {\n if (!obj.isMesh || !obj.name) return;\n const config = configs[obj.name]?.material;\n if (config) {\n this.applyMeshMaterialConfig(obj as Mesh, config);\n }\n });\n }\n\n private applyMeshMaterialConfig(mesh: Mesh, config: ThreeMaterialConfig): void {\n if (typeof config.renderOrder === 'number') {\n mesh.renderOrder = config.renderOrder;\n }\n\n for (const material of getMaterials((mesh as any).material)) {\n if (typeof config.opacity === 'number') {\n material.opacity = config.opacity;\n if (config.opacity < 1 && config.transparent === undefined) {\n material.transparent = true;\n }\n }\n if (typeof config.transparent === 'boolean') {\n material.transparent = config.transparent;\n }\n if (typeof config.depthWrite === 'boolean') {\n material.depthWrite = config.depthWrite;\n }\n if (typeof config.depthTest === 'boolean') {\n material.depthTest = config.depthTest;\n }\n if (config.blending && config.blending in THREE_BLENDING_MODES) {\n material.blending = THREE_BLENDING_MODES[config.blending];\n }\n material.needsUpdate = true;\n }\n }\n\n private setMorphTarget(\n binding: ThreeMorphTargetBinding,\n value: number,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n const influences = binding.mesh.morphTargetInfluences;\n if (!influences || binding.index < 0 || binding.index >= influences.length) {\n return;\n }\n influences[binding.index] = mode === 'additive'\n ? (influences[binding.index] ?? 0) + value\n : value;\n }\n\n private applyTransform(\n target: Object3D,\n transform: Transform,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n if (transform.position) {\n applyVec3(target.position, transform.position, mode);\n }\n if (transform.rotation) {\n applyQuat(target.quaternion, transform.rotation, mode);\n }\n if (transform.scale) {\n applyVec3(target.scale, transform.scale, mode);\n }\n target.updateMatrixWorld(false);\n }\n\n private visitNamedMesh(root: Object3D, meshName: string, visit: (mesh: Mesh) => void): void {\n root.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n visit(obj as Mesh);\n }\n });\n }\n}\n\nfunction applyVec3(target: Vector3, value: Vec3, mode: 'absolute' | 'additive'): void {\n if (mode === 'additive') {\n target.x += value.x;\n target.y += value.y;\n target.z += value.z;\n return;\n }\n target.set(value.x, value.y, value.z);\n}\n\nfunction applyQuat(target: Quaternion, value: Quat, mode: 'absolute' | 'additive'): void {\n const next = new Quaternion(value.x, value.y, value.z, value.w).normalize();\n if (mode === 'additive') {\n target.multiply(next);\n return;\n }\n target.copy(next);\n}\n\nfunction getMaterials(material: Material | Material[] | undefined): Material[] {\n if (!material) return [];\n return Array.isArray(material) ? material : [material];\n}\n\nfunction hasEmissive(material: Material): material is Material & {\n emissive: { getHex(): number; setHex(color: number): void };\n emissiveIntensity: number;\n} {\n return 'emissive' in material;\n}\n\nfunction getBlendingName(value: number): keyof typeof THREE_BLENDING_MODES {\n for (const [name, blending] of Object.entries(THREE_BLENDING_MODES)) {\n if (blending === value) {\n return name as keyof typeof THREE_BLENDING_MODES;\n }\n }\n return 'Normal';\n}\n","import type { NumericArray } from './primitives';\n\nexport const EMBODY_CORE_ABI_VERSION = 1;\n\nexport const PACKED_MORPH_FRAME_DELTA_STRIDE = 4;\nexport const PACKED_MORPH_FRAME_DELTA_FIELDS = [\n 'meshId',\n 'morphTargetId',\n 'value',\n 'mode',\n] as const;\n\nexport const PACKED_BONE_FRAME_DELTA_STRIDE = 9;\nexport const PACKED_BONE_FRAME_DELTA_FIELDS = [\n 'boneId',\n 'positionX',\n 'positionY',\n 'positionZ',\n 'rotationX',\n 'rotationY',\n 'rotationZ',\n 'rotationW',\n 'flags',\n] as const;\n\n/** Packed bone FrameDelta flags: bit 0 = has position, bit 1 = has rotation. */\nexport const PACKED_BONE_FLAG_HAS_POSITION = 1;\nexport const PACKED_BONE_FLAG_HAS_ROTATION = 2;\n\nexport const HAIR_CONFIG_STRIDE = 11;\nexport const HAIR_STATE_STRIDE = 4;\nexport const HAIR_HEAD_STATE_STRIDE = 5;\nexport const HAIR_MORPH_OUTPUT_STRIDE = 6;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;\nexport const MESH_PROPORTIONS_STRIDE = 16;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;\nexport const ANNOTATION_CAMERA_FRAMING_STRIDE = 7;\nexport const CAMERA_FLIGHT_SAMPLE_STRIDE = 7;\nexport const MARKER_VISIBILITY_FACTORS_STRIDE = 3;\nexport const MARKER_ENDPOINT_STRIDE = 3;\n\nexport const HAIR_CONFIG_FIELDS = [\n 'mass',\n 'stiffness',\n 'damping',\n 'gravity',\n 'headInfluence',\n 'windEnabled',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n] as const;\n\nexport const HAIR_STATE_FIELDS = ['x', 'z', 'vx', 'vz'] as const;\nexport const HAIR_HEAD_STATE_FIELDS = ['yaw', 'pitch', 'roll', 'yawVelocity', 'pitchVelocity'] as const;\nexport const HAIR_MORPH_OUTPUT_FIELDS = [\n 'L_Hair_Left',\n 'L_Hair_Right',\n 'L_Hair_Front',\n 'R_Hair_Left',\n 'R_Hair_Right',\n 'R_Hair_Front',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n] as const;\nexport const MESH_PROPORTIONS_FIELDS = [\n 'minX',\n 'minY',\n 'minZ',\n 'maxX',\n 'maxY',\n 'maxZ',\n 'centerX',\n 'centerY',\n 'centerZ',\n 'spanX',\n 'spanY',\n 'spanZ',\n 'verticalHeight',\n 'crossAxisWideSpan',\n 'crossAxisNarrowSpan',\n 'humanoidLikelihood',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n 'confidence',\n 'meshHeight',\n 'templateHeight',\n 'meshCrossAxisWideSpan',\n 'templateCrossAxisWideSpan',\n 'status',\n] as const;\nexport const ANNOTATION_CAMERA_FRAMING_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'distance',\n] as const;\nexport const CAMERA_FLIGHT_SAMPLE_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'done',\n] as const;\nexport const MARKER_VISIBILITY_FACTORS_FIELDS = [\n 'itemOpacityFactor',\n 'labelScaleFactor',\n 'lineOpacityFactor',\n] as const;\nexport const MARKER_ENDPOINT_FIELDS = ['x', 'y', 'z'] as const;\n\nexport type PackedMorphFrameDeltaField = (typeof PACKED_MORPH_FRAME_DELTA_FIELDS)[number];\nexport type HairConfigField = (typeof HAIR_CONFIG_FIELDS)[number];\nexport type HairStateField = (typeof HAIR_STATE_FIELDS)[number];\nexport type HairHeadStateField = (typeof HAIR_HEAD_STATE_FIELDS)[number];\nexport type HairMorphOutputField = (typeof HAIR_MORPH_OUTPUT_FIELDS)[number];\nexport type TemplateSkeletonFitTransformField = (typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS)[number];\nexport type MeshProportionsField = (typeof MESH_PROPORTIONS_FIELDS)[number];\nexport type TemplateSkeletonFitSolutionField = (typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS)[number];\n\nexport interface PackedMorphFrameDelta {\n readonly abiVersion: typeof EMBODY_CORE_ABI_VERSION;\n readonly stride: typeof PACKED_MORPH_FRAME_DELTA_STRIDE;\n readonly fields: typeof PACKED_MORPH_FRAME_DELTA_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairPhysicsState {\n readonly stride: typeof HAIR_STATE_STRIDE;\n readonly fields: typeof HAIR_STATE_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairMorphOutput {\n readonly stride: typeof HAIR_MORPH_OUTPUT_STRIDE;\n readonly fields: typeof HAIR_MORPH_OUTPUT_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitTransform {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedMeshProportions {\n readonly stride: typeof MESH_PROPORTIONS_STRIDE;\n readonly fields: typeof MESH_PROPORTIONS_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitSolution {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;\n readonly values: NumericArray;\n}\n","import type {\n BoneFrameDelta,\n BoneId,\n FrameDelta,\n MeshId,\n ModelDescriptor,\n MorphTargetFrameDelta,\n MorphTargetId,\n} from './contracts';\nimport {\n PACKED_BONE_FLAG_HAS_POSITION,\n PACKED_BONE_FLAG_HAS_ROTATION,\n PACKED_BONE_FRAME_DELTA_STRIDE,\n PACKED_MORPH_FRAME_DELTA_STRIDE,\n} from './contracts';\nimport type { Profile } from '../mappings/types';\nimport type { EmbodyCoreWasmModule, WasmRuntimeCoreHandle } from '../wasmTypes';\n\nexport interface WasmRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n readonly wasm: EmbodyCoreWasmModule;\n readonly allowEmptyBindings?: boolean;\n}\n\n/**\n * TypeScript facade over the host-neutral Rust Wasm RuntimeCore.\n * JavaScript only owns JSON handoff and packed FrameDelta unpacking here.\n */\nexport class WasmRuntimeCore {\n private readonly wasm: EmbodyCoreWasmModule;\n private readonly core: WasmRuntimeCoreHandle;\n private readonly allowEmptyBindings: boolean;\n private profile: Profile;\n private model: ModelDescriptor;\n\n constructor(options: WasmRuntimeCoreOptions) {\n this.wasm = options.wasm;\n this.profile = options.profile;\n this.model = options.model;\n this.allowEmptyBindings = options.allowEmptyBindings ?? false;\n const RuntimeCtor = options.wasm.RuntimeCore;\n if (!RuntimeCtor) {\n throw new Error('Embody Wasm module does not export RuntimeCore');\n }\n this.core = new RuntimeCtor(0);\n this.reloadBindings();\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.reloadBindings();\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n this.reloadBindings();\n }\n\n setAU(id: number, value: number, balance = 0): void {\n this.core.set_au(id >>> 0, value, balance);\n }\n\n setContinuum(negativeAU: number, positiveAU: number, value: number, balance = 0): void {\n this.core.set_continuum(negativeAU >>> 0, positiveAU >>> 0, value, balance);\n }\n\n transitionAU(id: number, to: number, durationMs: number, balance = Number.NaN): void {\n this.core.transition_au(id >>> 0, to, durationMs, balance);\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs: number, jawScale = 1): void {\n this.core.transition_viseme(visemeIndex >>> 0, to, durationMs, jawScale);\n }\n\n update(deltaSeconds: number): number {\n return this.core.update(deltaSeconds);\n }\n\n activeTransitionCount(): number {\n return this.core.active_transition_count();\n }\n\n clearTransitions(): void {\n this.core.clear_transitions();\n }\n\n getAU(id: number): number {\n return this.core.get_au(id >>> 0);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.core.set_au_mix_weight(id >>> 0, weight);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale?: number): void {\n this.core.set_viseme(visemeIndex >>> 0, value);\n if (jawScale !== undefined) {\n this.core.set_viseme_jaw_scale(visemeIndex >>> 0, jawScale);\n }\n }\n\n clear(): void {\n this.core.clear();\n }\n\n evaluatePackedMorphFrameDelta(): Float32Array {\n return this.core.evaluate_morph_frame_delta();\n }\n\n evaluatePackedBoneFrameDelta(): Float32Array {\n return this.core.evaluate_bone_frame_delta();\n }\n\n evaluateMorphFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n };\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n bones: unpackBoneFrameDelta(this.evaluatePackedBoneFrameDelta()),\n };\n }\n\n private reloadBindings(): void {\n const profileJson = JSON.stringify(this.profile);\n const modelJson = JSON.stringify(this.model);\n if (this.allowEmptyBindings) {\n this.core.configure(profileJson, modelJson);\n } else {\n this.core.configure_with_profile(profileJson, modelJson);\n }\n }\n}\n\nexport function unpackBoneFrameDelta(values: ArrayLike<number>): BoneFrameDelta[] {\n const stride = PACKED_BONE_FRAME_DELTA_STRIDE;\n const writes: BoneFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n const flags = values[index + 8] ?? 0;\n const hasPosition = (flags & PACKED_BONE_FLAG_HAS_POSITION) !== 0;\n const hasRotation = (flags & PACKED_BONE_FLAG_HAS_ROTATION) !== 0;\n if (!hasPosition && !hasRotation) continue;\n writes.push({\n boneId: values[index] as BoneId,\n transform: {\n ...(hasPosition\n ? { position: { x: values[index + 1], y: values[index + 2], z: values[index + 3] } }\n : {}),\n ...(hasRotation\n ? {\n rotation: {\n x: values[index + 4],\n y: values[index + 5],\n z: values[index + 6],\n w: values[index + 7],\n },\n }\n : {}),\n },\n mode: 'absolute',\n space: 'local',\n });\n }\n return writes;\n}\n\nexport function unpackMorphFrameDelta(values: ArrayLike<number>): MorphTargetFrameDelta[] {\n const stride = PACKED_MORPH_FRAME_DELTA_STRIDE;\n const writes: MorphTargetFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n writes.push({\n meshId: values[index] as MeshId,\n morphTargetId: values[index + 1] as MorphTargetId,\n value: values[index + 2] ?? 0,\n mode: (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute',\n });\n }\n return writes;\n}\n","/**\n * Hair / eyebrow material appearance helpers.\n *\n * These are runtime material controls owned by Embody — not Polymer agencies.\n * Agencies govern character behavior; hair materials and physics stay here.\n */\n\nexport interface HairColorAppearance {\n name?: string;\n baseColor: string;\n emissive: string;\n emissiveIntensity: number;\n}\n\nexport interface HairAppearanceState {\n hairColor: Required<Pick<HairColorAppearance, 'baseColor' | 'emissive' | 'emissiveIntensity'>> & {\n name?: string;\n };\n eyebrowColor: Required<Pick<HairColorAppearance, 'baseColor' | 'emissive' | 'emissiveIntensity'>> & {\n name?: string;\n };\n showOutline: boolean;\n outlineColor: string;\n outlineOpacity: number;\n}\n\nexport const HAIR_COLOR_PRESETS: Record<string, Required<HairColorAppearance>> = {\n natural_black: {\n name: 'Natural Black',\n baseColor: '#1a1a1a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_brown: {\n name: 'Natural Brown',\n baseColor: '#4a3728',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_blonde: {\n name: 'Natural Blonde',\n baseColor: '#e6c78a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_red: {\n name: 'Natural Red',\n baseColor: '#8b3a3a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_gray: {\n name: 'Natural Gray',\n baseColor: '#9e9e9e',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_white: {\n name: 'Natural White',\n baseColor: '#f5f5f5',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n neon_blue: {\n name: 'Neon Blue',\n baseColor: '#00ffff',\n emissive: '#0000ff',\n emissiveIntensity: 0.8,\n },\n neon_pink: {\n name: 'Neon Pink',\n baseColor: '#ff00ff',\n emissive: '#ff1493',\n emissiveIntensity: 0.8,\n },\n neon_green: {\n name: 'Neon Green',\n baseColor: '#00ff00',\n emissive: '#00ff00',\n emissiveIntensity: 0.8,\n },\n electric_purple: {\n name: 'Electric Purple',\n baseColor: '#9d00ff',\n emissive: '#9d00ff',\n emissiveIntensity: 0.6,\n },\n fire_orange: {\n name: 'Fire Orange',\n baseColor: '#ff6600',\n emissive: '#ff3300',\n emissiveIntensity: 0.7,\n },\n};\n\nexport const DEFAULT_HAIR_COLOR_APPEARANCE: Required<HairColorAppearance> =\n HAIR_COLOR_PRESETS.natural_brown;\n\nexport function normalizeHairColorAppearance(\n value: HairColorAppearance | string | null | undefined,\n fallback: Required<HairColorAppearance> = DEFAULT_HAIR_COLOR_APPEARANCE,\n): Required<HairColorAppearance> {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.startsWith('#')) {\n return {\n name: fallback.name,\n baseColor: trimmed,\n emissive: fallback.emissive,\n emissiveIntensity: fallback.emissiveIntensity,\n };\n }\n const preset = HAIR_COLOR_PRESETS[trimmed];\n if (preset) return { ...preset };\n }\n\n if (value && typeof value === 'object') {\n return {\n name: typeof value.name === 'string' ? value.name : fallback.name,\n baseColor: typeof value.baseColor === 'string' ? value.baseColor : fallback.baseColor,\n emissive: typeof value.emissive === 'string' ? value.emissive : fallback.emissive,\n emissiveIntensity:\n typeof value.emissiveIntensity === 'number'\n ? value.emissiveIntensity\n : fallback.emissiveIntensity,\n };\n }\n\n return { ...fallback };\n}\n\nexport function colorToCssHex(color: { getHexString(): string } | undefined | null): string | null {\n if (!color || typeof color.getHexString !== 'function') return null;\n return `#${color.getHexString()}`;\n}\n","/**\n * CC4 Preset - Character Creator 4 AU Mappings\n *\n * Complete FACS Action Unit to morph target and bone mappings for CC4 rigs.\n * This includes all the composite rotations, continuum pairs, mesh classifications,\n * and AU metadata that we painstakingly worked through.\n */\n\nimport type { Profile, MeshCategory, BlendingMode, MeshMaterialSettings, MeshInfo, MorphCategory, MorphTargetsBySide, VisemeSlot, MappingEditorSection } from '../mappings/types';\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\n\n// ============================================================================\n// AU TO MORPHS - Maps AU IDs to morph target names\n// ============================================================================\n\nexport const AU_TO_MORPHS: Record<number, MorphTargetsBySide> = {\n 1: {\n left: ['Brow_Raise_Inner_L'],\n right: ['Brow_Raise_Inner_R'],\n center: [],\n },\n 2: {\n left: ['Brow_Raise_Outer_L'],\n right: ['Brow_Raise_Outer_R'],\n center: [],\n },\n 4: {\n left: ['Brow_Drop_L'],\n right: ['Brow_Drop_R'],\n center: [],\n },\n 5: {\n left: ['Eye_Wide_L'],\n right: ['Eye_Wide_R'],\n center: [],\n },\n 6: {\n left: ['Cheek_Raise_L'],\n right: ['Cheek_Raise_R'],\n center: [],\n },\n 7: {\n left: ['Eye_Squint_L'],\n right: ['Eye_Squint_R'],\n center: [],\n },\n 8: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: ['Mouth_Close'],\n },\n 9: {\n left: ['Nose_Sneer_L'],\n right: ['Nose_Sneer_R'],\n center: [],\n },\n 10: {\n left: ['Mouth_Up_Upper_L'],\n right: ['Mouth_Up_Upper_R'],\n center: [],\n },\n 11: {\n left: ['Mouth_Up_Upper_L'],\n right: ['Mouth_Up_Upper_R'],\n center: [],\n },\n 12: {\n left: ['Mouth_Smile_L'],\n right: ['Mouth_Smile_R'],\n center: [],\n },\n 13: {\n left: ['Mouth_Smile_L', 'Mouth_Up_Upper_L'],\n right: ['Mouth_Smile_R', 'Mouth_Up_Upper_R'],\n center: [],\n },\n 14: {\n left: ['Mouth_Dimple_L'],\n right: ['Mouth_Dimple_R'],\n center: [],\n },\n 15: {\n left: ['Mouth_Frown_L'],\n right: ['Mouth_Frown_R'],\n center: [],\n },\n 16: {\n left: ['Mouth_Down_Lower_L'],\n right: ['Mouth_Down_Lower_R'],\n center: [],\n },\n 17: {\n left: [],\n right: [],\n center: ['Mouth_Shrug_Lower'],\n },\n 18: {\n left: [],\n right: [],\n center: ['Mouth_Pucker'],\n },\n 19: {\n left: [],\n right: [],\n center: ['Tongue_Out'],\n },\n 20: {\n left: ['Mouth_Stretch_L'],\n right: ['Mouth_Stretch_R'],\n center: [],\n },\n 22: {\n left: [],\n right: [],\n center: ['Mouth_Funnel'],\n },\n 23: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: [],\n },\n 24: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: [],\n },\n 25: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 26: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 27: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 28: {\n left: [],\n right: [],\n center: ['Mouth_Roll_In_Upper', 'Mouth_Roll_In_Lower'],\n },\n 29: {\n left: [],\n right: [],\n center: ['Jaw_Forward'],\n },\n 30: {\n left: ['Jaw_L'],\n right: [],\n center: [],\n },\n 31: {\n left: [],\n right: [],\n center: [],\n },\n 32: {\n left: [],\n right: [],\n center: ['Mouth_Roll_In_Lower'],\n },\n 34: {\n left: ['Cheek_Puff_L'],\n right: ['Cheek_Puff_R'],\n center: [],\n },\n 35: {\n left: [],\n right: ['Jaw_R'],\n center: [],\n },\n 36: {\n left: ['Tongue_Bulge_L'],\n right: ['Tongue_Bulge_R'],\n center: [],\n },\n 37: {\n left: [],\n right: [],\n center: ['Tongue_Up'],\n },\n 38: {\n left: [],\n right: [],\n center: ['Tongue_Down'],\n },\n 39: {\n left: ['Tongue_L'],\n right: [],\n center: [],\n },\n 40: {\n left: [],\n right: ['Tongue_R'],\n center: [],\n },\n 41: {\n left: [],\n right: [],\n center: [],\n },\n 42: {\n left: [],\n right: [],\n center: [],\n },\n 43: {\n left: ['Eye_Blink_L'],\n right: ['Eye_Blink_R'],\n center: [],\n },\n 45: {\n left: ['Eye_Blink_L'],\n right: ['Eye_Blink_R'],\n center: [],\n },\n 51: {\n left: ['Head_Turn_L'],\n right: [],\n center: [],\n },\n 52: {\n left: [],\n right: ['Head_Turn_R'],\n center: [],\n },\n 53: {\n left: [],\n right: [],\n center: ['Head_Turn_Up'],\n },\n 54: {\n left: [],\n right: [],\n center: ['Head_Turn_Down'],\n },\n 55: {\n left: ['Head_Tilt_L'],\n right: [],\n center: [],\n },\n 56: {\n left: [],\n right: ['Head_Tilt_R'],\n center: [],\n },\n 61: {\n left: ['Eye_L_Look_L'],\n right: ['Eye_R_Look_L'],\n center: [],\n },\n 62: {\n left: ['Eye_L_Look_R'],\n right: ['Eye_R_Look_R'],\n center: [],\n },\n 63: {\n left: ['Eye_L_Look_Up'],\n right: ['Eye_R_Look_Up'],\n center: [],\n },\n 64: {\n left: ['Eye_L_Look_Down'],\n right: ['Eye_R_Look_Down'],\n center: [],\n },\n 65: {\n left: ['Eye_L_Look_L'],\n right: [],\n center: [],\n },\n 66: {\n left: [],\n right: ['Eye_L_Look_R'],\n center: [],\n },\n 67: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Up'],\n },\n 68: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Down'],\n },\n 69: {\n left: ['Eye_R_Look_L'],\n right: [],\n center: [],\n },\n 70: {\n left: [],\n right: ['Eye_R_Look_R'],\n center: [],\n },\n 71: {\n left: [],\n right: [],\n center: ['Eye_R_Look_Up'],\n },\n 72: {\n left: [],\n right: [],\n center: ['Eye_R_Look_Down'],\n },\n 73: {\n left: [],\n right: [],\n center: ['Tongue_Narrow'],\n },\n 74: {\n left: [],\n right: [],\n center: ['Tongue_Wide'],\n },\n 75: {\n left: [],\n right: [],\n center: ['Tongue_Roll'],\n },\n 76: {\n left: [],\n right: [],\n center: ['Tongue_Tip_Up'],\n },\n 77: {\n left: [],\n right: [],\n center: ['Tongue_Tip_Down'],\n },\n 80: {\n left: ['EO Bulge L'],\n right: ['EO Bulge R'],\n center: [],\n },\n 81: {\n left: ['EO Depth L'],\n right: ['EO Depth R'],\n center: [],\n },\n 82: {\n left: ['EO Inner Depth L'],\n right: ['EO Inner Depth R'],\n center: [],\n },\n 83: {\n left: ['EO Inner Height L'],\n right: ['EO Inner Height R'],\n center: [],\n },\n 84: {\n left: ['EO Inner Width L'],\n right: ['EO Inner Width R'],\n center: [],\n },\n 85: {\n left: ['EO Outer Depth L'],\n right: ['EO Outer Depth R'],\n center: [],\n },\n 86: {\n left: ['EO Outer Height L'],\n right: ['EO Outer Height R'],\n center: [],\n },\n 87: {\n left: ['EO Outer Width L'],\n right: ['EO Outer Width R'],\n center: [],\n },\n 88: {\n left: ['EO Upper Depth L'],\n right: ['EO Upper Depth R'],\n center: [],\n },\n 89: {\n left: ['EO Lower Depth L'],\n right: ['EO Lower Depth R'],\n center: [],\n },\n 90: {\n left: ['EO Center Upper Depth L'],\n right: ['EO Center Upper Depth R'],\n center: [],\n },\n 91: {\n left: ['EO Center Upper Height L'],\n right: ['EO Center Upper Height R'],\n center: [],\n },\n 92: {\n left: ['EO Center Lower Depth L'],\n right: ['EO Center Lower Depth R'],\n center: [],\n },\n 93: {\n left: ['EO Center Lower Height L'],\n right: ['EO Center Lower Height R'],\n center: [],\n },\n 94: {\n left: ['EO Inner Upper Depth L'],\n right: ['EO Inner Upper Depth R'],\n center: [],\n },\n 95: {\n left: ['EO Inner Upper Height L'],\n right: ['EO Inner Upper Height R'],\n center: [],\n },\n 96: {\n left: ['EO Inner Lower Depth L'],\n right: ['EO Inner Lower Depth R'],\n center: [],\n },\n 97: {\n left: ['EO Inner Lower Height L'],\n right: ['EO Inner Lower Height R'],\n center: [],\n },\n 98: {\n left: ['EO Outer Upper Depth L'],\n right: ['EO Outer Upper Depth R'],\n center: [],\n },\n 99: {\n left: ['EO Outer Upper Height L'],\n right: ['EO Outer Upper Height R'],\n center: [],\n },\n 100: {\n left: ['EO Outer Lower Depth L'],\n right: ['EO Outer Lower Depth R'],\n center: [],\n },\n 101: {\n left: ['EO Outer Lower Height L'],\n right: ['EO Outer Lower Height R'],\n center: [],\n },\n 102: {\n left: ['EO Duct Depth L'],\n right: ['EO Duct Depth R'],\n center: [],\n },\n};\n\n// ============================================================================\n// BONE NODE NAMES - CC4-specific skeleton hierarchy\n// ============================================================================\n\n/** Bone name prefix used by semantic CC4 profile metadata. */\nexport const CC4_BONE_PREFIX = 'CC_Base_';\n\n/**\n * Suffix pattern regex for fuzzy bone matching.\n * Matches numbered suffixes like _01, _038 (common in Sketchfab exports)\n * and .001, .002 (common in Blender exports).\n */\nexport const CC4_SUFFIX_PATTERN = '_\\\\d+$|\\\\.\\\\d+$';\n\n/** Actual CC4 skeleton node names used by the stock preset. */\nexport const CC4_BONES = {\n EYE_L: 'CC_Base_L_Eye',\n EYE_R: 'CC_Base_R_Eye',\n HEAD: 'CC_Base_Head',\n NECK: 'CC_Base_NeckTwist01',\n NECK_TWIST: 'CC_Base_NeckTwist02',\n JAW: 'CC_Base_JawRoot',\n TONGUE: 'CC_Base_Tongue01',\n SPINE_01: 'CC_Base_Spine01',\n SPINE_02: 'CC_Base_Spine02',\n CLAVICLE_L: 'CC_Base_L_Clavicle',\n CLAVICLE_R: 'CC_Base_R_Clavicle',\n HAND_L: 'CC_Base_L_Hand',\n HAND_R: 'CC_Base_R_Hand',\n FOOT_L: 'CC_Base_L_Foot',\n FOOT_R: 'CC_Base_R_Foot',\n TOEBASE_L: 'CC_Base_L_ToeBase',\n TOEBASE_R: 'CC_Base_R_ToeBase',\n} as const;\n\n/**\n * Semantic bone keys used by profile metadata and annotation regions. Runtime\n * AU/composite bindings may still use concrete CC4 node names directly.\n */\nexport const CC4_BONE_NODES = {\n EYE_L: 'L_Eye',\n EYE_R: 'R_Eye',\n HEAD: 'Head',\n NECK: 'NeckTwist01',\n NECK_TWIST: 'NeckTwist02',\n JAW: 'JawRoot',\n TONGUE: 'Tongue01',\n SPINE_01: 'Spine01',\n SPINE_02: 'Spine02',\n CLAVICLE_L: 'L_Clavicle',\n CLAVICLE_R: 'R_Clavicle',\n HAND_L: 'L_Hand',\n HAND_R: 'R_Hand',\n FOOT_L: 'L_Foot',\n FOOT_R: 'R_Foot',\n TOEBASE_L: 'L_ToeBase',\n TOEBASE_R: 'R_ToeBase',\n // Concrete-name aliases keep existing runtime callers compatible.\n [CC4_BONES.EYE_L]: CC4_BONES.EYE_L,\n [CC4_BONES.EYE_R]: CC4_BONES.EYE_R,\n [CC4_BONES.HEAD]: CC4_BONES.HEAD,\n [CC4_BONES.NECK]: CC4_BONES.NECK,\n [CC4_BONES.NECK_TWIST]: CC4_BONES.NECK_TWIST,\n [CC4_BONES.JAW]: CC4_BONES.JAW,\n [CC4_BONES.TONGUE]: CC4_BONES.TONGUE,\n [CC4_BONES.SPINE_01]: CC4_BONES.SPINE_01,\n [CC4_BONES.SPINE_02]: CC4_BONES.SPINE_02,\n [CC4_BONES.CLAVICLE_L]: CC4_BONES.CLAVICLE_L,\n [CC4_BONES.CLAVICLE_R]: CC4_BONES.CLAVICLE_R,\n [CC4_BONES.HAND_L]: CC4_BONES.HAND_L,\n [CC4_BONES.HAND_R]: CC4_BONES.HAND_R,\n [CC4_BONES.FOOT_L]: CC4_BONES.FOOT_L,\n [CC4_BONES.FOOT_R]: CC4_BONES.FOOT_R,\n [CC4_BONES.TOEBASE_L]: CC4_BONES.TOEBASE_L,\n [CC4_BONES.TOEBASE_R]: CC4_BONES.TOEBASE_R,\n} as const;\n\n// ============================================================================\n// AU TO BONES - Maps AU IDs to bone bindings (CC4 head/eye/jaw/tongue)\n// ============================================================================\n\nexport const BONE_AU_TO_BINDINGS: Record<number, BoneBinding[]> = {\n // Jaw open/close (jaw drop)\n 25: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 20 }],\n 26: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 30 }],\n 27: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 35 }],\n\n // Jaw lateral (left/right)\n 30: [{ node: CC4_BONES.JAW, channel: 'ry', scale: -1, maxDegrees: 15 }],\n 35: [{ node: CC4_BONES.JAW, channel: 'ry', scale: 1, maxDegrees: 15 }],\n\n // Head yaw (turn left/right)\n // AU 51 = Turn Left: positive ry rotation (scale: 1)\n // AU 52 = Turn Right: negative ry rotation (scale: -1)\n 51: [{ node: CC4_BONES.HEAD, channel: 'ry', scale: 1, maxDegrees: 60 }],\n 52: [{ node: CC4_BONES.HEAD, channel: 'ry', scale: -1, maxDegrees: 60 }],\n\n // Head pitch (up/down)\n // AU 53 = Head Up: negative rx rotation (scale: -1)\n // AU 54 = Head Down: positive rx rotation (scale: 1)\n 53: [{ node: CC4_BONES.HEAD, channel: 'rx', scale: -1, maxDegrees: 30 }],\n 54: [{ node: CC4_BONES.HEAD, channel: 'rx', scale: 1, maxDegrees: 30 }],\n\n // Head roll (tilt)\n 55: [{ node: CC4_BONES.HEAD, channel: 'rz', scale: -1, maxDegrees: 25 }],\n 56: [{ node: CC4_BONES.HEAD, channel: 'rz', scale: 1, maxDegrees: 25 }],\n\n // Eyes horizontal (left/right) - CC4 uses rz for yaw\n // AU 61 = Eyes Turn Left = character looks toward THEIR left = viewer's RIGHT\n // AU 62 = Eyes Turn Right = character looks toward THEIR right = viewer's LEFT\n // For CC4 rigs: positive rz = eyes rotate left (look right), negative rz = eyes rotate right (look left)\n 61: [\n { node: CC4_BONES.EYE_L, channel: 'rz', scale: 1, maxDegrees: 25, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rz', scale: 1, maxDegrees: 25, side: 'right' },\n ],\n 62: [\n { node: CC4_BONES.EYE_L, channel: 'rz', scale: -1, maxDegrees: 25, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rz', scale: -1, maxDegrees: 25, side: 'right' },\n ],\n\n // Eyes vertical (up/down) - rx\n // AU 63 = Eyes Up = character looks up\n // AU 64 = Eyes Down = character looks down\n // For CC4 rigs: negative rx = eyes rotate up, positive rx = eyes rotate down\n 63: [\n { node: CC4_BONES.EYE_L, channel: 'rx', scale: -1, maxDegrees: 20, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rx', scale: -1, maxDegrees: 20, side: 'right' },\n ],\n 64: [\n { node: CC4_BONES.EYE_L, channel: 'rx', scale: 1, maxDegrees: 20, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rx', scale: 1, maxDegrees: 20, side: 'right' },\n ],\n 65: [{ node: CC4_BONES.EYE_L, channel: 'rz', scale: 1, maxDegrees: 25, side: 'left' }],\n 66: [{ node: CC4_BONES.EYE_L, channel: 'rz', scale: -1, maxDegrees: 25, side: 'left' }],\n 67: [{ node: CC4_BONES.EYE_L, channel: 'rx', scale: -1, maxDegrees: 20, side: 'left' }],\n 68: [{ node: CC4_BONES.EYE_L, channel: 'rx', scale: 1, maxDegrees: 20, side: 'left' }],\n 69: [{ node: CC4_BONES.EYE_R, channel: 'rz', scale: 1, maxDegrees: 25, side: 'right' }],\n 70: [{ node: CC4_BONES.EYE_R, channel: 'rz', scale: -1, maxDegrees: 25, side: 'right' }],\n 71: [{ node: CC4_BONES.EYE_R, channel: 'rx', scale: -1, maxDegrees: 20, side: 'right' }],\n 72: [{ node: CC4_BONES.EYE_R, channel: 'rx', scale: 1, maxDegrees: 20, side: 'right' }],\n\n // Tongue controls (optional, for rigs that expose them)\n 37: [{ node: CC4_BONES.TONGUE, channel: 'rz', scale: 1, maxDegrees: 20 }],\n 38: [{ node: CC4_BONES.TONGUE, channel: 'rz', scale: -1, maxDegrees: 20 }],\n 39: [{ node: CC4_BONES.TONGUE, channel: 'ry', scale: -1, maxDegrees: 20 }],\n 40: [{ node: CC4_BONES.TONGUE, channel: 'ry', scale: 1, maxDegrees: 20 }],\n 41: [{ node: CC4_BONES.TONGUE, channel: 'rx', scale: -1, maxDegrees: 20 }],\n 42: [{ node: CC4_BONES.TONGUE, channel: 'rx', scale: 1, maxDegrees: 20 }],\n\n};\n\n// ============================================================================\n// LIP-SYNC SUPPORT CONTROL BINDINGS\n// ============================================================================\n\n/**\n * Lip-sync support controls are not FACS AUs. They are semantic controls emitted\n * by speech planning when the runtime needs articulation support that should not\n * activate a visible FACS morph. Control 103 opens the jaw bone for speech while\n * leaving AU 26's Jaw_Open morph untouched.\n *\n * This is kept as a separate preset object so the data model does not pretend\n * lip-sync support controls are ordinary AUs. `CC4_PROFILE_BONE_BINDINGS` folds\n * it into the legacy `Profile.auToBones` field until Embody has the canonical\n * control/binding model tracked in meekmachine/embody#30.\n */\nexport const LIP_SYNC_CONTROL_TO_BINDINGS: Record<number, BoneBinding[]> = {\n 103: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 30 }],\n};\n\n/** Legacy compatibility map consumed by the current runtime profile shape. */\nexport const CC4_PROFILE_BONE_BINDINGS: Record<number, BoneBinding[]> = {\n ...BONE_AU_TO_BINDINGS,\n ...LIP_SYNC_CONTROL_TO_BINDINGS,\n};\n\n// ============================================================================\n// VISEME KEYS - CC4 1:1 Direct viseme morph targets (15)\n// ============================================================================\n\nexport const VISEME_KEYS: string[] = [\n 'AE',\n 'Ah',\n 'B_M_P',\n 'Ch_J',\n 'EE',\n 'Er',\n 'F_V',\n 'Ih',\n 'K_G_H_NG',\n 'Oh',\n 'R',\n 'S_Z',\n 'T_L_D_N',\n 'Th',\n 'W_OO',\n];\n\n/**\n * Jaw opening amounts for each viseme index (0-14).\n * Values are 0-1 representing how much the jaw should open.\n * Used by snippetToClip when autoVisemeJaw is enabled.\n */\nexport const VISEME_JAW_AMOUNTS: number[] = [\n 0.75, // 0: AE\n 0.80, // 1: Ah\n 0.00, // 2: B_M_P\n 0.30, // 3: Ch_J\n 0.20, // 4: EE\n 0.35, // 5: Er\n 0.10, // 6: F_V\n 0.20, // 7: Ih\n 0.35, // 8: K_G_H_NG\n 0.60, // 9: Oh\n 0.35, // 10: R\n 0.10, // 11: S_Z\n 0.30, // 12: T_L_D_N\n 0.15, // 13: Th\n 0.50, // 14: W_OO\n];\n\nexport const CC4_VISEME_SYSTEM_ID = 'cc4-arkit-15';\n\nexport const CC4_VISEME_SLOTS: VisemeSlot[] = [\n {\n id: 'ae',\n label: 'AE',\n order: 0,\n providerIds: { azure: [4], sapi: [4] },\n phonemes: ['AE', 'EH', 'EY', 'UH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ae|eh|ey)([_ .-]|$)'],\n features: { jawOpen: 0.75, lipSpread: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[0],\n },\n {\n id: 'ah',\n label: 'Ah',\n order: 1,\n providerIds: { azure: [1, 2, 9, 11, 12], sapi: [1, 2, 9, 11, 12] },\n phonemes: ['AA', 'AE', 'AH', 'AX', 'AW', 'AY', 'HH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ah|aa|aah|open)([_ .-]|$)'],\n features: { jawOpen: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[1],\n },\n {\n id: 'b-m-p',\n label: 'B_M_P',\n order: 2,\n providerIds: { azure: [0, 21], sapi: [0, 21] },\n phonemes: ['B', 'M', 'P'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(b[_ .-]?m[_ .-]?p|bmp|closed|sil|rest)([_ .-]|$)'],\n features: { jawOpen: 0, lipClosed: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[2],\n },\n {\n id: 'ch-j',\n label: 'Ch_J',\n order: 3,\n providerIds: { azure: [16], sapi: [16] },\n phonemes: ['CH', 'JH', 'SH', 'ZH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ch|j|sh|zh)([_ .-]|$)'],\n features: { jawOpen: 0.3, fricative: 0.6 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[3],\n },\n {\n id: 'ee',\n label: 'EE',\n order: 4,\n providerIds: { azure: [6], sapi: [6] },\n phonemes: ['IY', 'IH', 'IX', 'Y'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ee|iy|y)([_ .-]|$)'],\n features: { jawOpen: 0.2, lipSpread: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[4],\n },\n {\n id: 'er',\n label: 'Er',\n order: 5,\n providerIds: { azure: [5], sapi: [5] },\n phonemes: ['ER'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(er)([_ .-]|$)'],\n features: { jawOpen: 0.35, lipRound: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[5],\n },\n {\n id: 'f-v',\n label: 'F_V',\n order: 6,\n providerIds: { azure: [18], sapi: [18] },\n phonemes: ['F', 'V'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(f[_ .-]?v|fv)([_ .-]|$)'],\n features: { jawOpen: 0.1, fricative: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[6],\n },\n {\n id: 'ih',\n label: 'Ih',\n order: 7,\n providerIds: { azure: [6], sapi: [6] },\n phonemes: ['IH', 'IX'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ih|ix)([_ .-]|$)'],\n features: { jawOpen: 0.2, lipSpread: 0.55 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[7],\n },\n {\n id: 'k-g-h-ng',\n label: 'K_G_H_NG',\n order: 8,\n providerIds: { azure: [20], sapi: [20] },\n phonemes: ['K', 'G', 'NG'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(k[_ .-]?g[_ .-]?h?[_ .-]?ng|kg|ng)([_ .-]|$)'],\n features: { jawOpen: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[8],\n },\n {\n id: 'oh',\n label: 'Oh',\n order: 9,\n providerIds: { azure: [3, 8, 10], sapi: [3, 8, 10] },\n phonemes: ['AO', 'OW', 'OY'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(oh|ao|ow|oy)([_ .-]|$)'],\n features: { jawOpen: 0.6, lipRound: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[9],\n },\n {\n id: 'r',\n label: 'R',\n order: 10,\n providerIds: { azure: [13], sapi: [13] },\n phonemes: ['R'],\n matchers: ['(^|[_ .-])(v|viseme)[_ .-]?r([_ .-]|$)', '(^|[_ .-])r[_ .-]?(sound|viseme)([_ .-]|$)'],\n features: { jawOpen: 0.35, lipRound: 0.5 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[10],\n },\n {\n id: 's-z',\n label: 'S_Z',\n order: 11,\n providerIds: { azure: [15], sapi: [15] },\n phonemes: ['S', 'Z'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(s[_ .-]?z|sz)([_ .-]|$)'],\n features: { jawOpen: 0.1, fricative: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[11],\n },\n {\n id: 't-l-d-n',\n label: 'T_L_D_N',\n order: 12,\n providerIds: { azure: [14, 19], sapi: [14, 19] },\n phonemes: ['T', 'L', 'D', 'N'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(t[_ .-]?l[_ .-]?d[_ .-]?n|tldn)([_ .-]|$)', '(^|[_ .-])(v|viseme)[_ .-]?l([_ .-]|$)'],\n features: { jawOpen: 0.3, tongueTip: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[12],\n },\n {\n id: 'th',\n label: 'Th',\n order: 13,\n providerIds: { azure: [17], sapi: [17] },\n phonemes: ['TH', 'DH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(th|dh)([_ .-]|$)'],\n features: { jawOpen: 0.15, tongueTip: 0.8, fricative: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[13],\n },\n {\n id: 'w-oo',\n label: 'W_OO',\n order: 14,\n providerIds: { azure: [7], sapi: [7] },\n phonemes: ['W', 'UW'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(w[_ .-]?oo|woo|uw|oo)([_ .-]|$)'],\n features: { jawOpen: 0.5, lipRound: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[14],\n },\n];\n\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/** Check if an AU has both morphs and bones (can blend between them) */\nexport const isMixedAU = (id: number): boolean => {\n const morphs = AU_TO_MORPHS[id];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && BONE_AU_TO_BINDINGS[id]?.length);\n};\n\n/** Check if an AU has separate left/right morphs */\nexport const hasLeftRightMorphs = (auId: number): boolean => {\n const morphs = AU_TO_MORPHS[auId];\n return !!(morphs?.left?.length && morphs?.right?.length);\n};\n\n/** Check if an AU has bilateral bone bindings (L and R nodes) in CC4 preset */\nexport const hasLeftRightBones = (auId: number): boolean => {\n const bindings = BONE_AU_TO_BINDINGS[auId];\n return checkBindingsForLeftRight(bindings);\n};\n\n/** Helper to check if bone bindings have L and R nodes */\nexport const checkBindingsForLeftRight = (bindings: BoneBinding[] | undefined): boolean => {\n if (!bindings || bindings.length === 0) return false;\n\n // Check if bindings include both L and R nodes\n const nodes = bindings.map(b => b.node);\n // Match patterns like _L, _R, _L_, _R_, GILL_L, GILL_R, etc.\n const hasLeft = nodes.some(n => /_L$|_L_|GILL_L|_L\\d/i.test(n));\n const hasRight = nodes.some(n => /_R$|_R_|GILL_R|_R\\d/i.test(n));\n\n return hasLeft && hasRight;\n};\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Unified rotation control for bones\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n {\n node: CC4_BONES.JAW,\n pitch: { aus: [25, 26, 27, 103], axis: 'rz' }, // Jaw drop plus speech jaw pseudo-control\n yaw: { aus: [30, 35], axis: 'ry', negative: 30, positive: 35 }, // Jaw lateral (left/right)\n roll: null // Jaw doesn't have roll\n },\n {\n node: CC4_BONES.HEAD,\n pitch: { aus: [54, 53], axis: 'rx', negative: 54, positive: 53 }, // Head down/up\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head turn left/right\n roll: { aus: [55, 56], axis: 'rz', negative: 55, positive: 56 } // Head tilt left/right\n },\n {\n node: CC4_BONES.EYE_L,\n pitch: { aus: [64, 63, 68, 67], axis: 'rx', negative: [64, 68], positive: [63, 67] }, // Eyes down/up\n yaw: { aus: [61, 62, 65, 66], axis: 'rz', negative: [61, 65], positive: [62, 66] }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: CC4_BONES.EYE_R,\n pitch: { aus: [64, 63, 72, 71], axis: 'rx', negative: [64, 72], positive: [63, 71] }, // Eyes down/up\n yaw: { aus: [61, 62, 69, 70], axis: 'rz', negative: [61, 69], positive: [62, 70] }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: CC4_BONES.TONGUE,\n pitch: { aus: [38, 37], axis: 'rz', negative: 38, positive: 37 }, // Tongue down/up\n yaw: { aus: [39, 40], axis: 'ry', negative: 39, positive: 40 }, // Tongue left/right\n roll: { aus: [41, 42], axis: 'rx', negative: 41, positive: 42 } // Tongue tilt left/right\n }\n];\n\n// ============================================================================\n// CONTINUUM PAIRS - Bidirectional AU pair mappings\n// ============================================================================\n\n/**\n * Continuum pair mappings - precomputed from COMPOSITE_ROTATIONS\n * Maps AU ID to its continuum partner info for bidirectional axes\n * (e.g., AU 51 \"Head Left\" is paired with AU 52 \"Head Right\")\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n}> = {\n // Eyes horizontal - both eyes share same AUs (yaw maps to rz via COMPOSITE_ROTATIONS)\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_L },\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_L },\n 65: { pairId: 66, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_L },\n 66: { pairId: 65, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_L },\n 69: { pairId: 70, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_R },\n 70: { pairId: 69, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_R },\n // Eyes vertical (pitch)\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_L },\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_L },\n 68: { pairId: 67, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_L },\n 67: { pairId: 68, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_L },\n 72: { pairId: 71, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_R },\n 71: { pairId: 72, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_R },\n // Head yaw (turn left/right)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: CC4_BONES.HEAD },\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: CC4_BONES.HEAD },\n // Head pitch (up/down)\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: CC4_BONES.HEAD },\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: CC4_BONES.HEAD },\n // Head roll (tilt left/right)\n 55: { pairId: 56, isNegative: true, axis: 'roll', node: CC4_BONES.HEAD },\n 56: { pairId: 55, isNegative: false, axis: 'roll', node: CC4_BONES.HEAD },\n // Jaw yaw (left/right)\n 30: { pairId: 35, isNegative: true, axis: 'yaw', node: CC4_BONES.JAW },\n 35: { pairId: 30, isNegative: false, axis: 'yaw', node: CC4_BONES.JAW },\n // Tongue yaw (left/right)\n 39: { pairId: 40, isNegative: true, axis: 'yaw', node: CC4_BONES.TONGUE },\n 40: { pairId: 39, isNegative: false, axis: 'yaw', node: CC4_BONES.TONGUE },\n // Tongue pitch (up/down)\n 38: { pairId: 37, isNegative: true, axis: 'pitch', node: CC4_BONES.TONGUE },\n 37: { pairId: 38, isNegative: false, axis: 'pitch', node: CC4_BONES.TONGUE },\n // Tongue roll (tilt left/right)\n 41: { pairId: 42, isNegative: true, axis: 'roll', node: CC4_BONES.TONGUE },\n 42: { pairId: 41, isNegative: false, axis: 'roll', node: CC4_BONES.TONGUE },\n // Extended tongue morphs (continuum pairs)\n 73: { pairId: 74, isNegative: true, axis: 'yaw', node: CC4_BONES.TONGUE }, // Tongue Narrow/Wide\n 74: { pairId: 73, isNegative: false, axis: 'yaw', node: CC4_BONES.TONGUE },\n 76: { pairId: 77, isNegative: false, axis: 'pitch', node: CC4_BONES.TONGUE }, // Tongue Tip Up/Down\n 77: { pairId: 76, isNegative: true, axis: 'pitch', node: CC4_BONES.TONGUE },\n};\n\n/**\n * Human-readable labels for continuum pairs\n * Key format: \"negativeAU-positiveAU\"\n * Used by UI components (ContinuumSlider, AUSection) to display friendly axis names\n */\nexport const CONTINUUM_LABELS: Record<string, string> = {\n '61-62': 'Eyes — Horizontal',\n '64-63': 'Eyes — Vertical',\n '65-66': 'Left Eye — Horizontal',\n '68-67': 'Left Eye — Vertical',\n '69-70': 'Right Eye — Horizontal',\n '72-71': 'Right Eye — Vertical',\n '51-52': 'Head — Horizontal',\n '54-53': 'Head — Vertical',\n '55-56': 'Head — Tilt',\n '30-35': 'Jaw — Horizontal',\n '38-37': 'Tongue — Vertical',\n '39-40': 'Tongue — Horizontal',\n '41-42': 'Tongue — Tilt',\n '73-74': 'Tongue — Width',\n '76-77': 'Tongue Tip — Vertical',\n};\n\nexport const CC4_EYE_MESH_NODES = {\n LEFT: 'CC_Base_Eye',\n RIGHT: 'CC_Base_Eye_1'\n} as const;\n\n// ============================================================================\n// AU INFO - Metadata for each Action Unit\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Forehead / Brow (Upper)\n '1': { id:'1', name:'Inner Brow Raiser', muscularBasis:'frontalis (pars medialis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '2': { id:'2', name:'Outer Brow Raiser', muscularBasis:'frontalis (pars lateralis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '4': { id:'4', name:'Brow Lowerer', muscularBasis:'corrugator/depressor supercilii', links:['https://en.wikipedia.org/wiki/Corrugator_supercilii'], faceArea:'Upper', facePart:'Forehead' },\n\n // Eyelids / Eyes (Upper)\n '5': { id:'5', name:'Upper Lid Raiser', muscularBasis:'levator palpebrae superioris', links:['https://en.wikipedia.org/wiki/Levator_palpebrae_superioris'], faceArea:'Upper', facePart:'Eyelids' },\n '6': { id:'6', name:'Cheek Raiser', muscularBasis:'orbicularis oculi (pars orbitalis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Cheeks' },\n '7': { id:'7', name:'Lid Tightener', muscularBasis:'orbicularis oculi (pars palpebralis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Eyelids' },\n '43': { id:'43', name:'Eyes Closed', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '45': { id:'45', name:'Blink', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '61': { id:'61', name:'Eyes Turn Left', faceArea:'Upper', facePart:'Eyes' },\n '62': { id:'62', name:'Eyes Turn Right', faceArea:'Upper', facePart:'Eyes' },\n '63': { id:'63', name:'Eyes Up', faceArea:'Upper', facePart:'Eyes' },\n '64': { id:'64', name:'Eyes Down', faceArea:'Upper', facePart:'Eyes' },\n '65': { id:'65', name:'Left Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '66': { id:'66', name:'Left Eye Look Right', faceArea:'Upper', facePart:'Eyes' },\n '67': { id:'67', name:'Left Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '68': { id:'68', name:'Left Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n '69': { id:'69', name:'Right Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '70': { id:'70', name:'Right Eye Look Right',faceArea:'Upper', facePart:'Eyes' },\n '71': { id:'71', name:'Right Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '72': { id:'72', name:'Right Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n\n // Nose / Cheeks\n '9': { id:'9', name:'Nose Wrinkler', muscularBasis:'levator labii superioris alaeque nasi', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris_alaeque_nasi'], faceArea:'Upper', facePart:'Nose' },\n '34': { id:'34', name:'Cheek Puff', faceArea:'Lower', facePart:'Cheeks' },\n\n // Mouth (Lower)\n '8': { id:'8', name:'Lips Toward Each Other', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '10': { id:'10', name:'Upper Lip Raiser', muscularBasis:'levator labii superioris', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris'], faceArea:'Lower', facePart:'Mouth' },\n '11': { id:'11', name:'Nasolabial Deepener', muscularBasis:'zygomaticus minor', links:['https://en.wikipedia.org/wiki/Zygomaticus_minor'], faceArea:'Lower', facePart:'Cheeks' },\n '12': { id:'12', name:'Lip Corner Puller', muscularBasis:'zygomaticus major', links:['https://en.wikipedia.org/wiki/Zygomaticus_major'], faceArea:'Lower', facePart:'Mouth' },\n '13': { id:'13', name:'Sharp Lip Puller', muscularBasis:'levator anguli oris', links:['https://en.wikipedia.org/wiki/Levator_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '14': { id:'14', name:'Dimpler', muscularBasis:'buccinator', links:['https://en.wikipedia.org/wiki/Buccinator'], faceArea:'Lower', facePart:'Cheeks' },\n '15': { id:'15', name:'Lip Corner Depressor', muscularBasis:'depressor anguli oris', links:['https://en.wikipedia.org/wiki/Depressor_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '16': { id:'16', name:'Lower Lip Depressor', muscularBasis:'depressor labii inferioris', links:['https://en.wikipedia.org/wiki/Depressor_labii_inferioris'], faceArea:'Lower', facePart:'Mouth' },\n '17': { id:'17', name:'Chin Raiser', muscularBasis:'mentalis', links:['https://en.wikipedia.org/wiki/Mentalis'], faceArea:'Lower', facePart:'Chin' },\n '18': { id:'18', name:'Lip Pucker', faceArea:'Lower', facePart:'Mouth' },\n '20': { id:'20', name:'Lip Stretcher', muscularBasis:'risorius + platysma', links:['https://en.wikipedia.org/wiki/Risorius','https://en.wikipedia.org/wiki/Platysma'], faceArea:'Lower', facePart:'Mouth' },\n '22': { id:'22', name:'Lip Funneler', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '23': { id:'23', name:'Lip Tightener', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '24': { id:'24', name:'Lip Presser', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '25': { id:'25', name:'Lips Part', faceArea:'Lower', facePart:'Mouth' },\n '27': { id:'27', name:'Mouth Stretch', muscularBasis:'pterygoids + digastric', links:['https://en.wikipedia.org/wiki/Pterygoid_bone','https://en.wikipedia.org/wiki/Digastric_muscle'], faceArea:'Lower', facePart:'Mouth' },\n '28': { id:'28', name:'Lip Suck', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n\n // Tongue (Lower)\n '19': { id:'19', name:'Tongue Show', faceArea:'Lower', facePart:'Tongue' },\n '36': { id:'36', name:'Tongue Bulge', faceArea:'Lower', facePart:'Tongue' },\n '37': { id:'37', name:'Tongue Up', faceArea:'Lower', facePart:'Tongue' },\n '38': { id:'38', name:'Tongue Down', faceArea:'Lower', facePart:'Tongue' },\n '39': { id:'39', name:'Tongue Left', faceArea:'Lower', facePart:'Tongue' },\n '40': { id:'40', name:'Tongue Right', faceArea:'Lower', facePart:'Tongue' },\n '41': { id:'41', name:'Tongue Tilt Left', faceArea:'Lower', facePart:'Tongue' },\n '42': { id:'42', name:'Tongue Tilt Right', faceArea:'Lower', facePart:'Tongue' },\n // Extended tongue controls (CC4-specific morphs)\n '73': { id:'73', name:'Tongue Narrow', faceArea:'Lower', facePart:'Tongue' },\n '74': { id:'74', name:'Tongue Wide', faceArea:'Lower', facePart:'Tongue' },\n '75': { id:'75', name:'Tongue Roll', faceArea:'Lower', facePart:'Tongue' },\n '76': { id:'76', name:'Tongue Tip Up', faceArea:'Lower', facePart:'Tongue' },\n '77': { id:'77', name:'Tongue Tip Down', faceArea:'Lower', facePart:'Tongue' },\n\n // Jaw (Lower)\n '26': { id:'26', name:'Jaw Drop', muscularBasis:'masseter (relax temporalis)', links:['https://en.wikipedia.org/wiki/Masseter_muscle'], faceArea:'Lower', facePart:'Jaw' },\n '29': { id:'29', name:'Jaw Thrust', faceArea:'Lower', facePart:'Jaw' },\n '30': { id:'30', name:'Jaw Left', faceArea:'Lower', facePart:'Jaw' },\n '31': { id:'31', name:'Jaw Clencher', muscularBasis:'masseter + temporalis', faceArea:'Lower', facePart:'Jaw' },\n '32': { id:'32', name:'Lip Bite', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '35': { id:'35', name:'Jaw Right', faceArea:'Lower', facePart:'Jaw' },\n\n // Head position (M51-M56 in FACS notation)\n '51': { id:'51', name:'Head Turn Left', faceArea:'Upper', facePart:'Head' },\n '52': { id:'52', name:'Head Turn Right', faceArea:'Upper', facePart:'Head' },\n '53': { id:'53', name:'Head Up', faceArea:'Upper', facePart:'Head' },\n '54': { id:'54', name:'Head Down', faceArea:'Upper', facePart:'Head' },\n '55': { id:'55', name:'Head Tilt Left', faceArea:'Upper', facePart:'Head' },\n '56': { id:'56', name:'Head Tilt Right', faceArea:'Upper', facePart:'Head' },\n\n // Eye (Upper) - EO morphs applied to CC_Base_Eye meshes\n '80': { id:'80', name:'Eye Bulge', faceArea:'Upper', facePart:'Eye' },\n '81': { id:'81', name:'Eye Depth', faceArea:'Upper', facePart:'Eye' },\n '82': { id:'82', name:'Eye Inner Depth', faceArea:'Upper', facePart:'Eye' },\n '83': { id:'83', name:'Eye Inner Height', faceArea:'Upper', facePart:'Eye' },\n '84': { id:'84', name:'Eye Inner Width', faceArea:'Upper', facePart:'Eye' },\n '85': { id:'85', name:'Eye Outer Depth', faceArea:'Upper', facePart:'Eye' },\n '86': { id:'86', name:'Eye Outer Height', faceArea:'Upper', facePart:'Eye' },\n '87': { id:'87', name:'Eye Outer Width', faceArea:'Upper', facePart:'Eye' },\n '88': { id:'88', name:'Eye Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '89': { id:'89', name:'Eye Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '90': { id:'90', name:'Eye Center Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '91': { id:'91', name:'Eye Center Upper Height',faceArea:'Upper', facePart:'Eye' },\n '92': { id:'92', name:'Eye Center Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '93': { id:'93', name:'Eye Center Lower Height',faceArea:'Upper', facePart:'Eye' },\n '94': { id:'94', name:'Eye Inner Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '95': { id:'95', name:'Eye Inner Upper Height', faceArea:'Upper', facePart:'Eye' },\n '96': { id:'96', name:'Eye Inner Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '97': { id:'97', name:'Eye Inner Lower Height', faceArea:'Upper', facePart:'Eye' },\n '98': { id:'98', name:'Eye Outer Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '99': { id:'99', name:'Eye Outer Upper Height', faceArea:'Upper', facePart:'Eye' },\n '100': { id:'100', name:'Eye Outer Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '101': { id:'101', name:'Eye Outer Lower Height',faceArea:'Upper', facePart:'Eye' },\n '102': { id:'102', name:'Eye Duct Depth', faceArea:'Upper', facePart:'Eye' },\n};\n\n// ============================================================================\n// MIX DEFAULTS - Morph/bone blend weights\n// ============================================================================\n\n/** Default mix weights (0 = morph only, 1 = bone only) */\nexport const AU_MIX_DEFAULTS: Record<number, number> = {\n 31: 0.7, 32: 0.7, 33: 0.7, 54: 0.7, 55: 0.7, 56: 0.7, // head\n 61: 0.5, 62: 0.5, 63: 0.5, 64: 0.5, // eyes\n 25: 0.5, 26: 0.5, 27: 0.5, // jaw open (lips part, jaw drop, mouth stretch)\n 30: 0.5, 35: 0.5, // jaw left/right\n};\n\n// ============================================================================\n// CC4 MESH CLASSIFICATION\n// Types imported from '../mappings/types'\n// ============================================================================\n\n/** Exact mesh name -> category mapping from the character GLB */\nexport const CC4_MESHES: Record<string, MeshInfo> = {\n // Body (6 meshes, 80 morphs each) - default render order 0\n 'CC_Base_Body_1': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_2': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_3': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_4': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_5': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_6': { category: 'body', morphCount: 80 },\n // Eyes (bone-driven, no morphs) - render first (behind everything)\n 'CC_Base_Eye': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_1': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_2': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_3': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_4': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n // Eye occlusion (94 morphs each) - render on top of eyes with transparency support\n 'CC_Base_EyeOcclusion_1': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n 'CC_Base_EyeOcclusion_2': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n // Tear lines (90 morphs each) - on top of eyes/face\n 'CC_Base_TearLine_1': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n 'CC_Base_TearLine_2': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n // Cornea (no morphs) - render first with eyes\n 'CC_Base_Cornea': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Cornea_1': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n // Teeth (no morphs, follow jaw bone) - default render order\n 'CC_Base_Teeth_1': { category: 'teeth', morphCount: 0 },\n 'CC_Base_Teeth_2': { category: 'teeth', morphCount: 0 },\n // Tongue (23 morphs) - default render order\n 'CC_Base_Tongue': { category: 'tongue', morphCount: 23 },\n // Eyebrows (91 morphs each) - above face\n 'Male_Bushy_1': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n 'Male_Bushy_2': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n // Hair (14 styling morphs each) - render last (on top of everything)\n 'Side_part_wavy_1': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n 'Side_part_wavy_2': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n};\n\n// ============================================================================\n// MORPH TO MESH MAPPING\n// MorphCategory type imported from '../mappings/types'\n// ============================================================================\n\n/** Which mesh each morph category applies to */\nexport const MORPH_TO_MESH: Record<MorphCategory, string[]> = {\n // Face/AU morphs target the main body mesh only.\n // Include both CC4 naming variants (with and without _1/_2 suffixes).\n face: ['CC_Base_Body'],\n viseme: ['CC_Base_Body', 'CC_Base_Body_1'],\n eye: ['CC_Base_EyeOcclusion', 'CC_Base_EyeOcclusion_1', 'CC_Base_EyeOcclusion_2'],\n tongue: ['CC_Base_Tongue', 'CC_Base_Tongue_1'],\n hair: ['Side_part_wavy', 'Side_part_wavy_1', 'Side_part_wavy_2'],\n};\n\n/** Map AU facePart labels to morphToMesh categories for configurable AU mesh routing. */\nexport const AU_FACEPART_TO_MESH_CATEGORY: Record<string, MorphCategory> = {\n Eye: 'eye',\n Eyes: 'eye',\n Eyelids: 'eye',\n Tongue: 'tongue',\n};\n\nexport const CC4_MAPPING_SECTIONS: MappingEditorSection[] = [\n { id: 'Forehead', label: 'Forehead', kind: 'au', order: 0, meshCategory: 'face', facePart: 'Forehead' },\n { id: 'Eyelids', label: 'Eyelids', kind: 'au', order: 1, meshCategory: 'eye', facePart: 'Eyelids' },\n { id: 'Eyes', label: 'Eyes', kind: 'au', order: 2, meshCategory: 'eye', facePart: 'Eyes' },\n { id: 'Cheeks', label: 'Cheeks', kind: 'au', order: 3, meshCategory: 'face', facePart: 'Cheeks' },\n { id: 'Nose', label: 'Nose', kind: 'au', order: 4, meshCategory: 'face', facePart: 'Nose' },\n { id: 'Mouth', label: 'Mouth', kind: 'au', order: 5, meshCategory: 'face', facePart: 'Mouth' },\n { id: 'Chin', label: 'Chin', kind: 'au', order: 6, meshCategory: 'face', facePart: 'Chin' },\n { id: 'Jaw', label: 'Jaw', kind: 'au', order: 7, meshCategory: 'face', facePart: 'Jaw' },\n { id: 'Tongue', label: 'Tongue', kind: 'au', order: 8, meshCategory: 'tongue', facePart: 'Tongue' },\n { id: 'Head', label: 'Head', kind: 'au', order: 9, meshCategory: 'face', facePart: 'Head' },\n { id: 'Joint Controls', label: 'Joint Controls', kind: 'au', order: 10, meshCategory: 'face', facePart: 'Joint Controls' },\n { id: 'Eye', label: 'Eye', kind: 'au', order: 11, meshCategory: 'eye', facePart: 'Eye' },\n { id: 'Hair', label: 'Hair', kind: 'hair', order: 12, meshCategory: 'hair' },\n { id: 'Visemes', label: 'Visemes', kind: 'viseme', order: 13, meshCategory: 'viseme' },\n { id: 'LipSync', label: 'Lip Sync', kind: 'lipSync', order: 14, meshCategory: 'face' },\n { id: 'Unmapped', label: 'Unmapped', kind: 'unmapped', order: 15, meshCategory: 'face' },\n];\n\n// ============================================================================\n// HAIR PHYSICS DEFAULTS\n// ============================================================================\n\nexport const CC4_HAIR_PHYSICS: Profile['hairPhysics'] = {\n stiffness: 7.5,\n damping: 0.18,\n inertia: 3.5,\n gravity: 12,\n responseScale: 2.5,\n idleSwayAmount: 0.12,\n idleSwaySpeed: 1.0,\n windStrength: 0,\n windDirectionX: 1.0,\n windDirectionZ: 0,\n windTurbulence: 0.3,\n windFrequency: 1.4,\n idleClipDuration: 10,\n impulseClipDuration: 1.4,\n direction: {\n yawSign: -1,\n pitchSign: -1,\n },\n morphTargets: {\n swayLeft: { key: 'L_Hair_Left', axis: 'yaw' },\n swayRight: { key: 'L_Hair_Right', axis: 'yaw' },\n swayFront: { key: 'L_Hair_Front', axis: 'pitch' },\n fluffRight: { key: 'Fluffy_Right', axis: 'yaw' },\n fluffBottom: { key: 'Fluffy_Bottom_ALL', axis: 'pitch' },\n headUp: {\n Hairline_High_ALL: { value: 0.45, axis: 'pitch' },\n Length_Short: { value: 0.65, axis: 'pitch' },\n },\n headDown: {\n L_Hair_Front: { value: 2.0, axis: 'pitch' },\n Fluffy_Bottom_ALL: { value: 1.0, axis: 'pitch' },\n },\n },\n};\n\n// ============================================================================\n// CC4_PRESET - Main export for Profile\n// ============================================================================\n\nexport const CC4_PRESET: Profile = {\n name: 'Character Creator 4',\n animalType: 'human',\n // No emoji for humans - uses FaTheaterMasks icon instead\n auToMorphs: AU_TO_MORPHS,\n auToBones: CC4_PROFILE_BONE_BINDINGS,\n boneNodes: CC4_BONE_NODES,\n bonePrefix: CC4_BONE_PREFIX,\n suffixPattern: CC4_SUFFIX_PATTERN,\n morphToMesh: MORPH_TO_MESH,\n auFacePartToMeshCategory: AU_FACEPART_TO_MESH_CATEGORY,\n mappingSections: CC4_MAPPING_SECTIONS,\n visemeKeys: VISEME_KEYS,\n visemeSystemId: CC4_VISEME_SYSTEM_ID,\n visemeSlots: CC4_VISEME_SLOTS,\n visemeMeshCategory: 'viseme',\n visemeJawAmounts: VISEME_JAW_AMOUNTS,\n auMixDefaults: AU_MIX_DEFAULTS,\n auInfo: AU_INFO,\n eyeMeshNodes: CC4_EYE_MESH_NODES,\n meshes: CC4_MESHES,\n continuumPairs: CONTINUUM_PAIRS_MAP,\n continuumLabels: CONTINUUM_LABELS,\n hairPhysics: CC4_HAIR_PHYSICS,\n annotationRegions: [\n {\n name: 'full_body',\n objects: ['*'],\n paddingFactor: 2.0,\n },\n {\n name: 'head',\n bones: ['HEAD', 'JAW'],\n paddingFactor: 1.5,\n children: ['face', 'left_eye', 'right_eye', 'mouth'],\n expandAnimation: 'staggered',\n },\n {\n name: 'face',\n bones: ['HEAD'],\n // meshes: populated by user selection in wizard - varies per character\n paddingFactor: 1.3,\n parent: 'head',\n },\n {\n name: 'left_eye',\n bones: ['EYE_L'],\n paddingFactor: 0.9,\n parent: 'head',\n },\n {\n name: 'right_eye',\n bones: ['EYE_R'],\n paddingFactor: 0.9,\n parent: 'head',\n },\n {\n name: 'mouth',\n bones: ['JAW'],\n paddingFactor: 1.5,\n parent: 'head',\n },\n {\n name: 'upper_body',\n bones: [\n 'SPINE_02',\n 'HEAD',\n 'CLAVICLE_L',\n 'CLAVICLE_R',\n ],\n paddingFactor: 1.6,\n },\n {\n name: 'back',\n bones: ['SPINE_01', 'SPINE_02'],\n paddingFactor: 1.8,\n cameraAngle: 180,\n },\n {\n name: 'left_hand',\n bones: ['HAND_L'],\n paddingFactor: 1.3,\n cameraAngle: 270,\n },\n {\n name: 'right_hand',\n bones: ['HAND_R'],\n paddingFactor: 1.3,\n cameraAngle: 90,\n },\n {\n name: 'left_foot',\n bones: ['FOOT_L', 'TOEBASE_L'],\n paddingFactor: 2.5,\n cameraAngle: 270,\n },\n {\n name: 'right_foot',\n bones: ['FOOT_R', 'TOEBASE_R'],\n paddingFactor: 2.5,\n cameraAngle: 90,\n },\n ],\n};\n\nexport default CC4_PRESET;\n","import { Mesh } from 'three';\nimport type { Object3D } from 'three';\nimport type { ClipHandle, ClipOptions, CurvesMap } from '../../../core/types';\nimport type {\n HairPhysicsDirectionConfig as SharedHairPhysicsDirectionConfig,\n HairMorphTargetsConfig as SharedHairMorphTargetsConfig,\n HairPhysicsRuntimeConfig as SharedHairPhysicsConfig,\n HairPhysicsRuntimeConfigUpdate as SharedHairPhysicsConfigUpdate,\n HairAppearanceState,\n HairColorAppearance,\n} from '../../../interfaces/Hair';\nimport {\n colorToCssHex,\n DEFAULT_HAIR_COLOR_APPEARANCE,\n normalizeHairColorAppearance,\n} from '../../../hair/appearance';\nimport type { HairPhysicsProfileConfig } from '../../../mappings/types';\nimport { CC4_MESHES } from '../../../presets/cc4';\nimport type { EmbodyCoreWasmModule } from '../../../wasmTypes';\n\nexport type HairPhysicsDirectionConfig = SharedHairPhysicsDirectionConfig;\nexport type HairMorphTargets = SharedHairMorphTargetsConfig;\nexport type HairPhysicsConfig = SharedHairPhysicsConfig;\nexport type HairPhysicsConfigUpdate = SharedHairPhysicsConfigUpdate;\n\nexport interface HairPhysicsHost {\n getMeshByName: (name: string) => Mesh | undefined;\n getSelectedHairMeshNames?: () => string[];\n buildClip?: (clipName: string, curves: CurvesMap, options?: ClipOptions) => ClipHandle | null;\n cleanupSnippet?: (name: string) => void;\n}\n\nconst clamp01 = (value: number) => (value < 0 ? 0 : value > 1 ? 1 : value);\n\nexport class HairPhysicsController {\n private host: HairPhysicsHost;\n private core: EmbodyCoreWasmModule | null = null;\n private hairPhysicsEnabled = false;\n private hairPhysicsConfig: HairPhysicsConfig = {\n stiffness: 7.5,\n damping: 0.18,\n inertia: 3.5,\n gravity: 12,\n responseScale: 2.5,\n idleSwayAmount: 0.12,\n idleSwaySpeed: 1.0,\n windStrength: 0,\n windDirectionX: 1.0,\n windDirectionZ: 0,\n windTurbulence: 0.3,\n windFrequency: 1.4,\n idleClipDuration: 10,\n impulseClipDuration: 1.4,\n direction: {\n yawSign: -1,\n pitchSign: -1,\n },\n morphTargets: {\n swayLeft: 'L_Hair_Left',\n swayRight: 'L_Hair_Right',\n swayFront: 'L_Hair_Front',\n fluffRight: 'Fluffy_Right',\n fluffBottom: 'Fluffy_Bottom_ALL',\n headUp: {\n Hairline_High_ALL: 0.45,\n Length_Short: 0.65,\n },\n headDown: {\n L_Hair_Front: 2.0,\n Fluffy_Bottom_ALL: 1.0,\n },\n },\n };\n private readonly idleClipName = 'hair_idle';\n private readonly gravityClipName = 'hair_gravity';\n private readonly impulseClipNames = {\n left: 'hair_impulse_left',\n right: 'hair_impulse_right',\n front: 'hair_impulse_front',\n };\n private idleClipHandle: ClipHandle | null = null;\n private gravityClipHandle: ClipHandle | null = null;\n private idleClipDirty = true;\n private gravityClipDirty = true;\n private impulseClips: { left?: ClipHandle; right?: ClipHandle; front?: ClipHandle } = {};\n private impulseClipDirty = true;\n private impulseEndTimers: Partial<Record<'left' | 'right' | 'front', ReturnType<typeof setTimeout>>> = {};\n private impulseFadeSteps: Partial<Record<'left' | 'right' | 'front', ReturnType<typeof setTimeout>[]>> = {};\n private hasHeadState = false;\n private lastHeadHorizontal = 0;\n private lastHeadVertical = 0;\n private registeredHairObjects = new Map<string, Mesh>();\n private cachedHairMeshNames: string[] | null = null;\n private warnedMissingMorphTargets = new Set<string>();\n private appearance: HairAppearanceState = {\n hairColor: { ...DEFAULT_HAIR_COLOR_APPEARANCE },\n eyebrowColor: { ...DEFAULT_HAIR_COLOR_APPEARANCE },\n showOutline: false,\n outlineColor: '#00ff00',\n outlineOpacity: 1,\n };\n private appearanceSampled = false;\n\n constructor(host: HairPhysicsHost) {\n this.host = host;\n }\n\n /** Attach the Wasm module owned by the engine/session that created this controller. */\n setCore(core: EmbodyCoreWasmModule): void {\n this.core = core;\n }\n\n private requireCore(): EmbodyCoreWasmModule {\n if (!this.core) {\n throw new Error(\n 'HairPhysicsController has no Embody Wasm core. Create the engine with Embody.create() or call setCore() after initEmbodyCore().'\n );\n }\n return this.core;\n }\n\n private isEyebrowMesh(name: string, mesh?: Mesh): boolean {\n const info = CC4_MESHES[name];\n if (info?.category === 'eyebrow') return true;\n if (info?.category === 'hair') return false;\n const lower = name.toLowerCase();\n return lower.includes('eyebrow') || lower.includes('brow');\n }\n\n private sampleColorFromMesh(mesh: Mesh | undefined): HairAppearanceState['hairColor'] | null {\n if (!mesh || !mesh.material || Array.isArray(mesh.material)) return null;\n const mat = mesh.material as typeof mesh.material & {\n color?: { getHexString(): string };\n emissive?: { getHexString(): string };\n emissiveIntensity?: number;\n };\n const baseColor = colorToCssHex(mat.color);\n if (!baseColor) return null;\n return {\n baseColor,\n emissive: colorToCssHex(mat.emissive) ?? '#000000',\n emissiveIntensity: typeof mat.emissiveIntensity === 'number' ? mat.emissiveIntensity : 0,\n };\n }\n\n private ensureAppearanceSampled(): void {\n if (this.appearanceSampled) return;\n this.appearanceSampled = true;\n\n let hairSample: HairAppearanceState['hairColor'] | null = null;\n let browSample: HairAppearanceState['hairColor'] | null = null;\n for (const [name, mesh] of this.registeredHairObjects) {\n if (this.isEyebrowMesh(name, mesh)) {\n browSample ??= this.sampleColorFromMesh(mesh);\n } else {\n hairSample ??= this.sampleColorFromMesh(mesh);\n }\n if (hairSample && browSample) break;\n }\n\n if (hairSample) this.appearance.hairColor = hairSample;\n if (browSample) this.appearance.eyebrowColor = browSample;\n }\n\n private applyColorToCategory(\n category: 'hair' | 'eyebrow',\n color: HairAppearanceState['hairColor'],\n ): void {\n for (const [name, mesh] of this.registeredHairObjects) {\n const isBrow = this.isEyebrowMesh(name, mesh);\n if (category === 'eyebrow' ? !isBrow : isBrow) continue;\n this.applyHairStateToObject(name, {\n color: {\n baseColor: color.baseColor,\n emissive: color.emissive,\n emissiveIntensity: color.emissiveIntensity,\n },\n isEyebrow: isBrow,\n });\n }\n }\n\n getHairAppearance(): HairAppearanceState {\n this.ensureAppearanceSampled();\n return {\n hairColor: { ...this.appearance.hairColor },\n eyebrowColor: { ...this.appearance.eyebrowColor },\n showOutline: this.appearance.showOutline,\n outlineColor: this.appearance.outlineColor,\n outlineOpacity: this.appearance.outlineOpacity,\n };\n }\n\n setHairColor(color: HairColorAppearance | string): void {\n this.ensureAppearanceSampled();\n this.appearance.hairColor = normalizeHairColorAppearance(color, {\n ...DEFAULT_HAIR_COLOR_APPEARANCE,\n ...this.appearance.hairColor,\n name: this.appearance.hairColor.name ?? DEFAULT_HAIR_COLOR_APPEARANCE.name,\n });\n this.applyColorToCategory('hair', this.appearance.hairColor);\n }\n\n setEyebrowColor(color: HairColorAppearance | string): void {\n this.ensureAppearanceSampled();\n this.appearance.eyebrowColor = normalizeHairColorAppearance(color, {\n ...DEFAULT_HAIR_COLOR_APPEARANCE,\n ...this.appearance.eyebrowColor,\n name: this.appearance.eyebrowColor.name ?? DEFAULT_HAIR_COLOR_APPEARANCE.name,\n });\n this.applyColorToCategory('eyebrow', this.appearance.eyebrowColor);\n }\n\n setHairBaseColor(baseColor: string): void {\n this.ensureAppearanceSampled();\n this.setHairColor({\n ...this.appearance.hairColor,\n baseColor,\n });\n }\n\n setEyebrowBaseColor(baseColor: string): void {\n this.ensureAppearanceSampled();\n this.setEyebrowColor({\n ...this.appearance.eyebrowColor,\n baseColor,\n });\n }\n\n setHairGlow(emissive: string, intensity: number): void {\n this.ensureAppearanceSampled();\n this.setHairColor({\n ...this.appearance.hairColor,\n emissive,\n emissiveIntensity: intensity,\n });\n }\n\n setEyebrowGlow(emissive: string, intensity: number): void {\n this.ensureAppearanceSampled();\n this.setEyebrowColor({\n ...this.appearance.eyebrowColor,\n emissive,\n emissiveIntensity: intensity,\n });\n }\n\n setHairOutline(outline: { show: boolean; color?: string; opacity?: number }): void {\n this.ensureAppearanceSampled();\n this.appearance.showOutline = Boolean(outline.show);\n if (outline.color !== undefined) {\n this.appearance.outlineColor = outline.color;\n }\n if (outline.opacity !== undefined) {\n this.appearance.outlineOpacity = outline.opacity;\n }\n const payload = {\n outline: {\n show: this.appearance.showOutline,\n color: this.appearance.outlineColor,\n opacity: this.appearance.outlineOpacity,\n },\n };\n for (const name of this.registeredHairObjects.keys()) {\n this.applyHairStateToObject(name, payload);\n }\n }\n\n clearRegisteredHairObjects(): void {\n this.registeredHairObjects.clear();\n this.cachedHairMeshNames = null;\n this.appearanceSampled = false;\n this.stopIdleClip();\n this.stopGravityClip();\n this.stopImpulseClips();\n this.clearImpulseTimers();\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnedMissingMorphTargets.clear();\n }\n\n registerHairObjects(objects: Object3D[]): Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> {\n this.clearRegisteredHairObjects();\n\n const result: Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> = [];\n\n for (const obj of objects) {\n if (obj instanceof Mesh) {\n const mesh = obj;\n this.registeredHairObjects.set(mesh.name, mesh);\n\n const meshInfo = CC4_MESHES[mesh.name];\n const isEyebrow = meshInfo?.category === 'eyebrow';\n\n result.push({\n name: mesh.name,\n isMesh: true,\n isEyebrow,\n });\n }\n }\n\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n\n return result;\n }\n\n autoRegisterHairMesh(mesh: Mesh, category: 'hair' | 'eyebrow'): void {\n this.registeredHairObjects.set(mesh.name, mesh);\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n mesh.renderOrder = category === 'eyebrow' ? 5 : 10;\n }\n\n getRegisteredHairObjects(): Mesh[] {\n return Array.from(this.registeredHairObjects.values());\n }\n\n setHairPhysicsEnabled(enabled: boolean): void {\n this.hairPhysicsEnabled = enabled;\n if (!enabled) {\n this.stopIdleClip();\n this.stopGravityClip();\n this.stopImpulseClips();\n this.clearImpulseTimers();\n this.hasHeadState = false;\n return;\n }\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n\n isHairPhysicsEnabled(): boolean {\n return this.hairPhysicsEnabled;\n }\n\n setHairPhysicsProfileConfig(hairConfig?: HairPhysicsProfileConfig): void {\n if (!hairConfig) return;\n\n const runtimeConfig: HairPhysicsConfigUpdate = {};\n const numericKeys: Array<keyof HairPhysicsProfileConfig> = [\n 'stiffness',\n 'damping',\n 'inertia',\n 'gravity',\n 'responseScale',\n 'idleSwayAmount',\n 'idleSwaySpeed',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n 'idleClipDuration',\n 'impulseClipDuration',\n ];\n\n for (const key of numericKeys) {\n const value = hairConfig[key];\n if (value !== undefined) {\n (runtimeConfig as Record<string, unknown>)[key] = value;\n }\n }\n\n if (hairConfig.direction) {\n runtimeConfig.direction = { ...hairConfig.direction } as HairPhysicsDirectionConfig;\n }\n\n if (hairConfig.morphTargets) {\n const morphTargets: Partial<HairMorphTargets> = {};\n if (hairConfig.morphTargets.swayLeft) morphTargets.swayLeft = hairConfig.morphTargets.swayLeft.key;\n if (hairConfig.morphTargets.swayRight) morphTargets.swayRight = hairConfig.morphTargets.swayRight.key;\n if (hairConfig.morphTargets.swayFront) morphTargets.swayFront = hairConfig.morphTargets.swayFront.key;\n if (hairConfig.morphTargets.fluffRight) morphTargets.fluffRight = hairConfig.morphTargets.fluffRight.key;\n if (hairConfig.morphTargets.fluffBottom) morphTargets.fluffBottom = hairConfig.morphTargets.fluffBottom.key;\n\n if (hairConfig.morphTargets.headUp) {\n const headUp: Record<string, number> = {};\n for (const [key, value] of Object.entries(hairConfig.morphTargets.headUp)) {\n if (value && typeof value.value === 'number') {\n headUp[key] = value.value;\n }\n }\n if (Object.keys(headUp).length > 0) morphTargets.headUp = headUp;\n }\n\n if (hairConfig.morphTargets.headDown) {\n const headDown: Record<string, number> = {};\n for (const [key, value] of Object.entries(hairConfig.morphTargets.headDown)) {\n if (value && typeof value.value === 'number') {\n headDown[key] = value.value;\n }\n }\n if (Object.keys(headDown).length > 0) morphTargets.headDown = headDown;\n }\n\n if (Object.keys(morphTargets).length > 0) {\n runtimeConfig.morphTargets = morphTargets as HairMorphTargets;\n }\n }\n\n this.setHairPhysicsConfig(runtimeConfig);\n if (hairConfig.enabled !== undefined) {\n this.setHairPhysicsEnabled(Boolean(hairConfig.enabled));\n }\n }\n\n setHairPhysicsConfig(config: HairPhysicsConfigUpdate): void {\n const direction = config.direction\n ? { ...this.hairPhysicsConfig.direction, ...config.direction }\n : this.hairPhysicsConfig.direction;\n\n const morphTargets = config.morphTargets\n ? {\n ...this.hairPhysicsConfig.morphTargets,\n ...config.morphTargets,\n headUp: {\n ...this.hairPhysicsConfig.morphTargets.headUp,\n ...(config.morphTargets.headUp ?? {}),\n },\n headDown: {\n ...this.hairPhysicsConfig.morphTargets.headDown,\n ...(config.morphTargets.headDown ?? {}),\n },\n }\n : this.hairPhysicsConfig.morphTargets;\n\n this.hairPhysicsConfig = { ...this.hairPhysicsConfig, ...config, direction, morphTargets };\n\n const idleKeys: Array<keyof HairPhysicsConfigUpdate> = [\n 'idleSwayAmount',\n 'idleSwaySpeed',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n 'idleClipDuration',\n ];\n const idleChanged = idleKeys.some((key) => config[key] !== undefined);\n const morphTargetsChanged = config.morphTargets !== undefined;\n const directionChanged = config.direction !== undefined;\n\n const impulseKeys: Array<keyof HairPhysicsConfigUpdate> = [\n 'stiffness',\n 'damping',\n 'impulseClipDuration',\n ];\n const impulseChanged = impulseKeys.some((key) => config[key] !== undefined);\n const gravityChanged = morphTargetsChanged;\n\n if (idleChanged || morphTargetsChanged) {\n this.idleClipDirty = true;\n }\n if (impulseChanged || morphTargetsChanged) {\n this.impulseClipDirty = true;\n }\n if (gravityChanged) {\n this.gravityClipDirty = true;\n }\n if (directionChanged) {\n this.hasHeadState = false;\n this.lastHeadHorizontal = 0;\n this.lastHeadVertical = 0;\n }\n\n if (this.hairPhysicsEnabled) {\n if (idleChanged || morphTargetsChanged) this.startIdleClip();\n if (impulseChanged || morphTargetsChanged) this.buildImpulseClips();\n if (gravityChanged) this.startGravityClip();\n }\n if (morphTargetsChanged) {\n this.warnMissingHairMorphTargets();\n }\n }\n\n getHairPhysicsConfig(): HairPhysicsConfig {\n return {\n ...this.hairPhysicsConfig,\n direction: { ...this.hairPhysicsConfig.direction },\n morphTargets: {\n ...this.hairPhysicsConfig.morphTargets,\n headUp: { ...this.hairPhysicsConfig.morphTargets.headUp },\n headDown: { ...this.hairPhysicsConfig.morphTargets.headDown },\n },\n };\n }\n\n validateHairMorphTargets(): string[] {\n const configuredKeys = this.collectConfiguredMorphKeys();\n if (configuredKeys.length === 0) return [];\n\n const availableKeys = this.collectAvailableHairMorphKeys();\n if (availableKeys.size === 0) return [];\n\n return configuredKeys.filter((key) => !availableKeys.has(key));\n }\n\n update(dtSeconds: number): void {\n if (!this.hairPhysicsEnabled) return;\n if (!this.supportsMixerClips()) return;\n }\n\n onHeadRotationChanged(yaw: number, pitch: number): void {\n if (!this.hairPhysicsEnabled) return;\n if (!this.supportsMixerClips()) return;\n this.updateGravityFromHeadPitch(pitch);\n this.triggerHeadImpulse(yaw, pitch);\n }\n\n getHairMorphTargets(meshName?: string): string[] {\n let targetMesh: Mesh | undefined;\n\n if (meshName) {\n targetMesh = this.registeredHairObjects.get(meshName);\n } else {\n const hairMeshNames = this.getHairMeshNames();\n for (const name of hairMeshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n if (mesh) {\n targetMesh = mesh;\n break;\n }\n }\n }\n\n if (!targetMesh) return [];\n\n const dict = targetMesh.morphTargetDictionary;\n if (!dict) return [];\n\n return Object.keys(dict);\n }\n\n private collectConfiguredMorphKeys(): string[] {\n const { morphTargets } = this.hairPhysicsConfig;\n const keys = new Set<string>();\n const addKey = (key?: string) => {\n if (typeof key === 'string' && key.length > 0) keys.add(key);\n };\n\n addKey(morphTargets.swayLeft);\n addKey(morphTargets.swayRight);\n addKey(morphTargets.swayFront);\n addKey(morphTargets.fluffRight);\n addKey(morphTargets.fluffBottom);\n\n if (morphTargets.headUp) {\n Object.keys(morphTargets.headUp).forEach((key) => addKey(key));\n }\n if (morphTargets.headDown) {\n Object.keys(morphTargets.headDown).forEach((key) => addKey(key));\n }\n\n return Array.from(keys);\n }\n\n private collectAvailableHairMorphKeys(): Set<string> {\n const available = new Set<string>();\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) return available;\n\n for (const name of hairMeshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n const dict = mesh?.morphTargetDictionary;\n if (!dict) continue;\n for (const key of Object.keys(dict)) {\n available.add(key);\n }\n }\n\n return available;\n }\n\n private warnMissingHairMorphTargets(): void {\n const missing = this.validateHairMorphTargets();\n if (missing.length === 0) return;\n\n for (const key of missing) {\n if (this.warnedMissingMorphTargets.has(key)) continue;\n this.warnedMissingMorphTargets.add(key);\n console.warn(`[Embody] Hair physics morph \"${key}\" not found on registered hair meshes.`);\n }\n }\n\n setMorphOnMeshes(meshNames: string[], morphKey: string, value: number): void {\n const val = clamp01(value);\n for (const name of meshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n if (!mesh) continue;\n\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n\n const idx = dict[morphKey];\n if (idx !== undefined) {\n infl[idx] = val;\n }\n }\n }\n\n applyHairStateToObject(objectName: string, state: {\n color?: { baseColor: string; emissive: string; emissiveIntensity: number };\n outline?: { show: boolean; color: string; opacity: number };\n visible?: boolean;\n scale?: { x: number; y: number; z: number };\n position?: { x: number; y: number; z: number };\n isEyebrow?: boolean;\n }): void {\n const mesh = this.registeredHairObjects.get(objectName);\n if (!mesh) return;\n\n const obj = mesh;\n\n if (state.visible !== undefined) {\n obj.visible = state.visible;\n }\n\n if (state.scale) {\n obj.scale.set(state.scale.x, state.scale.y, state.scale.z);\n }\n\n if (state.position) {\n obj.position.set(state.position.x, state.position.y, state.position.z);\n }\n\n if (state.color && obj.material && !Array.isArray(obj.material)) {\n const mat = obj.material as typeof obj.material & {\n color?: { set(value: string): void };\n emissive?: { set(value: string): void };\n emissiveIntensity?: number;\n };\n if (mat.color) {\n mat.color.set(state.color.baseColor);\n }\n if (mat.emissive !== undefined) {\n mat.emissive.set(state.color.emissive);\n mat.emissiveIntensity = state.color.emissiveIntensity;\n }\n mat.needsUpdate = true;\n }\n }\n\n private getHairMeshNames(): string[] {\n if (this.cachedHairMeshNames) return this.cachedHairMeshNames;\n\n if (typeof this.host.getSelectedHairMeshNames === 'function') {\n const selectedHairMeshNames = this.host.getSelectedHairMeshNames() || [];\n const resolved = selectedHairMeshNames.filter((name) => {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n return !!mesh;\n });\n this.cachedHairMeshNames = Array.from(new Set(resolved));\n return this.cachedHairMeshNames;\n }\n\n const names: string[] = [];\n this.registeredHairObjects.forEach((mesh, name) => {\n const info = CC4_MESHES[name];\n if (info?.category === 'hair') {\n names.push(name);\n } else if (info?.category !== 'eyebrow') {\n const dict = mesh.morphTargetDictionary;\n if (dict && ('L_Hair_Left' in dict || 'L_Hair_Right' in dict || 'L_Hair_Front' in dict)) {\n names.push(name);\n }\n }\n });\n this.cachedHairMeshNames = names;\n return names;\n }\n\n refreshMeshSelection(): void {\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n }\n\n private supportsMixerClips(): boolean {\n return typeof this.host.buildClip === 'function';\n }\n\n private startIdleClip(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const cfg = this.hairPhysicsConfig;\n const hasWind = cfg.windStrength > 0;\n const hasIdle = cfg.idleSwayAmount > 0;\n if (!hasWind && !hasIdle) {\n this.stopIdleClip();\n this.idleClipDirty = false;\n return;\n }\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopIdleClip();\n this.idleClipDirty = false;\n return;\n }\n\n if (!this.idleClipDirty && this.idleClipHandle) return;\n\n this.stopIdleClip();\n\n const duration = Math.max(0.5, cfg.idleClipDuration);\n const curves = this.buildIdleWindCurves(duration);\n const handle = this.host.buildClip?.(this.idleClipName, curves, {\n loop: true,\n loopMode: 'repeat',\n meshNames: hairMeshNames,\n });\n\n if (!handle) return;\n\n handle.setWeight?.(1);\n this.idleClipHandle = handle;\n this.idleClipDirty = false;\n }\n\n private startGravityClip(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopGravityClip();\n this.gravityClipDirty = false;\n return;\n }\n\n if (!this.gravityClipDirty && this.gravityClipHandle) return;\n\n this.stopGravityClip();\n\n const curves = this.buildGravityCurves();\n if (Object.keys(curves).length === 0) return;\n\n const handle = this.host.buildClip?.(this.gravityClipName, curves, {\n loop: false,\n loopMode: 'once',\n meshNames: hairMeshNames,\n });\n\n if (!handle) return;\n\n handle.setWeight?.(1);\n handle.pause();\n handle.setTime?.(0.5);\n this.gravityClipHandle = handle;\n this.gravityClipDirty = false;\n }\n\n private stopIdleClip(): void {\n if (this.idleClipHandle) {\n const clipName = this.idleClipHandle.clipName;\n this.idleClipHandle.stop();\n this.host.cleanupSnippet?.(clipName);\n this.idleClipHandle = null;\n } else {\n this.host.cleanupSnippet?.(this.idleClipName);\n }\n }\n\n private stopGravityClip(): void {\n if (this.gravityClipHandle) {\n const clipName = this.gravityClipHandle.clipName;\n this.gravityClipHandle.stop();\n this.host.cleanupSnippet?.(clipName);\n this.gravityClipHandle = null;\n } else {\n this.host.cleanupSnippet?.(this.gravityClipName);\n }\n }\n\n private buildImpulseClips(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopImpulseClips();\n this.impulseClipDirty = false;\n return;\n }\n\n if (!this.impulseClipDirty && this.impulseClips.left && this.impulseClips.right && this.impulseClips.front) {\n return;\n }\n\n this.stopImpulseClips();\n\n const duration = Math.max(0.25, this.hairPhysicsConfig.impulseClipDuration);\n const options: ClipOptions = {\n loop: false,\n loopMode: 'once',\n meshNames: hairMeshNames,\n };\n\n const leftHandle = this.host.buildClip?.(\n this.impulseClipNames.left,\n this.buildImpulseCurves(duration, 1, 0),\n options\n );\n const rightHandle = this.host.buildClip?.(\n this.impulseClipNames.right,\n this.buildImpulseCurves(duration, -1, 0),\n options\n );\n const frontHandle = this.host.buildClip?.(\n this.impulseClipNames.front,\n this.buildImpulseCurves(duration, 0, 1),\n options\n );\n\n const primeHandle = (handle: ClipHandle | null | undefined) => {\n if (!handle) return;\n handle.setWeight?.(0);\n handle.pause();\n handle.setTime?.(0);\n };\n\n primeHandle(leftHandle);\n primeHandle(rightHandle);\n primeHandle(frontHandle);\n\n this.impulseClips = {\n left: leftHandle ?? undefined,\n right: rightHandle ?? undefined,\n front: frontHandle ?? undefined,\n };\n this.impulseClipDirty = false;\n }\n\n private stopImpulseClips(): void {\n this.clearImpulseTimers();\n const handles = Object.values(this.impulseClips);\n for (const handle of handles) {\n if (!handle) continue;\n const clipName = handle.clipName;\n handle.stop();\n this.host.cleanupSnippet?.(clipName);\n }\n this.impulseClips = {};\n }\n\n private clearImpulseTimers(slot?: 'left' | 'right' | 'front'): void {\n const slots: Array<'left' | 'right' | 'front'> = slot ? [slot] : ['left', 'right', 'front'];\n for (const key of slots) {\n const endTimer = this.impulseEndTimers[key];\n if (endTimer) {\n clearTimeout(endTimer);\n delete this.impulseEndTimers[key];\n }\n const steps = this.impulseFadeSteps[key];\n if (steps && steps.length > 0) {\n steps.forEach((t) => clearTimeout(t));\n delete this.impulseFadeSteps[key];\n }\n }\n }\n\n private triggerHeadImpulse(headYaw: number, headPitch: number): void {\n const cfg = this.hairPhysicsConfig;\n const signedYaw = headYaw * cfg.direction.yawSign;\n const signedPitch = headPitch * cfg.direction.pitchSign;\n const horizontal = signedYaw * cfg.inertia * cfg.responseScale;\n const vertical = signedPitch * cfg.gravity * 0.25 * cfg.responseScale;\n\n if (!this.hasHeadState) {\n this.hasHeadState = true;\n this.lastHeadHorizontal = horizontal;\n this.lastHeadVertical = vertical;\n return;\n }\n\n const deltaHorizontal = horizontal - this.lastHeadHorizontal;\n const deltaVertical = vertical - this.lastHeadVertical;\n this.lastHeadHorizontal = horizontal;\n this.lastHeadVertical = vertical;\n\n const leftWeight = clamp01(deltaHorizontal > 0 ? deltaHorizontal : 0);\n const rightWeight = clamp01(deltaHorizontal < 0 ? -deltaHorizontal : 0);\n const frontWeight = clamp01(deltaVertical > 0 ? deltaVertical : 0);\n const minTrigger = 0.01;\n\n if (leftWeight <= minTrigger && rightWeight <= minTrigger && frontWeight <= minTrigger) return;\n\n if (this.impulseClipDirty) {\n this.buildImpulseClips();\n }\n\n if (leftWeight > minTrigger) this.playImpulseClip('left', leftWeight);\n if (rightWeight > minTrigger) this.playImpulseClip('right', rightWeight);\n if (frontWeight > minTrigger) this.playImpulseClip('front', frontWeight);\n }\n\n private updateGravityFromHeadPitch(headPitch: number): void {\n if (!this.gravityClipHandle || this.gravityClipDirty) {\n this.startGravityClip();\n }\n if (!this.gravityClipHandle) return;\n\n const signedPitch = headPitch * this.hairPhysicsConfig.direction.pitchSign;\n const clampedPitch = Math.max(-1, Math.min(1, signedPitch));\n const normalized = (clampedPitch + 1) / 2;\n const duration = this.gravityClipHandle.getDuration?.() ?? 1;\n this.gravityClipHandle.setTime?.(normalized * duration);\n }\n\n private playImpulseClip(slot: 'left' | 'right' | 'front', weight: number): void {\n const handle = this.impulseClips[slot];\n if (!handle) return;\n this.clearImpulseTimers(slot);\n handle.setWeight?.(weight);\n handle.play();\n const durationSec = handle.getDuration?.() ?? this.hairPhysicsConfig.impulseClipDuration;\n const durationMs = Math.max(0, durationSec) * 1000;\n const fadeMs = Math.max(80, Math.min(350, durationMs * 0.2));\n this.impulseEndTimers[slot] = setTimeout(() => {\n this.fadeImpulseClip(slot, weight, fadeMs);\n }, durationMs);\n }\n\n private fadeImpulseClip(slot: 'left' | 'right' | 'front', startWeight: number, fadeMs: number): void {\n const handle = this.impulseClips[slot];\n if (!handle) return;\n if (fadeMs <= 0) {\n handle.setWeight?.(0);\n handle.pause();\n handle.setTime?.(0);\n return;\n }\n\n const steps = 6;\n const stepMs = fadeMs / steps;\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n for (let i = 1; i <= steps; i += 1) {\n const timer = setTimeout(() => {\n const nextWeight = startWeight * (1 - i / steps);\n handle.setWeight?.(nextWeight);\n if (i === steps) {\n handle.pause();\n handle.setTime?.(0);\n }\n }, stepMs * i);\n timers.push(timer);\n }\n\n this.impulseFadeSteps[slot] = timers;\n }\n\n private buildIdleWindCurves(durationSec: number): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_idle_curves(JSON.stringify(this.hairCurveConfigJson()), durationSec)\n ) as CurvesMap;\n }\n\n private buildImpulseCurves(durationSec: number, horizontal: number, vertical: number): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_impulse_curves(\n JSON.stringify(this.hairCurveConfigJson()),\n durationSec,\n horizontal,\n vertical\n )\n ) as CurvesMap;\n }\n\n private buildGravityCurves(): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_gravity_curves(JSON.stringify(this.hairCurveConfigJson()))\n ) as CurvesMap;\n }\n\n private hairCurveConfigJson() {\n const cfg = this.hairPhysicsConfig;\n return {\n idleSwayAmount: cfg.idleSwayAmount,\n idleSwaySpeed: cfg.idleSwaySpeed,\n windStrength: cfg.windStrength,\n windDirectionX: cfg.windDirectionX,\n windDirectionZ: cfg.windDirectionZ,\n windTurbulence: cfg.windTurbulence,\n windFrequency: cfg.windFrequency,\n stiffness: cfg.stiffness,\n damping: cfg.damping,\n morphTargets: cfg.morphTargets,\n };\n }\n\n}\n","import type { Profile } from './types';\nimport { initEmbodyCore } from '../wasm';\nimport type { EmbodyCoreWasmModule } from '../wasmTypes';\n\n/**\n * Extend a base preset with a profile extension.\n *\n * Implemented by the Rust Wasm core.\n *\n * Rules:\n * - Scalars: extension wins when provided.\n * - Maps: shallow-merged by key, values cloned.\n * - Mesh entries: merged by mesh name, including nested material settings.\n * - Arrays: replaced when the extension provides them (except annotationRegions).\n * - annotationRegions: merged by region name, with nested camera/style fields preserved.\n */\nexport function mergePresetWithProfile(\n core: EmbodyCoreWasmModule,\n base: Profile,\n extension?: Partial<Profile>\n): Profile {\n if (!extension) {\n return base;\n }\n\n return JSON.parse(\n core.merge_preset_profile(JSON.stringify(base), JSON.stringify(extension))\n ) as Profile;\n}\n\n/** Resolve a preset/profile pair through this package entry's Wasm loader. */\nexport async function extendPresetWithProfile(\n base: Profile,\n extension?: Partial<Profile>\n): Promise<Profile> {\n return mergePresetWithProfile(await initEmbodyCore(), base, extension);\n}\n","/**\n * Betta Fish Preset - Skeletal Animation Mappings\n *\n * Bone mappings for the betta fish model from Sketchfab.\n * This fish has 53 bones and 1 embedded animation (\"Take 01\" swimming).\n * No morph targets/blend shapes - all animation is skeletal.\n *\n * Bone structure (inferred from hierarchy):\n * - Armature_rootJoint: Root\n * - Bone_Armature: Main body root\n * - Bone.001_Armature: Head/Front body\n * - Bone.009-017: Likely eyes/gills area (left/right symmetry)\n * - Bone.002_Armature: Body spine chain\n * - Bone.003 → 004 → 005: Body to tail\n * - Bone.018-045: Tail fins (multiple branching chains)\n * - Bone.046/047: Pectoral fins (left/right)\n * - Bone.006_Armature: Dorsal fin area\n * - Bone.007/008: Dorsal fin bones\n */\n\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\nimport type { AnnotationRegion, MeshInfo, MeshCategory, Profile } from '../mappings/types';\nimport { checkBindingsForLeftRight } from './cc4';\n\n// ============================================================================\n// BONE NAMES - All 53 bones in the fish skeleton\n// Note: Bone names in the GLTF use dots (e.g., \"Bone.001_Armature\")\n// ============================================================================\n\nexport const BONES = [\n \"Armature_rootJoint\",\n \"Bone_Armature\",\n \"Bone.001_Armature\",\n \"Bone.009_Armature\",\n \"Bone.027_Armature\",\n \"Bone.029_Armature\",\n \"Bone.031_Armature\",\n \"Bone.028_Armature\",\n \"Bone.030_Armature\",\n \"Bone.032_Armature\",\n \"Bone.010_Armature\",\n \"Bone.012_Armature\",\n \"Bone.014_Armature\",\n \"Bone.016_Armature\",\n \"Bone.011_Armature\",\n \"Bone.013_Armature\",\n \"Bone.015_Armature\",\n \"Bone.017_Armature\",\n \"Bone.002_Armature\",\n \"Bone.003_Armature\",\n \"Bone.004_Armature\",\n \"Bone.005_Armature\",\n \"Bone.020_Armature\",\n \"Bone.025_Armature\",\n \"Bone.026_Armature\",\n \"Bone.039_Armature\",\n \"Bone.040_Armature\",\n \"Bone.041_Armature\",\n \"Bone.042_Armature\",\n \"Bone.043_Armature\",\n \"Bone.044_Armature\",\n \"Bone.045_Armature\",\n \"Bone.019_Armature\",\n \"Bone.023_Armature\",\n \"Bone.024_Armature\",\n \"Bone.034_Armature\",\n \"Bone.036_Armature\",\n \"Bone.038_Armature\",\n \"Bone.018_Armature\",\n \"Bone.021_Armature\",\n \"Bone.022_Armature\",\n \"Bone.033_Armature\",\n \"Bone.035_Armature\",\n \"Bone.037_Armature\",\n \"Bone.046_Armature\",\n \"Bone.048_Armature\",\n \"Bone.050_Armature\",\n \"Bone.047_Armature\",\n \"Bone.049_Armature\",\n \"Bone.051_Armature\",\n \"Bone.006_Armature\",\n \"Bone.007_Armature\",\n \"Bone.008_Armature\"\n] as const;\n\n// ============================================================================\n// BONE NAME CONFIGURATION\n// Uses prefix/suffix system: 'Bone.' + baseNumber + '_Armature' = 'Bone.001_Armature'\n// ============================================================================\n\nexport const BONE_PREFIX = 'Bone.';\nexport const BONE_SUFFIX = '_Armature';\n\n// ============================================================================\n// SEMANTIC BONE MAPPINGS - Human-readable names for key bones\n// Uses base names that get combined with prefix/suffix\n// Exception: ROOT, BODY_ROOT, and EYE nodes use full names (don't follow pattern)\n// ============================================================================\n\nexport const BONE_NODES = {\n // Root bones (special - don't use prefix/suffix)\n ROOT: 'Armature_rootJoint',\n BODY_ROOT: 'Bone_Armature',\n\n // Head and body (use base names)\n HEAD: '001',\n BODY_FRONT: '002',\n BODY_MID: '003',\n BODY_BACK: '004',\n TAIL_BASE: '005',\n\n // Gills - bilateral (even = left, odd = right)\n GILL_L: '046',\n GILL_L_MID: '048',\n GILL_L_TIP: '050',\n GILL_R: '047',\n GILL_R_MID: '049',\n GILL_R_TIP: '051',\n\n // Dorsal fin (top fin)\n DORSAL_ROOT: '006',\n DORSAL_L: '007',\n DORSAL_R: '008',\n\n // Ventral fins (belly fins)\n VENTRAL_L: '018',\n VENTRAL_L_MID: '021',\n VENTRAL_L_TIP: '022',\n VENTRAL_R: '033',\n VENTRAL_R_MID: '035',\n VENTRAL_R_TIP: '037',\n\n // Pectoral fins - left side chain\n PECTORAL_L_ROOT: '009',\n PECTORAL_L_CHAIN1: '027',\n PECTORAL_L_CHAIN1_MID: '029',\n PECTORAL_L_CHAIN1_TIP: '031',\n PECTORAL_L_CHAIN2: '028',\n PECTORAL_L_CHAIN2_MID: '030',\n PECTORAL_L_CHAIN2_TIP: '032',\n\n // Pectoral fins - right side chain\n PECTORAL_R_ROOT: '010',\n PECTORAL_R_CHAIN1: '012',\n PECTORAL_R_CHAIN1_A: '014',\n PECTORAL_R_CHAIN1_B: '016',\n PECTORAL_R_ROOT2: '011',\n PECTORAL_R_CHAIN2: '013',\n PECTORAL_R_CHAIN2_A: '015',\n PECTORAL_R_CHAIN2_B: '017',\n\n // Eyes (special - mesh name, not bone)\n EYE_L: 'EYES_0',\n EYE_R: 'EYES_0',\n\n // Main tail fins\n TAIL_TOP: '020',\n TAIL_TOP_MID: '025',\n TAIL_TOP_TIP: '026',\n TAIL_MID: '039',\n TAIL_MID_A: '040',\n TAIL_MID_A_TIP: '041',\n TAIL_MID_B: '042',\n TAIL_MID_B_TIP: '043',\n TAIL_MID_C: '044',\n TAIL_MID_C_TIP: '045',\n\n // Side tail chains\n TAIL_SIDE_L: '019',\n TAIL_SIDE_L_MID: '023',\n TAIL_SIDE_L_TIP: '024',\n TAIL_SIDE_R: '034',\n TAIL_SIDE_R_MID: '036',\n TAIL_SIDE_R_TIP: '038',\n} as const;\n\n// ============================================================================\n// AU ID CONSTANTS - Fish \"Action Units\" (analogous to FACS AUs for humans)\n// These use plain numbers like CC4 preset - no special fish-specific types\n// ============================================================================\n\n// Body orientation (AU 2-7)\n// 2 = Turn Left, 3 = Turn Right\n// 4 = Pitch Up, 5 = Pitch Down\n// 6 = Roll Left, 7 = Roll Right\n\n// Tail movements (AU 12-15)\n// 12 = Tail Sweep Left, 13 = Tail Sweep Right\n// 14 = Tail Fin Spread, 15 = Tail Fin Close\n\n// Pectoral fins (AU 20-27)\n// 20 = Pectoral L Up, 21 = Pectoral L Down\n// 22 = Pectoral R Up, 23 = Pectoral R Down\n// 24 = Pectoral L Forward, 25 = Pectoral L Back\n// 26 = Pectoral R Forward, 27 = Pectoral R Back\n\n// Ventral fins (AU 30-33)\n// 30 = Ventral L Up, 31 = Ventral L Down\n// 32 = Ventral R Up, 33 = Ventral R Down\n\n// Head (AU 51-54, matching FACS standard)\n// 51 = Head Turn Left, 52 = Head Turn Right\n// 53 = Head Up, 54 = Head Down\n// (AU 55/56 Head Tilt removed - fish don't have this motion)\n\n// Gills (AU 45-46) - separate L/R, single AU per side (0=closed, 1=flared)\n// 45 = Gill L, 46 = Gill R\n\n// Eye rotation (AU 61-64, like human FACS)\n// 61 = Eyes Left, 62 = Eyes Right\n// 63 = Eyes Up, 64 = Eyes Down\n\n// ============================================================================\n// BONE BINDINGS - Map AU IDs to bone rotations\n// ============================================================================\n\nexport const BONE_BINDINGS: Record<number, BoneBinding[]> = {\n // ========== BODY ORIENTATION (AU 2-7) ==========\n // AU 2: Turn Left\n 2: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: 1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n // AU 3: Turn Right\n 3: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: -1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n // AU 4: Pitch Up\n 4: [\n { node: 'HEAD', channel: 'rx', scale: -1, maxDegrees: 20 },\n { node: 'BODY_FRONT', channel: 'rx', scale: -1, maxDegrees: 5 },\n ],\n // AU 5: Pitch Down\n 5: [\n { node: 'HEAD', channel: 'rx', scale: 1, maxDegrees: 20 },\n { node: 'BODY_FRONT', channel: 'rx', scale: 1, maxDegrees: 5 },\n ],\n // AU 6: Roll Left\n 6: [\n { node: 'BODY_ROOT', channel: 'rz', scale: -1, maxDegrees: 25 },\n ],\n // AU 7: Roll Right\n 7: [\n { node: 'BODY_ROOT', channel: 'rz', scale: 1, maxDegrees: 25 },\n ],\n\n // ========== TAIL (AU 12-15) ==========\n // Tail sweep uses rz (roll axis) to sweep left/right in fish's local space\n // AU 12: Tail Sweep Left\n 12: [\n { node: 'BODY_BACK', channel: 'rz', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_BASE', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'TAIL_TOP', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'TAIL_MID', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 13: Tail Sweep Right\n 13: [\n { node: 'BODY_BACK', channel: 'rz', scale: -1, maxDegrees: 15 },\n { node: 'TAIL_BASE', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'TAIL_TOP', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'TAIL_MID', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n // Tail fin spread/close (fan motion)\n // AU 14: Tail Fin Spread\n 14: [\n { node: 'TAIL_TOP', channel: 'rx', scale: -1, maxDegrees: 20 },\n { node: 'TAIL_SIDE_L', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_SIDE_R', channel: 'rx', scale: -1, maxDegrees: 15 },\n ],\n // AU 15: Tail Fin Close\n 15: [\n { node: 'TAIL_TOP', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_SIDE_L', channel: 'rx', scale: -1, maxDegrees: 12 },\n { node: 'TAIL_SIDE_R', channel: 'rx', scale: 1, maxDegrees: 12 },\n ],\n\n // ========== PECTORAL FINS (AU 20-27, front/head fins) ==========\n // These are the decorative fins attached to the head (bones 009-017)\n // AU 20: Pectoral L Up\n 20: [\n { node: 'PECTORAL_L_ROOT', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'PECTORAL_L_CHAIN1', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'PECTORAL_L_CHAIN2', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 21: Pectoral L Down\n 21: [\n { node: 'PECTORAL_L_ROOT', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'PECTORAL_L_CHAIN1', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'PECTORAL_L_CHAIN2', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n // AU 22: Pectoral R Up\n 22: [\n { node: 'PECTORAL_R_ROOT', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'PECTORAL_R_CHAIN1', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'PECTORAL_R_ROOT2', channel: 'rz', scale: -1, maxDegrees: 40 },\n ],\n // AU 23: Pectoral R Down\n 23: [\n { node: 'PECTORAL_R_ROOT', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'PECTORAL_R_CHAIN1', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'PECTORAL_R_ROOT2', channel: 'rz', scale: 1, maxDegrees: 40 },\n ],\n // AU 24: Pectoral L Forward\n 24: [\n { node: 'PECTORAL_L_ROOT', channel: 'ry', scale: 1, maxDegrees: 30 },\n ],\n // AU 25: Pectoral L Back\n 25: [\n { node: 'PECTORAL_L_ROOT', channel: 'ry', scale: -1, maxDegrees: 30 },\n ],\n // AU 26: Pectoral R Forward\n 26: [\n { node: 'PECTORAL_R_ROOT', channel: 'ry', scale: -1, maxDegrees: 30 },\n ],\n // AU 27: Pectoral R Back\n 27: [\n { node: 'PECTORAL_R_ROOT', channel: 'ry', scale: 1, maxDegrees: 30 },\n ],\n\n // ========== VENTRAL FINS (AU 30-33, belly fins) ==========\n // AU 30: Ventral L Up\n 30: [\n { node: 'VENTRAL_L', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'VENTRAL_L_MID', channel: 'rz', scale: 1, maxDegrees: 15 },\n ],\n // AU 31: Ventral L Down\n 31: [\n { node: 'VENTRAL_L', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'VENTRAL_L_MID', channel: 'rz', scale: -1, maxDegrees: 15 },\n ],\n // AU 32: Ventral R Up\n 32: [\n { node: 'VENTRAL_R', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'VENTRAL_R_MID', channel: 'rz', scale: -1, maxDegrees: 15 },\n ],\n // AU 33: Ventral R Down\n 33: [\n { node: 'VENTRAL_R', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'VENTRAL_R_MID', channel: 'rz', scale: 1, maxDegrees: 15 },\n ],\n\n // ========== GILLS (AU 45-46, separate L/R - 0=closed, 1=flared) ==========\n // AU 45: Gill L\n 45: [\n { node: 'GILL_L', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'GILL_L_MID', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 46: Gill R\n 46: [\n { node: 'GILL_R', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'GILL_R_MID', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n\n // ========== HEAD (AU 51-56, matching FACS standard) ==========\n // AU 51: Head Turn Left\n 51: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: 1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n // AU 52: Head Turn Right\n 52: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: -1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n // AU 53: Head Up\n 53: [\n { node: 'DORSAL_ROOT', channel: 'rx', scale: -1, maxDegrees: 25 },\n { node: 'DORSAL_L', channel: 'rx', scale: -1, maxDegrees: 15 },\n { node: 'DORSAL_R', channel: 'rx', scale: -1, maxDegrees: 15 },\n ],\n // AU 54: Head Down\n 54: [\n { node: 'DORSAL_ROOT', channel: 'rx', scale: 1, maxDegrees: 25 },\n { node: 'DORSAL_L', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'DORSAL_R', channel: 'rx', scale: 1, maxDegrees: 15 },\n ],\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // ========== EYES (AU 61-64, rotate the EYES_0 mesh) ==========\n // Fish has a single combined eyes mesh - both eyes rotate together\n // AU 61: Eyes Left\n 61: [\n { node: 'EYE_L', channel: 'ry', scale: 1, maxDegrees: 25 }, // Look left (yaw)\n ],\n // AU 62: Eyes Right\n 62: [\n { node: 'EYE_L', channel: 'ry', scale: -1, maxDegrees: 25 }, // Look right (yaw)\n ],\n // AU 63: Eyes Up\n 63: [\n { node: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 20 }, // Look up (pitch)\n ],\n // AU 64: Eyes Down\n 64: [\n { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 20 }, // Look down (pitch)\n ],\n};\n\n// ============================================================================\n// FISH AU INFO - Metadata for each action (compatible with loomlarge AUInfo)\n// facePart is used to group controls in the UI\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Body Orientation\n '2': { id: '2', name: 'Turn Left', facePart: 'Body Orientation', muscularBasis: 'Myomere muscles', links: ['https://en.wikipedia.org/wiki/Myomere'] },\n '3': { id: '3', name: 'Turn Right', facePart: 'Body Orientation', muscularBasis: 'Myomere muscles', links: ['https://en.wikipedia.org/wiki/Myomere'] },\n '4': { id: '4', name: 'Pitch Up', facePart: 'Body Orientation', muscularBasis: 'Epaxial muscles', links: ['https://en.wikipedia.org/wiki/Epaxial_muscles'] },\n '5': { id: '5', name: 'Pitch Down', facePart: 'Body Orientation', muscularBasis: 'Hypaxial muscles', links: ['https://en.wikipedia.org/wiki/Hypaxial_muscles'] },\n '6': { id: '6', name: 'Roll Left', facePart: 'Body Orientation', muscularBasis: 'Lateral body muscles', links: ['https://en.wikipedia.org/wiki/Fish_locomotion'] },\n '7': { id: '7', name: 'Roll Right', facePart: 'Body Orientation', muscularBasis: 'Lateral body muscles', links: ['https://en.wikipedia.org/wiki/Fish_locomotion'] },\n\n // Tail (Caudal fin)\n '12': { id: '12', name: 'Tail Sweep Left', facePart: 'Caudal Fin', muscularBasis: 'Caudal fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '13': { id: '13', name: 'Tail Sweep Right', facePart: 'Caudal Fin', muscularBasis: 'Caudal fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '14': { id: '14', name: 'Tail Fin Spread', facePart: 'Caudal Fin', muscularBasis: 'Fin ray muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '15': { id: '15', name: 'Tail Fin Close', facePart: 'Caudal Fin', muscularBasis: 'Fin ray muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n\n // Pectoral Fins (side fins for steering and braking)\n '20': { id: '20', name: 'Pectoral L Up', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '21': { id: '21', name: 'Pectoral L Down', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '22': { id: '22', name: 'Pectoral R Up', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '23': { id: '23', name: 'Pectoral R Down', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '24': { id: '24', name: 'Pectoral L Forward', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '25': { id: '25', name: 'Pectoral L Back', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '26': { id: '26', name: 'Pectoral R Forward', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '27': { id: '27', name: 'Pectoral R Back', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n\n // Ventral/Pelvic Fins (belly fins for stability)\n '30': { id: '30', name: 'Ventral L Up', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '31': { id: '31', name: 'Ventral L Down', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '32': { id: '32', name: 'Ventral R Up', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '33': { id: '33', name: 'Ventral R Down', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n\n // Gills (separate L/R - single AU per side, 0=closed, 1=flared)\n '45': { id: '45', name: 'Gill L', facePart: 'Gills', muscularBasis: 'Opercular muscles', links: ['https://en.wikipedia.org/wiki/Operculum_(fish)'] },\n '46': { id: '46', name: 'Gill R', facePart: 'Gills', muscularBasis: 'Opercular muscles', links: ['https://en.wikipedia.org/wiki/Operculum_(fish)'] },\n\n // Head (AU 51-56, matching FACS standard)\n '51': { id: '51', name: 'Head Turn Left', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '52': { id: '52', name: 'Head Turn Right', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '53': { id: '53', name: 'Head Up', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '54': { id: '54', name: 'Head Down', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // Eye movement (similar to human AU 61-64)\n '61': { id: '61', name: 'Eyes Left', facePart: 'Eyes', muscularBasis: 'Extraocular muscles', links: ['https://en.wikipedia.org/wiki/Extraocular_muscles'] },\n '62': { id: '62', name: 'Eyes Right', facePart: 'Eyes', muscularBasis: 'Extraocular muscles', links: ['https://en.wikipedia.org/wiki/Extraocular_muscles'] },\n '63': { id: '63', name: 'Eyes Up', facePart: 'Eyes', muscularBasis: 'Superior rectus', links: ['https://en.wikipedia.org/wiki/Superior_rectus_muscle'] },\n '64': { id: '64', name: 'Eyes Down', facePart: 'Eyes', muscularBasis: 'Inferior rectus', links: ['https://en.wikipedia.org/wiki/Inferior_rectus_muscle'] },\n};\n\n// ============================================================================\n// CONTINUUM PAIRS - Define which AUs form bidirectional pairs for sliders\n// ============================================================================\n\n/**\n * Continuum pairs - maps AU ID to its partner for bidirectional sliders\n * Format matches loomlarge's CONTINUUM_PAIRS_MAP (animal-agnostic)\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n}> = {\n // Body Orientation (AU 2-7)\n 2: { pairId: 3, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Turn Left ↔ Turn Right\n 3: { pairId: 2, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 5: { pairId: 4, isNegative: true, axis: 'pitch', node: 'HEAD' }, // Pitch Down ↔ Pitch Up\n 4: { pairId: 5, isNegative: false, axis: 'pitch', node: 'HEAD' },\n 6: { pairId: 7, isNegative: true, axis: 'roll', node: 'BODY_ROOT' }, // Roll Left ↔ Roll Right\n 7: { pairId: 6, isNegative: false, axis: 'roll', node: 'BODY_ROOT' },\n\n // Tail (AU 12-15)\n 12: { pairId: 13, isNegative: true, axis: 'roll', node: 'TAIL_BASE' }, // Tail Sweep Left ↔ Right\n 13: { pairId: 12, isNegative: false, axis: 'roll', node: 'TAIL_BASE' },\n 15: { pairId: 14, isNegative: true, axis: 'pitch', node: 'TAIL_TOP' }, // Tail Fin Close ↔ Spread\n 14: { pairId: 15, isNegative: false, axis: 'pitch', node: 'TAIL_TOP' },\n\n // Pectoral Fins (AU 20-27)\n 21: { pairId: 20, isNegative: true, axis: 'roll', node: 'PECTORAL_L_ROOT' }, // Pectoral L Down ↔ Up\n 20: { pairId: 21, isNegative: false, axis: 'roll', node: 'PECTORAL_L_ROOT' },\n 25: { pairId: 24, isNegative: true, axis: 'yaw', node: 'PECTORAL_L_ROOT' }, // Pectoral L Back ↔ Forward\n 24: { pairId: 25, isNegative: false, axis: 'yaw', node: 'PECTORAL_L_ROOT' },\n 23: { pairId: 22, isNegative: true, axis: 'roll', node: 'PECTORAL_R_ROOT' }, // Pectoral R Down ↔ Up\n 22: { pairId: 23, isNegative: false, axis: 'roll', node: 'PECTORAL_R_ROOT' },\n 27: { pairId: 26, isNegative: true, axis: 'yaw', node: 'PECTORAL_R_ROOT' }, // Pectoral R Back ↔ Forward\n 26: { pairId: 27, isNegative: false, axis: 'yaw', node: 'PECTORAL_R_ROOT' },\n\n // Ventral Fins (AU 30-33)\n 31: { pairId: 30, isNegative: true, axis: 'roll', node: 'VENTRAL_L' }, // Ventral L Down ↔ Up\n 30: { pairId: 31, isNegative: false, axis: 'roll', node: 'VENTRAL_L' },\n 33: { pairId: 32, isNegative: true, axis: 'roll', node: 'VENTRAL_R' }, // Ventral R Down ↔ Up\n 32: { pairId: 33, isNegative: false, axis: 'roll', node: 'VENTRAL_R' },\n\n // Head (AU 51-56, matching FACS standard)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Head Turn Left ↔ Right\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: 'DORSAL_ROOT' }, // Head Down ↔ Up\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: 'DORSAL_ROOT' },\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // Gills (AU 45-46) are NOT in continuum - they're single AUs (0=closed, 1=flared)\n // Each side is independent, not paired opposites\n\n // Eye movement (AU 61-64)\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Eyes Left ↔ Right\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: 'HEAD' }, // Eyes Down ↔ Up\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: 'HEAD' },\n};\n\n/**\n * Build continuum label from AU names.\n * Finds common prefix between AU names and extracts the differing part.\n * E.g. \"Head Turn Left\" + \"Head Turn Right\" → \"Head Turn — Left ↔ Right\"\n */\nfunction buildContinuumLabel(negativeAU: AUInfo, positiveAU: AUInfo): string {\n const negName = negativeAU.name;\n const posName = positiveAU.name;\n\n // Find common prefix (word-level)\n const negWords = negName.split(' ');\n const posWords = posName.split(' ');\n\n let commonPrefixWords: string[] = [];\n for (let i = 0; i < Math.min(negWords.length, posWords.length); i++) {\n if (negWords[i] === posWords[i]) {\n commonPrefixWords.push(negWords[i]);\n } else {\n break;\n }\n }\n\n const prefix = commonPrefixWords.join(' ');\n const negSuffix = negWords.slice(commonPrefixWords.length).join(' ');\n const posSuffix = posWords.slice(commonPrefixWords.length).join(' ');\n\n if (prefix && negSuffix && posSuffix) {\n return `${prefix} — ${negSuffix} ↔ ${posSuffix}`;\n }\n\n // Fallback: just combine the names\n return `${negName} ↔ ${posName}`;\n}\n\n/**\n * Get continuum label for a pair, derived from AU_INFO.\n * No need for a separate CONTINUUM_LABELS object.\n */\nexport function getContinuumLabelForPair(negativeId: number, positiveId: number): string {\n const negAU = AU_INFO[String(negativeId)];\n const posAU = AU_INFO[String(positiveId)];\n\n if (!negAU || !posAU) {\n return `AU ${negativeId} ↔ AU ${positiveId}`;\n }\n\n return buildContinuumLabel(negAU, posAU);\n}\n\n/**\n * Build all continuum labels from AU_INFO and CONTINUUM_PAIRS_MAP.\n * This replaces the need for a manually-maintained CONTINUUM_LABELS object.\n */\nexport function buildContinuumLabels(): Record<string, string> {\n const labels: Record<string, string> = {};\n const seen = new Set<string>();\n\n for (const [auIdStr, info] of Object.entries(CONTINUUM_PAIRS_MAP)) {\n if (info.isNegative) {\n const negId = Number(auIdStr);\n const posId = info.pairId;\n const key = `${negId}-${posId}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n labels[key] = getContinuumLabelForPair(negId, posId);\n }\n }\n }\n\n return labels;\n}\n\n// Build labels dynamically from AU_INFO (no separate CONTINUUM_LABELS needed)\nexport const CONTINUUM_LABELS = buildContinuumLabels();\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Defines how AUs map to bone rotation axes\n// This is required for the engine to properly apply bone rotations\n// Uses plain AU ID numbers (animal-agnostic, like CC4 preset)\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n // ========== HEAD & BODY - Combined entry per node (like CC4) ==========\n // AU 51/52 = Head Turn Left/Right (yaw)\n // AU 53/54 = Head Up/Down (pitch) - note: pitch on HEAD is from body AUs 4/5\n // No head tilt for fish - removed AU 55/56\n {\n node: 'HEAD',\n pitch: { aus: [4, 5], axis: 'rx', negative: 5, positive: 4 }, // Body Pitch Up/Down\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_FRONT',\n pitch: { aus: [4, 5], axis: 'rx', negative: 5, positive: 4 }, // Body Pitch Up/Down\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_MID',\n pitch: null,\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_ROOT',\n pitch: null,\n yaw: null,\n roll: { aus: [6, 7], axis: 'rz', negative: 6, positive: 7 }, // Body Roll Left/Right\n },\n\n // ========== TAIL (AU 12-15) ==========\n // Tail sweep uses rz (roll axis) to sweep left/right in fish's local space\n {\n node: 'TAIL_BASE',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 }, // Tail Sweep Left/Right\n },\n {\n node: 'BODY_BACK',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n {\n node: 'TAIL_TOP',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 }, // Tail Fin Spread/Close\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n {\n node: 'TAIL_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n // Side tail fins for spread/close\n {\n node: 'TAIL_SIDE_L',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 },\n yaw: null,\n roll: null,\n },\n {\n node: 'TAIL_SIDE_R',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 },\n yaw: null,\n roll: null,\n },\n\n // ========== PECTORAL FINS (AU 20-27, head-attached decorative fins) ==========\n {\n node: 'PECTORAL_L_ROOT',\n pitch: null,\n yaw: { aus: [24, 25], axis: 'ry', negative: 25, positive: 24 }, // Pectoral L Forward/Back\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 }, // Pectoral L Up/Down\n },\n {\n node: 'PECTORAL_L_CHAIN1',\n pitch: null,\n yaw: null,\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 },\n },\n {\n node: 'PECTORAL_L_CHAIN2',\n pitch: null,\n yaw: null,\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 },\n },\n {\n node: 'PECTORAL_R_ROOT',\n pitch: null,\n yaw: { aus: [26, 27], axis: 'ry', negative: 27, positive: 26 }, // Pectoral R Forward/Back\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 }, // Pectoral R Up/Down\n },\n {\n node: 'PECTORAL_R_ROOT2',\n pitch: null,\n yaw: null,\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 },\n },\n {\n node: 'PECTORAL_R_CHAIN1',\n pitch: null,\n yaw: null,\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 },\n },\n\n // ========== VENTRAL FINS (AU 30-33, belly fins) ==========\n {\n node: 'VENTRAL_L',\n pitch: null,\n yaw: null,\n roll: { aus: [30, 31], axis: 'rz', negative: 31, positive: 30 }, // Ventral L Up/Down\n },\n {\n node: 'VENTRAL_L_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [30, 31], axis: 'rz', negative: 31, positive: 30 },\n },\n {\n node: 'VENTRAL_R',\n pitch: null,\n yaw: null,\n roll: { aus: [32, 33], axis: 'rz', negative: 33, positive: 32 }, // Ventral R Up/Down\n },\n {\n node: 'VENTRAL_R_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [32, 33], axis: 'rz', negative: 33, positive: 32 },\n },\n\n // ========== DORSAL FIN (AU 53/54 - Head Up/Down via dorsal bones) ==========\n // In this fish model, the dorsal bones control the head's vertical movement\n // No head tilt for fish - AU 55/56 removed\n {\n node: 'DORSAL_ROOT',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 }, // Head Up/Down\n yaw: null,\n roll: null,\n },\n {\n node: 'DORSAL_L',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 },\n yaw: null,\n roll: null,\n },\n {\n node: 'DORSAL_R',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 },\n yaw: null,\n roll: null,\n },\n\n // ========== GILLS (AU 45-46, separate L/R - single AU per side, not continuum) ==========\n // AU 45 controls left side only, AU 46 controls right side only\n // These are intensity-only AUs (0=closed, 1=flared) - no negative partner\n {\n node: 'GILL_L',\n pitch: null,\n yaw: null,\n roll: { aus: [45], axis: 'rz', negative: undefined, positive: 45 }, // Gill L\n },\n {\n node: 'GILL_L_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [45], axis: 'rz', negative: undefined, positive: 45 },\n },\n {\n node: 'GILL_R',\n pitch: null,\n yaw: null,\n roll: { aus: [46], axis: 'rz', negative: undefined, positive: 46 }, // Gill R\n },\n {\n node: 'GILL_R_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [46], axis: 'rz', negative: undefined, positive: 46 },\n },\n\n // ========== EYES (AU 61-64) ==========\n // Single EYES_0 mesh rotates both fish eyes together\n {\n node: 'EYE_L',\n pitch: { aus: [63, 64], axis: 'rx', negative: 64, positive: 63 }, // Eyes Up/Down\n yaw: { aus: [61, 62], axis: 'ry', negative: 62, positive: 61 }, // Eyes Left/Right\n roll: null,\n },\n];\n\n\n// ============================================================================\n// EYE MESH NODES - Fallback for eye rotation when no bone exists\n// Fish has a single combined EYES_0 mesh for both eyes\n// ============================================================================\n\nexport const EYE_MESH_NODES = {\n LEFT: 'EYES_0',\n RIGHT: 'EYES_0', // Same mesh, both eyes rotate together\n} as const;\n\n// ============================================================================\n// MESH SETTINGS - Material settings for fish meshes (depthWrite, blending, etc.)\n// ============================================================================\n\nexport const MESHES: Record<string, MeshInfo> = {\n // Body mesh - main fish body with proper depth and blending\n 'BODY_0': {\n category: 'body' as MeshCategory,\n morphCount: 0, // Fish model has no morphs\n material: {\n renderOrder: 20,\n transparent: true,\n opacity: 1,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n // Eyes mesh - render behind body with proper transparency support\n 'EYES_0': {\n category: 'eye' as MeshCategory,\n morphCount: 0,\n material: {\n renderOrder: 17,\n transparent: true,\n opacity: 1,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n // Hidden helper shell from the source asset; keep it suppressed by default\n // so Betta does not rely on a Firestore-only mesh override.\n 'Cube_0': {\n category: 'body' as MeshCategory,\n morphCount: 0,\n material: {\n renderOrder: -20,\n transparent: true,\n opacity: 0,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n};\n\n// ============================================================================\n// ANNOTATION REGIONS - Camera/marker defaults for the fish preset\n// ============================================================================\n\nexport const ANNOTATION_REGIONS: AnnotationRegion[] = [\n {\n name: 'full_body',\n objects: ['*'],\n paddingFactor: 2.5,\n },\n {\n name: 'head',\n bones: ['HEAD'],\n paddingFactor: 1.8,\n children: ['left_eye', 'right_eye', 'mouth'],\n expandAnimation: 'staggered',\n },\n {\n name: 'left_eye',\n meshes: ['EYES_0'],\n parent: 'head',\n paddingFactor: 1.4,\n cameraAngle: 270,\n },\n {\n name: 'right_eye',\n meshes: ['EYES_0'],\n parent: 'head',\n paddingFactor: 1.4,\n cameraAngle: 90,\n },\n {\n name: 'mouth',\n bones: ['HEAD'],\n parent: 'head',\n paddingFactor: 1.5,\n },\n {\n name: 'body',\n bones: ['BODY_FRONT', 'BODY_MID', 'BODY_BACK'],\n paddingFactor: 1.8,\n },\n {\n name: 'tail',\n bones: ['TAIL_BASE', 'TAIL_TOP', 'TAIL_MID'],\n paddingFactor: 1.6,\n },\n {\n name: 'dorsal_fin',\n bones: ['DORSAL_ROOT', 'DORSAL_L', 'DORSAL_R'],\n paddingFactor: 1.8,\n },\n {\n name: 'pectoral_fins',\n bones: ['PECTORAL_L_ROOT', 'PECTORAL_R_ROOT'],\n paddingFactor: 1.8,\n children: ['pectoral_fin_left', 'pectoral_fin_right'],\n expandAnimation: 'outward',\n },\n {\n name: 'pectoral_fin_left',\n bones: ['PECTORAL_L_ROOT', 'PECTORAL_L_CHAIN1', 'PECTORAL_L_CHAIN2'],\n parent: 'pectoral_fins',\n paddingFactor: 1.6,\n cameraAngle: 270,\n },\n {\n name: 'pectoral_fin_right',\n bones: ['PECTORAL_R_ROOT', 'PECTORAL_R_CHAIN1', 'PECTORAL_R_ROOT2'],\n parent: 'pectoral_fins',\n paddingFactor: 1.6,\n cameraAngle: 90,\n },\n {\n name: 'ventral_fins',\n bones: ['VENTRAL_L', 'VENTRAL_R'],\n paddingFactor: 1.6,\n },\n {\n name: 'gills',\n bones: ['GILL_L', 'GILL_R'],\n paddingFactor: 1.6,\n children: ['gill_left', 'gill_right'],\n expandAnimation: 'outward',\n },\n {\n name: 'gill_left',\n bones: ['GILL_L', 'GILL_L_MID', 'GILL_L_TIP'],\n parent: 'gills',\n paddingFactor: 1.4,\n cameraAngle: 270,\n style: { lineDirection: 'left' },\n },\n {\n name: 'gill_right',\n bones: ['GILL_R', 'GILL_R_MID', 'GILL_R_TIP'],\n parent: 'gills',\n paddingFactor: 1.4,\n cameraAngle: 90,\n style: { lineDirection: 'right' },\n },\n];\n\n// ============================================================================\n// PRESET EXPORT\n// ============================================================================\n\nconst BETTA_FISH_PROFILE: Profile = {\n name: 'Betta Fish',\n animalType: 'fish',\n emoji: '🐟',\n auToBones: BONE_BINDINGS,\n boneNodes: BONE_NODES,\n // Prefix/suffix for bone resolution: 'Bone.' + '001' + '_Armature' = 'Bone.001_Armature'\n bonePrefix: BONE_PREFIX,\n boneSuffix: BONE_SUFFIX,\n // Suffix pattern for fuzzy matching (Sketchfab/Blender exports)\n suffixPattern: '_\\\\d+$|\\\\.\\\\d+$',\n auToMorphs: {} as Record<number, import('../mappings/types').MorphTargetsBySide>,\n morphToMesh: {} as Record<string, string[]>,\n visemeKeys: [] as string[],\n auInfo: AU_INFO,\n compositeRotations: COMPOSITE_ROTATIONS,\n eyeMeshNodes: EYE_MESH_NODES,\n meshes: MESHES,\n annotationRegions: ANNOTATION_REGIONS,\n auMixDefaults: {} as Record<number, number>, // No mixed AUs (morph+bone) in this model\n continuumPairs: CONTINUUM_PAIRS_MAP,\n continuumLabels: CONTINUUM_LABELS,\n};\n\nexport const BETTA_FISH_PRESET = {\n ...BETTA_FISH_PROFILE,\n bones: BONES,\n boneBindings: BONE_BINDINGS,\n actionInfo: AU_INFO,\n};\n\n/**\n * Check if an AU has bilateral bone bindings (L and R nodes)\n * Used to determine if a balance slider should be shown\n */\nexport const hasLeftRightBones = (auId: number): boolean => {\n const bindings = BONE_BINDINGS[auId];\n return checkBindingsForLeftRight(bindings);\n};\n\nexport default BETTA_FISH_PRESET;\n\n// ============================================================================\n// LEGACY ALIASES - For backwards compatibility with existing code\n// ============================================================================\n\n// Deprecated alias: the fish preset is now a single preset object, not a\n// parallel \"mapping config\" that differs from the real preset.\nexport const AU_MAPPING_CONFIG = BETTA_FISH_PRESET;\n\nexport const ACTION_INFO = AU_INFO;\nexport const FISH_BONES = BONES;\nexport const FISH_BONE_NODES = BONE_NODES;\nexport const FISH_BONE_BINDINGS = BONE_BINDINGS;\nexport const FISH_AU_INFO = AU_INFO;\nexport const FISH_ACTION_INFO = ACTION_INFO;\nexport const FISH_CONTINUUM_PAIRS_MAP = CONTINUUM_PAIRS_MAP;\nexport const FISH_CONTINUUM_LABELS = CONTINUUM_LABELS;\nexport const FISH_COMPOSITE_ROTATIONS = COMPOSITE_ROTATIONS;\nexport const FISH_EYE_MESH_NODES = EYE_MESH_NODES;\nexport const FISH_MESHES = MESHES;\nexport const FISH_AU_MAPPING_CONFIG = BETTA_FISH_PRESET;\nexport const fishHasLeftRightBones = hasLeftRightBones;\n","import type { Profile } from '../mappings/types';\nimport { BETTA_FISH_PRESET } from './bettaFish';\nimport { CC4_PRESET } from './cc4';\n\n/**\n * Authoring registry for presets embedded in the Rust/Wasm package.\n *\n * Preset IDs are data identifiers. Runtime code must look them up through the\n * generated Wasm registry rather than branching on individual characters.\n */\nexport const EMBEDDED_PRESETS = {\n cc4: CC4_PRESET,\n fish: BETTA_FISH_PRESET,\n} as const satisfies Record<string, Profile>;\n\nexport type EmbeddedPresetId = keyof typeof EMBEDDED_PRESETS;\n\nexport function getEmbeddedPreset(presetId: string): Profile | undefined {\n const normalized = presetId.trim().toLowerCase();\n return (EMBEDDED_PRESETS as Record<string, Profile>)[normalized];\n}\n","/**\n * Embody - Preset Exports\n *\n * All AU presets are exported from here.\n * Frontend passes a presetType string and Embody looks up or extends the preset internally.\n */\n\n// CC4 preset (default for humanoid characters)\nexport { CC4_PRESET, default } from './cc4';\nexport * from './cc4';\n\nimport type { Profile } from '../mappings/types';\nimport {\n extendPresetWithProfile,\n mergePresetWithProfile,\n} from '../mappings/extendPresetWithProfile';\nexport {\n extendPresetWithProfile,\n mergePresetWithProfile,\n} from '../mappings/extendPresetWithProfile';\n\n// Betta fish preset (skeletal animation, no morphs)\nexport { BETTA_FISH_PRESET, AU_MAPPING_CONFIG, FISH_AU_MAPPING_CONFIG } from './bettaFish';\nexport {\n EMBEDDED_PRESETS,\n getEmbeddedPreset,\n} from './registry';\nexport type { EmbeddedPresetId } from './registry';\n\n// Re-export fish-specific items with FISH_ prefix to avoid conflicts\nexport {\n BONE_NODES as FISH_BONE_NODES,\n BONE_BINDINGS as FISH_BONE_BINDINGS,\n COMPOSITE_ROTATIONS as FISH_COMPOSITE_ROTATIONS,\n EYE_MESH_NODES as FISH_EYE_MESH_NODES,\n} from './bettaFish';\n\n/**\n * Preset types that can be passed to Embody\n */\nimport {\n getEmbeddedPreset,\n type EmbeddedPresetId,\n} from './registry';\n\nexport type PresetType = EmbeddedPresetId | 'skeletal' | 'custom';\n\n// Import CC4_PRESET at module level for getPreset\nimport { CC4_PRESET } from './cc4';\n\n/**\n * Get a preset by type name.\n * This allows frontend to pass a string instead of importing the full preset.\n */\nexport function getPreset(presetType: PresetType | string | undefined) {\n const compatibilityId = presetType === 'skeletal' ? 'fish' : presetType;\n return compatibilityId\n ? getEmbeddedPreset(compatibilityId) ?? CC4_PRESET\n : CC4_PRESET;\n}\n\n// Backwards-compatible lookup alias retained for LoomLarge consumers.\nexport const resolvePreset = getPreset;\n\n/**\n * Get a preset, then extend it with an optional profile.\n */\nexport async function getPresetWithProfile(\n presetType: PresetType | string | undefined,\n profile?: Partial<Profile>\n): Promise<Profile> {\n return extendPresetWithProfile(getPreset(presetType), profile);\n}\n\n// Backwards-compatible extension alias retained for LoomLarge consumers.\nexport const resolvePresetWithOverrides = getPresetWithProfile;\n","/**\n * Embody - Three.js Implementation\n *\n * Default implementation of the Embody runtime interface for Three.js.\n * Controls 3D character facial animation using Action Units (AUs),\n * morph targets, visemes, and bone transformations.\n */\n\nimport {\n BufferAttribute,\n Quaternion,\n Vector3,\n Box3,\n Clock,\n} from 'three';\nimport type { Mesh, Object3D, AnimationClip } from 'three';\nimport type {\n EmbodyRuntime,\n ReadyPayload,\n EmbodyConfig,\n} from '../../interfaces/EmbodyRuntime';\nimport type { MeshInfo, MorphTargetRef, Profile } from '../../mappings/types';\nimport type {\n TransitionHandle,\n BoneKey,\n RotationsState,\n AnimationPlayOptions,\n AnimationClipInfo,\n AnimationState,\n AnimationActionHandle,\n CurvesMap,\n ClipOptions,\n ClipHandle,\n Snippet,\n SnippetChannel,\n TypedSnippet,\n CompositeRotation,\n RotationAxis,\n AnimationBlendMode,\n MorphTargetDelta,\n AddMorphTargetOptions,\n} from '../../core/types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from '../../core/compositeAxis';\nimport { ThreeAnimationRuntime, ThreeAnimationSystem } from './ThreeAnimationRuntime';\nimport { getSideScale } from './balanceUtils';\nimport { ThreeModelInspector } from './ThreeModelInspector';\nimport { ThreeFrameApplier, type ThreeFrameApplierBindings, type ThreeMaterialConfig, type ThreeResolvedMaterialConfig } from './ThreeFrameApplier';\nimport { WasmRuntimeCore } from '../../core/WasmRuntimeCore';\nimport type { ModelDescriptor } from '../../core/contracts';\nimport { initEmbodyCore, requireInitializedEmbodyCore } from '../../wasm';\nimport { HairPhysicsController, type HairPhysicsConfig, type HairPhysicsConfigUpdate } from './hair/HairPhysicsController';\nimport { CC4_PRESET, CC4_MESHES, COMPOSITE_ROTATIONS as CC4_COMPOSITE_ROTATIONS } from '../../presets/cc4';\nimport { getPreset } from '../../presets';\nimport { mergePresetWithProfile } from '../../mappings/extendPresetWithProfile';\nimport {\n getProfileVisemeSlots,\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n getVisemeSlotIndex,\n} from '../../mappings/visemeSystem';\nimport type { NodeBase, ResolvedBones } from './types';\n\nconst deg2rad = (d: number) => (d * Math.PI) / 180;\n\n// Axis vectors for quaternion rotation (like stable version)\nconst X_AXIS = new Vector3(1, 0, 0);\nconst Y_AXIS = new Vector3(0, 1, 0);\nconst Z_AXIS = new Vector3(0, 0, 1);\n\n/**\n * Build AU to composite map from composite rotations config.\n * Maps AU ID to { nodes, axis } so we know which semantic axis (pitch/yaw/roll) to use.\n */\nfunction buildAUToCompositeMap(composites: CompositeRotation[]): Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }> {\n const map = new Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }>();\n composites.forEach(comp => {\n (['pitch', 'yaw', 'roll'] as const).forEach(axisName => {\n const axisConfig = comp[axisName];\n if (axisConfig) {\n axisConfig.aus.forEach(auId => {\n const existing = map.get(auId);\n if (existing) {\n existing.nodes.push(comp.node);\n } else {\n map.set(auId, { nodes: [comp.node], axis: axisName });\n }\n });\n }\n });\n });\n return map;\n}\n\nfunction clamp01(x: number) {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\ntype MorphTargetHandle = { infl: number[]; idx: number };\ntype WeightedMorphTargetHandle = MorphTargetHandle & { weight: number };\ntype ResolvedMorphTargetsBySide = {\n left: MorphTargetHandle[];\n right: MorphTargetHandle[];\n center: MorphTargetHandle[];\n};\n\nconst RESOLVED_TRANSITION_HANDLE: TransitionHandle = {\n promise: Promise.resolve(),\n pause: () => {},\n resume: () => {},\n cancel: () => {},\n};\n\nexport class Embody implements EmbodyRuntime {\n // Optional hook for animation schedulers.\n onSnippetEnd?: (name: string) => void;\n\n /**\n * Create an engine with Rust-owned preset/profile resolution.\n *\n * Prefer this factory whenever a profile patch must be merged onto a preset.\n * The sync constructor accepts either a presetType with no patch, or an\n * already-resolved profile.\n */\n static async create(\n config: EmbodyConfig = {},\n animation?: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n }\n ): Promise<Embody> {\n const core = await initEmbodyCore();\n const basePreset = config.presetType ? getPreset(config.presetType) : CC4_PRESET;\n const resolvedProfile = mergePresetWithProfile(core, basePreset, config.profile);\n const engine = new Embody(\n {\n profile: resolvedProfile,\n animationRuntimeFactory: config.animationRuntimeFactory,\n },\n animation\n );\n engine.attachWasmCore(core);\n return engine;\n }\n\n // Configuration\n private config: Profile;\n\n // Animation driver (injectable)\n private animation: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n };\n\n // Composite rotation mappings (built from config or default CC4)\n private compositeRotations: CompositeRotation[];\n private auToCompositeMap: Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }>;\n\n // State\n private auValues: Record<number, number> = {};\n private auBalances: Record<number, number> = {}; // Balance values per AU (-1 to 1)\n private rigReady = false;\n private missingBoneWarnings = new Set<string>();\n\n // Rotation state\n private rotations: RotationsState = {};\n private pendingCompositeNodes = new Set<string>();\n private isPaused = false;\n private translations: Record<string, { x: number; y: number; z: number }> = {};\n\n // Mesh references\n private faceMesh: Mesh | null = null;\n private resolvedFaceMeshes: string[] = [];\n private meshes: Mesh[] = [];\n private model: Object3D | null = null;\n private meshByName = new Map<string, Mesh>();\n private morphKeyCache = new Map<string, MorphTargetHandle[]>();\n private morphIndexCache = new Map<string, MorphTargetHandle[]>();\n private resolvedAUMorphTargets = new Map<number, ResolvedMorphTargetsBySide>();\n private resolvedVisemeTargets: WeightedMorphTargetHandle[][] = [];\n\n // Bones\n private bones: ResolvedBones = {};\n private mixWeights: Record<number, number> = {};\n\n // Viseme state\n private visemeValues: number[] = [];\n private visemeJawScales: number[] = [];\n\n\n // Viseme jaw amounts\n private static readonly VISEME_JAW_AMOUNTS: number[] = [\n 0.15, 0.35, 0.25, 0.70, 0.55, 0.30, 0.10, 0.20, 0.08,\n 0.12, 0.18, 0.02, 0.25, 0.60, 0.40,\n ];\n\n private animationController: ThreeAnimationSystem;\n private hairPhysics: HairPhysicsController;\n private modelInspector = new ThreeModelInspector();\n private frameApplier = new ThreeFrameApplier();\n private modelDescriptor: ModelDescriptor | null = null;\n private wasmRuntimeCore: WasmRuntimeCore | null = null;\n private framePathReady = false;\n\n // Internal animation loop\n private clock = new Clock(false); // Don't auto-start\n private animationFrameId: number | null = null;\n private isRunning = false;\n\n constructor(\n config: EmbodyConfig = {},\n animation?: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n }\n ) {\n // Sync construction does not merge profile patches. Use Embody.create() for\n // preset + override resolution through the Rust Wasm core.\n this.config = config.profile\n ? (config.profile as Profile)\n : config.presetType\n ? getPreset(config.presetType)\n : CC4_PRESET;\n this.mixWeights = { ...this.config.auMixDefaults };\n this.syncVisemeRuntimeState();\n this.animation = animation || new ThreeAnimationRuntime();\n\n // Use config's composite rotations or default to CC4\n this.compositeRotations = this.config.compositeRotations || CC4_COMPOSITE_ROTATIONS;\n this.auToCompositeMap = buildAUToCompositeMap(this.compositeRotations);\n\n this.animationController = new ThreeAnimationSystem({\n getModel: () => this.model,\n getMeshes: () => this.meshes,\n getMeshByName: (name) => this.meshByName.get(name),\n getMeshNamesForAU: (auId) => this.getMeshNamesForAU(auId),\n getMeshNamesForViseme: () => this.getMeshNamesForViseme(),\n getCurrentAUValue: (auId) => this.getAU(auId),\n getCurrentVisemeValue: (visemeIndex) => this.visemeValues[visemeIndex] ?? 0,\n getCurrentMorphValue: (morphKey, meshNames) => this.getMorphValueForMeshes(morphKey, meshNames),\n getCurrentMorphIndexValue: (morphIndex, meshNames) => this.getMorphValueByIndexForMeshes(morphIndex, meshNames),\n getCurrentBoneQuaternion: (nodeKey) => this.bones[nodeKey]?.obj.quaternion.clone() ?? null,\n getCurrentBonePositionValue: (nodeKey, axis) => this.bones[nodeKey]?.obj.position[axis] ?? null,\n getBones: () => this.bones,\n getConfig: () => this.config,\n getCompositeRotations: () => this.compositeRotations,\n computeSideValues: (base, balance) => this.computeSideValues(base, balance),\n getAUMixWeight: (auId) => this.getAUMixWeight(auId),\n isMixedAU: (auId) => this.isMixedAU(auId),\n reapplyProceduralState: () => this.reapplyProceduralStateAfterBakedUpdate(),\n }, {\n animationRuntimeFactory: config.animationRuntimeFactory,\n });\n\n this.hairPhysics = new HairPhysicsController({\n getMeshByName: (name) => this.meshByName.get(name),\n getSelectedHairMeshNames: () => this.config.morphToMesh?.hair || [],\n // Hair physics reuses the shared mixer-backed clip builder.\n buildClip: (clipName, curves, options) => this.animationController.buildClip(clipName, curves, options),\n cleanupSnippet: (name) => this.animationController.cleanupSnippet(name),\n });\n\n this.applyHairPhysicsProfileConfig();\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n onReady(payload: ReadyPayload): void {\n const { meshes, model } = payload;\n const inspection = this.modelInspector.inspectModel(model, {\n meshes,\n profile: this.config,\n previousBones: this.bones,\n });\n\n this.meshes = inspection.morphMeshes;\n this.model = model;\n this.meshByName = inspection.meshByName;\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n\n // Resolve bones\n this.bones = inspection.bones;\n this.rigReady = true;\n this.missingBoneWarnings.clear();\n this.initBoneRotations();\n\n // Find primary face mesh (use head bone proximity when available)\n this.resolvedFaceMeshes = inspection.resolvedFaceMeshes;\n this.faceMesh = inspection.faceMesh;\n\n // Auto-detect face morph meshes only if preset/profile doesn't define them.\n // When morphToMesh.face is already configured (e.g., CC4 preset specifies\n // body + eyebrows + occlusion + tear lines), trust that configuration.\n //\n // Important: Use only resolved face candidates here. Using all morph-capable\n // meshes makes AU/morph transitions spill into unrelated meshes.\n if (!this.config.morphToMesh?.face || this.config.morphToMesh.face.length === 0) {\n const faceMeshNames = this.resolvedFaceMeshes\n .filter((name) => this.meshByName.has(name));\n\n if (faceMeshNames.length > 0) {\n this.config.morphToMesh = {\n ...this.config.morphToMesh,\n face: Array.from(new Set(faceMeshNames)),\n };\n }\n }\n\n this.rebuildMorphTargetsCache();\n this.bindHostNeutralRuntime(inspection);\n\n if (this.resolvedFaceMeshes.length > 0) {\n for (const faceName of this.resolvedFaceMeshes) {\n const faceMesh = this.meshByName.get(faceName);\n const morphKeys = faceMesh?.morphTargetDictionary\n ? Object.keys(faceMesh.morphTargetDictionary)\n : [];\n console.log('[Embody] Face mesh resolved:', faceName);\n console.log('[Embody] Face mesh morphs:', morphKeys);\n }\n } else {\n console.log('[Embody] No face mesh resolved from morph targets.');\n }\n\n // Apply render order and material settings from CC4_MESHES\n this.applyMeshMaterialSettings(model);\n }\n\n private bindHostNeutralRuntime(inspection: ReturnType<ThreeModelInspector['inspectModel']>): void {\n this.modelDescriptor = inspection.descriptor;\n this.frameApplier.setBindings(buildFrameApplierBindings(inspection));\n const wasm = requireInitializedEmbodyCore();\n this.attachWasmCore(wasm);\n this.wasmRuntimeCore = new WasmRuntimeCore({\n profile: this.config,\n model: inspection.descriptor,\n wasm,\n allowEmptyBindings: true,\n });\n this.syncRuntimeCoreState();\n this.framePathReady = true;\n }\n\n private attachWasmCore(core: Awaited<ReturnType<typeof initEmbodyCore>>): void {\n this.hairPhysics.setCore(core);\n }\n\n private syncRuntimeCoreState(): void {\n if (this.wasmRuntimeCore) {\n this.wasmRuntimeCore.setProfile(this.config);\n if (this.modelDescriptor) {\n this.wasmRuntimeCore.setModelDescriptor(this.modelDescriptor);\n }\n this.wasmRuntimeCore.clear();\n for (const [auIdText, value] of Object.entries(this.auValues)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.wasmRuntimeCore.setAU(auId, value, this.auBalances[auId] ?? 0);\n }\n for (const [auIdText, weight] of Object.entries(this.mixWeights)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.wasmRuntimeCore.setAUMixWeight(auId, weight);\n }\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n this.wasmRuntimeCore.setViseme(index, this.visemeValues[index] ?? 0, this.visemeJawScales[index] ?? 1);\n }\n }\n }\n\n /**\n * Re-inspect the current model and push a fresh ModelDescriptor into the\n * runtime cores and frame applier. Needed whenever host-side morph targets\n * or meshes change after onReady (e.g. addMorphTarget).\n */\n private refreshHostNeutralModelDescriptor(): void {\n if (!this.model || !this.framePathReady) return;\n const inspection = this.modelInspector.inspectModel(this.model, {\n meshes: this.meshes,\n profile: this.config,\n previousBones: this.bones,\n });\n this.modelDescriptor = inspection.descriptor;\n this.frameApplier.setBindings(buildFrameApplierBindings(inspection));\n this.wasmRuntimeCore?.setModelDescriptor(inspection.descriptor);\n }\n\n private applyLiveFrameDelta(): boolean {\n if (!this.framePathReady || !this.model || !this.wasmRuntimeCore) return false;\n this.frameApplier.applyFrameDelta(this.model, this.wasmRuntimeCore.evaluateFrameDelta());\n this.pendingCompositeNodes.clear();\n return true;\n }\n\n private rebuildMorphTargetsCache(): void {\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n this.resolvedAUMorphTargets.clear();\n this.resolvedVisemeTargets = [];\n\n if (!this.meshes.length) return;\n\n const resolveTargetsForKeys = (keys: MorphTargetRef[], meshNames: string[]): MorphTargetHandle[] => {\n if (!keys || keys.length === 0) return [];\n const targets: MorphTargetHandle[] = [];\n for (const key of keys) {\n const resolved = typeof key === 'number'\n ? this.resolveMorphTargetsByIndex(key, meshNames)\n : this.resolveMorphTargets(key, meshNames);\n if (resolved.length > 0) {\n targets.push(...resolved);\n }\n }\n return targets;\n };\n\n for (const [auIdStr, entry] of Object.entries(this.config.auToMorphs || {})) {\n const auId = Number(auIdStr);\n if (Number.isNaN(auId) || !entry) continue;\n const meshNames = this.getMeshNamesForAU(auId);\n const resolved: ResolvedMorphTargetsBySide = {\n left: resolveTargetsForKeys(entry.left, meshNames),\n right: resolveTargetsForKeys(entry.right, meshNames),\n center: resolveTargetsForKeys(entry.center, meshNames),\n };\n this.resolvedAUMorphTargets.set(auId, resolved);\n }\n\n for (let i = 0; i < getProfileVisemeSlots(this.config).length; i += 1) {\n const visemeMeshNames = this.getMeshNamesForViseme();\n const targets: WeightedMorphTargetHandle[] = [];\n for (const bindingTarget of getVisemeBindingTargets(this.config, i)) {\n const resolved = typeof bindingTarget.morph === 'number'\n ? this.resolveMorphTargetsByIndex(bindingTarget.morph, visemeMeshNames)\n : this.resolveMorphTargets(bindingTarget.morph, visemeMeshNames);\n for (const target of resolved) {\n targets.push({ ...target, weight: bindingTarget.weight });\n }\n }\n this.resolvedVisemeTargets[i] = targets;\n }\n }\n\n private resolveFaceMeshes(meshes: Mesh[]): string[] {\n const faceMeshNames = this.config.morphToMesh?.face || [];\n const availableMorphMeshes = meshes.filter((m) => {\n const dict = m.morphTargetDictionary;\n const infl = m.morphTargetInfluences;\n return (dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0);\n });\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n return [defaultFace.name];\n }\n\n const candidateByMorph = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n if (candidateByMorph) {\n return [candidateByMorph.name];\n }\n\n const head = this.bones[this.getHeadBoneNodeKey()]?.obj ?? this.bones.HEAD?.obj;\n if (head && availableMorphMeshes.length > 0) {\n const headPos = new Vector3();\n (head as any).getWorldPosition?.(headPos);\n const headCandidates = availableMorphMeshes.map((mesh) => {\n const box = new Box3().setFromObject(mesh as any);\n const center = new Vector3();\n box.getCenter(center);\n const distance = box.containsPoint(headPos) ? 0 : center.distanceTo(headPos);\n const morphCount = mesh.morphTargetDictionary\n ? Object.keys(mesh.morphTargetDictionary).length\n : 0;\n const name = mesh.name.toLowerCase();\n const penalty = /eye|occlusion|tear|teeth|tongue|hair|lash/.test(name) ? 10 : 0;\n return { name: mesh.name, distance, morphCount, penalty };\n });\n\n headCandidates.sort((a, b) => {\n if (a.distance !== b.distance) return a.distance - b.distance;\n if (a.penalty !== b.penalty) return a.penalty - b.penalty;\n return b.morphCount - a.morphCount;\n });\n\n const best = headCandidates[0];\n const extras = headCandidates\n .filter((entry) => /brow|eyebrow/.test(entry.name.toLowerCase()))\n .map((entry) => entry.name);\n\n return [best.name, ...extras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n if (availableMorphMeshes.length > 0) {\n const best = availableMorphMeshes.reduce((prev, current) => {\n const prevCount = prev.morphTargetDictionary ? Object.keys(prev.morphTargetDictionary).length : 0;\n const currCount = current.morphTargetDictionary ? Object.keys(current.morphTargetDictionary).length : 0;\n return currCount > prevCount ? current : prev;\n });\n const browExtras = availableMorphMeshes\n .filter((m) => {\n const dict = m.morphTargetDictionary || {};\n const morphKeys = Object.keys(dict);\n return /brow|eyebrow/i.test(m.name) || morphKeys.some((k) => /brow/i.test(k));\n })\n .map((m) => m.name);\n return [best.name, ...browExtras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n return [];\n }\n\n update(deltaSeconds: number): void {\n const dtSeconds = Math.max(0, deltaSeconds || 0);\n if (dtSeconds <= 0 || this.isPaused) return;\n\n this.animation.tick(dtSeconds);\n const wasmTransitionCount = this.wasmRuntimeCore?.activeTransitionCount() ?? 0;\n const remainingWasmTransitions = this.wasmRuntimeCore?.update(dtSeconds) ?? 0;\n if (wasmTransitionCount > 0 || remainingWasmTransitions > 0) {\n this.applyLiveFrameDelta();\n }\n this.flushPendingComposites();\n\n this.animationController.update(dtSeconds);\n this.hairPhysics.update(dtSeconds);\n }\n\n /** Start the internal animation loop using Three.js Clock */\n start(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n this.clock.start();\n\n const tick = () => {\n if (!this.isRunning) return;\n const delta = this.clock.getDelta();\n this.update(delta);\n this.animationFrameId = requestAnimationFrame(tick);\n };\n\n this.animationFrameId = requestAnimationFrame(tick);\n }\n\n /** Stop the internal animation loop */\n stop(): void {\n this.isRunning = false;\n this.clock.stop();\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n\n dispose(): void {\n this.stop();\n this.clearTransitions();\n this.animationController.dispose();\n this.meshes = [];\n this.model = null;\n this.bones = {};\n this.modelDescriptor = null;\n this.wasmRuntimeCore = null;\n this.framePathReady = false;\n }\n\n // ============================================================================\n // AU CONTROL\n // ============================================================================\n\n setAU(id: number | string, v: number, balance?: number): void {\n if (typeof id === 'string') {\n const match = id.match(/^(\\d+)([LR])$/i);\n if (match) {\n const au = Number(match[1]);\n const side = match[2].toUpperCase() as 'L' | 'R';\n const sideBalance = side === 'L' ? -1 : 1;\n this.setAU(au, v, sideBalance);\n return;\n }\n const n = Number(id);\n if (!Number.isNaN(n)) {\n this.setAU(n, v, balance);\n }\n return;\n }\n\n // Handle negative values for continuum pairs:\n // If v < 0 and this AU has a continuum pair, forward to setContinuum\n if (v < 0 && this.config.continuumPairs) {\n const pairInfo = this.config.continuumPairs[id];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? id : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : id;\n const continuumValue = pairInfo.isNegative ? -v : v;\n this.setContinuum(negAU, posAU, continuumValue, balance);\n return;\n }\n }\n\n this.auValues[id] = v;\n // Store balance for this AU (used by bilateral bone AUs like fish gills)\n if (balance !== undefined) {\n this.auBalances[id] = balance;\n }\n\n this.wasmRuntimeCore?.setAU(id, v, balance ?? this.auBalances[id] ?? 0);\n\n const appliedViaFrame = this.applyLiveFrameDelta();\n if (!appliedViaFrame) {\n const resolvedMorphTargets = this.resolvedAUMorphTargets.get(id);\n const { left: leftKeys, right: rightKeys, center: centerKeys } = this.getAUMorphsBySide(id);\n\n if (resolvedMorphTargets) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (resolvedMorphTargets.left.length || resolvedMorphTargets.right.length) {\n this.applyMorphTargets(resolvedMorphTargets.left, leftVal);\n this.applyMorphTargets(resolvedMorphTargets.right, rightVal);\n }\n\n this.applyMorphTargets(resolvedMorphTargets.center, base);\n } else if (leftKeys.length || rightKeys.length || centerKeys.length) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const meshNames = this.getMeshNamesForAU(id);\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, leftVal, meshNames);\n else this.setMorph(k, leftVal, meshNames);\n }\n for (const k of rightKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, rightVal, meshNames);\n else this.setMorph(k, rightVal, meshNames);\n }\n }\n\n for (const k of centerKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, base, meshNames);\n else this.setMorph(k, base, meshNames);\n }\n }\n }\n\n if (appliedViaFrame) return;\n\n // Check if this AU affects composite rotations\n const compositeInfo = this.auToCompositeMap.get(id);\n\n if (compositeInfo) {\n // This AU affects composite bone rotations - use axis from compositeRotations\n for (const nodeKey of compositeInfo.nodes) {\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) continue;\n\n const axisConfig = config[compositeInfo.axis];\n if (!axisConfig) continue;\n\n const axisValue = this.getCompositeAxisValueForNode(nodeKey, axisConfig);\n this.updateBoneRotation(nodeKey, compositeInfo.axis, axisValue);\n this.pendingCompositeNodes.add(nodeKey);\n }\n }\n\n // Handle translations (non-composite)\n const bindings = this.config.auToBones[id];\n if (bindings) {\n for (const binding of bindings) {\n if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n this.updateBoneTranslation(binding.node, binding.channel, v * binding.scale, binding.maxUnits);\n }\n }\n }\n }\n }\n\n transitionAU(id: number | string, to: number, durationMs = 200, balance?: number): TransitionHandle {\n const numId = typeof id === 'string' ? Number(id.replace(/[^\\d]/g, '')) : id;\n\n // Handle negative values for continuum pairs:\n // If to < 0 and this AU has a continuum pair, forward to transitionContinuum\n if (to < 0 && this.config.continuumPairs) {\n const pairInfo = this.config.continuumPairs[numId];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? numId : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : numId;\n const continuumValue = pairInfo.isNegative ? -to : to;\n return this.transitionContinuum(negAU, posAU, continuumValue, durationMs, balance);\n }\n }\n\n const target = clamp01(to);\n\n if (balance !== undefined) {\n this.auBalances[numId] = balance;\n }\n const storedBalance = this.auBalances[numId] ?? 0;\n\n const { left: leftKeys, right: rightKeys, center: centerKeys } = this.getAUMorphsBySide(numId);\n const bindings = this.config.auToBones[numId] || [];\n\n const mixWeight = this.isMixedAU(numId) ? this.getAUMixWeight(numId) : 1.0;\n const base = target * mixWeight;\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, storedBalance);\n\n this.auValues[numId] = target;\n\n if (this.wasmRuntimeCore) {\n this.wasmRuntimeCore.transitionAU(\n numId,\n target,\n durationMs,\n balance ?? this.auBalances[numId] ?? Number.NaN\n );\n this.update(0);\n if (durationMs <= 0) {\n this.applyLiveFrameDelta();\n }\n return RESOLVED_TRANSITION_HANDLE;\n }\n\n const handles: TransitionHandle[] = [];\n const meshNames = this.getMeshNamesForAU(numId);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, leftVal, durationMs, meshNames)\n : this.transitionMorph(k, leftVal, durationMs, meshNames)\n );\n }\n for (const k of rightKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, rightVal, durationMs, meshNames)\n : this.transitionMorph(k, rightVal, durationMs, meshNames)\n );\n }\n }\n\n for (const k of centerKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, base, durationMs, meshNames)\n : this.transitionMorph(k, base, durationMs, meshNames)\n );\n }\n\n // Handle bone rotations using auToCompositeMap\n const compositeInfo = this.auToCompositeMap.get(numId);\n if (compositeInfo) {\n for (const nodeKey of compositeInfo.nodes) {\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) continue;\n\n const axisConfig = config[compositeInfo.axis];\n if (!axisConfig) continue;\n\n const axisValue = this.getCompositeAxisValueForNode(nodeKey, axisConfig);\n handles.push(this.transitionBoneRotation(nodeKey, compositeInfo.axis, axisValue, durationMs));\n }\n }\n\n // Handle translations\n for (const binding of bindings) {\n if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n handles.push(this.transitionBoneTranslation(binding.node, binding.channel, target * binding.scale, binding.maxUnits, durationMs));\n }\n }\n }\n\n return this.combineHandles(handles);\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n getCompositeRotations(): CompositeRotation[] {\n return this.compositeRotations;\n }\n\n // ============================================================================\n // CONTINUUM CONTROL (for paired AUs like eyes left/right, head up/down)\n // ============================================================================\n\n /**\n * Set a continuum AU pair immediately (no animation).\n *\n * Sign convention:\n * - Negative value (-1 to 0): activates negAU (e.g., head left, eyes left)\n * - Positive value (0 to +1): activates posAU (e.g., head right, eyes right)\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Value from -1 (full negative) to +1 (full positive)\n * @param balance - Optional L/R balance for bilateral morphs\n */\n setContinuum(negAU: number, posAU: number, continuumValue: number, balance?: number): void {\n const value = Math.max(-1, Math.min(1, continuumValue));\n\n this.auValues[negAU] = value < 0 ? Math.abs(value) : 0;\n this.auValues[posAU] = value > 0 ? value : 0;\n if (balance !== undefined) {\n this.auBalances[negAU] = balance;\n this.auBalances[posAU] = balance;\n }\n\n if (this.wasmRuntimeCore) {\n this.wasmRuntimeCore.setContinuum(negAU, posAU, value, balance ?? 0);\n this.applyLiveFrameDelta();\n return;\n }\n\n if (value < 0) {\n this.setAU(posAU, 0, balance);\n this.setAU(negAU, Math.abs(value), balance);\n return;\n }\n if (value > 0) {\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, value, balance);\n return;\n }\n\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, 0, balance);\n }\n\n /**\n * Smoothly transition a continuum AU pair (e.g., eyes left/right, head up/down).\n * Takes a continuum value from -1 to +1 and internally manages both AU values.\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Target value from -1 (full negative) to +1 (full positive)\n * @param durationMs - Transition duration in milliseconds\n * @param balance - Optional L/R balance for bilateral morphs\n */\n transitionContinuum(negAU: number, posAU: number, continuumValue: number, durationMs = 200, balance?: number): TransitionHandle {\n const target = Math.max(-1, Math.min(1, continuumValue));\n\n // Get current continuum value: positive if posAU active, negative if negAU active\n const currentNeg = this.auValues[negAU] ?? 0;\n const currentPos = this.auValues[posAU] ?? 0;\n const currentContinuum = currentPos - currentNeg;\n\n this.auValues[negAU] = target < 0 ? Math.abs(target) : 0;\n this.auValues[posAU] = target > 0 ? target : 0;\n if (balance !== undefined) {\n this.auBalances[negAU] = balance;\n this.auBalances[posAU] = balance;\n }\n\n if (this.wasmRuntimeCore) {\n if (target < 0) {\n this.wasmRuntimeCore.transitionAU(posAU, 0, durationMs, balance ?? this.auBalances[posAU] ?? Number.NaN);\n this.wasmRuntimeCore.transitionAU(negAU, Math.abs(target), durationMs, balance ?? this.auBalances[negAU] ?? Number.NaN);\n } else if (target > 0) {\n this.wasmRuntimeCore.transitionAU(negAU, 0, durationMs, balance ?? this.auBalances[negAU] ?? Number.NaN);\n this.wasmRuntimeCore.transitionAU(posAU, target, durationMs, balance ?? this.auBalances[posAU] ?? Number.NaN);\n } else {\n this.wasmRuntimeCore.transitionAU(negAU, 0, durationMs, balance ?? this.auBalances[negAU] ?? Number.NaN);\n this.wasmRuntimeCore.transitionAU(posAU, 0, durationMs, balance ?? this.auBalances[posAU] ?? Number.NaN);\n }\n if (durationMs <= 0) {\n this.applyLiveFrameDelta();\n }\n return RESOLVED_TRANSITION_HANDLE;\n }\n\n const driverKey = `continuum_${negAU}_${posAU}`;\n\n return this.animation.addTransition(driverKey, currentContinuum, target, durationMs, (value) => this.setContinuum(negAU, posAU, value, balance));\n }\n\n // ============================================================================\n // MORPH CONTROL\n // ============================================================================\n\n addMorphTarget(target: MorphTargetDelta, options: AddMorphTargetOptions = {}): number {\n this.validateMorphTargetDelta(target, options);\n const staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n const index = this.applyMorphTargetDelta(target, options);\n this.refreshMorphTargets([target.meshName]);\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n return index;\n }\n\n addMorphTargets(targets: MorphTargetDelta[], options: AddMorphTargetOptions = {}): Record<string, number> {\n if (targets.length === 0) return {};\n\n const batchKeys = new Set<string>();\n const batchRelativeModeByMesh = new Map<string, boolean>();\n for (const target of targets) {\n const key = `${target.meshName}:${target.name}`;\n if (batchKeys.has(key)) {\n throw new Error(`Morph target \"${target.name}\" for mesh \"${target.meshName}\" appears more than once in the same batch.`);\n }\n batchKeys.add(key);\n this.validateMorphTargetDelta(target, options);\n const targetIsRelative = target.relative !== false;\n const batchRelativeMode = batchRelativeModeByMesh.get(target.meshName);\n if (batchRelativeMode !== undefined && batchRelativeMode !== targetIsRelative) {\n throw new Error(`Cannot mix relative and absolute morph targets for mesh \"${target.meshName}\" in the same batch.`);\n }\n batchRelativeModeByMesh.set(target.meshName, targetIsRelative);\n }\n\n const staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n const result: Record<string, number> = {};\n const touchedMeshes = new Set<string>();\n\n try {\n for (const target of targets) {\n const index = this.applyMorphTargetDelta(target, options);\n touchedMeshes.add(target.meshName);\n result[`${target.meshName}:${target.name}`] = index;\n }\n } finally {\n if (touchedMeshes.size > 0) {\n this.refreshMorphTargets(Array.from(touchedMeshes));\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n }\n }\n\n return result;\n }\n\n ensureMorphInfluence(meshName: string, morphName: string): number {\n const mesh = this.requireNamedMesh(meshName);\n const dict = this.getMeshMorphDictionary(mesh);\n const existing = dict[morphName];\n if (existing !== undefined) return existing;\n\n const position = mesh.geometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot create morph target \"${morphName}\" on mesh \"${meshName}\": geometry has no position attribute.`);\n }\n\n return this.addMorphTarget({\n meshName,\n name: morphName,\n position: new Float32Array(position.count * position.itemSize),\n relative: true,\n });\n }\n\n refreshMorphTargets(_meshNames?: string[]): void {\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n\n if (this.model) {\n this.meshByName.clear();\n this.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n this.meshByName.set(obj.name, obj);\n }\n });\n this.meshes = collectMorphMeshes(this.model);\n }\n\n this.rebuildMorphTargetsCache();\n this.refreshHostNeutralModelDescriptor();\n this.hairPhysics.refreshMeshSelection();\n }\n\n /**\n * Set a morph target value.\n *\n * Fast paths (in order of speed):\n * 1. Pass pre-resolved { infl, idx } array directly - zero lookups\n * 2. String key with cache hit - one Map lookup\n * 3. String key cache miss - dictionary lookup, then cached for next time\n */\n setMorph(key: string, v: number, meshNames?: string[]): void;\n setMorph(key: string, v: number, targets: { infl: number[]; idx: number }[]): void;\n setMorph(\n key: string,\n v: number,\n meshNamesOrTargets?: string[] | { infl: number[]; idx: number }[]\n ): void {\n const val = clamp01(v);\n\n // Fast path: pre-resolved targets array (from transitionMorph)\n if (Array.isArray(meshNamesOrTargets) && meshNamesOrTargets.length > 0 && typeof meshNamesOrTargets[0] === 'object' && 'infl' in meshNamesOrTargets[0]) {\n const targets = meshNamesOrTargets as { infl: number[]; idx: number }[];\n this.applyMorphTargets(targets, val);\n return;\n }\n\n const meshNames = meshNamesOrTargets as string[] | undefined;\n const targets = this.resolveMorphTargets(key, meshNames);\n if (targets.length === 0) return;\n this.applyMorphTargets(targets, val);\n }\n\n setMorphInfluence(index: number, v: number, meshNames?: string[]): void {\n const val = clamp01(v);\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n if (targets.length === 0) return;\n this.applyMorphTargets(targets, val);\n }\n\n /**\n * Resolve morph key to direct targets for ultra-fast repeated access.\n * Use this when you need to set the same morph many times (e.g., in animation loops).\n */\n private resolveMorphTargetIndex(\n dict: Record<string, number> | undefined,\n key: string\n ): number | undefined {\n if (!dict) return undefined;\n\n const prefix = this.config.morphPrefix || '';\n const suffix = this.config.morphSuffix || '';\n const fullName = prefix + key + suffix;\n\n // Validation treats the configured full name as the source of truth, so runtime\n // mirrors that ordering and only accepts suffix-pattern variants after an exact hit.\n // We intentionally do not fall back to the bare key here because that would let a\n // prefixed profile appear valid at runtime while validation still reports a miss.\n const exactIndex = dict[fullName];\n if (exactIndex !== undefined) {\n return exactIndex;\n }\n\n const suffixRegex = this.config.suffixPattern\n ? new RegExp(this.config.suffixPattern)\n : null;\n if (!suffixRegex) {\n return undefined;\n }\n\n for (const [candidate, index] of Object.entries(dict)) {\n if (!candidate.startsWith(fullName)) continue;\n const candidateSuffix = candidate.slice(fullName.length);\n if (candidateSuffix === '' || suffixRegex.test(candidateSuffix)) {\n return index;\n }\n }\n\n return undefined;\n }\n\n resolveMorphTargets(key: string, meshNames?: string[]): { infl: number[]; idx: number }[] {\n // Cache key includes mesh names to avoid conflicts between face and hair morphs\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n const cacheKey = this.getMorphKeyCacheKey(key, meshNames);\n\n // Check cache first\n const cached = this.morphKeyCache.get(cacheKey);\n if (cached) return cached;\n\n // Resolve and cache\n const targets: { infl: number[]; idx: number }[] = [];\n\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) {\n targets.push({ infl, idx });\n }\n }\n\n if (targets.length > 0) {\n this.morphKeyCache.set(cacheKey, targets);\n }\n return targets;\n }\n\n resolveMorphTargetsByIndex(index: number, meshNames?: string[]): { infl: number[]; idx: number }[] {\n const idx = Number.isInteger(index) && index >= 0 ? index : null;\n if (idx === null) return [];\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n const cacheKey = this.getMorphIndexCacheKey(idx, meshNames);\n\n const cached = this.morphIndexCache.get(cacheKey);\n if (cached) return cached;\n\n const targets: { infl: number[]; idx: number }[] = [];\n\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const infl = mesh.morphTargetInfluences;\n if (!infl || idx >= infl.length) continue;\n targets.push({ infl, idx });\n }\n\n if (targets.length > 0) {\n this.morphIndexCache.set(cacheKey, targets);\n }\n return targets;\n }\n\n transitionMorph(key: string, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = meshNames?.length\n ? `morph_${this.getMorphKeyCacheKey(key, meshNames)}`\n : `morph_${this.getMorphKeyCacheKey(key)}`;\n const target = clamp01(to);\n\n // Pre-resolve targets once, then use direct access during animation\n const targets = this.resolveMorphTargets(key, meshNames);\n\n // Get \"from\" value from the resolved targets (more accurate for hair meshes)\n const from = targets.length > 0 ? (targets[0].infl[targets[0].idx] ?? 0) : this.getMorphValue(key);\n\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => {\n // Ultra-fast path: direct array access, no lookups\n const val = clamp01(value);\n this.applyMorphTargets(targets, val);\n });\n }\n\n transitionMorphInfluence(index: number, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = meshNames?.length\n ? `morph_${this.getMorphIndexCacheKey(index, meshNames)}`\n : `morph_${this.getMorphIndexCacheKey(index)}`;\n const target = clamp01(to);\n\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n const from = targets.length > 0 ? (targets[0].infl[targets[0].idx] ?? 0) : this.getMorphValueByIndex(index);\n\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => {\n const val = clamp01(value);\n this.applyMorphTargets(targets, val);\n });\n }\n\n // ============================================================================\n // VISEME CONTROL\n // ============================================================================\n\n setViseme(visemeIndex: number, value: number, jawScale = 1.0): void {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) return;\n\n const val = clamp01(value);\n this.visemeValues[visemeIndex] = val;\n this.visemeJawScales[visemeIndex] = jawScale;\n this.applyVisemeRuntimeState();\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n\n const target = clamp01(to);\n const from = this.visemeValues[visemeIndex] ?? 0;\n this.visemeJawScales[visemeIndex] = jawScale;\n\n if (this.wasmRuntimeCore) {\n this.visemeValues[visemeIndex] = target;\n this.wasmRuntimeCore.transitionViseme(visemeIndex, target, durationMs, jawScale);\n if (durationMs <= 0) {\n this.applyLiveFrameDelta();\n }\n return RESOLVED_TRANSITION_HANDLE;\n }\n\n return this.animation.addTransition(\n `viseme_value_${visemeIndex}`,\n from,\n target,\n durationMs,\n (value) => {\n this.visemeValues[visemeIndex] = clamp01(value);\n this.visemeJawScales[visemeIndex] = jawScale;\n this.applyVisemeRuntimeState();\n }\n );\n }\n\n setVisemeById(slotId: string, value: number, jawScale = 1.0): void {\n const index = getVisemeSlotIndex(this.config, slotId);\n if (index < 0) return;\n this.setViseme(index, value, jawScale);\n }\n\n transitionVisemeById(slotId: string, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n const index = getVisemeSlotIndex(this.config, slotId);\n if (index < 0) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n return this.transitionViseme(index, to, durationMs, jawScale);\n }\n\n // ============================================================================\n // MIX WEIGHT CONTROL\n // ============================================================================\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n this.wasmRuntimeCore?.setAUMixWeight(id, weight);\n const v = this.auValues[id] ?? 0;\n if (v > 0) this.setAU(id, v);\n\n const boneBindings = this.config.auToBones[id];\n if (boneBindings) {\n for (const binding of boneBindings) {\n this.pendingCompositeNodes.add(binding.node);\n }\n }\n }\n\n getAUMixWeight(id: number): number {\n return this.mixWeights[id] ?? this.config.auMixDefaults?.[id] ?? 1.0;\n }\n\n /**\n * Check if an AU has bilateral bone bindings (left + right side hints).\n * Used to determine if a balance slider should be shown for bone-only bilateral AUs.\n */\n hasLeftRightBones(auId: number): boolean {\n const bindings = this.config.auToBones[auId] || [];\n const hasLeft = bindings.some((binding) => binding.side === 'left');\n const hasRight = bindings.some((binding) => binding.side === 'right');\n return hasLeft && hasRight;\n }\n\n // ============================================================================\n // PLAYBACK CONTROL\n // ============================================================================\n\n pause(): void { this.isPaused = true; }\n resume(): void { this.isPaused = false; }\n getPaused(): boolean { return this.isPaused; }\n clearTransitions(): void {\n this.animation.clearTransitions();\n this.wasmRuntimeCore?.clearTransitions();\n }\n getActiveTransitionCount(): number {\n return this.animation.getActiveTransitionCount() + (this.wasmRuntimeCore?.activeTransitionCount() ?? 0);\n }\n\n resetToNeutral(): void {\n this.auValues = {};\n const visemeCount = getProfileVisemeSlots(this.config).length;\n this.visemeValues = new Array(visemeCount).fill(0);\n this.visemeJawScales = new Array(visemeCount).fill(1);\n this.translations = {};\n this.initBoneRotations();\n this.clearTransitions();\n this.wasmRuntimeCore?.clear();\n\n const morphTargetsToReset: MorphTargetHandle[] = [];\n for (const m of this.meshes) {\n const infl = m.morphTargetInfluences;\n if (!infl) continue;\n for (let i = 0; i < infl.length; i++) {\n morphTargetsToReset.push({ infl, idx: i });\n }\n }\n this.frameApplier.resetMorphTargets(morphTargetsToReset);\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n }\n\n private reinitializeRuntimeStateFromCurrentControls(staleMorphTargets: MorphTargetHandle[] = []): void {\n this.clearTransitions();\n this.resetMorphTargetHandles(staleMorphTargets);\n this.translations = {};\n this.initBoneRotations();\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n\n for (const [auIdStr, value] of Object.entries(this.auValues)) {\n if (value <= 0) continue;\n const auId = Number(auIdStr);\n if (Number.isNaN(auId)) continue;\n this.setAU(auId, value, this.auBalances[auId]);\n }\n\n this.applyVisemeRuntimeState();\n\n if (this.model) {\n this.flushPendingComposites();\n this.model.updateMatrixWorld(true);\n }\n }\n\n private reapplyProceduralStateAfterBakedUpdate(): void {\n if (!this.model) {\n return;\n }\n\n let hasActiveOverrides = false;\n\n for (const [auIdStr, value] of Object.entries(this.auValues)) {\n if (value <= 0) continue;\n const auId = Number(auIdStr);\n if (Number.isNaN(auId)) continue;\n hasActiveOverrides = true;\n this.setAU(auId, value, this.auBalances[auId]);\n }\n\n for (let visemeIndex = 0; visemeIndex < this.visemeValues.length; visemeIndex += 1) {\n const value = this.visemeValues[visemeIndex] ?? 0;\n if (value <= 0) continue;\n hasActiveOverrides = true;\n this.setViseme(visemeIndex, value, this.visemeJawScales[visemeIndex] ?? 1);\n }\n\n if (!hasActiveOverrides) {\n return;\n }\n\n this.flushPendingComposites();\n this.model.updateMatrixWorld(true);\n }\n\n // ============================================================================\n // MESH CONTROL\n // ============================================================================\n\n getMeshList(): MeshInfo[] {\n if (!this.model) return [];\n const result: MeshInfo[] = [];\n this.model.traverse((obj: any) => {\n if (obj.isMesh) {\n const meshInfo = CC4_MESHES[obj.name];\n result.push({\n name: obj.name,\n visible: obj.visible,\n morphCount: obj.morphTargetInfluences?.length || 0,\n category: meshInfo?.category || 'other',\n });\n }\n });\n return result;\n }\n\n /** Get all morph targets grouped by mesh name */\n getMorphTargets(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n if (dict) {\n result[mesh.name] = Object.keys(dict).sort();\n }\n }\n return result;\n }\n\n /** Get morph target indices mapped to labels for each mesh */\n getMorphTargetIndices(): Record<string, { index: number; name: string }[]> {\n const result: Record<string, { index: number; name: string }[]> = {};\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n if (!dict) continue;\n\n const entries = Object.entries(dict).map(([name, index]) => ({\n name,\n index,\n }));\n\n entries.sort((a, b) => a.index - b.index);\n result[mesh.name] = entries;\n }\n return result;\n }\n\n /** Get all resolved bone names and their current transforms */\n getBones(): Record<string, { position: [number, number, number]; rotation: [number, number, number] }> {\n const result: Record<string, { position: [number, number, number]; rotation: [number, number, number] }> = {};\n for (const name of Object.keys(this.bones)) {\n const entry = this.bones[name];\n if (entry) {\n const pos = entry.obj.position;\n const rot = entry.obj.rotation;\n result[name] = {\n position: [pos.x, pos.y, pos.z],\n rotation: [rot.x * 180 / Math.PI, rot.y * 180 / Math.PI, rot.z * 180 / Math.PI],\n };\n }\n }\n return result;\n }\n\n setMeshVisible(meshName: string, visible: boolean): void {\n if (!this.model) return;\n this.frameApplier.setMeshVisible(this.model, meshName, visible);\n }\n\n /**\n * Highlight a mesh with an emissive glow effect\n * @param meshName - Name of the mesh to highlight (null to clear all highlights)\n * @param color - Highlight color (default: cyan 0x00ffff)\n * @param intensity - Emissive intensity (default: 0.5)\n */\n highlightMesh(meshName: string | null, color: number = 0x00ffff, intensity: number = 0.5): void {\n if (!this.model) return;\n this.frameApplier.highlightMesh(this.model, meshName, color, intensity);\n }\n\n /** Get material config for a mesh */\n getMeshMaterialConfig(meshName: string): ThreeResolvedMaterialConfig | null {\n if (!this.model) return null;\n return this.frameApplier.getMeshMaterialConfig(this.model, meshName);\n }\n\n /** Set material config for a mesh */\n setMeshMaterialConfig(meshName: string, config: ThreeMaterialConfig): void {\n if (!this.model) return;\n this.frameApplier.setMeshMaterialConfig(this.model, meshName, config);\n }\n\n // ============================================================================\n // CONFIGURATION\n // ============================================================================\n\n private applyHairPhysicsProfileConfig(): void {\n this.hairPhysics.setHairPhysicsProfileConfig(this.config.hairPhysics);\n }\n\n setProfile(profile: Profile): void {\n this.config = profile;\n this.compositeRotations = this.config.compositeRotations || CC4_COMPOSITE_ROTATIONS;\n this.auToCompositeMap = buildAUToCompositeMap(this.compositeRotations);\n this.mixWeights = { ...profile.auMixDefaults };\n this.syncVisemeRuntimeState();\n let staleMorphTargets: MorphTargetHandle[] = [];\n if (this.model) {\n staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n this.bones = this.resolveBones(this.model);\n this.missingBoneWarnings.clear();\n this.rebuildMorphTargetsCache();\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n this.wasmRuntimeCore?.setProfile(this.config);\n this.refreshHostNeutralModelDescriptor();\n }\n this.hairPhysics.refreshMeshSelection();\n this.applyHairPhysicsProfileConfig();\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n }\n\n getProfile(): Profile { return this.config; }\n\n /**\n * Get the mesh names that should receive morph influences for a given AU.\n * Routing is driven by `auFacePartToMeshCategory` in profile config.\n */\n getMeshNamesForAU(auId: number): string[] {\n return getMeshNamesForAUProfile(this.config, auId);\n }\n\n getMeshNamesForViseme(): string[] {\n return getMeshNamesForVisemeProfile(this.config);\n }\n\n // ============================================================================\n // HAIR PHYSICS\n // ============================================================================\n\n registerHairObjects(objects: Object3D[]): Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> {\n return this.hairPhysics.registerHairObjects(objects);\n }\n\n getRegisteredHairObjects(): Mesh[] {\n return this.hairPhysics.getRegisteredHairObjects();\n }\n\n setHairPhysicsEnabled(enabled: boolean): void {\n this.hairPhysics.setHairPhysicsEnabled(enabled);\n if (enabled) {\n const head = this.getHeadRotation();\n this.hairPhysics.onHeadRotationChanged(head.yaw, head.pitch);\n }\n }\n\n isHairPhysicsEnabled(): boolean {\n return this.hairPhysics.isHairPhysicsEnabled();\n }\n\n setHairPhysicsConfig(config: HairPhysicsConfigUpdate): void {\n this.hairPhysics.setHairPhysicsConfig(config);\n }\n\n getHairPhysicsConfig(): HairPhysicsConfig {\n return this.hairPhysics.getHairPhysicsConfig();\n }\n\n validateHairMorphTargets(): string[] {\n return this.hairPhysics.validateHairMorphTargets();\n }\n\n /** Get head rotation values for hair physics (range -1 to 1) */\n getHeadRotation(): { yaw: number; pitch: number; roll: number } {\n const headNodeKey = this.getHeadBoneNodeKey();\n const headRotation = this.rotations[headNodeKey] ?? this.rotations.HEAD;\n return {\n yaw: headRotation?.yaw ?? 0,\n pitch: headRotation?.pitch ?? 0,\n roll: headRotation?.roll ?? 0,\n };\n }\n\n updateHairPhysics(dt: number): void {\n this.hairPhysics.update(dt);\n }\n\n getHairMorphTargets(meshName?: string): string[] {\n return this.hairPhysics.getHairMorphTargets(meshName);\n }\n\n setMorphOnMeshes(meshNames: string[], morphKey: string, value: number): void {\n this.hairPhysics.setMorphOnMeshes(meshNames, morphKey, value);\n }\n\n applyHairStateToObject(objectName: string, state: {\n color?: { baseColor: string; emissive: string; emissiveIntensity: number };\n outline?: { show: boolean; color: string; opacity: number };\n visible?: boolean;\n scale?: { x: number; y: number; z: number };\n position?: { x: number; y: number; z: number };\n isEyebrow?: boolean;\n }): void {\n this.hairPhysics.applyHairStateToObject(objectName, state);\n }\n\n getHairAppearance() {\n return this.hairPhysics.getHairAppearance();\n }\n\n setHairColor(color: Parameters<HairPhysicsController['setHairColor']>[0]): void {\n this.hairPhysics.setHairColor(color);\n }\n\n setEyebrowColor(color: Parameters<HairPhysicsController['setEyebrowColor']>[0]): void {\n this.hairPhysics.setEyebrowColor(color);\n }\n\n setHairBaseColor(baseColor: string): void {\n this.hairPhysics.setHairBaseColor(baseColor);\n }\n\n setEyebrowBaseColor(baseColor: string): void {\n this.hairPhysics.setEyebrowBaseColor(baseColor);\n }\n\n setHairGlow(emissive: string, intensity: number): void {\n this.hairPhysics.setHairGlow(emissive, intensity);\n }\n\n setEyebrowGlow(emissive: string, intensity: number): void {\n this.hairPhysics.setEyebrowGlow(emissive, intensity);\n }\n\n setHairOutline(outline: { show: boolean; color?: string; opacity?: number }): void {\n this.hairPhysics.setHairOutline(outline);\n }\n\n // ============================================================================\n // PRIVATE METHODS\n // ============================================================================\n\n private computeSideValues(base: number, balance?: number): { left: number; right: number } {\n const b = Math.max(-1, Math.min(1, balance ?? 0));\n if (b === 0) return { left: base, right: base };\n if (b < 0) return { left: base, right: base * (1 + b) };\n return { left: base * (1 - b), right: base };\n }\n\n private getAUMorphsBySide(\n auId: number\n ): { left: MorphTargetRef[]; right: MorphTargetRef[]; center: MorphTargetRef[] } {\n const entry = this.config.auToMorphs[auId];\n return {\n left: entry ? [...entry.left] : [],\n right: entry ? [...entry.right] : [],\n center: entry ? [...entry.center] : [],\n };\n }\n\n private applyMorphTargets(targets: MorphTargetHandle[], val: number): void {\n this.frameApplier.applyMorphTargets(targets, val);\n }\n\n private applyVisemeRuntimeState(): void {\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n this.wasmRuntimeCore?.setViseme(index, this.visemeValues[index] ?? 0, this.visemeJawScales[index] ?? 1);\n }\n\n const appliedViaFrame = this.applyLiveFrameDelta();\n if (!appliedViaFrame) {\n for (const targets of this.resolvedVisemeTargets) {\n this.frameApplier.resetMorphTargets(targets || []);\n }\n\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const targets = this.resolvedVisemeTargets[index] || [];\n for (const target of targets) {\n if (target.idx >= target.infl.length) continue;\n const weighted = clamp01(value * target.weight);\n this.frameApplier.applyMorphTargets(\n [target],\n Math.max(target.infl[target.idx] ?? 0, weighted)\n );\n }\n }\n }\n\n if (!appliedViaFrame) {\n this.updateBoneRotation(this.getJawBoneNodeKey(), 'pitch', this.getActiveVisemeJawAmount());\n }\n }\n\n private getJawBoneNodeKey(): BoneKey {\n const candidates = [\n this.config.auToBones[103]?.[0]?.node,\n this.config.auToBones[26]?.[0]?.node,\n 'JAW',\n ].filter((node): node is BoneKey => !!node);\n return candidates.find((node) => !!this.bones[node])\n ?? candidates[0]\n ?? 'JAW';\n }\n\n private getHeadBoneNodeKey(): BoneKey {\n const candidates = [\n this.config.auToBones[51]?.[0]?.node,\n this.config.auToBones[52]?.[0]?.node,\n this.compositeRotations.find((composite) => (\n composite.yaw?.aus.includes(51)\n || composite.yaw?.aus.includes(52)\n || composite.pitch?.aus.includes(53)\n || composite.pitch?.aus.includes(54)\n || composite.roll?.aus.includes(55)\n || composite.roll?.aus.includes(56)\n ))?.node\n ?? null,\n 'HEAD',\n ].filter((node): node is BoneKey => !!node);\n return candidates.find((node) => !!this.bones[node])\n ?? candidates[0]\n ?? 'HEAD';\n }\n\n private getActiveVisemeJawAmount(): number {\n let jawAmount = 0;\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const jawScale = this.visemeJawScales[index] ?? 1;\n if (Math.abs(jawScale) <= 1e-6) continue;\n jawAmount = Math.max(jawAmount, this.getVisemeJawAmount(index) * value * jawScale);\n }\n return jawAmount;\n }\n\n private getMorphValue(key: string): number {\n if (this.faceMesh) {\n const dict = this.faceMesh.morphTargetDictionary;\n const infl = this.faceMesh.morphTargetInfluences;\n if (dict && infl) {\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private getMorphValueForMeshes(key: string, meshNames?: string[]): number {\n const targets = this.resolveMorphTargets(key, meshNames);\n if (targets.length > 0) {\n return targets[0].infl[targets[0].idx] ?? 0;\n }\n return this.getMorphValue(key);\n }\n\n private getMorphValueByIndex(index: number): number {\n const idx = Number.isInteger(index) && index >= 0 ? index : null;\n if (idx === null) return 0;\n if (this.faceMesh) {\n const infl = this.faceMesh.morphTargetInfluences;\n if (infl && idx < infl.length) {\n return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const infl = mesh.morphTargetInfluences;\n if (!infl) continue;\n if (idx < infl.length) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private getMorphValueByIndexForMeshes(index: number, meshNames?: string[]): number {\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n if (targets.length > 0) {\n return targets[0].infl[targets[0].idx] ?? 0;\n }\n return this.getMorphValueByIndex(index);\n }\n\n private validateMorphTargetDelta(target: MorphTargetDelta, options: AddMorphTargetOptions): void {\n const mesh = this.requireNamedMesh(target.meshName);\n const geometry = mesh.geometry;\n const position = geometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot add morph target \"${target.name}\" to mesh \"${target.meshName}\": geometry has no position attribute.`);\n }\n if (!target.name || !target.name.trim()) {\n throw new Error(`Cannot add morph target to mesh \"${target.meshName}\": target name is required.`);\n }\n\n const existingIndex = this.getMeshMorphDictionary(mesh)[target.name];\n if (existingIndex !== undefined && options.replace !== true) {\n throw new Error(`Morph target \"${target.name}\" already exists on mesh \"${target.meshName}\". Pass replace: true to overwrite it.`);\n }\n\n this.assertMorphAttributeDataLength(target.name, 'position', target.position, position.itemSize, position.count);\n const normal = geometry.getAttribute('normal');\n if (target.normal) {\n this.assertMorphAttributeDataLength(target.name, 'normal', target.normal, normal?.itemSize ?? 3, position.count);\n }\n const tangent = geometry.getAttribute('tangent');\n if (target.tangent) {\n this.assertMorphAttributeDataLength(target.name, 'tangent', target.tangent, tangent?.itemSize ?? 4, position.count);\n }\n this.assertCompatibleMorphTargetMode(geometry, target);\n }\n\n private applyMorphTargetDelta(target: MorphTargetDelta, options: AddMorphTargetOptions): number {\n const mesh = this.requireNamedMesh(target.meshName);\n const sourceGeometry = mesh.geometry;\n const position = sourceGeometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot add morph target \"${target.name}\" to mesh \"${target.meshName}\": geometry has no position attribute.`);\n }\n if (!target.name || !target.name.trim()) {\n throw new Error(`Cannot add morph target to mesh \"${target.meshName}\": target name is required.`);\n }\n\n const replace = options.replace === true;\n const resetInfluence = options.resetInfluence !== false;\n const forceGeometryReplacement = options.forceGeometryReplacement !== false;\n const previousInfluences = mesh.morphTargetInfluences ? [...mesh.morphTargetInfluences] : [];\n const previousDictionary = this.getMeshMorphDictionary(mesh);\n const existingIndex = previousDictionary[target.name];\n\n if (existingIndex !== undefined && !replace) {\n throw new Error(`Morph target \"${target.name}\" already exists on mesh \"${target.meshName}\". Pass replace: true to overwrite it.`);\n }\n this.assertCompatibleMorphTargetMode(sourceGeometry, target);\n\n const geometry = forceGeometryReplacement ? sourceGeometry.clone() : sourceGeometry;\n const dictionary = { ...previousDictionary };\n const usedIndices = Object.values(dictionary).filter(Number.isInteger);\n const existingAttributeTargetCount = Math.max(\n 0,\n ...Object.values(geometry.morphAttributes).map((attributes) => attributes?.length ?? 0)\n );\n const nextIndex = Math.max(existingAttributeTargetCount, usedIndices.length ? Math.max(...usedIndices) + 1 : 0);\n const index = existingIndex ?? nextIndex;\n dictionary[target.name] = index;\n\n this.setMorphAttributeAtIndex(geometry, 'position', target.position, position.itemSize, position.count, index, target.name);\n\n const normal = geometry.getAttribute('normal');\n if (target.normal) {\n this.setMorphAttributeAtIndex(geometry, 'normal', target.normal, normal?.itemSize ?? 3, position.count, index, target.name);\n } else {\n this.setZeroMorphAttributeAtIndex(geometry, 'normal', normal?.itemSize ?? 3, position.count, index, target.name);\n }\n\n const tangent = geometry.getAttribute('tangent');\n if (target.tangent) {\n this.setMorphAttributeAtIndex(geometry, 'tangent', target.tangent, tangent?.itemSize ?? 4, position.count, index, target.name);\n } else {\n this.setZeroMorphAttributeAtIndex(geometry, 'tangent', tangent?.itemSize ?? 4, position.count, index, target.name);\n }\n const color = geometry.getAttribute('color');\n const existingColorMorph = geometry.morphAttributes.color?.find(Boolean);\n this.setZeroMorphAttributeAtIndex(\n geometry,\n 'color',\n color?.itemSize ?? existingColorMorph?.itemSize ?? 3,\n position.count,\n index,\n target.name\n );\n\n geometry.morphTargetsRelative = target.relative !== false;\n (geometry as any).morphTargetDictionary = dictionary;\n\n if (forceGeometryReplacement) {\n mesh.geometry = geometry;\n sourceGeometry.dispose();\n }\n\n const influenceLength = Math.max(previousInfluences.length, index + 1);\n const influences = previousInfluences.slice(0, influenceLength);\n while (influences.length < influenceLength) {\n influences.push(0);\n }\n if (resetInfluence) {\n influences[index] = 0;\n }\n\n mesh.morphTargetDictionary = dictionary;\n mesh.morphTargetInfluences = influences;\n this.addRuntimeMorphMesh(mesh);\n\n if (!this.config.morphToMesh?.face?.length) {\n this.config.morphToMesh = {\n ...this.config.morphToMesh,\n face: [mesh.name],\n };\n }\n\n return index;\n }\n\n private requireNamedMesh(meshName: string): Mesh {\n const mesh = this.meshByName.get(meshName);\n if (mesh) return mesh;\n\n if (this.model) {\n let found: Mesh | null = null;\n this.model.traverse((obj: any) => {\n if (!found && obj.isMesh && obj.name === meshName) {\n found = obj as Mesh;\n }\n });\n if (found) {\n this.meshByName.set(meshName, found);\n return found;\n }\n }\n\n throw new Error(`Mesh \"${meshName}\" was not found in the current model.`);\n }\n\n private getMeshMorphDictionary(mesh: Mesh): Record<string, number> {\n const meshDictionary = mesh.morphTargetDictionary as Record<string, number> | undefined;\n const geometryDictionary = (mesh.geometry as any).morphTargetDictionary as Record<string, number> | undefined;\n const dictionary = meshDictionary || geometryDictionary || {};\n mesh.morphTargetDictionary = dictionary;\n (mesh.geometry as any).morphTargetDictionary = dictionary;\n return dictionary;\n }\n\n private assertMorphAttributeDataLength(\n name: string,\n semantic: string,\n data: Float32Array | number[],\n itemSize: number,\n vertexCount: number\n ): void {\n const expectedLength = vertexCount * itemSize;\n if (data.length !== expectedLength) {\n throw new Error(\n `Morph target \"${name}\" ${semantic} data has ${data.length} values; expected ${expectedLength} ` +\n `(${vertexCount} vertices * itemSize ${itemSize}).`\n );\n }\n }\n\n private assertCompatibleMorphTargetMode(geometry: Mesh['geometry'], target: MorphTargetDelta): void {\n const hasExistingMorphTargets = Object.values(geometry.morphAttributes).some((attributes) => (attributes?.length ?? 0) > 0);\n if (!hasExistingMorphTargets) return;\n\n const targetIsRelative = target.relative !== false;\n if (geometry.morphTargetsRelative !== targetIsRelative) {\n const existingMode = geometry.morphTargetsRelative ? 'relative' : 'absolute';\n const targetMode = targetIsRelative ? 'relative' : 'absolute';\n throw new Error(\n `Cannot add ${targetMode} morph target \"${target.name}\" to mesh \"${target.meshName}\" because existing morph targets are ${existingMode}.`\n );\n }\n }\n\n private setMorphAttributeAtIndex(\n geometry: Mesh['geometry'],\n semantic: string,\n data: Float32Array | number[],\n itemSize: number,\n vertexCount: number,\n index: number,\n name: string\n ): void {\n this.assertMorphAttributeDataLength(name, semantic, data, itemSize, vertexCount);\n\n const expectedLength = vertexCount * itemSize;\n const attributes = geometry.morphAttributes[semantic] ? [...geometry.morphAttributes[semantic]] : [];\n while (attributes.length < index) {\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = `morph_${attributes.length}`;\n attributes.push(empty);\n }\n\n const values = data instanceof Float32Array ? new Float32Array(data) : Float32Array.from(data);\n const attribute = new BufferAttribute(values, itemSize);\n (attribute as any).name = name;\n attributes[index] = attribute;\n geometry.morphAttributes[semantic] = attributes;\n }\n\n private setZeroMorphAttributeAtIndex(\n geometry: Mesh['geometry'],\n semantic: string,\n itemSize: number,\n vertexCount: number,\n index: number,\n name: string\n ): void {\n if (!geometry.morphAttributes[semantic]?.length) return;\n\n const expectedLength = vertexCount * itemSize;\n const attributes = [...geometry.morphAttributes[semantic]];\n while (attributes.length < index) {\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = `morph_${attributes.length}`;\n attributes.push(empty);\n }\n\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = name;\n attributes[index] = empty;\n geometry.morphAttributes[semantic] = attributes;\n }\n\n private addRuntimeMorphMesh(mesh: Mesh): void {\n const key = mesh.name || (mesh as any).uuid;\n const exists = this.meshes.some((candidate) => (candidate.name || (candidate as any).uuid) === key);\n if (!exists) {\n this.meshes.push(mesh);\n }\n }\n\n private getMorphKeyCacheKey(key: string, meshNames?: string[]): string {\n return meshNames?.length ? `key:${key}@${meshNames.join(',')}` : `key:${key}`;\n }\n\n private getMorphIndexCacheKey(index: number, meshNames?: string[]): string {\n return meshNames?.length ? `idx:${index}@${meshNames.join(',')}` : `idx:${index}`;\n }\n\n private syncVisemeRuntimeState(): void {\n const visemeCount = getProfileVisemeSlots(this.config).length;\n this.visemeValues = Array.from(\n { length: visemeCount },\n (_, index) => this.visemeValues[index] ?? 0\n );\n this.visemeJawScales = Array.from(\n { length: visemeCount },\n (_, index) => this.visemeJawScales[index] ?? 1\n );\n }\n\n private getVisemeJawAmount(visemeIndex: number): number {\n return getVisemeJawAmounts(this.config)?.[visemeIndex]\n ?? this.config.visemeJawAmounts?.[visemeIndex]\n ?? Embody.VISEME_JAW_AMOUNTS[visemeIndex]\n ?? 0;\n }\n\n private collectResolvedExpressionMorphTargets(): MorphTargetHandle[] {\n const targets: MorphTargetHandle[] = [];\n\n for (const resolved of this.resolvedAUMorphTargets.values()) {\n targets.push(...resolved.left, ...resolved.right, ...resolved.center);\n }\n\n for (const resolved of this.resolvedVisemeTargets) {\n if (resolved?.length) {\n targets.push(...resolved);\n }\n }\n\n return targets;\n }\n\n private resetMorphTargetHandles(targets: MorphTargetHandle[]): void {\n this.frameApplier.resetMorphTargets(targets);\n }\n\n private isMixedAU(id: number): boolean {\n const morphs = this.config.auToMorphs[id];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && this.config.auToBones[id]?.length);\n }\n\n private getEffectiveBoneAUValue(auId: number, nodeKey: string): number {\n const rawValue = clamp01(this.auValues[auId] ?? 0);\n if (rawValue <= 1e-6) return 0;\n\n const binding = this.config.auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n\n return rawValue * getSideScale(this.auBalances[auId] ?? 0, binding.side);\n }\n\n private getCompositeAxisValueForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined\n ): number {\n return getCompositeAxisValue(axisConfig, (auId: number) => this.getEffectiveBoneAUValue(auId, nodeKey));\n }\n\n private getCompositeAxisBindingForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined,\n direction: number\n ) {\n return getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n direction,\n (auId: number) => this.getEffectiveBoneAUValue(auId, nodeKey),\n this.config.auToBones\n );\n }\n\n private initBoneRotations(): void {\n this.rotations = {};\n this.pendingCompositeNodes.clear();\n\n const allBoneKeys = Array.from(\n new Set(Object.values(this.config.auToBones).flat().map((binding) => binding.node))\n );\n\n for (const node of allBoneKeys) {\n this.rotations[node] = { pitch: 0, yaw: 0, roll: 0 };\n this.pendingCompositeNodes.add(node);\n }\n }\n\n /** Update rotation state - just stores -1 to 1 value like stable version */\n private updateBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', value: number): void {\n if (!this.rotations[nodeKey]) return;\n this.rotations[nodeKey][axis] = Math.max(-1, Math.min(1, value));\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private updateBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', value: number, maxUnits: number): void {\n if (!this.translations[nodeKey]) this.translations[nodeKey] = { x: 0, y: 0, z: 0 };\n const clamped = Math.max(-1, Math.min(1, value));\n const offset = clamped * maxUnits;\n if (channel === 'tx') this.translations[nodeKey].x = offset;\n else if (channel === 'ty') this.translations[nodeKey].y = offset;\n else this.translations[nodeKey].z = offset;\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private transitionBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', to: number, durationMs = 200): TransitionHandle {\n const transitionKey = `bone_${nodeKey}_${axis}`;\n const from = this.rotations[nodeKey]?.[axis] ?? 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneRotation(nodeKey, axis, value));\n }\n\n private transitionBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', to: number, maxUnits: number, durationMs = 200): TransitionHandle {\n const transitionKey = `boneT_${nodeKey}_${channel}`;\n const current = this.translations[nodeKey] || { x: 0, y: 0, z: 0 };\n const currentOffset = channel === 'tx' ? current.x : channel === 'ty' ? current.y : current.z;\n const from = maxUnits !== 0 ? Math.max(-1, Math.min(1, currentOffset / maxUnits)) : 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneTranslation(nodeKey, channel, value, maxUnits));\n }\n\n private flushPendingComposites(): void {\n if (this.pendingCompositeNodes.size === 0) return;\n\n const headNodeKey = this.getHeadBoneNodeKey();\n const headChanged = this.pendingCompositeNodes.has(headNodeKey) || this.pendingCompositeNodes.has('HEAD');\n\n for (const nodeKey of this.pendingCompositeNodes) {\n this.applyCompositeRotation(nodeKey as BoneKey);\n }\n this.pendingCompositeNodes.clear();\n\n // Update hair when head rotation changes\n if (headChanged && this.hairPhysics.isHairPhysicsEnabled()) {\n const headRotation = this.rotations[headNodeKey] ?? this.rotations.HEAD;\n this.hairPhysics.onHeadRotationChanged(\n headRotation?.yaw ?? 0,\n headRotation?.pitch ?? 0\n );\n }\n }\n\n /**\n * Apply composite rotation using quaternion composition like stable version.\n * Looks up maxDegrees and channel from BONE_AU_TO_BINDINGS.\n */\n private applyCompositeRotation(nodeKey: BoneKey): void {\n const entry = this.bones[nodeKey];\n if (!entry || !this.model) {\n if (!entry && this.rigReady && !this.missingBoneWarnings.has(nodeKey)) {\n this.missingBoneWarnings.add(nodeKey);\n }\n return;\n }\n\n const { obj, basePos, baseQuat } = entry;\n const rotState = this.rotations[nodeKey];\n if (!rotState) {\n return;\n }\n\n // Find the composite rotation config for this node\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) {\n return;\n }\n\n // Helper to get Vector3 axis from channel\n const getAxis = (channel: 'rx' | 'ry' | 'rz') =>\n channel === 'rx' ? X_AXIS : channel === 'ry' ? Y_AXIS : Z_AXIS;\n\n // Build composite quaternion from base\n const compositeQ = new Quaternion().copy(baseQuat);\n\n // Apply yaw rotation\n if (config.yaw && rotState.yaw !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.yaw, rotState.yaw);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.yaw) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n // Apply pitch rotation\n if (config.pitch && rotState.pitch !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.pitch, rotState.pitch);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.pitch) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n // Apply roll rotation\n if (config.roll && rotState.roll !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.roll, rotState.roll);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.roll) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n const t = this.translations[nodeKey];\n this.frameApplier.applyObjectTransform(obj, {\n position: {\n x: basePos.x + (t?.x ?? 0),\n y: basePos.y + (t?.y ?? 0),\n z: basePos.z + (t?.z ?? 0),\n },\n rotation: {\n x: compositeQ.x,\n y: compositeQ.y,\n z: compositeQ.z,\n w: compositeQ.w,\n },\n });\n this.model.updateMatrixWorld(true);\n }\n\n private resolveBones(root: Object3D): ResolvedBones {\n const resolved: ResolvedBones = {};\n const previousBones = this.bones;\n\n const snapshot = (obj: any): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const snapshotPreservingBasePose = (obj: Object3D): NodeBase => {\n const existing = Object.values(previousBones).find((entry) => entry?.obj === obj);\n if (!existing) {\n return snapshot(obj);\n }\n\n return {\n obj,\n basePos: { ...existing.basePos },\n baseQuat: existing.baseQuat.clone(),\n baseEuler: { ...existing.baseEuler },\n };\n };\n\n // Build suffix regex from config pattern\n const prefix = this.config.bonePrefix || '';\n const suffix = this.config.boneSuffix || '';\n const suffixRegex = this.config.suffixPattern\n ? new RegExp(this.config.suffixPattern)\n : null;\n\n const findNode = (baseName?: string | null): Object3D | undefined => {\n if (!baseName) return undefined;\n\n const directMatch = root.getObjectByName(baseName);\n if (directMatch) return directMatch;\n\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n const fullName = suffix && !prefixedBase.endsWith(suffix)\n ? `${prefixedBase}${suffix}`\n : prefixedBase;\n\n const exactMatch = root.getObjectByName(fullName);\n if (exactMatch) return exactMatch;\n\n // Try fuzzy match with suffix pattern if configured\n if (suffixRegex) {\n let found: Object3D | undefined;\n root.traverse((obj: any) => {\n if (found) return; // Already found\n if (obj.name && obj.name.startsWith(fullName)) {\n const suffix = obj.name.slice(fullName.length);\n // Match if suffix is empty or matches the pattern\n if (suffix === '' || suffixRegex.test(suffix)) {\n found = obj;\n }\n }\n });\n if (found) return found;\n }\n\n return undefined;\n };\n\n const addResolvedBone = (key: string, node: Object3D) => {\n const entry = snapshotPreservingBasePose(node);\n resolved[key] = entry;\n if (node.name) {\n resolved[node.name] = entry;\n }\n };\n\n for (const [key, nodeName] of Object.entries(this.config.boneNodes)) {\n const node = findNode(nodeName);\n if (node) {\n addResolvedBone(key, node);\n if (nodeName) {\n resolved[nodeName] = resolved[key]!;\n }\n }\n }\n\n if (!resolved.EYE_L && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.LEFT);\n if (node) {\n addResolvedBone('EYE_L', node);\n }\n }\n if (!resolved.EYE_R && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.RIGHT);\n if (node) {\n addResolvedBone('EYE_R', node);\n }\n }\n\n const referencedNodes = new Set<string>();\n Object.values(this.config.auToBones ?? {}).forEach((bindings) => {\n bindings.forEach((binding) => referencedNodes.add(binding.node));\n });\n this.compositeRotations.forEach((composite) => referencedNodes.add(composite.node));\n Object.values(this.config.continuumPairs ?? {}).forEach((pair) => {\n if (pair?.node) referencedNodes.add(pair.node);\n });\n this.config.annotationRegions?.forEach((region) => {\n region.bones?.forEach((boneName) => referencedNodes.add(boneName));\n });\n\n referencedNodes.forEach((nodeKey) => {\n if (resolved[nodeKey]) return;\n const configuredName = this.config.boneNodes?.[nodeKey] ?? nodeKey;\n const node = findNode(configuredName);\n if (node) {\n addResolvedBone(nodeKey, node);\n if (configuredName) {\n resolved[configuredName] = resolved[nodeKey]!;\n }\n }\n });\n\n return resolved;\n }\n\n private combineHandles(handles: TransitionHandle[]): TransitionHandle {\n if (handles.length === 0) return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n if (handles.length === 1) return handles[0];\n return {\n promise: Promise.all(handles.map((h) => h.promise)).then(() => {}),\n pause: () => handles.forEach((h) => h.pause()),\n resume: () => handles.forEach((h) => h.resume()),\n cancel: () => handles.forEach((h) => h.cancel()),\n };\n }\n\n /**\n * Apply render order and material settings from CC4_MESHES to all meshes.\n * This ensures proper layering (e.g., hair renders on top of eyebrows).\n * Also auto-registers hair and eyebrow meshes for hair physics.\n */\n private applyMeshMaterialSettings(root: Object3D): void {\n // Clear and rebuild hair object registry\n this.hairPhysics.clearRegisteredHairObjects();\n\n root.traverse((obj: any) => {\n if (!obj.isMesh || !obj.name) return;\n\n // Merge config.meshes (user overrides) with CC4_MESHES (preset defaults).\n // User overrides may only contain material settings, so always merge with\n // the preset to preserve category and other fields needed for registration.\n const configMesh = this.config.meshes?.[obj.name];\n const presetMesh = CC4_MESHES[obj.name];\n const meshInfo = configMesh && presetMesh ? { ...presetMesh, ...configMesh } : configMesh ?? presetMesh;\n const category = meshInfo?.category;\n\n // Auto-register hair and eyebrow meshes for hair physics\n if (category === 'hair' || category === 'eyebrow') {\n this.hairPhysics.autoRegisterHairMesh(obj as Mesh, category);\n }\n\n if (!meshInfo?.material) return;\n\n this.frameApplier.setMeshMaterialConfig(root, obj.name, meshInfo.material as ThreeMaterialConfig);\n });\n\n }\n\n // ============================================================================\n // MIXER / CLIP CONTROL\n // ============================================================================\n\n loadAnimationClips(clips: unknown[]): void {\n this.animationController.loadAnimationClips(clips);\n }\n\n getAnimationClips(): AnimationClipInfo[] {\n return this.animationController.getAnimationClips();\n }\n\n removeAnimationClip(clipName: string): boolean {\n return this.animationController.removeAnimationClip(clipName);\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.animationController.playAnimation(clipName, options);\n }\n\n stopAnimation(clipName: string): void {\n this.animationController.stopAnimation(clipName);\n }\n\n stopAllAnimations(): void {\n this.animationController.stopAllAnimations();\n }\n\n pauseAnimation(clipName: string): void {\n this.animationController.pauseAnimation(clipName);\n }\n\n resumeAnimation(clipName: string): void {\n this.animationController.resumeAnimation(clipName);\n }\n\n pauseAllAnimations(): void {\n this.animationController.pauseAllAnimations();\n }\n\n resumeAllAnimations(): void {\n this.animationController.resumeAllAnimations();\n }\n\n setAnimationSpeed(clipName: string, speed: number): void {\n this.animationController.setAnimationSpeed(clipName, speed);\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n this.animationController.setAnimationIntensity(clipName, intensity);\n }\n\n setAnimationLoopMode(clipName: string, loopMode: 'repeat' | 'once' | 'pingpong'): void {\n this.animationController.setAnimationLoopMode(clipName, loopMode);\n }\n\n setAnimationRepeatCount(clipName: string, repeatCount?: number): void {\n this.animationController.setAnimationRepeatCount(clipName, repeatCount);\n }\n\n setAnimationReverse(clipName: string, reverse: boolean): void {\n this.animationController.setAnimationReverse(clipName, reverse);\n }\n\n setAnimationBlendMode(clipName: string, blendMode: AnimationBlendMode): void {\n this.animationController.setAnimationBlendMode(clipName, blendMode);\n }\n\n seekAnimation(clipName: string, time: number): void {\n this.animationController.seekAnimation(clipName, time);\n }\n\n setAnimationTimeScale(timeScale: number): void {\n this.animationController.setAnimationTimeScale(timeScale);\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n return this.animationController.getAnimationState(clipName);\n }\n\n getPlayingAnimations(): AnimationState[] {\n return this.animationController.getPlayingAnimations();\n }\n\n crossfadeTo(clipName: string, duration = 0.3, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.animationController.crossfadeTo(clipName, duration, options);\n }\n\n snippetToClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): AnimationClip | null {\n return this.animationController.snippetToClip(clipName, curves, options);\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n return this.animationController.playClip(clip, options);\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap } | TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.playSnippet(snippet, options);\n }\n\n playTypedSnippet(\n snippet: TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.playTypedSnippet(snippet, options);\n }\n\n buildClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.buildClip(clipName, curves, options);\n }\n\n buildTypedClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.buildTypedClip(clipName, channels, options);\n }\n\n typedSnippetToClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): AnimationClip | null {\n return this.animationController.typedSnippetToClip(clipName, channels, options);\n }\n\n cleanupSnippet(name: string) {\n this.animationController.cleanupSnippet(name);\n }\n\n updateClipParams(\n name: string,\n params: { weight?: number; rate?: number; loop?: boolean; loopMode?: 'once' | 'repeat' | 'pingpong'; repeatCount?: number; reverse?: boolean; actionId?: string }\n ): boolean {\n return this.animationController.updateClipParams(name, params);\n }\n\n /**\n * Check if curves can be played through buildClip.\n * Returns false if curves contain data that cannot be converted to mixer tracks.\n */\n supportsClipCurves(\n curves: Record<string, Array<{ time: number; intensity: number; inherit?: boolean }>>\n ): boolean {\n // Currently all curve-based playback is supported - bone AUs are handled via\n // quaternion tracks in the generated clip\n return Object.keys(curves).length > 0;\n }\n}\n\n/**\n * Helper function to collect meshes with morph targets from a scene.\n */\nexport function collectMorphMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n const dict = obj.morphTargetDictionary;\n const infl = obj.morphTargetInfluences;\n if ((dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0)) {\n meshes.push(obj);\n }\n }\n });\n return meshes;\n}\n\nexport function buildFrameApplierBindings(\n inspection: ReturnType<ThreeModelInspector['inspectModel']>\n): ThreeFrameApplierBindings {\n const meshes = new Map<import('../../core/contracts').MeshId, Mesh>();\n for (const meshDesc of inspection.descriptor.meshes) {\n const mesh = inspection.meshByName.get(meshDesc.name)\n || inspection.allMeshes.find((candidate) => candidate.name === meshDesc.name);\n if (mesh) {\n meshes.set(meshDesc.id, mesh);\n }\n }\n\n const morphTargets = new Map<\n import('../../core/contracts').MorphTargetId,\n { meshId: import('../../core/contracts').MeshId; mesh: Mesh; index: number }\n >();\n for (const morph of inspection.descriptor.morphTargets) {\n const mesh = meshes.get(morph.meshId);\n if (!mesh || morph.hostIndex === undefined) continue;\n morphTargets.set(morph.id, {\n meshId: morph.meshId,\n mesh,\n index: morph.hostIndex,\n });\n }\n\n const bonesByName = new Map<string, Object3D>();\n for (const entry of Object.values(inspection.bones)) {\n if (entry?.obj?.name) {\n bonesByName.set(entry.obj.name, entry.obj);\n }\n }\n if (inspection.allMeshes[0]?.parent) {\n let root: Object3D | null = inspection.allMeshes[0];\n while (root?.parent) root = root.parent;\n root?.traverse((obj) => {\n if (obj.name && !bonesByName.has(obj.name)) {\n bonesByName.set(obj.name, obj);\n }\n });\n }\n\n const bones = new Map<import('../../core/contracts').BoneId, Object3D>();\n for (const boneDesc of inspection.descriptor.bones) {\n const bone = bonesByName.get(boneDesc.name);\n if (bone) {\n bones.set(boneDesc.id, bone);\n }\n }\n\n return { meshes, morphTargets, bones };\n}\n","import {\n AnimationClip,\n NumberKeyframeTrack,\n QuaternionKeyframeTrack,\n VectorKeyframeTrack,\n} from 'three';\nimport type { Object3D } from 'three';\nimport type {\n BoneId,\n ClipIR,\n ClipTrackIR,\n MeshId,\n MorphTargetId,\n NumericArray,\n} from '../../core/contracts';\n\nexport interface ThreeClipMeshBinding {\n readonly trackName: string;\n}\n\nexport interface ThreeClipMorphTargetBinding {\n readonly meshId: MeshId;\n readonly index: number;\n}\n\nexport interface ThreeClipAdapterBindings {\n readonly meshes?: ReadonlyMap<MeshId, Object3D | ThreeClipMeshBinding>;\n readonly morphTargets?: ReadonlyMap<MorphTargetId, ThreeClipMorphTargetBinding>;\n readonly bones?: ReadonlyMap<BoneId, Object3D | string>;\n}\n\nexport class ThreeClipAdapter {\n private meshes = new Map<MeshId, Object3D | ThreeClipMeshBinding>();\n private morphTargets = new Map<MorphTargetId, ThreeClipMorphTargetBinding>();\n private bones = new Map<BoneId, Object3D | string>();\n\n constructor(bindings: ThreeClipAdapterBindings = {}) {\n this.setBindings(bindings);\n }\n\n setBindings(bindings: ThreeClipAdapterBindings): void {\n this.meshes = new Map(bindings.meshes || []);\n this.morphTargets = new Map(bindings.morphTargets || []);\n this.bones = new Map(bindings.bones || []);\n }\n\n toAnimationClip(clip: ClipIR): AnimationClip {\n return new AnimationClip(\n clip.name,\n clip.durationSeconds,\n clip.tracks.map((track) => this.toKeyframeTrack(track)).filter((track): track is NonNullable<typeof track> => !!track)\n );\n }\n\n private toKeyframeTrack(track: ClipTrackIR) {\n if (track.target.kind === 'morphTarget') {\n const morph = this.morphTargets.get(track.target.morphTargetId);\n const mesh = this.meshes.get(track.target.meshId);\n if (!morph || !mesh) return null;\n return new NumberKeyframeTrack(\n `${getTrackName(mesh)}.morphTargetInfluences[${morph.index}]`,\n toArray(track.times),\n toArray(track.values)\n );\n }\n\n if (track.target.kind === 'boneTransform') {\n const bone = this.bones.get(track.target.boneId);\n if (!bone) return null;\n const targetName = getTrackName(bone);\n const times = toArray(track.times);\n const values = toArray(track.values);\n\n if (track.target.property === 'rotation') {\n return new QuaternionKeyframeTrack(`${targetName}.quaternion`, times, values);\n }\n if (track.target.property === 'position') {\n return new VectorKeyframeTrack(`${targetName}.position`, times, values);\n }\n return new VectorKeyframeTrack(`${targetName}.scale`, times, values);\n }\n\n if (track.target.kind === 'meshVisibility') {\n const mesh = this.meshes.get(track.target.meshId);\n if (!mesh) return null;\n return new NumberKeyframeTrack(`${getTrackName(mesh)}.visible`, toArray(track.times), toArray(track.values));\n }\n\n return null;\n }\n}\n\nfunction getTrackName(value: Object3D | string | ThreeClipMeshBinding): string {\n if (typeof value === 'string') return value;\n if ('trackName' in value) return value.trackName;\n return value.uuid || value.name;\n}\n\nfunction toArray(values: NumericArray): number[] {\n return Array.from(values);\n}\n","/**\n * Default Three.js scene host for Embody characters.\n *\n * Creates renderer / scene / camera / lighting / shadow plane and mounts the\n * canvas into a caller-supplied HTMLElement. Advanced callers can skip this\n * and inject an existing Three.js scene via createCharacterHost.\n */\n\nimport {\n ACESFilmicToneMapping,\n Color,\n DirectionalLight,\n HemisphereLight,\n MathUtils,\n Mesh,\n PCFSoftShadowMap,\n PerspectiveCamera,\n PlaneGeometry,\n PMREMGenerator,\n Scene,\n ShadowMaterial,\n SRGBColorSpace,\n WebGLRenderer,\n type Texture,\n type WebGLRenderTarget,\n} from 'three';\nimport { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';\n\nexport type DefaultCharacterLightingPresetId =\n | 'cleanStudio'\n | 'softFill'\n | 'inspection'\n | 'contrast';\n\nexport interface DefaultCharacterLightingSettings {\n envMapEnabled: boolean;\n environmentIntensity: number;\n environmentBlur: number;\n exposure: number;\n ambientIntensity: number;\n keyIntensity: number;\n fillIntensity: number;\n rimIntensity: number;\n shadowOpacity: number;\n}\n\nexport interface DefaultCharacterLightingController {\n getSettings: () => DefaultCharacterLightingSettings;\n getEnvironmentTexture: () => Texture | null;\n setSettings: (patch: Partial<DefaultCharacterLightingSettings>) => DefaultCharacterLightingSettings;\n setPreset: (presetId: DefaultCharacterLightingPresetId) => DefaultCharacterLightingSettings;\n subscribe: (listener: (settings: DefaultCharacterLightingSettings) => void) => () => void;\n dispose: () => void;\n}\n\nexport type CharacterSceneTypeId = 'studio' | 'showcase' | 'inspection' | 'void';\n\n/** A named bundle of scene defaults (background, lighting preset, shadow plane). */\nexport interface CharacterSceneTypeDefinition {\n id: CharacterSceneTypeId;\n label: string;\n description: string;\n /** Scene background color (hex), or null for a transparent canvas. */\n background: number | null;\n lightingPreset: DefaultCharacterLightingPresetId;\n shadowPlane: boolean;\n}\n\nexport interface DefaultCharacterSceneOptions {\n /** Named scene type providing background/lighting/shadow defaults. Default: 'studio' */\n type?: CharacterSceneTypeId;\n /** Perspective camera FOV. Default: 45 */\n cameraFov?: number;\n /** Cap device pixel ratio. Default: 1.5 */\n pixelRatioCap?: number;\n /** Enable shadow maps. Default: true */\n shadows?: boolean;\n /** Add a ground shadow receiver. Default: from scene type */\n shadowPlane?: boolean;\n /** Scene background color (hex or CSS string), or null for transparent. Default: from scene type */\n background?: number | string | null;\n /** Initial lighting settings / overrides */\n lighting?: Partial<DefaultCharacterLightingSettings>;\n /** Lighting preset applied before lighting overrides. Default: from scene type */\n lightingPreset?: DefaultCharacterLightingPresetId;\n /** Listen for window resize. Default: true */\n manageResize?: boolean;\n}\n\nexport interface DefaultCharacterScene {\n container: HTMLElement;\n scene: Scene;\n renderer: WebGLRenderer;\n camera: PerspectiveCamera;\n lighting: DefaultCharacterLightingController;\n shadowPlane: Mesh | null;\n /** Resolved scene type used for defaults. */\n sceneType: CharacterSceneTypeId;\n ownsScene: true;\n resize: () => void;\n dispose: () => void;\n}\n\nexport const DEFAULT_CHARACTER_SCENE_TYPE_ID: CharacterSceneTypeId = 'studio';\n\nexport const CHARACTER_SCENE_TYPES: Record<CharacterSceneTypeId, CharacterSceneTypeDefinition> = {\n studio: {\n id: 'studio',\n label: 'Studio',\n description: 'Transparent background, soft studio lighting, ground shadow.',\n background: null,\n lightingPreset: 'cleanStudio',\n shadowPlane: true,\n },\n showcase: {\n id: 'showcase',\n label: 'Showcase',\n description: 'Dark backdrop with contrasty key/rim lighting for presentation shots.',\n background: 0x101216,\n lightingPreset: 'contrast',\n shadowPlane: true,\n },\n inspection: {\n id: 'inspection',\n label: 'Inspection',\n description: 'Bright, even lighting on a light backdrop for close-up review.',\n background: 0xe8eaed,\n lightingPreset: 'inspection',\n shadowPlane: true,\n },\n void: {\n id: 'void',\n label: 'Void',\n description: 'Transparent background, soft fill lighting, no ground shadow.',\n background: null,\n lightingPreset: 'softFill',\n shadowPlane: false,\n },\n};\n\nexport const CHARACTER_SCENE_TYPE_IDS: readonly CharacterSceneTypeId[] = [\n 'studio',\n 'showcase',\n 'inspection',\n 'void',\n];\n\nconst LIGHT_NAMES = {\n ambient: 'embodyCharacterAmbientHemisphereLight',\n key: 'embodyCharacterKeyLight',\n fill: 'embodyCharacterFillLight',\n rim: 'embodyCharacterRimLight',\n} as const;\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_ID: DefaultCharacterLightingPresetId = 'cleanStudio';\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESETS: Record<\n DefaultCharacterLightingPresetId,\n { id: DefaultCharacterLightingPresetId; label: string; settings: DefaultCharacterLightingSettings }\n> = {\n cleanStudio: {\n id: 'cleanStudio',\n label: 'Soft Studio',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.24,\n environmentBlur: 0.04,\n exposure: 1.08,\n ambientIntensity: 0.32,\n keyIntensity: 0.52,\n fillIntensity: 0.18,\n rimIntensity: 0.08,\n shadowOpacity: 0.22,\n },\n },\n softFill: {\n id: 'softFill',\n label: 'Soft Fill',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.3,\n environmentBlur: 0.04,\n exposure: 1.1,\n ambientIntensity: 0.38,\n keyIntensity: 0.44,\n fillIntensity: 0.24,\n rimIntensity: 0.1,\n shadowOpacity: 0.18,\n },\n },\n inspection: {\n id: 'inspection',\n label: 'Inspection',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.45,\n environmentBlur: 0.035,\n exposure: 1.18,\n ambientIntensity: 0.48,\n keyIntensity: 0.58,\n fillIntensity: 0.32,\n rimIntensity: 0.14,\n shadowOpacity: 0.12,\n },\n },\n contrast: {\n id: 'contrast',\n label: 'Contrast',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.2,\n environmentBlur: 0.035,\n exposure: 1.08,\n ambientIntensity: 0.25,\n keyIntensity: 0.7,\n fillIntensity: 0.12,\n rimIntensity: 0.22,\n shadowOpacity: 0.28,\n },\n },\n};\n\nexport const DEFAULT_CHARACTER_LIGHTING_SETTINGS: DefaultCharacterLightingSettings = {\n ...DEFAULT_CHARACTER_LIGHTING_PRESETS[DEFAULT_CHARACTER_LIGHTING_PRESET_ID].settings,\n};\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_IDS: readonly DefaultCharacterLightingPresetId[] = [\n 'cleanStudio',\n 'softFill',\n 'inspection',\n 'contrast',\n];\n\nfunction cloneSettings(settings: DefaultCharacterLightingSettings): DefaultCharacterLightingSettings {\n return { ...settings };\n}\n\nfunction clampFinite(value: unknown, min: number, max: number, fallback: number): number {\n const numeric = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numeric)) return fallback;\n return MathUtils.clamp(numeric, min, max);\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === 'boolean' ? value : fallback;\n}\n\ntype DefaultCharacterLightingSettingsInput = Partial<\n Record<keyof DefaultCharacterLightingSettings, unknown>\n>;\n\nfunction normalizeSettings(\n settings: DefaultCharacterLightingSettingsInput,\n): DefaultCharacterLightingSettings {\n return {\n envMapEnabled: normalizeBoolean(settings.envMapEnabled, DEFAULT_CHARACTER_LIGHTING_SETTINGS.envMapEnabled),\n environmentIntensity: clampFinite(\n settings.environmentIntensity,\n 0,\n 1.5,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentIntensity,\n ),\n environmentBlur: clampFinite(\n settings.environmentBlur,\n 0,\n 0.04,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentBlur,\n ),\n exposure: clampFinite(settings.exposure, 0.6, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.exposure),\n ambientIntensity: clampFinite(\n settings.ambientIntensity,\n 0,\n 1.4,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.ambientIntensity,\n ),\n keyIntensity: clampFinite(settings.keyIntensity, 0, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.keyIntensity),\n fillIntensity: clampFinite(settings.fillIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.fillIntensity),\n rimIntensity: clampFinite(settings.rimIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.rimIntensity),\n shadowOpacity: clampFinite(settings.shadowOpacity, 0, 0.5, DEFAULT_CHARACTER_LIGHTING_SETTINGS.shadowOpacity),\n };\n}\n\n/**\n * Normalize persisted / untrusted lighting settings (e.g. profile JSON).\n * Returns null when the value is not a plain object.\n */\nexport function normalizeDefaultCharacterLightingSettings(\n value: unknown,\n): DefaultCharacterLightingSettings | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n\n return normalizeSettings(value as DefaultCharacterLightingSettingsInput);\n}\n\nfunction setRendererLighting(renderer: WebGLRenderer, settings: DefaultCharacterLightingSettings): void {\n renderer.outputColorSpace = SRGBColorSpace;\n renderer.toneMapping = ACESFilmicToneMapping;\n renderer.toneMappingExposure = settings.exposure;\n}\n\nfunction updateShadowPlaneOpacity(scene: Scene, opacity: number): void {\n const shadowPlane = scene.getObjectByName('shadowPlane');\n if (!(shadowPlane instanceof Mesh)) return;\n\n const materials = Array.isArray(shadowPlane.material) ? shadowPlane.material : [shadowPlane.material];\n materials.forEach((material) => {\n if (material instanceof ShadowMaterial) {\n material.opacity = opacity;\n material.needsUpdate = true;\n }\n });\n}\n\nfunction createLightRig(scene: Scene) {\n const ambient = new HemisphereLight(0xf7fbff, 0x6b7280, 0);\n ambient.name = LIGHT_NAMES.ambient;\n ambient.position.set(0, 8, 0);\n scene.add(ambient);\n\n const key = new DirectionalLight(0xfffbf4, 0);\n key.name = LIGHT_NAMES.key;\n key.position.set(4.5, 7.5, 6.2);\n key.castShadow = true;\n key.shadow.mapSize.width = 2048;\n key.shadow.mapSize.height = 2048;\n key.shadow.camera.near = 0.5;\n key.shadow.camera.far = 50;\n key.shadow.camera.left = -10;\n key.shadow.camera.right = 10;\n key.shadow.camera.top = 10;\n key.shadow.camera.bottom = -10;\n key.shadow.bias = -0.0001;\n key.shadow.radius = 4;\n scene.add(key);\n\n const fill = new DirectionalLight(0xe8f0ff, 0);\n fill.name = LIGHT_NAMES.fill;\n fill.position.set(-5.5, 4.2, 4.5);\n scene.add(fill);\n\n const rim = new DirectionalLight(0xdde8ff, 0);\n rim.name = LIGHT_NAMES.rim;\n rim.position.set(-3.5, 4.8, -5.4);\n scene.add(rim);\n\n return { ambient, key, fill, rim };\n}\n\nexport function createShadowPlane(\n scene: Scene,\n options: { size?: number; opacity?: number; yPosition?: number } = {},\n): Mesh {\n const { size = 20, opacity = 0.3, yPosition = -0.01 } = options;\n const shadowPlane = new Mesh(\n new PlaneGeometry(size, size),\n new ShadowMaterial({ opacity }),\n );\n shadowPlane.rotation.x = -Math.PI / 2;\n shadowPlane.position.y = yPosition;\n shadowPlane.receiveShadow = true;\n shadowPlane.name = 'shadowPlane';\n scene.add(shadowPlane);\n return shadowPlane;\n}\n\nexport function createDefaultCharacterLighting(\n scene: Scene,\n renderer: WebGLRenderer,\n initialSettings: Partial<DefaultCharacterLightingSettings> = DEFAULT_CHARACTER_LIGHTING_SETTINGS,\n): DefaultCharacterLightingController {\n const lights = createLightRig(scene);\n const pmremGenerator = new PMREMGenerator(renderer);\n const listeners = new Set<(settings: DefaultCharacterLightingSettings) => void>();\n let environmentTarget: WebGLRenderTarget | null = null;\n let settings = normalizeSettings(initialSettings);\n\n const notify = () => {\n const nextSettings = cloneSettings(settings);\n listeners.forEach((listener) => listener(nextSettings));\n };\n\n const disposeEnvironmentTarget = () => {\n environmentTarget?.dispose();\n environmentTarget = null;\n };\n\n const rebuildEnvironment = () => {\n disposeEnvironmentTarget();\n if (!settings.envMapEnabled) {\n scene.environment = null;\n scene.environmentIntensity = 0;\n return;\n }\n\n const roomEnvironment = new RoomEnvironment();\n try {\n environmentTarget = pmremGenerator.fromScene(roomEnvironment, settings.environmentBlur);\n } finally {\n roomEnvironment.dispose();\n }\n\n scene.environment = environmentTarget.texture;\n scene.environmentIntensity = settings.environmentIntensity;\n };\n\n const applySettings = () => {\n setRendererLighting(renderer, settings);\n scene.environmentIntensity = settings.envMapEnabled ? settings.environmentIntensity : 0;\n lights.ambient.intensity = settings.ambientIntensity;\n lights.key.intensity = settings.keyIntensity;\n lights.fill.intensity = settings.fillIntensity;\n lights.rim.intensity = settings.rimIntensity;\n updateShadowPlaneOpacity(scene, settings.shadowOpacity);\n };\n\n rebuildEnvironment();\n applySettings();\n\n const setSettings = (\n patch: Partial<DefaultCharacterLightingSettings>,\n ): DefaultCharacterLightingSettings => {\n const nextSettings = normalizeSettings({ ...settings, ...patch });\n const shouldRebuildEnvironment =\n nextSettings.envMapEnabled !== settings.envMapEnabled ||\n nextSettings.environmentBlur !== settings.environmentBlur;\n\n settings = nextSettings;\n if (shouldRebuildEnvironment) {\n rebuildEnvironment();\n }\n applySettings();\n notify();\n return cloneSettings(settings);\n };\n\n return {\n getSettings: () => cloneSettings(settings),\n getEnvironmentTexture: () => environmentTarget?.texture ?? null,\n setSettings,\n setPreset: (presetId) => {\n const preset = DEFAULT_CHARACTER_LIGHTING_PRESETS[presetId];\n if (!preset) return cloneSettings(settings);\n return setSettings(preset.settings);\n },\n subscribe: (listener) => {\n listeners.add(listener);\n listener(cloneSettings(settings));\n return () => {\n listeners.delete(listener);\n };\n },\n dispose: () => {\n listeners.clear();\n disposeEnvironmentTarget();\n pmremGenerator.dispose();\n scene.environment = null;\n scene.remove(lights.ambient, lights.key, lights.fill, lights.rim);\n },\n };\n}\n\nfunction resolveContainerSize(container: HTMLElement): { width: number; height: number } {\n const width = container.clientWidth || (typeof window !== 'undefined' ? window.innerWidth : 1);\n const height = container.clientHeight || (typeof window !== 'undefined' ? window.innerHeight : 1);\n return {\n width: Math.max(1, width),\n height: Math.max(1, height),\n };\n}\n\nfunction setPixelRatio(renderer: WebGLRenderer, pixelRatioCap: number): void {\n const deviceRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n renderer.setPixelRatio(Math.min(deviceRatio, pixelRatioCap));\n}\n\n/**\n * Create a default Embody character scene mounted into `container`.\n */\nexport function createDefaultCharacterScene(\n container: HTMLElement,\n options: DefaultCharacterSceneOptions = {},\n): DefaultCharacterScene {\n const sceneType =\n CHARACTER_SCENE_TYPES[options.type ?? DEFAULT_CHARACTER_SCENE_TYPE_ID]\n ?? CHARACTER_SCENE_TYPES[DEFAULT_CHARACTER_SCENE_TYPE_ID];\n const {\n cameraFov = 45,\n pixelRatioCap = 1.5,\n shadows = true,\n shadowPlane: enableShadowPlane = sceneType.shadowPlane,\n background = sceneType.background,\n lightingPreset = sceneType.lightingPreset,\n lighting: lightingOverrides = {},\n manageResize = true,\n } = options;\n\n const { width, height } = resolveContainerSize(container);\n\n const renderer = new WebGLRenderer({\n alpha: true,\n antialias: true,\n powerPreference: 'high-performance',\n });\n setPixelRatio(renderer, pixelRatioCap);\n renderer.setSize(width, height, true);\n renderer.shadowMap.enabled = shadows;\n renderer.shadowMap.type = PCFSoftShadowMap;\n container.appendChild(renderer.domElement);\n renderer.domElement.style.display = 'block';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n\n const scene = new Scene();\n scene.background = background === null || background === undefined ? null : new Color(background);\n\n const camera = new PerspectiveCamera(cameraFov, width / height, 0.1, 1000);\n\n const presetSettings = DEFAULT_CHARACTER_LIGHTING_PRESETS[lightingPreset]?.settings\n ?? DEFAULT_CHARACTER_LIGHTING_SETTINGS;\n const lighting = createDefaultCharacterLighting(scene, renderer, {\n ...presetSettings,\n ...lightingOverrides,\n });\n\n const shadowPlane = enableShadowPlane\n ? createShadowPlane(scene, { opacity: lighting.getSettings().shadowOpacity })\n : null;\n\n const resize = () => {\n const next = resolveContainerSize(container);\n camera.aspect = next.width / next.height;\n camera.updateProjectionMatrix();\n setPixelRatio(renderer, pixelRatioCap);\n renderer.setSize(next.width, next.height, false);\n };\n\n const onResize = () => resize();\n if (manageResize && typeof window !== 'undefined') {\n window.addEventListener('resize', onResize);\n }\n\n return {\n container,\n scene,\n renderer,\n camera,\n lighting,\n shadowPlane,\n sceneType: sceneType.id,\n ownsScene: true,\n resize,\n dispose: () => {\n if (manageResize && typeof window !== 'undefined') {\n window.removeEventListener('resize', onResize);\n }\n lighting.dispose();\n if (shadowPlane) {\n scene.remove(shadowPlane);\n shadowPlane.geometry.dispose();\n const material = shadowPlane.material;\n if (Array.isArray(material)) {\n material.forEach((entry) => entry.dispose());\n } else {\n material.dispose();\n }\n }\n if (renderer.domElement.parentElement === container) {\n container.removeChild(renderer.domElement);\n }\n renderer.dispose();\n },\n };\n}\n","/**\n * Character model loader for Embody hosts.\n *\n * Loads GLB/GLTF (optional Draco) and FBX, collects morph meshes, and provides\n * dispose helpers. App-specific asset routing (CDN aliases, HTML probing) stays\n * outside Embody — pass a resolved URL or ArrayBuffer.\n */\n\nimport {\n Box3,\n type AnimationClip,\n type Mesh,\n type Object3D,\n type Scene,\n} from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { GLTFLoader, type GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { collectMorphMeshes } from './Embody';\n\nexport interface CharacterModelLoadResult {\n model: Object3D;\n meshes: Mesh[];\n animations: AnimationClip[];\n gltf: GLTF | null;\n}\n\nexport interface CharacterModelLoadOptions {\n /** Load progress callback (0-100). */\n onProgress?: (progress: number) => void;\n /** Enable shadow casting on meshes. Default: true */\n castShadows?: boolean;\n /** Draco decoder base path. Default: '/draco-gltf/' */\n dracoDecoderPath?: string;\n}\n\nexport interface CharacterModelTransform {\n modelOffset?: { x?: number; y?: number; z?: number };\n modelRotation?: { x?: number; y?: number; z?: number };\n /**\n * Positive finite uniform scale applied to the model root.\n * Omit this field to preserve the scale authored in the model asset.\n */\n modelScale?: number;\n /** Lift model so its lowest point clears this Y value. */\n modelGroundClearance?: number;\n}\n\nconst DEFAULT_DRACO_DECODER_PATH = '/draco-gltf/';\n\nlet sharedDracoLoader: DRACOLoader | null = null;\nlet sharedDracoPath: string | null = null;\nlet sharedGltfLoader: GLTFLoader | null = null;\nlet sharedFbxLoader: FBXLoader | null = null;\n\nfunction getDracoLoader(decoderPath: string): DRACOLoader {\n if (!sharedDracoLoader || sharedDracoPath !== decoderPath) {\n sharedDracoLoader?.dispose();\n sharedDracoLoader = new DRACOLoader()\n .setDecoderPath(decoderPath.endsWith('/') ? decoderPath : `${decoderPath}/`)\n .setDecoderConfig({ type: 'wasm' });\n sharedDracoPath = decoderPath;\n sharedGltfLoader = null;\n }\n return sharedDracoLoader;\n}\n\nfunction getGltfLoader(decoderPath: string): GLTFLoader {\n if (!sharedGltfLoader || sharedDracoPath !== decoderPath) {\n const loader = new GLTFLoader();\n loader.setDRACOLoader(getDracoLoader(decoderPath));\n sharedGltfLoader = loader;\n }\n return sharedGltfLoader;\n}\n\nfunction getFbxLoader(): FBXLoader {\n if (!sharedFbxLoader) {\n sharedFbxLoader = new FBXLoader();\n }\n return sharedFbxLoader;\n}\n\nfunction createDistinctProgressReporter(\n onProgress?: (progress: number) => void,\n): ((progress: number) => void) | undefined {\n if (!onProgress) return undefined;\n\n let lastProgress: number | null = null;\n return (progress: number) => {\n if (!Number.isFinite(progress)) return;\n const normalized = Math.min(100, Math.max(0, Math.round(progress)));\n if (normalized === lastProgress) return;\n lastProgress = normalized;\n onProgress(normalized);\n };\n}\n\nfunction isFbxUrl(url: string): boolean {\n const lowercaseUrl = url.toLowerCase();\n return lowercaseUrl.endsWith('.fbx') || lowercaseUrl.includes('.fbx?');\n}\n\nfunction prepareLoadedModel(model: Object3D, castShadows: boolean): Mesh[] {\n model.traverse((obj) => {\n const mesh = obj as Mesh;\n if (!mesh.isMesh) return;\n if (castShadows) {\n mesh.castShadow = true;\n }\n });\n return collectMorphMeshes(model);\n}\n\n/**\n * Apply optional placement transforms used by character profiles.\n */\nexport function applyCharacterModelTransform(\n model: Object3D,\n transform: CharacterModelTransform = {},\n): void {\n const { modelOffset, modelRotation, modelScale, modelGroundClearance } = transform;\n\n if (modelOffset) {\n model.position.set(modelOffset.x ?? 0, modelOffset.y ?? 0, modelOffset.z ?? 0);\n }\n\n if (modelRotation) {\n const deg2rad = Math.PI / 180;\n model.rotation.set(\n (modelRotation.x ?? 0) * deg2rad,\n (modelRotation.y ?? 0) * deg2rad,\n (modelRotation.z ?? 0) * deg2rad,\n );\n }\n\n if (modelScale !== undefined && Number.isFinite(modelScale) && modelScale > 0) {\n model.scale.setScalar(modelScale);\n }\n\n // Apply ground clearance after scale so the bounds reflect the final size.\n if (modelGroundClearance !== undefined && Number.isFinite(modelGroundClearance)) {\n model.updateMatrixWorld(true);\n const bounds = new Box3().setFromObject(model);\n if (Number.isFinite(bounds.min.y) && bounds.min.y < modelGroundClearance) {\n model.position.y += modelGroundClearance - bounds.min.y;\n }\n }\n}\n\n/**\n * Dispose a model graph and remove it from a scene when present.\n *\n * Handles any renderable object (Mesh, Points, Line, ...) and releases\n * textures referenced by materials.\n */\nexport function disposeCharacterModel(scene: Scene | null, model: Object3D): void {\n scene?.remove(model);\n model.traverse((obj) => {\n const holder = obj as Object3D & {\n geometry?: { dispose?: () => void };\n material?: MaterialLike | MaterialLike[];\n };\n holder.geometry?.dispose?.();\n if (!holder.material) return;\n const materials = Array.isArray(holder.material) ? holder.material : [holder.material];\n materials.forEach(disposeMaterialWithTextures);\n });\n}\n\ninterface MaterialLike {\n dispose?: () => void;\n}\n\nfunction disposeMaterialWithTextures(material: MaterialLike): void {\n Object.values(material as Record<string, unknown>).forEach((value) => {\n const texture = value as { isTexture?: boolean; dispose?: () => void } | null;\n if (texture?.isTexture && typeof texture.dispose === 'function') {\n texture.dispose();\n }\n });\n material.dispose?.();\n}\n\nfunction loadGltf(\n url: string,\n options: CharacterModelLoadOptions,\n): Promise<CharacterModelLoadResult> {\n const { onProgress, castShadows = true, dracoDecoderPath = DEFAULT_DRACO_DECODER_PATH } = options;\n const reportProgress = createDistinctProgressReporter(onProgress);\n const loader = getGltfLoader(dracoDecoderPath);\n\n return new Promise((resolve, reject) => {\n loader.load(\n url,\n (gltf: GLTF) => {\n const model = gltf.scene;\n resolve({\n model,\n meshes: prepareLoadedModel(model, castShadows),\n animations: gltf.animations || [],\n gltf,\n });\n },\n (progressEvent: ProgressEvent) => {\n if (progressEvent.lengthComputable) {\n reportProgress?.((progressEvent.loaded / progressEvent.total) * 100);\n }\n },\n (error: unknown) => reject(error),\n );\n });\n}\n\nfunction loadFbx(\n url: string,\n options: CharacterModelLoadOptions,\n): Promise<CharacterModelLoadResult> {\n const { onProgress, castShadows = true } = options;\n const reportProgress = createDistinctProgressReporter(onProgress);\n const loader = getFbxLoader();\n\n return new Promise((resolve, reject) => {\n loader.load(\n url,\n (fbxGroup) => {\n resolve({\n model: fbxGroup,\n meshes: prepareLoadedModel(fbxGroup, castShadows),\n animations: fbxGroup.animations || [],\n gltf: null,\n });\n },\n (progressEvent: ProgressEvent) => {\n if (progressEvent.lengthComputable) {\n reportProgress?.((progressEvent.loaded / progressEvent.total) * 100);\n }\n },\n (error: unknown) => reject(error),\n );\n });\n}\n\n/**\n * Load a character model from a URL (GLB/GLTF or FBX).\n */\nexport function loadCharacterModel(\n url: string,\n options: CharacterModelLoadOptions = {},\n): Promise<CharacterModelLoadResult> {\n if (isFbxUrl(url)) {\n return loadFbx(url, options);\n }\n return loadGltf(url, options);\n}\n\n/**\n * Parse a character model from an already-fetched ArrayBuffer.\n */\nexport function parseCharacterModel(\n data: ArrayBuffer,\n resourcePath = '',\n options: CharacterModelLoadOptions = {},\n): Promise<CharacterModelLoadResult> {\n const { castShadows = true, dracoDecoderPath = DEFAULT_DRACO_DECODER_PATH } = options;\n const loader = getGltfLoader(dracoDecoderPath);\n\n return new Promise((resolve, reject) => {\n loader.parse(\n data,\n resourcePath,\n (gltf: GLTF) => {\n const model = gltf.scene;\n resolve({\n model,\n meshes: prepareLoadedModel(model, castShadows),\n animations: gltf.animations || [],\n gltf,\n });\n },\n (error: unknown) => reject(error),\n );\n });\n}\n","/**\n * High-level character host: default scene + model load + Embody binding.\n *\n * Default path: pass a container HTMLElement + character model URL.\n * Advanced path: inject an existing Three.js scene/renderer/camera.\n */\n\nimport {\n Box3,\n MathUtils,\n Vector3,\n type AnimationClip,\n type Camera,\n type Mesh,\n type Object3D,\n type PerspectiveCamera,\n type Scene,\n type WebGLRenderer,\n} from 'three';\nimport type { EmbodyConfig } from '../../interfaces/EmbodyRuntime';\nimport { getPresetWithProfile } from '../../presets';\nimport { Embody } from './Embody';\nimport {\n createDefaultCharacterScene,\n type DefaultCharacterLightingController,\n type DefaultCharacterSceneOptions,\n} from './characterScene';\nimport {\n applyCharacterModelTransform,\n disposeCharacterModel,\n loadCharacterModel,\n type CharacterModelLoadOptions,\n type CharacterModelTransform,\n} from './modelLoader';\n\nexport interface CharacterHostCharacterOptions extends CharacterModelTransform {\n /** Resolved model URL (GLB/GLTF/FBX). */\n modelUrl: string;\n /** Optional Embody preset / profile (also accepted via `embody`). */\n presetType?: EmbodyConfig['presetType'];\n profile?: EmbodyConfig['profile'];\n}\n\nexport interface CharacterHostExternalScene {\n scene: Scene;\n renderer: WebGLRenderer;\n camera: Camera;\n /**\n * When true, host appends `renderer.domElement` into `container` if it is not\n * already mounted. Default: false.\n */\n mountCanvas?: boolean;\n /** When true, host listens for window resize. Default: false for external. */\n manageResize?: boolean;\n}\n\nexport interface CharacterHostOptions {\n /** Element that receives the WebGL canvas in the default scene path. */\n container: HTMLElement;\n /** Character to load and bind. */\n character: CharacterHostCharacterOptions;\n /** Embody runtime config. `presetType` / `profile` on character win when both set. */\n embody?: EmbodyConfig;\n /** Default-scene options (ignored when `external` is provided). */\n scene?: DefaultCharacterSceneOptions;\n /** Advanced: inject an existing Three.js scene instead of creating one. */\n external?: CharacterHostExternalScene;\n /** Model loader options (progress, Draco path, shadows). */\n loader?: CharacterModelLoadOptions;\n /** Call `engine.start()` after binding. Default: true */\n autoStart?: boolean;\n /**\n * Run a requestAnimationFrame render loop (`renderer.render(scene, camera)`).\n * Default: true when Embody owns the scene, false when `external` is given.\n */\n renderLoop?: boolean;\n /**\n * Frame the camera on the loaded model (position + lookAt). Applies on every\n * `setCharacter`. Default: true when Embody owns the scene, false otherwise.\n */\n autoFrame?: boolean;\n}\n\nexport interface CharacterHost {\n engine: Embody;\n scene: Scene;\n renderer: WebGLRenderer;\n camera: Camera | PerspectiveCamera;\n model: Object3D;\n meshes: Mesh[];\n animations: AnimationClip[];\n lighting: DefaultCharacterLightingController | null;\n /** True when Embody created and owns the default scene/renderer. */\n ownsScene: boolean;\n container: HTMLElement;\n /** Replace the loaded character while keeping the same scene/engine. */\n setCharacter: (character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions) => Promise<void>;\n resize: () => void;\n dispose: () => void;\n}\n\nfunction resolveEmbodyConfig(\n options: CharacterHostOptions,\n character: CharacterHostCharacterOptions,\n): EmbodyConfig {\n return {\n ...(options.embody ?? {}),\n ...(character.presetType ? { presetType: character.presetType } : {}),\n ...(character.profile ? { profile: character.profile } : {}),\n };\n}\n\nconst AUTO_FRAME_PADDING = 1.2;\n\n/** Position a perspective camera so the whole model is in view. */\nfunction frameCameraOnModel(camera: Camera | PerspectiveCamera, model: Object3D): void {\n if (!('isPerspectiveCamera' in camera) || !(camera as PerspectiveCamera).isPerspectiveCamera) {\n return;\n }\n const perspective = camera as PerspectiveCamera;\n\n model.updateMatrixWorld(true);\n const bounds = new Box3().setFromObject(model);\n if (bounds.isEmpty()) return;\n\n const size = bounds.getSize(new Vector3());\n const center = bounds.getCenter(new Vector3());\n const halfFov = MathUtils.degToRad(perspective.fov) / 2;\n const aspect = perspective.aspect > 0 ? perspective.aspect : 1;\n const fitHeight = Math.max(size.y, 1e-3);\n const fitWidth = Math.max(size.x, 1e-3) / aspect;\n const distance = ((Math.max(fitHeight, fitWidth) / 2) / Math.tan(halfFov)) * AUTO_FRAME_PADDING;\n\n perspective.position.set(center.x, center.y + size.y * 0.05, center.z + distance);\n perspective.near = Math.max(distance / 100, 0.01);\n perspective.far = Math.max(distance * 10, 100);\n perspective.updateProjectionMatrix();\n perspective.lookAt(center);\n}\n\nfunction bindModelToEngine(\n engine: Embody,\n model: Object3D,\n meshes: Mesh[],\n animations: AnimationClip[],\n): void {\n engine.onReady({ meshes, model });\n if (animations.length > 0) {\n engine.loadAnimationClips(animations);\n }\n}\n\n/**\n * Create a character host.\n *\n * Default: Embody creates the Three.js scene inside `container` and loads\n * `character.modelUrl`. Advanced: pass `external` with an existing scene.\n */\nexport async function createCharacterHost(options: CharacterHostOptions): Promise<CharacterHost> {\n const {\n container,\n character,\n external,\n scene: sceneOptions,\n loader: loaderOptions = {},\n autoStart = true,\n } = options;\n\n if (!container) {\n throw new Error('createCharacterHost requires a container HTMLElement');\n }\n if (!character?.modelUrl) {\n throw new Error('createCharacterHost requires character.modelUrl');\n }\n\n let scene: Scene;\n let renderer: WebGLRenderer;\n let camera: Camera | PerspectiveCamera;\n let lighting: DefaultCharacterLightingController | null = null;\n let ownsScene = false;\n let disposeDefaultScene: (() => void) | null = null;\n let resizeImpl: () => void = () => undefined;\n let removeResizeListener: (() => void) | null = null;\n\n if (external) {\n scene = external.scene;\n renderer = external.renderer;\n camera = external.camera;\n ownsScene = false;\n\n if (external.mountCanvas && renderer.domElement.parentElement !== container) {\n container.appendChild(renderer.domElement);\n }\n\n resizeImpl = () => {\n const width = Math.max(1, container.clientWidth || (typeof window !== 'undefined' ? window.innerWidth : 1));\n const height = Math.max(1, container.clientHeight || (typeof window !== 'undefined' ? window.innerHeight : 1));\n if ('isPerspectiveCamera' in camera && (camera as PerspectiveCamera).isPerspectiveCamera) {\n const perspective = camera as PerspectiveCamera;\n perspective.aspect = width / height;\n perspective.updateProjectionMatrix();\n }\n renderer.setSize(width, height, false);\n };\n\n if (external.manageResize && typeof window !== 'undefined') {\n const onResize = () => resizeImpl();\n window.addEventListener('resize', onResize);\n removeResizeListener = () => window.removeEventListener('resize', onResize);\n }\n } else {\n const defaultScene = createDefaultCharacterScene(container, sceneOptions);\n scene = defaultScene.scene;\n renderer = defaultScene.renderer;\n camera = defaultScene.camera;\n lighting = defaultScene.lighting;\n ownsScene = true;\n disposeDefaultScene = defaultScene.dispose;\n resizeImpl = defaultScene.resize;\n }\n\n const shouldRenderLoop = options.renderLoop ?? !external;\n const shouldAutoFrame = options.autoFrame ?? !external;\n\n let renderFrameId: number | null = null;\n const startRenderLoop = () => {\n if (!shouldRenderLoop || renderFrameId !== null || typeof requestAnimationFrame === 'undefined') {\n return;\n }\n const renderFrame = () => {\n renderFrameId = requestAnimationFrame(renderFrame);\n renderer.render(scene, camera);\n };\n renderFrameId = requestAnimationFrame(renderFrame);\n };\n const stopRenderLoop = () => {\n if (renderFrameId !== null) {\n cancelAnimationFrame(renderFrameId);\n renderFrameId = null;\n }\n };\n\n const engine = await Embody.create(resolveEmbodyConfig(options, character));\n\n let model: Object3D | null = null;\n let meshes: Mesh[] = [];\n let animations: AnimationClip[] = [];\n let hasBoundCharacter = false;\n let activeCharacterKey = '';\n\n const characterConfigKey = (value: CharacterHostCharacterOptions): string =>\n JSON.stringify({\n modelUrl: value.modelUrl,\n presetType: value.presetType ?? null,\n profile: value.profile ?? null,\n modelOffset: value.modelOffset ?? null,\n modelRotation: value.modelRotation ?? null,\n modelScale: value.modelScale ?? null,\n modelGroundClearance: value.modelGroundClearance ?? null,\n });\n\n const setCharacter = async (\n nextCharacter: CharacterHostCharacterOptions,\n nextLoader: CharacterModelLoadOptions = loaderOptions,\n ): Promise<void> => {\n if (!nextCharacter?.modelUrl) {\n throw new Error('setCharacter requires character.modelUrl');\n }\n\n const loaded = await loadCharacterModel(nextCharacter.modelUrl, {\n ...loaderOptions,\n ...nextLoader,\n });\n\n applyCharacterModelTransform(loaded.model, nextCharacter);\n\n if (model) {\n disposeCharacterModel(scene, model);\n }\n\n model = loaded.model;\n meshes = loaded.meshes;\n animations = loaded.animations;\n scene.add(model);\n\n if (shouldAutoFrame) {\n frameCameraOnModel(camera, model);\n }\n\n const nextKey = characterConfigKey(nextCharacter);\n const shouldSwapProfile =\n hasBoundCharacter &&\n nextKey !== activeCharacterKey &&\n Boolean(nextCharacter.presetType || nextCharacter.profile);\n\n if (shouldSwapProfile) {\n // Swap presets in place so callers keep a stable `engine` reference.\n const config = resolveEmbodyConfig(options, nextCharacter);\n engine.setProfile(await getPresetWithProfile(config.presetType, config.profile));\n }\n\n bindModelToEngine(engine, model, meshes, animations);\n hasBoundCharacter = true;\n activeCharacterKey = nextKey;\n };\n\n try {\n await setCharacter(character, loaderOptions);\n } catch (error) {\n disposeDefaultScene?.();\n removeResizeListener?.();\n engine.dispose();\n throw error;\n }\n\n if (autoStart) {\n engine.start();\n }\n startRenderLoop();\n\n return {\n engine,\n get scene() {\n return scene;\n },\n get renderer() {\n return renderer;\n },\n get camera() {\n return camera;\n },\n get model() {\n if (!model) throw new Error('Character host has no model bound');\n return model;\n },\n get meshes() {\n return meshes;\n },\n get animations() {\n return animations;\n },\n get lighting() {\n return lighting;\n },\n ownsScene,\n container,\n setCharacter,\n resize: () => resizeImpl(),\n dispose: () => {\n stopRenderLoop();\n engine.stop();\n engine.dispose();\n if (model) {\n disposeCharacterModel(scene, model);\n model = null;\n }\n removeResizeListener?.();\n if (ownsScene) {\n disposeDefaultScene?.();\n }\n },\n };\n}\n"]}
|