@lovelace_lol/embody 0.0.1
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/LICENSE +21 -0
- package/README.md +2411 -0
- package/dist/authoring/boneAuthoring.d.ts +132 -0
- package/dist/camera/annotationCameraAngles.d.ts +28 -0
- package/dist/camera/cameraRelativeGaze.d.ts +15 -0
- package/dist/camera/rustAnnotationCameraCore.d.ts +136 -0
- package/dist/cljs.cjs +362 -0
- package/dist/cljs.cjs.map +1 -0
- package/dist/cljs.d.ts +5 -0
- package/dist/cljs.js +359 -0
- package/dist/cljs.js.map +1 -0
- package/dist/core/TsClipCompiler.d.ts +51 -0
- package/dist/core/TsRuntimeCore.d.ts +40 -0
- package/dist/core/WasmRuntimeCore.d.ts +55 -0
- package/dist/core/compositeAxis.d.ts +4 -0
- package/dist/core/contracts/abi.d.ts +70 -0
- package/dist/core/contracts/clip.d.ts +44 -0
- package/dist/core/contracts/frame.d.ts +27 -0
- package/dist/core/contracts/host.d.ts +28 -0
- package/dist/core/contracts/ids.d.ts +15 -0
- package/dist/core/contracts/index.d.ts +10 -0
- package/dist/core/contracts/model.d.ts +31 -0
- package/dist/core/contracts/primitives.d.ts +17 -0
- package/dist/core/contracts/skeletonFit.d.ts +41 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/types.d.ts +472 -0
- package/dist/core.cjs +1065 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.js +1040 -0
- package/dist/core.js.map +1 -0
- package/dist/engines/three/Embody.d.ts +373 -0
- package/dist/engines/three/ThreeAnimationRuntime.d.ts +203 -0
- package/dist/engines/three/ThreeClipAdapter.d.ts +24 -0
- package/dist/engines/three/ThreeFrameApplier.d.ts +68 -0
- package/dist/engines/three/ThreeModelInspector.d.ts +54 -0
- package/dist/engines/three/bakedClipPartitioning.d.ts +16 -0
- package/dist/engines/three/balanceUtils.d.ts +3 -0
- package/dist/engines/three/characterHost.d.ts +80 -0
- package/dist/engines/three/characterScene.d.ts +98 -0
- package/dist/engines/three/hair/HairPhysicsController.d.ts +124 -0
- package/dist/engines/three/index.d.ts +20 -0
- package/dist/engines/three/modelLoader.d.ts +61 -0
- package/dist/engines/three/profileTestScene.d.ts +52 -0
- package/dist/engines/three/types.d.ts +20 -0
- package/dist/hair/appearance.d.ts +29 -0
- package/dist/index.cjs +15431 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +100 -0
- package/dist/index.js +15141 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/Animation.d.ts +315 -0
- package/dist/interfaces/EmbodyRuntime.d.ts +90 -0
- package/dist/interfaces/Hair.d.ts +181 -0
- package/dist/interfaces/HairPhysics.d.ts +90 -0
- package/dist/interfaces/index.d.ts +11 -0
- package/dist/mappings/extendPresetWithProfile.d.ts +17 -0
- package/dist/mappings/types.d.ts +309 -0
- package/dist/mappings/visemeSystem.d.ts +26 -0
- package/dist/physics/HairPhysics.d.ts +86 -0
- package/dist/physics/RustHairPhysics.d.ts +18 -0
- package/dist/physics/index.d.ts +6 -0
- package/dist/preset.cjs +2000 -0
- package/dist/preset.cjs.map +1 -0
- package/dist/preset.js +1997 -0
- package/dist/preset.js.map +1 -0
- package/dist/presets/bettaFish.d.ts +328 -0
- package/dist/presets/cc4.d.ts +145 -0
- package/dist/presets/index.d.ts +27 -0
- package/dist/profiles/resolveProfileConfig.d.ts +36 -0
- package/dist/profiles/types.d.ts +118 -0
- package/dist/regions/normalizeRegionTree.d.ts +6 -0
- package/dist/regions/regionMapping.d.ts +17 -0
- package/dist/regions/types.d.ts +122 -0
- package/dist/skeletonTemplates/humanoidSkeletonTemplates.d.ts +32 -0
- package/dist/test/setupWasm.d.ts +1 -0
- package/dist/three.cjs +10115 -0
- package/dist/three.cjs.map +1 -0
- package/dist/three.js +10086 -0
- package/dist/three.js.map +1 -0
- package/dist/validation/analyzeModel.d.ts +68 -0
- package/dist/validation/extractModelData.d.ts +90 -0
- package/dist/validation/generateMappingCorrections.d.ts +32 -0
- package/dist/validation/geometryHelpers.d.ts +66 -0
- package/dist/validation/types.d.ts +10 -0
- package/dist/validation/validateMappings.d.ts +77 -0
- package/dist/wasm/LICENSE +21 -0
- package/dist/wasm/README.md +72 -0
- package/dist/wasm/embody_wasm.d.ts +531 -0
- package/dist/wasm/embody_wasm.js +1635 -0
- package/dist/wasm/embody_wasm_bg.wasm +0 -0
- package/dist/wasm/embody_wasm_bg.wasm.d.ts +107 -0
- package/dist/wasm.cjs +302 -0
- package/dist/wasm.cjs.map +1 -0
- package/dist/wasm.d.ts +43 -0
- package/dist/wasm.js +268 -0
- package/dist/wasm.js.map +1 -0
- package/dist/wasmTypes.d.ts +121 -0
- package/package.json +99 -0
|
@@ -0,0 +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/contracts/skeletonFit.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/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","../src/core/TsClipCompiler.ts","../src/mappings/types.ts","../src/validation/geometryHelpers.ts","../src/regions/regionMapping.ts","../src/authoring/boneAuthoring.ts","../src/regions/normalizeRegionTree.ts","../src/profiles/resolveProfileConfig.ts","../src/camera/cameraRelativeGaze.ts","../src/camera/annotationCameraAngles.ts","../src/camera/rustAnnotationCameraCore.ts","../src/physics/HairPhysics.ts","../src/physics/RustHairPhysics.ts","../src/validation/generateMappingCorrections.ts","../src/validation/validateMappings.ts","../src/validation/extractModelData.ts","../src/validation/analyzeModel.ts","../src/skeletonTemplates/data/jonathan-cc-base.json","../src/skeletonTemplates/humanoidSkeletonTemplates.ts"],"names":["PropertyBinding","AnimationClip","Vector3","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","AnimationUtils","AdditiveAnimationBlendMode","NormalAnimationBlendMode","LoopPingPong","LoopOnce","LoopRepeat","action","duration","state","loopMode","playbackRate","reverse","Quaternion","bindingTargets","AnimationMixer","Box3","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","NoBlending","morphTargetId","isRotationBoneBinding","clampBalance","target","getSideScale","boneId","meshId","resolveMorphTargetByName","clamp01","Mesh","initEmbodyCore","AU_INFO","CONTINUUM_PAIRS_MAP","CONTINUUM_LABELS","COMPOSITE_ROTATIONS","deg2rad","X_AXIS","Y_AXIS","Z_AXIS","Clock","collectMorphMeshes","targets","BufferAttribute","empty","suffix","MathUtils","SRGBColorSpace","ACESFilmicToneMapping","ShadowMaterial","HemisphereLight","DirectionalLight","PlaneGeometry","PMREMGenerator","RoomEnvironment","WebGLRenderer","PCFSoftShadowMap","Scene","Color","PerspectiveCamera","DRACOLoader","GLTFLoader","FBXLoader","THREE","headPos","eyes","buildContinuumLabel","THREE2","THREE3","toModelLocalDirection","HAIR_CONFIG_STRIDE","HAIR_HEAD_STATE_STRIDE","HAIR_STATE_STRIDE","HAIR_MORPH_OUTPUT_STRIDE","HAIR_MORPH_OUTPUT_FIELDS","normalizeLooseName","isEyeNodeKey","THREE4","score","addVec3","THREE5"],"mappings":"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","file":"index.cjs","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 { Vec3 } from './primitives';\n\nexport const TEMPLATE_SKELETON_FIT_METADATA_KIND = 'template-skeleton-fit';\nexport const TEMPLATE_SKELETON_FIT_METADATA_VERSION = 1;\n\nexport const TEMPLATE_SKELETON_FIT_STATUSES = [\n 'unfitted',\n 'estimated',\n 'manual-adjusted',\n 'invalid',\n] as const;\n\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_AXES = ['x', 'y', 'z'] as const;\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS = ['min', 'center', 'max'] as const;\n\nexport type TemplateSkeletonFitStatus = (typeof TEMPLATE_SKELETON_FIT_STATUSES)[number];\nexport type TemplateSkeletonFitVerticalAxis = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_AXES)[number];\nexport type TemplateSkeletonFitVerticalAnchor = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS)[number];\n\nexport interface TemplateSkeletonFitTransform {\n readonly scale: number;\n readonly translation: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetrics extends TemplateSkeletonFitTransform {\n readonly confidence: number;\n readonly meshHeight: number;\n readonly templateHeight: number;\n readonly crossAxisSpans: Vec3;\n readonly status: TemplateSkeletonFitStatus;\n}\n\nexport interface TemplateSkeletonFitManualAdjustment {\n readonly scale?: number;\n readonly translation?: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetadata {\n readonly kind: typeof TEMPLATE_SKELETON_FIT_METADATA_KIND;\n readonly version: typeof TEMPLATE_SKELETON_FIT_METADATA_VERSION;\n readonly templateId: string;\n readonly sourceCharacterId: string;\n readonly verticalAxis: TemplateSkeletonFitVerticalAxis;\n readonly verticalAnchor: TemplateSkeletonFitVerticalAnchor;\n readonly fit: TemplateSkeletonFitMetrics;\n readonly manualAdjustment?: TemplateSkeletonFitManualAdjustment;\n}\n\nexport interface TemplateSkeletonFitValidationResult {\n readonly valid: boolean;\n readonly errors: readonly string[];\n}\n\nexport function isTemplateSkeletonFitStatus(value: unknown): value is TemplateSkeletonFitStatus {\n return typeof value === 'string' && TEMPLATE_SKELETON_FIT_STATUSES.includes(value as TemplateSkeletonFitStatus);\n}\n\nexport function composeTemplateSkeletonFitTransform(\n fit: TemplateSkeletonFitTransform,\n manualAdjustment: TemplateSkeletonFitManualAdjustment = {},\n): TemplateSkeletonFitTransform {\n return {\n scale: positiveFiniteOr(fit.scale, 1) * positiveFiniteOr(manualAdjustment.scale ?? 1, 1),\n translation: {\n x: finiteOr(fit.translation.x, 0) + finiteOr(manualAdjustment.translation?.x ?? 0, 0),\n y: finiteOr(fit.translation.y, 0) + finiteOr(manualAdjustment.translation?.y ?? 0, 0),\n z: finiteOr(fit.translation.z, 0) + finiteOr(manualAdjustment.translation?.z ?? 0, 0),\n },\n };\n}\n\nexport function validateTemplateSkeletonFitMetadata(metadata: unknown): TemplateSkeletonFitValidationResult {\n const errors: string[] = [];\n\n if (!isRecord(metadata)) {\n return { valid: false, errors: ['metadata must be an object'] };\n }\n\n if (metadata.kind !== TEMPLATE_SKELETON_FIT_METADATA_KIND) {\n errors.push(`kind must be \"${TEMPLATE_SKELETON_FIT_METADATA_KIND}\"`);\n }\n if (metadata.version !== TEMPLATE_SKELETON_FIT_METADATA_VERSION) {\n errors.push(`version must be ${TEMPLATE_SKELETON_FIT_METADATA_VERSION}`);\n }\n if (!isNonEmptyString(metadata.templateId)) {\n errors.push('templateId must be a non-empty string');\n }\n if (!isNonEmptyString(metadata.sourceCharacterId)) {\n errors.push('sourceCharacterId must be a non-empty string');\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_AXES.includes(metadata.verticalAxis as TemplateSkeletonFitVerticalAxis)) {\n errors.push(`verticalAxis must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_AXES.join(', ')}`);\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.includes(metadata.verticalAnchor as TemplateSkeletonFitVerticalAnchor)) {\n errors.push(`verticalAnchor must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.join(', ')}`);\n }\n\n validateFitMetrics(metadata.fit, errors);\n validateManualAdjustment(metadata.manualAdjustment, errors);\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFitMetrics(value: unknown, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push('fit must be an object');\n return;\n }\n\n if (!isPositiveFiniteNumber(value.scale)) {\n errors.push('fit.scale must be a positive finite number');\n }\n validateVec3(value.translation, 'fit.translation', errors);\n if (!isFiniteNumber(value.confidence) || value.confidence < 0 || value.confidence > 1) {\n errors.push('fit.confidence must be a finite number between 0 and 1');\n }\n if (!isPositiveFiniteNumber(value.meshHeight)) {\n errors.push('fit.meshHeight must be a positive finite number');\n }\n if (!isPositiveFiniteNumber(value.templateHeight)) {\n errors.push('fit.templateHeight must be a positive finite number');\n }\n validateVec3(value.crossAxisSpans, 'fit.crossAxisSpans', errors, { min: 0 });\n if (!isTemplateSkeletonFitStatus(value.status)) {\n errors.push(`fit.status must be one of: ${TEMPLATE_SKELETON_FIT_STATUSES.join(', ')}`);\n }\n}\n\nfunction validateManualAdjustment(value: unknown, errors: string[]): void {\n if (value == null) {\n return;\n }\n if (!isRecord(value)) {\n errors.push('manualAdjustment must be an object');\n return;\n }\n if (value.scale != null && !isPositiveFiniteNumber(value.scale)) {\n errors.push('manualAdjustment.scale must be a positive finite number');\n }\n if (value.translation != null) {\n validateVec3(value.translation, 'manualAdjustment.translation', errors);\n }\n}\n\nfunction validateVec3(\n value: unknown,\n field: string,\n errors: string[],\n options: { min?: number } = {},\n): void {\n if (!isRecord(value)) {\n errors.push(`${field} must be an object with finite x, y, and z values`);\n return;\n }\n\n for (const axis of ['x', 'y', 'z'] as const) {\n const axisValue = value[axis];\n if (!isFiniteNumber(axisValue)) {\n errors.push(`${field}.${axis} must be a finite number`);\n } else if (options.min != null && axisValue < options.min) {\n errors.push(`${field}.${axis} must be a finite number >= ${options.min}`);\n }\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isPositiveFiniteNumber(value: unknown): value is number {\n return isFiniteNumber(value) && value > 0;\n}\n\nfunction finiteOr(value: number, fallback: number): number {\n return Number.isFinite(value) ? value : fallback;\n}\n\nfunction positiveFiniteOr(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? value : fallback;\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(getProfileVisemeSlots(options.profile).length);\n this.reloadBindings();\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.core.set_viseme_slot_count(getProfileVisemeSlots(profile).length);\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 const { auBindings, mixedAus, visemeBindings } = compileMorphBindings(this.profile, this.model);\n this.core.load_au_morph_bindings(auBindings);\n this.core.load_viseme_morph_bindings(visemeBindings);\n this.core.set_mixed_aus(mixedAus);\n\n const boneBindings = compileBoneBindings(this.profile, this.model);\n this.core.load_bone_rest_transforms(boneBindings.restTransforms);\n this.core.load_composite_axes(boneBindings.compositeAxes);\n this.core.load_bone_translations(boneBindings.translations);\n this.core.load_jaw_binding(boneBindings.jawBinding);\n this.core.load_viseme_jaw_amounts(boneBindings.visemeJawAmounts);\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","/**\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)\nimport { BETTA_FISH_PRESET } from './bettaFish';\nexport { BETTA_FISH_PRESET, AU_MAPPING_CONFIG, FISH_AU_MAPPING_CONFIG } from './bettaFish';\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 */\nexport type PresetType = 'cc4' | 'skeletal' | 'fish' | '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 switch (presetType) {\n case 'fish':\n case 'skeletal':\n return BETTA_FISH_PRESET;\n case 'cc4':\n case 'custom':\n default:\n return CC4_PRESET;\n }\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","import type {\n ChannelId,\n ClipChannelIR,\n ClipIR,\n ClipInterpolation,\n ClipTrackTarget,\n ClipTrackValueType,\n NumericArray,\n TrackId,\n} from './contracts';\nimport type { CurvePoint } from './types';\nimport type { EmbodyCoreWasmModule } from '../wasmTypes';\n\nexport interface TsClipCompilerKeyframe {\n readonly time: number;\n readonly value: number | readonly number[];\n}\n\nexport interface TsClipCompilerTrackInput {\n readonly id?: TrackId;\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType: ClipTrackValueType;\n readonly keyframes: readonly TsClipCompilerKeyframe[];\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCompilerInput {\n readonly id?: string;\n readonly name: string;\n readonly durationSeconds?: number;\n readonly channels?: readonly ClipChannelIR[];\n readonly tracks: readonly TsClipCompilerTrackInput[];\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport interface TsClipCurveTarget {\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType?: Extract<ClipTrackValueType, 'scalar'>;\n readonly scale?: number;\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCurvesInput {\n readonly id?: string;\n readonly name: string;\n readonly curves: Record<string, readonly CurvePoint[]>;\n readonly targets: Record<string, TsClipCurveTarget | readonly TsClipCurveTarget[]>;\n readonly channels?: readonly ClipChannelIR[];\n readonly durationSeconds?: number;\n readonly intensityScale?: number;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Thin host facade over the Rust clip compiler (`compile_clip` /\n * `compile_clip_curves`). Callers pass the Wasm module from `initEmbodyCore()`.\n */\nexport class TsClipCompiler {\n constructor(private readonly core: EmbodyCoreWasmModule) {}\n\n compile(input: TsClipCompilerInput): ClipIR {\n return JSON.parse(this.core.compile_clip(JSON.stringify(input))) as ClipIR;\n }\n\n compileCurves(input: TsClipCurvesInput): ClipIR {\n return JSON.parse(this.core.compile_clip_curves(JSON.stringify(input))) as ClipIR;\n }\n}\n\nexport function numericArrayToNumbers(values: NumericArray): number[] {\n return Array.from(values);\n}\n","/**\n * Embody - Profile Types\n *\n * Type definitions for character profiles.\n * Profiles define how Action Units map to morphs/bones for a specific rig.\n */\n\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\nimport type { AnnotationRegion } from '../regions/types';\n\nexport type { AnnotationRegion } from '../regions/types';\n\n/**\n * Profile - Complete configuration for AU-to-morph/bone mappings\n *\n * This is the main configuration object that defines how Action Units\n * map to morph targets and bone transformations for a specific rig type.\n */\nexport interface Profile {\n /** Human-readable name for this profile (e.g., 'Character Creator 4', 'Betta Fish') */\n name?: string;\n\n /** Type of animal/creature this profile is for (e.g., 'human', 'fish', 'dog') */\n animalType?: string;\n\n /** Emoji representing this animal type (e.g., '😊' for human, '🐟' for fish) */\n emoji?: string;\n\n /** AU ID to morph target names split by side */\n auToMorphs: Record<number, MorphTargetsBySide>;\n\n /** AU ID to bone bindings (e.g., AU 51 → [{ node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 }]) */\n auToBones: Record<number, BoneBinding[]>;\n\n /** Bone key to actual node name in the model (e.g., 'HEAD' → 'Head' or 'CC_Base_Head') */\n boneNodes: Record<string, string>;\n\n /**\n * Optional: Prefix to prepend to bone names when resolving nodes.\n * If set, boneNodes should contain base names without prefix (e.g., 'Head' instead of 'CC_Base_Head').\n * The engine will try: prefix + baseName + suffix, then fuzzy match with suffixPattern.\n */\n bonePrefix?: string;\n\n /**\n * Optional: Suffix to append to bone names when resolving nodes.\n * Combined with bonePrefix: prefix + baseName + suffix (e.g., 'Bone.' + '001' + '_Armature' = 'Bone.001_Armature')\n */\n boneSuffix?: string;\n\n /**\n * Optional: Prefix to prepend to morph target names when resolving.\n * Similar to bonePrefix but for morph targets.\n */\n morphPrefix?: string;\n\n /**\n * Optional: Suffix to append to morph target names when resolving.\n * Similar to boneSuffix but for morph targets.\n */\n morphSuffix?: string;\n\n /**\n * Optional: Regex pattern string for fuzzy matching bone/morph names with suffixes.\n * Common patterns: \"_\\\\d+$\" for numbered suffixes (_01, _038), \"\\\\.\\\\d+$\" for Blender (.001)\n * When set, the engine will try exact match first, then fuzzy match using this pattern.\n */\n suffixPattern?: string;\n\n /**\n * Optional: Suffixes that indicate left-side morph targets.\n * Used for auto-detecting laterality in the mapping editor.\n * Default: ['_L', ' L']\n */\n leftMorphSuffixes?: string[];\n\n /**\n * Optional: Suffixes that indicate right-side morph targets.\n * Used for auto-detecting laterality in the mapping editor.\n * Default: ['_R', ' R']\n */\n rightMorphSuffixes?: string[];\n\n /** Morph category to mesh names (e.g., 'face' → ['CC_Base_Body_1']) */\n morphToMesh: Record<string, string[]>;\n\n /**\n * Optional map from AU `facePart` labels (from `auInfo`) to `morphToMesh` categories.\n * This makes AU mesh routing fully preset/profile configurable.\n * Example: { Eye: 'eye', Eyes: 'eye', Eyelids: 'eye', Tongue: 'tongue' }.\n */\n auFacePartToMeshCategory?: Record<string, string>;\n\n /** Optional ordered mapping sections for authoring UIs. Presets own this metadata, not consumers. */\n mappingSections?: MappingEditorSection[];\n\n /** Viseme targets in order (typically 15 phoneme positions) */\n visemeKeys: MorphTargetRef[];\n\n /** Optional id of the profile-defined viseme system (for example, 'cc4-arkit-15'). */\n visemeSystemId?: string;\n\n /** Optional profile-defined viseme slots used by editors and id-based runtime APIs. */\n visemeSlots?: VisemeSlot[];\n\n /** Optional authoring bindings keyed by viseme slot id. */\n visemeBindings?: Record<string, VisemeBinding>;\n\n /**\n * Optional `morphToMesh` category to use for viseme morph routing.\n * Falls back to `morphToMesh.viseme` (if present), then `morphToMesh.face`.\n */\n visemeMeshCategory?: string;\n\n /** Optional: Jaw opening amounts per viseme index (0-1). Used for auto-generating jaw rotation in clips. */\n visemeJawAmounts?: number[];\n\n /** Optional: Default mix weights for bone/morph blending (0 = morph only, 1 = bone only) */\n auMixDefaults?: Record<number, number>;\n\n /** Optional: AU metadata (names, muscle basis, etc.) */\n auInfo?: Record<string, AUInfo>;\n\n /** Optional: Eye mesh node fallbacks (some rigs use mesh nodes instead of bone nodes) */\n eyeMeshNodes?: {\n LEFT: string;\n RIGHT: string;\n };\n\n /** Optional: Composite rotation definitions for bones (defaults to CC4 composites) */\n compositeRotations?: CompositeRotation[];\n\n /** Optional: Mesh info for material settings (depthWrite, blending, renderOrder, etc.) */\n meshes?: Record<string, MeshInfo>;\n\n /**\n * Optional: Continuum pair mappings for bidirectional AU axes.\n * Maps AU ID to its partner info (pairId, isNegative, axis, node).\n * Enables negative value shorthand: setAU(51, -0.5) activates AU 52 at 0.5\n */\n continuumPairs?: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n }>;\n\n /**\n * Optional: Human-readable labels for continuum pairs.\n * Key format: \"negativeAU-positiveAU\" (e.g., \"51-52\")\n * Value: Display label (e.g., \"Head Turn — Left ↔ Right\")\n */\n continuumLabels?: Record<string, string>;\n\n /**\n * Optional: Annotation regions for camera/marker overlays.\n */\n annotationRegions?: AnnotationRegion[];\n\n /**\n * Optional: preset region names this profile explicitly disables.\n */\n disabledRegions?: string[];\n\n /**\n * Optional: Hair physics defaults for this preset/profile.\n */\n hairPhysics?: HairPhysicsProfileConfig;\n}\n\n/**\n * Hair physics morph mapping axis types.\n */\nexport type HairMorphAxis = 'yaw' | 'pitch' | 'roll';\n\n/**\n * Single morph target mapping with axis metadata.\n */\nexport interface HairMorphTargetMapping {\n key: string;\n axis: HairMorphAxis;\n}\n\n/**\n * Morph target mapping with axis metadata and intensity value.\n */\nexport interface HairMorphTargetValueMapping {\n value: number;\n axis: HairMorphAxis;\n}\n\n/**\n * Hair physics defaults stored in presets/profiles.\n */\nexport interface HairPhysicsProfileConfig {\n /** Whether hair physics should start enabled when this profile is applied. */\n enabled?: boolean;\n stiffness?: number;\n damping?: number;\n inertia?: number;\n gravity?: number;\n responseScale?: number;\n idleSwayAmount?: number;\n idleSwaySpeed?: number;\n windStrength?: number;\n windDirectionX?: number;\n windDirectionZ?: number;\n windTurbulence?: number;\n windFrequency?: number;\n idleClipDuration?: number;\n impulseClipDuration?: number;\n direction?: {\n yawSign?: 1 | -1;\n pitchSign?: 1 | -1;\n };\n morphTargets?: {\n swayLeft?: HairMorphTargetMapping;\n swayRight?: HairMorphTargetMapping;\n swayFront?: HairMorphTargetMapping;\n fluffRight?: HairMorphTargetMapping;\n fluffBottom?: HairMorphTargetMapping;\n headUp?: Record<string, HairMorphTargetValueMapping>;\n headDown?: Record<string, HairMorphTargetValueMapping>;\n };\n}\n\n\n/**\n * Morph target key (name in morphTargetDictionary).\n */\nexport type MorphTargetKey = string;\n\n/**\n * Morph target index (morphTargetInfluences slot).\n */\nexport type MorphTargetIndex = number;\n\n/**\n * Morph target reference (key or index).\n */\nexport type MorphTargetRef = MorphTargetKey | MorphTargetIndex;\n\nexport interface VisemeSlotFeatures {\n jawOpen?: number;\n lipClosed?: number;\n lipRound?: number;\n lipSpread?: number;\n tongueTip?: number;\n fricative?: number;\n nasal?: number;\n}\n\nexport interface VisemeSlot {\n /** Stable profile/runtime id, such as 'aa', 'bmp', or 'rest'. */\n id: string;\n /** Human-readable editor label. */\n label: string;\n /** Optional display/runtime order. Lower values render first. */\n order?: number;\n /** Provider-specific viseme ids that should map to this slot. */\n providerIds?: Record<string, Array<string | number>>;\n /** Phoneme hints that can map provider phonemes to this slot. */\n phonemes?: string[];\n /** Regex strings used to classify likely morph candidates for this slot. */\n matchers?: string[];\n /** Semantic hints for approximate provider or UI matching. */\n features?: VisemeSlotFeatures;\n /** Optional default jaw amount for this slot. */\n defaultJawAmount?: number;\n}\n\nexport interface VisemeBindingTarget {\n morph: MorphTargetRef;\n weight?: number;\n}\n\nexport interface VisemeBinding {\n targets?: VisemeBindingTarget[];\n /** Legacy/simplified single-target binding used by existing LoomLarge profiles. */\n morph?: MorphTargetRef;\n jawAmount?: number;\n note?: string;\n sharedWith?: string[];\n}\n\nexport type MappingSectionKind = 'au' | 'viseme' | 'lipSync' | 'hair' | 'unmapped' | 'custom';\n\nexport interface MappingEditorSection {\n id: string;\n label: string;\n kind: MappingSectionKind;\n order: number;\n meshCategory?: string;\n facePart?: string;\n}\n\nexport type MorphCandidateReason = 'explicit' | 'regex' | 'alias' | 'phoneme' | 'provider' | 'unmapped';\n\nexport interface MorphCandidateMatch {\n slotId: string;\n label: string;\n confidence: number;\n reason: MorphCandidateReason;\n pattern?: string;\n}\n\nexport interface MorphCandidate {\n morph: string;\n sectionId: string;\n kind: 'explicit' | 'candidate' | 'conflict' | 'unmapped';\n matches: MorphCandidateMatch[];\n}\n\nexport interface MappingEditorModel {\n sections: MappingEditorSection[];\n candidates: MorphCandidate[];\n}\n\nexport interface MorphTargetsBySide {\n left: MorphTargetRef[];\n right: MorphTargetRef[];\n center: MorphTargetRef[];\n}\n\n/**\n * Helper type for mesh categories in morphToMesh\n */\nexport type MorphCategory = 'face' | 'viseme' | 'eye' | 'tongue' | 'hair';\n\n/**\n * Mesh category types for character mesh classification\n */\nexport type MeshCategory = 'body' | 'eye' | 'eyeOcclusion' | 'tearLine' | 'teeth' | 'tongue' | 'hair' | 'eyebrow' | 'cornea' | 'eyelash';\n\n/**\n * Blending mode names (matches Three.js constants)\n */\nexport type BlendingMode = 'Normal' | 'Additive' | 'Subtractive' | 'Multiply' | 'None';\n\n/**\n * Blending mode options for Three.js materials\n * Maps mode name to Three.js blending constant value\n */\nexport const BLENDING_MODES: Record<BlendingMode, number> = {\n 'Normal': 1, // THREE.NormalBlending\n 'Additive': 2, // THREE.AdditiveBlending\n 'Subtractive': 3, // THREE.SubtractiveBlending\n 'Multiply': 4, // THREE.MultiplyBlending\n 'None': 0, // THREE.NoBlending\n};\n\n/**\n * Material settings for mesh rendering\n */\nexport interface MeshMaterialSettings {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: BlendingMode;\n}\n\n/**\n * Mesh info including category, morph count, and optional material settings.\n * Used in presets, profiles, and runtime.\n */\nexport interface MeshInfo {\n name?: string;\n visible?: boolean;\n category: MeshCategory;\n morphCount: number;\n material?: MeshMaterialSettings;\n}\n","/**\n * Embody - Geometry Helpers\n *\n * Helper functions for finding face positions, annotation centers,\n * and other geometry-related calculations for character models.\n */\n\nimport * as THREE from 'three';\n\n/**\n * Result of finding a face center position\n */\nexport interface FaceCenterResult {\n /** The calculated face center position in world space */\n center: THREE.Vector3;\n /** The head bone position (if found) */\n headBonePosition?: THREE.Vector3;\n /** How the center was determined */\n method: 'head-bone-offset' | 'bone-average' | 'mesh-center' | 'fallback';\n /** Debug info about what was found */\n debugInfo: string[];\n}\n\n/**\n * Options for finding face center\n */\nexport interface FindFaceCenterOptions {\n /** Names of bones to search for head bone (e.g., ['CC_Base_Head']) */\n headBoneNames?: string[];\n /** Names of face meshes - when provided, uses mesh bounding box center for positioning */\n faceMeshNames?: string[];\n /** Forward offset from head bone to face surface (default: 0.08 = 8cm) */\n forwardOffset?: number;\n /** Reference model height for scaling (default: 1.8m) */\n referenceHeight?: number;\n}\n\nconst DEFAULT_HEAD_BONE_NAMES = ['CC_Base_Head', 'Head', 'head', 'Bip01_Head'];\nconst DEFAULT_REFERENCE_HEIGHT = 1.8;\nconst DEFAULT_FORWARD_OFFSET = 0.08; // 8cm forward from head bone\n\n// Eye bone names for detecting forward direction\nconst EYE_BONE_NAMES = {\n left: ['CC_Base_L_Eye', 'LeftEye', 'Eye_L', 'L_Eye'],\n right: ['CC_Base_R_Eye', 'RightEye', 'Eye_R', 'R_Eye'],\n};\n\n/**\n * Find the center position of a character's face.\n *\n * Strategy:\n * 1. If face mesh names provided and they're face-only meshes, use mesh center\n * 2. Otherwise find head bone and use EYE positions to determine forward direction\n * (Eyes are reliably IN FRONT of the head bone, unlike jaw which is below)\n *\n * @param model - The root Object3D of the character model\n * @param options - Configuration options\n * @returns FaceCenterResult with the calculated position\n */\nexport function findFaceCenter(\n model: THREE.Object3D,\n options: FindFaceCenterOptions = {}\n): FaceCenterResult {\n const {\n headBoneNames = DEFAULT_HEAD_BONE_NAMES,\n faceMeshNames,\n forwardOffset = DEFAULT_FORWARD_OFFSET,\n referenceHeight = DEFAULT_REFERENCE_HEIGHT,\n } = options;\n\n const debugInfo: string[] = [];\n\n // Calculate model size for scaling\n const boundingBox = new THREE.Box3().setFromObject(model);\n const modelSize = new THREE.Vector3();\n boundingBox.getSize(modelSize);\n const scale = modelSize.y / referenceHeight;\n\n debugInfo.push(`Model height: ${modelSize.y.toFixed(2)}m, scale factor: ${scale.toFixed(2)}`);\n\n // Helper to find head bone\n const findHeadBone = (): THREE.Vector3 | null => {\n let headPos: THREE.Vector3 | null = null;\n model.traverse((obj) => {\n if (headPos) return;\n const objName = obj.name.toLowerCase();\n for (const boneName of headBoneNames) {\n if (objName === boneName.toLowerCase() || objName.includes(boneName.toLowerCase())) {\n headPos = new THREE.Vector3();\n obj.getWorldPosition(headPos);\n debugInfo.push(`Found head bone \"${obj.name}\" at (${headPos.x.toFixed(3)}, ${headPos.y.toFixed(3)}, ${headPos.z.toFixed(3)})`);\n return;\n }\n }\n });\n return headPos;\n };\n\n // Helper to find eye positions - eyes are IN FRONT of head bone\n const findEyes = (): { left: THREE.Vector3 | null; right: THREE.Vector3 | null } => {\n const eyes: { left: THREE.Vector3 | null; right: THREE.Vector3 | null } = {\n left: null,\n right: null,\n };\n\n model.traverse((obj) => {\n const objName = obj.name;\n\n if (!eyes.left) {\n for (const name of EYE_BONE_NAMES.left) {\n if (objName.includes(name)) {\n eyes.left = new THREE.Vector3();\n obj.getWorldPosition(eyes.left);\n debugInfo.push(`Found left eye \"${obj.name}\" at (${eyes.left.x.toFixed(3)}, ${eyes.left.y.toFixed(3)}, ${eyes.left.z.toFixed(3)})`);\n break;\n }\n }\n }\n\n if (!eyes.right) {\n for (const name of EYE_BONE_NAMES.right) {\n if (objName.includes(name)) {\n eyes.right = new THREE.Vector3();\n obj.getWorldPosition(eyes.right);\n debugInfo.push(`Found right eye \"${obj.name}\" at (${eyes.right.x.toFixed(3)}, ${eyes.right.y.toFixed(3)}, ${eyes.right.z.toFixed(3)})`);\n break;\n }\n }\n }\n });\n\n return eyes;\n };\n\n // PRIORITY 1: If face mesh names are provided, check if it's a face-only mesh\n if (faceMeshNames && faceMeshNames.length > 0) {\n debugInfo.push(`Looking for face meshes: ${faceMeshNames.join(', ')}`);\n\n const meshBox = new THREE.Box3();\n let foundMesh = false;\n\n model.traverse((obj) => {\n const isMesh = (obj as THREE.Mesh).isMesh;\n if (!isMesh) return;\n\n for (const meshName of faceMeshNames) {\n if (obj.name === meshName || obj.name.includes(meshName)) {\n const mesh = obj as THREE.Mesh;\n const tempBox = new THREE.Box3().setFromObject(mesh);\n meshBox.union(tempBox);\n foundMesh = true;\n debugInfo.push(`Found mesh: \"${obj.name}\"`);\n break;\n }\n }\n });\n\n if (foundMesh && !meshBox.isEmpty()) {\n const meshBoundsSize = new THREE.Vector3();\n meshBox.getSize(meshBoundsSize);\n\n // Check if this is a full-body mesh\n const isFullBodyMesh = meshBoundsSize.y > modelSize.y * 0.7;\n\n if (!isFullBodyMesh) {\n // Face-only mesh - use its center\n const meshCenter = new THREE.Vector3();\n meshBox.getCenter(meshCenter);\n debugInfo.push(`Using face mesh center: (${meshCenter.x.toFixed(3)}, ${meshCenter.y.toFixed(3)}, ${meshCenter.z.toFixed(3)})`);\n\n return {\n center: meshCenter,\n method: 'mesh-center',\n debugInfo,\n };\n }\n\n debugInfo.push(`Mesh is full-body (${meshBoundsSize.y.toFixed(2)}m), using eye-based direction instead`);\n }\n }\n\n // PRIORITY 2: Use eye positions to find face center\n // The midpoint between the eyes IS the face center (no offset needed)\n const eyes = findEyes();\n if (eyes.left && eyes.right) {\n const eyeCenter = new THREE.Vector3()\n .addVectors(eyes.left, eyes.right)\n .multiplyScalar(0.5);\n\n debugInfo.push(`Eye center (face position): (${eyeCenter.x.toFixed(3)}, ${eyeCenter.y.toFixed(3)}, ${eyeCenter.z.toFixed(3)})`);\n\n // Find head bone for reference\n const headPos = findHeadBone();\n\n return {\n center: eyeCenter,\n headBonePosition: headPos || undefined,\n method: 'head-bone-offset',\n debugInfo,\n };\n }\n\n // PRIORITY 3: Use head bone with model forward direction\n const headPos = findHeadBone();\n if (headPos) {\n const forwardDir = getModelForwardDirection(model);\n debugInfo.push('No eyes found, using head bone + model forward direction');\n const scaledOffset = forwardOffset * scale;\n const faceCenter = headPos.clone().add(forwardDir.multiplyScalar(scaledOffset));\n\n debugInfo.push(`Face center: (${faceCenter.x.toFixed(3)}, ${faceCenter.y.toFixed(3)}, ${faceCenter.z.toFixed(3)})`);\n\n return {\n center: faceCenter,\n headBonePosition: headPos.clone(),\n method: 'head-bone-offset',\n debugInfo,\n };\n }\n\n // Fallback: use model bounding box center, offset upward for face\n debugInfo.push('No head bone found, using model center fallback');\n const modelCenter = new THREE.Vector3();\n boundingBox.getCenter(modelCenter);\n\n const headHeight = boundingBox.min.y + modelSize.y * 0.9;\n const fallbackCenter = new THREE.Vector3(modelCenter.x, headHeight, modelCenter.z);\n\n debugInfo.push(`Fallback center: (${fallbackCenter.x.toFixed(3)}, ${fallbackCenter.y.toFixed(3)}, ${fallbackCenter.z.toFixed(3)})`);\n\n return {\n center: fallbackCenter,\n method: 'fallback',\n debugInfo,\n };\n}\n\n/**\n * Get the forward direction of a model in world space.\n * Assumes the model's local forward is positive Z.\n *\n * @param model - The model to get forward direction for\n * @returns Normalized forward direction vector in world space\n */\nexport function getModelForwardDirection(model: THREE.Object3D): THREE.Vector3 {\n const forward = new THREE.Vector3(0, 0, 1);\n forward.applyQuaternion(model.quaternion);\n return forward.normalize();\n}\n\n/**\n * Check if a character model is facing forward (toward camera at origin).\n * Uses head/eye bone positions to determine facing direction.\n *\n * @param model - The character model\n * @param eyeBoneNames - Names of eye bones to search for\n * @returns 'forward' if facing camera, 'backward' if facing away, 'unknown' if can't determine\n */\nexport function detectFacingDirection(\n model: THREE.Object3D,\n eyeBoneNames: { left: string[]; right: string[] } = {\n left: ['CC_Base_L_Eye', 'LeftEye', 'Eye_L'],\n right: ['CC_Base_R_Eye', 'RightEye', 'Eye_R'],\n }\n): 'forward' | 'backward' | 'unknown' {\n const eyes: { left: THREE.Vector3 | null; right: THREE.Vector3 | null } = {\n left: null,\n right: null,\n };\n\n model.traverse((obj) => {\n const objName = obj.name;\n\n if (!eyes.left) {\n for (const name of eyeBoneNames.left) {\n if (objName.includes(name)) {\n eyes.left = new THREE.Vector3();\n obj.getWorldPosition(eyes.left);\n break;\n }\n }\n }\n\n if (!eyes.right) {\n for (const name of eyeBoneNames.right) {\n if (objName.includes(name)) {\n eyes.right = new THREE.Vector3();\n obj.getWorldPosition(eyes.right);\n break;\n }\n }\n }\n });\n\n if (!eyes.left || !eyes.right) {\n return 'unknown';\n }\n\n // In a forward-facing model, left eye should have smaller X than right eye\n const eyeXDiff = eyes.left.x - eyes.right.x;\n\n if (Math.abs(eyeXDiff) < 0.001) {\n return 'unknown';\n }\n\n return eyeXDiff < 0 ? 'forward' : 'backward';\n}\n","import * as THREE from 'three';\n\nimport type { Region } from './types';\nimport { findFaceCenter } from '../validation/geometryHelpers';\n\nexport interface BoneResolutionProfile {\n bonePrefix?: string;\n boneSuffix?: string;\n boneNodes?: Record<string, string>;\n suffixPattern?: string;\n}\n\nexport interface ResolvedFaceCenter {\n center: THREE.Vector3;\n method: string;\n debugInfo: string[];\n}\n\nfunction normalizeLooseName(value: string): string {\n return value.replace(/\\./g, '');\n}\n\nfunction resolveBoneNameCandidates(semanticName: string, profile?: BoneResolutionProfile): string[] {\n if (!profile) return [semanticName];\n\n const { bonePrefix, boneSuffix, boneNodes } = profile;\n if (!boneNodes || !boneNodes[semanticName]) {\n return [semanticName];\n }\n\n const baseName = boneNodes[semanticName];\n const prefix = bonePrefix || '';\n const suffix = boneSuffix || '';\n\n if (!prefix && !suffix) {\n return [baseName];\n }\n\n const prefixedBase = prefix && baseName.startsWith(prefix) ? baseName : prefix + baseName;\n const fullyAffixed = suffix && !prefixedBase.endsWith(suffix) ? `${prefixedBase}${suffix}` : prefixedBase;\n\n return Array.from(new Set([fullyAffixed, baseName]));\n}\n\nexport function resolveBoneName(semanticName: string, profile?: BoneResolutionProfile): string {\n return resolveBoneNameCandidates(semanticName, profile)[0] ?? semanticName;\n}\n\nexport function resolveBoneNames(\n names: string[] | undefined,\n profile?: BoneResolutionProfile\n): string[] {\n if (!names || names.length === 0) return [];\n return Array.from(\n new Set(\n names.flatMap((name) => resolveBoneNameCandidates(name, profile))\n )\n );\n}\n\nexport function fuzzyNameMatch(\n objectName: string,\n targetName: string,\n suffixPattern?: string\n): boolean {\n if (objectName === targetName) return true;\n if (normalizeLooseName(objectName) === normalizeLooseName(targetName)) return true;\n if (!objectName.startsWith(targetName)) return false;\n const suffix = objectName.slice(targetName.length);\n if (suffix === '') return true;\n const regex = suffixPattern ? new RegExp(suffixPattern) : /^[_\\.]\\d+$/;\n return regex.test(suffix);\n}\n\nexport function resolveFaceCenter(\n model: THREE.Object3D,\n region: Region,\n profile?: BoneResolutionProfile\n): ResolvedFaceCenter {\n const resolvedBones = resolveBoneNames(region.bones, profile);\n const headBoneNames = resolvedBones.filter((name) => name.toLowerCase().includes('head'));\n\n const result = findFaceCenter(model, {\n headBoneNames: headBoneNames.length > 0 ? headBoneNames : undefined,\n faceMeshNames: region.meshes && region.meshes.length > 0 ? region.meshes : undefined,\n });\n\n return {\n center: result.center,\n method: result.method,\n debugInfo: result.debugInfo,\n };\n}\n","import type { AUInfo, BoneBinding, CompositeRotation, RotationAxis } from '../core/types';\nimport type { Profile } from '../mappings/types';\nimport { fuzzyNameMatch } from '../regions/regionMapping';\n\nexport const JOINT_CONTROL_SECTION = 'Joint Controls';\n\nexport type BoneAxisKey = 'pitch' | 'yaw' | 'roll';\nexport type RotationChannel = 'rx' | 'ry' | 'rz';\nexport type BoneAxisDirection = 'negative' | 'positive';\nexport type BoneAxisDirectionScale = -1 | 1;\n\nexport interface BilateralAxisDirectionScaleState {\n left: BoneAxisDirectionScale | null;\n right: BoneAxisDirectionScale | null;\n}\n\nexport interface BoneAxisBindingState {\n axis: BoneAxisKey;\n channel: RotationChannel;\n nodeKey: string;\n positiveAuId: number | null;\n negativeAuId: number | null;\n positiveMaxDegrees: number | null;\n negativeMaxDegrees: number | null;\n positiveScale: BoneAxisDirectionScale | null;\n negativeScale: BoneAxisDirectionScale | null;\n}\n\nexport interface BoneAxisBindingUpdate {\n channel?: RotationChannel;\n positiveAuId?: number | null;\n negativeAuId?: number | null;\n positiveMaxDegrees?: number | null;\n negativeMaxDegrees?: number | null;\n positiveScale?: BoneAxisDirectionScale | null;\n negativeScale?: BoneAxisDirectionScale | null;\n positiveLeftScale?: BoneAxisDirectionScale | null;\n positiveRightScale?: BoneAxisDirectionScale | null;\n negativeLeftScale?: BoneAxisDirectionScale | null;\n negativeRightScale?: BoneAxisDirectionScale | null;\n}\n\nexport function isMaxDegreesOnlyAxisBindingUpdate(update: BoneAxisBindingUpdate): boolean {\n const entries = Object.entries(update);\n if (entries.length === 0) {\n return false;\n }\n\n return entries.every(([key]) => key === 'negativeMaxDegrees' || key === 'positiveMaxDegrees');\n}\n\nexport interface AUBoneBindingState {\n auId: number;\n boneName: string | null;\n nodeKey: string | null;\n axis: BoneAxisKey;\n direction: BoneAxisDirection;\n channel: RotationChannel | null;\n maxDegrees: number | null;\n oppositeAuId: number | null;\n oppositeMaxDegrees: number | null;\n hasBinding: boolean;\n hasMultipleBindings: boolean;\n}\n\nexport interface CreatedBoneAxisAu {\n auId: number;\n profile: Profile;\n}\n\nexport interface ChiralBoneNamePair {\n leftBoneName: string;\n rightBoneName: string;\n selectedSide: 'left' | 'right';\n familyLabel: string;\n}\n\ntype BoneControlMetadata = Pick<AUInfo, 'faceArea' | 'facePart'>;\nexport type BoneControlScope = 'Left Eye Only' | 'Right Eye Only' | 'Both Eyes';\nexport type BoneControlFamily = 'Horizontal Gaze' | 'Vertical Gaze';\nexport type BilateralBoneAxisScope = 'shared' | 'left' | 'right';\ntype BoneNodesMap = Profile['boneNodes'];\ntype AuToBonesMap = Profile['auToBones'];\ntype ContinuumPairsMap = NonNullable<Profile['continuumPairs']>;\ntype ContinuumPairInfo = ContinuumPairsMap[number];\n\nexport interface BilateralAxisScopeBindingState {\n scope: BilateralBoneAxisScope;\n label: string;\n negativeAuId: number | null;\n positiveAuId: number | null;\n negativeMaxDegrees: number | null;\n positiveMaxDegrees: number | null;\n negativeScale: BilateralAxisDirectionScaleState;\n positiveScale: BilateralAxisDirectionScaleState;\n}\n\nexport interface BilateralAxisBindingState {\n axis: BoneAxisKey;\n familyLabel: string;\n leftBoneName: string;\n leftNodeKey: string;\n rightBoneName: string;\n rightNodeKey: string;\n selectedSide: 'left' | 'right';\n shared: BilateralAxisScopeBindingState;\n left: BilateralAxisScopeBindingState;\n right: BilateralAxisScopeBindingState;\n}\n\ntype ChiralSide = 'left' | 'right' | 'center' | 'unknown';\n\ninterface ChiralNodeMatch {\n nodeKey: string;\n boneName: string;\n side: ChiralSide;\n stem: string;\n strength: number;\n}\n\ninterface ChiralPairMatch {\n stem: string;\n left: ChiralNodeMatch;\n right: ChiralNodeMatch;\n}\n\ninterface BilateralAxisContext {\n axis: BoneAxisKey;\n boneNodes: BoneNodesMap;\n familyLabel: string;\n selectedSide: 'left' | 'right';\n leftBoneName: string;\n leftNodeKey: string;\n rightBoneName: string;\n rightNodeKey: string;\n leftChannel: RotationChannel;\n rightChannel: RotationChannel;\n leftNegativeIds: number[];\n leftPositiveIds: number[];\n rightNegativeIds: number[];\n rightPositiveIds: number[];\n sharedNegativeIds: number[];\n sharedPositiveIds: number[];\n leftOnlyNegativeIds: number[];\n leftOnlyPositiveIds: number[];\n rightOnlyNegativeIds: number[];\n rightOnlyPositiveIds: number[];\n leftNeutralIds: number[];\n rightNeutralIds: number[];\n}\n\nconst DEFAULT_CHANNEL_TO_AXIS: Record<RotationChannel, BoneAxisKey> = {\n rx: 'pitch',\n ry: 'yaw',\n rz: 'roll',\n};\n\nfunction getBoneNodeEntries(boneNodes: BoneNodesMap | undefined): Array<[string, string]> {\n return Object.entries((boneNodes ?? {}) as BoneNodesMap) as Array<[string, string]>;\n}\n\nfunction getAuToBonesEntries(auToBones: AuToBonesMap | undefined): Array<[string, BoneBinding[]]> {\n return Object.entries((auToBones ?? {}) as AuToBonesMap) as Array<[string, BoneBinding[]]>;\n}\n\nfunction getContinuumPairEntries(\n continuumPairs: Profile['continuumPairs'],\n): Array<[string, ContinuumPairInfo]> {\n return Object.entries((continuumPairs ?? {}) as ContinuumPairsMap) as Array<[string, ContinuumPairInfo]>;\n}\n\nexport const DEFAULT_AXIS_TO_CHANNEL: Record<BoneAxisKey, RotationChannel> = {\n pitch: 'rx',\n yaw: 'ry',\n roll: 'rz',\n};\n\nexport const DEFAULT_BONE_MAX_DEGREES = 60;\nconst EYE_NODE_KEYS = new Set(['EYE_L', 'EYE_R']);\nconst LEFT_MARKERS = new Set(['left', 'l']);\nconst RIGHT_MARKERS = new Set(['right', 'r']);\n\nfunction normalizeDegrees(value: number | null | undefined): number {\n if (value == null || Number.isNaN(value)) {\n return DEFAULT_BONE_MAX_DEGREES;\n }\n\n return Math.max(1, Math.min(180, Math.round(value)));\n}\n\nfunction normalizeDirectionScale(\n value: BoneAxisDirectionScale | null | undefined,\n fallback: BoneAxisDirectionScale,\n): BoneAxisDirectionScale {\n if (value === -1 || value === 1) {\n return value;\n }\n\n return fallback;\n}\n\nfunction isEyeNodeKey(nodeKey: string | null | undefined): boolean {\n if (!nodeKey) return false;\n if (EYE_NODE_KEYS.has(nodeKey)) return true;\n const tokens = tokenizeIdentifier(nodeKey);\n return tokens.includes('eye') || tokens.includes('eyes');\n}\n\nfunction tokenizeIdentifier(value: string): string[] {\n const withWordBreaks = value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2');\n\n return withWordBreaks\n .split(/[^A-Za-z0-9]+/)\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction analyzeChiralIdentifier(rawValue: string): { side: ChiralSide; stem: string; strength: number } {\n const tokens = tokenizeIdentifier(rawValue);\n if (tokens.length === 0) {\n return { side: 'unknown', stem: '', strength: 0 };\n }\n\n const hasLeftWord = tokens.includes('left');\n const hasRightWord = tokens.includes('right');\n const hasLeftShort = tokens.includes('l');\n const hasRightShort = tokens.includes('r');\n const hasLeft = hasLeftWord || hasLeftShort;\n const hasRight = hasRightWord || hasRightShort;\n\n const side: ChiralSide = hasLeft && !hasRight\n ? 'left'\n : hasRight && !hasLeft\n ? 'right'\n : !hasLeft && !hasRight\n ? 'center'\n : 'unknown';\n\n const stemTokens = tokens.filter((token) => !LEFT_MARKERS.has(token) && !RIGHT_MARKERS.has(token));\n return {\n side,\n stem: (stemTokens.length > 0 ? stemTokens : tokens).join('_'),\n strength: hasLeftWord || hasRightWord ? 2 : hasLeftShort || hasRightShort ? 1 : 0,\n };\n}\n\nfunction buildChiralNodeMatch(nodeKey: string, boneName: string): ChiralNodeMatch {\n const keyMatch = analyzeChiralIdentifier(nodeKey);\n const boneMatch = analyzeChiralIdentifier(boneName);\n const keyIsSide = keyMatch.side === 'left' || keyMatch.side === 'right';\n const boneIsSide = boneMatch.side === 'left' || boneMatch.side === 'right';\n\n if (keyIsSide && (!boneIsSide || keyMatch.strength >= boneMatch.strength)) {\n return {\n nodeKey,\n boneName,\n side: keyMatch.side,\n stem: keyMatch.stem,\n strength: keyMatch.strength,\n };\n }\n\n if (boneIsSide) {\n return {\n nodeKey,\n boneName,\n side: boneMatch.side,\n stem: boneMatch.stem,\n strength: boneMatch.strength,\n };\n }\n\n return {\n nodeKey,\n boneName,\n side: 'center',\n stem: keyMatch.stem || boneMatch.stem,\n strength: Math.max(keyMatch.strength, boneMatch.strength),\n };\n}\n\nfunction inferChiralPairMatch(profile: Pick<Profile, 'boneNodes'>, nodeKey: string): ChiralPairMatch | null {\n const entries = getBoneNodeEntries(profile.boneNodes);\n const grouped = new Map<string, { left: ChiralNodeMatch[]; right: ChiralNodeMatch[] }>();\n\n for (const [candidateNodeKey, boneName] of entries) {\n const match = buildChiralNodeMatch(candidateNodeKey, boneName);\n if (match.side !== 'left' && match.side !== 'right') {\n continue;\n }\n\n const stem = match.stem || `${candidateNodeKey.toLowerCase()}_${match.side}`;\n const group = grouped.get(stem) ?? { left: [], right: [] };\n group[match.side].push(match);\n grouped.set(stem, group);\n }\n\n for (const [stem, group] of grouped.entries()) {\n const left = [...group.left].sort((a, b) => a.nodeKey.localeCompare(b.nodeKey));\n const right = [...group.right].sort((a, b) => a.nodeKey.localeCompare(b.nodeKey));\n const pairCount = Math.min(left.length, right.length);\n for (let index = 0; index < pairCount; index += 1) {\n const pair = { stem, left: left[index], right: right[index] };\n if (pair.left.nodeKey === nodeKey || pair.right.nodeKey === nodeKey) {\n return pair;\n }\n }\n }\n\n return null;\n}\n\nfunction titleCaseStem(stem: string): string {\n return stem\n .split(/[_\\s-]+/)\n .filter(Boolean)\n .map((token) => token.charAt(0).toUpperCase() + token.slice(1))\n .join(' ');\n}\n\nfunction getBilateralFamilyLabel(pair: ChiralPairMatch): string {\n const titledStem = titleCaseStem(pair.stem);\n if (titledStem) {\n return titledStem;\n }\n\n const fallback = pair.left.boneName || pair.right.boneName || pair.left.nodeKey || pair.right.nodeKey;\n return fallback.replace(/\\b(left|right)\\b/ig, '').replace(/[_-]+/g, ' ').trim() || 'Bone';\n}\n\nexport function inferChiralBoneNamePair(\n boneNames: string[],\n selectedBoneName: string,\n): ChiralBoneNamePair | null {\n const grouped = new Map<string, { left: ChiralNodeMatch[]; right: ChiralNodeMatch[] }>();\n\n for (const boneName of boneNames) {\n const match = buildChiralNodeMatch(boneName, boneName);\n if (match.side !== 'left' && match.side !== 'right') {\n continue;\n }\n\n const stem = match.stem || `${boneName.toLowerCase()}_${match.side}`;\n const group = grouped.get(stem) ?? { left: [], right: [] };\n group[match.side].push(match);\n grouped.set(stem, group);\n }\n\n for (const [stem, group] of grouped.entries()) {\n const left = [...group.left].sort((a, b) => a.boneName.localeCompare(b.boneName));\n const right = [...group.right].sort((a, b) => a.boneName.localeCompare(b.boneName));\n const pairCount = Math.min(left.length, right.length);\n for (let index = 0; index < pairCount; index += 1) {\n const pair = { stem, left: left[index], right: right[index] };\n if (pair.left.boneName !== selectedBoneName && pair.right.boneName !== selectedBoneName) {\n continue;\n }\n\n return {\n leftBoneName: pair.left.boneName,\n rightBoneName: pair.right.boneName,\n selectedSide: pair.left.boneName === selectedBoneName ? 'left' : 'right',\n familyLabel: getBilateralFamilyLabel(pair),\n };\n }\n }\n\n return null;\n}\n\nexport function formatAxisLabel(axis: BoneAxisKey): string {\n if (axis === 'pitch') return 'Pitch';\n if (axis === 'yaw') return 'Yaw';\n return 'Roll';\n}\n\nexport function formatAxisDirectionLabel(\n axis: BoneAxisKey,\n direction: BoneAxisDirection,\n): string {\n if (axis === 'pitch') {\n return direction === 'negative' ? 'Down' : 'Up';\n }\n\n return direction === 'negative' ? 'Left' : 'Right';\n}\n\nfunction matchesNodeKey(boneName: string, profile: Profile, nodeKey: string): boolean {\n const baseName = profile.boneNodes?.[nodeKey];\n if (!baseName) return false;\n\n const prefix = profile.bonePrefix ?? '';\n const suffix = profile.boneSuffix ?? '';\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n const expected = `${prefixedBase}${suffix}`;\n\n if (boneName === expected || boneName === baseName) {\n return true;\n }\n\n if (\n fuzzyNameMatch(boneName, expected, profile.suffixPattern)\n || fuzzyNameMatch(boneName, baseName, profile.suffixPattern)\n ) {\n return true;\n }\n\n if (profile.suffixPattern && boneName.startsWith(expected)) {\n try {\n const suffixPattern = new RegExp(profile.suffixPattern);\n return suffixPattern.test(boneName.slice(expected.length));\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nexport function stripConfiguredBoneAffixes(\n profile: { bonePrefix?: string; boneSuffix?: string } | null | undefined,\n boneName: string,\n): string {\n let stripped = boneName.trim();\n const prefix = profile?.bonePrefix?.trim() ?? '';\n const suffix = profile?.boneSuffix?.trim() ?? '';\n\n if (prefix && stripped.startsWith(prefix)) {\n stripped = stripped.slice(prefix.length);\n }\n\n if (suffix && stripped.endsWith(suffix)) {\n stripped = stripped.slice(0, Math.max(0, stripped.length - suffix.length));\n }\n\n return stripped || boneName.trim();\n}\n\nfunction formatBoneAutoTitle(\n profile: { bonePrefix?: string; boneSuffix?: string } | null | undefined,\n boneName: string,\n): string {\n const stripped = stripConfiguredBoneAffixes(profile, boneName);\n const tokens = tokenizeIdentifier(stripped);\n if (tokens.length === 0) {\n return stripped;\n }\n\n return tokens.map((token) => (\n token.length === 1\n ? token.toUpperCase()\n : `${token.charAt(0).toUpperCase()}${token.slice(1)}`\n )).join(' ');\n}\n\nfunction deriveContinuumLabelFromAuNames(\n negativeName: string | null | undefined,\n positiveName: string | null | undefined,\n axis: BoneAxisKey | null | undefined,\n): string | null {\n const left = negativeName?.trim();\n const right = positiveName?.trim();\n if (!left || !right) {\n return null;\n }\n\n const leftTokens = left.split(/\\s+/).filter(Boolean);\n const rightTokens = right.split(/\\s+/).filter(Boolean);\n if (leftTokens.length === 0 || rightTokens.length === 0) {\n return null;\n }\n\n const commonTokens: string[] = [];\n const sharedLength = Math.min(leftTokens.length, rightTokens.length);\n for (let index = 0; index < sharedLength; index += 1) {\n if (leftTokens[index].toLowerCase() !== rightTokens[index].toLowerCase()) {\n break;\n }\n commonTokens.push(leftTokens[index]);\n }\n\n const root = commonTokens.join(' ').trim();\n if (!root) {\n return null;\n }\n\n if (!axis) {\n return root;\n }\n\n const lowerRoot = root.toLowerCase();\n const axisLabel = formatAxisLabel(axis);\n if (\n lowerRoot.includes(axisLabel.toLowerCase())\n || /\\b(turn|look|tilt|horizontal|vertical)\\b/i.test(root)\n ) {\n return root;\n }\n\n return `${root} ${axisLabel}`;\n}\n\nexport function findNodeKeyForBone(boneName: string, profile: Profile | null): string | null {\n if (!profile?.boneNodes) return null;\n\n for (const nodeKey of Object.keys(profile.boneNodes)) {\n if (matchesNodeKey(boneName, profile, nodeKey)) {\n return nodeKey;\n }\n }\n\n return null;\n}\n\nfunction sanitizeBoneNodeKey(\n profile: { bonePrefix?: string; boneSuffix?: string } | null | undefined,\n boneName: string,\n): string {\n const normalized = stripConfiguredBoneAffixes(profile, boneName)\n .trim()\n .replace(/[^A-Za-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n\n return normalized || 'CUSTOM';\n}\n\nfunction buildPreferredChiralNodeKey(boneName: string): string | null {\n const match = buildChiralNodeMatch(boneName, boneName);\n if (match.side !== 'left' && match.side !== 'right') {\n return null;\n }\n\n const normalizedStem = (match.stem || tokenizeIdentifier(boneName).join('_'))\n .replace(/[^A-Za-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n\n if (!normalizedStem) {\n return null;\n }\n\n return `${normalizedStem}_${match.side === 'left' ? 'L' : 'R'}`;\n}\n\nfunction ensureBoneNodeKeyWithPreferredKey(\n profile: Profile,\n boneName: string,\n preferredKey?: string | null,\n): { nodeKey: string; boneNodes: Record<string, string> } {\n const existing = findNodeKeyForBone(boneName, profile);\n if (existing) {\n return { nodeKey: existing, boneNodes: { ...(profile.boneNodes ?? {}) } };\n }\n\n const boneNodes = { ...(profile.boneNodes ?? {}) };\n const baseKey = boneName.trim() || preferredKey?.trim() || sanitizeBoneNodeKey(profile, boneName);\n\n if (!boneNodes[baseKey] || boneNodes[baseKey] === boneName) {\n boneNodes[baseKey] = boneName;\n return { nodeKey: baseKey, boneNodes };\n }\n\n let suffix = 2;\n let candidate = `${baseKey}_${suffix}`;\n while (boneNodes[candidate] && boneNodes[candidate] !== boneName) {\n suffix += 1;\n candidate = `${baseKey}_${suffix}`;\n }\n\n boneNodes[candidate] = boneName;\n return { nodeKey: candidate, boneNodes };\n}\n\nexport function ensureBoneNodeKey(profile: Profile, boneName: string): { nodeKey: string; boneNodes: Record<string, string> } {\n return ensureBoneNodeKeyWithPreferredKey(profile, boneName);\n}\n\nexport function ensureBilateralBoneNodeKeys(\n profile: Profile,\n leftBoneName: string,\n rightBoneName: string,\n): Profile {\n const leftEnsured = ensureBoneNodeKeyWithPreferredKey(profile, leftBoneName, buildPreferredChiralNodeKey(leftBoneName));\n const leftProfile = {\n ...profile,\n boneNodes: leftEnsured.boneNodes,\n };\n const rightEnsured = ensureBoneNodeKeyWithPreferredKey(leftProfile, rightBoneName, buildPreferredChiralNodeKey(rightBoneName));\n return {\n ...leftProfile,\n boneNodes: rightEnsured.boneNodes,\n };\n}\n\nexport function resolveBoneNameForNodeKey(profile: Profile, nodeKey: string): string | null {\n const baseName = profile.boneNodes?.[nodeKey];\n if (!baseName) return null;\n\n const prefix = profile.bonePrefix ?? '';\n const suffix = profile.boneSuffix ?? '';\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n return `${prefixedBase}${suffix}` || baseName;\n}\n\nfunction cloneAuToBones(auToBones: Profile['auToBones']): Record<number, BoneBinding[]> {\n return Object.fromEntries(\n getAuToBonesEntries(auToBones).map(([auId, bindings]) => [\n Number(auId),\n bindings.map((binding) => ({ ...binding })),\n ]),\n ) as Record<number, BoneBinding[]>;\n}\n\nfunction cloneSelector(selector: number | number[] | undefined): number | number[] | undefined {\n if (selector == null) return undefined;\n return Array.isArray(selector) ? [...selector] : selector;\n}\n\nfunction cloneRotationAxis(axisConfig: RotationAxis | null | undefined): RotationAxis | null {\n if (!axisConfig) return null;\n return {\n ...axisConfig,\n aus: [...axisConfig.aus],\n ...(axisConfig.negative !== undefined ? { negative: cloneSelector(axisConfig.negative) } : {}),\n ...(axisConfig.positive !== undefined ? { positive: cloneSelector(axisConfig.positive) } : {}),\n };\n}\n\nfunction cloneCompositeRotations(composites: Profile['compositeRotations']): CompositeRotation[] {\n return (composites ?? []).map((entry) => ({\n node: entry.node,\n pitch: cloneRotationAxis(entry.pitch),\n yaw: cloneRotationAxis(entry.yaw),\n roll: cloneRotationAxis(entry.roll),\n }));\n}\n\nfunction findDirectionalBindingForAxisFallback(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n channel: RotationChannel,\n scale: -1 | 1,\n): { auId: number | null; binding: BoneBinding | null } {\n const semanticAxisClaims = getSemanticAxisClaims(profile, nodeKey);\n\n for (const [auIdStr, bindings] of getAuToBonesEntries(profile.auToBones)) {\n const match = bindings.find((binding) => (\n binding.node === nodeKey &&\n binding.channel === channel &&\n binding.scale === scale\n ));\n if (!match) {\n continue;\n }\n\n const auId = Number(auIdStr);\n const claimedAxis = semanticAxisClaims.get(auId);\n if (claimedAxis && claimedAxis !== axis) {\n continue;\n }\n\n return { auId, binding: match };\n }\n\n return { auId: null, binding: null };\n}\n\nfunction getDirectionalAuIdsForAxisFallback(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n channel: RotationChannel,\n scale: -1 | 1,\n): number[] {\n const semanticAxisClaims = getSemanticAxisClaims(profile, nodeKey);\n\n return getAuToBonesEntries(profile.auToBones)\n .filter(([auIdStr, bindings]) => {\n const claimedAxis = semanticAxisClaims.get(Number(auIdStr));\n if (claimedAxis && claimedAxis !== axis) {\n return false;\n }\n\n return bindings.some((binding) => (\n binding.node === nodeKey &&\n binding.channel === channel &&\n binding.scale === scale\n ));\n })\n .map(([auIdStr]) => Number(auIdStr));\n}\n\nfunction findAuBinding(\n profile: Profile,\n nodeKey: string,\n channel: RotationChannel,\n auId: number,\n): BoneBinding | null {\n return profile.auToBones?.[auId]?.find((binding) => (\n binding.node === nodeKey &&\n binding.channel === channel\n )) ?? null;\n}\n\nfunction findAnyRotationBindingForAu(\n profile: Profile,\n nodeKey: string,\n auId: number,\n): (BoneBinding & { channel: RotationChannel }) | null {\n return profile.auToBones?.[auId]?.find((binding): binding is BoneBinding & { channel: RotationChannel } => (\n binding.node === nodeKey &&\n isRotationChannel(binding.channel)\n )) ?? null;\n}\n\nfunction selectorToArray(selector: number | number[] | undefined): number[] {\n if (selector == null) return [];\n return Array.isArray(selector) ? selector : [selector];\n}\n\nfunction selectorFromArray(values: number[]): number | number[] | undefined {\n if (values.length === 0) return undefined;\n if (values.length === 1) return values[0];\n return values;\n}\n\nfunction getSemanticAxisClaims(\n profile: Profile,\n nodeKey: string,\n): Map<number, BoneAxisKey> {\n const claims = new Map<number, BoneAxisKey>();\n\n getContinuumPairEntries(profile.continuumPairs).forEach(([auIdStr, info]) => {\n if (info.node === nodeKey) {\n claims.set(Number(auIdStr), info.axis);\n }\n });\n\n const composite = getCompositeRotationEntry(profile, nodeKey);\n if (!composite) {\n return claims;\n }\n\n (['pitch', 'yaw', 'roll'] as BoneAxisKey[]).forEach((axis) => {\n const axisConfig = composite[axis];\n if (!axisConfig) {\n return;\n }\n\n selectorToArray(axisConfig.negative).forEach((auId) => claims.set(auId, axis));\n selectorToArray(axisConfig.positive).forEach((auId) => claims.set(auId, axis));\n axisConfig.aus.forEach((auId) => claims.set(auId, axis));\n });\n\n return claims;\n}\n\nfunction isRotationChannel(channel: BoneBinding['channel']): channel is RotationChannel {\n return channel === 'rx' || channel === 'ry' || channel === 'rz';\n}\n\nfunction getAssignedAuIds(binding: Pick<BoneAxisBindingState, 'negativeAuId' | 'positiveAuId'>): number[] {\n return Array.from(new Set([binding.negativeAuId, binding.positiveAuId].filter((value): value is number => value != null)));\n}\n\nexport function inferEyeControlScope(\n profile: Pick<Profile, 'auToBones'>,\n binding: Pick<BoneAxisBindingState, 'nodeKey' | 'negativeAuId' | 'positiveAuId'>,\n): BoneControlScope | null {\n if (!isEyeNodeKey(binding.nodeKey)) {\n return null;\n }\n\n const touchedEyeNodes = new Set<string>();\n getAssignedAuIds(binding).forEach((auId) => {\n (profile.auToBones?.[auId] ?? []).forEach((entry) => {\n if (isRotationChannel(entry.channel) && isEyeNodeKey(entry.node)) {\n touchedEyeNodes.add(entry.node);\n }\n });\n });\n\n const touchedSides = Array.from(touchedEyeNodes)\n .map((node) => buildChiralNodeMatch(node, node).side);\n if (touchedSides.includes('left') && touchedSides.includes('right')) {\n return 'Both Eyes';\n }\n\n const selectedSide = buildChiralNodeMatch(binding.nodeKey, binding.nodeKey).side;\n if (binding.nodeKey === 'EYE_L' || selectedSide === 'left') {\n return 'Left Eye Only';\n }\n\n if (binding.nodeKey === 'EYE_R' || selectedSide === 'right') {\n return 'Right Eye Only';\n }\n\n return null;\n}\n\nexport function inferEyeControlFamily(\n binding: Pick<BoneAxisBindingState, 'nodeKey' | 'axis'>,\n): BoneControlFamily | null {\n if (!isEyeNodeKey(binding.nodeKey)) {\n return null;\n }\n\n if (binding.axis === 'yaw') {\n return 'Horizontal Gaze';\n }\n\n if (binding.axis === 'pitch') {\n return 'Vertical Gaze';\n }\n\n return null;\n}\n\nfunction getConfiguredCompositeChannel(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n): RotationChannel | null {\n const composite = profile.compositeRotations?.find((entry) => entry.node === nodeKey);\n const axisConfig = composite?.[axis];\n return axisConfig?.axis ?? null;\n}\n\nfunction getCompositeRotationEntry(profile: Profile, nodeKey: string): CompositeRotation | null {\n return profile.compositeRotations?.find((entry) => entry.node === nodeKey) ?? null;\n}\n\nfunction getCompositeAxisConfig(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n): RotationAxis | null {\n return getCompositeRotationEntry(profile, nodeKey)?.[axis] ?? null;\n}\n\nfunction getContinuumChannel(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n): RotationChannel | null {\n for (const [auIdStr, info] of getContinuumPairEntries(profile.continuumPairs)) {\n if (info.node !== nodeKey || info.axis !== axis) {\n continue;\n }\n\n const candidates = [Number(auIdStr), info.pairId];\n for (const auId of candidates) {\n const binding = profile.auToBones?.[auId]?.find((entry): entry is BoneBinding & { channel: RotationChannel } => (\n entry.node === nodeKey &&\n isRotationChannel(entry.channel)\n ));\n if (binding) {\n return binding.channel;\n }\n }\n }\n\n return null;\n}\n\nfunction findSemanticDirectionalBinding(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n channel: RotationChannel,\n direction: BoneAxisDirection,\n): { auId: number | null; binding: BoneBinding | null } {\n const isNegative = direction === 'negative';\n\n for (const [auIdStr, info] of getContinuumPairEntries(profile.continuumPairs)) {\n if (\n info.node === nodeKey &&\n info.axis === axis &&\n info.isNegative === isNegative\n ) {\n const auId = Number(auIdStr);\n const binding = findAuBinding(profile, nodeKey, channel, auId);\n if (binding && isRotationChannel(binding.channel)) {\n return { auId, binding };\n }\n\n const fallbackBinding = findAnyRotationBindingForAu(profile, nodeKey, auId);\n if (fallbackBinding) {\n return { auId, binding: fallbackBinding };\n }\n }\n }\n\n const composite = profile.compositeRotations?.find((entry) => entry.node === nodeKey);\n const axisConfig = composite?.[axis];\n const candidateIds = selectorToArray(isNegative ? axisConfig?.negative : axisConfig?.positive);\n\n for (const auId of candidateIds) {\n const binding = findAuBinding(profile, nodeKey, channel, auId);\n if (binding && isRotationChannel(binding.channel)) {\n return { auId, binding };\n }\n\n const fallbackBinding = findAnyRotationBindingForAu(profile, nodeKey, auId);\n if (fallbackBinding) {\n return { auId, binding: fallbackBinding };\n }\n }\n\n return findDirectionalBindingForAxisFallback(\n profile,\n nodeKey,\n axis,\n channel,\n direction === 'positive' ? 1 : -1,\n );\n}\n\nfunction getAxisDirectionSelectorIds(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n channel: RotationChannel,\n direction: BoneAxisDirection,\n): number[] {\n const axisConfig = getCompositeAxisConfig(profile, nodeKey, axis);\n const pairIds = getContinuumPairEntries(profile.continuumPairs)\n .filter(([, info]) => (\n info.node === nodeKey &&\n info.axis === axis &&\n info.isNegative === (direction === 'negative')\n ))\n .map(([auIdStr]) => Number(auIdStr));\n\n const selectorIds = selectorToArray(direction === 'negative' ? axisConfig?.negative : axisConfig?.positive);\n if (axisConfig) {\n const negativeIds = selectorToArray(axisConfig.negative);\n const positiveIds = selectorToArray(axisConfig.positive);\n const unassignedIds = axisConfig.aus.filter((auId) => (\n !negativeIds.includes(auId) &&\n !positiveIds.includes(auId)\n ));\n const semanticIds = Array.from(new Set([\n ...selectorIds,\n ...(direction === 'positive' && selectorIds.length > 0 ? unassignedIds : []),\n ...pairIds,\n ]));\n\n if (semanticIds.length > 0) {\n return semanticIds;\n }\n }\n\n if (pairIds.length > 0) {\n return Array.from(new Set(pairIds));\n }\n\n const targetScale = direction === 'positive' ? 1 : -1;\n return getDirectionalAuIdsForAxisFallback(profile, nodeKey, axis, channel, targetScale);\n}\n\nfunction findRotationBindingForAxisAu(\n profile: Profile,\n nodeKey: string,\n auId: number,\n channels: RotationChannel[],\n): BoneBinding | null {\n return profile.auToBones?.[auId]?.find((binding) => (\n binding.node === nodeKey &&\n isRotationChannel(binding.channel) &&\n channels.includes(binding.channel)\n )) ?? null;\n}\n\nfunction findAxisRotationBinding(\n profile: Profile,\n auId: number | null,\n nodeKey: string,\n channel: RotationChannel,\n): BoneBinding | null {\n if (auId == null) return null;\n return profile.auToBones?.[auId]?.find((binding) => (\n binding.node === nodeKey &&\n binding.channel === channel\n )) ?? null;\n}\n\nfunction buildBilateralAxisContext(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n): BilateralAxisContext | null {\n const { boneNodes, nodeKey } = ensureBoneNodeKey(profile, boneName);\n const profileWithSelectedNode = {\n ...profile,\n boneNodes,\n };\n const pair = inferChiralPairMatch(profileWithSelectedNode, nodeKey);\n if (!pair) {\n return null;\n }\n\n const selectedSide = pair.left.nodeKey === nodeKey ? 'left' : 'right';\n const leftBoneName = resolveBoneNameForNodeKey(profileWithSelectedNode, pair.left.nodeKey)\n ?? profileWithSelectedNode.boneNodes?.[pair.left.nodeKey]\n ?? pair.left.nodeKey;\n const rightBoneName = resolveBoneNameForNodeKey(profileWithSelectedNode, pair.right.nodeKey)\n ?? profileWithSelectedNode.boneNodes?.[pair.right.nodeKey]\n ?? pair.right.nodeKey;\n const leftChannel = resolveBoneAxisChannel(profileWithSelectedNode, leftBoneName, axis);\n const rightChannel = resolveBoneAxisChannel(profileWithSelectedNode, rightBoneName, axis);\n\n const leftNegativeIds = getAxisDirectionSelectorIds(profileWithSelectedNode, pair.left.nodeKey, axis, leftChannel, 'negative');\n const leftPositiveIds = getAxisDirectionSelectorIds(profileWithSelectedNode, pair.left.nodeKey, axis, leftChannel, 'positive');\n const rightNegativeIds = getAxisDirectionSelectorIds(profileWithSelectedNode, pair.right.nodeKey, axis, rightChannel, 'negative');\n const rightPositiveIds = getAxisDirectionSelectorIds(profileWithSelectedNode, pair.right.nodeKey, axis, rightChannel, 'positive');\n\n const hasBilateralBinding = (auId: number): boolean => (\n !!findRotationBindingForAxisAu(profileWithSelectedNode, pair.left.nodeKey, auId, [leftChannel]) &&\n !!findRotationBindingForAxisAu(profileWithSelectedNode, pair.right.nodeKey, auId, [rightChannel])\n );\n\n const sharedNegativeIds = Array.from(new Set([\n ...leftNegativeIds,\n ...rightNegativeIds,\n ])).filter((auId) => hasBilateralBinding(auId));\n const sharedPositiveIds = Array.from(new Set([\n ...leftPositiveIds,\n ...rightPositiveIds,\n ])).filter((auId) => (\n !sharedNegativeIds.includes(auId) &&\n hasBilateralBinding(auId)\n ));\n\n const leftOnlyNegativeIds = leftNegativeIds.filter((auId) => !sharedNegativeIds.includes(auId));\n const leftOnlyPositiveIds = leftPositiveIds.filter((auId) => !sharedPositiveIds.includes(auId));\n const rightOnlyNegativeIds = rightNegativeIds.filter((auId) => !sharedNegativeIds.includes(auId));\n const rightOnlyPositiveIds = rightPositiveIds.filter((auId) => !sharedPositiveIds.includes(auId));\n\n const leftAxisConfig = getCompositeAxisConfig(profileWithSelectedNode, pair.left.nodeKey, axis);\n const rightAxisConfig = getCompositeAxisConfig(profileWithSelectedNode, pair.right.nodeKey, axis);\n const leftNeutralIds = leftAxisConfig?.aus.filter((auId) => (\n !leftNegativeIds.includes(auId) && !leftPositiveIds.includes(auId)\n )) ?? [];\n const rightNeutralIds = rightAxisConfig?.aus.filter((auId) => (\n !rightNegativeIds.includes(auId) && !rightPositiveIds.includes(auId)\n )) ?? [];\n\n return {\n axis,\n boneNodes: profileWithSelectedNode.boneNodes,\n familyLabel: getBilateralFamilyLabel(pair),\n selectedSide,\n leftBoneName,\n leftNodeKey: pair.left.nodeKey,\n rightBoneName,\n rightNodeKey: pair.right.nodeKey,\n leftChannel,\n rightChannel,\n leftNegativeIds,\n leftPositiveIds,\n rightNegativeIds,\n rightPositiveIds,\n sharedNegativeIds,\n sharedPositiveIds,\n leftOnlyNegativeIds,\n leftOnlyPositiveIds,\n rightOnlyNegativeIds,\n rightOnlyPositiveIds,\n leftNeutralIds,\n rightNeutralIds,\n };\n}\n\nfunction buildBilateralScopeState(\n profile: Profile,\n context: BilateralAxisContext,\n scope: BilateralBoneAxisScope,\n): BilateralAxisScopeBindingState {\n const negativeAuId = scope === 'shared'\n ? context.sharedNegativeIds[0] ?? null\n : scope === 'left'\n ? context.leftOnlyNegativeIds[0] ?? null\n : context.rightOnlyNegativeIds[0] ?? null;\n const positiveAuId = scope === 'shared'\n ? context.sharedPositiveIds[0] ?? null\n : scope === 'left'\n ? context.leftOnlyPositiveIds[0] ?? null\n : context.rightOnlyPositiveIds[0] ?? null;\n const maxDegreesSourceNode = scope === 'right' ? context.rightNodeKey : context.leftNodeKey;\n const maxDegreesSourceChannel = scope === 'right' ? context.rightChannel : context.leftChannel;\n const negativeLeftBinding = scope === 'right'\n ? null\n : findAxisRotationBinding(profile, negativeAuId, context.leftNodeKey, context.leftChannel);\n const negativeRightBinding = scope === 'left'\n ? null\n : findAxisRotationBinding(profile, negativeAuId, context.rightNodeKey, context.rightChannel);\n const positiveLeftBinding = scope === 'right'\n ? null\n : findAxisRotationBinding(profile, positiveAuId, context.leftNodeKey, context.leftChannel);\n const positiveRightBinding = scope === 'left'\n ? null\n : findAxisRotationBinding(profile, positiveAuId, context.rightNodeKey, context.rightChannel);\n\n return {\n scope,\n label: scope === 'shared' ? 'Both' : scope === 'left' ? 'Left only' : 'Right only',\n negativeAuId,\n positiveAuId,\n negativeMaxDegrees: findAxisRotationBinding(profile, negativeAuId, maxDegreesSourceNode, maxDegreesSourceChannel)?.maxDegrees ?? null,\n positiveMaxDegrees: findAxisRotationBinding(profile, positiveAuId, maxDegreesSourceNode, maxDegreesSourceChannel)?.maxDegrees ?? null,\n negativeScale: {\n left: negativeLeftBinding?.scale ?? null,\n right: negativeRightBinding?.scale ?? null,\n },\n positiveScale: {\n left: positiveLeftBinding?.scale ?? null,\n right: positiveRightBinding?.scale ?? null,\n },\n };\n}\n\nfunction resolveSemanticDirectionScale(\n profile: Profile,\n nodeKey: string,\n axis: BoneAxisKey,\n channel: RotationChannel,\n direction: BoneAxisDirection,\n): -1 | 1 {\n const current = findSemanticDirectionalBinding(profile, nodeKey, axis, channel, direction).binding;\n if (current) {\n return current.scale;\n }\n\n const opposite = findSemanticDirectionalBinding(\n profile,\n nodeKey,\n axis,\n channel,\n direction === 'negative' ? 'positive' : 'negative',\n ).binding;\n if (opposite) {\n return opposite.scale === 1 ? -1 : 1;\n }\n\n return direction === 'negative' ? -1 : 1;\n}\n\nexport function resolveBoneAxisChannel(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n): RotationChannel {\n const { nodeKey } = ensureBoneNodeKey(profile, boneName);\n const configuredChannel = getConfiguredCompositeChannel(profile, nodeKey, axis);\n if (configuredChannel) {\n const negativeBinding = findSemanticDirectionalBinding(\n profile,\n nodeKey,\n axis,\n configuredChannel,\n 'negative',\n ).binding;\n if (negativeBinding && isRotationChannel(negativeBinding.channel)) {\n return negativeBinding.channel;\n }\n\n const positiveBinding = findSemanticDirectionalBinding(\n profile,\n nodeKey,\n axis,\n configuredChannel,\n 'positive',\n ).binding;\n if (positiveBinding && isRotationChannel(positiveBinding.channel)) {\n return positiveBinding.channel;\n }\n\n return configuredChannel;\n }\n\n return getContinuumChannel(profile, nodeKey, axis)\n ?? DEFAULT_AXIS_TO_CHANNEL[axis];\n}\n\nexport function getBoneAxisBindingState(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n): BoneAxisBindingState {\n const { nodeKey } = ensureBoneNodeKey(profile, boneName);\n const channel = resolveBoneAxisChannel(profile, boneName, axis);\n const positive = findSemanticDirectionalBinding(profile, nodeKey, axis, channel, 'positive');\n const negative = findSemanticDirectionalBinding(profile, nodeKey, axis, channel, 'negative');\n\n return {\n axis,\n channel,\n nodeKey,\n positiveAuId: positive.auId,\n negativeAuId: negative.auId,\n positiveMaxDegrees: positive.binding?.maxDegrees ?? null,\n negativeMaxDegrees: negative.binding?.maxDegrees ?? null,\n positiveScale: positive.binding?.scale ?? null,\n negativeScale: negative.binding?.scale ?? null,\n };\n}\n\nexport function getBilateralAxisBindingState(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n): BilateralAxisBindingState | null {\n const context = buildBilateralAxisContext(profile, boneName, axis);\n if (!context) {\n return null;\n }\n\n return {\n axis,\n familyLabel: context.familyLabel,\n leftBoneName: context.leftBoneName,\n leftNodeKey: context.leftNodeKey,\n rightBoneName: context.rightBoneName,\n rightNodeKey: context.rightNodeKey,\n selectedSide: context.selectedSide,\n shared: buildBilateralScopeState(profile, context, 'shared'),\n left: buildBilateralScopeState(profile, context, 'left'),\n right: buildBilateralScopeState(profile, context, 'right'),\n };\n}\n\nexport function getAUBoneBindingState(\n profile: Profile,\n auId: number,\n): AUBoneBindingState {\n const rotationBindings = (profile.auToBones?.[auId] ?? []).filter((binding): binding is BoneBinding & { channel: RotationChannel } => (\n isRotationChannel(binding.channel)\n ));\n const primary = rotationBindings[0] ?? null;\n const pairInfo = profile.continuumPairs?.[auId];\n const boneName = primary ? resolveBoneNameForNodeKey(profile, primary.node) ?? profile.boneNodes?.[primary.node] ?? primary.node : null;\n const axis = pairInfo?.axis\n ?? (primary ? getAxisFromChannel(primary.channel) : null)\n ?? 'pitch';\n const axisState = boneName ? getBoneAxisBindingState(profile, boneName, axis) : null;\n const direction: BoneAxisDirection = axisState?.negativeAuId === auId\n ? 'negative'\n : axisState?.positiveAuId === auId\n ? 'positive'\n : pairInfo?.isNegative\n ? 'negative'\n : primary?.scale === -1\n ? 'negative'\n : 'positive';\n\n return {\n auId,\n boneName,\n nodeKey: primary?.node ?? pairInfo?.node ?? null,\n axis,\n direction,\n channel: primary?.channel ?? null,\n maxDegrees: primary?.maxDegrees ?? null,\n oppositeAuId: axisState\n ? direction === 'negative' ? axisState.positiveAuId : axisState.negativeAuId\n : null,\n oppositeMaxDegrees: axisState\n ? direction === 'negative' ? axisState.positiveMaxDegrees : axisState.negativeMaxDegrees\n : null,\n hasBinding: primary != null,\n hasMultipleBindings: rotationBindings.length > 1,\n };\n}\n\nfunction removeAUBoneBinding(profile: Profile, auId: number): Profile {\n const rotationBindings = (profile.auToBones?.[auId] ?? []).filter((binding): binding is BoneBinding & { channel: RotationChannel } => (\n isRotationChannel(binding.channel)\n ));\n if (rotationBindings.length === 0) {\n return profile;\n }\n\n let nextProfile = profile;\n\n rotationBindings.forEach((binding) => {\n const boneName = resolveBoneNameForNodeKey(nextProfile, binding.node) ?? nextProfile.boneNodes?.[binding.node] ?? binding.node;\n const inferredAxis = nextProfile.continuumPairs?.[auId]?.node === binding.node\n ? nextProfile.continuumPairs?.[auId]?.axis\n : getAxisFromChannel(binding.channel);\n if (!boneName || !inferredAxis) return;\n\n const axisState = getBoneAxisBindingState(nextProfile, boneName, inferredAxis);\n\n if (axisState.negativeAuId === auId) {\n nextProfile = applyBoneAxisBindingUpdate(nextProfile, boneName, inferredAxis, {\n negativeAuId: null,\n negativeMaxDegrees: null,\n });\n }\n\n if (axisState.positiveAuId === auId) {\n nextProfile = applyBoneAxisBindingUpdate(nextProfile, boneName, inferredAxis, {\n positiveAuId: null,\n positiveMaxDegrees: null,\n });\n }\n });\n\n return nextProfile;\n}\n\nexport function applyAUBoneBindingUpdate(\n profile: Profile,\n auId: number,\n update: {\n boneName: string | null;\n axis: BoneAxisKey;\n direction: BoneAxisDirection;\n maxDegrees: number | null;\n },\n): Profile {\n const clearedProfile = removeAUBoneBinding(profile, auId);\n if (!update.boneName) {\n return clearedProfile;\n }\n\n return applyBoneAxisBindingUpdate(clearedProfile, update.boneName, update.axis, update.direction === 'negative'\n ? {\n negativeAuId: auId,\n negativeMaxDegrees: update.maxDegrees,\n }\n : {\n positiveAuId: auId,\n positiveMaxDegrees: update.maxDegrees,\n });\n}\n\nfunction buildContinuumLabel(profile: Profile, boneName: string, axis: BoneAxisKey): string {\n return `${formatBoneAutoTitle(profile, boneName)} ${formatAxisLabel(axis)}`;\n}\n\nexport function resolveContinuumDisplayLabel(\n profile: Pick<Profile, 'continuumPairs' | 'continuumLabels' | 'auInfo' | 'boneNodes' | 'bonePrefix' | 'boneSuffix'>,\n negativeAuId: number,\n positiveAuId: number,\n): string {\n const explicitLabel = profile.continuumLabels?.[`${negativeAuId}-${positiveAuId}`]?.trim() || '';\n const pairInfo = profile.continuumPairs?.[negativeAuId];\n const axis = pairInfo?.axis ?? null;\n const nodeKey = pairInfo?.node ?? null;\n const boneName = nodeKey\n ? resolveBoneNameForNodeKey(profile as Profile, nodeKey) ?? profile.boneNodes?.[nodeKey] ?? nodeKey\n : null;\n const autoLabel = axis && boneName\n ? buildContinuumLabel(profile as Profile, boneName, axis)\n : '';\n const derivedLabel = deriveContinuumLabelFromAuNames(\n profile.auInfo?.[String(negativeAuId)]?.name,\n profile.auInfo?.[String(positiveAuId)]?.name,\n axis,\n );\n\n if (explicitLabel && (!autoLabel || explicitLabel !== autoLabel)) {\n return explicitLabel;\n }\n\n return derivedLabel || explicitLabel || autoLabel || `AU ${negativeAuId} <-> AU ${positiveAuId}`;\n}\n\nexport function applyBoneAxisBindingUpdate(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n update: BoneAxisBindingUpdate,\n): Profile {\n const current = getBoneAxisBindingState(profile, boneName, axis);\n const { boneNodes, nodeKey } = ensureBoneNodeKey(profile, boneName);\n const previousChannel = current.channel;\n const channel = update.channel ?? current.channel;\n const existingAxisConfig = getCompositeAxisConfig(profile, nodeKey, axis);\n const existingNegativeSelectorIds = getAxisDirectionSelectorIds(profile, nodeKey, axis, previousChannel, 'negative');\n const existingPositiveSelectorIds = getAxisDirectionSelectorIds(profile, nodeKey, axis, previousChannel, 'positive');\n const existingNeutralSelectorIds = existingAxisConfig?.aus.filter((auId) => (\n !existingNegativeSelectorIds.includes(auId) &&\n !existingPositiveSelectorIds.includes(auId)\n )) ?? [];\n\n const nextPositiveAuId = update.positiveAuId !== undefined\n ? update.positiveAuId\n : current.positiveAuId;\n const nextNegativeAuId = update.negativeAuId !== undefined\n ? update.negativeAuId\n : current.negativeAuId;\n const nextPositiveMaxDegrees = nextPositiveAuId == null\n ? null\n : normalizeDegrees(update.positiveMaxDegrees !== undefined\n ? update.positiveMaxDegrees\n : current.positiveMaxDegrees);\n const nextNegativeMaxDegrees = nextNegativeAuId == null\n ? null\n : normalizeDegrees(update.negativeMaxDegrees !== undefined\n ? update.negativeMaxDegrees\n : current.negativeMaxDegrees);\n\n const nextNegativeSelectorIds = update.negativeAuId !== undefined\n ? (nextNegativeAuId == null ? [] : [nextNegativeAuId])\n : existingNegativeSelectorIds.length > 0\n ? existingNegativeSelectorIds\n : (current.negativeAuId != null ? [current.negativeAuId] : []);\n const nextPositiveSelectorIds = update.positiveAuId !== undefined\n ? (nextPositiveAuId == null ? [] : [nextPositiveAuId])\n : existingPositiveSelectorIds.length > 0\n ? existingPositiveSelectorIds\n : (current.positiveAuId != null ? [current.positiveAuId] : []);\n const normalizedNegativeSelectorIds = Array.from(new Set(\n nextNegativeSelectorIds.filter((auId) => auId !== nextPositiveAuId),\n ));\n const normalizedPositiveSelectorIds = Array.from(new Set(\n nextPositiveSelectorIds.filter((auId) => auId !== nextNegativeAuId),\n ));\n\n const previousPositive = findSemanticDirectionalBinding(profile, nodeKey, axis, previousChannel, 'positive').binding;\n const previousNegative = findSemanticDirectionalBinding(profile, nodeKey, axis, previousChannel, 'negative').binding;\n const resolvedPositiveScale = resolveSemanticDirectionScale(profile, nodeKey, axis, previousChannel, 'positive');\n const resolvedNegativeScale = resolveSemanticDirectionScale(profile, nodeKey, axis, previousChannel, 'negative');\n const nextPositiveScale = nextPositiveAuId == null\n ? null\n : normalizeDirectionScale(\n update.positiveScale !== undefined ? update.positiveScale : current.positiveScale,\n resolvedPositiveScale,\n );\n const nextNegativeScale = nextNegativeAuId == null\n ? null\n : normalizeDirectionScale(\n update.negativeScale !== undefined ? update.negativeScale : current.negativeScale,\n resolvedNegativeScale,\n );\n const nextAuToBones = cloneAuToBones(profile.auToBones ?? {});\n const relevantChannels = Array.from(new Set([previousChannel, channel]));\n const relevantAuIds = Array.from(new Set([\n ...existingNegativeSelectorIds,\n ...existingPositiveSelectorIds,\n ...existingNeutralSelectorIds,\n ...normalizedNegativeSelectorIds,\n ...normalizedPositiveSelectorIds,\n ]));\n const previousBindingsByAuId = new Map<number, BoneBinding | null>(\n relevantAuIds.map((auId) => [\n auId,\n findRotationBindingForAxisAu(profile, nodeKey, auId, relevantChannels),\n ]),\n );\n\n const stripAxisBindings = (auIds: number[]) => {\n for (const auId of auIds) {\n const currentBindings = nextAuToBones[auId];\n if (!currentBindings) continue;\n\n const nextBindings = currentBindings.filter((binding) => !(\n binding.node === nodeKey &&\n isRotationChannel(binding.channel) &&\n relevantChannels.includes(binding.channel)\n ));\n\n if (nextBindings.length > 0) {\n nextAuToBones[auId] = nextBindings;\n } else {\n delete nextAuToBones[auId];\n }\n }\n };\n\n stripAxisBindings(relevantAuIds);\n\n const upsertBinding = (\n auId: number,\n scale: -1 | 1,\n maxDegrees: number,\n previousBinding: BoneBinding | null,\n ) => {\n const nextBinding: BoneBinding = {\n node: nodeKey,\n channel,\n scale,\n maxDegrees,\n };\n\n if (previousBinding?.side) {\n nextBinding.side = previousBinding.side;\n }\n\n nextAuToBones[auId] = [...(nextAuToBones[auId] ?? []), nextBinding];\n };\n\n existingNeutralSelectorIds.forEach((auId) => {\n const previousBinding = previousBindingsByAuId.get(auId);\n if (!previousBinding?.maxDegrees) return;\n upsertBinding(auId, previousBinding.scale, previousBinding.maxDegrees, previousBinding);\n });\n\n normalizedNegativeSelectorIds.forEach((auId) => {\n const previousBinding = previousBindingsByAuId.get(auId);\n const maxDegrees = auId === nextNegativeAuId\n ? nextNegativeMaxDegrees\n : previousBinding?.maxDegrees ?? null;\n if (maxDegrees == null) return;\n const scale = auId === nextNegativeAuId\n ? nextNegativeScale\n : previousBinding?.scale ?? resolvedNegativeScale;\n if (scale == null) return;\n upsertBinding(auId, scale, maxDegrees, previousBinding ?? previousNegative);\n });\n\n normalizedPositiveSelectorIds.forEach((auId) => {\n const previousBinding = previousBindingsByAuId.get(auId);\n const maxDegrees = auId === nextPositiveAuId\n ? nextPositiveMaxDegrees\n : previousBinding?.maxDegrees ?? null;\n if (maxDegrees == null) return;\n const scale = auId === nextPositiveAuId\n ? nextPositiveScale\n : previousBinding?.scale ?? resolvedPositiveScale;\n if (scale == null) return;\n upsertBinding(auId, scale, maxDegrees, previousBinding ?? previousPositive);\n });\n\n const nextCompositeRotations = cloneCompositeRotations(profile.compositeRotations);\n const compositeIndex = nextCompositeRotations.findIndex((entry) => entry.node === nodeKey);\n const nextAxisAus = Array.from(new Set([\n ...existingNeutralSelectorIds,\n ...normalizedNegativeSelectorIds,\n ...normalizedPositiveSelectorIds,\n ]));\n const nextAxisConfig: RotationAxis | null = nextAxisAus.length > 0 ? {\n aus: nextAxisAus,\n axis: channel,\n ...(normalizedNegativeSelectorIds.length > 0 ? { negative: selectorFromArray(normalizedNegativeSelectorIds) } : {}),\n ...(normalizedPositiveSelectorIds.length > 0 ? { positive: selectorFromArray(normalizedPositiveSelectorIds) } : {}),\n } : null;\n\n if (compositeIndex >= 0) {\n const existingComposite = nextCompositeRotations[compositeIndex];\n nextCompositeRotations[compositeIndex] = {\n ...existingComposite,\n [axis]: nextAxisConfig,\n };\n\n const updatedComposite = nextCompositeRotations[compositeIndex];\n if (!updatedComposite.pitch && !updatedComposite.yaw && !updatedComposite.roll) {\n nextCompositeRotations.splice(compositeIndex, 1);\n }\n } else if (nextAxisConfig) {\n nextCompositeRotations.push({\n node: nodeKey,\n pitch: axis === 'pitch' ? nextAxisConfig : null,\n yaw: axis === 'yaw' ? nextAxisConfig : null,\n roll: axis === 'roll' ? nextAxisConfig : null,\n });\n }\n\n const nextContinuumPairs = { ...(profile.continuumPairs ?? {}) };\n const nextContinuumLabels = { ...(profile.continuumLabels ?? {}) };\n const removedLabelKeys = new Set<string>();\n\n for (const [auIdStr, info] of getContinuumPairEntries(profile.continuumPairs)) {\n if (info.node !== nodeKey || info.axis !== axis) {\n continue;\n }\n\n const auId = Number(auIdStr);\n delete nextContinuumPairs[auId];\n removedLabelKeys.add(\n info.isNegative\n ? `${auId}-${info.pairId}`\n : `${info.pairId}-${auId}`,\n );\n }\n\n for (const labelKey of removedLabelKeys) {\n delete nextContinuumLabels[labelKey];\n }\n\n if (\n nextNegativeAuId != null &&\n nextPositiveAuId != null &&\n nextNegativeAuId !== nextPositiveAuId\n ) {\n nextContinuumPairs[nextNegativeAuId] = {\n pairId: nextPositiveAuId,\n isNegative: true,\n axis,\n node: nodeKey,\n };\n nextContinuumPairs[nextPositiveAuId] = {\n pairId: nextNegativeAuId,\n isNegative: false,\n axis,\n node: nodeKey,\n };\n nextContinuumLabels[`${nextNegativeAuId}-${nextPositiveAuId}`] = buildContinuumLabel(profile, boneName, axis);\n }\n\n return {\n ...profile,\n boneNodes,\n auToBones: nextAuToBones,\n compositeRotations: nextCompositeRotations.length > 0 ? nextCompositeRotations : undefined,\n continuumPairs: Object.keys(nextContinuumPairs).length > 0 ? nextContinuumPairs : undefined,\n continuumLabels: Object.keys(nextContinuumLabels).length > 0 ? nextContinuumLabels : undefined,\n };\n}\n\nfunction buildBilateralContinuumLabel(\n familyLabel: string,\n axis: BoneAxisKey,\n scope: BilateralBoneAxisScope,\n): string {\n const axisLabel = formatAxisLabel(axis);\n if (scope === 'shared') {\n return `${familyLabel} ${axisLabel}`;\n }\n return `${scope === 'left' ? 'Left' : 'Right'} ${familyLabel} ${axisLabel}`;\n}\n\nfunction upsertCompositeAxisConfig(\n composites: CompositeRotation[],\n nodeKey: string,\n axis: BoneAxisKey,\n axisConfig: RotationAxis | null,\n): void {\n const compositeIndex = composites.findIndex((entry) => entry.node === nodeKey);\n if (compositeIndex >= 0) {\n const nextComposite = {\n ...composites[compositeIndex],\n [axis]: axisConfig,\n };\n if (!nextComposite.pitch && !nextComposite.yaw && !nextComposite.roll) {\n composites.splice(compositeIndex, 1);\n return;\n }\n composites[compositeIndex] = nextComposite;\n return;\n }\n\n if (!axisConfig) return;\n composites.push({\n node: nodeKey,\n pitch: axis === 'pitch' ? axisConfig : null,\n yaw: axis === 'yaw' ? axisConfig : null,\n roll: axis === 'roll' ? axisConfig : null,\n });\n}\n\nfunction setBilateralScopeDuplicatesToNull(\n desiredScopes: Record<BilateralBoneAxisScope, {\n negativeAuId: number | null;\n positiveAuId: number | null;\n negativeMaxDegrees: number | null;\n positiveMaxDegrees: number | null;\n negativeScale: BilateralAxisDirectionScaleState;\n positiveScale: BilateralAxisDirectionScaleState;\n }>,\n targetScope: BilateralBoneAxisScope,\n direction: BoneAxisDirection,\n auId: number | null,\n): void {\n if (auId == null) return;\n const property = direction === 'negative' ? 'negativeAuId' : 'positiveAuId';\n const maxProperty = direction === 'negative' ? 'negativeMaxDegrees' : 'positiveMaxDegrees';\n\n (['shared', 'left', 'right'] as BilateralBoneAxisScope[]).forEach((scope) => {\n if (scope === targetScope) return;\n if (desiredScopes[scope][property] === auId) {\n desiredScopes[scope][property] = null;\n desiredScopes[scope][maxProperty] = null;\n }\n });\n}\n\nexport function applyBilateralAxisBindingUpdate(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n scope: BilateralBoneAxisScope,\n update: BoneAxisBindingUpdate,\n): Profile {\n const context = buildBilateralAxisContext(profile, boneName, axis);\n if (!context) {\n return profile;\n }\n\n const currentState = getBilateralAxisBindingState(profile, boneName, axis);\n if (!currentState) {\n return profile;\n }\n\n const nextLeftChannel = update.channel ?? context.leftChannel;\n const nextRightChannel = update.channel ?? context.rightChannel;\n const defaultLeftNegativeScale = resolveSemanticDirectionScale(profile, context.leftNodeKey, axis, nextLeftChannel, 'negative');\n const defaultLeftPositiveScale = resolveSemanticDirectionScale(profile, context.leftNodeKey, axis, nextLeftChannel, 'positive');\n const defaultRightNegativeScale = resolveSemanticDirectionScale(profile, context.rightNodeKey, axis, nextRightChannel, 'negative');\n const defaultRightPositiveScale = resolveSemanticDirectionScale(profile, context.rightNodeKey, axis, nextRightChannel, 'positive');\n\n const desiredScopes: Record<BilateralBoneAxisScope, {\n negativeAuId: number | null;\n positiveAuId: number | null;\n negativeMaxDegrees: number | null;\n positiveMaxDegrees: number | null;\n negativeScale: BilateralAxisDirectionScaleState;\n positiveScale: BilateralAxisDirectionScaleState;\n }> = {\n shared: {\n negativeAuId: currentState.shared.negativeAuId,\n positiveAuId: currentState.shared.positiveAuId,\n negativeMaxDegrees: currentState.shared.negativeMaxDegrees,\n positiveMaxDegrees: currentState.shared.positiveMaxDegrees,\n negativeScale: { ...currentState.shared.negativeScale },\n positiveScale: { ...currentState.shared.positiveScale },\n },\n left: {\n negativeAuId: currentState.left.negativeAuId,\n positiveAuId: currentState.left.positiveAuId,\n negativeMaxDegrees: currentState.left.negativeMaxDegrees,\n positiveMaxDegrees: currentState.left.positiveMaxDegrees,\n negativeScale: { ...currentState.left.negativeScale },\n positiveScale: { ...currentState.left.positiveScale },\n },\n right: {\n negativeAuId: currentState.right.negativeAuId,\n positiveAuId: currentState.right.positiveAuId,\n negativeMaxDegrees: currentState.right.negativeMaxDegrees,\n positiveMaxDegrees: currentState.right.positiveMaxDegrees,\n negativeScale: { ...currentState.right.negativeScale },\n positiveScale: { ...currentState.right.positiveScale },\n },\n };\n\n const getScopeDefaultScale = (\n targetScope: BilateralBoneAxisScope,\n direction: BoneAxisDirection,\n side: 'left' | 'right',\n ): BoneAxisDirectionScale => {\n if (direction === 'negative') {\n return side === 'left' ? defaultLeftNegativeScale : defaultRightNegativeScale;\n }\n\n return side === 'left' ? defaultLeftPositiveScale : defaultRightPositiveScale;\n };\n\n const ensureScopeScaleDefaults = (\n targetScope: BilateralBoneAxisScope,\n direction: BoneAxisDirection,\n ) => {\n const scaleState = direction === 'negative'\n ? desiredScopes[targetScope].negativeScale\n : desiredScopes[targetScope].positiveScale;\n\n if (targetScope !== 'right' && scaleState.left == null) {\n scaleState.left = getScopeDefaultScale(targetScope, direction, 'left');\n }\n if (targetScope !== 'left' && scaleState.right == null) {\n scaleState.right = getScopeDefaultScale(targetScope, direction, 'right');\n }\n };\n\n if (update.negativeAuId !== undefined) {\n desiredScopes[scope].negativeAuId = update.negativeAuId;\n desiredScopes[scope].negativeMaxDegrees = update.negativeAuId == null\n ? null\n : normalizeDegrees(update.negativeMaxDegrees ?? desiredScopes[scope].negativeMaxDegrees);\n if (update.negativeAuId != null) {\n ensureScopeScaleDefaults(scope, 'negative');\n }\n if (update.negativeAuId != null && update.negativeAuId === desiredScopes[scope].positiveAuId) {\n desiredScopes[scope].positiveAuId = null;\n desiredScopes[scope].positiveMaxDegrees = null;\n }\n setBilateralScopeDuplicatesToNull(desiredScopes, scope, 'negative', update.negativeAuId);\n } else if (update.negativeMaxDegrees !== undefined && desiredScopes[scope].negativeAuId != null) {\n desiredScopes[scope].negativeMaxDegrees = normalizeDegrees(update.negativeMaxDegrees);\n }\n\n if (update.positiveAuId !== undefined) {\n desiredScopes[scope].positiveAuId = update.positiveAuId;\n desiredScopes[scope].positiveMaxDegrees = update.positiveAuId == null\n ? null\n : normalizeDegrees(update.positiveMaxDegrees ?? desiredScopes[scope].positiveMaxDegrees);\n if (update.positiveAuId != null) {\n ensureScopeScaleDefaults(scope, 'positive');\n }\n if (update.positiveAuId != null && update.positiveAuId === desiredScopes[scope].negativeAuId) {\n desiredScopes[scope].negativeAuId = null;\n desiredScopes[scope].negativeMaxDegrees = null;\n }\n setBilateralScopeDuplicatesToNull(desiredScopes, scope, 'positive', update.positiveAuId);\n } else if (update.positiveMaxDegrees !== undefined && desiredScopes[scope].positiveAuId != null) {\n desiredScopes[scope].positiveMaxDegrees = normalizeDegrees(update.positiveMaxDegrees);\n }\n\n const applyDirectionalScaleUpdate = (\n direction: BoneAxisDirection,\n sharedScale: BoneAxisDirectionScale | null | undefined,\n leftScale: BoneAxisDirectionScale | null | undefined,\n rightScale: BoneAxisDirectionScale | null | undefined,\n ) => {\n if (\n sharedScale === undefined &&\n leftScale === undefined &&\n rightScale === undefined\n ) {\n return;\n }\n\n ensureScopeScaleDefaults(scope, direction);\n const scaleState = direction === 'negative'\n ? desiredScopes[scope].negativeScale\n : desiredScopes[scope].positiveScale;\n\n if (sharedScale !== undefined) {\n if (scope !== 'right') {\n scaleState.left = normalizeDirectionScale(sharedScale, getScopeDefaultScale(scope, direction, 'left'));\n }\n if (scope !== 'left') {\n scaleState.right = normalizeDirectionScale(sharedScale, getScopeDefaultScale(scope, direction, 'right'));\n }\n }\n if (leftScale !== undefined && scope !== 'right') {\n scaleState.left = normalizeDirectionScale(leftScale, getScopeDefaultScale(scope, direction, 'left'));\n }\n if (rightScale !== undefined && scope !== 'left') {\n scaleState.right = normalizeDirectionScale(rightScale, getScopeDefaultScale(scope, direction, 'right'));\n }\n };\n\n applyDirectionalScaleUpdate('negative', update.negativeScale, update.negativeLeftScale, update.negativeRightScale);\n applyDirectionalScaleUpdate('positive', update.positiveScale, update.positiveLeftScale, update.positiveRightScale);\n\n const relevantAuIds = Array.from(new Set([\n ...context.leftNegativeIds,\n ...context.leftPositiveIds,\n ...context.rightNegativeIds,\n ...context.rightPositiveIds,\n ...Object.values(desiredScopes).flatMap((entry) => [\n entry.negativeAuId,\n entry.positiveAuId,\n ]),\n ].filter((value): value is number => value != null)));\n\n const previousBindings = new Map<string, BoneBinding | null>();\n relevantAuIds.forEach((auId) => {\n previousBindings.set(`${auId}:${context.leftNodeKey}`, findAxisRotationBinding(profile, auId, context.leftNodeKey, context.leftChannel));\n previousBindings.set(`${auId}:${context.rightNodeKey}`, findAxisRotationBinding(profile, auId, context.rightNodeKey, context.rightChannel));\n });\n\n const nextAuToBones = cloneAuToBones(profile.auToBones ?? {});\n relevantAuIds.forEach((auId) => {\n const filtered = (nextAuToBones[auId] ?? []).filter((binding) => !(\n (binding.node === context.leftNodeKey && binding.channel === context.leftChannel) ||\n (binding.node === context.rightNodeKey && binding.channel === context.rightChannel)\n ));\n if (filtered.length > 0) {\n nextAuToBones[auId] = filtered;\n } else {\n delete nextAuToBones[auId];\n }\n });\n\n const nextContinuumPairs = { ...(profile.continuumPairs ?? {}) };\n const nextContinuumLabels = { ...(profile.continuumLabels ?? {}) };\n const removedLabelKeys = new Set<string>();\n for (const [auIdStr, info] of getContinuumPairEntries(profile.continuumPairs)) {\n if (\n info.axis !== axis ||\n (info.node !== context.leftNodeKey && info.node !== context.rightNodeKey)\n ) {\n continue;\n }\n\n const auId = Number(auIdStr);\n delete nextContinuumPairs[auId];\n removedLabelKeys.add(info.isNegative ? `${auId}-${info.pairId}` : `${info.pairId}-${auId}`);\n }\n removedLabelKeys.forEach((key) => {\n delete nextContinuumLabels[key];\n });\n\n const leftNegativeSelectorIds = Array.from(new Set([\n ...(desiredScopes.shared.negativeAuId != null ? [desiredScopes.shared.negativeAuId] : []),\n ...(desiredScopes.left.negativeAuId != null ? [desiredScopes.left.negativeAuId] : []),\n ]));\n const leftPositiveSelectorIds = Array.from(new Set([\n ...(desiredScopes.shared.positiveAuId != null ? [desiredScopes.shared.positiveAuId] : []),\n ...(desiredScopes.left.positiveAuId != null ? [desiredScopes.left.positiveAuId] : []),\n ]));\n const rightNegativeSelectorIds = Array.from(new Set([\n ...(desiredScopes.shared.negativeAuId != null ? [desiredScopes.shared.negativeAuId] : []),\n ...(desiredScopes.right.negativeAuId != null ? [desiredScopes.right.negativeAuId] : []),\n ]));\n const rightPositiveSelectorIds = Array.from(new Set([\n ...(desiredScopes.shared.positiveAuId != null ? [desiredScopes.shared.positiveAuId] : []),\n ...(desiredScopes.right.positiveAuId != null ? [desiredScopes.right.positiveAuId] : []),\n ]));\n\n const leftAxisAus = Array.from(new Set([\n ...context.leftNeutralIds,\n ...(desiredScopes.left.negativeAuId != null ? [desiredScopes.left.negativeAuId] : []),\n ...(desiredScopes.left.positiveAuId != null ? [desiredScopes.left.positiveAuId] : []),\n ...(desiredScopes.shared.negativeAuId != null ? [desiredScopes.shared.negativeAuId] : []),\n ...(desiredScopes.shared.positiveAuId != null ? [desiredScopes.shared.positiveAuId] : []),\n ]));\n const rightAxisAus = Array.from(new Set([\n ...context.rightNeutralIds,\n ...(desiredScopes.right.negativeAuId != null ? [desiredScopes.right.negativeAuId] : []),\n ...(desiredScopes.right.positiveAuId != null ? [desiredScopes.right.positiveAuId] : []),\n ...(desiredScopes.shared.negativeAuId != null ? [desiredScopes.shared.negativeAuId] : []),\n ...(desiredScopes.shared.positiveAuId != null ? [desiredScopes.shared.positiveAuId] : []),\n ]));\n\n const nextCompositeRotations = cloneCompositeRotations(profile.compositeRotations);\n upsertCompositeAxisConfig(nextCompositeRotations, context.leftNodeKey, axis, leftAxisAus.length > 0 ? {\n aus: leftAxisAus,\n axis: nextLeftChannel,\n ...(leftNegativeSelectorIds.length > 0 ? { negative: selectorFromArray(leftNegativeSelectorIds) } : {}),\n ...(leftPositiveSelectorIds.length > 0 ? { positive: selectorFromArray(leftPositiveSelectorIds) } : {}),\n } : null);\n upsertCompositeAxisConfig(nextCompositeRotations, context.rightNodeKey, axis, rightAxisAus.length > 0 ? {\n aus: rightAxisAus,\n axis: nextRightChannel,\n ...(rightNegativeSelectorIds.length > 0 ? { negative: selectorFromArray(rightNegativeSelectorIds) } : {}),\n ...(rightPositiveSelectorIds.length > 0 ? { positive: selectorFromArray(rightPositiveSelectorIds) } : {}),\n } : null);\n\n const upsertBinding = (\n auId: number,\n nodeKey: string,\n channel: RotationChannel,\n scale: -1 | 1,\n maxDegrees: number,\n inferredSide: 'left' | 'right',\n ) => {\n const previousBinding = previousBindings.get(`${auId}:${nodeKey}`);\n const nextBinding: BoneBinding = {\n node: nodeKey,\n channel,\n scale,\n maxDegrees,\n ...(previousBinding?.side ? { side: previousBinding.side } : { side: inferredSide }),\n };\n nextAuToBones[auId] = [...(nextAuToBones[auId] ?? []), nextBinding];\n };\n\n if (desiredScopes.shared.negativeAuId != null && desiredScopes.shared.negativeMaxDegrees != null) {\n upsertBinding(\n desiredScopes.shared.negativeAuId,\n context.leftNodeKey,\n nextLeftChannel,\n desiredScopes.shared.negativeScale.left ?? defaultLeftNegativeScale,\n desiredScopes.shared.negativeMaxDegrees,\n 'left',\n );\n upsertBinding(\n desiredScopes.shared.negativeAuId,\n context.rightNodeKey,\n nextRightChannel,\n desiredScopes.shared.negativeScale.right ?? defaultRightNegativeScale,\n desiredScopes.shared.negativeMaxDegrees,\n 'right',\n );\n }\n\n if (desiredScopes.shared.positiveAuId != null && desiredScopes.shared.positiveMaxDegrees != null) {\n upsertBinding(\n desiredScopes.shared.positiveAuId,\n context.leftNodeKey,\n nextLeftChannel,\n desiredScopes.shared.positiveScale.left ?? defaultLeftPositiveScale,\n desiredScopes.shared.positiveMaxDegrees,\n 'left',\n );\n upsertBinding(\n desiredScopes.shared.positiveAuId,\n context.rightNodeKey,\n nextRightChannel,\n desiredScopes.shared.positiveScale.right ?? defaultRightPositiveScale,\n desiredScopes.shared.positiveMaxDegrees,\n 'right',\n );\n }\n\n if (desiredScopes.left.negativeAuId != null && desiredScopes.left.negativeMaxDegrees != null) {\n upsertBinding(\n desiredScopes.left.negativeAuId,\n context.leftNodeKey,\n nextLeftChannel,\n desiredScopes.left.negativeScale.left ?? defaultLeftNegativeScale,\n desiredScopes.left.negativeMaxDegrees,\n 'left',\n );\n }\n if (desiredScopes.left.positiveAuId != null && desiredScopes.left.positiveMaxDegrees != null) {\n upsertBinding(\n desiredScopes.left.positiveAuId,\n context.leftNodeKey,\n nextLeftChannel,\n desiredScopes.left.positiveScale.left ?? defaultLeftPositiveScale,\n desiredScopes.left.positiveMaxDegrees,\n 'left',\n );\n }\n if (desiredScopes.right.negativeAuId != null && desiredScopes.right.negativeMaxDegrees != null) {\n upsertBinding(\n desiredScopes.right.negativeAuId,\n context.rightNodeKey,\n nextRightChannel,\n desiredScopes.right.negativeScale.right ?? defaultRightNegativeScale,\n desiredScopes.right.negativeMaxDegrees,\n 'right',\n );\n }\n if (desiredScopes.right.positiveAuId != null && desiredScopes.right.positiveMaxDegrees != null) {\n upsertBinding(\n desiredScopes.right.positiveAuId,\n context.rightNodeKey,\n nextRightChannel,\n desiredScopes.right.positiveScale.right ?? defaultRightPositiveScale,\n desiredScopes.right.positiveMaxDegrees,\n 'right',\n );\n }\n\n const upsertContinuumPair = (\n pairScope: BilateralBoneAxisScope,\n negativeAuId: number | null,\n positiveAuId: number | null,\n nodeKey: string,\n ) => {\n if (\n negativeAuId == null ||\n positiveAuId == null ||\n negativeAuId === positiveAuId\n ) {\n return;\n }\n\n nextContinuumPairs[negativeAuId] = {\n pairId: positiveAuId,\n isNegative: true,\n axis,\n node: nodeKey,\n };\n nextContinuumPairs[positiveAuId] = {\n pairId: negativeAuId,\n isNegative: false,\n axis,\n node: nodeKey,\n };\n nextContinuumLabels[`${negativeAuId}-${positiveAuId}`] = buildBilateralContinuumLabel(\n context.familyLabel,\n axis,\n pairScope,\n );\n };\n\n upsertContinuumPair('shared', desiredScopes.shared.negativeAuId, desiredScopes.shared.positiveAuId, context.leftNodeKey);\n upsertContinuumPair('left', desiredScopes.left.negativeAuId, desiredScopes.left.positiveAuId, context.leftNodeKey);\n upsertContinuumPair('right', desiredScopes.right.negativeAuId, desiredScopes.right.positiveAuId, context.rightNodeKey);\n\n return {\n ...profile,\n boneNodes: { ...(context.boneNodes ?? {}) },\n auToBones: nextAuToBones,\n compositeRotations: nextCompositeRotations.length > 0 ? nextCompositeRotations : undefined,\n continuumPairs: Object.keys(nextContinuumPairs).length > 0 ? nextContinuumPairs : undefined,\n continuumLabels: Object.keys(nextContinuumLabels).length > 0 ? nextContinuumLabels : undefined,\n };\n}\n\nfunction getNextAvailableAuId(profile: Profile): number {\n const ids = new Set<number>();\n Object.keys(profile.auToBones ?? {}).forEach((auId) => ids.add(Number(auId)));\n Object.keys(profile.auInfo ?? {}).forEach((auId) => ids.add(Number(auId)));\n Object.keys(profile.auToMorphs ?? {}).forEach((auId) => ids.add(Number(auId)));\n getContinuumPairEntries(profile.continuumPairs).forEach(([auId, info]) => {\n ids.add(Number(auId));\n ids.add(Number(info.pairId));\n });\n\n return ids.size > 0 ? Math.max(...ids) + 1 : 1;\n}\n\nfunction guessBoneFaceArea(\n boneName: string,\n nodeKey: string,\n): NonNullable<AUInfo['faceArea']> {\n const label = `${nodeKey} ${boneName}`.toLowerCase();\n\n if (label.includes('jaw') || label.includes('mouth') || label.includes('lip') || label.includes('tongue') || label.includes('chin')) {\n return 'Lower';\n }\n\n return 'Upper';\n}\n\nfunction guessBoneAuMetadata(\n boneName: string,\n nodeKey: string,\n): BoneControlMetadata {\n return {\n faceArea: guessBoneFaceArea(boneName, nodeKey),\n facePart: JOINT_CONTROL_SECTION,\n };\n}\n\nexport function isJointControlAuInfo(\n info: Pick<AUInfo, 'facePart'> | null | undefined,\n): boolean {\n return info?.facePart === JOINT_CONTROL_SECTION;\n}\n\nexport function classifyAuAsJointControl(\n profile: Profile,\n auId: number,\n options: {\n boneName?: string | null;\n nodeKey?: string | null;\n } = {},\n): Profile {\n const key = String(auId);\n const current = profile.auInfo?.[key];\n const boneName = options.boneName ?? current?.name ?? `Control ${auId}`;\n const nodeKey = options.nodeKey ?? findNodeKeyForBone(boneName, profile) ?? sanitizeBoneNodeKey(profile, boneName);\n const faceArea = current?.faceArea ?? guessBoneFaceArea(boneName, nodeKey);\n const autoName = formatBoneAutoTitle(profile, boneName);\n\n return {\n ...profile,\n auInfo: {\n ...(profile.auInfo ?? {}),\n [key]: {\n id: current?.id ?? key,\n name: current?.name ?? autoName,\n ...current,\n faceArea,\n facePart: JOINT_CONTROL_SECTION,\n },\n },\n };\n}\n\nexport function createBoneAxisAu(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n direction: BoneAxisDirection,\n options: {\n name?: string;\n } = {},\n): CreatedBoneAxisAu {\n const { nodeKey } = ensureBoneNodeKey(profile, boneName);\n const auId = getNextAvailableAuId(profile);\n const faceMetadata = guessBoneAuMetadata(boneName, nodeKey);\n const boneLabel = formatBoneAutoTitle(profile, boneName);\n const name = options.name?.trim() || `${boneLabel} ${formatAxisLabel(axis)} ${formatAxisDirectionLabel(axis, direction)}`;\n\n return {\n auId,\n profile: {\n ...profile,\n auInfo: {\n ...(profile.auInfo ?? {}),\n [String(auId)]: {\n id: String(auId),\n name,\n ...faceMetadata,\n },\n },\n },\n };\n}\n\nexport function createBilateralBoneAxisAu(\n profile: Profile,\n boneName: string,\n axis: BoneAxisKey,\n scope: BilateralBoneAxisScope,\n direction: BoneAxisDirection,\n options: {\n name?: string;\n } = {},\n): CreatedBoneAxisAu {\n const context = buildBilateralAxisContext(profile, boneName, axis);\n if (!context) {\n return createBoneAxisAu(profile, boneName, axis, direction, options);\n }\n\n const auId = getNextAvailableAuId(profile);\n const labelRoot = scope === 'shared'\n ? `Both ${context.familyLabel}`\n : scope === 'left'\n ? `Left ${context.familyLabel}`\n : `Right ${context.familyLabel}`;\n const name = options.name?.trim() || `${labelRoot} ${formatAxisLabel(axis)} ${formatAxisDirectionLabel(axis, direction)}`;\n const metadataNodeKey = scope === 'right' ? context.rightNodeKey : context.leftNodeKey;\n const metadataBoneName = scope === 'right' ? context.rightBoneName : context.leftBoneName;\n const faceMetadata = guessBoneAuMetadata(metadataBoneName, metadataNodeKey);\n\n return {\n auId,\n profile: {\n ...profile,\n boneNodes: { ...(context.boneNodes ?? {}) },\n auInfo: {\n ...(profile.auInfo ?? {}),\n [String(auId)]: {\n id: String(auId),\n name,\n ...faceMetadata,\n },\n },\n },\n };\n}\n\nfunction getContinuumOptionLabel(\n profile: Profile,\n auId: number,\n): { label: string; originalName?: string } | null {\n const pairInfo = profile.continuumPairs?.[auId];\n if (!pairInfo) {\n return null;\n }\n\n const negativeAuId = pairInfo.isNegative ? auId : pairInfo.pairId;\n const positiveAuId = pairInfo.isNegative ? pairInfo.pairId : auId;\n const pairLabel = resolveContinuumDisplayLabel(profile, negativeAuId, positiveAuId);\n if (!pairLabel) {\n return null;\n }\n\n const originalName = profile.auInfo?.[String(auId)]?.name?.trim();\n const direction = pairInfo.axis\n ? formatAxisDirectionLabel(pairInfo.axis, pairInfo.isNegative ? 'negative' : 'positive')\n : pairInfo.isNegative\n ? 'Negative'\n : 'Positive';\n\n return {\n label: `${pairLabel} ${direction}`,\n ...(originalName ? { originalName } : {}),\n };\n}\n\nexport function buildBoneAuOptions(profile: Profile): Array<{ value: string; label: string; detail?: string }> {\n const ids = new Set<number>();\n\n Object.keys(profile.auToBones ?? {}).forEach((auId) => ids.add(Number(auId)));\n Object.keys(profile.auInfo ?? {}).forEach((auId) => ids.add(Number(auId)));\n Object.keys(profile.continuumPairs ?? {}).forEach((auId) => ids.add(Number(auId)));\n\n const options: Array<{ value: string; label: string; detail?: string }> = [\n { value: '', label: 'Unassigned' },\n ];\n Array.from(ids)\n .sort((a, b) => a - b)\n .forEach((auId) => {\n const info = profile.auInfo?.[String(auId)];\n const labelPrefix = isJointControlAuInfo(info) ? 'Joint' : 'AU';\n const continuumOption = getContinuumOptionLabel(profile, auId);\n const displayName = continuumOption?.label ?? info?.name ?? '';\n const detailParts = [\n ...(continuumOption?.originalName && continuumOption.originalName !== displayName\n ? [continuumOption.originalName]\n : []),\n ...(isJointControlAuInfo(info)\n ? [JOINT_CONTROL_SECTION]\n : info?.facePart\n ? [info.facePart]\n : []),\n ];\n options.push({\n value: String(auId),\n label: displayName ? `${labelPrefix} ${auId} - ${displayName}` : `${labelPrefix} ${auId}`,\n detail: detailParts.length > 0 ? detailParts.join(' · ') : undefined,\n });\n });\n\n return options;\n}\n\nexport function getAxisFromChannel(channel: string | undefined): BoneAxisKey | null {\n if (!channel || !Object.prototype.hasOwnProperty.call(DEFAULT_CHANNEL_TO_AXIS, channel)) {\n return null;\n }\n\n return DEFAULT_CHANNEL_TO_AXIS[channel as RotationChannel];\n}\n","export interface RegionTreeNode {\n name: string;\n parent?: string;\n children?: string[];\n}\n\nfunction normalizeDisabledNames(disabledNames?: string[]): Set<string> {\n return new Set((disabledNames ?? []).filter((name): name is string => Boolean(name)));\n}\n\nexport function normalizeRegionTree<T extends RegionTreeNode>(\n regions?: T[],\n disabledNames?: string[]\n): T[] | undefined {\n if (!regions) return undefined;\n\n const disabled = normalizeDisabledNames(disabledNames);\n const nextRegions = regions\n .filter((region) => !disabled.has(region.name))\n .map((region) => ({\n ...region,\n children: region.children ? [...region.children] : undefined,\n }));\n\n const remainingNames = new Set(nextRegions.map((region) => region.name));\n\n return nextRegions.map((region) => {\n const nextChildren = region.children?.filter((child) => remainingNames.has(child));\n const nextParent = region.parent && remainingNames.has(region.parent)\n ? region.parent\n : undefined;\n\n return {\n ...region,\n parent: nextParent,\n children: nextChildren && nextChildren.length > 0 ? nextChildren : undefined,\n };\n });\n}\n","import type { Profile } from '../mappings/types';\nimport { extendPresetWithProfile } from '../mappings/extendPresetWithProfile';\nimport { getPreset } from '../presets';\nimport { normalizeRegionTree } from '../regions/normalizeRegionTree';\nimport type { Region } from '../regions/types';\nimport type {\n CharacterConfig,\n CharacterProfile,\n CustomProfileRuntimeConfig,\n PresetBackedProfileRuntimeConfig,\n ProfilePresetId,\n ProfileRuntimeConfig,\n ResolvedProfileRuntimeConfig,\n} from './types';\n\nconst PROFILE_OVERRIDE_KEYS = [\n 'name',\n 'animalType',\n 'emoji',\n 'auToMorphs',\n 'auToBones',\n 'boneNodes',\n 'bonePrefix',\n 'boneSuffix',\n 'morphPrefix',\n 'morphSuffix',\n 'suffixPattern',\n 'leftMorphSuffixes',\n 'rightMorphSuffixes',\n 'morphToMesh',\n 'auFacePartToMeshCategory',\n 'mappingSections',\n 'visemeKeys',\n 'visemeSystemId',\n 'visemeSlots',\n 'visemeBindings',\n 'visemeMeshCategory',\n 'visemeJawAmounts',\n 'auMixDefaults',\n 'auInfo',\n 'eyeMeshNodes',\n 'compositeRotations',\n 'meshes',\n 'continuumPairs',\n 'continuumLabels',\n 'annotationRegions',\n 'disabledRegions',\n 'hairPhysics',\n] as const satisfies readonly (keyof Profile)[];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction cloneArray<T>(value: T[] | undefined): T[] | undefined {\n return value ? value.map((entry) => cloneValue(entry) as T) : undefined;\n}\n\nfunction cloneValue<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneValue(entry)) as T;\n }\n if (isPlainObject(value)) {\n const next: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n next[key] = cloneValue(entry);\n }\n return next as T;\n }\n return value;\n}\n\nfunction mergeProfileOverrideValue<T>(base: T | undefined, override: T | undefined): T | undefined {\n if (override === undefined) {\n return base === undefined ? undefined : cloneValue(base);\n }\n\n if (Array.isArray(override)) {\n return cloneValue(override);\n }\n\n if (isPlainObject(base) && isPlainObject(override)) {\n return {\n ...cloneValue(base),\n ...cloneValue(override),\n } as T;\n }\n\n return cloneValue(override);\n}\n\nfunction cloneVector3(\n value?: { x?: number; y?: number; z?: number }\n): { x?: number; y?: number; z?: number } | undefined {\n return value ? { ...value } : undefined;\n}\n\nfunction cloneRegion(region: Region): Region {\n return {\n ...region,\n bones: cloneArray(region.bones),\n meshes: cloneArray(region.meshes),\n objects: cloneArray(region.objects),\n children: cloneArray(region.children),\n cameraOffset: cloneVector3(region.cameraOffset),\n customPosition: region.customPosition ? { ...region.customPosition } : undefined,\n style: region.style\n ? {\n ...region.style,\n line: region.style.line ? { ...region.style.line } : undefined,\n }\n : undefined,\n };\n}\n\nfunction mergeRegion(base: Region, override: Region): Region {\n return {\n ...base,\n ...override,\n bones: override.bones !== undefined ? [...override.bones] : base.bones ? [...base.bones] : undefined,\n meshes: override.meshes !== undefined ? [...override.meshes] : base.meshes ? [...base.meshes] : undefined,\n objects: override.objects !== undefined ? [...override.objects] : base.objects ? [...base.objects] : undefined,\n children: override.children !== undefined ? [...override.children] : base.children ? [...base.children] : undefined,\n cameraOffset: override.cameraOffset\n ? { ...base.cameraOffset, ...override.cameraOffset }\n : cloneVector3(base.cameraOffset),\n customPosition: override.customPosition\n ? { ...override.customPosition }\n : base.customPosition\n ? { ...base.customPosition }\n : undefined,\n style: override.style\n ? {\n ...base.style,\n ...override.style,\n line: override.style.line\n ? { ...base.style?.line, ...override.style.line }\n : base.style?.line\n ? { ...base.style.line }\n : undefined,\n }\n : base.style\n ? {\n ...base.style,\n line: base.style.line ? { ...base.style.line } : undefined,\n }\n : undefined,\n };\n}\n\nexport function mergeProfileRegionsByName(base?: Region[], override?: Region[]): Region[] | undefined {\n if (!base && !override) return undefined;\n\n const merged = new Map<string, Region>();\n\n for (const region of base ?? []) {\n merged.set(region.name, cloneRegion(region));\n }\n\n for (const region of override ?? []) {\n const existing = merged.get(region.name);\n merged.set(region.name, existing ? mergeRegion(existing, region) : cloneRegion(region));\n }\n\n return Array.from(merged.values());\n}\n\nfunction getAnnotationRegions(value: unknown): Region[] | undefined {\n return Array.isArray(value) ? value as Region[] : undefined;\n}\n\n/**\n * @deprecated Use `mergeProfileRegionsByName`.\n */\nexport const mergeRegionsByName = mergeProfileRegionsByName;\n\nexport function getProfilePresetId(config: ProfileRuntimeConfig): ProfilePresetId | undefined {\n return config.profilePresetId ?? config.presetId ?? config.baseProfileId ?? config.auPresetType;\n}\n\nfunction getLegacyNestedOverrides(config: CharacterProfile): Record<string, unknown> {\n return isPlainObject(config.profile) ? config.profile as Record<string, unknown> : {};\n}\n\nfunction getLegacyRuntimeRegions(config: CharacterProfile): Region[] | undefined {\n return Array.isArray(config.regions) && config.regions.length > 0 ? config.regions : undefined;\n}\n\nfunction getCanonicalAnnotationOverrides(config: CharacterProfile): Region[] | undefined {\n return mergeProfileRegionsByName(\n getAnnotationRegions(getLegacyNestedOverrides(config).annotationRegions),\n getAnnotationRegions((config as unknown as Record<string, unknown>).annotationRegions),\n );\n}\n\nexport function extractLegacyCharacterProfileOverrides(config: CharacterProfile): Partial<Profile> {\n const topLevelConfig = config as unknown as Record<string, unknown>;\n const legacyNestedOverrides = getLegacyNestedOverrides(config);\n const canonicalAnnotationOverrides = getCanonicalAnnotationOverrides(config);\n const legacyRuntimeRegions = getLegacyRuntimeRegions(config);\n const annotationOverrides = canonicalAnnotationOverrides\n ?? (legacyRuntimeRegions ? legacyRuntimeRegions.map((region) => cloneRegion(region)) : undefined);\n const overrides: Partial<Profile> = {};\n\n for (const key of PROFILE_OVERRIDE_KEYS) {\n if (key === 'annotationRegions') {\n if (annotationOverrides) {\n overrides.annotationRegions = annotationOverrides.map((region) => cloneRegion(region));\n }\n continue;\n }\n\n const topLevelValue = topLevelConfig[key];\n const legacyValue = legacyNestedOverrides[key];\n const mergedValue = mergeProfileOverrideValue(legacyValue, topLevelValue);\n if (mergedValue !== undefined) {\n (overrides as Record<string, unknown>)[key] = mergedValue;\n }\n }\n\n return overrides;\n}\n\n/**\n * @deprecated Use `extractLegacyCharacterProfileOverrides`.\n */\nexport function extractProfileOverrides(config: CharacterProfile): Partial<Profile> {\n return extractLegacyCharacterProfileOverrides(config);\n}\n\nexport async function resolveProfileFromPreset(config: CharacterProfile): Promise<Profile | null> {\n const presetType = getProfilePresetId(config);\n if (!presetType) {\n return null;\n }\n\n return extendPresetWithProfile(getPreset(presetType), extractLegacyCharacterProfileOverrides(config));\n}\n\n/**\n * @deprecated Use `resolveProfileFromPreset`.\n */\nexport async function applyCharacterProfileToPreset(config: CharacterProfile): Promise<Profile | null> {\n return resolveProfileFromPreset(config);\n}\n\nfunction orderExtendedRegions(\n extendedRegions: Region[] | undefined,\n prioritizedLists: Array<Region[] | undefined>\n): Region[] | undefined {\n if (!extendedRegions) return undefined;\n\n const extendedByName = new Map(extendedRegions.map((region) => [region.name, region]));\n const orderedNames: string[] = [];\n const seen = new Set<string>();\n\n for (const regions of prioritizedLists) {\n for (const region of regions ?? []) {\n if (seen.has(region.name)) continue;\n seen.add(region.name);\n orderedNames.push(region.name);\n }\n }\n\n for (const region of extendedRegions) {\n if (seen.has(region.name)) continue;\n seen.add(region.name);\n orderedNames.push(region.name);\n }\n\n return orderedNames\n .map((name) => extendedByName.get(name))\n .filter((region): region is Region => Boolean(region));\n}\n\n/**\n * Extend a profile config with its selected base profile preset so callers get\n * one canonical runtime object.\n *\n * Precedence:\n * 1. preset defaults\n * 2. canonical flattened `annotationRegions` / top-level profile overrides\n * 3. legacy nested `config.profile` overrides (compatibility only)\n * 4. legacy `config.regions` fallback only when canonical annotation overrides are absent\n */\nexport function extendProfileConfigWithPreset<T extends CustomProfileRuntimeConfig>(config: T): Promise<T>;\nexport function extendProfileConfigWithPreset<T extends PresetBackedProfileRuntimeConfig>(\n config: T\n): Promise<ResolvedProfileRuntimeConfig<T>>;\nexport function extendProfileConfigWithPreset<T extends CharacterProfile>(\n config: T\n): Promise<T | ResolvedProfileRuntimeConfig<T>>;\nexport async function extendProfileConfigWithPreset<T extends CharacterProfile>(\n config: T\n): Promise<T | ResolvedProfileRuntimeConfig<T>> {\n const presetType = getProfilePresetId(config);\n if (!presetType || presetType === 'custom') {\n return config;\n }\n\n const canonicalAnnotationOverrides = getCanonicalAnnotationOverrides(config);\n const legacyRuntimeRegions = getLegacyRuntimeRegions(config);\n const profileOverrides = extractLegacyCharacterProfileOverrides(config);\n const extendedPresetProfile = await resolveProfileFromPreset(config);\n if (!extendedPresetProfile) {\n return config;\n }\n const presetRegionNames = new Set(\n ((getPreset(presetType).annotationRegions as Region[] | undefined) ?? []).map((region) => region.name)\n );\n const extendedAnnotationRegions = normalizeRegionTree(\n extendedPresetProfile.annotationRegions as Region[] | undefined,\n profileOverrides.disabledRegions,\n );\n const extendedRegionNames = new Set((extendedAnnotationRegions ?? []).map((region) => region.name));\n const legacyExtraRegions = canonicalAnnotationOverrides && legacyRuntimeRegions\n ? legacyRuntimeRegions\n .filter((region) => !presetRegionNames.has(region.name) && !extendedRegionNames.has(region.name))\n .map((region) => cloneRegion(region))\n : undefined;\n const mergedRegions = normalizeRegionTree(\n mergeProfileRegionsByName(extendedAnnotationRegions, legacyExtraRegions),\n profileOverrides.disabledRegions,\n );\n const extendedRegions = orderExtendedRegions(\n mergedRegions,\n canonicalAnnotationOverrides\n ? [extendedAnnotationRegions, legacyExtraRegions]\n : [legacyRuntimeRegions, extendedAnnotationRegions]\n );\n\n return {\n ...config,\n ...extendedPresetProfile,\n annotationRegions: extendedRegions ?? extendedAnnotationRegions,\n regions: extendedRegions ?? config.regions,\n } as ResolvedProfileRuntimeConfig<T>;\n}\n\n/**\n * @deprecated Use `extendProfileConfigWithPreset`.\n */\nexport async function extendCharacterConfigWithPreset(\n config: CharacterConfig\n): Promise<CharacterConfig> {\n return extendProfileConfigWithPreset(config) as Promise<CharacterConfig>;\n}\n","import * as THREE from 'three';\n\nexport type CameraRelativeGazeOffset = { x: number; y: number };\n\nexport interface CameraRelativeGazeOptions {\n yawWeight?: number;\n pitchWeight?: number;\n epsilon?: number;\n}\n\nconst DEFAULT_EPSILON = 1e-4;\nconst DEFAULT_YAW_WEIGHT = 0.35;\nconst DEFAULT_PITCH_WEIGHT = 0.2;\nconst ZERO_OFFSET: CameraRelativeGazeOffset = { x: 0, y: 0 };\n\nfunction clampOffset(value: number): number {\n return THREE.MathUtils.clamp(value, -1, 1);\n}\n\nfunction toModelLocalDirection(\n model: THREE.Object3D,\n worldDirection: THREE.Vector3\n): THREE.Vector3 {\n const localDirection = worldDirection.clone();\n\n model.updateWorldMatrix(true, false);\n const worldQuaternion = new THREE.Quaternion();\n model.getWorldQuaternion(worldQuaternion);\n localDirection.applyQuaternion(worldQuaternion.invert());\n\n return localDirection.normalize();\n}\n\n/**\n * Convert the current camera position into a normalized gaze offset in model-local space.\n * This is intentionally pure so apps can cache or subscribe to camera changes however they want.\n */\nexport function computeCameraRelativeGazeOffset(\n model: THREE.Object3D | null,\n cameraPosition: THREE.Vector3,\n targetPosition: THREE.Vector3,\n options: CameraRelativeGazeOptions = {}\n): CameraRelativeGazeOffset {\n if (!model) {\n return ZERO_OFFSET;\n }\n\n const epsilon = options.epsilon ?? DEFAULT_EPSILON;\n const yawWeight = options.yawWeight ?? DEFAULT_YAW_WEIGHT;\n const pitchWeight = options.pitchWeight ?? DEFAULT_PITCH_WEIGHT;\n\n const worldOffset = new THREE.Vector3().subVectors(cameraPosition, targetPosition);\n if (worldOffset.lengthSq() < epsilon) {\n return ZERO_OFFSET;\n }\n\n const localDirection = toModelLocalDirection(model, worldOffset.normalize());\n const yawAngle = Math.atan2(localDirection.x, localDirection.z);\n const pitchAngle = Math.atan2(\n localDirection.y,\n Math.max(Math.hypot(localDirection.x, localDirection.z), epsilon)\n );\n\n return {\n x: clampOffset(yawAngle / (Math.PI / 2)) * yawWeight,\n y: clampOffset(pitchAngle / (Math.PI / 3)) * pitchWeight,\n };\n}\n","import * as THREE from 'three';\nimport { fuzzyNameMatch, resolveBoneNames } from '../regions/regionMapping';\nimport type { BoneResolutionProfile } from '../regions/regionMapping';\nimport type { Region } from '../regions/types';\n\ntype SemanticSide = 'left' | 'right';\n\nexport interface AnnotationLaterality {\n leftSideX: 1 | -1;\n confidence: number;\n evidence: string[];\n}\n\ntype LateralityRegion = Pick<Region, 'name' | 'cameraAngle' | 'parent'>;\n\nconst DEFAULT_LATERALITY: AnnotationLaterality = {\n leftSideX: -1,\n confidence: 0,\n evidence: ['default:left=-X'],\n};\n\nconst SIDE_TOKEN_PATTERN = /(^|[_\\s-])(left|right)(?=$|[_\\s-])/i;\nconst MIN_LATERAL_SEPARATION = 1e-3;\n\nfunction invertHorizontalSign(sign: 1 | -1): 1 | -1 {\n return sign === 1 ? -1 : 1;\n}\n\nfunction averagePoints(points: THREE.Vector3[]): THREE.Vector3 | null {\n if (points.length === 0) return null;\n\n const center = new THREE.Vector3();\n for (const point of points) {\n center.add(point);\n }\n return center.divideScalar(points.length);\n}\n\nfunction replaceSemanticSideToken(name: string, replacement: SemanticSide): string | null {\n const match = SIDE_TOKEN_PATTERN.exec(name);\n if (!match) return null;\n\n const [fullMatch, prefix] = match;\n const start = match.index;\n const end = start + fullMatch.length;\n return `${name.slice(0, start)}${prefix}${replacement}${name.slice(end)}`;\n}\n\nfunction collectMatchedPoints(\n model: THREE.Object3D,\n targetNames: string[],\n matcher: (obj: THREE.Object3D, targetName: string) => boolean,\n extractor: (obj: THREE.Object3D) => THREE.Vector3 | null\n): THREE.Vector3[] {\n const points: THREE.Vector3[] = [];\n\n for (const targetName of targetNames) {\n model.traverse((obj) => {\n if (!matcher(obj, targetName)) return;\n const point = extractor(obj);\n if (point) {\n points.push(point);\n }\n });\n }\n\n return points;\n}\n\nfunction getRegionWorldCenter(\n model: THREE.Object3D,\n region: Region,\n characterConfig: BoneResolutionProfile | null\n): THREE.Vector3 | null {\n if (region.customPosition) {\n return new THREE.Vector3(\n region.customPosition.x,\n region.customPosition.y,\n region.customPosition.z\n );\n }\n\n if (region.objects?.includes('*')) {\n return null;\n }\n\n const suffixPattern = characterConfig?.suffixPattern;\n const points: THREE.Vector3[] = [];\n\n if (region.bones?.length) {\n const boneNames = resolveBoneNames(region.bones, characterConfig ?? undefined);\n points.push(\n ...collectMatchedPoints(\n model,\n boneNames,\n (obj, targetName) => fuzzyNameMatch(obj.name, targetName, suffixPattern),\n (obj) => {\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n return worldPos;\n }\n )\n );\n }\n\n if (region.meshes?.length) {\n points.push(\n ...collectMatchedPoints(\n model,\n region.meshes,\n (obj, targetName) =>\n (obj as THREE.Mesh).isMesh && fuzzyNameMatch(obj.name, targetName, suffixPattern),\n (obj) => {\n const box = new THREE.Box3().setFromObject(obj);\n if (box.isEmpty()) {\n return null;\n }\n return box.getCenter(new THREE.Vector3());\n }\n )\n );\n }\n\n if (region.objects?.length) {\n const objectTargets = region.objects.filter((target) => target !== '*');\n points.push(\n ...collectMatchedPoints(\n model,\n objectTargets,\n (obj, targetName) => fuzzyNameMatch(obj.name, targetName, suffixPattern),\n (obj) => {\n if ((obj as THREE.Mesh).isMesh) {\n const box = new THREE.Box3().setFromObject(obj);\n if (!box.isEmpty()) {\n return box.getCenter(new THREE.Vector3());\n }\n }\n\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n return worldPos;\n }\n )\n );\n }\n\n return averagePoints(points);\n}\n\nfunction getRegionLocalCenter(\n model: THREE.Object3D,\n region: Region,\n characterConfig: BoneResolutionProfile | null\n): THREE.Vector3 | null {\n const worldCenter = getRegionWorldCenter(model, region, characterConfig);\n return worldCenter ? model.worldToLocal(worldCenter.clone()) : null;\n}\n\nfunction cloneLaterality(value: AnnotationLaterality): AnnotationLaterality {\n return {\n leftSideX: value.leftSideX,\n confidence: value.confidence,\n evidence: [...value.evidence],\n };\n}\n\nexport function getDefaultAnnotationLaterality(): AnnotationLaterality {\n return cloneLaterality(DEFAULT_LATERALITY);\n}\n\nexport function normalizeCameraAngle(angle: number): number {\n return ((angle % 360) + 360) % 360;\n}\n\nexport function getRegionSemanticSide(regionName?: string): SemanticSide | null {\n if (!regionName) return null;\n const match = SIDE_TOKEN_PATTERN.exec(regionName);\n if (!match) return null;\n return match[2].toLowerCase() === 'left' ? 'left' : 'right';\n}\n\nexport function getSemanticHorizontalSign(\n regionName: string,\n laterality: AnnotationLaterality\n): 1 | -1 | null {\n const side = getRegionSemanticSide(regionName);\n if (side === 'left') return laterality.leftSideX;\n if (side === 'right') return invertHorizontalSign(laterality.leftSideX);\n return null;\n}\n\nexport function getSemanticHorizontalSignForSide(\n side: SemanticSide,\n laterality: AnnotationLaterality\n): 1 | -1 {\n return side === 'left' ? laterality.leftSideX : invertHorizontalSign(laterality.leftSideX);\n}\n\nexport function detectAnnotationLaterality(\n model: THREE.Object3D | null,\n regions: Region[],\n characterConfig: BoneResolutionProfile | null\n): AnnotationLaterality {\n if (!model || regions.length === 0) {\n return getDefaultAnnotationLaterality();\n }\n\n model.updateMatrixWorld(true);\n\n const regionsByName = new Map(\n regions.map((region) => [region.name.toLowerCase(), region])\n );\n\n const votes: Array<{ sign: 1 | -1; weight: number; evidence: string }> = [];\n const pairedKeys = new Set<string>();\n\n for (const region of regions) {\n if (getRegionSemanticSide(region.name) !== 'left') continue;\n\n const mirroredName = replaceSemanticSideToken(region.name, 'right');\n if (!mirroredName) continue;\n\n const other = regionsByName.get(mirroredName.toLowerCase());\n if (!other) continue;\n\n const pairKey = [region.name.toLowerCase(), other.name.toLowerCase()].sort().join('|');\n if (pairedKeys.has(pairKey)) continue;\n pairedKeys.add(pairKey);\n\n const leftCenter = getRegionLocalCenter(model, region, characterConfig);\n const rightCenter = getRegionLocalCenter(model, other, characterConfig);\n if (!leftCenter || !rightCenter) continue;\n\n const separation = Math.abs(leftCenter.x - rightCenter.x);\n if (separation < MIN_LATERAL_SEPARATION) continue;\n\n votes.push({\n sign: leftCenter.x > rightCenter.x ? 1 : -1,\n weight: separation,\n evidence: `pair:${region.name}/${other.name}:${leftCenter.x.toFixed(3)}/${rightCenter.x.toFixed(3)}`,\n });\n }\n\n if (votes.length === 0) {\n for (const region of regions) {\n const side = getRegionSemanticSide(region.name);\n if (!side) continue;\n\n const center = getRegionLocalCenter(model, region, characterConfig);\n if (!center || Math.abs(center.x) < MIN_LATERAL_SEPARATION) continue;\n\n const sign = side === 'left'\n ? (center.x > 0 ? 1 : -1)\n : (center.x > 0 ? -1 : 1);\n\n votes.push({\n sign,\n weight: Math.abs(center.x),\n evidence: `single:${region.name}:${center.x.toFixed(3)}`,\n });\n }\n }\n\n if (votes.length === 0) {\n return getDefaultAnnotationLaterality();\n }\n\n let signedWeight = 0;\n let totalWeight = 0;\n for (const vote of votes) {\n signedWeight += vote.sign * vote.weight;\n totalWeight += vote.weight;\n }\n\n if (Math.abs(signedWeight) < MIN_LATERAL_SEPARATION) {\n return getDefaultAnnotationLaterality();\n }\n\n return {\n leftSideX: signedWeight > 0 ? 1 : -1,\n confidence: totalWeight > 0 ? Math.abs(signedWeight) / totalWeight : 0,\n evidence: votes.map((vote) => vote.evidence),\n };\n}\n\nexport function resolveRegionCameraAngle(\n region: LateralityRegion,\n laterality: AnnotationLaterality\n): number | undefined {\n if (region.cameraAngle === undefined) {\n return undefined;\n }\n\n const normalizedAngle = normalizeCameraAngle(region.cameraAngle);\n const side = getRegionSemanticSide(region.name);\n\n if (side && (normalizedAngle === 90 || normalizedAngle === 270)) {\n return side === 'left'\n ? (laterality.leftSideX > 0 ? 90 : 270)\n : (laterality.leftSideX > 0 ? 270 : 90);\n }\n\n return normalizedAngle;\n}\n\nexport function resolveRegionVisibilityCameraAngle(\n region: LateralityRegion,\n laterality: AnnotationLaterality\n): number | undefined {\n const explicitAngle = resolveRegionCameraAngle(region, laterality);\n if (explicitAngle !== undefined) {\n return explicitAngle;\n }\n\n if (!region.parent) {\n return undefined;\n }\n\n const side = getRegionSemanticSide(region.name);\n if (!side) {\n return undefined;\n }\n\n return side === 'left'\n ? (laterality.leftSideX > 0 ? 90 : 270)\n : (laterality.leftSideX > 0 ? 270 : 90);\n}\n\nexport function toWorldDirection(\n model: THREE.Object3D | null,\n localDirection: THREE.Vector3\n): THREE.Vector3 {\n const worldDirection = localDirection.clone();\n\n if (model) {\n model.updateMatrixWorld(true);\n const worldQuaternion = new THREE.Quaternion();\n model.getWorldQuaternion(worldQuaternion);\n worldDirection.applyQuaternion(worldQuaternion);\n }\n\n return worldDirection.normalize();\n}\n\nexport function toModelLocalDirection(\n model: THREE.Object3D | null,\n worldDirection: THREE.Vector3\n): THREE.Vector3 {\n const localDirection = worldDirection.clone();\n\n if (model) {\n model.updateMatrixWorld(true);\n const worldQuaternion = new THREE.Quaternion();\n model.getWorldQuaternion(worldQuaternion);\n localDirection.applyQuaternion(worldQuaternion.invert());\n }\n\n return localDirection.normalize();\n}\n\nexport function getWorldDirectionForCameraAngle(\n model: THREE.Object3D | null,\n cameraAngle: number\n): THREE.Vector3 {\n const angleRad = (normalizeCameraAngle(cameraAngle) * Math.PI) / 180;\n return toWorldDirection(\n model,\n new THREE.Vector3(Math.sin(angleRad), 0, Math.cos(angleRad))\n );\n}\n\nexport function getModelLocalOrbitAngle(\n model: THREE.Object3D | null,\n modelCenter: THREE.Vector3,\n worldPosition: THREE.Vector3\n): number {\n const worldOffset = new THREE.Vector3().subVectors(worldPosition, modelCenter);\n const localOffset = toModelLocalDirection(model, worldOffset);\n return normalizeCameraAngle(Math.atan2(localOffset.x, localOffset.z) * (180 / Math.PI));\n}\n\nexport function passesMarkerCameraAngleGate(params: {\n markerAngle?: number;\n currentCameraAngle?: number;\n rangeDegrees?: number;\n}): boolean {\n const { markerAngle, currentCameraAngle, rangeDegrees = 90 } = params;\n if (markerAngle === undefined || markerAngle === 0 || currentCameraAngle === undefined) {\n return true;\n }\n\n let diff = Math.abs(currentCameraAngle - markerAngle);\n if (diff > 180) diff = 360 - diff;\n return diff <= rangeDegrees;\n}\n","/**\n * Typed wrapper around the Rust/Wasm DPthree annotation camera + marker core.\n *\n * The Rust side owns the pure math (region framing, camera flight/orbit\n * animation, marker visibility gating, viewport line clipping, leader-line\n * curve sampling, and show/hide animation curves). Hosts keep scene-graph\n * work (bounding boxes, OrbitControls, meshes/materials/DOM) and feed packed\n * floats through this wrapper.\n */\nimport { initEmbodyCore } from '../wasm';\nimport type {\n EmbodyCoreWasmModule,\n WasmCameraFlightHandle,\n WasmCameraOrbitHandle,\n} from '../wasmTypes';\n\nexport interface Vec3Like {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface QuatLike {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\nexport interface BoundsLike {\n center: Vec3Like;\n size: Vec3Like;\n}\n\nexport interface CameraFramingResult {\n position: Vec3Like;\n target: Vec3Like;\n distance: number;\n}\n\nexport interface CameraPoseSample extends Omit<CameraFramingResult, 'distance'> {\n done: boolean;\n}\n\nexport interface FocusFramingOptions {\n focusBounds: BoundsLike;\n modelBounds?: BoundsLike | null;\n modelQuaternion?: QuatLike | null;\n fovDegrees: number;\n aspect: number;\n minDistance: number;\n closeUpPaddingFactor: number;\n zoomPaddingFactor: number;\n fullBodyPaddingFactor: number;\n overridePadding?: number;\n cameraAngle?: number;\n angleSpace?: 'model' | 'world';\n}\n\nexport interface FullBodyFramingOptions {\n boxMin: Vec3Like;\n boxMax: Vec3Like;\n modelQuaternion?: QuatLike | null;\n fovDegrees: number;\n aspect: number;\n minDistance: number;\n fullBodyPaddingFactor: number;\n overridePadding?: number;\n cameraAngle?: number;\n angleSpace?: 'model' | 'world';\n}\n\nexport type MarkerSoloState = 'none' | 'soloed' | 'other-soloed';\n\nexport interface MarkerVisibilityAnimationFactors {\n itemOpacityFactor: number;\n labelScaleFactor: number;\n lineOpacityFactor: number;\n}\n\nexport interface MarkerEndpointSeparationOptions {\n /** Packed marker surface anchors as `[x, y, z, ...]`. */\n starts: ArrayLike<number>;\n /** Packed marker leader-line ends as `[x, y, z, ...]`. */\n ends: ArrayLike<number>;\n modelCenter: Vec3Like;\n modelHeight: number;\n}\n\nfunction packVec3(value: Vec3Like): Float32Array {\n return new Float32Array([value.x, value.y, value.z]);\n}\n\nfunction packBounds(bounds: BoundsLike | null | undefined): Float32Array {\n if (!bounds) return new Float32Array(0);\n return new Float32Array([\n bounds.center.x,\n bounds.center.y,\n bounds.center.z,\n bounds.size.x,\n bounds.size.y,\n bounds.size.z,\n ]);\n}\n\nfunction packQuat(quat: QuatLike | null | undefined): Float32Array {\n if (!quat) return new Float32Array(0);\n return new Float32Array([quat.x, quat.y, quat.z, quat.w]);\n}\n\nfunction unpackFraming(values: Float32Array): CameraFramingResult {\n return {\n position: { x: values[0], y: values[1], z: values[2] },\n target: { x: values[3], y: values[4], z: values[5] },\n distance: values[6],\n };\n}\n\nfunction unpackPoseSample(values: Float32Array): CameraPoseSample {\n return {\n position: { x: values[0], y: values[1], z: values[2] },\n target: { x: values[3], y: values[4], z: values[5] },\n done: values[6] >= 1,\n };\n}\n\nfunction soloStateToCode(state: MarkerSoloState): number {\n if (state === 'soloed') return 1;\n if (state === 'other-soloed') return 2;\n return 0;\n}\n\nexport class RustCameraFlight {\n private handle: WasmCameraFlightHandle;\n\n constructor(handle: WasmCameraFlightHandle) {\n this.handle = handle;\n }\n\n sample(elapsedMs: number): CameraPoseSample {\n return unpackPoseSample(this.handle.sample(elapsedMs));\n }\n\n get durationMs(): number {\n return this.handle.duration_ms();\n }\n\n dispose(): void {\n this.handle.free?.();\n }\n}\n\nexport class RustCameraOrbit {\n private handle: WasmCameraOrbitHandle;\n\n constructor(handle: WasmCameraOrbitHandle) {\n this.handle = handle;\n }\n\n sample(elapsedMs: number): CameraPoseSample {\n return unpackPoseSample(this.handle.sample(elapsedMs));\n }\n\n get durationMs(): number {\n return this.handle.duration_ms();\n }\n\n dispose(): void {\n this.handle.free?.();\n }\n}\n\nexport class RustAnnotationCameraCore {\n private core: EmbodyCoreWasmModule;\n\n private constructor(core: EmbodyCoreWasmModule) {\n this.core = core;\n }\n\n static async create(): Promise<RustAnnotationCameraCore> {\n return new RustAnnotationCameraCore(await initEmbodyCore());\n }\n\n // ====== CAMERA MATH ======\n\n normalizeCameraAngle(angle: number): number {\n return this.core.normalize_camera_angle_degrees(angle);\n }\n\n worldDirectionForCameraAngle(modelQuaternion: QuatLike | null, cameraAngle: number): Vec3Like {\n const values = this.core.world_direction_for_camera_angle(packQuat(modelQuaternion), cameraAngle);\n return { x: values[0], y: values[1], z: values[2] };\n }\n\n resolveFocusCameraDirection(\n modelQuaternion: QuatLike | null,\n effectiveAngle: number,\n cameraAngle: number | undefined,\n angleSpace: 'model' | 'world' = 'model',\n ): Vec3Like {\n const values = this.core.resolve_focus_camera_direction(\n packQuat(modelQuaternion),\n effectiveAngle,\n cameraAngle !== undefined,\n angleSpace === 'world',\n );\n return { x: values[0], y: values[1], z: values[2] };\n }\n\n resolveAutoCloseupAngle(\n horizontalOffset: number,\n focusSize: Vec3Like,\n modelSize: Vec3Like,\n ): number | undefined {\n return this.core.resolve_auto_closeup_angle(\n horizontalOffset,\n packVec3(focusSize),\n packVec3(modelSize),\n );\n }\n\n focusPaddingFactor(\n size: number,\n closeUpPaddingFactor: number,\n zoomPaddingFactor: number,\n fullBodyPaddingFactor: number,\n ): number {\n return this.core.focus_padding_factor(\n size,\n closeUpPaddingFactor,\n zoomPaddingFactor,\n fullBodyPaddingFactor,\n );\n }\n\n solveFocusFraming(options: FocusFramingOptions): CameraFramingResult {\n return unpackFraming(this.core.solve_focus_framing(\n packBounds(options.focusBounds),\n packBounds(options.modelBounds),\n packQuat(options.modelQuaternion),\n options.fovDegrees,\n options.aspect,\n options.minDistance,\n options.closeUpPaddingFactor,\n options.zoomPaddingFactor,\n options.fullBodyPaddingFactor,\n options.overridePadding,\n options.cameraAngle,\n options.angleSpace === 'world',\n ));\n }\n\n solveFullBodyFraming(options: FullBodyFramingOptions): CameraFramingResult {\n return unpackFraming(this.core.solve_full_body_framing(\n packVec3(options.boxMin),\n packVec3(options.boxMax),\n packQuat(options.modelQuaternion),\n options.fovDegrees,\n options.aspect,\n options.minDistance,\n options.fullBodyPaddingFactor,\n options.overridePadding,\n options.cameraAngle,\n options.angleSpace === 'world',\n ));\n }\n\n // ====== CAMERA ANIMATION ======\n\n createCameraFlight(\n startPosition: Vec3Like,\n startTarget: Vec3Like,\n endPosition: Vec3Like,\n endTarget: Vec3Like,\n durationMs: number,\n ): RustCameraFlight {\n return new RustCameraFlight(new this.core.CameraFlight(\n packVec3(startPosition),\n packVec3(startTarget),\n packVec3(endPosition),\n packVec3(endTarget),\n durationMs,\n ));\n }\n\n createCameraOrbit(\n center: Vec3Like,\n radius: number,\n height: number,\n durationMs: number,\n ): RustCameraOrbit {\n return new RustCameraOrbit(new this.core.CameraOrbit(\n packVec3(center),\n radius,\n height,\n durationMs,\n ));\n }\n\n // ====== MARKERS ======\n\n passesMarkerCameraAngleGate(params: {\n markerAngle?: number;\n currentCameraAngle?: number;\n rangeDegrees?: number;\n }): boolean {\n return this.core.passes_marker_camera_angle_gate(\n params.markerAngle,\n params.currentCameraAngle,\n params.rangeDegrees,\n );\n }\n\n shouldShowMarker(params: {\n hiddenChild: boolean;\n solo: MarkerSoloState;\n markerAngle?: number;\n currentCameraAngle?: number;\n }): boolean {\n return this.core.should_show_marker(\n params.hiddenChild,\n soloStateToCode(params.solo),\n params.markerAngle,\n params.currentCameraAngle,\n );\n }\n\n resolveViewportConstrainedLineScale(params: {\n startClip: readonly number[];\n endClip: readonly number[];\n safeX: number;\n safeY: number;\n minLengthRatio?: number;\n }): { visible: boolean; lineScale: number } {\n const result = this.core.resolve_viewport_constrained_line_scale(\n new Float32Array(params.startClip),\n new Float32Array(params.endClip),\n params.safeX,\n params.safeY,\n params.minLengthRatio,\n );\n return { visible: result[0] >= 1, lineScale: result[1] };\n }\n\n resolveViewportSafeBounds(params: {\n labelScaleX: number;\n labelScaleY: number;\n projectionXScale: number;\n projectionYScale: number;\n viewportWidth: number;\n viewportHeight: number;\n edgePaddingPx?: number;\n }): { safeX: number; safeY: number } {\n const result = this.core.resolve_viewport_safe_bounds(\n params.labelScaleX,\n params.labelScaleY,\n params.projectionXScale,\n params.projectionYScale,\n params.viewportWidth,\n params.viewportHeight,\n params.edgePaddingPx,\n );\n return { safeX: result[0], safeY: result[1] };\n }\n\n /** Returns `(segments + 1)` points as a flat `[x, y, z, ...]` array. */\n sampleMarkerBezierCurve(start: Vec3Like, end: Vec3Like, segments = 16): Float32Array {\n return this.core.sample_marker_bezier_curve(packVec3(start), packVec3(end), segments);\n }\n\n /** Returns `(segments + 1)` points as a flat `[x, y, z, ...]` array. */\n sampleMarkerArcCurve(start: Vec3Like, end: Vec3Like, segments = 16): Float32Array {\n return this.core.sample_marker_arc_curve(packVec3(start), packVec3(end), segments);\n }\n\n markerVisibilityAnimationFactors(visible: boolean, t: number): MarkerVisibilityAnimationFactors {\n const values = this.core.marker_visibility_animation_factors(visible, t);\n return {\n itemOpacityFactor: values[0],\n labelScaleFactor: values[1],\n lineOpacityFactor: values[2],\n };\n }\n\n /**\n * Separates overlapping leader-line endpoints while retaining marker anchors\n * and leader-line lengths. Returns packed `[x, y, z, ...]` endpoints.\n */\n separateOverlappingMarkerEndpoints(options: MarkerEndpointSeparationOptions): Float32Array {\n return this.core.separate_overlapping_marker_endpoints(\n new Float32Array(options.starts),\n new Float32Array(options.ends),\n packVec3(options.modelCenter),\n options.modelHeight,\n );\n }\n}\n\nexport async function createRustAnnotationCameraCore(): Promise<RustAnnotationCameraCore> {\n return RustAnnotationCameraCore.create();\n}\n","/**\n * HairPhysics - Spring-damper pendulum simulation for hair movement\n *\n * This is a pure physics simulation class with no Three.js dependencies.\n * It outputs normalized morph values (0-1) that can be applied to hair meshes\n * via EngineThree.setMorph() or transitionMorph().\n *\n * Physics model:\n * - Hair is modeled as a damped pendulum affected by:\n * - Gravity (constant downward force based on head orientation)\n * - Head velocity (inertia causes hair to lag behind head movement)\n * - Wind (oscillating force with turbulence)\n * - Spring restoration (hair returns to rest position)\n * - Damping (air resistance)\n */\n\nexport interface HairPhysicsConfig {\n // Spring-damper parameters\n mass: number; // Hair mass (affects inertia), default 1.0\n stiffness: number; // Spring stiffness (restoration force), default 15\n damping: number; // Damping coefficient (air resistance), default 0.8\n\n // Gravity\n gravity: number; // Gravity strength, default 9.8\n\n // Head influence\n headInfluence: number; // How much head movement affects hair (0-1), default 0.5\n\n // Wind simulation\n windEnabled: boolean;\n windStrength: number; // Wind force magnitude, default 0\n windDirectionX: number; // Wind direction X component (-1 to 1), default 1\n windDirectionZ: number; // Wind direction Z component (-1 to 1), default 0\n windTurbulence: number; // Random variation in wind, default 0.2\n windFrequency: number; // Oscillation frequency in Hz, default 0.5\n}\n\nexport interface HairPhysicsState {\n // Current pendulum position (normalized -1 to 1)\n x: number; // Left/right swing\n z: number; // Front/back swing\n\n // Current velocity\n vx: number;\n vz: number;\n}\n\nexport interface HairMorphOutput {\n // Left side morphs (0-1)\n L_Hair_Left: number;\n L_Hair_Right: number;\n L_Hair_Front: number;\n\n // Right side morphs (0-1)\n R_Hair_Left: number;\n R_Hair_Right: number;\n R_Hair_Front: number;\n}\n\nexport interface HeadState {\n // Head rotation in radians\n yaw: number; // Left/right rotation\n pitch: number; // Up/down rotation\n roll: number; // Tilt\n\n // Head angular velocity (radians/sec) - for inertia\n yawVelocity: number;\n pitchVelocity: number;\n}\n\nexport const DEFAULT_HAIR_PHYSICS_CONFIG: HairPhysicsConfig = {\n mass: 1.0,\n stiffness: 15,\n damping: 0.8,\n gravity: 9.8,\n headInfluence: 0.5,\n windEnabled: false,\n windStrength: 0,\n windDirectionX: 1,\n windDirectionZ: 0,\n windTurbulence: 0.2,\n windFrequency: 0.5,\n};\n\nexport class HairPhysics {\n private config: HairPhysicsConfig;\n private state: HairPhysicsState;\n private time: number = 0;\n\n // Previous head state for velocity calculation\n private prevHeadYaw: number = 0;\n private prevHeadPitch: number = 0;\n\n constructor(config: Partial<HairPhysicsConfig> = {}) {\n this.config = { ...DEFAULT_HAIR_PHYSICS_CONFIG, ...config };\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n }\n\n /**\n * Update physics simulation\n * @param dt Delta time in seconds\n * @param headState Current head orientation and velocity\n * @returns Morph values to apply to hair meshes\n */\n update(dt: number, headState: HeadState): HairMorphOutput {\n if (dt <= 0 || dt > 0.1) {\n // Skip bad delta times (prevent explosion on tab switch)\n return this.computeMorphOutput();\n }\n\n this.time += dt;\n\n const { mass, stiffness, damping, gravity, headInfluence, windEnabled } = this.config;\n\n // Calculate head angular velocity if not provided\n const headYawVel = headState.yawVelocity !== 0\n ? headState.yawVelocity\n : (headState.yaw - this.prevHeadYaw) / dt;\n const headPitchVel = headState.pitchVelocity !== 0\n ? headState.pitchVelocity\n : (headState.pitch - this.prevHeadPitch) / dt;\n\n this.prevHeadYaw = headState.yaw;\n this.prevHeadPitch = headState.pitch;\n\n // === Forces ===\n\n // 1. Spring restoration force (pulls hair back to center)\n const springFx = -stiffness * this.state.x;\n const springFz = -stiffness * this.state.z;\n\n // 2. Damping force (air resistance)\n const dampFx = -damping * this.state.vx;\n const dampFz = -damping * this.state.vz;\n\n // 3. Gravity effect based on head pitch\n // When head tilts forward (positive pitch), hair swings forward\n // When head tilts back, hair swings back\n const gravityFz = gravity * Math.sin(headState.pitch) * 0.1;\n\n // 4. Head rotation inertia (hair lags behind head movement)\n // When head turns right (positive yaw velocity), hair swings left relative to head\n const inertiaFx = -headYawVel * headInfluence * mass * 2;\n const inertiaFz = -headPitchVel * headInfluence * mass * 2;\n\n // 5. Wind force\n let windFx = 0;\n let windFz = 0;\n if (windEnabled && this.config.windStrength > 0) {\n const { windStrength, windDirectionX, windDirectionZ, windTurbulence, windFrequency } = this.config;\n\n // Base oscillating wind\n const windPhase = this.time * windFrequency * Math.PI * 2;\n const windOscillation = Math.sin(windPhase);\n\n // Add turbulence (perpendicular to wind direction)\n const turbulencePhase = this.time * windFrequency * 3.7; // Different frequency for variation\n const turbulence = Math.sin(turbulencePhase) * windTurbulence;\n\n windFx = windStrength * windDirectionX * (0.5 + 0.5 * windOscillation) + turbulence * (-windDirectionZ);\n windFz = windStrength * windDirectionZ * (0.5 + 0.5 * windOscillation) + turbulence * windDirectionX;\n }\n\n // === Integration (Semi-implicit Euler) ===\n\n const totalFx = springFx + dampFx + inertiaFx + windFx;\n const totalFz = springFz + dampFz + gravityFz + inertiaFz + windFz;\n\n // Acceleration = Force / Mass\n const ax = totalFx / mass;\n const az = totalFz / mass;\n\n // Update velocity\n this.state.vx += ax * dt;\n this.state.vz += az * dt;\n\n // Clamp velocity to prevent instability\n const maxVel = 10;\n this.state.vx = Math.max(-maxVel, Math.min(maxVel, this.state.vx));\n this.state.vz = Math.max(-maxVel, Math.min(maxVel, this.state.vz));\n\n // Update position\n this.state.x += this.state.vx * dt;\n this.state.z += this.state.vz * dt;\n\n // Clamp position to valid range\n this.state.x = Math.max(-1, Math.min(1, this.state.x));\n this.state.z = Math.max(-1, Math.min(1, this.state.z));\n\n return this.computeMorphOutput();\n }\n\n /**\n * Convert physics state to morph target values\n * Maps pendulum position to left/right/front morphs for both sides\n */\n private computeMorphOutput(): HairMorphOutput {\n const { x, z } = this.state;\n\n // X axis: negative = swing left, positive = swing right\n // Z axis: negative = swing back, positive = swing forward\n\n // Left side of hair\n // When hair swings left (x < 0), L_Hair_Left increases\n // When hair swings right (x > 0), L_Hair_Right increases\n const L_Hair_Left = Math.max(0, -x);\n const L_Hair_Right = Math.max(0, x);\n const L_Hair_Front = Math.max(0, z);\n\n // Right side mirrors left side behavior\n // When hair swings left (x < 0), R_Hair_Left increases\n // When hair swings right (x > 0), R_Hair_Right increases\n const R_Hair_Left = Math.max(0, -x);\n const R_Hair_Right = Math.max(0, x);\n const R_Hair_Front = Math.max(0, z);\n\n return {\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 };\n }\n\n /**\n * Get current physics state (for debugging/UI)\n */\n getState(): HairPhysicsState {\n return { ...this.state };\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<HairPhysicsConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HairPhysicsConfig {\n return { ...this.config };\n }\n\n /**\n * Reset physics state to rest position\n */\n reset(): void {\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n this.time = 0;\n this.prevHeadYaw = 0;\n this.prevHeadPitch = 0;\n }\n}\n","import type { HairMorphOutput, HairPhysicsConfig, HairPhysicsState, HeadState } from './HairPhysics';\nimport {\n DEFAULT_HAIR_PHYSICS_CONFIG,\n} from './HairPhysics';\nimport {\n HAIR_CONFIG_STRIDE,\n HAIR_HEAD_STATE_STRIDE,\n HAIR_MORPH_OUTPUT_FIELDS,\n HAIR_MORPH_OUTPUT_STRIDE,\n HAIR_STATE_STRIDE,\n initEmbodyCore,\n} from '../wasm';\nimport type { WasmHairPhysicsSolver } from '../wasmTypes';\n\nexport class RustHairPhysics {\n private solver: WasmHairPhysicsSolver;\n\n private constructor(solver: WasmHairPhysicsSolver) {\n this.solver = solver;\n }\n\n static async create(config: Partial<HairPhysicsConfig> = {}): Promise<RustHairPhysics> {\n const core = await initEmbodyCore();\n return new RustHairPhysics(new core.HairPhysicsSolver(packHairConfig(config)));\n }\n\n update(dt: number, headState: HeadState): HairMorphOutput {\n return unpackHairMorphOutput(this.solver.update(dt, packHeadState(headState)));\n }\n\n getState(): HairPhysicsState {\n return unpackHairState(this.solver.get_state());\n }\n\n setConfig(config: Partial<HairPhysicsConfig>): void {\n this.solver.set_config(packHairConfig({ ...this.getConfig(), ...config }));\n }\n\n getConfig(): HairPhysicsConfig {\n return unpackHairConfig(this.solver.get_config());\n }\n\n reset(): void {\n this.solver.reset();\n }\n\n dispose(): void {\n this.solver.free?.();\n }\n}\n\nexport async function createRustHairPhysics(config: Partial<HairPhysicsConfig> = {}): Promise<RustHairPhysics> {\n return RustHairPhysics.create(config);\n}\n\nexport function packHairConfig(config: Partial<HairPhysicsConfig> = {}): Float32Array {\n const merged = { ...DEFAULT_HAIR_PHYSICS_CONFIG, ...config };\n const values = new Float32Array(HAIR_CONFIG_STRIDE);\n values[0] = merged.mass;\n values[1] = merged.stiffness;\n values[2] = merged.damping;\n values[3] = merged.gravity;\n values[4] = merged.headInfluence;\n values[5] = merged.windEnabled ? 1 : 0;\n values[6] = merged.windStrength;\n values[7] = merged.windDirectionX;\n values[8] = merged.windDirectionZ;\n values[9] = merged.windTurbulence;\n values[10] = merged.windFrequency;\n return values;\n}\n\nexport function packHeadState(headState: HeadState): Float32Array {\n const values = new Float32Array(HAIR_HEAD_STATE_STRIDE);\n values[0] = headState.yaw;\n values[1] = headState.pitch;\n values[2] = headState.roll;\n values[3] = headState.yawVelocity;\n values[4] = headState.pitchVelocity;\n return values;\n}\n\nexport function unpackHairConfig(values: ArrayLike<number>): HairPhysicsConfig {\n assertStride(values, HAIR_CONFIG_STRIDE, 'hair config');\n return {\n mass: values[0],\n stiffness: values[1],\n damping: values[2],\n gravity: values[3],\n headInfluence: values[4],\n windEnabled: values[5] >= 0.5,\n windStrength: values[6],\n windDirectionX: values[7],\n windDirectionZ: values[8],\n windTurbulence: values[9],\n windFrequency: values[10],\n };\n}\n\nexport function unpackHairState(values: ArrayLike<number>): HairPhysicsState {\n assertStride(values, HAIR_STATE_STRIDE, 'hair state');\n return {\n x: values[0],\n z: values[1],\n vx: values[2],\n vz: values[3],\n };\n}\n\nexport function unpackHairMorphOutput(values: ArrayLike<number>): HairMorphOutput {\n assertStride(values, HAIR_MORPH_OUTPUT_STRIDE, 'hair morph output');\n return HAIR_MORPH_OUTPUT_FIELDS.reduce((output, key, index) => {\n output[key] = values[index];\n return output;\n }, {} as HairMorphOutput);\n}\n\nfunction assertStride(values: ArrayLike<number>, expected: number, label: string): void {\n if (values.length < expected) {\n throw new Error(`Invalid ${label} buffer length ${values.length}; expected at least ${expected}.`);\n }\n}\n","/**\n * Embody - Mapping Corrections\n *\n * Attempts to generate a corrected mapping configuration using fuzzy matching.\n * This is a best-effort helper that can be layered on top of validation.\n */\n\nimport type { Profile, MorphTargetsBySide, MorphTargetRef } from '../mappings/types';\nimport type { ValidationMorphMesh as MorphMesh, ValidationSkeleton as Skeleton } from './types';\n\nexport interface MappingCorrection {\n type: 'bone' | 'morph' | 'viseme' | 'mesh';\n source: string;\n target: string;\n confidence: number;\n reason: string;\n applied: boolean;\n auId?: number;\n key?: string;\n}\n\nexport interface MappingCorrectionResult {\n correctedConfig: Profile;\n corrections: MappingCorrection[];\n unresolved: MappingCorrection[];\n}\n\nexport interface MappingCorrectionOptions {\n minConfidence?: number;\n /**\n * When true, normalize names to resolved full names and clear prefix/suffix.\n * This is useful when target names don't follow the prefix/suffix pattern.\n */\n useResolvedNames?: boolean;\n}\n\nconst DEFAULT_MIN_CONFIDENCE = 0.6;\n\nfunction normalizeLooseName(value: string): string {\n return value.replace(/\\./g, '');\n}\n\nfunction levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n const aLen = a.length;\n const bLen = b.length;\n\n for (let i = 0; i <= bLen; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= aLen; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= bLen; i++) {\n for (let j = 1; j <= aLen; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n\n return matrix[bLen][aLen];\n}\n\nfunction stringSimilarity(a: string, b: string): number {\n if (a === b) return 1;\n const maxLen = Math.max(a.length, b.length);\n if (maxLen === 0) return 1;\n const distance = levenshteinDistance(a.toLowerCase(), b.toLowerCase());\n return 1 - distance / maxLen;\n}\n\nfunction scoreCandidate(\n targetBase: string,\n candidate: string,\n fullTarget: string,\n suffixPattern: RegExp | null\n): { score: number; reason: string } {\n if (candidate === fullTarget) {\n return { score: 1, reason: 'exact match' };\n }\n if (normalizeLooseName(candidate) === normalizeLooseName(fullTarget)) {\n return { score: 1, reason: 'separator-normalized exact match' };\n }\n\n if (suffixPattern && candidate.startsWith(fullTarget)) {\n const suffix = candidate.slice(fullTarget.length);\n if (suffix === '' || suffixPattern.test(suffix)) {\n return { score: 0.95, reason: 'suffix match' };\n }\n }\n\n const fullScore = stringSimilarity(candidate, fullTarget);\n const baseScore = stringSimilarity(candidate, targetBase);\n const score = Math.max(fullScore, baseScore);\n const reason = fullScore >= baseScore ? 'similar full name' : 'similar base name';\n return { score, reason };\n}\n\nfunction deriveBaseName(candidate: string, prefix: string, suffix: string): string | null {\n const hasPrefix = prefix && candidate.startsWith(prefix);\n const hasSuffix = suffix && candidate.endsWith(suffix);\n if (hasPrefix && hasSuffix) {\n return candidate.slice(prefix.length, candidate.length - suffix.length);\n }\n if (prefix === '' && suffix === '') {\n return candidate;\n }\n return null;\n}\n\nfunction findBestMatch(\n targetBase: string,\n candidates: Set<string>,\n prefix: string,\n suffix: string,\n suffixPattern: RegExp | null\n): { candidate: string; confidence: number; reason: string } | null {\n const fullTarget = prefix + targetBase + suffix;\n let best: { candidate: string; confidence: number; reason: string } | null = null;\n\n for (const candidate of candidates) {\n const { score, reason } = scoreCandidate(targetBase, candidate, fullTarget, suffixPattern);\n if (!best || score > best.confidence) {\n best = { candidate, confidence: score, reason };\n }\n }\n\n return best;\n}\n\nfunction collectModelAssets(meshes: MorphMesh[], skeleton: Skeleton | null) {\n const modelMorphs = new Set<string>();\n const modelMeshes = new Set<string>();\n for (const mesh of meshes) {\n if (mesh.name) modelMeshes.add(mesh.name);\n if (mesh.morphTargetDictionary) {\n for (const morphName of Object.keys(mesh.morphTargetDictionary)) {\n modelMorphs.add(morphName);\n }\n }\n }\n\n const modelBones = new Set<string>();\n if (skeleton?.bones) {\n for (const bone of skeleton.bones) {\n if (bone.name) modelBones.add(bone.name);\n }\n }\n\n return { modelMorphs, modelMeshes, modelBones };\n}\n\nexport function generateMappingCorrections(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n config: Profile,\n options: MappingCorrectionOptions = {}\n): MappingCorrectionResult {\n const { minConfidence = DEFAULT_MIN_CONFIDENCE, useResolvedNames = false } = options;\n const suffixPattern = config.suffixPattern ? new RegExp(config.suffixPattern) : null;\n const bonePrefix = config.bonePrefix || '';\n const boneSuffix = config.boneSuffix || '';\n const morphPrefix = config.morphPrefix || '';\n const morphSuffix = config.morphSuffix || '';\n\n const { modelMorphs, modelMeshes, modelBones } = collectModelAssets(meshes, skeleton);\n\n const corrections: MappingCorrection[] = [];\n const unresolved: MappingCorrection[] = [];\n\n const correctedConfig: Profile = {\n ...config,\n boneNodes: { ...config.boneNodes },\n auToMorphs: { ...config.auToMorphs },\n morphToMesh: { ...config.morphToMesh },\n visemeKeys: [...config.visemeKeys],\n };\n\n if (useResolvedNames) {\n correctedConfig.bonePrefix = '';\n correctedConfig.boneSuffix = '';\n correctedConfig.morphPrefix = '';\n correctedConfig.morphSuffix = '';\n }\n\n // Bone nodes corrections\n for (const [semanticKey, baseName] of Object.entries(config.boneNodes)) {\n const match = findBestMatch(baseName, modelBones, bonePrefix, boneSuffix, suffixPattern);\n if (!match || match.confidence < minConfidence) {\n unresolved.push({\n type: 'bone',\n source: baseName,\n target: baseName,\n confidence: match?.confidence ?? 0,\n reason: match?.reason ?? 'no match',\n applied: false,\n key: semanticKey,\n });\n continue;\n }\n\n const derivedBase = deriveBaseName(match.candidate, bonePrefix, boneSuffix);\n const resolvedName = useResolvedNames || !derivedBase ? match.candidate : derivedBase;\n const canApply = useResolvedNames || derivedBase !== null;\n\n if (canApply && resolvedName !== baseName) {\n correctedConfig.boneNodes[semanticKey] = resolvedName;\n }\n\n corrections.push({\n type: 'bone',\n source: baseName,\n target: match.candidate,\n confidence: match.confidence,\n reason: match.reason,\n applied: canApply && resolvedName !== baseName,\n key: semanticKey,\n });\n }\n\n // Morph corrections (AU morphs + visemes)\n const updateMorphList = (items: MorphTargetRef[], auId?: number): MorphTargetRef[] => {\n return items.map((morphName) => {\n if (typeof morphName !== 'string') {\n return morphName;\n }\n\n if (modelMorphs.has(morphName)) return morphName;\n\n const match = findBestMatch(morphName, modelMorphs, morphPrefix, morphSuffix, suffixPattern);\n if (!match || match.confidence < minConfidence) {\n unresolved.push({\n type: 'morph',\n source: morphName,\n target: morphName,\n confidence: match?.confidence ?? 0,\n reason: match?.reason ?? 'no match',\n applied: false,\n auId,\n });\n return morphName;\n }\n\n const derivedBase = deriveBaseName(match.candidate, morphPrefix, morphSuffix);\n const resolvedName = useResolvedNames || !derivedBase ? match.candidate : derivedBase;\n const canApply = useResolvedNames || derivedBase !== null;\n\n corrections.push({\n type: 'morph',\n source: morphName,\n target: match.candidate,\n confidence: match.confidence,\n reason: match.reason,\n applied: canApply && resolvedName !== morphName,\n auId,\n });\n\n return canApply ? resolvedName : morphName;\n });\n };\n\n const updateMorphsBySide = (entry: MorphTargetsBySide | undefined, auId?: number): MorphTargetsBySide => ({\n left: entry ? updateMorphList(entry.left, auId) : [],\n right: entry ? updateMorphList(entry.right, auId) : [],\n center: entry ? updateMorphList(entry.center, auId) : [],\n });\n\n for (const [auIdStr, morphs] of Object.entries(config.auToMorphs)) {\n const auId = Number(auIdStr);\n correctedConfig.auToMorphs[auId] = updateMorphsBySide(morphs, auId);\n }\n\n correctedConfig.visemeKeys = updateMorphList(config.visemeKeys).filter(\n (key): key is string => typeof key === 'string'\n );\n\n // morphToMesh corrections\n for (const [category, meshList] of Object.entries(config.morphToMesh || {})) {\n correctedConfig.morphToMesh[category] = meshList.map((meshName) => {\n if (modelMeshes.has(meshName)) return meshName;\n\n const match = findBestMatch(meshName, modelMeshes, '', '', suffixPattern);\n if (!match || match.confidence < minConfidence) {\n unresolved.push({\n type: 'mesh',\n source: meshName,\n target: meshName,\n confidence: match?.confidence ?? 0,\n reason: match?.reason ?? 'no match',\n applied: false,\n key: category,\n });\n return meshName;\n }\n\n corrections.push({\n type: 'mesh',\n source: meshName,\n target: match.candidate,\n confidence: match.confidence,\n reason: match.reason,\n applied: match.candidate !== meshName,\n key: category,\n });\n\n return match.candidate;\n });\n }\n\n return {\n correctedConfig,\n corrections,\n unresolved,\n };\n}\n","/**\n * Embody - Mapping Validation\n *\n * Validates that AU mapping presets are compatible with a loaded character model.\n * Checks that bones, morph targets, and meshes referenced in the preset exist in the model.\n */\n\nimport type { RotationAxis } from '../core/types';\nimport { toAUList } from '../core/compositeAxis';\nimport type { Profile, MorphTargetsBySide, MorphTargetRef } from '../mappings/types';\nimport type { MappingCorrection, MappingCorrectionOptions } from './generateMappingCorrections';\nimport { generateMappingCorrections } from './generateMappingCorrections';\nimport type { ValidationMorphMesh as MorphMesh, ValidationSkeleton as Skeleton } from './types';\n\n/**\n * Result of validating a preset against a model\n */\nexport interface ValidationResult {\n /** Overall validity - true if essential mappings are found */\n valid: boolean;\n\n /** Compatibility score from 0-100 */\n score: number;\n\n /** Morph targets referenced in preset but not found in model */\n missingMorphs: string[];\n\n /** Bones referenced in preset but not found in model */\n missingBones: string[];\n\n /** Morph targets successfully matched */\n foundMorphs: string[];\n\n /** Bones successfully matched */\n foundBones: string[];\n\n /** Morph targets in model not used by preset */\n unmappedMorphs: string[];\n\n /** Bones in model not used by preset */\n unmappedBones: string[];\n\n /** Meshes referenced by morphToMesh but not found in model */\n missingMeshes: string[];\n\n /** Meshes referenced by morphToMesh and found in model */\n foundMeshes: string[];\n\n /** Meshes in model not referenced by morphToMesh */\n unmappedMeshes: string[];\n\n /** Non-fatal warnings and suggestions */\n warnings: string[];\n\n /** Optional: corrected config when suggestions are requested */\n suggestedConfig?: Profile;\n\n /** Optional: corrections applied or suggested */\n corrections?: MappingCorrection[];\n\n /** Optional: unresolved mappings that could not be corrected */\n unresolved?: MappingCorrection[];\n}\n\nexport type IssueSeverity = 'error' | 'warning';\n\nexport interface MappingIssue {\n code: string;\n severity: IssueSeverity;\n message: string;\n data?: Record<string, unknown>;\n}\n\nexport interface MappingConsistencyResult {\n valid: boolean;\n errors: MappingIssue[];\n warnings: MappingIssue[];\n issues: MappingIssue[];\n}\n\nexport interface ValidateMappingOptions extends MappingCorrectionOptions {\n suggestCorrections?: boolean;\n}\n\n/**\n * Check if a target name matches using fuzzy matching with suffix pattern\n */\nfunction normalizeLooseName(value: string): string {\n return value.replace(/\\./g, '');\n}\n\nfunction fuzzyMatch(\n targetName: string,\n candidateName: string,\n prefix: string,\n suffix: string,\n suffixPattern: RegExp | null\n): boolean {\n const prefixedTarget = prefix && !targetName.startsWith(prefix)\n ? `${prefix}${targetName}`\n : targetName;\n const fullTarget = suffix && !prefixedTarget.endsWith(suffix)\n ? `${prefixedTarget}${suffix}`\n : prefixedTarget;\n\n // Exact match\n if (candidateName === targetName || candidateName === fullTarget) {\n return true;\n }\n if (\n normalizeLooseName(candidateName) === normalizeLooseName(targetName)\n || normalizeLooseName(candidateName) === normalizeLooseName(fullTarget)\n ) {\n return true;\n }\n\n // Fuzzy match with suffix\n if (suffixPattern && candidateName.startsWith(fullTarget)) {\n const suffix = candidateName.slice(fullTarget.length);\n return suffix === '' || suffixPattern.test(suffix);\n }\n\n return false;\n}\n\n/**\n * Find all matching names in a set using fuzzy matching\n */\nfunction findMatches(\n targetNames: string[],\n candidateNames: Set<string>,\n prefix: string,\n suffix: string,\n suffixPattern: RegExp | null\n): { found: string[]; missing: string[] } {\n const found: string[] = [];\n const missing: string[] = [];\n\n for (const target of targetNames) {\n let matched = false;\n for (const candidate of candidateNames) {\n if (fuzzyMatch(target, candidate, prefix, suffix, suffixPattern)) {\n found.push(target);\n matched = true;\n break;\n }\n }\n if (!matched) {\n missing.push(target);\n }\n }\n\n return { found, missing };\n}\n\nfunction collectAxisConfigs(\n axisConfigs: Array<{ axis: 'pitch' | 'yaw' | 'roll'; config: RotationAxis | null }>\n): Array<{ axis: 'pitch' | 'yaw' | 'roll'; config: RotationAxis }> {\n return axisConfigs.filter((entry): entry is { axis: 'pitch' | 'yaw' | 'roll'; config: RotationAxis } => entry.config !== null);\n}\n\nfunction isEyeNodeKey(nodeKey: string) {\n return nodeKey === 'EYE_L' || nodeKey === 'EYE_R';\n}\n\n/**\n * Validate that the mapping dictionaries are internally consistent.\n */\nexport function validateMappingConfig(config: Profile): MappingConsistencyResult {\n const errors: MappingIssue[] = [];\n const warnings: MappingIssue[] = [];\n\n const push = (severity: IssueSeverity, code: string, message: string, data?: Record<string, unknown>) => {\n const issue = { severity, code, message, data };\n if (severity === 'error') {\n errors.push(issue);\n } else {\n warnings.push(issue);\n }\n };\n\n const boneNodeKeys = new Set(Object.keys(config.boneNodes || {}));\n const boneNodeValues = new Set(Object.values(config.boneNodes || {}));\n const hasEyeMeshNodes = !!config.eyeMeshNodes;\n\n const isNodeResolvable = (nodeKey: string) => {\n if (boneNodeKeys.has(nodeKey)) return true;\n if (boneNodeValues.has(nodeKey)) return true;\n if (isEyeNodeKey(nodeKey) && hasEyeMeshNodes) return true;\n return false;\n };\n\n // Validate bone bindings reference known nodes\n for (const [auIdStr, bindings] of Object.entries(config.auToBones || {})) {\n for (const binding of bindings) {\n if (!isNodeResolvable(binding.node)) {\n push(\n 'error',\n 'BONE_NODE_MISSING',\n `AU ${auIdStr} references bone node \"${binding.node}\" not present in boneNodes`,\n { auId: Number(auIdStr), node: binding.node }\n );\n }\n }\n }\n\n // Validate composite rotations\n const composites = config.compositeRotations || [];\n const compositeNodes = new Set<string>();\n\n for (const composite of composites) {\n if (compositeNodes.has(composite.node)) {\n push(\n 'warning',\n 'COMPOSITE_NODE_DUPLICATE',\n `Composite rotation node \"${composite.node}\" is defined more than once`,\n { node: composite.node }\n );\n }\n compositeNodes.add(composite.node);\n\n if (!isNodeResolvable(composite.node)) {\n push(\n 'error',\n 'COMPOSITE_NODE_MISSING',\n `Composite rotation node \"${composite.node}\" is not present in boneNodes`,\n { node: composite.node }\n );\n }\n\n const axisEntries = collectAxisConfigs([\n { axis: 'pitch', config: composite.pitch },\n { axis: 'yaw', config: composite.yaw },\n { axis: 'roll', config: composite.roll },\n ]);\n\n for (const { config: axisConfig } of axisEntries) {\n if (!axisConfig.aus || axisConfig.aus.length === 0) {\n push(\n 'error',\n 'COMPOSITE_AUS_EMPTY',\n `Composite axis for \"${composite.node}\" has no AU list`,\n { node: composite.node }\n );\n continue;\n }\n\n for (const auId of toAUList(axisConfig.negative)) {\n if (!axisConfig.aus.includes(auId)) {\n push(\n 'error',\n 'COMPOSITE_AU_MISSING',\n `Composite axis for \"${composite.node}\" is missing negative AU ${auId} in aus list`,\n { node: composite.node, auId }\n );\n }\n }\n\n for (const auId of toAUList(axisConfig.positive)) {\n if (!axisConfig.aus.includes(auId)) {\n push(\n 'error',\n 'COMPOSITE_AU_MISSING',\n `Composite axis for \"${composite.node}\" is missing positive AU ${auId} in aus list`,\n { node: composite.node, auId }\n );\n }\n }\n\n const negativeAUs = toAUList(axisConfig.negative);\n const positiveAUs = toAUList(axisConfig.positive);\n const overlappingAUs = negativeAUs.filter((auId) => positiveAUs.includes(auId));\n if (overlappingAUs.length > 0) {\n push(\n 'error',\n 'COMPOSITE_AU_DUPLICATE',\n `Composite axis for \"${composite.node}\" reuses AU ${overlappingAUs[0]} in both negative and positive groups`,\n { node: composite.node, auId: overlappingAUs[0] }\n );\n }\n }\n }\n\n // Validate continuum pairs\n const continuumPairs = config.continuumPairs || {};\n for (const [auIdStr, info] of Object.entries(continuumPairs)) {\n const auId = Number(auIdStr);\n if (info.pairId === auId) {\n push(\n 'error',\n 'CONTINUUM_PAIR_INVALID',\n `Continuum AU ${auId} pairs with itself`,\n { auId }\n );\n continue;\n }\n\n const reciprocal = continuumPairs[info.pairId];\n if (!reciprocal) {\n push(\n 'error',\n 'CONTINUUM_PAIR_MISSING',\n `Continuum AU ${auId} is missing reciprocal pair ${info.pairId}`,\n { auId, pairId: info.pairId }\n );\n continue;\n }\n\n if (reciprocal.pairId !== auId) {\n push(\n 'error',\n 'CONTINUUM_PAIR_MISMATCH',\n `Continuum AU ${auId} pair ${info.pairId} does not point back`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (reciprocal.isNegative === info.isNegative) {\n push(\n 'error',\n 'CONTINUUM_SIGN_MISMATCH',\n `Continuum AU ${auId} and ${info.pairId} share the same isNegative flag`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (reciprocal.axis !== info.axis) {\n push(\n 'error',\n 'CONTINUUM_AXIS_MISMATCH',\n `Continuum AU ${auId} and ${info.pairId} disagree on axis`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (reciprocal.node !== info.node) {\n push(\n 'error',\n 'CONTINUUM_NODE_MISMATCH',\n `Continuum AU ${auId} and ${info.pairId} disagree on node`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (!isNodeResolvable(info.node)) {\n push(\n 'error',\n 'CONTINUUM_NODE_MISSING',\n `Continuum AU ${auId} references node \"${info.node}\" not present in boneNodes`,\n { auId, node: info.node }\n );\n }\n }\n\n // Cross-check continuum pairs against composite rotations (if present)\n if (composites.length > 0) {\n for (const [auIdStr, info] of Object.entries(continuumPairs)) {\n const composite = composites.find((c) => c.node === info.node);\n if (!composite) {\n push(\n 'warning',\n 'CONTINUUM_COMPOSITE_MISSING',\n `Continuum AU ${auIdStr} references node \"${info.node}\" without a composite rotation`,\n { auId: Number(auIdStr), node: info.node }\n );\n continue;\n }\n\n const axisConfig = composite[info.axis];\n if (!axisConfig || axisConfig.negative === undefined || axisConfig.positive === undefined) {\n push(\n 'warning',\n 'CONTINUUM_COMPOSITE_MISMATCH',\n `Continuum AU ${auIdStr} axis ${info.axis} is not configured as a negative/positive pair in composites`,\n { auId: Number(auIdStr), node: info.node }\n );\n continue;\n }\n\n const expectedNeg = toAUList(axisConfig.negative);\n const expectedPos = toAUList(axisConfig.positive);\n const negId = info.isNegative ? Number(auIdStr) : info.pairId;\n const posId = info.isNegative ? info.pairId : Number(auIdStr);\n if (!expectedNeg.includes(negId) || !expectedPos.includes(posId)) {\n push(\n 'warning',\n 'CONTINUUM_COMPOSITE_MISMATCH',\n `Continuum AU ${auIdStr} does not match composite negative/positive mapping for ${info.node}`,\n { auId: Number(auIdStr), node: info.node }\n );\n }\n }\n }\n\n // Validate AU info coverage\n if (config.auInfo) {\n const referencedAUs = new Set<number>();\n Object.keys(config.auToBones || {}).forEach((key) => referencedAUs.add(Number(key)));\n Object.keys(config.auToMorphs || {}).forEach((key) => referencedAUs.add(Number(key)));\n Object.keys(continuumPairs).forEach((key) => referencedAUs.add(Number(key)));\n composites.forEach((composite) => {\n [composite.pitch, composite.yaw, composite.roll].forEach((axis) => {\n if (!axis) return;\n axis.aus.forEach((auId) => referencedAUs.add(auId));\n });\n });\n\n for (const auId of referencedAUs) {\n if (!config.auInfo[String(auId)]) {\n push(\n 'warning',\n 'AU_INFO_MISSING',\n `AU ${auId} is referenced but missing from auInfo`,\n { auId }\n );\n }\n }\n }\n\n // Validate viseme keys (duplicates or blanks)\n const visemeSeen = new Set<string>();\n for (const key of config.visemeKeys || []) {\n if (typeof key !== 'string') continue;\n if (!key) {\n push('warning', 'VISEME_EMPTY', 'Viseme key is empty');\n continue;\n }\n if (visemeSeen.has(key)) {\n push('warning', 'VISEME_DUPLICATE', `Viseme key \"${key}\" is duplicated`, { key });\n }\n visemeSeen.add(key);\n }\n\n const morphCategories = new Set(Object.keys(config.morphToMesh || {}));\n if (config.visemeMeshCategory && !morphCategories.has(config.visemeMeshCategory)) {\n push(\n 'error',\n 'VISEME_MESH_CATEGORY_MISSING',\n `visemeMeshCategory \"${config.visemeMeshCategory}\" is not present in morphToMesh`,\n { category: config.visemeMeshCategory }\n );\n }\n\n for (const [facePart, category] of Object.entries(config.auFacePartToMeshCategory || {})) {\n if (!morphCategories.has(category)) {\n push(\n 'error',\n 'AU_MESH_CATEGORY_MISSING',\n `AU facePart \"${facePart}\" routes to missing morphToMesh category \"${category}\"`,\n { facePart, category }\n );\n }\n }\n\n if (config.visemeJawAmounts && config.visemeJawAmounts.length !== (config.visemeKeys || []).length) {\n push(\n 'warning',\n 'VISEME_JAW_AMOUNT_LENGTH_MISMATCH',\n 'visemeJawAmounts length does not match visemeKeys length',\n { visemeKeys: (config.visemeKeys || []).length, visemeJawAmounts: config.visemeJawAmounts.length }\n );\n }\n\n // Validate auMixDefaults\n if (config.auMixDefaults) {\n for (const key of Object.keys(config.auMixDefaults)) {\n const auId = Number(key);\n if (\n Number.isNaN(auId) ||\n (!config.auToBones?.[auId] && !collectMorphs(config.auToMorphs?.[auId]).length && !continuumPairs[auId])\n ) {\n push(\n 'warning',\n 'AU_MIX_DEFAULT_UNUSED',\n `auMixDefaults includes AU ${key} not present in auToBones/auToMorphs`,\n { auId: key }\n );\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n issues: [...errors, ...warnings],\n };\n}\n\n/**\n * Validate that a preset's mappings exist on the loaded model.\n *\n * @param meshes - Array of meshes with morph targets from the model\n * @param skeleton - Model skeleton (or null if no skeleton)\n * @param config - AU mapping preset to validate against\n * @returns ValidationResult with detailed compatibility info\n */\nconst isStringMorph = (key: MorphTargetRef): key is string => typeof key === 'string';\n\nconst collectMorphs = (entry?: MorphTargetsBySide) =>\n [\n ...(entry?.left ?? []),\n ...(entry?.right ?? []),\n ...(entry?.center ?? []),\n ].filter(isStringMorph);\n\nexport function validateMappings(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n config: Profile,\n options: ValidateMappingOptions = {}\n): ValidationResult {\n const warnings: string[] = [];\n\n // Build suffix regex if pattern provided\n const suffixPattern = config.suffixPattern\n ? new RegExp(config.suffixPattern)\n : null;\n\n const bonePrefix = config.bonePrefix || '';\n const boneSuffix = config.boneSuffix || '';\n const morphPrefix = config.morphPrefix || '';\n const morphSuffix = config.morphSuffix || '';\n\n // Collect all morph target names from meshes\n const modelMorphs = new Set<string>();\n const modelMeshes = new Set<string>();\n for (const mesh of meshes) {\n if (mesh.name) {\n modelMeshes.add(mesh.name);\n }\n if (mesh.morphTargetDictionary) {\n for (const morphName of Object.keys(mesh.morphTargetDictionary)) {\n modelMorphs.add(morphName);\n }\n }\n }\n\n // Collect all bone names from skeleton\n const modelBones = new Set<string>();\n if (skeleton?.bones) {\n for (const bone of skeleton.bones) {\n if (bone.name) {\n modelBones.add(bone.name);\n }\n }\n }\n\n // Get all unique morph targets referenced in preset\n const presetMorphs = new Set<string>();\n for (const entry of Object.values(config.auToMorphs)) {\n for (const morph of collectMorphs(entry)) {\n presetMorphs.add(morph);\n }\n }\n for (const viseme of config.visemeKeys) {\n if (typeof viseme === 'string') {\n presetMorphs.add(viseme);\n }\n }\n\n // Get all unique resolved bone names referenced in preset.\n const presetBones = new Set<string>(Object.values(config.boneNodes || {}));\n const addResolvedBoneName = (nodeKey: string | null | undefined) => {\n if (!nodeKey) return;\n presetBones.add(config.boneNodes?.[nodeKey] ?? nodeKey);\n };\n for (const bindings of Object.values(config.auToBones || {})) {\n for (const binding of bindings) {\n addResolvedBoneName(binding.node);\n }\n }\n for (const composite of config.compositeRotations || []) {\n addResolvedBoneName(composite.node);\n }\n for (const info of Object.values(config.continuumPairs || {})) {\n addResolvedBoneName(info.node);\n }\n for (const region of config.annotationRegions || []) {\n for (const boneName of region.bones || []) {\n addResolvedBoneName(boneName);\n }\n }\n\n // Validate morphs\n const morphResult = findMatches(\n Array.from(presetMorphs),\n modelMorphs,\n morphPrefix,\n morphSuffix,\n suffixPattern\n );\n\n // Validate bones\n const boneResult = findMatches(\n Array.from(presetBones),\n modelBones,\n bonePrefix,\n boneSuffix,\n suffixPattern\n );\n\n // Find unmapped model assets\n const unmappedMorphs: string[] = [];\n for (const morph of modelMorphs) {\n let isUsed = false;\n for (const target of presetMorphs) {\n if (fuzzyMatch(target, morph, morphPrefix, morphSuffix, suffixPattern)) {\n isUsed = true;\n break;\n }\n }\n if (!isUsed) {\n unmappedMorphs.push(morph);\n }\n }\n\n const unmappedBones: string[] = [];\n for (const bone of modelBones) {\n let isUsed = false;\n for (const target of presetBones) {\n if (fuzzyMatch(target, bone, bonePrefix, boneSuffix, suffixPattern)) {\n isUsed = true;\n break;\n }\n }\n if (!isUsed) {\n unmappedBones.push(bone);\n }\n }\n\n // Generate warnings\n if (presetMorphs.size > 0 && modelMorphs.size === 0) {\n warnings.push('Model has no morph targets - blend shape animations will not work');\n }\n\n if (presetBones.size > 0 && modelBones.size === 0) {\n warnings.push('Model has no skeleton - bone-based animations will not work');\n }\n\n if (morphResult.missing.length > 0 && morphResult.found.length === 0) {\n warnings.push(`No morph targets matched - preset may be incompatible with this model`);\n }\n\n if (boneResult.missing.length > 0 && boneResult.found.length === 0) {\n warnings.push(`No bones matched - preset may be incompatible with this model`);\n }\n\n // Validate morphToMesh references\n const referencedMeshes = new Set<string>();\n for (const meshList of Object.values(config.morphToMesh || {})) {\n for (const meshName of meshList) {\n referencedMeshes.add(meshName);\n }\n }\n\n const missingMeshes: string[] = [];\n const foundMeshes: string[] = [];\n for (const meshName of referencedMeshes) {\n if (modelMeshes.has(meshName)) {\n foundMeshes.push(meshName);\n } else {\n missingMeshes.push(meshName);\n }\n }\n\n const unmappedMeshes: string[] = [];\n for (const meshName of modelMeshes) {\n if (!referencedMeshes.has(meshName)) {\n unmappedMeshes.push(meshName);\n }\n }\n\n if (missingMeshes.length > 0) {\n warnings.push(`Some morphToMesh entries were not found on the model`);\n }\n\n // Validate eye mesh nodes if provided\n if (config.eyeMeshNodes) {\n const left = config.eyeMeshNodes.LEFT;\n const right = config.eyeMeshNodes.RIGHT;\n const leftOk = modelMeshes.has(left) || modelBones.has(left);\n const rightOk = modelMeshes.has(right) || modelBones.has(right);\n if (!leftOk) {\n warnings.push(`Eye mesh node LEFT (\"${left}\") was not found on the model`);\n }\n if (!rightOk) {\n warnings.push(`Eye mesh node RIGHT (\"${right}\") was not found on the model`);\n }\n }\n\n // Calculate compatibility score\n let score = 0;\n\n // Morph score (60% weight if preset uses morphs)\n if (presetMorphs.size > 0) {\n const morphScore = (morphResult.found.length / presetMorphs.size) * 60;\n score += morphScore;\n } else {\n // No morphs in preset - give full morph points\n score += 60;\n }\n\n // Bone score (40% weight if preset uses bones)\n if (presetBones.size > 0) {\n const boneScore = (boneResult.found.length / presetBones.size) * 40;\n score += boneScore;\n } else {\n // No bones in preset - give full bone points\n score += 40;\n }\n\n score = Math.round(score);\n\n // Determine overall validity\n // Valid if at least some essential mappings are found\n const hasMorphSupport = presetMorphs.size === 0 || morphResult.found.length > 0;\n const hasBoneSupport = presetBones.size === 0 || boneResult.found.length > 0;\n const valid = hasMorphSupport || hasBoneSupport;\n\n const result: ValidationResult = {\n valid,\n score,\n missingMorphs: morphResult.missing,\n missingBones: boneResult.missing,\n foundMorphs: morphResult.found,\n foundBones: boneResult.found,\n unmappedMorphs,\n unmappedBones,\n missingMeshes,\n foundMeshes,\n unmappedMeshes,\n warnings,\n };\n\n if (options.suggestCorrections) {\n const correctionResult = generateMappingCorrections(\n meshes,\n skeleton,\n config,\n options\n );\n result.suggestedConfig = correctionResult.correctedConfig;\n result.corrections = correctionResult.corrections;\n result.unresolved = correctionResult.unresolved;\n }\n\n return result;\n}\n\n/**\n * Quick check if a preset is compatible with a model.\n * Returns true if at least 50% of mappings are found.\n */\nexport function isPresetCompatible(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n config: Profile\n): boolean {\n const result = validateMappings(meshes, skeleton, config);\n return result.score >= 50;\n}\n\n/**\n * Suggest the best preset from a list based on validation scores.\n */\nexport function suggestBestPreset<T extends Profile>(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n presets: T[]\n): { preset: T; score: number } | null {\n let bestPreset: T | null = null;\n let bestScore = -1;\n\n for (const preset of presets) {\n const result = validateMappings(meshes, skeleton, preset);\n if (result.score > bestScore) {\n bestScore = result.score;\n bestPreset = preset;\n }\n }\n\n return bestPreset ? { preset: bestPreset, score: bestScore } : null;\n}\n","/**\n * Embody - Model Data Extraction\n *\n * Extracts bones, morph targets, meshes, and animations from 3D models.\n * Works with both GLTF files and runtime Three.js models.\n */\n\nimport * as THREE from 'three';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\n/**\n * Bone information extracted from skeleton\n */\nexport interface BoneInfo {\n name: string;\n parent: string | null;\n children: string[];\n worldPosition: { x: number; y: number; z: number };\n /** Depth in hierarchy (0 = root) */\n depth: number;\n}\n\n/**\n * Morph target information\n */\nexport interface MorphInfo {\n name: string;\n meshName: string;\n index: number;\n}\n\n/**\n * Model mesh information (from extraction)\n */\nexport interface ModelMeshInfo {\n name: string;\n hasMorphTargets: boolean;\n morphCount: number;\n}\n\n/**\n * Animation track information\n */\nexport interface TrackInfo {\n name: string;\n targetName: string;\n property: string;\n type: 'position' | 'rotation' | 'scale' | 'morph' | 'unknown';\n keyframeCount: number;\n valueRange?: { min: number[]; max: number[] };\n}\n\n/**\n * Animation clip information\n */\nexport interface AnimationInfo {\n name: string;\n duration: number;\n tracks: TrackInfo[];\n animatedBones: string[];\n animatedMorphs: string[];\n}\n\n/**\n * Complete model data extraction result\n */\nexport interface ModelData {\n bones: BoneInfo[];\n morphs: MorphInfo[];\n meshes: ModelMeshInfo[];\n animations: AnimationInfo[];\n /** Quick lookups */\n boneNames: string[];\n morphNames: string[];\n meshNames: string[];\n}\n\n/**\n * Extract bone hierarchy from a Three.js object\n */\nfunction extractBones(root: THREE.Object3D): BoneInfo[] {\n const bones: BoneInfo[] = [];\n const boneDepths = new Map<string, number>();\n\n // First pass: find all bones and calculate depths\n root.traverse((obj) => {\n if (obj instanceof THREE.Bone || obj.type === 'Bone') {\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n\n // Calculate depth by walking up the parent chain\n let depth = 0;\n let parent = obj.parent;\n while (parent) {\n if (parent instanceof THREE.Bone || parent.type === 'Bone') {\n depth++;\n }\n parent = parent.parent;\n }\n boneDepths.set(obj.name, depth);\n\n const parentBone = obj.parent instanceof THREE.Bone || obj.parent?.type === 'Bone'\n ? obj.parent.name\n : null;\n\n bones.push({\n name: obj.name,\n parent: parentBone,\n children: [], // Will be filled in second pass\n worldPosition: { x: worldPos.x, y: worldPos.y, z: worldPos.z },\n depth,\n });\n }\n });\n\n // Second pass: fill in children\n for (const bone of bones) {\n bone.children = bones\n .filter(b => b.parent === bone.name)\n .map(b => b.name);\n }\n\n // Sort by depth, then alphabetically\n bones.sort((a, b) => {\n if (a.depth !== b.depth) return a.depth - b.depth;\n return a.name.localeCompare(b.name);\n });\n\n return bones;\n}\n\n/**\n * Extract morph targets from meshes\n */\nfunction extractMorphs(meshes: THREE.Mesh[]): MorphInfo[] {\n const morphs: MorphInfo[] = [];\n\n for (const mesh of meshes) {\n const geo = mesh.geometry;\n if (!geo.morphAttributes) continue;\n\n // GLTFLoader stores the dictionary on Mesh; runtime-authored targets also\n // mirror it onto geometry for tooling that reads there.\n const dict = mesh.morphTargetDictionary ||\n ((geo as any).morphTargetDictionary as Record<string, number> | undefined);\n\n if (dict) {\n for (const [name, index] of Object.entries(dict)) {\n morphs.push({\n name,\n meshName: mesh.name,\n index,\n });\n }\n } else if (mesh.morphTargetInfluences && mesh.morphTargetInfluences.length > 0) {\n // Fallback: no dictionary, just numbered morphs\n for (let i = 0; i < mesh.morphTargetInfluences.length; i++) {\n morphs.push({\n name: `morph_${i}`,\n meshName: mesh.name,\n index: i,\n });\n }\n }\n }\n\n return morphs;\n}\n\n/**\n * Extract mesh information\n */\nfunction extractMeshes(meshes: THREE.Mesh[]): ModelMeshInfo[] {\n return meshes.map(mesh => ({\n name: mesh.name,\n hasMorphTargets: !!(mesh.morphTargetDictionary && Object.keys(mesh.morphTargetDictionary).length > 0) ||\n !!(mesh.morphTargetInfluences && mesh.morphTargetInfluences.length > 0),\n morphCount: mesh.morphTargetInfluences?.length || 0,\n }));\n}\n\n/**\n * Parse animation track to extract info\n */\nfunction parseTrack(track: THREE.KeyframeTrack): TrackInfo {\n // Track name format: \"objectName.property\" or \"objectName.property[index]\"\n const parts = track.name.split('.');\n const targetName = parts[0];\n const property = parts.slice(1).join('.');\n\n let type: TrackInfo['type'] = 'unknown';\n if (property.includes('position')) type = 'position';\n else if (property.includes('quaternion') || property.includes('rotation')) type = 'rotation';\n else if (property.includes('scale')) type = 'scale';\n else if (property.includes('morphTargetInfluences')) type = 'morph';\n\n // Calculate value ranges\n const values = track.values;\n const valueSize = track.getValueSize();\n let min: number[] = [];\n let max: number[] = [];\n\n if (values.length > 0) {\n min = Array(valueSize).fill(Infinity);\n max = Array(valueSize).fill(-Infinity);\n\n for (let i = 0; i < values.length; i += valueSize) {\n for (let j = 0; j < valueSize; j++) {\n const v = values[i + j];\n if (v < min[j]) min[j] = v;\n if (v > max[j]) max[j] = v;\n }\n }\n }\n\n return {\n name: track.name,\n targetName,\n property,\n type,\n keyframeCount: track.times.length,\n valueRange: min.length > 0 ? { min, max } : undefined,\n };\n}\n\n/**\n * Extract animation information\n */\nfunction extractAnimations(animations: THREE.AnimationClip[]): AnimationInfo[] {\n return animations.map(clip => {\n const tracks = clip.tracks.map(parseTrack);\n\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/**\n * Collect all meshes from a scene\n */\nfunction collectMeshes(root: THREE.Object3D): THREE.Mesh[] {\n const meshes: THREE.Mesh[] = [];\n root.traverse((obj) => {\n if ((obj as THREE.Mesh).isMesh) {\n meshes.push(obj as THREE.Mesh);\n }\n });\n return meshes;\n}\n\n/**\n * Extract all data from a runtime Three.js model\n *\n * @param model - The root Object3D of the loaded model\n * @param meshes - Array of meshes with morph targets (optional, will be collected if not provided)\n * @param animations - Array of AnimationClips from the GLTF (optional)\n */\nexport function extractModelData(\n model: THREE.Object3D,\n meshes?: THREE.Mesh[],\n animations?: THREE.AnimationClip[]\n): ModelData {\n const actualMeshes = meshes || collectMeshes(model);\n const actualAnimations = animations || [];\n\n const bones = extractBones(model);\n const morphs = extractMorphs(actualMeshes);\n const meshInfos = extractMeshes(actualMeshes);\n const animationInfos = extractAnimations(actualAnimations);\n\n return {\n bones,\n morphs,\n meshes: meshInfos,\n animations: animationInfos,\n boneNames: bones.map(b => b.name),\n morphNames: morphs.map(m => m.name),\n meshNames: meshInfos.map(m => m.name),\n };\n}\n\n/**\n * Extract all data from a GLTF file\n *\n * @param gltf - The loaded GLTF object\n */\nexport function extractFromGLTF(gltf: GLTF): ModelData {\n const meshes = collectMeshes(gltf.scene);\n return extractModelData(gltf.scene, meshes, gltf.animations);\n}\n","/**\n * Embody - Unified Model Analysis API\n *\n * Combines model extraction, validation, and correction suggestions\n * into a single comprehensive analysis report.\n */\n\nimport * as THREE from 'three';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport type { Profile } from '../mappings/types';\nimport { extractModelData, extractFromGLTF, type ModelData, type AnimationInfo } from './extractModelData';\nimport { validateMappings, type ValidationResult } from './validateMappings';\n\n/**\n * Animation analysis results\n */\nexport interface AnimationAnalysis {\n count: number;\n hasIdleCandidate: boolean;\n clips: Array<{\n name: string;\n duration: number;\n affectedBones: string[];\n affectedMorphs: string[];\n }>;\n}\n\n/**\n * Complete model analysis report\n */\nexport interface ModelAnalysisReport {\n /** Extracted model data */\n model: ModelData;\n\n /** Validation results (if preset provided) */\n validation?: ValidationResult;\n\n /** Animation analysis */\n animations: AnimationAnalysis;\n\n /** Overall health score (0-100) */\n overallScore: number;\n\n /** Human-readable summary */\n summary: string;\n}\n\n/**\n * Options for model analysis\n */\nexport interface AnalyzeModelOptions {\n /** The model source */\n source:\n | { type: 'gltf'; gltf: GLTF }\n | { type: 'runtime'; model: THREE.Object3D; meshes: THREE.Mesh[]; animations: THREE.AnimationClip[] };\n\n /** Optional preset to validate against */\n preset?: Profile;\n\n /** Request correction suggestions */\n suggestCorrections?: boolean;\n}\n\n/**\n * Analyze animations to detect idle candidates and summarize clips\n */\nfunction analyzeAnimations(animations: AnimationInfo[]): AnimationAnalysis {\n // Detect idle animation candidates\n // Heuristic: short clips (< 5s) with subtle motion are likely idle loops\n const hasIdleCandidate = animations.some(anim =>\n anim.duration < 5 && anim.duration > 0.5 &&\n (anim.name.toLowerCase().includes('idle') ||\n anim.name.toLowerCase().includes('stand') ||\n anim.name.toLowerCase().includes('breath'))\n );\n\n return {\n count: animations.length,\n hasIdleCandidate,\n clips: animations.map(anim => ({\n name: anim.name,\n duration: anim.duration,\n affectedBones: anim.animatedBones,\n affectedMorphs: anim.animatedMorphs,\n })),\n };\n}\n\n/**\n * Calculate overall health score\n */\nfunction calculateOverallScore(\n validation: ValidationResult | undefined,\n animations: AnimationAnalysis\n): number {\n // If no validation (no preset), base score on model completeness\n if (!validation) {\n // Award points for having bones (40), morphs (40), animations (20)\n let score = 0;\n // Assume model is complete if we're analyzing it\n score += 80;\n if (animations.count > 0) score += 20;\n return Math.min(100, score);\n }\n\n // With validation: use validation score as primary (70%), animations as secondary (30%)\n let score = validation.score * 0.7;\n\n // Animation score\n let animScore = 0;\n if (animations.count > 0) animScore += 20;\n if (animations.hasIdleCandidate) animScore += 10;\n score += animScore * 0.3;\n\n return Math.round(score);\n}\n\n/**\n * Generate human-readable summary\n */\nfunction generateSummary(\n model: ModelData,\n validation: ValidationResult | undefined,\n animations: AnimationAnalysis\n): string {\n const parts: string[] = [];\n\n // Model assets\n parts.push(`Model has ${model.bones.length} bones, ${model.morphs.length} morphs, ${animations.count} animations.`);\n\n // Validation summary\n if (validation) {\n if (validation.score >= 70) {\n parts.push(`Preset is compatible (${validation.score}% match).`);\n } else if (validation.score >= 40) {\n parts.push(`Preset is partially compatible (${validation.score}% match).`);\n if (validation.missingBones.length > 0) {\n parts.push(`Missing ${validation.missingBones.length} bones.`);\n }\n if (validation.missingMorphs.length > 0) {\n parts.push(`Missing ${validation.missingMorphs.length} morphs.`);\n }\n } else {\n parts.push(`Preset is incompatible (${validation.score}% match).`);\n }\n\n if (validation.corrections && validation.corrections.length > 0) {\n parts.push(`${validation.corrections.length} corrections suggested.`);\n }\n }\n\n // Animation summary\n if (animations.count === 0) {\n parts.push('No animations found.');\n } else if (animations.hasIdleCandidate) {\n parts.push('Idle animation detected.');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Analyze a 3D model comprehensively\n *\n * Extracts model data, validates against a preset (if provided),\n * analyzes animations, and returns a comprehensive report.\n *\n * @param options - Analysis options\n * @returns Complete analysis report\n */\nexport async function analyzeModel(options: AnalyzeModelOptions): Promise<ModelAnalysisReport> {\n const { source, preset, suggestCorrections = false } = options;\n\n // Step 1: Extract model data\n const modelData =\n source.type === 'gltf'\n ? extractFromGLTF(source.gltf)\n : extractModelData(source.model, source.meshes, source.animations);\n\n // Step 2: Validate against preset (if provided)\n let validation: ValidationResult | undefined;\n if (preset) {\n // Build validation inputs from model data\n const meshes = modelData.meshes.map(meshInfo => {\n // Find actual mesh with morph targets\n const morphsForMesh = modelData.morphs.filter(m => m.meshName === meshInfo.name);\n const morphTargetDictionary = morphsForMesh.length > 0\n ? Object.fromEntries(morphsForMesh.map(m => [m.name, m.index]))\n : undefined;\n\n return {\n name: meshInfo.name,\n morphTargetDictionary,\n };\n });\n\n const skeleton = modelData.bones.length > 0\n ? { bones: modelData.bones.map(b => ({ name: b.name })) }\n : null;\n\n validation = validateMappings(meshes, skeleton, preset, { suggestCorrections });\n }\n\n // Step 3: Analyze animations\n const animationAnalysis = analyzeAnimations(modelData.animations);\n\n // Step 4: Calculate overall score and summary\n const overallScore = calculateOverallScore(validation, animationAnalysis);\n const summary = generateSummary(modelData, validation, animationAnalysis);\n\n return {\n model: modelData,\n validation,\n animations: animationAnalysis,\n overallScore,\n summary,\n };\n}\n","{\n \"id\": \"jonathan-cc-base\",\n \"sourceCharacterId\": \"jonathan\",\n \"sourceAsset\": \"frontend/public/characters/jonathan_new.glb\",\n \"sourceSkinName\": \"Armature\",\n \"bones\": [\n {\n \"name\": \"CC_Base_BoneRoot\",\n \"parent\": null,\n \"translation\": [\n 0,\n 0,\n 0\n ]\n },\n {\n \"name\": \"CC_Base_Hip\",\n \"parent\": \"CC_Base_BoneRoot\",\n \"translation\": [\n 0,\n 0,\n 102.33650207519531\n ]\n },\n {\n \"name\": \"CC_Base_Pelvis\",\n \"parent\": \"CC_Base_Hip\",\n \"translation\": [\n -3.790411029074318e-15,\n 0.000030517578125,\n -7.908884072094224e-7\n ]\n },\n {\n \"name\": \"CC_Base_L_Thigh\",\n \"parent\": \"CC_Base_Pelvis\",\n \"translation\": [\n 9.953155517578125,\n -1.789858102798462,\n -1.3750107288360596\n ]\n },\n {\n \"name\": \"CC_Base_L_Calf\",\n \"parent\": \"CC_Base_L_Thigh\",\n \"translation\": [\n 0.0010912826983258128,\n 47.572593688964844,\n -0.00025631440803408623\n ]\n },\n {\n \"name\": \"CC_Base_L_Foot\",\n \"parent\": \"CC_Base_L_Calf\",\n \"translation\": [\n 0.012946736067533493,\n 47.30466842651367,\n 0.0028991601429879665\n ]\n },\n {\n \"name\": \"CC_Base_L_ToeBaseShareBone\",\n \"parent\": \"CC_Base_L_Foot\",\n \"translation\": [\n -0.00015205750241875648,\n 15.384612083435059,\n 0.00008890032768249512\n ]\n },\n {\n \"name\": \"CC_Base_L_ToeBase\",\n \"parent\": \"CC_Base_L_Foot\",\n \"translation\": [\n -0.00015205750241875648,\n 15.384612083435059,\n 0.00008890032768249512\n ]\n },\n {\n \"name\": \"CC_Base_L_PinkyToe1\",\n \"parent\": \"CC_Base_L_ToeBase\",\n \"translation\": [\n -2.8338863849639893,\n 0.00474335253238678,\n -0.449185848236084\n ]\n },\n {\n \"name\": \"CC_Base_L_RingToe1\",\n \"parent\": \"CC_Base_L_ToeBase\",\n \"translation\": [\n -1.4594630002975464,\n 1.165667176246643,\n -0.024081647396087646\n ]\n },\n {\n \"name\": \"CC_Base_L_MidToe1\",\n \"parent\": \"CC_Base_L_ToeBase\",\n \"translation\": [\n -0.000005848705768585205,\n 2.3142271041870117,\n 0.00005245208740234375\n ]\n },\n {\n \"name\": \"CC_Base_L_IndexToe1\",\n \"parent\": \"CC_Base_L_ToeBase\",\n \"translation\": [\n 1.5948846340179443,\n 2.64426851272583,\n 0.3221862316131592\n ]\n },\n {\n \"name\": \"CC_Base_L_BigToe1\",\n \"parent\": \"CC_Base_L_ToeBase\",\n \"translation\": [\n 3.8480422496795654,\n 2.5877017974853516,\n 0.018612831830978394\n ]\n },\n {\n \"name\": \"CC_Base_L_CalfTwist01\",\n \"parent\": \"CC_Base_L_Calf\",\n \"translation\": [\n -0.000009258394129574299,\n 0.000004678964614868164,\n -3.073364496231079e-8\n ]\n },\n {\n \"name\": \"CC_Base_L_CalfTwist02\",\n \"parent\": \"CC_Base_L_CalfTwist01\",\n \"translation\": [\n 0.008389605209231377,\n 23.652305603027344,\n 0.0010145818814635277\n ]\n },\n {\n \"name\": \"CC_Base_L_KneeShareBone\",\n \"parent\": \"CC_Base_L_Calf\",\n \"translation\": [\n -0.000009258394129574299,\n 0.000004678964614868164,\n -3.073364496231079e-8\n ]\n },\n {\n \"name\": \"CC_Base_L_ThighTwist01\",\n \"parent\": \"CC_Base_L_Thigh\",\n \"translation\": [\n -5.249967216514051e-8,\n -0.0000446811318397522,\n 7.050111889839172e-7\n ]\n },\n {\n \"name\": \"CC_Base_L_ThighTwist02\",\n \"parent\": \"CC_Base_L_ThighTwist01\",\n \"translation\": [\n 0.0005524034495465457,\n 23.786300659179688,\n 0.00003187847323715687\n ]\n },\n {\n \"name\": \"CC_Base_R_Thigh\",\n \"parent\": \"CC_Base_Pelvis\",\n \"translation\": [\n -9.953006744384766,\n -1.7889251708984375,\n -1.3763487339019775\n ]\n },\n {\n \"name\": \"CC_Base_R_Calf\",\n \"parent\": \"CC_Base_R_Thigh\",\n \"translation\": [\n -0.001107644522562623,\n 47.52029800415039,\n 0.00004845880903303623\n ]\n },\n {\n \"name\": \"CC_Base_R_KneeShareBone\",\n \"parent\": \"CC_Base_R_Calf\",\n \"translation\": [\n -0.000007073394954204559,\n -0.000002518296241760254,\n 0.0000019818544387817383\n ]\n },\n {\n \"name\": \"CC_Base_R_Foot\",\n \"parent\": \"CC_Base_R_Calf\",\n \"translation\": [\n -0.011737369000911713,\n 47.35129928588867,\n -0.0035943761467933655\n ]\n },\n {\n \"name\": \"CC_Base_R_ToeBase\",\n \"parent\": \"CC_Base_R_Foot\",\n \"translation\": [\n 0.00023105042055249214,\n 15.38337230682373,\n 0.00045359134674072266\n ]\n },\n {\n \"name\": \"CC_Base_R_BigToe1\",\n \"parent\": \"CC_Base_R_ToeBase\",\n \"translation\": [\n -3.848090648651123,\n 2.587796926498413,\n 0.018401414155960083\n ]\n },\n {\n \"name\": \"CC_Base_R_PinkyToe1\",\n \"parent\": \"CC_Base_R_ToeBase\",\n \"translation\": [\n 2.8339407444000244,\n 0.005379915237426758,\n -0.4495028853416443\n ]\n },\n {\n \"name\": \"CC_Base_R_RingToe1\",\n \"parent\": \"CC_Base_R_ToeBase\",\n \"translation\": [\n 1.4595259428024292,\n 1.1659480333328247,\n -0.02425825595855713\n ]\n },\n {\n \"name\": \"CC_Base_R_IndexToe1\",\n \"parent\": \"CC_Base_R_ToeBase\",\n \"translation\": [\n -1.59493887424469,\n 2.64436674118042,\n 0.32200416922569275\n ]\n },\n {\n \"name\": \"CC_Base_R_MidToe1\",\n \"parent\": \"CC_Base_R_ToeBase\",\n \"translation\": [\n -0.00000912696123123169,\n 2.3142714500427246,\n 0.00001671910285949707\n ]\n },\n {\n \"name\": \"CC_Base_R_ToeBaseShareBone\",\n \"parent\": \"CC_Base_R_Foot\",\n \"translation\": [\n 0.00023105042055249214,\n 15.38337230682373,\n 0.00045359134674072266\n ]\n },\n {\n \"name\": \"CC_Base_R_CalfTwist01\",\n \"parent\": \"CC_Base_R_Calf\",\n \"translation\": [\n -0.000007073394954204559,\n -0.000002518296241760254,\n 0.0000019818544387817383\n ]\n },\n {\n \"name\": \"CC_Base_R_CalfTwist02\",\n \"parent\": \"CC_Base_R_CalfTwist01\",\n \"translation\": [\n -0.005310218781232834,\n 23.675636291503906,\n -0.0015991628170013428\n ]\n },\n {\n \"name\": \"CC_Base_R_ThighTwist01\",\n \"parent\": \"CC_Base_R_Thigh\",\n \"translation\": [\n 0.0000030152787076076493,\n -0.000012714415788650513,\n -5.024485290050507e-7\n ]\n },\n {\n \"name\": \"CC_Base_R_ThighTwist02\",\n \"parent\": \"CC_Base_R_ThighTwist01\",\n \"translation\": [\n -0.000532150617800653,\n 23.760181427001953,\n -0.0005566661711782217\n ]\n },\n {\n \"name\": \"CC_Base_Waist\",\n \"parent\": \"CC_Base_Hip\",\n \"translation\": [\n 0,\n 7.9917144775390625,\n 1.035797119140625\n ]\n },\n {\n \"name\": \"CC_Base_Spine01\",\n \"parent\": \"CC_Base_Waist\",\n \"translation\": [\n 1.2880583372901905e-13,\n 4.44435453414917,\n 0.0000036954879760742188\n ]\n },\n {\n \"name\": \"CC_Base_Spine02\",\n \"parent\": \"CC_Base_Spine01\",\n \"translation\": [\n 1.3552527156068805e-20,\n 14.241397857666016,\n -0.00000852346420288086\n ]\n },\n {\n \"name\": \"CC_Base_NeckTwist01\",\n \"parent\": \"CC_Base_Spine02\",\n \"translation\": [\n -0.000001075023646990303,\n 29.157955169677734,\n 0.000044345855712890625\n ]\n },\n {\n \"name\": \"CC_Base_NeckTwist02\",\n \"parent\": \"CC_Base_NeckTwist01\",\n \"translation\": [\n 8.672486728755757e-9,\n 3.354764223098755,\n 0.00013446807861328125\n ]\n },\n {\n \"name\": \"CC_Base_Head\",\n \"parent\": \"CC_Base_NeckTwist02\",\n \"translation\": [\n 0.00041776246507652104,\n 3.995985746383667,\n -0.00001358989356958773\n ]\n },\n {\n \"name\": \"CC_Base_FacialBone\",\n \"parent\": \"CC_Base_Head\",\n \"translation\": [\n 5.114753065527111e-11,\n 0.000015347271983046085,\n -0.000007390974587906385\n ]\n },\n {\n \"name\": \"CC_Base_JawRoot\",\n \"parent\": \"CC_Base_FacialBone\",\n \"translation\": [\n 1.856170654296875,\n 2.3725814819335938,\n -0.026499934494495392\n ]\n },\n {\n \"name\": \"CC_Base_Tongue01\",\n \"parent\": \"CC_Base_JawRoot\",\n \"translation\": [\n 3.4788222312927246,\n 1.3013767004013062,\n 0.001722173416055739\n ]\n },\n {\n \"name\": \"CC_Base_Tongue02\",\n \"parent\": \"CC_Base_Tongue01\",\n \"translation\": [\n 1.211624026298523,\n 0.00007291115616681054,\n 0.0000023348256945610046\n ]\n },\n {\n \"name\": \"CC_Base_Tongue03\",\n \"parent\": \"CC_Base_Tongue02\",\n \"translation\": [\n 1.8075196743011475,\n 0.0004838673339691013,\n 0.00001673889346420765\n ]\n },\n {\n \"name\": \"CC_Base_Teeth02\",\n \"parent\": \"CC_Base_JawRoot\",\n \"translation\": [\n 3.509425640106201,\n 1.6364113092422485,\n 0.025405975058674812\n ]\n },\n {\n \"name\": \"CC_Base_R_Eye\",\n \"parent\": \"CC_Base_FacialBone\",\n \"translation\": [\n 7.916625499725342,\n 8.004108428955078,\n -3.399050235748291\n ]\n },\n {\n \"name\": \"CC_Base_L_Eye\",\n \"parent\": \"CC_Base_FacialBone\",\n \"translation\": [\n 7.864105701446533,\n 7.835659027099609,\n 3.473083019256592\n ]\n },\n {\n \"name\": \"CC_Base_UpperJaw\",\n \"parent\": \"CC_Base_FacialBone\",\n \"translation\": [\n 3.261932373046875,\n 6.942871570587158,\n -0.02468101494014263\n ]\n },\n {\n \"name\": \"CC_Base_Teeth01\",\n \"parent\": \"CC_Base_UpperJaw\",\n \"translation\": [\n 0.09780752658843994,\n 0.021660717204213142,\n 0.023386476561427116\n ]\n },\n {\n \"name\": \"CC_Base_L_Clavicle\",\n \"parent\": \"CC_Base_Spine02\",\n \"translation\": [\n 5.846743106842041,\n 22.913326263427734,\n 0.15851521492004395\n ]\n },\n {\n \"name\": \"CC_Base_L_Upperarm\",\n \"parent\": \"CC_Base_L_Clavicle\",\n \"translation\": [\n 0.00006332993507385254,\n 13.675213813781738,\n 0.00040340423583984375\n ]\n },\n {\n \"name\": \"CC_Base_L_Forearm\",\n \"parent\": \"CC_Base_L_Upperarm\",\n \"translation\": [\n -0.0021000131964683533,\n 29.648496627807617,\n 0.0005214959383010864\n ]\n },\n {\n \"name\": \"CC_Base_L_ForearmTwist01\",\n \"parent\": \"CC_Base_L_Forearm\",\n \"translation\": [\n -0.00002450495958328247,\n -0.0000063749030232429504,\n 0.000005811452865600586\n ]\n },\n {\n \"name\": \"CC_Base_L_ForearmTwist02\",\n \"parent\": \"CC_Base_L_ForearmTwist01\",\n \"translation\": [\n -0.0017938688397407532,\n 12.154339790344238,\n -0.0031246542930603027\n ]\n },\n {\n \"name\": \"CC_Base_L_ElbowShareBone\",\n \"parent\": \"CC_Base_L_Forearm\",\n \"translation\": [\n -0.00002450495958328247,\n -0.0000063749030232429504,\n 0.000005811452865600586\n ]\n },\n {\n \"name\": \"CC_Base_L_Hand\",\n \"parent\": \"CC_Base_L_Forearm\",\n \"translation\": [\n -0.0032659247517585754,\n 24.308786392211914,\n -0.0040430426597595215\n ]\n },\n {\n \"name\": \"CC_Base_L_Pinky1\",\n \"parent\": \"CC_Base_L_Hand\",\n \"translation\": [\n 0.8387796878814697,\n 9.643739700317383,\n -1.8876361846923828\n ]\n },\n {\n \"name\": \"CC_Base_L_Pinky2\",\n \"parent\": \"CC_Base_L_Pinky1\",\n \"translation\": [\n 0.000396043062210083,\n 3.0504348278045654,\n -0.0001811981201171875\n ]\n },\n {\n \"name\": \"CC_Base_L_Pinky3\",\n \"parent\": \"CC_Base_L_Pinky2\",\n \"translation\": [\n 0.000038370490074157715,\n 1.9355652332305908,\n -0.00003510713577270508\n ]\n },\n {\n \"name\": \"CC_Base_L_Ring1\",\n \"parent\": \"CC_Base_L_Hand\",\n \"translation\": [\n 0.0010117590427398682,\n 9.706981658935547,\n 0.0030269622802734375\n ]\n },\n {\n \"name\": \"CC_Base_L_Ring2\",\n \"parent\": \"CC_Base_L_Ring1\",\n \"translation\": [\n -0.0001965165138244629,\n 4.398406982421875,\n -0.0005393028259277344\n ]\n },\n {\n \"name\": \"CC_Base_L_Ring3\",\n \"parent\": \"CC_Base_L_Ring2\",\n \"translation\": [\n -0.0008174926042556763,\n 3.074361801147461,\n 0.0006477683782577515\n ]\n },\n {\n \"name\": \"CC_Base_L_Mid1\",\n \"parent\": \"CC_Base_L_Hand\",\n \"translation\": [\n -0.6153436303138733,\n 9.996679306030273,\n 1.9597835540771484\n ]\n },\n {\n \"name\": \"CC_Base_L_Mid2\",\n \"parent\": \"CC_Base_L_Mid1\",\n \"translation\": [\n -0.0002244412899017334,\n 4.767321586608887,\n -0.000041157007217407227\n ]\n },\n {\n \"name\": \"CC_Base_L_Mid3\",\n \"parent\": \"CC_Base_L_Mid2\",\n \"translation\": [\n -0.0010398924350738525,\n 3.306338310241699,\n -0.0008061528205871582\n ]\n },\n {\n \"name\": \"CC_Base_L_Index1\",\n \"parent\": \"CC_Base_L_Hand\",\n \"translation\": [\n -0.4277152717113495,\n 9.799840927124023,\n 4.421895980834961\n ]\n },\n {\n \"name\": \"CC_Base_L_Index2\",\n \"parent\": \"CC_Base_L_Index1\",\n \"translation\": [\n -0.001440480351448059,\n 4.649103164672852,\n 0.001256398856639862\n ]\n },\n {\n \"name\": \"CC_Base_L_Index3\",\n \"parent\": \"CC_Base_L_Index2\",\n \"translation\": [\n -0.0005395412445068359,\n 2.933397054672241,\n 0.000052034854888916016\n ]\n },\n {\n \"name\": \"CC_Base_L_Thumb1\",\n \"parent\": \"CC_Base_L_Hand\",\n \"translation\": [\n 0.4729442000389099,\n 1.4073847532272339,\n 2.9682064056396484\n ]\n },\n {\n \"name\": \"CC_Base_L_Thumb2\",\n \"parent\": \"CC_Base_L_Thumb1\",\n \"translation\": [\n -0.00003701448440551758,\n 7.252772331237793,\n -0.00034561753273010254\n ]\n },\n {\n \"name\": \"CC_Base_L_Thumb3\",\n \"parent\": \"CC_Base_L_Thumb2\",\n \"translation\": [\n -0.0009371936321258545,\n 3.2246363162994385,\n -0.0003355741500854492\n ]\n },\n {\n \"name\": \"CC_Base_L_UpperarmTwist01\",\n \"parent\": \"CC_Base_L_Upperarm\",\n \"translation\": [\n -0.000024765729904174805,\n -0.000008791685104370117,\n -0.000004850327968597412\n ]\n },\n {\n \"name\": \"CC_Base_L_UpperarmTwist02\",\n \"parent\": \"CC_Base_L_UpperarmTwist01\",\n \"translation\": [\n -0.00005109608173370361,\n 14.824237823486328,\n -0.00004093348979949951\n ]\n },\n {\n \"name\": \"CC_Base_L_RibsTwist\",\n \"parent\": \"CC_Base_Spine02\",\n \"translation\": [\n 12.37477970123291,\n 4.240516662597656,\n 11.340028762817383\n ]\n },\n {\n \"name\": \"CC_Base_L_Breast\",\n \"parent\": \"CC_Base_L_RibsTwist\",\n \"translation\": [\n 0.000015254845493473113,\n 1.999998688697815,\n 0.00008869566954672337\n ]\n },\n {\n \"name\": \"CC_Base_R_RibsTwist\",\n \"parent\": \"CC_Base_Spine02\",\n \"translation\": [\n -12.366527557373047,\n 4.255687236785889,\n 11.342021942138672\n ]\n },\n {\n \"name\": \"CC_Base_R_Breast\",\n \"parent\": \"CC_Base_R_RibsTwist\",\n \"translation\": [\n -0.000014992387150414288,\n 1.9999765157699585,\n 0.0000698570511303842\n ]\n },\n {\n \"name\": \"CC_Base_R_Clavicle\",\n \"parent\": \"CC_Base_Spine02\",\n \"translation\": [\n -5.847836017608643,\n 22.913354873657227,\n 0.158738374710083\n ]\n },\n {\n \"name\": \"CC_Base_R_Upperarm\",\n \"parent\": \"CC_Base_R_Clavicle\",\n \"translation\": [\n -0.00038962066173553467,\n 13.675079345703125,\n 0.00013494491577148438\n ]\n },\n {\n \"name\": \"CC_Base_R_Forearm\",\n \"parent\": \"CC_Base_R_Upperarm\",\n \"translation\": [\n 0.0014372840523719788,\n 29.647546768188477,\n -0.00034911930561065674\n ]\n },\n {\n \"name\": \"CC_Base_R_ElbowShareBone\",\n \"parent\": \"CC_Base_R_Forearm\",\n \"translation\": [\n 0.00004427880048751831,\n -0.000005062669515609741,\n 0.0000019073486328125\n ]\n },\n {\n \"name\": \"CC_Base_R_ForearmTwist01\",\n \"parent\": \"CC_Base_R_Forearm\",\n \"translation\": [\n 0.00004427880048751831,\n -0.000005062669515609741,\n 0.0000019073486328125\n ]\n },\n {\n \"name\": \"CC_Base_R_ForearmTwist02\",\n \"parent\": \"CC_Base_R_ForearmTwist01\",\n \"translation\": [\n 0.0017296746373176575,\n 12.154948234558105,\n -0.0021570324897766113\n ]\n },\n {\n \"name\": \"CC_Base_R_Hand\",\n \"parent\": \"CC_Base_R_Forearm\",\n \"translation\": [\n 0.0013648197054862976,\n 24.31002426147461,\n -0.0003132820129394531\n ]\n },\n {\n \"name\": \"CC_Base_R_Ring1\",\n \"parent\": \"CC_Base_R_Hand\",\n \"translation\": [\n 0.0000073462724685668945,\n 9.707071304321289,\n -0.0007748603820800781\n ]\n },\n {\n \"name\": \"CC_Base_R_Ring2\",\n \"parent\": \"CC_Base_R_Ring1\",\n \"translation\": [\n 0.00015947222709655762,\n 4.398307800292969,\n -0.0006395876407623291\n ]\n },\n {\n \"name\": \"CC_Base_R_Ring3\",\n \"parent\": \"CC_Base_R_Ring2\",\n \"translation\": [\n -0.0010596513748168945,\n 3.074486494064331,\n -0.00025691837072372437\n ]\n },\n {\n \"name\": \"CC_Base_R_Mid1\",\n \"parent\": \"CC_Base_R_Hand\",\n \"translation\": [\n 0.6159845590591431,\n 9.997448921203613,\n 1.9559621810913086\n ]\n },\n {\n \"name\": \"CC_Base_R_Mid2\",\n \"parent\": \"CC_Base_R_Mid1\",\n \"translation\": [\n 0.000445440411567688,\n 4.767148494720459,\n -0.00016441941261291504\n ]\n },\n {\n \"name\": \"CC_Base_R_Mid3\",\n \"parent\": \"CC_Base_R_Mid2\",\n \"translation\": [\n 0.00012923777103424072,\n 3.306414842605591,\n 0.00005930662155151367\n ]\n },\n {\n \"name\": \"CC_Base_R_Thumb1\",\n \"parent\": \"CC_Base_R_Hand\",\n \"translation\": [\n -0.4736732244491577,\n 1.408708095550537,\n 2.9675445556640625\n ]\n },\n {\n \"name\": \"CC_Base_R_Thumb2\",\n \"parent\": \"CC_Base_R_Thumb1\",\n \"translation\": [\n 0.0003608446568250656,\n 7.252943515777588,\n -0.000981692224740982\n ]\n },\n {\n \"name\": \"CC_Base_R_Thumb3\",\n \"parent\": \"CC_Base_R_Thumb2\",\n \"translation\": [\n -0.000009268522262573242,\n 3.2248055934906006,\n 0.00004887580871582031\n ]\n },\n {\n \"name\": \"CC_Base_R_Index1\",\n \"parent\": \"CC_Base_R_Hand\",\n \"translation\": [\n 0.4276627004146576,\n 9.801568984985352,\n 4.418048858642578\n ]\n },\n {\n \"name\": \"CC_Base_R_Index2\",\n \"parent\": \"CC_Base_R_Index1\",\n \"translation\": [\n 0.001061864197254181,\n 4.648791790008545,\n 0.0006793588399887085\n ]\n },\n {\n \"name\": \"CC_Base_R_Index3\",\n \"parent\": \"CC_Base_R_Index2\",\n \"translation\": [\n -0.0006211921572685242,\n 2.9368622303009033,\n -0.00016835331916809082\n ]\n },\n {\n \"name\": \"CC_Base_R_Pinky1\",\n \"parent\": \"CC_Base_R_Hand\",\n \"translation\": [\n -0.837287962436676,\n 9.643238067626953,\n -1.891557216644287\n ]\n },\n {\n \"name\": \"CC_Base_R_Pinky2\",\n \"parent\": \"CC_Base_R_Pinky1\",\n \"translation\": [\n -0.0003053247928619385,\n 3.050346851348877,\n -0.00022897124290466309\n ]\n },\n {\n \"name\": \"CC_Base_R_Pinky3\",\n \"parent\": \"CC_Base_R_Pinky2\",\n \"translation\": [\n -0.000006973743438720703,\n 1.9355270862579346,\n 0.0000015944242477416992\n ]\n },\n {\n \"name\": \"CC_Base_R_UpperarmTwist01\",\n \"parent\": \"CC_Base_R_Upperarm\",\n \"translation\": [\n 0.000004403293132781982,\n 0.0000033676624298095703,\n -0.000002473592758178711\n ]\n },\n {\n \"name\": \"CC_Base_R_UpperarmTwist02\",\n \"parent\": \"CC_Base_R_UpperarmTwist01\",\n \"translation\": [\n -0.0015784502029418945,\n 14.823780059814453,\n -0.0003107339143753052\n ]\n }\n ]\n}\n","import * as THREE from 'three';\n\nimport jonathanCcBaseTemplate from './data/jonathan-cc-base.json';\n\nexport type HumanoidSkeletonTemplateVec3 = readonly [number, number, number];\nexport type HumanoidSkeletonTemplateBounds = readonly [number, number, number, number, number, number];\n\nexport interface HumanoidSkeletonTemplateBone {\n readonly name: string;\n readonly parent: string | null;\n readonly translation: HumanoidSkeletonTemplateVec3;\n}\n\nexport interface HumanoidSkeletonTemplate {\n readonly id: string;\n readonly sourceCharacterId: string;\n readonly sourceAsset: string;\n readonly sourceSkinName: string;\n readonly bones: readonly HumanoidSkeletonTemplateBone[];\n}\n\nexport interface ExtractHumanoidSkeletonTemplateOptions {\n readonly id: string;\n readonly sourceCharacterId: string;\n readonly sourceAsset?: string;\n readonly sourceSkinName?: string;\n}\n\nexport const HUMANOID_SKELETON_TEMPLATES = [\n jonathanCcBaseTemplate as unknown as HumanoidSkeletonTemplate,\n] as const;\n\nexport const JONATHAN_HUMANOID_SKELETON_TEMPLATE = HUMANOID_SKELETON_TEMPLATES[0];\n\nexport function getHumanoidSkeletonTemplate(templateId: string): HumanoidSkeletonTemplate | null {\n return HUMANOID_SKELETON_TEMPLATES.find((template) => template.id === templateId) ?? null;\n}\n\nexport function getHumanoidSkeletonTemplateBoneNames(\n template: HumanoidSkeletonTemplate = JONATHAN_HUMANOID_SKELETON_TEMPLATE,\n): string[] {\n return template.bones.map((bone) => bone.name);\n}\n\nexport function createValidationSkeletonFromHumanoidTemplate(\n template: HumanoidSkeletonTemplate = JONATHAN_HUMANOID_SKELETON_TEMPLATE,\n): { bones: Array<{ name: string }> } {\n return {\n bones: template.bones.map((bone) => ({ name: bone.name })),\n };\n}\n\nexport function computeHumanoidSkeletonTemplateRestBounds(\n template: HumanoidSkeletonTemplate,\n): HumanoidSkeletonTemplateBounds {\n const worldPositions = new Map<string, HumanoidSkeletonTemplateVec3>();\n const unresolved = new Set(template.bones.map((bone) => bone.name));\n\n while (unresolved.size > 0) {\n let resolvedThisPass = 0;\n\n for (const bone of template.bones) {\n if (!unresolved.has(bone.name)) continue;\n\n if (bone.parent === null) {\n worldPositions.set(bone.name, bone.translation);\n unresolved.delete(bone.name);\n resolvedThisPass += 1;\n continue;\n }\n\n const parentPosition = worldPositions.get(bone.parent);\n if (!parentPosition) continue;\n\n worldPositions.set(bone.name, addVec3(parentPosition, bone.translation));\n unresolved.delete(bone.name);\n resolvedThisPass += 1;\n }\n\n if (resolvedThisPass === 0) {\n throw new Error(`Unable to resolve humanoid skeleton template parent links for: ${Array.from(unresolved).join(', ')}`);\n }\n }\n\n const bounds: [number, number, number, number, number, number] = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ];\n\n for (const position of worldPositions.values()) {\n bounds[0] = Math.min(bounds[0], position[0]);\n bounds[1] = Math.min(bounds[1], position[1]);\n bounds[2] = Math.min(bounds[2], position[2]);\n bounds[3] = Math.max(bounds[3], position[0]);\n bounds[4] = Math.max(bounds[4], position[1]);\n bounds[5] = Math.max(bounds[5], position[2]);\n }\n\n return bounds;\n}\n\nexport function extractHumanoidSkeletonTemplateFromModel(\n root: THREE.Object3D,\n options: ExtractHumanoidSkeletonTemplateOptions,\n): HumanoidSkeletonTemplate {\n assertNonEmptyString(options.id, 'id');\n assertNonEmptyString(options.sourceCharacterId, 'sourceCharacterId');\n\n const bones: HumanoidSkeletonTemplateBone[] = [];\n\n root.traverse((object) => {\n if (!isBoneObject(object)) return;\n if (!object.name) {\n throw new Error('Cannot extract humanoid skeleton template from an unnamed bone');\n }\n\n const parent = isBoneObject(object.parent) ? object.parent.name || null : null;\n bones.push({\n name: object.name,\n parent,\n translation: [object.position.x, object.position.y, object.position.z],\n });\n });\n\n if (bones.length === 0) {\n throw new Error('Cannot extract humanoid skeleton template from a model with no bones');\n }\n\n return {\n id: options.id,\n sourceCharacterId: options.sourceCharacterId,\n sourceAsset: options.sourceAsset ?? '',\n sourceSkinName: options.sourceSkinName ?? '',\n bones,\n };\n}\n\nfunction isBoneObject(object: THREE.Object3D | null | undefined): object is THREE.Bone {\n return object instanceof THREE.Bone || object?.type === 'Bone';\n}\n\nfunction assertNonEmptyString(value: string, fieldName: string): void {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${fieldName} must be a non-empty string`);\n }\n}\n\nfunction addVec3(\n a: HumanoidSkeletonTemplateVec3,\n b: HumanoidSkeletonTemplateVec3,\n): HumanoidSkeletonTemplateVec3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n"]}
|