@lovelace_lol/embody 0.0.7 → 0.0.9

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.
Files changed (134) hide show
  1. package/README.md +541 -2394
  2. package/dist/index.d.ts +2 -100
  3. package/dist/index.js +9197 -13851
  4. package/dist/index.js.map +1 -1
  5. package/dist/three/annotations/DOMControls.d.ts +73 -0
  6. package/dist/three/annotations/DPthree.d.ts +113 -0
  7. package/dist/three/annotations/DPthree3DMarkers.d.ts +319 -0
  8. package/dist/three/annotations/DPthreeCameraController.d.ts +415 -0
  9. package/dist/three/annotations/DPthreeHTMLMarkers.d.ts +131 -0
  10. package/dist/three/annotations/DPthreeMarkers.d.ts +52 -0
  11. package/dist/three/annotations/adapter.d.ts +157 -0
  12. package/dist/three/annotations/animationFrameTaskScheduler.d.ts +18 -0
  13. package/dist/three/annotations/annotationAnchorModel.d.ts +16 -0
  14. package/dist/three/annotations/annotationCameraCore.d.ts +5 -0
  15. package/dist/three/annotations/boneResolutionProfile.d.ts +7 -0
  16. package/dist/three/annotations/index.d.ts +20 -0
  17. package/dist/three/annotations/loadFrame.d.ts +2 -0
  18. package/dist/three/annotations/markerSurfaceRaycast.d.ts +11 -0
  19. package/dist/three/annotations/markerVisibilityLifecycle.d.ts +21 -0
  20. package/dist/three/annotations/modelRenderPreparation.d.ts +6 -0
  21. package/dist/three/annotations/runtimeAnnotationPreview.d.ts +15 -0
  22. package/dist/three/annotations/runtimeAnnotationPreviewSide.d.ts +10 -0
  23. package/dist/three/annotations/runtimeAnnotationSidePreview.d.ts +5 -0
  24. package/dist/three/annotations/types.d.ts +262 -0
  25. package/dist/three/authoring.d.ts +95 -0
  26. package/dist/three/authoringTypes.d.ts +576 -0
  27. package/dist/three/character.d.ts +243 -0
  28. package/dist/three/characterHost.d.ts +48 -0
  29. package/dist/three/clipBindings.d.ts +6 -0
  30. package/dist/three/index.d.ts +171 -0
  31. package/dist/three/model.d.ts +31 -0
  32. package/dist/three/modelSkinning.d.ts +3 -0
  33. package/dist/three/nativePlayback.d.ts +121 -0
  34. package/dist/three/playbackRendering.d.ts +14 -0
  35. package/dist/three/reference-pose.d.ts +73 -0
  36. package/dist/three/scene.d.ts +253 -0
  37. package/dist/three/sceneRenderingBinding.d.ts +22 -0
  38. package/dist/three.js +9252 -8844
  39. package/dist/three.js.map +1 -1
  40. package/dist/wasm/README.md +551 -62
  41. package/dist/wasm/auto.d.ts +1 -0
  42. package/dist/wasm/compatibility.d.ts +14 -0
  43. package/dist/wasm/embody_wasm.d.ts +352 -71
  44. package/dist/wasm/embody_wasm.js +1266 -37
  45. package/dist/wasm/embody_wasm_bg.wasm +0 -0
  46. package/dist/wasm/embody_wasm_bg.wasm.d.ts +113 -54
  47. package/dist/wasm/index.d.ts +131 -0
  48. package/dist/wasm.d.ts +1 -43
  49. package/dist/wasm.js +1100 -239
  50. package/dist/wasm.js.map +1 -1
  51. package/package.json +35 -39
  52. package/service-worker/character-asset-service-worker.js +295 -0
  53. package/dist/authoring/boneAuthoring.d.ts +0 -132
  54. package/dist/camera/annotationCameraAngles.d.ts +0 -28
  55. package/dist/camera/cameraRelativeGaze.d.ts +0 -15
  56. package/dist/camera/rustAnnotationCameraCore.d.ts +0 -136
  57. package/dist/cljs.cjs +0 -362
  58. package/dist/cljs.cjs.map +0 -1
  59. package/dist/cljs.d.ts +0 -5
  60. package/dist/cljs.js +0 -359
  61. package/dist/cljs.js.map +0 -1
  62. package/dist/core/TsClipCompiler.d.ts +0 -51
  63. package/dist/core/WasmRuntimeCore.d.ts +0 -41
  64. package/dist/core/compositeAxis.d.ts +0 -4
  65. package/dist/core/contracts/abi.d.ts +0 -70
  66. package/dist/core/contracts/clip.d.ts +0 -44
  67. package/dist/core/contracts/frame.d.ts +0 -27
  68. package/dist/core/contracts/host.d.ts +0 -28
  69. package/dist/core/contracts/ids.d.ts +0 -15
  70. package/dist/core/contracts/index.d.ts +0 -10
  71. package/dist/core/contracts/model.d.ts +0 -31
  72. package/dist/core/contracts/primitives.d.ts +0 -17
  73. package/dist/core/contracts/skeletonFit.d.ts +0 -41
  74. package/dist/core/index.d.ts +0 -6
  75. package/dist/core/types.d.ts +0 -472
  76. package/dist/core.cjs +0 -343
  77. package/dist/core.cjs.map +0 -1
  78. package/dist/core.js +0 -323
  79. package/dist/core.js.map +0 -1
  80. package/dist/engines/three/Embody.d.ts +0 -372
  81. package/dist/engines/three/ThreeAnimationRuntime.d.ts +0 -203
  82. package/dist/engines/three/ThreeClipAdapter.d.ts +0 -24
  83. package/dist/engines/three/ThreeFrameApplier.d.ts +0 -68
  84. package/dist/engines/three/ThreeModelInspector.d.ts +0 -54
  85. package/dist/engines/three/bakedClipPartitioning.d.ts +0 -16
  86. package/dist/engines/three/balanceUtils.d.ts +0 -3
  87. package/dist/engines/three/characterHost.d.ts +0 -80
  88. package/dist/engines/three/characterScene.d.ts +0 -98
  89. package/dist/engines/three/hair/HairPhysicsController.d.ts +0 -124
  90. package/dist/engines/three/index.d.ts +0 -20
  91. package/dist/engines/three/modelLoader.d.ts +0 -61
  92. package/dist/engines/three/profileTestScene.d.ts +0 -52
  93. package/dist/engines/three/types.d.ts +0 -20
  94. package/dist/hair/appearance.d.ts +0 -29
  95. package/dist/index.cjs +0 -14871
  96. package/dist/index.cjs.map +0 -1
  97. package/dist/interfaces/Animation.d.ts +0 -315
  98. package/dist/interfaces/EmbodyRuntime.d.ts +0 -90
  99. package/dist/interfaces/Hair.d.ts +0 -181
  100. package/dist/interfaces/HairPhysics.d.ts +0 -90
  101. package/dist/interfaces/index.d.ts +0 -11
  102. package/dist/mappings/extendPresetWithProfile.d.ts +0 -17
  103. package/dist/mappings/types.d.ts +0 -309
  104. package/dist/mappings/visemeSystem.d.ts +0 -26
  105. package/dist/physics/HairPhysics.d.ts +0 -86
  106. package/dist/physics/RustHairPhysics.d.ts +0 -18
  107. package/dist/physics/index.d.ts +0 -6
  108. package/dist/preset.cjs +0 -2005
  109. package/dist/preset.cjs.map +0 -1
  110. package/dist/preset.js +0 -2003
  111. package/dist/preset.js.map +0 -1
  112. package/dist/presets/bettaFish.d.ts +0 -328
  113. package/dist/presets/cc4.d.ts +0 -145
  114. package/dist/presets/index.d.ts +0 -30
  115. package/dist/presets/registry.d.ts +0 -57
  116. package/dist/profiles/resolveProfileConfig.d.ts +0 -36
  117. package/dist/profiles/rustResolvedProfile.d.ts +0 -31
  118. package/dist/profiles/types.d.ts +0 -118
  119. package/dist/regions/normalizeRegionTree.d.ts +0 -6
  120. package/dist/regions/regionMapping.d.ts +0 -17
  121. package/dist/regions/types.d.ts +0 -122
  122. package/dist/skeletonTemplates/humanoidSkeletonTemplates.d.ts +0 -32
  123. package/dist/test/setupWasm.d.ts +0 -1
  124. package/dist/three.cjs +0 -9550
  125. package/dist/three.cjs.map +0 -1
  126. package/dist/validation/analyzeModel.d.ts +0 -68
  127. package/dist/validation/extractModelData.d.ts +0 -90
  128. package/dist/validation/generateMappingCorrections.d.ts +0 -32
  129. package/dist/validation/geometryHelpers.d.ts +0 -66
  130. package/dist/validation/types.d.ts +0 -10
  131. package/dist/validation/validateMappings.d.ts +0 -77
  132. package/dist/wasm.cjs +0 -302
  133. package/dist/wasm.cjs.map +0 -1
  134. package/dist/wasmTypes.d.ts +0 -123
package/dist/three.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/compositeAxis.ts","../src/mappings/visemeSystem.ts","../src/engines/three/balanceUtils.ts","../src/engines/three/bakedClipPartitioning.ts","../src/engines/three/ThreeAnimationRuntime.ts","../src/engines/three/ThreeModelInspector.ts","../src/engines/three/ThreeFrameApplier.ts","../src/core/contracts/abi.ts","../src/core/WasmRuntimeCore.ts","../src/hair/appearance.ts","../src/presets/cc4.ts","../src/engines/three/hair/HairPhysicsController.ts","../src/mappings/extendPresetWithProfile.ts","../src/presets/bettaFish.ts","../src/presets/registry.ts","../src/presets/index.ts","../src/engines/three/Embody.ts","../src/engines/three/ThreeClipAdapter.ts","../src/engines/three/characterScene.ts","../src/engines/three/modelLoader.ts","../src/engines/three/characterHost.ts"],"names":["PropertyBinding","AnimationClip","action","duration","state","loopMode","playbackRate","reverse","Vector3","morphTargetId","Quaternion","AU_INFO","CONTINUUM_PAIRS_MAP","CONTINUUM_LABELS","COMPOSITE_ROTATIONS","X_AXIS","Y_AXIS","Z_AXIS","clamp01","initEmbodyCore","Box3","collectMorphMeshes","targets","empty","suffix","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","Mesh","deg2rad","MathUtils"],"mappings":"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","file":"three.js","sourcesContent":["import type { AUSelector, BoneBinding, RotationAxis } from './types';\n\nexport function toAUList(value?: AUSelector): number[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction findBoneBindingForNode(\n auToBones: Record<number, BoneBinding[]>,\n auId: number,\n nodeKey: string\n): BoneBinding | null {\n return auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n}\n\nexport function getCompositeAxisValue(\n axisConfig: RotationAxis | null | undefined,\n getValue: (auId: number) => number\n): number {\n if (!axisConfig) return 0;\n\n const negativeAUs = toAUList(axisConfig.negative);\n const positiveAUs = toAUList(axisConfig.positive);\n\n if (negativeAUs.length > 0 && positiveAUs.length > 0) {\n const negativeValue = Math.max(...negativeAUs.map(getValue), 0);\n const positiveValue = Math.max(...positiveAUs.map(getValue), 0);\n return positiveValue - negativeValue;\n }\n\n if (axisConfig.aus.length > 1) {\n return Math.max(...axisConfig.aus.map(getValue), 0);\n }\n\n return getValue(axisConfig.aus[0]);\n}\n\nexport function getCompositeAxisBinding(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined,\n direction: number,\n getValue: (auId: number) => number,\n auToBones: Record<number, BoneBinding[]>\n): BoneBinding | null {\n if (!axisConfig) return null;\n\n const directionalAUs = direction < 0 ? toAUList(axisConfig.negative) : toAUList(axisConfig.positive);\n const candidates = directionalAUs.length > 0 ? directionalAUs : axisConfig.aus;\n const ranked = [...candidates].sort((a, b) => getValue(b) - getValue(a));\n\n for (const auId of ranked) {\n const binding = findBoneBindingForNode(auToBones, auId, nodeKey);\n if (binding) return binding;\n }\n\n return null;\n}\n","import type {\n MappingEditorModel,\n MappingEditorSection,\n MorphCandidate,\n MorphCandidateMatch,\n MorphTargetRef,\n Profile,\n VisemeBinding,\n VisemeSlot,\n} from './types';\n\nfunction hasOwn<T extends object>(value: T | undefined, key: string): boolean {\n return Boolean(value && Object.prototype.hasOwnProperty.call(value, key));\n}\n\nfunction toSlotId(label: string, index: number): string {\n const normalized = label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return normalized || `viseme-${index}`;\n}\n\nfunction bindingTargets(binding: VisemeBinding | undefined): MorphTargetRef[] {\n if (!binding) return [];\n const targets = binding.targets?.map((target) => target.morph).filter((morph) => morph !== '');\n if (targets && targets.length > 0) return targets;\n return binding.morph !== undefined && binding.morph !== '' ? [binding.morph] : [];\n}\n\nexport interface ResolvedVisemeBindingTarget {\n morph: MorphTargetRef;\n weight: number;\n}\n\nfunction normalizeBindingWeight(weight: number | undefined): number {\n return Number.isFinite(weight) ? Math.max(0, weight ?? 1) : 1;\n}\n\nexport function getProfileVisemeSlots(profile: Profile): VisemeSlot[] {\n if (profile.visemeSlots && profile.visemeSlots.length > 0) {\n return [...profile.visemeSlots].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n\n return (profile.visemeKeys || []).map((key, index) => {\n const label = typeof key === 'string' && key ? key : `Viseme ${index}`;\n return {\n id: toSlotId(label, index),\n label,\n order: index,\n defaultJawAmount: profile.visemeJawAmounts?.[index],\n };\n });\n}\n\nexport function getVisemeSlotIndex(profile: Profile, slotId: string): number {\n return getProfileVisemeSlots(profile).findIndex((slot) => slot.id === slotId);\n}\n\nexport function compileVisemeKeys(profile: Profile): MorphTargetRef[] {\n const slots = getProfileVisemeSlots(profile);\n if (!profile.visemeBindings) return [...(profile.visemeKeys || [])];\n\n return slots.map((slot, index) => {\n const target = bindingTargets(profile.visemeBindings?.[slot.id])[0];\n return target ?? profile.visemeKeys?.[index] ?? '';\n });\n}\n\nexport function getVisemeBindingTargets(profile: Profile, visemeIndex: number): ResolvedVisemeBindingTarget[] {\n const slots = getProfileVisemeSlots(profile);\n const slot = slots[visemeIndex];\n const binding = slot ? profile.visemeBindings?.[slot.id] : undefined;\n\n const boundTargets = binding?.targets\n ?.filter((target) => target.morph !== undefined && target.morph !== '')\n .map((target) => ({\n morph: target.morph,\n weight: normalizeBindingWeight(target.weight),\n }));\n\n if (boundTargets && boundTargets.length > 0) {\n return boundTargets;\n }\n\n if (binding?.morph !== undefined && binding.morph !== '') {\n return [{ morph: binding.morph, weight: 1 }];\n }\n\n const legacyTarget = profile.visemeKeys?.[visemeIndex];\n return legacyTarget !== undefined && legacyTarget !== ''\n ? [{ morph: legacyTarget, weight: 1 }]\n : [];\n}\n\nexport function getVisemeJawAmounts(profile: Profile): number[] | undefined {\n const slots = getProfileVisemeSlots(profile);\n if (slots.length === 0) return profile.visemeJawAmounts ? [...profile.visemeJawAmounts] : undefined;\n return slots.map((slot, index) => slot.defaultJawAmount ?? profile.visemeJawAmounts?.[index] ?? 0);\n}\n\nexport function resolveVisemeMeshCategory(profile: Profile): string {\n const morphToMesh = profile.morphToMesh || {};\n if (profile.visemeMeshCategory) return profile.visemeMeshCategory;\n if (hasOwn(morphToMesh, 'viseme')) return 'viseme';\n return 'face';\n}\n\nexport function getMeshNamesForVisemeProfile(profile: Profile): string[] {\n const morphToMesh: Record<string, string[]> = profile.morphToMesh || {};\n const category = resolveVisemeMeshCategory(profile);\n if (hasOwn(morphToMesh, category)) {\n return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n }\n return profile.visemeMeshCategory ? [] : [...(morphToMesh.face || [])];\n}\n\nexport function getMeshNamesForAUProfile(profile: Profile, auId: number): string[] {\n const morphToMesh = profile.morphToMesh || {};\n const facePart = profile.auInfo?.[String(auId)]?.facePart;\n const category = facePart ? profile.auFacePartToMeshCategory?.[facePart] : undefined;\n if (category) return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n return [...(morphToMesh.face || [])];\n}\n\nfunction compileMatcher(pattern: string): RegExp | null {\n try {\n return new RegExp(pattern, 'i');\n } catch {\n return null;\n }\n}\n\nfunction classifyVisemeMorph(morphName: string, profile: Profile): MorphCandidateMatch[] {\n const slots = getProfileVisemeSlots(profile);\n const matches: MorphCandidateMatch[] = [];\n\n for (const slot of slots) {\n const explicitTargets = bindingTargets(profile.visemeBindings?.[slot.id]);\n if (explicitTargets.some((target) => String(target).toLowerCase() === morphName.toLowerCase())) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 1,\n reason: 'explicit',\n });\n continue;\n }\n\n for (const pattern of slot.matchers || []) {\n const matcher = compileMatcher(pattern);\n if (matcher?.test(morphName)) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 0.75,\n reason: 'regex',\n pattern,\n });\n }\n }\n }\n\n return matches;\n}\n\nexport function buildMappingEditorModel(profile: Profile, morphNames: string[] = []): MappingEditorModel {\n const sections = new Map<string, MappingEditorSection>();\n const configuredSections = profile.mappingSections || [];\n const configuredById = new Map(configuredSections.map((section) => [section.id, section]));\n let nextOrder = configuredSections.length;\n\n for (const section of configuredSections) {\n sections.set(section.id, { ...section });\n }\n\n const getOrder = (id: string, fallback?: number): number => {\n const configured = configuredById.get(id);\n if (configured) return configured.order;\n if (fallback !== undefined) return fallback;\n const order = nextOrder;\n nextOrder += 1;\n return order;\n };\n\n const auSectionOrders = new Map<string, number>();\n for (const [auId, info] of Object.entries(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n auSectionOrders.set(label, Math.min(auSectionOrders.get(label) ?? Number.MAX_SAFE_INTEGER, Number(auId)));\n }\n if (configuredSections.length === 0 && auSectionOrders.size > 0) {\n nextOrder = Math.max(...auSectionOrders.values()) + 1;\n }\n\n for (const info of Object.values(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n const configured = configuredById.get(label);\n const meshCategory = profile.auFacePartToMeshCategory?.[label] || 'face';\n sections.set(label, {\n ...configured,\n id: label,\n label: configured?.label || label,\n kind: 'au',\n order: getOrder(label, auSectionOrders.get(label)),\n meshCategory: configured?.meshCategory || meshCategory,\n facePart: label,\n });\n }\n\n const configuredVisemes = configuredById.get('Visemes');\n sections.set('Visemes', {\n ...configuredVisemes,\n id: 'Visemes',\n label: configuredVisemes?.label || 'Visemes',\n kind: 'viseme',\n order: getOrder('Visemes'),\n meshCategory: configuredVisemes?.meshCategory || resolveVisemeMeshCategory(profile),\n });\n\n if (hasOwn(profile.morphToMesh, 'hair')) {\n const configuredHair = configuredById.get('Hair');\n sections.set('Hair', {\n ...configuredHair,\n id: 'Hair',\n label: configuredHair?.label || 'Hair',\n kind: 'hair',\n order: getOrder('Hair'),\n meshCategory: configuredHair?.meshCategory || 'hair',\n });\n }\n\n const configuredUnmapped = configuredById.get('Unmapped');\n sections.set('Unmapped', {\n ...configuredUnmapped,\n id: 'Unmapped',\n label: configuredUnmapped?.label || 'Unmapped',\n kind: 'unmapped',\n order: getOrder('Unmapped'),\n meshCategory: configuredUnmapped?.meshCategory || 'face',\n });\n\n const candidates: MorphCandidate[] = morphNames.map((morph) => {\n const matches = classifyVisemeMorph(morph, profile);\n if (matches.length === 0) {\n return { morph, sectionId: 'Unmapped', kind: 'unmapped', matches };\n }\n const explicit = matches.filter((match) => match.reason === 'explicit');\n if (explicit.length > 0) {\n return { morph, sectionId: 'Visemes', kind: 'explicit', matches: explicit };\n }\n return {\n morph,\n sectionId: 'Visemes',\n kind: matches.length > 1 ? 'conflict' : 'candidate',\n matches,\n };\n });\n\n return {\n sections: Array.from(sections.values()).sort((a, b) => a.order - b.order || a.label.localeCompare(b.label)),\n candidates,\n };\n}\n\nexport interface ProviderVisemeEvent {\n provider: string;\n id?: string | number;\n phoneme?: string;\n}\n\nexport interface ProviderVisemeMatch {\n slotId: string;\n index: number;\n confidence: number;\n reason: 'provider' | 'phoneme' | 'rest' | 'none';\n}\n\nexport function mapProviderVisemeToSlot(profile: Profile, event: ProviderVisemeEvent): ProviderVisemeMatch | null {\n const slots = getProfileVisemeSlots(profile);\n const provider = event.provider.toLowerCase();\n\n if (event.id !== undefined) {\n const id = String(event.id);\n const index = slots.findIndex((slot) =>\n (slot.providerIds?.[provider] || []).some((candidate) => String(candidate) === id)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 1, reason: 'provider' };\n }\n }\n\n if (event.phoneme) {\n const phoneme = event.phoneme.toLowerCase();\n const index = slots.findIndex((slot) =>\n (slot.phonemes || []).some((candidate) => candidate.toLowerCase() === phoneme)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 0.8, reason: 'phoneme' };\n }\n }\n\n const restIndex = slots.findIndex((slot) => slot.id === 'rest' || slot.features?.lipClosed === 1);\n if (restIndex >= 0) {\n return { slotId: slots[restIndex].id, index: restIndex, confidence: 0.25, reason: 'rest' };\n }\n\n return null;\n}\n","export function clampBalance(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(-1, Math.min(1, value));\n}\n\nexport function getSideScale(\n balance: number,\n side?: 'left' | 'right'\n): number {\n if (side !== 'left' && side !== 'right') return 1;\n\n const clamped = clampBalance(balance);\n if (side === 'left') {\n return clamped > 0 ? 1 - clamped : 1;\n }\n return clamped < 0 ? 1 + clamped : 1;\n}\n\nexport function resolveCurveBalance(\n curveId: string,\n globalBalance: number,\n balanceMap?: Record<string, number>\n): number {\n if (balanceMap && Object.prototype.hasOwnProperty.call(balanceMap, curveId)) {\n return clampBalance(Number(balanceMap[curveId]));\n }\n return clampBalance(globalBalance);\n}\n","import {\n AnimationClip,\n KeyframeTrack,\n Object3D,\n PropertyBinding,\n} from 'three';\nimport type {\n AnimationBlendMode,\n BakedClipChannel,\n BakedClipChannelInfo,\n} from '../../core/types';\nimport type { ResolvedBones } from './types';\n\nconst MIXER_CLIP_PREFIX = '__embody_baked_partition__/';\nconst FACE_SAFE_TARGET_RE = /(head|neck|jaw|eye|brow|lid|mouth|lip|face|cheek|nose|tongue|teeth)/i;\nconst BODY_LIKE_TARGET_RE = /(root|armature|hips?|pelvis|spine|waist|chest|torso|shoulder|arm|forearm|hand|finger|leg|thigh|calf|knee|foot|toe|tail|wing|fin|body|abdomen|clavicle)/i;\nconst SCENE_LIKE_TARGET_RE = /(camera|cam|scene|world|global|origin|pivot|cube)/i;\nconst CHANNEL_ORDER: BakedClipChannel[] = ['face', 'body', 'scene'];\n\nexport interface PartitionedBakedMixerClip {\n channel: BakedClipChannel;\n clip: AnimationClip;\n}\n\nexport interface PartitionedBakedClip {\n sourceClip: AnimationClip;\n channels: BakedClipChannelInfo[];\n mixerClips: PartitionedBakedMixerClip[];\n}\n\ntype ParsedTrackTarget = {\n propertyName: string;\n target: Object3D | null;\n targetName: string;\n};\n\nfunction getMixerClipName(sourceClipName: string, channel: BakedClipChannel): string {\n return `${MIXER_CLIP_PREFIX}${sourceClipName}/${channel}`;\n}\n\nfunction parseTrackTarget(trackName: string, model: Object3D): ParsedTrackTarget | null {\n let parsed: ReturnType<typeof PropertyBinding.parseTrackName>;\n\n try {\n parsed = PropertyBinding.parseTrackName(trackName);\n } catch {\n return null;\n }\n\n const targetKey = parsed.objectName === 'bones' && parsed.objectIndex\n ? String(parsed.objectIndex)\n : parsed.nodeName;\n const target = targetKey\n ? model.getObjectByProperty('uuid', targetKey) ?? PropertyBinding.findNode(model, targetKey)\n : null;\n\n return {\n propertyName: parsed.propertyName,\n target,\n targetName: target?.name ?? parsed.nodeName ?? '',\n };\n}\n\nfunction isSceneTrackTarget(target: Object3D | null, targetName: string): boolean {\n if (!target) return true;\n if ((target as { isCamera?: boolean }).isCamera) return true;\n return SCENE_LIKE_TARGET_RE.test(targetName);\n}\n\nfunction isFaceSafeTransformTarget(\n target: Object3D | null,\n targetName: string,\n safeTransformTargets: Set<Object3D>\n): boolean {\n if (target && safeTransformTargets.has(target)) {\n return true;\n }\n if (!targetName) {\n return false;\n }\n if (BODY_LIKE_TARGET_RE.test(targetName) || SCENE_LIKE_TARGET_RE.test(targetName)) {\n return false;\n }\n return FACE_SAFE_TARGET_RE.test(targetName);\n}\n\nexport function classifyBakedTrack(\n track: KeyframeTrack,\n model: Object3D,\n bones: ResolvedBones\n): BakedClipChannel {\n const parsed = parseTrackTarget(track.name, model);\n if (!parsed) {\n return 'scene';\n }\n\n if (parsed.propertyName === 'morphTargetInfluences' || parsed.propertyName === 'weights') {\n return 'face';\n }\n\n if (isSceneTrackTarget(parsed.target, parsed.targetName)) {\n return 'scene';\n }\n\n if (parsed.propertyName === 'quaternion') {\n const safeTransformTargets = new Set(\n Object.values(bones)\n .map((entry) => entry?.obj)\n .filter((entry): entry is Object3D => !!entry)\n );\n\n if (isFaceSafeTransformTarget(parsed.target, parsed.targetName, safeTransformTargets)) {\n return 'face';\n }\n }\n\n return 'body';\n}\n\nexport function resolveBakedChannelBlendMode(\n channel: BakedClipChannel,\n requestedBlendMode: AnimationBlendMode\n): AnimationBlendMode | undefined {\n if (channel === 'face') {\n return requestedBlendMode === 'additive' ? 'additive' : 'replace';\n }\n if (channel === 'body') {\n return 'replace';\n }\n return undefined;\n}\n\nexport function resolveBakedAggregateBlendMode(\n channels: BakedClipChannelInfo[],\n requestedBlendMode: AnimationBlendMode\n): AnimationBlendMode {\n if (requestedBlendMode !== 'additive') {\n return 'replace';\n }\n\n return channels.some((channel) => (\n channel.channel === 'face'\n && channel.playable\n && channel.trackCount > 0\n ))\n ? 'additive'\n : 'replace';\n}\n\nexport function partitionBakedClip(\n clip: AnimationClip,\n model: Object3D,\n bones: ResolvedBones\n): PartitionedBakedClip {\n const tracksByChannel = new Map<BakedClipChannel, KeyframeTrack[]>(\n CHANNEL_ORDER.map((channel) => [channel, []])\n );\n\n for (const track of clip.tracks) {\n const channel = classifyBakedTrack(track, model, bones);\n tracksByChannel.get(channel)?.push(track.clone());\n }\n\n const mixerClips: PartitionedBakedMixerClip[] = [];\n const channels: BakedClipChannelInfo[] = [];\n\n for (const channel of CHANNEL_ORDER) {\n const tracks = tracksByChannel.get(channel) ?? [];\n if (tracks.length === 0) {\n continue;\n }\n\n const playable = channel !== 'scene';\n const blendMode = resolveBakedChannelBlendMode(channel, 'additive');\n channels.push({\n channel,\n trackCount: tracks.length,\n playable,\n blendMode,\n });\n\n if (!playable) {\n continue;\n }\n\n mixerClips.push({\n channel,\n clip: new AnimationClip(getMixerClipName(clip.name, channel), clip.duration, tracks),\n });\n }\n\n return {\n sourceClip: clip,\n channels,\n mixerClips,\n };\n}\n","/**\n * ThreeAnimationRuntime - Lerp-based animation driver\n *\n * Internal driver for time-based interpolation with easing functions.\n */\n\nimport {\n AnimationMixer,\n AnimationAction,\n AnimationClip,\n AnimationUtils,\n NumberKeyframeTrack,\n PropertyBinding,\n QuaternionKeyframeTrack,\n AdditiveAnimationBlendMode,\n LoopRepeat,\n LoopPingPong,\n LoopOnce,\n NormalAnimationBlendMode,\n Quaternion,\n Vector3,\n VectorKeyframeTrack,\n} from 'three';\nimport type { KeyframeTrack, Mesh, Object3D } from 'three';\nimport type {\n TransitionHandle,\n AnimationPlayOptions,\n AnimationClipInfo,\n AnimationState,\n AnimationActionHandle,\n CurvesMap,\n ClipOptions,\n ClipEventListener,\n ClipHandle,\n Snippet,\n BoneKey,\n CompositeRotation,\n RotationAxis,\n AnimationSource,\n AnimationBlendMode,\n BakedClipChannel,\n BakedClipChannelInfo,\n AnimationEasing,\n CurvePoint,\n SnippetChannel,\n TypedSnippet,\n BoneBinding,\n EmbodyAnimationRuntime,\n EmbodyAnimationRuntimeConnector,\n EmbodyAnimationRuntimeFactory,\n} from '../../core/types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from '../../core/compositeAxis';\nimport type { Profile } from '../../mappings/types';\nimport {\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getProfileVisemeSlots,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n} from '../../mappings/visemeSystem';\nimport type { ResolvedBones } from './types';\nimport { getSideScale, resolveCurveBalance } from './balanceUtils';\nimport {\n partitionBakedClip,\n resolveBakedAggregateBlendMode,\n resolveBakedChannelBlendMode,\n type PartitionedBakedClip,\n} from './bakedClipPartitioning';\n\ntype Transition = {\n key: string;\n from: number;\n to: number;\n duration: number; // seconds\n elapsed: number; // seconds\n apply: (value: number) => void;\n easing: (t: number) => number;\n resolve?: () => void; // Called when transition completes\n paused: boolean; // Individual pause state\n};\n\nconst easeInOutQuad = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\n// Smoother cubic easing - better for viseme transitions\nconst easeInOutCubic = (t: number) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n// Export easing functions for external use\nexport { easeInOutQuad, easeInOutCubic };\n\nfunction debugFlagEnabled(name: string): boolean {\n try {\n const locationLike = (globalThis as { location?: { search?: string } }).location;\n const search = typeof locationLike?.search === 'string' ? locationLike.search : '';\n if (!search) return false;\n const value = new URLSearchParams(search).get(name);\n return value === '1' || value === 'true';\n } catch {\n return false;\n }\n}\n\nfunction typedLipSyncDebugEnabled(): boolean {\n return debugFlagEnabled('polymerVocalDebug') || debugFlagEnabled('polymerLipSyncDebug');\n}\n\nfunction logTypedLipSyncDebug(label: string, payload: unknown): void {\n if (!typedLipSyncDebugEnabled()) return;\n try {\n console.info(`${label} ${JSON.stringify(payload)}`);\n } catch {\n console.info(label, payload);\n }\n}\n\nfunction summarizeKeyframes(keyframes: ScalarKeyframe[]) {\n return {\n frames: keyframes.length,\n firstSec: keyframes[0]?.time ?? null,\n lastSec: keyframes[keyframes.length - 1]?.time ?? null,\n peak: keyframes.reduce((max, frame) => Math.max(max, Number.isFinite(frame.intensity) ? frame.intensity : 0), 0),\n };\n}\n\nfunction summarizeTypedChannel(channel: SnippetChannel) {\n return {\n target: channel.target,\n intensityScale: channel.intensityScale ?? 1,\n ...summarizeKeyframes(channel.keyframes ?? []),\n };\n}\n\nfunction summarizeBindingTarget(bindingTarget: ReturnType<typeof getVisemeBindingTargets>[number]) {\n return {\n morph: bindingTarget.morph,\n weight: bindingTarget.weight,\n };\n}\n\nexport class ThreeAnimationRuntime {\n private transitions = new Map<string, Transition>();\n\n /**\n * Tick all active transitions by dt seconds.\n * Applies eased interpolation and removes completed transitions.\n * Respects individual transition pause state.\n */\n tick(dtSeconds: number): void {\n if (dtSeconds <= 0) return;\n\n const completed: string[] = [];\n\n this.transitions.forEach((t, key) => {\n // Skip paused transitions\n if (t.paused) return;\n\n t.elapsed += dtSeconds;\n const progress = Math.min(t.elapsed / t.duration, 1.0);\n const easedProgress = t.easing(progress);\n\n // Interpolate and apply\n const value = t.from + (t.to - t.from) * easedProgress;\n t.apply(value);\n\n // Check completion\n if (progress >= 1.0) {\n completed.push(key);\n t.resolve?.();\n }\n });\n\n // Remove completed transitions\n completed.forEach(key => this.transitions.delete(key));\n }\n\n /**\n * Add or replace a transition for the given key.\n * If a transition with the same key exists, it is cancelled and replaced.\n * @returns TransitionHandle with { promise, pause, resume, cancel }\n */\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing: (t: number) => number = easeInOutQuad\n ): TransitionHandle {\n // Convert to seconds once here - all callers pass milliseconds\n const durationSec = durationMs / 1000;\n\n // Cancel existing transition for this key\n const existing = this.transitions.get(key);\n if (existing?.resolve) {\n existing.resolve(); // Resolve immediately (cancelled)\n }\n\n // Instant transition if duration is 0 or values are equal\n if (durationSec <= 0 || Math.abs(to - from) < 1e-6) {\n apply(to);\n return {\n promise: Promise.resolve(),\n pause: () => {},\n resume: () => {},\n cancel: () => {},\n };\n }\n\n const promise = new Promise<void>((resolve) => {\n const transitionObj: Transition = {\n key,\n from,\n to,\n duration: durationSec,\n elapsed: 0,\n apply,\n easing,\n resolve,\n paused: false,\n };\n this.transitions.set(key, transitionObj);\n });\n\n return {\n promise,\n pause: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = true;\n },\n resume: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = false;\n },\n cancel: () => {\n const t = this.transitions.get(key);\n if (t) {\n t.resolve?.();\n this.transitions.delete(key);\n }\n },\n };\n }\n\n /** Clear all running transitions. */\n clearTransitions(): void {\n this.transitions.forEach(t => t.resolve?.());\n this.transitions.clear();\n }\n\n /** Get count of active transitions. */\n getActiveTransitionCount(): number {\n return this.transitions.size;\n }\n}\n\nexport interface ThreeAnimationSystemHost {\n getModel: () => Object3D | null;\n getMeshes: () => Mesh[];\n getMeshByName: (name: string) => Mesh | undefined;\n getMeshNamesForAU?: (auId: number) => string[];\n getMeshNamesForViseme?: () => string[];\n getCurrentAUValue?: (auId: number) => number;\n getCurrentVisemeValue?: (visemeIndex: number) => number;\n getCurrentMorphValue?: (morphKey: string, meshNames?: string[]) => number;\n getCurrentMorphIndexValue?: (morphIndex: number, meshNames?: string[]) => number;\n getCurrentBoneQuaternion?: (nodeKey: string) => Quaternion | null;\n getCurrentBonePositionValue?: (nodeKey: string, axis: 'x' | 'y' | 'z') => number | null;\n getBones: () => ResolvedBones;\n getConfig: () => Profile;\n getCompositeRotations: () => CompositeRotation[];\n computeSideValues: (base: number, balance?: number) => { left: number; right: number };\n getAUMixWeight: (auId: number) => number;\n isMixedAU: (auId: number) => boolean;\n reapplyProceduralState?: () => void;\n}\n\n/** @deprecated Use ThreeAnimationSystemHost. */\nexport type AnimationControllerHost = ThreeAnimationSystemHost;\n\n/** @deprecated Use ThreeAnimationSystemHost. */\nexport type BakedAnimationHost = ThreeAnimationSystemHost;\n\nexport type ThreeAnimationSystemOptions = {\n animationRuntimeFactory?: EmbodyAnimationRuntimeFactory;\n};\n\n// Lightweight unique id for mixer actions/handles\nconst makeActionId = () => `act_${Math.random().toString(36).slice(2, 8)}_${Date.now().toString(36)}`;\nconst X_AXIS = new Vector3(1, 0, 0);\nconst Y_AXIS = new Vector3(0, 1, 0);\nconst Z_AXIS = new Vector3(0, 0, 1);\nconst CLIP_EVENT_METADATA_KEY = '__embodyClipEvents';\nconst CLIP_EVENT_EPSILON = 1e-4;\n\ntype RotationBoneBinding = BoneBinding & { channel: 'rx' | 'ry' | 'rz' };\n\nfunction isRotationBoneBinding(binding: BoneBinding | undefined): binding is RotationBoneBinding {\n return binding?.channel === 'rx' || binding?.channel === 'ry' || binding?.channel === 'rz';\n}\n\nfunction getAutoVisemeJawBinding(config: Profile, bones?: ResolvedBones): RotationBoneBinding | null {\n const candidates = [\n config.auToBones[103]?.find(isRotationBoneBinding),\n config.auToBones[26]?.find(isRotationBoneBinding),\n ].filter((binding): binding is RotationBoneBinding => !!binding);\n if (bones) {\n return candidates.find((binding) => !!bones[binding.node]) ?? candidates[0] ?? null;\n }\n return candidates[0] ?? null;\n}\n\nfunction axisVectorForRotationChannel(channel: 'rx' | 'ry' | 'rz'): Vector3 {\n return channel === 'rx' ? X_AXIS : channel === 'ry' ? Y_AXIS : Z_AXIS;\n}\n\ntype ClipEventMetadata = {\n keyframeTimes: number[];\n};\n\ntype ScalarKeyframe = Pick<CurvePoint, 'time' | 'intensity' | 'inherit'>;\n\ntype ClipMonitor = {\n action: AnimationAction;\n actionId: string;\n clip: AnimationClip;\n clipName: string;\n duration: number;\n keyframeTimes: number[];\n listeners: Set<ClipEventListener>;\n initialDirection: 1 | -1;\n direction: 1 | -1;\n iteration: number;\n lastTime: number;\n lastKeyframeIndex: number;\n loopMode: 'once' | 'repeat' | 'pingpong';\n finishedPending: boolean;\n cleanedUp: boolean;\n resolveFinished: () => void;\n};\n\ntype NormalizedPlaybackState = {\n source: AnimationSource;\n loop: boolean;\n loopMode: 'repeat' | 'pingpong' | 'once';\n repeatCount?: number;\n reverse: boolean;\n playbackRate: number;\n weight: number;\n balance: number;\n requestedBlendMode: AnimationBlendMode;\n blendMode: AnimationBlendMode;\n easing: AnimationEasing;\n};\n\ntype BakedActionGroup = {\n actionId: string;\n channelActions: Map<BakedClipChannel, AnimationAction>;\n pendingFinishedChannels: Set<BakedClipChannel>;\n finishedPromise: Promise<void>;\n resolveFinished: () => void;\n};\n\ntype DynamicClipSource = {\n clipName: string;\n curves?: CurvesMap;\n channels?: SnippetChannel[];\n options?: ClipOptions;\n hasInheritedStart: boolean;\n};\n\ntype ClipParamsUpdate = {\n weight?: number;\n rate?: number;\n loop?: boolean;\n loopMode?: 'once' | 'repeat' | 'pingpong';\n repeatCount?: number;\n reverse?: boolean;\n actionId?: string;\n};\n\nconst ADDITIVE_BAKED_MIXER_CLIP_SUFFIX = '__embody_additive_delta';\n\nexport class ThreeAnimationSystem {\n private host: ThreeAnimationSystemHost;\n // Clip-backed snippets need a later mixer pass so they can override baked additive tracks.\n private animationMixer: AnimationMixer | null = null;\n private clipAnimationMixer: AnimationMixer | null = null;\n private mixerFinishedListenerAttached = false;\n private clipMixerFinishedListenerAttached = false;\n private animationClips: AnimationClip[] = [];\n private bakedSourceClips = new Map<string, PartitionedBakedClip>();\n private bakedMixerActions = new Map<string, AnimationAction>();\n private bakedAdditiveMixerClips = new Map<string, AnimationClip>();\n private bakedActionGroups = new Map<string, BakedActionGroup>();\n private bakedMixerClipToSource = new Map<string, { sourceClipName: string; channel: BakedClipChannel }>();\n private animationActions = new Map<string, AnimationAction>();\n private animationFinishedCallbacks = new Map<string, () => void>();\n private clipActions = new Map<string, AnimationAction>();\n private clipHandles = new Map<string, ClipHandle>();\n private rendererClipHandles = new Map<string, ClipHandle>();\n private clipSources = new Map<string, AnimationSource>();\n private playbackState = new Map<string, NormalizedPlaybackState>();\n private actionIds = new WeakMap<AnimationAction, string>();\n private actionIdToClip = new Map<string, string>();\n private clipMonitors = new Map<string, ClipMonitor>();\n private dynamicClipSources = new WeakMap<AnimationClip, DynamicClipSource>();\n private cljsAnimationRuntime: EmbodyAnimationRuntime | null = null;\n\n constructor(host: ThreeAnimationSystemHost, options: ThreeAnimationSystemOptions = {}) {\n this.host = host;\n if (options.animationRuntimeFactory) {\n this.cljsAnimationRuntime = options.animationRuntimeFactory(\n { owner: 'ThreeAnimationSystem' },\n this.createRuntimeConnector()\n );\n }\n }\n\n private shouldDebugClipLogs(): boolean {\n const globalLocation = typeof window !== 'undefined' ? window.location : undefined;\n const search = globalLocation?.search ?? '';\n return search.includes('polymerVocalDebug=1')\n || search.includes('embodyDebug=1');\n }\n\n private debugClipLog(...args: unknown[]): void {\n if (this.shouldDebugClipLogs()) {\n console.log(...args);\n }\n }\n\n private createRuntimeConnector(): EmbodyAnimationRuntimeConnector {\n return {\n buildClip: (clipName, curves, options) => {\n const handle = this.buildClipDirect(clipName, curves, options);\n if (!handle) return null;\n this.rendererClipHandles.set(clipName, handle);\n handle.subscribe?.((event) => {\n this.cljsAnimationRuntime?.acceptClipEvent(event);\n });\n return {\n actionId: handle.actionId,\n duration: handle.getDuration(),\n time: handle.getTime(),\n };\n },\n stopClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.stop();\n this.rendererClipHandles.delete(clipName);\n },\n pauseClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.pause();\n },\n resumeClip: (clipName) => {\n this.rendererClipHandles.get(clipName)?.resume();\n },\n setClipWeight: (clipName, weight) => {\n this.rendererClipHandles.get(clipName)?.setWeight?.(weight);\n },\n setClipPlaybackRate: (clipName, rate) => {\n this.rendererClipHandles.get(clipName)?.setPlaybackRate?.(rate);\n },\n setClipLoop: (clipName, mode, repeatCount) => {\n this.rendererClipHandles.get(clipName)?.setLoop?.(mode, repeatCount);\n },\n setClipTime: (clipName, time) => {\n this.rendererClipHandles.get(clipName)?.setTime?.(time);\n },\n getClipTime: (clipName) => this.rendererClipHandles.get(clipName)?.getTime() ?? 0,\n getClipDuration: (clipName) => this.rendererClipHandles.get(clipName)?.getDuration() ?? 0,\n updateClipParams: (clipName, params) => this.updateClipParamsDirect(clipName, params as ClipParamsUpdate),\n cleanupSnippet: (clipName) => this.cleanupSnippetDirect(clipName),\n };\n }\n\n getRuntimeSnapshot(): Record<string, unknown> | null {\n return this.cljsAnimationRuntime?.snapshot() ?? null;\n }\n\n private getActionId(action?: AnimationAction | null): string | undefined {\n if (!action) return undefined;\n return this.actionIds.get(action) ?? action.__actionId;\n }\n\n private setActionId(action: AnimationAction, clipName: string): string {\n const actionId = makeActionId();\n this.actionIds.set(action, actionId);\n this.actionIdToClip.set(actionId, clipName);\n action.__actionId = actionId;\n return actionId;\n }\n\n private clearActionId(action?: AnimationAction | null): void {\n if (!action) return;\n const actionId = this.getActionId(action);\n if (actionId) {\n this.actionIdToClip.delete(actionId);\n }\n this.actionIds.delete(action);\n delete action.__actionId;\n }\n\n private uncacheClip(\n clip?: AnimationClip | null,\n mixer: AnimationMixer | null = this.animationMixer\n ): void {\n if (!clip || !mixer) return;\n try {\n mixer.uncacheClip(clip);\n } catch {}\n }\n\n private uncacheAction(\n action?: AnimationAction | null,\n mixer: AnimationMixer | null = this.animationMixer\n ): void {\n if (!action || !mixer) return;\n try {\n const clip = action.getClip();\n if (clip) {\n mixer.uncacheAction(clip);\n mixer.uncacheClip(clip);\n }\n } catch {}\n }\n\n private releaseBakedMixerAction(mixerClipName: string): void {\n const action = this.bakedMixerActions.get(mixerClipName);\n if (!action) return;\n try {\n action.stop();\n } catch {}\n this.uncacheAction(action);\n this.clearActionId(action);\n this.bakedMixerActions.delete(mixerClipName);\n }\n\n private clearBakedAdditiveMixerClip(mixerClipName: string): void {\n const clip = this.bakedAdditiveMixerClips.get(mixerClipName);\n if (!clip) return;\n this.uncacheClip(clip);\n this.bakedAdditiveMixerClips.delete(mixerClipName);\n }\n\n private clearAllBakedAdditiveMixerClips(): void {\n for (const mixerClipName of Array.from(this.bakedAdditiveMixerClips.keys())) {\n this.clearBakedAdditiveMixerClip(mixerClipName);\n }\n }\n\n private resolveTrackTarget(\n model: Object3D,\n parsed: ReturnType<typeof PropertyBinding.parseTrackName>\n ): Object3D | null {\n const targetKey = parsed.objectName === 'bones' && parsed.objectIndex\n ? parsed.objectIndex\n : parsed.nodeName;\n if (!targetKey) {\n return null;\n }\n return model.getObjectByProperty('uuid', targetKey)\n ?? PropertyBinding.findNode(model, targetKey)\n ?? null;\n }\n\n private getMorphTrackBaseValue(\n target: Object3D | null,\n propertyIndex: string | number | undefined\n ): number {\n if (!target) {\n return 0;\n }\n\n const meshTarget = target as Mesh & {\n morphTargetInfluences?: number[];\n morphTargetDictionary?: Record<string, number>;\n };\n const influences = meshTarget.morphTargetInfluences;\n if (!influences) {\n return 0;\n }\n\n let morphIndex: number | undefined;\n if (typeof propertyIndex === 'number' && Number.isInteger(propertyIndex)) {\n morphIndex = propertyIndex;\n } else if (typeof propertyIndex === 'string') {\n if (/^\\d+$/.test(propertyIndex)) {\n morphIndex = Number(propertyIndex);\n } else {\n morphIndex = meshTarget.morphTargetDictionary?.[propertyIndex];\n }\n }\n\n if (morphIndex === undefined) {\n return 0;\n }\n\n return influences[morphIndex] ?? 0;\n }\n\n private canCreateFirstFrameReferenceTrack(track: KeyframeTrack): boolean {\n const valueSize = track.getValueSize();\n if (!Number.isFinite(valueSize) || valueSize <= 0 || track.values.length < valueSize) {\n return false;\n }\n\n return track.ValueTypeName === 'number'\n || track.ValueTypeName === 'quaternion'\n || track.ValueTypeName === 'vector';\n }\n\n private createFirstFrameReferenceTrack(track: KeyframeTrack): KeyframeTrack | null {\n const valueSize = track.getValueSize();\n if (!this.canCreateFirstFrameReferenceTrack(track)) {\n return null;\n }\n\n const values = Array.from(track.values.slice(0, valueSize));\n if (track.ValueTypeName === 'number') {\n return new NumberKeyframeTrack(track.name, [0], values);\n }\n if (track.ValueTypeName === 'quaternion') {\n return new QuaternionKeyframeTrack(track.name, [0], values);\n }\n if (track.ValueTypeName === 'vector') {\n return new VectorKeyframeTrack(track.name, [0], values);\n }\n return null;\n }\n\n private createAdditiveReferenceTrack(\n track: KeyframeTrack,\n model: Object3D\n ): KeyframeTrack | null {\n const trackName = typeof track?.name === 'string' ? track.name : '';\n if (!trackName) {\n return null;\n }\n\n let parsed: ReturnType<typeof PropertyBinding.parseTrackName>;\n try {\n parsed = PropertyBinding.parseTrackName(trackName);\n } catch {\n return null;\n }\n\n const target = this.resolveTrackTarget(model, parsed);\n if (parsed.propertyName === 'morphTargetInfluences') {\n return new NumberKeyframeTrack(\n track.name,\n [0],\n [this.getMorphTrackBaseValue(target, parsed.propertyIndex)]\n );\n }\n\n return this.createFirstFrameReferenceTrack(track);\n }\n\n private createAdditiveMixerClip(mixerClip: AnimationClip): AnimationClip | null {\n const model = this.host.getModel();\n if (!model) {\n return null;\n }\n\n const additiveTracks: KeyframeTrack[] = [];\n const referenceTracks: KeyframeTrack[] = [];\n for (const track of mixerClip.tracks) {\n const referenceTrack = this.createAdditiveReferenceTrack(track, model);\n if (!referenceTrack) {\n continue;\n }\n additiveTracks.push(track.clone());\n referenceTracks.push(referenceTrack);\n }\n\n const additiveClip = new AnimationClip(\n `${mixerClip.name}${ADDITIVE_BAKED_MIXER_CLIP_SUFFIX}`,\n mixerClip.duration,\n additiveTracks\n );\n if (additiveTracks.length > 0) {\n const referenceClip = new AnimationClip(\n `${mixerClip.name}${ADDITIVE_BAKED_MIXER_CLIP_SUFFIX}_reference`,\n 0,\n referenceTracks\n );\n AnimationUtils.makeClipAdditive(additiveClip, 0, referenceClip);\n }\n return additiveClip;\n }\n\n private getOrCreateBakedAdditiveMixerClip(mixerClip: AnimationClip): AnimationClip | null {\n const cached = this.bakedAdditiveMixerClips.get(mixerClip.name);\n if (cached) {\n return cached;\n }\n\n const additiveClip = this.createAdditiveMixerClip(mixerClip);\n if (!additiveClip) {\n return null;\n }\n this.bakedAdditiveMixerClips.set(mixerClip.name, additiveClip);\n return additiveClip;\n }\n\n private setClipEventMetadata(clip: AnimationClip, metadata: ClipEventMetadata) {\n const userData = ((clip as any).userData ??= {});\n userData[CLIP_EVENT_METADATA_KEY] = metadata;\n }\n\n private getClipEventMetadata(clip: AnimationClip): ClipEventMetadata {\n const userData = (clip as any).userData;\n const keyframeTimes = Array.isArray(userData?.[CLIP_EVENT_METADATA_KEY]?.keyframeTimes)\n ? userData[CLIP_EVENT_METADATA_KEY].keyframeTimes.filter((time: unknown): time is number => Number.isFinite(time as number))\n : [];\n return { keyframeTimes };\n }\n\n private curvesHaveInheritedStart(curves: CurvesMap): boolean {\n return Object.values(curves).some((curve) => !!curve?.[0]?.inherit);\n }\n\n private channelsHaveInheritedStart(channels: readonly SnippetChannel[]): boolean {\n return channels.some((channel) => !!channel.keyframes?.[0]?.inherit);\n }\n\n private rebuildDynamicClip(source: DynamicClipSource): AnimationClip | null {\n if (source.channels) {\n return this.typedSnippetToClip(source.clipName, source.channels, source.options);\n }\n if (source.curves) {\n return this.snippetToClip(source.clipName, source.curves, source.options);\n }\n return null;\n }\n\n private resolveInheritedClipForPlayback(clip: AnimationClip): AnimationClip {\n const source = this.dynamicClipSources.get(clip);\n if (!source?.hasInheritedStart) {\n return clip;\n }\n return this.rebuildDynamicClip(source) ?? clip;\n }\n\n private getKeyframeIndex(times: number[], currentTime: number) {\n if (!times.length) return -1;\n const target = Math.max(0, currentTime) + 1e-3;\n let lo = 0;\n let hi = times.length - 1;\n let idx = 0;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n if (times[mid] <= target) {\n idx = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return idx;\n }\n\n private emitClipEvent(monitor: ClipMonitor, event: Parameters<ClipEventListener>[0]) {\n for (const listener of Array.from(monitor.listeners)) {\n try {\n listener(event);\n } catch (error) {\n console.error('[Embody] clip event listener failed', error);\n }\n }\n }\n\n private emitKeyframesForRange(\n monitor: ClipMonitor,\n startTime: number,\n endTime: number,\n direction: 1 | -1,\n includeStart: boolean\n ) {\n if (!monitor.keyframeTimes.length) return;\n\n const times = direction === 1 ? monitor.keyframeTimes : [...monitor.keyframeTimes].reverse();\n for (const time of times) {\n const matchesForward = direction === 1\n && (includeStart ? time >= startTime - CLIP_EVENT_EPSILON : time > startTime + CLIP_EVENT_EPSILON)\n && time <= endTime + CLIP_EVENT_EPSILON;\n const matchesReverse = direction === -1\n && (includeStart ? time <= startTime + CLIP_EVENT_EPSILON : time < startTime - CLIP_EVENT_EPSILON)\n && time >= endTime - CLIP_EVENT_EPSILON;\n if (!matchesForward && !matchesReverse) continue;\n\n const keyframeIndex = monitor.keyframeTimes.indexOf(time);\n monitor.lastKeyframeIndex = keyframeIndex;\n this.emitClipEvent(monitor, {\n type: 'keyframe',\n clipName: monitor.clipName,\n keyframeIndex,\n totalKeyframes: monitor.keyframeTimes.length,\n currentTime: time,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n }\n }\n\n private resetClipMonitor(monitor: ClipMonitor, currentTime: number) {\n monitor.iteration = 0;\n monitor.direction = monitor.initialDirection;\n monitor.lastTime = currentTime;\n monitor.lastKeyframeIndex = this.getKeyframeIndex(monitor.keyframeTimes, currentTime);\n monitor.finishedPending = false;\n }\n\n private syncClipMonitorTime(monitor: ClipMonitor, currentTime: number, emitSeek = false) {\n const clamped = Math.max(0, Math.min(monitor.duration, currentTime));\n monitor.lastTime = clamped;\n monitor.lastKeyframeIndex = this.getKeyframeIndex(monitor.keyframeTimes, clamped);\n if (emitSeek) {\n this.emitClipEvent(monitor, {\n type: 'seek',\n clipName: monitor.clipName,\n currentTime: clamped,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n }\n }\n\n private cleanupClipMonitor(actionId: string, options: { resolveFinished?: boolean } = {}) {\n const monitor = this.clipMonitors.get(actionId);\n if (!monitor || monitor.cleanedUp) return;\n const { resolveFinished = true } = options;\n monitor.cleanedUp = true;\n try { monitor.action.paused = true; } catch {}\n if (resolveFinished) {\n monitor.resolveFinished();\n }\n monitor.listeners.clear();\n this.clipMonitors.delete(actionId);\n this.actionIdToClip.delete(actionId);\n }\n\n private advanceClipMonitor(monitor: ClipMonitor, previousTime: number) {\n if (monitor.cleanedUp || (monitor.action.paused && !monitor.finishedPending)) return;\n\n const currentTime = Math.max(0, Math.min(monitor.duration, monitor.action.time));\n const delta = currentTime - previousTime;\n\n if (monitor.loopMode === 'pingpong') {\n const movingForward = monitor.direction === 1;\n const bouncedAtEnd = movingForward && delta < -CLIP_EVENT_EPSILON;\n const bouncedAtStart = !movingForward && delta > CLIP_EVENT_EPSILON;\n\n if (bouncedAtEnd) {\n this.emitKeyframesForRange(monitor, previousTime, monitor.duration, 1, false);\n monitor.direction = -1;\n this.emitKeyframesForRange(monitor, monitor.duration, currentTime, -1, false);\n } else if (bouncedAtStart) {\n this.emitKeyframesForRange(monitor, previousTime, 0, -1, false);\n monitor.direction = 1;\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: 0,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, 0, currentTime, 1, false);\n } else if (delta > CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, 1, false);\n monitor.direction = 1;\n } else if (delta < -CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, -1, false);\n monitor.direction = -1;\n }\n } else if (monitor.direction === 1) {\n const wrapped = currentTime + CLIP_EVENT_EPSILON < previousTime;\n if (wrapped) {\n this.emitKeyframesForRange(monitor, previousTime, monitor.duration, 1, false);\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: 0,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, 0, currentTime, 1, true);\n } else if (delta > CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, 1, false);\n }\n } else {\n const wrapped = currentTime > previousTime + CLIP_EVENT_EPSILON;\n if (wrapped) {\n this.emitKeyframesForRange(monitor, previousTime, 0, -1, false);\n monitor.iteration += 1;\n this.emitClipEvent(monitor, {\n type: 'loop',\n clipName: monitor.clipName,\n iteration: monitor.iteration,\n currentTime: monitor.duration,\n duration: monitor.duration,\n });\n this.emitKeyframesForRange(monitor, monitor.duration, currentTime, -1, true);\n } else if (delta < -CLIP_EVENT_EPSILON) {\n this.emitKeyframesForRange(monitor, previousTime, currentTime, -1, false);\n }\n }\n\n this.syncClipMonitorTime(monitor, currentTime);\n }\n\n private normalizePlaybackOptions(\n options: AnimationPlayOptions | ClipOptions | undefined,\n defaults: { loop: boolean; source: AnimationSource }\n ): NormalizedPlaybackState {\n const clipOptions = options as ClipOptions | undefined;\n const rawRate = options?.playbackRate ?? options?.speed ?? 1.0;\n const playbackRate = Number.isFinite(rawRate) ? Math.max(0, Math.abs(rawRate)) : 1.0;\n const rawWeight = options?.weight ?? options?.intensity ?? clipOptions?.mixerWeight ?? 1.0;\n const weight = Number.isFinite(rawWeight) ? Math.max(0, rawWeight) : 1.0;\n const loopMode = options?.loopMode\n ?? (typeof options?.loop === 'boolean'\n ? (options.loop ? 'repeat' : 'once')\n : (defaults.loop ? 'repeat' : 'once'));\n const requestedBlendMode = options?.blendMode ?? (clipOptions?.mixerAdditive ? 'additive' : 'replace');\n return {\n source: options?.source ?? defaults.source,\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: options?.repeatCount,\n reverse: !!options?.reverse,\n playbackRate,\n weight,\n balance: Number.isFinite(options?.balance) ? options?.balance ?? 0 : 0,\n requestedBlendMode,\n blendMode: requestedBlendMode,\n easing: options?.easing ?? 'linear',\n };\n }\n\n private applyPlaybackState(action: AnimationAction, state: NormalizedPlaybackState): void {\n const signedRate = state.reverse ? -state.playbackRate : state.playbackRate;\n action.setEffectiveTimeScale(signedRate);\n action.setEffectiveWeight(state.weight);\n action.blendMode = state.blendMode === 'additive'\n ? AdditiveAnimationBlendMode\n : NormalAnimationBlendMode;\n\n const reps = state.repeatCount ?? Infinity;\n if (state.loopMode === 'pingpong') {\n action.setLoop(LoopPingPong, reps);\n } else if (state.loopMode === 'once') {\n action.setLoop(LoopOnce, 1);\n } else {\n action.setLoop(LoopRepeat, reps);\n }\n action.clampWhenFinished = state.loopMode === 'once';\n }\n\n private setPlaybackState(clipName: string, state: NormalizedPlaybackState): void {\n this.playbackState.set(clipName, state);\n this.clipSources.set(clipName, state.source);\n }\n\n private getPlaybackStateSnapshot(\n clipName: string,\n defaults: { loop: boolean; source: AnimationSource }\n ): NormalizedPlaybackState {\n const existing = this.playbackState.get(clipName);\n if (existing) {\n return { ...existing };\n }\n return this.normalizePlaybackOptions(undefined, defaults);\n }\n\n private mergePlaybackOptions(\n current: NormalizedPlaybackState,\n options: AnimationPlayOptions | ClipOptions | undefined\n ): NormalizedPlaybackState {\n if (!options) {\n return current;\n }\n const next = { ...current };\n const clipOptions = options as ClipOptions | undefined;\n const loopMode = options.loopMode\n ?? (typeof options.loop === 'boolean' ? (options.loop ? 'repeat' : 'once') : undefined);\n\n if (options.source) next.source = options.source;\n if (loopMode) {\n next.loopMode = loopMode;\n next.loop = loopMode !== 'once';\n }\n if (options.repeatCount !== undefined) {\n next.repeatCount = Number.isFinite(options.repeatCount)\n ? Math.max(0, options.repeatCount ?? 0)\n : undefined;\n }\n if (typeof options.reverse === 'boolean') {\n next.reverse = options.reverse;\n }\n\n const rate = options.playbackRate ?? options.speed;\n if (rate !== undefined) {\n next.playbackRate = Number.isFinite(rate) ? Math.max(0, Math.abs(rate)) : current.playbackRate;\n }\n\n const weight = options.weight ?? options.intensity ?? clipOptions?.mixerWeight;\n if (weight !== undefined) {\n next.weight = Number.isFinite(weight) ? Math.max(0, weight) : current.weight;\n }\n\n if (typeof options.balance === 'number' && Number.isFinite(options.balance)) {\n next.balance = Math.max(-1, Math.min(1, options.balance));\n }\n\n if (options.blendMode) {\n next.requestedBlendMode = options.blendMode;\n } else if (typeof clipOptions?.mixerAdditive === 'boolean') {\n next.requestedBlendMode = clipOptions.mixerAdditive ? 'additive' : 'replace';\n }\n next.blendMode = next.requestedBlendMode;\n\n if (options.easing) {\n next.easing = options.easing;\n }\n\n return next;\n }\n\n private isBakedSourceClip(clipName: string): boolean {\n return this.bakedSourceClips.has(clipName);\n }\n\n private getBakedSourceClip(clipName: string): PartitionedBakedClip | undefined {\n return this.bakedSourceClips.get(clipName);\n }\n\n private getBakedChannelInfo(\n clipName: string,\n playbackState?: NormalizedPlaybackState\n ): BakedClipChannelInfo[] | undefined {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return undefined;\n }\n\n const requestedBlendMode = playbackState?.requestedBlendMode ?? 'replace';\n return bakedClip.channels.map((channel) => ({\n ...channel,\n blendMode: resolveBakedChannelBlendMode(channel.channel, requestedBlendMode),\n }));\n }\n\n private getBakedAggregateBlendMode(\n clipName: string,\n playbackState?: NormalizedPlaybackState\n ): AnimationBlendMode {\n const channels = this.getBakedChannelInfo(clipName, playbackState);\n if (!channels) {\n return playbackState?.requestedBlendMode ?? playbackState?.blendMode ?? 'replace';\n }\n return resolveBakedAggregateBlendMode(\n channels,\n playbackState?.requestedBlendMode ?? 'replace'\n );\n }\n\n private applyPlaybackStateToBakedAction(\n action: AnimationAction,\n state: NormalizedPlaybackState,\n channel: BakedClipChannel\n ): void {\n this.applyPlaybackState(action, {\n ...state,\n blendMode: resolveBakedChannelBlendMode(channel, state.requestedBlendMode) ?? 'replace',\n });\n }\n\n private resolveStartTime(\n duration: number,\n state: NormalizedPlaybackState,\n explicitStartTime?: number\n ): number {\n if (typeof explicitStartTime === 'number' && Number.isFinite(explicitStartTime)) {\n return Math.max(0, Math.min(duration, explicitStartTime));\n }\n if (state.reverse && state.loopMode === 'once') {\n return duration;\n }\n return 0;\n }\n\n private getOrCreateBakedMixerAction(\n sourceClipName: string,\n channel: BakedClipChannel,\n blendMode: AnimationBlendMode = 'replace'\n ): AnimationAction | null {\n const bakedClip = this.getBakedSourceClip(sourceClipName);\n const mixerClip = bakedClip?.mixerClips.find((entry) => entry.channel === channel)?.clip;\n if (!mixerClip) {\n return null;\n }\n\n const desiredClip = blendMode === 'additive'\n ? this.getOrCreateBakedAdditiveMixerClip(mixerClip)\n : mixerClip;\n if (!desiredClip) {\n return null;\n }\n\n const existing = this.bakedMixerActions.get(mixerClip.name);\n if (existing?.getClip() === desiredClip) {\n return existing;\n }\n\n this.ensureMixer();\n if (!this.animationMixer) {\n return null;\n }\n\n if (existing) {\n this.releaseBakedMixerAction(mixerClip.name);\n }\n\n const action = this.animationMixer.clipAction(desiredClip);\n this.bakedMixerActions.set(mixerClip.name, action);\n return action;\n }\n\n private getRepresentativeBakedAction(clipName: string): AnimationAction | null {\n const group = this.bakedActionGroups.get(clipName);\n if (!group) {\n return null;\n }\n return group.channelActions.values().next().value ?? null;\n }\n\n private createBakedActionGroup(\n clipName: string,\n playbackState: NormalizedPlaybackState\n ): BakedActionGroup | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return null;\n }\n\n const channelActions = new Map<BakedClipChannel, AnimationAction>();\n for (const mixerClip of bakedClip.mixerClips) {\n const channelBlendMode = resolveBakedChannelBlendMode(\n mixerClip.channel,\n playbackState.requestedBlendMode\n ) ?? 'replace';\n const action = this.getOrCreateBakedMixerAction(\n clipName,\n mixerClip.channel,\n channelBlendMode\n );\n if (action) {\n channelActions.set(mixerClip.channel, action);\n }\n }\n\n if (channelActions.size === 0) {\n return null;\n }\n\n let resolveFinished = () => {};\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n\n return {\n actionId: makeActionId(),\n channelActions,\n pendingFinishedChannels: playbackState.loopMode === 'once'\n ? new Set(channelActions.keys())\n : new Set<BakedClipChannel>(),\n finishedPromise,\n resolveFinished,\n };\n }\n\n private getMeshNamesForAU(auId: number, config: Profile, explicitMeshNames?: string[]): string[] {\n if (explicitMeshNames && explicitMeshNames.length > 0) {\n return explicitMeshNames;\n }\n\n if (typeof this.host.getMeshNamesForAU === 'function') {\n return this.host.getMeshNamesForAU(auId) || [];\n }\n\n return getMeshNamesForAUProfile(config, auId);\n }\n\n private getMeshNamesForViseme(config: Profile, explicitMeshNames?: string[]): string[] {\n if (explicitMeshNames && explicitMeshNames.length > 0) {\n return explicitMeshNames;\n }\n\n if (typeof this.host.getMeshNamesForViseme === 'function') {\n return this.host.getMeshNamesForViseme() || [];\n }\n\n return getMeshNamesForVisemeProfile(config);\n }\n\n private hasActiveAdditivePlayback(): boolean {\n for (const [clipName, group] of this.bakedActionGroups) {\n const state = this.playbackState.get(clipName);\n if (state?.blendMode !== 'additive') {\n continue;\n }\n for (const action of group.channelActions.values()) {\n if (action.isRunning() && !action.paused) {\n return true;\n }\n }\n }\n\n for (const [clipName, action] of this.animationActions) {\n const state = this.playbackState.get(clipName);\n if (state?.blendMode !== 'additive') {\n continue;\n }\n if (action.isRunning() && !action.paused) {\n return true;\n }\n }\n\n return false;\n }\n\n update(dtSeconds: number): void {\n if (this.animationMixer) {\n this.animationMixer.update(dtSeconds);\n }\n\n if (this.clipAnimationMixer) {\n const snapshots = Array.from(this.clipMonitors.values()).map((monitor) => ({\n actionId: monitor.actionId,\n previousTime: monitor.action.time,\n }));\n this.clipAnimationMixer.update(dtSeconds);\n for (const { actionId, previousTime } of snapshots) {\n const monitor = this.clipMonitors.get(actionId);\n if (!monitor) continue;\n this.advanceClipMonitor(monitor, previousTime);\n if (monitor.finishedPending) {\n const finalTime = Math.max(0, Math.min(monitor.duration, monitor.action.time));\n this.syncClipMonitorTime(monitor, finalTime);\n this.emitClipEvent(monitor, {\n type: 'completed',\n clipName: monitor.clipName,\n currentTime: finalTime,\n duration: monitor.duration,\n iteration: monitor.iteration,\n });\n this.cleanupClipMonitor(actionId);\n }\n }\n }\n\n if (this.hasActiveAdditivePlayback()) {\n this.host.reapplyProceduralState?.();\n }\n }\n\n dispose(): void {\n this.stopAllAnimations();\n this.clearAllBakedAdditiveMixerClips();\n if (this.animationMixer) {\n this.animationMixer.stopAllAction();\n this.animationMixer = null;\n }\n if (this.clipAnimationMixer) {\n this.clipAnimationMixer.stopAllAction();\n this.clipAnimationMixer = null;\n }\n this.mixerFinishedListenerAttached = false;\n this.clipMixerFinishedListenerAttached = false;\n this.animationClips = [];\n this.bakedSourceClips.clear();\n this.bakedMixerActions.clear();\n this.bakedAdditiveMixerClips.clear();\n this.bakedActionGroups.clear();\n this.bakedMixerClipToSource.clear();\n this.animationActions.clear();\n this.animationFinishedCallbacks.clear();\n this.clipActions.clear();\n this.clipHandles.clear();\n this.clipSources.clear();\n this.playbackState.clear();\n this.clipMonitors.clear();\n }\n\n loadAnimationClips(clips: unknown[]): void {\n const model = this.host.getModel();\n if (!model) {\n console.warn('Embody: Cannot load animation clips before calling onReady()');\n return;\n }\n\n for (const clipName of this.bakedSourceClips.keys()) {\n this.stopAnimation(clipName);\n }\n if (this.animationMixer) {\n for (const bakedClip of this.bakedSourceClips.values()) {\n for (const mixerClip of bakedClip.mixerClips) {\n this.releaseBakedMixerAction(mixerClip.clip.name);\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n try {\n this.animationMixer.uncacheAction(mixerClip.clip);\n } catch {}\n try {\n this.animationMixer.uncacheClip(mixerClip.clip);\n } catch {}\n }\n }\n }\n this.clearAllBakedAdditiveMixerClips();\n\n for (const clipName of this.bakedSourceClips.keys()) {\n this.playbackState.delete(clipName);\n this.clipSources.delete(clipName);\n }\n\n this.bakedSourceClips.clear();\n this.bakedMixerActions.clear();\n this.bakedActionGroups.clear();\n this.bakedMixerClipToSource.clear();\n\n this.ensureMixer();\n const partitionedClips = (clips as AnimationClip[]).map((clip) => (\n partitionBakedClip(clip, model, this.host.getBones())\n ));\n\n this.animationClips = partitionedClips.map((clip) => clip.sourceClip);\n for (const bakedClip of partitionedClips) {\n this.bakedSourceClips.set(bakedClip.sourceClip.name, bakedClip);\n this.clipSources.set(bakedClip.sourceClip.name, 'baked');\n for (const mixerClip of bakedClip.mixerClips) {\n this.bakedMixerClipToSource.set(mixerClip.clip.name, {\n sourceClipName: bakedClip.sourceClip.name,\n channel: mixerClip.channel,\n });\n }\n }\n }\n\n getAnimationClips(): AnimationClipInfo[] {\n return this.animationClips.map(clip => ({\n name: clip.name,\n duration: clip.duration,\n trackCount: clip.tracks.length,\n source: this.clipSources.get(clip.name) ?? 'baked',\n channels: this.getBakedSourceClip(clip.name)?.channels,\n }));\n }\n\n removeAnimationClip(clipName: string): boolean {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n return false;\n }\n\n this.stopAnimation(clipName);\n\n if (this.animationMixer) {\n for (const mixerClip of bakedClip.mixerClips) {\n const action = this.bakedMixerActions.get(mixerClip.clip.name);\n this.releaseBakedMixerAction(mixerClip.clip.name);\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n try {\n this.animationMixer.uncacheAction(mixerClip.clip);\n } catch {}\n try {\n this.animationMixer.uncacheClip(mixerClip.clip);\n } catch {}\n this.bakedMixerClipToSource.delete(mixerClip.clip.name);\n const actionId = this.getActionId(action);\n if (actionId && action) {\n this.actionIdToClip.delete(actionId);\n this.actionIds.delete(action);\n }\n }\n }\n for (const mixerClip of bakedClip.mixerClips) {\n this.clearBakedAdditiveMixerClip(mixerClip.clip.name);\n this.bakedMixerActions.delete(mixerClip.clip.name);\n }\n\n this.animationClips = this.animationClips.filter((entry) => entry.name !== clipName);\n this.bakedSourceClips.delete(clipName);\n this.bakedActionGroups.delete(clipName);\n this.playbackState.delete(clipName);\n this.clipSources.delete(clipName);\n\n return true;\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (!bakedClip) {\n console.warn(`Embody: Animation clip \"${clipName}\" not found`);\n return null;\n }\n\n const playbackState = this.mergePlaybackOptions(\n this.getPlaybackStateSnapshot(clipName, { loop: true, source: 'baked' }),\n options\n );\n playbackState.blendMode = this.getBakedAggregateBlendMode(clipName, playbackState);\n const actionGroup = this.createBakedActionGroup(clipName, playbackState);\n if (!actionGroup) {\n console.warn(`Embody: Animation clip \"${clipName}\" has no character mixer channels to play`);\n return null;\n }\n\n const crossfadeDuration = options.crossfadeDuration ?? 0;\n const clampWhenFinished = options.clampWhenFinished ?? playbackState.loopMode === 'once';\n const startTime = this.resolveStartTime(bakedClip.sourceClip.duration, playbackState, options.startTime);\n\n for (const [channel, action] of actionGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, playbackState, channel);\n action.clampWhenFinished = clampWhenFinished;\n\n if (crossfadeDuration > 0) {\n action.reset();\n action.fadeIn(crossfadeDuration);\n } else {\n action.reset();\n }\n action.time = startTime;\n action.play();\n }\n\n this.bakedActionGroups.set(clipName, actionGroup);\n this.setPlaybackState(clipName, playbackState);\n return this.createBakedAnimationHandle(clipName, actionGroup);\n }\n\n stopAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.stop();\n try { action.paused = false; } catch {}\n }\n this.bakedActionGroups.delete(clipName);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const actionId = this.getActionId(action);\n const isBaked = (this.clipSources.get(clipName) ?? 'baked') === 'baked';\n action.stop();\n if (!isBaked && this.clipAnimationMixer) {\n try {\n const clip = action.getClip();\n if (clip) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n } catch {}\n }\n if (!isBaked) {\n this.animationActions.delete(clipName);\n this.playbackState.delete(clipName);\n } else {\n try { action.paused = false; } catch {}\n }\n this.animationFinishedCallbacks.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n const clipAction = this.clipActions.get(clipName);\n if (clipAction && clipAction !== action) {\n const actionId = this.getActionId(clipAction);\n try {\n clipAction.stop();\n if (this.clipAnimationMixer) {\n const clip = clipAction.getClip();\n if (clip) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n }\n } catch {}\n this.clipActions.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n if (this.clipActions.get(clipName) === action) {\n this.clipActions.delete(clipName);\n }\n this.clipHandles.delete(clipName);\n }\n\n stopAllAnimations(): void {\n for (const clipName of new Set([\n ...this.bakedActionGroups.keys(),\n ...this.animationActions.keys(),\n ...this.clipActions.keys(),\n ])) {\n this.stopAnimation(clipName);\n }\n }\n\n pauseAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.paused = true;\n }\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = true;\n }\n }\n\n resumeAnimation(clipName: string): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const action of bakedGroup.channelActions.values()) {\n action.paused = false;\n }\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = false;\n }\n }\n\n pauseAllAnimations(): void {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.isRunning()) {\n action.paused = true;\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.isRunning()) {\n action.paused = true;\n }\n }\n }\n\n resumeAllAnimations(): void {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.paused) {\n action.paused = false;\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.paused) {\n action.paused = false;\n }\n }\n }\n\n setAnimationSpeed(clipName: string, speed: number): void {\n if (this.isBakedSourceClip(clipName)) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n next.playbackRate = Number.isFinite(speed) ? Math.max(0, Math.abs(speed)) : 1.0;\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'clip',\n });\n next.playbackRate = Number.isFinite(speed) ? Math.max(0, Math.abs(speed)) : 1.0;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n if (this.isBakedSourceClip(clipName)) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n next.weight = Number.isFinite(intensity) ? Math.max(0, intensity) : 1.0;\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (action) {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'clip',\n });\n next.weight = Number.isFinite(intensity) ? Math.max(0, intensity) : 1.0;\n action.setEffectiveWeight(next.weight);\n this.setPlaybackState(clipName, next);\n }\n }\n\n setAnimationLoopMode(clipName: string, loopMode: 'repeat' | 'once' | 'pingpong'): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.loopMode = loopMode;\n next.loop = loopMode !== 'once';\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationRepeatCount(clipName: string, repeatCount?: number): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.repeatCount = typeof repeatCount === 'number' && Number.isFinite(repeatCount)\n ? Math.max(0, repeatCount)\n : undefined;\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationReverse(clipName: string, reverse: boolean): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.reverse = !!reverse;\n\n if (this.isBakedSourceClip(clipName)) {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, action] of bakedGroup.channelActions) {\n this.applyPlaybackStateToBakedAction(action, next, channel);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n setAnimationBlendMode(clipName: string, blendMode: AnimationBlendMode): void {\n const next = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? (this.isBakedSourceClip(clipName) ? 'baked' : 'clip'),\n });\n next.requestedBlendMode = blendMode;\n\n if (this.isBakedSourceClip(clipName)) {\n next.blendMode = this.getBakedAggregateBlendMode(clipName, next);\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n for (const [channel, currentAction] of Array.from(bakedGroup.channelActions)) {\n const channelBlendMode = resolveBakedChannelBlendMode(channel, next.requestedBlendMode) ?? 'replace';\n const previousTime = currentAction.time;\n const wasActive = currentAction.isRunning() || currentAction.paused;\n const wasPaused = currentAction.paused;\n const action = this.getOrCreateBakedMixerAction(clipName, channel, channelBlendMode);\n if (!action) {\n bakedGroup.channelActions.delete(channel);\n continue;\n }\n\n this.applyPlaybackStateToBakedAction(action, next, channel);\n action.time = Math.max(0, Math.min(action.getClip().duration, previousTime));\n if (action !== currentAction && wasActive) {\n action.play();\n }\n action.paused = wasPaused;\n bakedGroup.channelActions.set(channel, action);\n }\n }\n this.setPlaybackState(clipName, next);\n return;\n }\n\n next.blendMode = blendMode;\n const action = this.animationActions.get(clipName);\n if (!action) return;\n this.applyPlaybackState(action, next);\n this.setPlaybackState(clipName, next);\n }\n\n seekAnimation(clipName: string, time: number): void {\n const bakedGroup = this.bakedActionGroups.get(clipName);\n if (bakedGroup) {\n const state = this.getPlaybackStateSnapshot(clipName, {\n loop: true,\n source: this.clipSources.get(clipName) ?? 'baked',\n });\n const duration = this.getBakedSourceClip(clipName)?.sourceClip.duration ?? 0;\n const clamped = Math.max(0, Math.min(duration, Number.isFinite(time) ? time : 0));\n for (const action of bakedGroup.channelActions.values()) {\n action.time = clamped;\n }\n try {\n this.animationMixer?.update(0);\n this.clipAnimationMixer?.update(0);\n if (state.blendMode === 'additive') {\n this.host.reapplyProceduralState?.();\n }\n } catch {}\n return;\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return;\n const duration = action.getClip().duration;\n action.time = Math.max(0, Math.min(duration, Number.isFinite(time) ? time : 0));\n try {\n this.clipAnimationMixer?.update(0);\n const state = this.playbackState.get(clipName);\n if (state?.blendMode === 'additive') {\n this.host.reapplyProceduralState?.();\n }\n } catch {}\n }\n\n setAnimationTimeScale(timeScale: number): void {\n if (this.animationMixer) {\n this.animationMixer.timeScale = timeScale;\n }\n if (this.clipAnimationMixer) {\n this.clipAnimationMixer.timeScale = timeScale;\n }\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n const bakedClip = this.getBakedSourceClip(clipName);\n if (bakedClip) {\n const state = this.playbackState.get(clipName);\n const action = this.getRepresentativeBakedAction(clipName);\n if (!state && !action) {\n return null;\n }\n const loopMode = state?.loopMode\n ?? (action?.loop === LoopPingPong ? 'pingpong' : action?.loop === LoopOnce ? 'once' : 'repeat');\n const playbackRate = state?.playbackRate ?? Math.abs(action?.getEffectiveTimeScale?.() ?? 1);\n const reverse = state?.reverse ?? ((action?.getEffectiveTimeScale?.() ?? 1) < 0);\n const pausedValues = this.bakedActionGroups.get(clipName)\n ? Array.from(this.bakedActionGroups.get(clipName)!.channelActions.values()).map((entry) => entry.paused)\n : [];\n\n return {\n name: bakedClip.sourceClip.name,\n actionId: this.bakedActionGroups.get(clipName)?.actionId,\n source: state?.source ?? this.clipSources.get(clipName) ?? 'baked',\n isPlaying: this.bakedActionGroups.get(clipName)\n ? Array.from(this.bakedActionGroups.get(clipName)!.channelActions.values()).some((entry) => entry.isRunning() && !entry.paused)\n : false,\n isPaused: pausedValues.length > 0 ? pausedValues.every(Boolean) : false,\n time: action?.time ?? 0,\n duration: bakedClip.sourceClip.duration,\n speed: playbackRate,\n playbackRate,\n reverse,\n weight: state?.weight ?? action?.getEffectiveWeight?.() ?? 1,\n balance: state?.balance ?? 0,\n requestedBlendMode: state?.requestedBlendMode ?? 'replace',\n blendMode: this.getBakedAggregateBlendMode(clipName, state),\n channels: this.getBakedChannelInfo(clipName, state),\n easing: state?.easing ?? 'linear',\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: state?.repeatCount,\n isLooping: loopMode !== 'once',\n };\n }\n\n const action = this.animationActions.get(clipName);\n if (!action) return null;\n\n const clip = action.getClip();\n const state = this.playbackState.get(clipName);\n const loopMode = state?.loopMode\n ?? (action.loop === LoopPingPong ? 'pingpong' : action.loop === LoopOnce ? 'once' : 'repeat');\n const playbackRate = state?.playbackRate ?? Math.abs(action.getEffectiveTimeScale());\n const reverse = state?.reverse ?? action.getEffectiveTimeScale() < 0;\n return {\n name: clip.name,\n actionId: this.getActionId(action),\n source: state?.source ?? this.clipSources.get(clip.name) ?? 'baked',\n isPlaying: action.isRunning() && !action.paused,\n isPaused: action.paused,\n time: action.time,\n duration: clip.duration,\n speed: playbackRate,\n playbackRate,\n reverse,\n weight: state?.weight ?? action.getEffectiveWeight(),\n balance: state?.balance ?? 0,\n requestedBlendMode: state?.requestedBlendMode ?? state?.blendMode ?? 'replace',\n blendMode: state?.blendMode ?? 'replace',\n channels: state?.source === 'baked' ? this.getBakedChannelInfo(clipName, state) : undefined,\n easing: state?.easing ?? 'linear',\n loop: loopMode !== 'once',\n loopMode,\n repeatCount: state?.repeatCount,\n isLooping: loopMode !== 'once',\n };\n }\n\n getPlayingAnimations(): AnimationState[] {\n const playing: AnimationState[] = [];\n for (const name of this.bakedActionGroups.keys()) {\n const state = this.getAnimationState(name);\n if (state?.isPlaying) {\n playing.push(state);\n }\n }\n for (const [name, action] of this.animationActions) {\n if (action.isRunning()) {\n const state = this.getAnimationState(name);\n if (state) playing.push(state);\n }\n }\n return playing;\n }\n\n crossfadeTo(clipName: string, duration = 0.3, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n for (const group of this.bakedActionGroups.values()) {\n for (const action of group.channelActions.values()) {\n if (action.isRunning()) {\n action.fadeOut(duration);\n }\n }\n }\n for (const action of this.animationActions.values()) {\n if (action.isRunning()) {\n action.fadeOut(duration);\n }\n }\n\n return this.playAnimation(clipName, {\n ...options,\n crossfadeDuration: duration,\n });\n }\n\n snippetToClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): AnimationClip | null {\n const config = this.host.getConfig();\n if (!this.host.getModel()) {\n console.warn(`[Embody] snippetToClip: No model loaded for \"${clipName}\"`);\n return null;\n }\n if (Object.keys(curves).length === 0) {\n console.warn(`[Embody] snippetToClip: Empty curves for \"${clipName}\"`);\n return null;\n }\n\n const tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack> = [];\n const intensityScale = options?.intensityScale ?? 1.0;\n const globalBalance = options?.balance ?? 0;\n const balanceMap = options?.balanceMap;\n const meshNames = options?.meshNames;\n const visemeSlotCount = getProfileVisemeSlots(config).length;\n let maxTime = 0;\n\n const isNumericAU = (id: string) => /^\\d+$/.test(id);\n const isVisemeIndex = (id: string) => {\n if (options?.snippetCategory !== 'visemeSnippet') return false;\n const num = Number(id);\n return !Number.isNaN(num) && num >= 0 && num < visemeSlotCount;\n };\n\n const hasInheritedStart = (arr: ScalarKeyframe[] | undefined) => !!arr?.[0]?.inherit;\n const clampIntensity = (v: number) => Math.max(0, Math.min(2, v));\n const sampleCurve = (curveId: string, t: number) => {\n const arr = curves[curveId];\n if (!arr) return 0;\n let inheritedStartValue: number | undefined;\n if (hasInheritedStart(arr)) {\n if (isVisemeIndex(curveId)) {\n inheritedStartValue = this.host.getCurrentVisemeValue?.(Number(curveId));\n } else if (isNumericAU(curveId)) {\n inheritedStartValue = this.host.getCurrentAUValue?.(Number(curveId));\n }\n }\n return clampIntensity(\n this.sampleFinalKeyframeValue(\n arr,\n t,\n (intensity) => intensity * intensityScale,\n inheritedStartValue === undefined ? undefined : clampIntensity(inheritedStartValue)\n )\n );\n };\n\n const keyframeTimes = (() => {\n const times = new Set<number>();\n Object.values(curves).forEach((arr) => {\n arr.forEach((kf) => times.add(kf.time));\n });\n return Array.from(times).sort((a, b) => a - b);\n })();\n\n for (const [curveId, keyframes] of Object.entries(curves)) {\n if (!keyframes || keyframes.length === 0) continue;\n\n const curveMaxTime = keyframes[keyframes.length - 1].time;\n if (curveMaxTime > maxTime) maxTime = curveMaxTime;\n\n if (isNumericAU(curveId)) {\n const auId = Number(curveId);\n\n if (isVisemeIndex(curveId)) {\n const visemeMeshNames = this.getMeshNamesForViseme(config, meshNames);\n for (const target of getVisemeBindingTargets(config, auId)) {\n const effectiveScale = intensityScale * target.weight;\n if (typeof target.morph === 'number') {\n this.addMorphIndexTracks(tracks, target.morph, keyframes, effectiveScale, visemeMeshNames);\n } else if (target.morph) {\n this.addMorphTracks(tracks, target.morph, keyframes, effectiveScale, visemeMeshNames);\n }\n }\n } else {\n const auMeshNames = this.getMeshNamesForAU(auId, config, meshNames);\n const morphsBySide = config.auToMorphs[auId];\n const mixWeight = this.host.isMixedAU(auId) ? this.host.getAUMixWeight(auId) : 1.0;\n\n const leftKeys = morphsBySide?.left ?? [];\n const rightKeys = morphsBySide?.right ?? [];\n const centerKeys = morphsBySide?.center ?? [];\n\n const curveBalance = resolveCurveBalance(curveId, globalBalance, balanceMap);\n\n for (const morphKey of leftKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (curveBalance > 0) effectiveScale *= (1 - curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n for (const morphKey of rightKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (curveBalance < 0) effectiveScale *= (1 + curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n for (const morphKey of centerKeys) {\n const effectiveScale = intensityScale * mixWeight;\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, auMeshNames);\n }\n }\n }\n } else {\n this.addMorphTracks(tracks, curveId, keyframes, intensityScale, meshNames);\n }\n }\n\n // Auto-generate jaw bone rotation from viseme curves when enabled\n // This replicates transitionViseme behavior for clip-based playback\n const autoVisemeJaw = options?.autoVisemeJaw !== false; // Default true\n const jawScale = options?.jawScale ?? 1.0;\n const visemeJawAmounts = getVisemeJawAmounts(config);\n const bones = this.host.getBones();\n const autoVisemeJawBinding = getAutoVisemeJawBinding(config, bones);\n const autoVisemeJawNodeKey = autoVisemeJawBinding?.node as BoneKey | undefined;\n let autoVisemeJawHandledJaw = false;\n\n if (\n autoVisemeJaw &&\n jawScale > 0 &&\n visemeJawAmounts &&\n autoVisemeJawBinding &&\n options?.snippetCategory === 'visemeSnippet' &&\n keyframeTimes.length > 0\n ) {\n const jawEntry = bones[autoVisemeJawBinding.node] ?? bones.JAW;\n\n if (jawEntry) {\n autoVisemeJawHandledJaw = true;\n // Sample all viseme curves at each keyframe time and compute weighted jaw amount\n const jawValues: number[] = [];\n const inheritedJawStart = keyframeTimes.length > 0\n && Array.from({ length: visemeSlotCount }, (_, index) => curves[String(index)])\n .some((curve) => hasInheritedStart(curve));\n const currentJawQ = inheritedJawStart\n ? this.host.getCurrentBoneQuaternion?.(autoVisemeJawBinding.node) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentJawQ) {\n jawValues.push(currentJawQ.x, currentJawQ.y, currentJawQ.z, currentJawQ.w);\n continue;\n }\n let jawAmount = 0;\n\n // Sum contributions from all active visemes at time t\n for (let visemeIdx = 0; visemeIdx < visemeSlotCount; visemeIdx++) {\n const visemeCurve = curves[String(visemeIdx)];\n if (!visemeCurve) continue;\n\n const visemeValue = sampleCurve(String(visemeIdx), t);\n if (visemeValue > 0 && visemeIdx < visemeJawAmounts.length) {\n // Take max jaw amount across all active visemes (like transitionViseme)\n const visemeJaw = visemeJawAmounts[visemeIdx] * visemeValue * jawScale;\n if (visemeJaw > jawAmount) {\n jawAmount = visemeJaw;\n }\n }\n }\n\n const maxDegrees = autoVisemeJawBinding.maxDegrees ?? 30;\n const radians = (maxDegrees * Math.PI / 180) * jawAmount;\n const jawQ = new Quaternion().copy(jawEntry.baseQuat);\n jawQ.multiply(new Quaternion().setFromAxisAngle(\n axisVectorForRotationChannel(autoVisemeJawBinding.channel),\n radians * autoVisemeJawBinding.scale\n ));\n\n jawValues.push(jawQ.x, jawQ.y, jawQ.z, jawQ.w);\n }\n\n const trackName = `${jawEntry.obj.uuid}.quaternion`;\n tracks.push(new QuaternionKeyframeTrack(trackName, keyframeTimes, jawValues));\n }\n }\n\n if (keyframeTimes.length > 0) {\n const compositeRotations = this.host.getCompositeRotations();\n const hasCurveAU = new Set<number>(\n Object.keys(curves)\n .filter(isNumericAU)\n .map((id) => Number(id))\n );\n\n const getAxisBinding = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n axisValue: number,\n t: number\n ) => {\n return getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n axisValue,\n (auId: number) => getAxisSampleForNode(auId, nodeKey, t),\n config.auToBones\n );\n };\n\n const getAxisSampleForNode = (\n auId: number,\n nodeKey: BoneKey,\n t: number\n ) => {\n const rawValue = sampleCurve(String(auId), t);\n if (rawValue <= 1e-6) return 0;\n\n const binding = config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n\n const curveBalance = resolveCurveBalance(String(auId), globalBalance, balanceMap);\n return rawValue * getSideScale(curveBalance, binding.side);\n };\n\n const getAxisValue = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n t: number\n ) =>\n getCompositeAxisValue(axisConfig, (auId: number) => getAxisSampleForNode(auId, nodeKey, t));\n\n for (const composite of compositeRotations) {\n const nodeKey = composite.node as BoneKey;\n\n if (autoVisemeJawHandledJaw && (nodeKey === autoVisemeJawNodeKey || nodeKey === 'JAW')) {\n continue;\n }\n\n const entry = bones[nodeKey];\n if (!entry) {\n console.log(`[snippetToClip] Skipping composite for \"${nodeKey}\" - bone not resolved`);\n continue;\n }\n\n const relevantAUs = new Set<number>();\n [composite.pitch, composite.yaw, composite.roll]\n .filter(Boolean)\n .forEach((axisConfig) => {\n axisConfig!.aus.forEach((auId) => {\n if (hasCurveAU.has(auId)) relevantAUs.add(auId);\n });\n });\n\n if (relevantAUs.size === 0) {\n continue;\n }\n\n const values: number[] = [];\n const currentBoneQ = Array.from(relevantAUs).some((auId) => hasInheritedStart(curves[String(auId)]))\n ? this.host.getCurrentBoneQuaternion?.(nodeKey) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentBoneQ) {\n values.push(currentBoneQ.x, currentBoneQ.y, currentBoneQ.z, currentBoneQ.w);\n continue;\n }\n const compositeQ = new Quaternion().copy(entry.baseQuat);\n\n const applyAxis = (\n axisConfig: RotationAxis | null | undefined\n ) => {\n if (!axisConfig) return;\n let axisValue = getAxisValue(nodeKey, axisConfig, t);\n if (Math.abs(axisValue) <= 1e-6) return;\n\n const binding = getAxisBinding(nodeKey, axisConfig, axisValue, t);\n if (!binding?.maxDegrees || !binding.channel) return;\n\n const radians = (binding.maxDegrees * Math.PI / 180) * Math.abs(axisValue) * binding.scale;\n const axis = binding.channel === 'rx' ? X_AXIS : binding.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n };\n\n applyAxis(composite.yaw);\n applyAxis(composite.pitch);\n applyAxis(composite.roll);\n\n values.push(compositeQ.x, compositeQ.y, compositeQ.z, compositeQ.w);\n }\n\n const trackName = `${entry.obj.uuid}.quaternion`;\n tracks.push(new QuaternionKeyframeTrack(trackName, keyframeTimes, values));\n }\n\n for (const curveId of Object.keys(curves)) {\n if (!isNumericAU(curveId)) continue;\n const auId = Number(curveId);\n const bindings = config.auToBones[auId] || [];\n const curve = curves[curveId];\n if (!curve || curve.length === 0) continue;\n\n for (const binding of bindings) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n const entry = bones[binding.node as BoneKey];\n if (!entry || binding.maxUnits === undefined) continue;\n\n const axisIndex: 'x' | 'y' | 'z' = binding.channel === 'tx' ? 'x' : binding.channel === 'ty' ? 'y' : 'z';\n const basePos = entry.basePos[axisIndex];\n const inheritedStartValue = curve[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(binding.node, axisIndex) ?? entry.obj.position[axisIndex]\n : undefined;\n const values: number[] = [];\n\n for (const t of keyframeTimes) {\n values.push(\n this.sampleFinalKeyframeValue(\n curve,\n t,\n (intensity) => {\n const v = clampIntensity(intensity * intensityScale);\n return basePos + (v * binding.maxUnits! * binding.scale);\n },\n inheritedStartValue\n )\n );\n }\n\n const trackName = `${entry.obj.uuid}.position[${axisIndex}]`;\n tracks.push(new NumberKeyframeTrack(trackName, keyframeTimes, values));\n }\n }\n }\n\n if (tracks.length === 0) {\n console.warn(`[Embody] snippetToClip: No tracks created for \"${clipName}\"`);\n return null;\n }\n\n const clip = new AnimationClip(clipName, maxTime, tracks);\n this.setClipEventMetadata(clip, { keyframeTimes });\n this.dynamicClipSources.set(clip, {\n clipName,\n curves,\n options,\n hasInheritedStart: this.curvesHaveInheritedStart(curves),\n });\n this.debugClipLog(`[Embody] snippetToClip: Created clip \"${clipName}\" with ${tracks.length} tracks, duration ${maxTime.toFixed(2)}s`);\n\n return clip;\n }\n\n typedSnippetToClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): AnimationClip | null {\n const config = this.host.getConfig();\n if (!this.host.getModel()) {\n console.warn(`[Embody] typedSnippetToClip: No model loaded for \"${clipName}\"`);\n return null;\n }\n if (channels.length === 0) {\n console.warn(`[Embody] typedSnippetToClip: Empty channels for \"${clipName}\"`);\n return null;\n }\n\n const tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack> = [];\n const intensityScale = options?.intensityScale ?? 1.0;\n const globalBalance = options?.balance ?? 0;\n const balanceMap = options?.balanceMap;\n const meshNames = options?.meshNames;\n const bones = this.host.getBones();\n type ProfileMappedTarget =\n | Extract<SnippetChannel['target'], { type: 'au' }>\n | Extract<SnippetChannel['target'], { type: 'lipSync' }>;\n const isProfileMappedTarget = (target: SnippetChannel['target']): target is ProfileMappedTarget =>\n target.type === 'au' || target.type === 'lipSync';\n const isProfileMappedChannel = (channel: SnippetChannel): channel is SnippetChannel & { target: ProfileMappedTarget } =>\n isProfileMappedTarget(channel.target);\n const visemeChannels = channels.filter((channel) => channel.target.type === 'viseme');\n const lipSyncChannels = channels.filter((channel) => channel.target.type === 'lipSync');\n const auChannels = channels.filter((channel) => channel.target.type === 'au');\n const profileMappedChannels = channels.filter(isProfileMappedChannel);\n let maxTime = 0;\n\n logTypedLipSyncDebug('[Embody Typed LipSync] typedSnippetToClip input', {\n clipName,\n channelCount: channels.length,\n visemeChannels: visemeChannels.map(summarizeTypedChannel),\n lipSyncChannels: lipSyncChannels.map(summarizeTypedChannel),\n auChannels: auChannels.map(summarizeTypedChannel),\n options: {\n source: options?.source,\n autoVisemeJaw: options?.autoVisemeJaw,\n jawScale: options?.jawScale,\n intensityScale: options?.intensityScale,\n snippetCategory: options?.snippetCategory,\n },\n });\n\n const hasInheritedStart = (arr: ScalarKeyframe[] | undefined) => !!arr?.[0]?.inherit;\n const clampIntensity = (v: number) => Math.max(0, Math.min(2, v));\n const channelScale = (channel: SnippetChannel) => intensityScale * (channel.intensityScale ?? 1);\n\n const keyframeTimes = (() => {\n const times = new Set<number>();\n channels.forEach((channel) => {\n channel.keyframes.forEach((kf) => times.add(kf.time));\n });\n return Array.from(times).sort((a, b) => a - b);\n })();\n\n const sampleTypedChannel = (\n channel: SnippetChannel,\n t: number\n ) => {\n let inheritedStartValue: number | undefined;\n if (hasInheritedStart(channel.keyframes)) {\n const target = channel.target;\n if (target.type === 'viseme') {\n inheritedStartValue = this.host.getCurrentVisemeValue?.(target.id);\n } else if (target.type === 'au') {\n inheritedStartValue = this.host.getCurrentAUValue?.(target.id);\n } else if (target.type === 'morph') {\n inheritedStartValue = typeof target.id === 'number'\n ? this.host.getCurrentMorphIndexValue?.(target.id, target.meshNames ?? meshNames)\n : this.host.getCurrentMorphValue?.(target.id, target.meshNames ?? meshNames);\n } else if (target.type === 'bone' && (target.channel === 'tx' || target.channel === 'ty' || target.channel === 'tz')) {\n const axis = target.channel === 'tx' ? 'x' : target.channel === 'ty' ? 'y' : 'z';\n inheritedStartValue = this.host.getCurrentBonePositionValue?.(target.id, axis) ?? undefined;\n }\n }\n return clampIntensity(\n this.sampleFinalKeyframeValue(\n channel.keyframes,\n t,\n (intensity) => intensity * channelScale(channel),\n inheritedStartValue === undefined ? undefined : clampIntensity(inheritedStartValue)\n )\n );\n };\n\n for (const channel of channels) {\n if (!channel.keyframes || channel.keyframes.length === 0) continue;\n\n const curveMaxTime = channel.keyframes[channel.keyframes.length - 1].time;\n if (curveMaxTime > maxTime) maxTime = curveMaxTime;\n const target = channel.target;\n\n if (target.type === 'viseme') {\n const visemeMeshNames = this.getMeshNamesForViseme(config, target.meshNames ?? meshNames);\n const bindingTargets = getVisemeBindingTargets(config, target.id);\n const tracksBefore = tracks.length;\n for (const bindingTarget of bindingTargets) {\n const effectiveScale = channelScale(channel) * bindingTarget.weight;\n if (typeof bindingTarget.morph === 'number') {\n this.addMorphIndexTracks(tracks, bindingTarget.morph, channel.keyframes, effectiveScale, visemeMeshNames);\n } else if (bindingTarget.morph) {\n this.addMorphTracks(tracks, bindingTarget.morph, channel.keyframes, effectiveScale, visemeMeshNames);\n }\n }\n logTypedLipSyncDebug('[Embody Typed LipSync] viseme binding', {\n clipName,\n visemeId: target.id,\n meshNames: visemeMeshNames,\n bindingCount: bindingTargets.length,\n bindings: bindingTargets.map(summarizeBindingTarget),\n keyframes: summarizeKeyframes(channel.keyframes),\n tracksBefore,\n tracksAfter: tracks.length,\n });\n continue;\n }\n\n if (isProfileMappedTarget(target)) {\n const controlMeshNames = this.getMeshNamesForAU(target.id, config, meshNames);\n const morphsBySide = config.auToMorphs[target.id];\n const mixWeight = this.host.isMixedAU(target.id) ? this.host.getAUMixWeight(target.id) : 1.0;\n const curveBalance = target.type === 'au'\n ? target.balance ?? resolveCurveBalance(String(target.id), globalBalance, balanceMap)\n : resolveCurveBalance(String(target.id), globalBalance, balanceMap);\n\n for (const morphKey of morphsBySide?.left ?? []) {\n let effectiveScale = channelScale(channel) * mixWeight;\n if (curveBalance > 0) effectiveScale *= (1 - curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n for (const morphKey of morphsBySide?.right ?? []) {\n let effectiveScale = channelScale(channel) * mixWeight;\n if (curveBalance < 0) effectiveScale *= (1 + curveBalance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n for (const morphKey of morphsBySide?.center ?? []) {\n const effectiveScale = channelScale(channel) * mixWeight;\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, channel.keyframes, effectiveScale, controlMeshNames);\n }\n }\n continue;\n }\n\n if (target.type === 'morph') {\n const targetMeshes = target.meshNames ?? meshNames;\n if (typeof target.id === 'number') {\n this.addMorphIndexTracks(tracks, target.id, channel.keyframes, channelScale(channel), targetMeshes);\n } else {\n this.addMorphTracks(tracks, target.id, channel.keyframes, channelScale(channel), targetMeshes);\n }\n continue;\n }\n\n if (target.type === 'bone') {\n const entry = bones[target.id];\n if (!entry) continue;\n const scale = target.scale ?? 1;\n if (target.channel === 'rx' || target.channel === 'ry' || target.channel === 'rz') {\n const axis = target.channel === 'rx' ? X_AXIS : target.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const maxDegrees = target.maxDegrees ?? 30;\n const inheritedStart = hasInheritedStart(channel.keyframes)\n ? this.host.getCurrentBoneQuaternion?.(target.id) ?? null\n : null;\n const times = channel.keyframes.map((frame) => frame.time);\n const values: number[] = [];\n for (let index = 0; index < channel.keyframes.length; index += 1) {\n if (index === 0 && inheritedStart) {\n values.push(inheritedStart.x, inheritedStart.y, inheritedStart.z, inheritedStart.w);\n continue;\n }\n const intensity = clampIntensity(channel.keyframes[index].intensity * channelScale(channel));\n const radians = (maxDegrees * Math.PI / 180) * intensity * scale;\n const q = new Quaternion().copy(entry.baseQuat);\n q.multiply(new Quaternion().setFromAxisAngle(axis, radians));\n values.push(q.x, q.y, q.z, q.w);\n }\n tracks.push(new QuaternionKeyframeTrack(`${entry.obj.uuid}.quaternion`, times, values));\n } else {\n const axis = target.channel === 'tx' ? 'x' : target.channel === 'ty' ? 'y' : 'z';\n const maxUnits = target.maxUnits ?? 1;\n const inheritedStart = channel.keyframes[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(target.id, axis) ?? entry.obj.position[axis]\n : undefined;\n const values = channel.keyframes.map((frame, index) => {\n if (index === 0 && inheritedStart !== undefined) return inheritedStart;\n const intensity = clampIntensity(frame.intensity * channelScale(channel));\n return entry.basePos[axis] + intensity * maxUnits * scale;\n });\n tracks.push(new NumberKeyframeTrack(\n `${entry.obj.uuid}.position[${axis}]`,\n channel.keyframes.map((frame) => frame.time),\n values\n ));\n }\n continue;\n }\n\n const unsupportedType = String((target as { type?: unknown }).type ?? 'unknown');\n console.warn(`[Embody] typedSnippetToClip: Unsupported typed snippet target \"${unsupportedType}\" in \"${clipName}\"`);\n }\n\n const autoVisemeJaw = options?.autoVisemeJaw === true;\n const jawScale = options?.jawScale ?? 1.0;\n const visemeJawAmounts = getVisemeJawAmounts(config);\n const autoVisemeJawBinding = getAutoVisemeJawBinding(config, bones);\n const autoVisemeJawNodeKey = autoVisemeJawBinding?.node as BoneKey | undefined;\n let autoVisemeJawHandledJaw = false;\n if (autoVisemeJaw && jawScale > 0 && visemeJawAmounts && autoVisemeJawBinding && visemeChannels.length > 0 && keyframeTimes.length > 0) {\n const jawEntry = bones[autoVisemeJawBinding.node] ?? bones.JAW;\n if (jawEntry) {\n autoVisemeJawHandledJaw = true;\n const jawValues: number[] = [];\n const inheritedJawStart = visemeChannels.some((channel) => hasInheritedStart(channel.keyframes));\n const currentJawQ = inheritedJawStart ? this.host.getCurrentBoneQuaternion?.(autoVisemeJawBinding.node) ?? null : null;\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentJawQ) {\n jawValues.push(currentJawQ.x, currentJawQ.y, currentJawQ.z, currentJawQ.w);\n continue;\n }\n let jawAmount = 0;\n for (const channel of visemeChannels) {\n const target = channel.target;\n if (target.type !== 'viseme') continue;\n if (target.id < 0 || target.id >= visemeJawAmounts.length) continue;\n const visemeValue = sampleTypedChannel(channel, t);\n const visemeJaw = visemeJawAmounts[target.id] * visemeValue * jawScale;\n if (visemeJaw > jawAmount) jawAmount = visemeJaw;\n }\n const maxDegrees = autoVisemeJawBinding.maxDegrees ?? 30;\n const radians = (maxDegrees * Math.PI / 180) * jawAmount;\n const jawQ = new Quaternion().copy(jawEntry.baseQuat);\n jawQ.multiply(new Quaternion().setFromAxisAngle(\n axisVectorForRotationChannel(autoVisemeJawBinding.channel),\n radians * autoVisemeJawBinding.scale\n ));\n jawValues.push(jawQ.x, jawQ.y, jawQ.z, jawQ.w);\n }\n tracks.push(new QuaternionKeyframeTrack(`${jawEntry.obj.uuid}.quaternion`, keyframeTimes, jawValues));\n }\n }\n\n if (keyframeTimes.length > 0 && profileMappedChannels.length > 0) {\n const compositeRotations = this.host.getCompositeRotations();\n const hasChannelAU = new Set<number>(\n profileMappedChannels.map((channel) => channel.target.id)\n );\n const channelsByAU = new Map<number, SnippetChannel[]>();\n profileMappedChannels.forEach((channel) => {\n const existing = channelsByAU.get(channel.target.id) ?? [];\n existing.push(channel);\n channelsByAU.set(channel.target.id, existing);\n });\n\n const getAxisSampleForNode = (\n auId: number,\n nodeKey: BoneKey,\n t: number\n ) => {\n const channelsForAU = channelsByAU.get(auId);\n if (!channelsForAU) return 0;\n\n let value = 0;\n for (const channel of channelsForAU) {\n if (!isProfileMappedTarget(channel.target)) continue;\n const rawValue = sampleTypedChannel(channel, t);\n if (rawValue <= 1e-6) continue;\n\n const binding = config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n if (!binding?.side) {\n value = Math.max(value, rawValue);\n continue;\n }\n\n const curveBalance = channel.target.type === 'au'\n ? channel.target.balance ?? resolveCurveBalance(String(auId), globalBalance, balanceMap)\n : resolveCurveBalance(String(auId), globalBalance, balanceMap);\n value = Math.max(value, rawValue * getSideScale(curveBalance, binding.side));\n }\n return value;\n };\n\n const getAxisValue = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n t: number\n ) =>\n getCompositeAxisValue(axisConfig, (auId: number) => getAxisSampleForNode(auId, nodeKey, t));\n\n const getAxisBinding = (\n nodeKey: BoneKey,\n axisConfig: RotationAxis | null | undefined,\n axisValue: number,\n t: number\n ) => getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n axisValue,\n (auId: number) => getAxisSampleForNode(auId, nodeKey, t),\n config.auToBones\n );\n\n for (const composite of compositeRotations) {\n const nodeKey = composite.node as BoneKey;\n\n if (autoVisemeJawHandledJaw && (nodeKey === autoVisemeJawNodeKey || nodeKey === 'JAW')) {\n continue;\n }\n\n const entry = bones[nodeKey];\n if (!entry) {\n this.debugClipLog(`[typedSnippetToClip] Skipping composite for \"${nodeKey}\" - bone not resolved`);\n continue;\n }\n\n const relevantAUs = new Set<number>();\n [composite.pitch, composite.yaw, composite.roll]\n .filter(Boolean)\n .forEach((axisConfig) => {\n axisConfig!.aus.forEach((auId) => {\n if (hasChannelAU.has(auId)) relevantAUs.add(auId);\n });\n });\n\n if (relevantAUs.size === 0) {\n continue;\n }\n\n const values: number[] = [];\n const currentBoneQ = Array.from(relevantAUs).some((auId) =>\n channelsByAU.get(auId)?.some((channel) => hasInheritedStart(channel.keyframes))\n )\n ? this.host.getCurrentBoneQuaternion?.(nodeKey) ?? null\n : null;\n\n for (let timeIndex = 0; timeIndex < keyframeTimes.length; timeIndex += 1) {\n const t = keyframeTimes[timeIndex];\n if (timeIndex === 0 && currentBoneQ) {\n values.push(currentBoneQ.x, currentBoneQ.y, currentBoneQ.z, currentBoneQ.w);\n continue;\n }\n\n const compositeQ = new Quaternion().copy(entry.baseQuat);\n\n const applyAxis = (\n axisConfig: RotationAxis | null | undefined\n ) => {\n if (!axisConfig) return;\n const axisValue = getAxisValue(nodeKey, axisConfig, t);\n if (Math.abs(axisValue) <= 1e-6) return;\n\n const binding = getAxisBinding(nodeKey, axisConfig, axisValue, t);\n if (!binding?.maxDegrees || !binding.channel) return;\n\n const radians = (binding.maxDegrees * Math.PI / 180) * Math.abs(axisValue) * binding.scale;\n const axis = binding.channel === 'rx' ? X_AXIS : binding.channel === 'ry' ? Y_AXIS : Z_AXIS;\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n };\n\n applyAxis(composite.yaw);\n applyAxis(composite.pitch);\n applyAxis(composite.roll);\n\n values.push(compositeQ.x, compositeQ.y, compositeQ.z, compositeQ.w);\n }\n\n tracks.push(new QuaternionKeyframeTrack(`${entry.obj.uuid}.quaternion`, keyframeTimes, values));\n }\n\n for (const channel of profileMappedChannels) {\n const auId = channel.target.id;\n const bindings = config.auToBones[auId] || [];\n\n for (const binding of bindings) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n const entry = bones[binding.node as BoneKey];\n if (!entry || binding.maxUnits === undefined) continue;\n\n const axisIndex: 'x' | 'y' | 'z' = binding.channel === 'tx' ? 'x' : binding.channel === 'ty' ? 'y' : 'z';\n const basePos = entry.basePos[axisIndex];\n const inheritedStartValue = channel.keyframes[0]?.inherit\n ? this.host.getCurrentBonePositionValue?.(binding.node, axisIndex) ?? entry.obj.position[axisIndex]\n : undefined;\n const values: number[] = [];\n\n for (const t of keyframeTimes) {\n const rawValue = sampleTypedChannel(channel, t);\n const curveBalance = channel.target.type === 'au'\n ? channel.target.balance ?? resolveCurveBalance(String(auId), globalBalance, balanceMap)\n : resolveCurveBalance(String(auId), globalBalance, balanceMap);\n const sideScale = binding.side ? getSideScale(curveBalance, binding.side) : 1;\n const value = clampIntensity(rawValue * sideScale);\n values.push(\n inheritedStartValue !== undefined && t === keyframeTimes[0]\n ? inheritedStartValue\n : basePos + (value * binding.maxUnits * binding.scale)\n );\n }\n\n tracks.push(new NumberKeyframeTrack(`${entry.obj.uuid}.position[${axisIndex}]`, keyframeTimes, values));\n }\n }\n }\n\n if (tracks.length === 0) {\n console.warn(`[Embody] typedSnippetToClip: No tracks created for \"${clipName}\"`);\n return null;\n }\n\n const clip = new AnimationClip(clipName, maxTime, tracks);\n this.setClipEventMetadata(clip, { keyframeTimes });\n this.dynamicClipSources.set(clip, {\n clipName,\n channels,\n options,\n hasInheritedStart: this.channelsHaveInheritedStart(channels),\n });\n logTypedLipSyncDebug('[Embody Typed LipSync] clip created', {\n clipName,\n trackCount: tracks.length,\n durationSec: maxTime,\n visemeIds: visemeChannels.map((channel) => channel.target.type === 'viseme' ? channel.target.id : null),\n lipSyncIds: lipSyncChannels.map((channel) => channel.target.type === 'lipSync' ? channel.target.id : null),\n auIds: auChannels.map((channel) => channel.target.type === 'au' ? channel.target.id : null),\n });\n this.debugClipLog(`[Embody] typedSnippetToClip: Created clip \"${clipName}\" with ${tracks.length} tracks, duration ${maxTime.toFixed(2)}s`);\n\n return clip;\n }\n\n private playClipDirect(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n const mixer = this.ensureClipMixer();\n\n if (!mixer) {\n console.warn('[Embody] playClip: No model loaded, cannot create mixer');\n return null;\n }\n const hasInheritedStart = !!this.dynamicClipSources.get(clip)?.hasInheritedStart;\n clip = this.resolveInheritedClipForPlayback(clip);\n\n const playbackState = this.mergePlaybackOptions(\n this.getPlaybackStateSnapshot(clip.name, {\n loop: false,\n source: options?.source ?? 'clip',\n }),\n options\n );\n const startTime = this.resolveStartTime(clip.duration, playbackState, options?.startTime);\n\n let action: AnimationAction;\n let actionId: string;\n let existingAction = this.clipActions.get(clip.name);\n if (existingAction && hasInheritedStart && existingAction.getClip() !== clip) {\n const previousClip = existingAction.getClip();\n const previousActionId = this.getActionId(existingAction);\n try { existingAction.stop(); } catch {}\n try { mixer.uncacheAction(previousClip); } catch {}\n try { mixer.uncacheClip(previousClip); } catch {}\n if (previousActionId) this.cleanupClipMonitor(previousActionId);\n this.clipActions.delete(clip.name);\n this.animationActions.delete(clip.name);\n existingAction = undefined;\n }\n if (existingAction) {\n action = existingAction;\n actionId = this.getActionId(action) ?? this.setActionId(action, clip.name);\n } else {\n action = mixer.clipAction(clip);\n actionId = this.setActionId(action, clip.name);\n }\n\n const existingClip = this.animationClips.find(c => c.name === clip.name);\n if (!existingClip) {\n this.animationClips.push(clip);\n }\n this.applyPlaybackState(action, playbackState);\n\n this.cleanupClipMonitor(actionId);\n\n let resolveFinished!: () => void;\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n const createMonitor = (\n listeners = new Set<ClipEventListener>(),\n state = this.playbackState.get(clip.name) ?? playbackState\n ): ClipMonitor => {\n const keyframeTimes = this.getClipEventMetadata(clip).keyframeTimes;\n const initialDirection: 1 | -1 = state.reverse ? -1 : 1;\n return {\n action,\n actionId,\n clip,\n clipName: clip.name,\n duration: clip.duration,\n keyframeTimes,\n listeners,\n initialDirection,\n direction: initialDirection,\n iteration: 0,\n lastTime: Math.max(0, Math.min(clip.duration, action.time)),\n lastKeyframeIndex: this.getKeyframeIndex(keyframeTimes, action.time),\n loopMode: state.loopMode,\n finishedPending: false,\n cleanedUp: false,\n resolveFinished,\n };\n };\n let monitor = createMonitor();\n this.clipMonitors.set(actionId, monitor);\n\n action.reset();\n action.time = startTime;\n action.play();\n this.resetClipMonitor(monitor, action.time);\n\n this.clipActions.set(clip.name, action);\n this.animationActions.set(clip.name, action);\n this.setPlaybackState(clip.name, playbackState);\n this.debugClipLog(`[Embody] playClip: Playing \"${clip.name}\" (rate: ${playbackState.playbackRate}, loop: ${playbackState.loop}, actionId: ${actionId})`);\n\n const handle: ClipHandle = {\n clipName: clip.name,\n actionId,\n\n play: () => {\n const source = this.dynamicClipSources.get(clip);\n if (source?.hasInheritedStart) {\n const listeners = new Set(monitor.listeners);\n const nextClip = this.rebuildDynamicClip(source);\n if (nextClip) {\n try { action.stop(); } catch {}\n try { mixer.uncacheAction(clip); } catch {}\n try { mixer.uncacheClip(clip); } catch {}\n this.cleanupClipMonitor(actionId, { resolveFinished: false });\n clip = nextClip;\n action = mixer.clipAction(clip);\n actionId = this.setActionId(action, clip.name);\n handle.actionId = actionId;\n const nextPlaybackState = this.playbackState.get(clip.name) ?? playbackState;\n this.applyPlaybackState(action, nextPlaybackState);\n monitor = createMonitor(listeners, nextPlaybackState);\n this.clipMonitors.set(actionId, monitor);\n this.clipActions.set(clip.name, action);\n this.animationActions.set(clip.name, action);\n }\n }\n action.reset();\n action.time = this.resolveStartTime(\n clip.duration,\n this.getPlaybackStateSnapshot(clip.name, {\n loop: false,\n source: this.clipSources.get(clip.name) ?? playbackState.source,\n })\n );\n action.play();\n this.resetClipMonitor(monitor, action.time);\n },\n\n stop: () => {\n action.stop();\n // Fully remove action from mixer to prevent accumulation and weight blending issues\n try { mixer.uncacheAction(clip); } catch {}\n try { mixer.uncacheClip(clip); } catch {}\n this.clipActions.delete(clip.name);\n this.animationActions.delete(clip.name);\n this.animationFinishedCallbacks.delete(clip.name);\n this.playbackState.delete(clip.name);\n this.rendererClipHandles.delete(clip.name);\n this.cleanupClipMonitor(actionId);\n },\n\n pause: () => {\n action.paused = true;\n },\n\n resume: () => {\n action.paused = false;\n },\n\n setWeight: (w: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.weight = typeof w === 'number' && Number.isFinite(w) ? Math.max(0, w) : 1.0;\n action.setEffectiveWeight(next.weight);\n this.setPlaybackState(clip.name, next);\n },\n\n setPlaybackRate: (r: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.playbackRate = Number.isFinite(r) ? Math.max(0, Math.abs(r)) : 1.0;\n this.applyPlaybackState(action, next);\n monitor.direction = next.reverse ? -1 : 1;\n monitor.initialDirection = monitor.direction;\n this.setPlaybackState(clip.name, next);\n },\n\n setLoop: (mode: 'once' | 'repeat' | 'pingpong', repeatCount?: number) => {\n const next = this.playbackState.get(clip.name) ?? playbackState;\n next.loopMode = mode;\n next.loop = mode !== 'once';\n next.repeatCount = repeatCount;\n this.applyPlaybackState(action, next);\n monitor.loopMode = mode;\n this.setPlaybackState(clip.name, next);\n },\n\n setTime: (t: number) => {\n const clamped = Math.max(0, Math.min(clip.duration, t));\n action.time = clamped;\n try { mixer.update(0); } catch {}\n this.syncClipMonitorTime(monitor, clamped, true);\n },\n\n getTime: () => action.time,\n\n getDuration: () => clip.duration,\n\n subscribe: (listener: ClipEventListener) => {\n monitor.listeners.add(listener);\n return () => {\n monitor.listeners.delete(listener);\n };\n },\n\n finished: finishedPromise,\n };\n this.clipHandles.set(clip.name, handle);\n this.rendererClipHandles.set(clip.name, handle);\n\n return handle;\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n return this.playClipDirect(clip, options);\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap } | TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n if ('channels' in snippet) {\n return this.playTypedSnippet(snippet, options);\n }\n if (this.cljsAnimationRuntime) {\n const handle = this.cljsAnimationRuntime.playSnippet(\n snippet.name,\n snippet.curves,\n { ...options, source: options?.source ?? 'snippet' }\n );\n if (!handle) return null;\n this.clipHandles.set(snippet.name, handle);\n return handle;\n }\n const clip = this.snippetToClip(snippet.name, snippet.curves, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'snippet' });\n }\n\n playTypedSnippet(\n snippet: TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n logTypedLipSyncDebug('[Embody Typed LipSync] playTypedSnippet', {\n name: snippet.name,\n channelCount: snippet.channels.length,\n channels: snippet.channels.map(summarizeTypedChannel),\n options: {\n source: options?.source,\n autoVisemeJaw: options?.autoVisemeJaw,\n jawScale: options?.jawScale,\n intensityScale: options?.intensityScale,\n },\n });\n const clip = this.typedSnippetToClip(snippet.name, snippet.channels, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'snippet' });\n }\n\n buildClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n if (this.cljsAnimationRuntime) {\n const handle = this.cljsAnimationRuntime.buildClip(\n clipName,\n curves,\n { ...options, source: options?.source ?? 'clip' }\n );\n if (!handle) return null;\n this.clipHandles.set(clipName, handle);\n return handle;\n }\n\n return this.buildClipDirect(clipName, curves, options);\n }\n\n private buildClipDirect(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n const clip = this.snippetToClip(clipName, curves, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'clip' });\n }\n\n buildTypedClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): ClipHandle | null {\n const clip = this.typedSnippetToClip(clipName, channels, options);\n if (!clip) {\n return null;\n }\n return this.playClipDirect(clip, { ...options, source: options?.source ?? 'clip' });\n }\n\n cleanupSnippet(name: string) {\n if (this.cljsAnimationRuntime) {\n this.cljsAnimationRuntime.cleanupSnippet(name);\n }\n this.cleanupSnippetDirect(name);\n }\n\n private cleanupSnippetDirect(name: string) {\n if (!this.host.getModel()) return;\n for (const [clipName, action] of Array.from(this.clipActions.entries())) {\n if (clipName === name || clipName.startsWith(`${name}_`)) {\n const actionId = this.getActionId(action);\n try {\n action.stop();\n // Fully remove action from mixer to prevent accumulation\n const clip = action.getClip();\n if (clip && this.clipAnimationMixer) {\n this.clipAnimationMixer.uncacheAction(clip);\n this.clipAnimationMixer.uncacheClip(clip);\n }\n } catch {}\n this.clipActions.delete(clipName);\n this.animationActions.delete(clipName);\n this.clipHandles.delete(clipName);\n this.rendererClipHandles.delete(clipName);\n this.animationFinishedCallbacks.delete(clipName);\n this.playbackState.delete(clipName);\n if (actionId) this.cleanupClipMonitor(actionId);\n }\n }\n }\n\n updateClipParams(name: string, params: ClipParamsUpdate): boolean {\n if (this.cljsAnimationRuntime) {\n this.cljsAnimationRuntime.updateClipParams(name, params);\n }\n\n return this.updateClipParamsDirect(name, params);\n }\n\n private updateClipParamsDirect(name: string, params: ClipParamsUpdate): boolean {\n let updated = false;\n const matches = (clipName: string, action?: AnimationAction | null) => {\n if (params.actionId) {\n const aid = action ? this.actionIds.get(action) : this.actionIdToClip.get(params.actionId);\n if (aid && aid === params.actionId) return true;\n }\n return clipName === name || clipName.startsWith(`${name}_`) || clipName.includes(name);\n };\n\n const debugSnapshot = () => ({\n target: name,\n params,\n clipActions: Array.from(this.clipActions.entries()).map(([k, a]) => ({ name: k, actionId: this.getActionId(a) })),\n animationActions: Array.from(this.animationActions.entries()).map(([k, a]) => ({ name: k, actionId: this.getActionId(a) })),\n clipHandles: Array.from(this.clipHandles.entries()).map(([k, h]) => ({ name: k, actionId: h.actionId })),\n mixerActions: [\n ...(this.animationMixer?._actions || []),\n ...(this.clipAnimationMixer?._actions || []),\n ].map((a: AnimationAction) => ({ name: a?.getClip?.()?.name || '', actionId: this.getActionId(a) })),\n });\n\n this.debugClipLog('[Embody] updateClipParams start', debugSnapshot());\n\n const apply = (action: AnimationAction | null | undefined) => {\n if (!action) return;\n const actionId = this.getActionId(action);\n const monitor = actionId ? this.clipMonitors.get(actionId) : undefined;\n const clipName = action.getClip().name;\n const next = this.playbackState.get(clipName)\n ?? this.normalizePlaybackOptions(undefined, { loop: false, source: this.clipSources.get(clipName) ?? 'clip' });\n try { action.paused = false; } catch {}\n if (typeof params.weight === 'number' && Number.isFinite(params.weight)) {\n action.setEffectiveWeight(params.weight);\n next.weight = Math.max(0, params.weight);\n updated = true;\n }\n if (typeof params.rate === 'number' && Number.isFinite(params.rate)) {\n next.playbackRate = Math.max(0, Math.abs(params.rate));\n if (typeof params.reverse === 'boolean') {\n next.reverse = params.reverse;\n }\n const signedRate = next.reverse ? -next.playbackRate : next.playbackRate;\n action.setEffectiveTimeScale(signedRate);\n if (monitor) {\n monitor.direction = next.reverse ? -1 : 1;\n monitor.initialDirection = monitor.direction;\n }\n updated = true;\n }\n if (typeof params.loop === 'boolean' || params.loopMode || params.repeatCount !== undefined) {\n next.loopMode = params.loopMode || (params.loop ? 'repeat' : 'once');\n next.loop = next.loopMode !== 'once';\n next.repeatCount = params.repeatCount;\n this.applyPlaybackState(action, next);\n if (monitor) monitor.loopMode = next.loopMode;\n updated = true;\n }\n this.setPlaybackState(clipName, next);\n };\n\n for (const [clipName, action] of this.clipActions.entries()) {\n if (matches(clipName, action)) {\n apply(action);\n }\n }\n for (const [clipName, action] of this.animationActions.entries()) {\n if (matches(clipName, action)) {\n apply(action);\n }\n }\n\n if (!updated && params.actionId) {\n const clipName = this.actionIdToClip.get(params.actionId);\n if (clipName) {\n const action = this.clipActions.get(clipName) || this.animationActions.get(clipName);\n if (action) apply(action);\n }\n }\n\n this.debugClipLog('[Embody] updateClipParams end', debugSnapshot());\n return updated;\n }\n\n private addMorphTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphKey: string,\n keyframes: ScalarKeyframe[],\n intensityScale: number,\n meshNames?: string[]\n ): void {\n const config = this.host.getConfig();\n const hasExplicitMeshes = meshNames !== undefined;\n const targetMeshNames = hasExplicitMeshes ? meshNames : (config.morphToMesh?.face || []);\n const targetMeshes = targetMeshNames.length\n ? targetMeshNames.map((name) => this.host.getMeshByName(name)).filter(Boolean) as Mesh[]\n : [];\n\n const addTrackForMesh = (mesh: Mesh) => {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl || dict[morphKey] === undefined) return;\n\n const morphIndex = dict[morphKey];\n const inheritedStartValue = keyframes[0]?.inherit ? infl[morphIndex] ?? 0 : undefined;\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(\n Math.max(\n 0,\n Math.min(\n 2,\n this.sampleFinalKeyframeValue(\n keyframes,\n kf.time,\n (intensity) => intensity * intensityScale,\n inheritedStartValue\n )\n )\n )\n );\n }\n\n const trackName = `${mesh.uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n }\n\n private addMorphIndexTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphIndex: number,\n keyframes: ScalarKeyframe[],\n intensityScale: number,\n meshNames?: string[]\n ): void {\n if (!Number.isInteger(morphIndex) || morphIndex < 0) return;\n const config = this.host.getConfig();\n const hasExplicitMeshes = meshNames !== undefined;\n const targetMeshNames = hasExplicitMeshes ? meshNames : (config.morphToMesh?.face || []);\n const targetMeshes = targetMeshNames.length\n ? targetMeshNames.map((name) => this.host.getMeshByName(name)).filter(Boolean) as Mesh[]\n : [];\n\n const addTrackForMesh = (mesh: Mesh) => {\n const infl = mesh.morphTargetInfluences;\n if (!infl || morphIndex < 0 || morphIndex >= infl.length) return;\n const inheritedStartValue = keyframes[0]?.inherit ? infl[morphIndex] ?? 0 : undefined;\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(\n Math.max(\n 0,\n Math.min(\n 2,\n this.sampleFinalKeyframeValue(\n keyframes,\n kf.time,\n (intensity) => intensity * intensityScale,\n inheritedStartValue\n )\n )\n )\n );\n }\n\n const trackName = `${mesh.uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n }\n\n private sampleFinalKeyframeValue(\n keyframes: ScalarKeyframe[],\n t: number,\n toFinalValue: (intensity: number) => number,\n inheritedStartValue?: number\n ): number {\n if (!keyframes.length) return 0;\n const firstValue = inheritedStartValue ?? toFinalValue(keyframes[0].intensity);\n if (t <= keyframes[0].time) return firstValue;\n if (t >= keyframes[keyframes.length - 1].time) {\n return toFinalValue(keyframes[keyframes.length - 1].intensity);\n }\n\n for (let i = 0; i < keyframes.length - 1; i += 1) {\n const a = keyframes[i];\n const b = keyframes[i + 1];\n if (t >= a.time && t <= b.time) {\n const dt = Math.max(1e-6, b.time - a.time);\n const p = (t - a.time) / dt;\n const aValue = i === 0 ? firstValue : toFinalValue(a.intensity);\n const bValue = toFinalValue(b.intensity);\n return aValue + (bValue - aValue) * p;\n }\n }\n\n return 0;\n }\n\n private ensureMixer(): AnimationMixer | null {\n const model = this.host.getModel();\n if (!model) return null;\n\n if (!this.animationMixer) {\n this.animationMixer = new AnimationMixer(model);\n }\n\n if (this.animationMixer && !this.mixerFinishedListenerAttached) {\n this.animationMixer.addEventListener('finished', (event: any) => this.handleMixerFinished(event));\n this.mixerFinishedListenerAttached = true;\n }\n\n return this.animationMixer;\n }\n\n private ensureClipMixer(): AnimationMixer | null {\n const model = this.host.getModel();\n if (!model) return null;\n\n if (!this.clipAnimationMixer) {\n this.clipAnimationMixer = new AnimationMixer(model);\n }\n\n if (this.clipAnimationMixer && !this.clipMixerFinishedListenerAttached) {\n this.clipAnimationMixer.addEventListener('finished', (event: any) => this.handleMixerFinished(event));\n this.clipMixerFinishedListenerAttached = true;\n }\n\n return this.clipAnimationMixer;\n }\n\n private handleMixerFinished(event: any): void {\n const action = event.action as AnimationAction;\n const actionId = this.getActionId(action);\n if (actionId) {\n const monitor = this.clipMonitors.get(actionId);\n if (monitor) {\n monitor.finishedPending = true;\n return;\n }\n }\n const clip = action.getClip();\n const bakedMixerClip = this.bakedMixerClipToSource.get(clip.name);\n if (bakedMixerClip) {\n const group = this.bakedActionGroups.get(bakedMixerClip.sourceClipName);\n if (group && group.pendingFinishedChannels.delete(bakedMixerClip.channel) && group.pendingFinishedChannels.size === 0) {\n group.resolveFinished();\n }\n return;\n }\n const callback = this.animationFinishedCallbacks.get(clip.name);\n if (callback) {\n callback();\n this.animationFinishedCallbacks.delete(clip.name);\n }\n }\n\n private createAnimationHandle(\n clipName: string,\n action: AnimationAction,\n finishedPromise: Promise<void>\n ): AnimationActionHandle {\n return {\n actionId: this.getActionId(action),\n stop: () => this.stopAnimation(clipName),\n pause: () => this.pauseAnimation(clipName),\n resume: () => this.resumeAnimation(clipName),\n setSpeed: (speed: number) => this.setAnimationSpeed(clipName, speed),\n setWeight: (weight: number) => this.setAnimationIntensity(clipName, weight),\n seekTo: (time: number) => this.seekAnimation(clipName, time),\n getState: () => this.getAnimationState(clipName)!,\n crossfadeTo: (targetClip: string, dur?: number) => this.crossfadeTo(targetClip, dur),\n finished: finishedPromise,\n };\n }\n\n private createBakedAnimationHandle(\n clipName: string,\n group: BakedActionGroup\n ): AnimationActionHandle {\n return {\n actionId: group.actionId,\n stop: () => this.stopAnimation(clipName),\n pause: () => this.pauseAnimation(clipName),\n resume: () => this.resumeAnimation(clipName),\n setSpeed: (speed: number) => this.setAnimationSpeed(clipName, speed),\n setWeight: (weight: number) => this.setAnimationIntensity(clipName, weight),\n seekTo: (time: number) => this.seekAnimation(clipName, time),\n getState: () => this.getAnimationState(clipName)!,\n crossfadeTo: (targetClip: string, dur?: number) => this.crossfadeTo(targetClip, dur),\n finished: group.finishedPromise,\n };\n }\n}\n\n/** @deprecated Use ThreeAnimationSystem. */\nexport { ThreeAnimationSystem as AnimationController };\n\n/** @deprecated Use ThreeAnimationSystem. */\nexport { ThreeAnimationSystem as BakedAnimationController };\n","import {\n Box3,\n Vector3,\n} from 'three';\nimport type { AnimationClip, KeyframeTrack, Mesh, Object3D } from 'three';\nimport type { HostModelInspector, ModelDescriptor, MeshId, MorphTargetId, BoneId, Transform } from '../../core/contracts';\nimport type { Profile } from '../../mappings/types';\nimport type { NodeBase, ResolvedBones } from './types';\n\nexport interface ThreeAnimationTrackDescriptor {\n readonly name: string;\n readonly targetName: string;\n readonly property: string;\n readonly type: 'position' | 'rotation' | 'scale' | 'morph' | 'unknown';\n readonly keyframeCount: number;\n readonly valueSize: number;\n readonly valueRange?: { readonly min: readonly number[]; readonly max: readonly number[] };\n}\n\nexport interface ThreeAnimationClipDescriptor {\n readonly name: string;\n readonly duration: number;\n readonly tracks: readonly ThreeAnimationTrackDescriptor[];\n readonly animatedBones: readonly string[];\n readonly animatedMorphs: readonly string[];\n}\n\nexport interface ThreeModelInspectionOptions {\n readonly meshes?: readonly Mesh[];\n readonly profile?: Profile;\n readonly previousBones?: ResolvedBones;\n readonly animations?: readonly AnimationClip[];\n}\n\nexport interface ThreeModelInspection {\n readonly descriptor: ModelDescriptor;\n readonly meshByName: Map<string, Mesh>;\n readonly allMeshes: Mesh[];\n readonly morphMeshes: Mesh[];\n readonly bones: ResolvedBones;\n readonly resolvedFaceMeshes: string[];\n readonly faceMesh: Mesh | null;\n readonly animations: ThreeAnimationClipDescriptor[];\n}\n\ntype MorphTargetEntry = { name: string; index: number };\n\nconst meshId = (value: number) => value as MeshId;\nconst morphTargetId = (value: number) => value as MorphTargetId;\nconst boneId = (value: number) => value as BoneId;\n\nexport class ThreeModelInspector implements HostModelInspector<Object3D> {\n describeModel(model: Object3D): ModelDescriptor {\n return this.inspectModel(model).descriptor;\n }\n\n inspectModel(model: Object3D, options: ThreeModelInspectionOptions = {}): ThreeModelInspection {\n const allMeshes = this.collectMeshes(model);\n const morphMeshes = this.mergeMorphMeshes(options.meshes || [], collectMorphMeshes(model));\n const meshByName = this.buildMeshByName(model);\n const bones = options.profile\n ? this.resolveBones(model, options.profile, options.previousBones)\n : {};\n const resolvedFaceMeshes = options.profile\n ? this.resolveFaceMeshes(morphMeshes, meshByName, bones, options.profile)\n : [];\n const faceMesh = resolvedFaceMeshes.length > 0\n ? meshByName.get(resolvedFaceMeshes[0]) || null\n : null;\n const animations = this.describeAnimations(options.animations || []);\n const descriptor = this.buildDescriptor(model, allMeshes, bones, animations);\n\n return {\n descriptor,\n meshByName,\n allMeshes,\n morphMeshes,\n bones,\n resolvedFaceMeshes,\n faceMesh,\n animations,\n };\n }\n\n collectMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n meshes.push(obj as Mesh);\n }\n });\n return meshes;\n }\n\n buildMeshByName(root: Object3D): Map<string, Mesh> {\n const meshByName = new Map<string, Mesh>();\n root.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n meshByName.set(obj.name, obj as Mesh);\n }\n });\n return meshByName;\n }\n\n resolveBones(root: Object3D, profile: Profile, previousBones: ResolvedBones = {}): ResolvedBones {\n const resolved: ResolvedBones = {};\n\n const snapshot = (obj: Object3D): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const snapshotPreservingBasePose = (obj: Object3D): NodeBase => {\n const existing = Object.values(previousBones).find((entry) => entry?.obj === obj);\n if (!existing) {\n return snapshot(obj);\n }\n\n return {\n obj,\n basePos: { ...existing.basePos },\n baseQuat: existing.baseQuat.clone(),\n baseEuler: { ...existing.baseEuler },\n };\n };\n\n const prefix = profile.bonePrefix || '';\n const suffix = profile.boneSuffix || '';\n const suffixRegex = profile.suffixPattern\n ? new RegExp(profile.suffixPattern)\n : null;\n\n const findNode = (baseName?: string | null): Object3D | undefined => {\n if (!baseName) return undefined;\n\n const directMatch = root.getObjectByName(baseName);\n if (directMatch) return directMatch;\n\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n const fullName = suffix && !prefixedBase.endsWith(suffix)\n ? `${prefixedBase}${suffix}`\n : prefixedBase;\n const exactMatch = root.getObjectByName(fullName);\n if (exactMatch) return exactMatch;\n\n if (suffixRegex) {\n let found: Object3D | undefined;\n root.traverse((obj: any) => {\n if (found) return;\n if (obj.name && obj.name.startsWith(fullName)) {\n const candidateSuffix = obj.name.slice(fullName.length);\n if (candidateSuffix === '' || suffixRegex.test(candidateSuffix)) {\n found = obj;\n }\n }\n });\n if (found) return found;\n }\n\n return undefined;\n };\n\n const addResolvedBone = (key: string, node: Object3D) => {\n const entry = snapshotPreservingBasePose(node);\n resolved[key] = entry;\n if (node.name) {\n resolved[node.name] = entry;\n }\n };\n\n for (const [key, nodeName] of Object.entries(profile.boneNodes || {})) {\n const node = findNode(nodeName);\n if (node) {\n addResolvedBone(key, node);\n if (nodeName) {\n resolved[nodeName] = resolved[key]!;\n }\n }\n }\n\n if (!resolved.EYE_L && profile.eyeMeshNodes) {\n const node = findNode(profile.eyeMeshNodes.LEFT);\n if (node) {\n addResolvedBone('EYE_L', node);\n }\n }\n if (!resolved.EYE_R && profile.eyeMeshNodes) {\n const node = findNode(profile.eyeMeshNodes.RIGHT);\n if (node) {\n addResolvedBone('EYE_R', node);\n }\n }\n\n const referencedNodes = new Set<string>();\n Object.values(profile.auToBones ?? {}).forEach((bindings) => {\n bindings.forEach((binding) => referencedNodes.add(binding.node));\n });\n profile.compositeRotations?.forEach((composite) => referencedNodes.add(composite.node));\n Object.values(profile.continuumPairs ?? {}).forEach((pair) => {\n if (pair?.node) referencedNodes.add(pair.node);\n });\n profile.annotationRegions?.forEach((region) => {\n region.bones?.forEach((boneName) => referencedNodes.add(boneName));\n });\n\n referencedNodes.forEach((nodeKey) => {\n if (resolved[nodeKey]) return;\n const configuredName = profile.boneNodes?.[nodeKey] ?? nodeKey;\n const node = findNode(configuredName);\n if (node) {\n addResolvedBone(nodeKey, node);\n if (configuredName) {\n resolved[configuredName] = resolved[nodeKey]!;\n }\n }\n });\n\n return resolved;\n }\n\n resolveFaceMeshes(\n meshes: readonly Mesh[],\n meshByName: ReadonlyMap<string, Mesh>,\n bones: ResolvedBones,\n profile: Profile\n ): string[] {\n const faceMeshNames = profile.morphToMesh?.face || [];\n const availableMorphMeshes = meshes.filter((m) => hasMorphTargets(m));\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n return [defaultFace.name];\n }\n\n const candidateByMorph = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n if (candidateByMorph) {\n return [candidateByMorph.name];\n }\n\n const headNodeKey = profile.auToBones?.[51]?.[0]?.node\n ?? profile.auToBones?.[52]?.[0]?.node\n ?? profile.compositeRotations?.find((composite) => (\n composite.yaw?.aus.includes(51)\n || composite.yaw?.aus.includes(52)\n || composite.pitch?.aus.includes(53)\n || composite.pitch?.aus.includes(54)\n || composite.roll?.aus.includes(55)\n || composite.roll?.aus.includes(56)\n ))?.node\n ?? 'HEAD';\n const head = bones[headNodeKey]?.obj ?? bones.HEAD?.obj;\n if (head && availableMorphMeshes.length > 0) {\n const headPos = new Vector3();\n (head as any).getWorldPosition?.(headPos);\n const headCandidates = availableMorphMeshes.map((mesh) => {\n const box = new Box3().setFromObject(mesh as any);\n const center = new Vector3();\n box.getCenter(center);\n const distance = box.containsPoint(headPos) ? 0 : center.distanceTo(headPos);\n const morphCount = mesh.morphTargetDictionary\n ? Object.keys(mesh.morphTargetDictionary).length\n : 0;\n const name = mesh.name.toLowerCase();\n const penalty = /eye|occlusion|tear|teeth|tongue|hair|lash/.test(name) ? 10 : 0;\n return { name: mesh.name, distance, morphCount, penalty };\n });\n\n headCandidates.sort((a, b) => {\n if (a.distance !== b.distance) return a.distance - b.distance;\n if (a.penalty !== b.penalty) return a.penalty - b.penalty;\n return b.morphCount - a.morphCount;\n });\n\n const best = headCandidates[0];\n const extras = headCandidates\n .filter((entry) => /brow|eyebrow/.test(entry.name.toLowerCase()))\n .map((entry) => entry.name);\n\n return [best.name, ...extras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n if (availableMorphMeshes.length > 0) {\n const best = availableMorphMeshes.reduce((prev, current) => {\n const prevCount = prev.morphTargetDictionary ? Object.keys(prev.morphTargetDictionary).length : 0;\n const currCount = current.morphTargetDictionary ? Object.keys(current.morphTargetDictionary).length : 0;\n return currCount > prevCount ? current : prev;\n });\n const browExtras = availableMorphMeshes\n .filter((m) => {\n const dict = m.morphTargetDictionary || {};\n const morphKeys = Object.keys(dict);\n return /brow|eyebrow/i.test(m.name) || morphKeys.some((k) => /brow/i.test(k));\n })\n .map((m) => m.name);\n return [best.name, ...browExtras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n return faceMeshNames.filter((name) => meshByName.has(name));\n }\n\n describeAnimations(animations: readonly AnimationClip[]): ThreeAnimationClipDescriptor[] {\n return animations.map((clip) => {\n const tracks = clip.tracks.map((track) => this.describeTrack(track));\n const animatedBones = new Set<string>();\n const animatedMorphs = new Set<string>();\n\n for (const track of tracks) {\n if (track.type === 'rotation' || track.type === 'position') {\n animatedBones.add(track.targetName);\n } else if (track.type === 'morph') {\n animatedMorphs.add(track.name);\n }\n }\n\n return {\n name: clip.name,\n duration: clip.duration,\n tracks,\n animatedBones: Array.from(animatedBones),\n animatedMorphs: Array.from(animatedMorphs),\n };\n });\n }\n\n private mergeMorphMeshes(inputMeshes: readonly Mesh[], collectedMeshes: readonly Mesh[]): Mesh[] {\n const meshByKey = new Map<string, Mesh>();\n const addMesh = (mesh: Mesh) => {\n const key = mesh.name || (mesh as any).uuid;\n if (!meshByKey.has(key)) {\n meshByKey.set(key, mesh);\n }\n };\n\n inputMeshes.forEach(addMesh);\n collectedMeshes.forEach(addMesh);\n return Array.from(meshByKey.values());\n }\n\n private buildDescriptor(\n model: Object3D,\n meshes: readonly Mesh[],\n resolvedBones: ResolvedBones,\n animations: readonly ThreeAnimationClipDescriptor[]\n ): ModelDescriptor {\n const meshIds = new Map<Mesh, MeshId>();\n meshes.forEach((mesh, index) => meshIds.set(mesh, meshId(index + 1)));\n\n const boneObjects = this.collectDescriptorBoneObjects(model, resolvedBones);\n const boneIds = new Map<Object3D, BoneId>();\n boneObjects.forEach((bone, index) => boneIds.set(bone, boneId(index + 1)));\n\n const boneParentIds = new Map<Object3D, BoneId | undefined>();\n for (const bone of boneObjects) {\n boneParentIds.set(bone, this.findNearestDescriptorBoneId(bone.parent, boneIds));\n }\n\n const boneChildIds = new Map<Object3D, BoneId[]>();\n for (const bone of boneObjects) {\n boneChildIds.set(bone, []);\n }\n for (const bone of boneObjects) {\n const parentId = boneParentIds.get(bone);\n if (parentId === undefined) continue;\n const parent = boneObjects.find((candidate) => boneIds.get(candidate) === parentId);\n if (parent) {\n boneChildIds.get(parent)?.push(boneIds.get(bone)!);\n }\n }\n\n const morphTargets = [];\n const morphTargetIdsByMesh = new Map<Mesh, MorphTargetId[]>();\n let nextMorphTargetId = 1;\n for (const mesh of meshes) {\n const ids: MorphTargetId[] = [];\n for (const entry of getMorphTargetEntries(mesh)) {\n const id = morphTargetId(nextMorphTargetId++);\n ids.push(id);\n morphTargets.push({\n id,\n meshId: meshIds.get(mesh)!,\n name: entry.name,\n hostIndex: entry.index,\n });\n }\n morphTargetIdsByMesh.set(mesh, ids);\n }\n\n return {\n id: model.uuid,\n name: model.name || undefined,\n meshes: meshes.map((mesh) => ({\n id: meshIds.get(mesh)!,\n name: mesh.name,\n parentBoneId: this.findNearestDescriptorBoneId(mesh.parent, boneIds),\n morphTargetIds: morphTargetIdsByMesh.get(mesh) || [],\n visible: mesh.visible,\n })),\n morphTargets,\n bones: boneObjects.map((bone) => ({\n id: boneIds.get(bone)!,\n name: bone.name,\n parentId: boneParentIds.get(bone),\n childIds: boneChildIds.get(bone) || [],\n restTransform: objectTransform(bone),\n })),\n metadata: animations.length > 0 ? { animations } : undefined,\n };\n }\n\n private collectDescriptorBoneObjects(model: Object3D, resolvedBones: ResolvedBones): Object3D[] {\n const boneObjects: Object3D[] = [];\n const addBone = (obj: Object3D) => {\n if (!boneObjects.includes(obj)) {\n boneObjects.push(obj);\n }\n };\n\n model.traverse((obj: any) => {\n if (obj.isBone || obj.type === 'Bone') {\n addBone(obj as Object3D);\n }\n });\n\n for (const entry of Object.values(resolvedBones)) {\n if (entry?.obj) {\n addBone(entry.obj);\n }\n }\n\n return boneObjects;\n }\n\n private findNearestDescriptorBoneId(parent: Object3D | null, boneIds: ReadonlyMap<Object3D, BoneId>): BoneId | undefined {\n let current = parent;\n while (current) {\n const id = boneIds.get(current);\n if (id !== undefined) return id;\n current = current.parent;\n }\n return undefined;\n }\n\n private describeTrack(track: KeyframeTrack): ThreeAnimationTrackDescriptor {\n const parts = track.name.split('.');\n const targetName = parts[0];\n const property = parts.slice(1).join('.');\n const type = getTrackType(property);\n const valueSize = track.getValueSize();\n const valueRange = getValueRange(track.values, valueSize);\n\n return {\n name: track.name,\n targetName,\n property,\n type,\n keyframeCount: track.times.length,\n valueSize,\n valueRange,\n };\n }\n}\n\nexport function collectMorphMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n const dict = obj.morphTargetDictionary;\n const infl = obj.morphTargetInfluences;\n if ((dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0)) {\n meshes.push(obj as Mesh);\n }\n }\n });\n return meshes;\n}\n\nfunction hasMorphTargets(mesh: Mesh): boolean {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n return !!(dict && Object.keys(dict).length > 0) || !!(Array.isArray(infl) && infl.length > 0);\n}\n\nfunction getMorphTargetEntries(mesh: Mesh): MorphTargetEntry[] {\n const meshDictionary = mesh.morphTargetDictionary as Record<string, number> | undefined;\n const geometryDictionary = (mesh.geometry as any).morphTargetDictionary as Record<string, number> | undefined;\n const dictionary = meshDictionary || geometryDictionary;\n\n if (dictionary) {\n return Object.entries(dictionary)\n .map(([name, index]) => ({ name, index }))\n .sort((a, b) => a.index - b.index);\n }\n\n const influences = mesh.morphTargetInfluences;\n if (!influences || influences.length === 0) {\n return [];\n }\n\n return influences.map((_, index) => ({ name: `morph_${index}`, index }));\n}\n\nfunction objectTransform(obj: Object3D): Transform {\n return {\n position: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n rotation: { x: obj.quaternion.x, y: obj.quaternion.y, z: obj.quaternion.z, w: obj.quaternion.w },\n scale: { x: obj.scale.x, y: obj.scale.y, z: obj.scale.z },\n };\n}\n\nfunction getTrackType(property: string): ThreeAnimationTrackDescriptor['type'] {\n if (property.includes('position')) return 'position';\n if (property.includes('quaternion') || property.includes('rotation')) return 'rotation';\n if (property.includes('scale')) return 'scale';\n if (property.includes('morphTargetInfluences')) return 'morph';\n return 'unknown';\n}\n\nfunction getValueRange(values: KeyframeTrack['values'], valueSize: number): ThreeAnimationTrackDescriptor['valueRange'] {\n if (values.length === 0) return undefined;\n\n const min = Array(valueSize).fill(Infinity);\n const max = Array(valueSize).fill(-Infinity);\n\n for (let i = 0; i < values.length; i += valueSize) {\n for (let j = 0; j < valueSize; j += 1) {\n const value = values[i + j];\n if (value < min[j]) min[j] = value;\n if (value > max[j]) max[j] = value;\n }\n }\n\n return { min, max };\n}\n","import {\n AdditiveBlending,\n MultiplyBlending,\n NoBlending,\n NormalBlending,\n Quaternion,\n SubtractiveBlending,\n Vector3,\n} from 'three';\nimport type { Material, Mesh, Object3D } from 'three';\nimport type {\n BoneId,\n FrameDelta,\n HostFrameApplier,\n MeshId,\n MorphTargetId,\n Quat,\n Transform,\n Vec3,\n} from '../../core/contracts';\n\nexport interface ThreeMorphTargetBinding {\n readonly meshId: MeshId;\n readonly mesh: Mesh;\n readonly index: number;\n}\n\nexport interface ThreeFrameApplierBindings {\n readonly meshes?: ReadonlyMap<MeshId, Mesh>;\n readonly morphTargets?: ReadonlyMap<MorphTargetId, ThreeMorphTargetBinding>;\n readonly bones?: ReadonlyMap<BoneId, Object3D>;\n}\n\nexport interface ThreeMaterialConfig {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: keyof typeof THREE_BLENDING_MODES;\n}\n\nexport interface ThreeResolvedMaterialConfig {\n renderOrder: number;\n transparent: boolean;\n opacity: number;\n depthWrite: boolean;\n depthTest: boolean;\n blending: keyof typeof THREE_BLENDING_MODES;\n}\n\nexport interface ThreeMeshMaterialConfig {\n readonly material?: ThreeMaterialConfig;\n}\n\nexport const THREE_BLENDING_MODES = {\n Normal: NormalBlending,\n Additive: AdditiveBlending,\n Subtractive: SubtractiveBlending,\n Multiply: MultiplyBlending,\n None: NoBlending,\n} as const;\n\nexport class ThreeFrameApplier implements HostFrameApplier<Object3D> {\n private meshes = new Map<MeshId, Mesh>();\n private morphTargets = new Map<MorphTargetId, ThreeMorphTargetBinding>();\n private bones = new Map<BoneId, Object3D>();\n private originalEmissive = new Map<string, { color: number; intensity: number }>();\n\n constructor(bindings: ThreeFrameApplierBindings = {}) {\n this.setBindings(bindings);\n }\n\n setBindings(bindings: ThreeFrameApplierBindings): void {\n this.meshes = new Map(bindings.meshes || []);\n this.morphTargets = new Map(bindings.morphTargets || []);\n this.bones = new Map(bindings.bones || []);\n }\n\n applyFrameDelta(model: Object3D, frame: FrameDelta): void {\n for (const write of frame.morphTargets || []) {\n const binding = this.morphTargets.get(write.morphTargetId);\n if (!binding) continue;\n this.setMorphTarget(binding, write.value, write.mode);\n }\n\n let wroteTransforms = false;\n for (const write of frame.bones || []) {\n const bone = this.bones.get(write.boneId);\n if (!bone) continue;\n this.applyTransform(bone, write.transform, write.mode);\n wroteTransforms = true;\n }\n\n for (const write of frame.meshes || []) {\n const mesh = this.meshes.get(write.meshId);\n if (!mesh) continue;\n if (typeof write.visible === 'boolean') {\n mesh.visible = write.visible;\n }\n }\n\n // Morph-only frames don't affect matrices; skip the full-tree update.\n if (wroteTransforms) {\n model.updateMatrixWorld(true);\n }\n }\n\n applyPackedMorphFrameDelta(values: ArrayLike<number>, stride = 4): void {\n for (let index = 0; index + stride <= values.length; index += stride) {\n const morphTargetId = values[index + 1] as MorphTargetId;\n const binding = this.morphTargets.get(morphTargetId);\n if (!binding) continue;\n const mode = (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute';\n this.setMorphTarget(binding, values[index + 2] ?? 0, mode);\n }\n }\n\n /** Rows: `[boneId, px, py, pz, qx, qy, qz, qw, flags]`; flags bit0=position, bit1=rotation. */\n applyPackedBoneFrameDelta(values: ArrayLike<number>, stride = 9): void {\n for (let index = 0; index + stride <= values.length; index += stride) {\n const bone = this.bones.get(values[index] as BoneId);\n if (!bone) continue;\n const flags = values[index + 8] ?? 0;\n if (flags & 1) {\n bone.position.set(values[index + 1], values[index + 2], values[index + 3]);\n }\n if (flags & 2) {\n bone.quaternion\n .set(values[index + 4], values[index + 5], values[index + 6], values[index + 7])\n .normalize();\n }\n bone.updateMatrixWorld(false);\n }\n }\n\n applyObjectTransform(\n target: Object3D,\n transform: Transform,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n this.applyTransform(target, transform, mode);\n }\n\n applyMorphTargets(targets: readonly { infl: number[]; idx: number }[], value: number): void {\n for (const target of targets) {\n if (target.idx >= 0 && target.idx < target.infl.length) {\n target.infl[target.idx] = value;\n }\n }\n }\n\n resetMorphTargets(targets: readonly { infl: number[]; idx: number }[]): void {\n this.applyMorphTargets(targets, 0);\n }\n\n setMeshVisible(root: Object3D, meshName: string, visible: boolean): void {\n this.visitNamedMesh(root, meshName, (mesh) => {\n mesh.visible = visible;\n });\n }\n\n highlightMesh(root: Object3D, meshName: string | null, color = 0x00ffff, intensity = 0.5): void {\n root.traverse((obj: any) => {\n if (!obj.isMesh) return;\n\n for (const material of getMaterials(obj.material)) {\n if (!hasEmissive(material)) continue;\n\n if (meshName === null || obj.name !== meshName) {\n const original = this.originalEmissive.get(obj.name);\n if (original) {\n material.emissive.setHex(original.color);\n material.emissiveIntensity = original.intensity;\n }\n continue;\n }\n\n if (!this.originalEmissive.has(obj.name)) {\n this.originalEmissive.set(obj.name, {\n color: material.emissive.getHex(),\n intensity: material.emissiveIntensity || 0,\n });\n }\n material.emissive.setHex(color);\n material.emissiveIntensity = intensity;\n }\n });\n }\n\n getMeshMaterialConfig(root: Object3D, meshName: string): ThreeResolvedMaterialConfig | null {\n let result: ThreeResolvedMaterialConfig | null = null;\n this.visitNamedMesh(root, meshName, (mesh) => {\n const material = getMaterials((mesh as any).material)[0];\n if (!material) return;\n result = {\n renderOrder: mesh.renderOrder,\n transparent: material.transparent,\n opacity: material.opacity,\n depthWrite: material.depthWrite,\n depthTest: material.depthTest,\n blending: getBlendingName(material.blending),\n };\n });\n return result;\n }\n\n setMeshMaterialConfig(root: Object3D, meshName: string, config: ThreeMaterialConfig): void {\n this.visitNamedMesh(root, meshName, (mesh) => {\n this.applyMeshMaterialConfig(mesh, config);\n });\n }\n\n applyMeshMaterialConfigs(\n root: Object3D,\n configs: Readonly<Record<string, ThreeMeshMaterialConfig>>\n ): void {\n root.traverse((obj: any) => {\n if (!obj.isMesh || !obj.name) return;\n const config = configs[obj.name]?.material;\n if (config) {\n this.applyMeshMaterialConfig(obj as Mesh, config);\n }\n });\n }\n\n private applyMeshMaterialConfig(mesh: Mesh, config: ThreeMaterialConfig): void {\n if (typeof config.renderOrder === 'number') {\n mesh.renderOrder = config.renderOrder;\n }\n\n for (const material of getMaterials((mesh as any).material)) {\n if (typeof config.opacity === 'number') {\n material.opacity = config.opacity;\n if (config.opacity < 1 && config.transparent === undefined) {\n material.transparent = true;\n }\n }\n if (typeof config.transparent === 'boolean') {\n material.transparent = config.transparent;\n }\n if (typeof config.depthWrite === 'boolean') {\n material.depthWrite = config.depthWrite;\n }\n if (typeof config.depthTest === 'boolean') {\n material.depthTest = config.depthTest;\n }\n if (config.blending && config.blending in THREE_BLENDING_MODES) {\n material.blending = THREE_BLENDING_MODES[config.blending];\n }\n material.needsUpdate = true;\n }\n }\n\n private setMorphTarget(\n binding: ThreeMorphTargetBinding,\n value: number,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n const influences = binding.mesh.morphTargetInfluences;\n if (!influences || binding.index < 0 || binding.index >= influences.length) {\n return;\n }\n influences[binding.index] = mode === 'additive'\n ? (influences[binding.index] ?? 0) + value\n : value;\n }\n\n private applyTransform(\n target: Object3D,\n transform: Transform,\n mode: 'absolute' | 'additive' = 'absolute'\n ): void {\n if (transform.position) {\n applyVec3(target.position, transform.position, mode);\n }\n if (transform.rotation) {\n applyQuat(target.quaternion, transform.rotation, mode);\n }\n if (transform.scale) {\n applyVec3(target.scale, transform.scale, mode);\n }\n target.updateMatrixWorld(false);\n }\n\n private visitNamedMesh(root: Object3D, meshName: string, visit: (mesh: Mesh) => void): void {\n root.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n visit(obj as Mesh);\n }\n });\n }\n}\n\nfunction applyVec3(target: Vector3, value: Vec3, mode: 'absolute' | 'additive'): void {\n if (mode === 'additive') {\n target.x += value.x;\n target.y += value.y;\n target.z += value.z;\n return;\n }\n target.set(value.x, value.y, value.z);\n}\n\nfunction applyQuat(target: Quaternion, value: Quat, mode: 'absolute' | 'additive'): void {\n const next = new Quaternion(value.x, value.y, value.z, value.w).normalize();\n if (mode === 'additive') {\n target.multiply(next);\n return;\n }\n target.copy(next);\n}\n\nfunction getMaterials(material: Material | Material[] | undefined): Material[] {\n if (!material) return [];\n return Array.isArray(material) ? material : [material];\n}\n\nfunction hasEmissive(material: Material): material is Material & {\n emissive: { getHex(): number; setHex(color: number): void };\n emissiveIntensity: number;\n} {\n return 'emissive' in material;\n}\n\nfunction getBlendingName(value: number): keyof typeof THREE_BLENDING_MODES {\n for (const [name, blending] of Object.entries(THREE_BLENDING_MODES)) {\n if (blending === value) {\n return name as keyof typeof THREE_BLENDING_MODES;\n }\n }\n return 'Normal';\n}\n","import type { NumericArray } from './primitives';\n\nexport const EMBODY_CORE_ABI_VERSION = 1;\n\nexport const PACKED_MORPH_FRAME_DELTA_STRIDE = 4;\nexport const PACKED_MORPH_FRAME_DELTA_FIELDS = [\n 'meshId',\n 'morphTargetId',\n 'value',\n 'mode',\n] as const;\n\nexport const PACKED_BONE_FRAME_DELTA_STRIDE = 9;\nexport const PACKED_BONE_FRAME_DELTA_FIELDS = [\n 'boneId',\n 'positionX',\n 'positionY',\n 'positionZ',\n 'rotationX',\n 'rotationY',\n 'rotationZ',\n 'rotationW',\n 'flags',\n] as const;\n\n/** Packed bone FrameDelta flags: bit 0 = has position, bit 1 = has rotation. */\nexport const PACKED_BONE_FLAG_HAS_POSITION = 1;\nexport const PACKED_BONE_FLAG_HAS_ROTATION = 2;\n\nexport const HAIR_CONFIG_STRIDE = 11;\nexport const HAIR_STATE_STRIDE = 4;\nexport const HAIR_HEAD_STATE_STRIDE = 5;\nexport const HAIR_MORPH_OUTPUT_STRIDE = 6;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;\nexport const MESH_PROPORTIONS_STRIDE = 16;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;\nexport const ANNOTATION_CAMERA_FRAMING_STRIDE = 7;\nexport const CAMERA_FLIGHT_SAMPLE_STRIDE = 7;\nexport const MARKER_VISIBILITY_FACTORS_STRIDE = 3;\nexport const MARKER_ENDPOINT_STRIDE = 3;\n\nexport const HAIR_CONFIG_FIELDS = [\n 'mass',\n 'stiffness',\n 'damping',\n 'gravity',\n 'headInfluence',\n 'windEnabled',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n] as const;\n\nexport const HAIR_STATE_FIELDS = ['x', 'z', 'vx', 'vz'] as const;\nexport const HAIR_HEAD_STATE_FIELDS = ['yaw', 'pitch', 'roll', 'yawVelocity', 'pitchVelocity'] as const;\nexport const HAIR_MORPH_OUTPUT_FIELDS = [\n 'L_Hair_Left',\n 'L_Hair_Right',\n 'L_Hair_Front',\n 'R_Hair_Left',\n 'R_Hair_Right',\n 'R_Hair_Front',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n] as const;\nexport const MESH_PROPORTIONS_FIELDS = [\n 'minX',\n 'minY',\n 'minZ',\n 'maxX',\n 'maxY',\n 'maxZ',\n 'centerX',\n 'centerY',\n 'centerZ',\n 'spanX',\n 'spanY',\n 'spanZ',\n 'verticalHeight',\n 'crossAxisWideSpan',\n 'crossAxisNarrowSpan',\n 'humanoidLikelihood',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n 'confidence',\n 'meshHeight',\n 'templateHeight',\n 'meshCrossAxisWideSpan',\n 'templateCrossAxisWideSpan',\n 'status',\n] as const;\nexport const ANNOTATION_CAMERA_FRAMING_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'distance',\n] as const;\nexport const CAMERA_FLIGHT_SAMPLE_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'done',\n] as const;\nexport const MARKER_VISIBILITY_FACTORS_FIELDS = [\n 'itemOpacityFactor',\n 'labelScaleFactor',\n 'lineOpacityFactor',\n] as const;\nexport const MARKER_ENDPOINT_FIELDS = ['x', 'y', 'z'] as const;\n\nexport type PackedMorphFrameDeltaField = (typeof PACKED_MORPH_FRAME_DELTA_FIELDS)[number];\nexport type HairConfigField = (typeof HAIR_CONFIG_FIELDS)[number];\nexport type HairStateField = (typeof HAIR_STATE_FIELDS)[number];\nexport type HairHeadStateField = (typeof HAIR_HEAD_STATE_FIELDS)[number];\nexport type HairMorphOutputField = (typeof HAIR_MORPH_OUTPUT_FIELDS)[number];\nexport type TemplateSkeletonFitTransformField = (typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS)[number];\nexport type MeshProportionsField = (typeof MESH_PROPORTIONS_FIELDS)[number];\nexport type TemplateSkeletonFitSolutionField = (typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS)[number];\n\nexport interface PackedMorphFrameDelta {\n readonly abiVersion: typeof EMBODY_CORE_ABI_VERSION;\n readonly stride: typeof PACKED_MORPH_FRAME_DELTA_STRIDE;\n readonly fields: typeof PACKED_MORPH_FRAME_DELTA_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairPhysicsState {\n readonly stride: typeof HAIR_STATE_STRIDE;\n readonly fields: typeof HAIR_STATE_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairMorphOutput {\n readonly stride: typeof HAIR_MORPH_OUTPUT_STRIDE;\n readonly fields: typeof HAIR_MORPH_OUTPUT_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitTransform {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedMeshProportions {\n readonly stride: typeof MESH_PROPORTIONS_STRIDE;\n readonly fields: typeof MESH_PROPORTIONS_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitSolution {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;\n readonly values: NumericArray;\n}\n","import type {\n BoneFrameDelta,\n BoneId,\n FrameDelta,\n MeshId,\n ModelDescriptor,\n MorphTargetFrameDelta,\n MorphTargetId,\n} from './contracts';\nimport {\n PACKED_BONE_FLAG_HAS_POSITION,\n PACKED_BONE_FLAG_HAS_ROTATION,\n PACKED_BONE_FRAME_DELTA_STRIDE,\n PACKED_MORPH_FRAME_DELTA_STRIDE,\n} from './contracts';\nimport type { Profile } from '../mappings/types';\nimport type { EmbodyCoreWasmModule, WasmRuntimeCoreHandle } from '../wasmTypes';\n\nexport interface WasmRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n readonly wasm: EmbodyCoreWasmModule;\n readonly allowEmptyBindings?: boolean;\n}\n\n/**\n * TypeScript facade over the host-neutral Rust Wasm RuntimeCore.\n * JavaScript only owns JSON handoff and packed FrameDelta unpacking here.\n */\nexport class WasmRuntimeCore {\n private readonly wasm: EmbodyCoreWasmModule;\n private readonly core: WasmRuntimeCoreHandle;\n private readonly allowEmptyBindings: boolean;\n private profile: Profile;\n private model: ModelDescriptor;\n\n constructor(options: WasmRuntimeCoreOptions) {\n this.wasm = options.wasm;\n this.profile = options.profile;\n this.model = options.model;\n this.allowEmptyBindings = options.allowEmptyBindings ?? false;\n const RuntimeCtor = options.wasm.RuntimeCore;\n if (!RuntimeCtor) {\n throw new Error('Embody Wasm module does not export RuntimeCore');\n }\n this.core = new RuntimeCtor(0);\n this.reloadBindings();\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.reloadBindings();\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n this.reloadBindings();\n }\n\n setAU(id: number, value: number, balance = 0): void {\n this.core.set_au(id >>> 0, value, balance);\n }\n\n setContinuum(negativeAU: number, positiveAU: number, value: number, balance = 0): void {\n this.core.set_continuum(negativeAU >>> 0, positiveAU >>> 0, value, balance);\n }\n\n transitionAU(id: number, to: number, durationMs: number, balance = Number.NaN): void {\n this.core.transition_au(id >>> 0, to, durationMs, balance);\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs: number, jawScale = 1): void {\n this.core.transition_viseme(visemeIndex >>> 0, to, durationMs, jawScale);\n }\n\n update(deltaSeconds: number): number {\n return this.core.update(deltaSeconds);\n }\n\n activeTransitionCount(): number {\n return this.core.active_transition_count();\n }\n\n clearTransitions(): void {\n this.core.clear_transitions();\n }\n\n getAU(id: number): number {\n return this.core.get_au(id >>> 0);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.core.set_au_mix_weight(id >>> 0, weight);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale?: number): void {\n this.core.set_viseme(visemeIndex >>> 0, value);\n if (jawScale !== undefined) {\n this.core.set_viseme_jaw_scale(visemeIndex >>> 0, jawScale);\n }\n }\n\n clear(): void {\n this.core.clear();\n }\n\n evaluatePackedMorphFrameDelta(): Float32Array {\n return this.core.evaluate_morph_frame_delta();\n }\n\n evaluatePackedBoneFrameDelta(): Float32Array {\n return this.core.evaluate_bone_frame_delta();\n }\n\n evaluateMorphFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n };\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n bones: unpackBoneFrameDelta(this.evaluatePackedBoneFrameDelta()),\n };\n }\n\n private reloadBindings(): void {\n const profileJson = JSON.stringify(this.profile);\n const modelJson = JSON.stringify(this.model);\n if (this.allowEmptyBindings) {\n this.core.configure(profileJson, modelJson);\n } else {\n this.core.configure_with_profile(profileJson, modelJson);\n }\n }\n}\n\nexport function unpackBoneFrameDelta(values: ArrayLike<number>): BoneFrameDelta[] {\n const stride = PACKED_BONE_FRAME_DELTA_STRIDE;\n const writes: BoneFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n const flags = values[index + 8] ?? 0;\n const hasPosition = (flags & PACKED_BONE_FLAG_HAS_POSITION) !== 0;\n const hasRotation = (flags & PACKED_BONE_FLAG_HAS_ROTATION) !== 0;\n if (!hasPosition && !hasRotation) continue;\n writes.push({\n boneId: values[index] as BoneId,\n transform: {\n ...(hasPosition\n ? { position: { x: values[index + 1], y: values[index + 2], z: values[index + 3] } }\n : {}),\n ...(hasRotation\n ? {\n rotation: {\n x: values[index + 4],\n y: values[index + 5],\n z: values[index + 6],\n w: values[index + 7],\n },\n }\n : {}),\n },\n mode: 'absolute',\n space: 'local',\n });\n }\n return writes;\n}\n\nexport function unpackMorphFrameDelta(values: ArrayLike<number>): MorphTargetFrameDelta[] {\n const stride = PACKED_MORPH_FRAME_DELTA_STRIDE;\n const writes: MorphTargetFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n writes.push({\n meshId: values[index] as MeshId,\n morphTargetId: values[index + 1] as MorphTargetId,\n value: values[index + 2] ?? 0,\n mode: (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute',\n });\n }\n return writes;\n}\n","/**\n * Hair / eyebrow material appearance helpers.\n *\n * These are runtime material controls owned by Embody — not Polymer agencies.\n * Agencies govern character behavior; hair materials and physics stay here.\n */\n\nexport interface HairColorAppearance {\n name?: string;\n baseColor: string;\n emissive: string;\n emissiveIntensity: number;\n}\n\nexport interface HairAppearanceState {\n hairColor: Required<Pick<HairColorAppearance, 'baseColor' | 'emissive' | 'emissiveIntensity'>> & {\n name?: string;\n };\n eyebrowColor: Required<Pick<HairColorAppearance, 'baseColor' | 'emissive' | 'emissiveIntensity'>> & {\n name?: string;\n };\n showOutline: boolean;\n outlineColor: string;\n outlineOpacity: number;\n}\n\nexport const HAIR_COLOR_PRESETS: Record<string, Required<HairColorAppearance>> = {\n natural_black: {\n name: 'Natural Black',\n baseColor: '#1a1a1a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_brown: {\n name: 'Natural Brown',\n baseColor: '#4a3728',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_blonde: {\n name: 'Natural Blonde',\n baseColor: '#e6c78a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_red: {\n name: 'Natural Red',\n baseColor: '#8b3a3a',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_gray: {\n name: 'Natural Gray',\n baseColor: '#9e9e9e',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n natural_white: {\n name: 'Natural White',\n baseColor: '#f5f5f5',\n emissive: '#000000',\n emissiveIntensity: 0,\n },\n neon_blue: {\n name: 'Neon Blue',\n baseColor: '#00ffff',\n emissive: '#0000ff',\n emissiveIntensity: 0.8,\n },\n neon_pink: {\n name: 'Neon Pink',\n baseColor: '#ff00ff',\n emissive: '#ff1493',\n emissiveIntensity: 0.8,\n },\n neon_green: {\n name: 'Neon Green',\n baseColor: '#00ff00',\n emissive: '#00ff00',\n emissiveIntensity: 0.8,\n },\n electric_purple: {\n name: 'Electric Purple',\n baseColor: '#9d00ff',\n emissive: '#9d00ff',\n emissiveIntensity: 0.6,\n },\n fire_orange: {\n name: 'Fire Orange',\n baseColor: '#ff6600',\n emissive: '#ff3300',\n emissiveIntensity: 0.7,\n },\n};\n\nexport const DEFAULT_HAIR_COLOR_APPEARANCE: Required<HairColorAppearance> =\n HAIR_COLOR_PRESETS.natural_brown;\n\nexport function normalizeHairColorAppearance(\n value: HairColorAppearance | string | null | undefined,\n fallback: Required<HairColorAppearance> = DEFAULT_HAIR_COLOR_APPEARANCE,\n): Required<HairColorAppearance> {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.startsWith('#')) {\n return {\n name: fallback.name,\n baseColor: trimmed,\n emissive: fallback.emissive,\n emissiveIntensity: fallback.emissiveIntensity,\n };\n }\n const preset = HAIR_COLOR_PRESETS[trimmed];\n if (preset) return { ...preset };\n }\n\n if (value && typeof value === 'object') {\n return {\n name: typeof value.name === 'string' ? value.name : fallback.name,\n baseColor: typeof value.baseColor === 'string' ? value.baseColor : fallback.baseColor,\n emissive: typeof value.emissive === 'string' ? value.emissive : fallback.emissive,\n emissiveIntensity:\n typeof value.emissiveIntensity === 'number'\n ? value.emissiveIntensity\n : fallback.emissiveIntensity,\n };\n }\n\n return { ...fallback };\n}\n\nexport function colorToCssHex(color: { getHexString(): string } | undefined | null): string | null {\n if (!color || typeof color.getHexString !== 'function') return null;\n return `#${color.getHexString()}`;\n}\n","/**\n * CC4 Preset - Character Creator 4 AU Mappings\n *\n * Complete FACS Action Unit to morph target and bone mappings for CC4 rigs.\n * This includes all the composite rotations, continuum pairs, mesh classifications,\n * and AU metadata that we painstakingly worked through.\n */\n\nimport type { Profile, MeshCategory, BlendingMode, MeshMaterialSettings, MeshInfo, MorphCategory, MorphTargetsBySide, VisemeSlot, MappingEditorSection } from '../mappings/types';\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\n\n// ============================================================================\n// AU TO MORPHS - Maps AU IDs to morph target names\n// ============================================================================\n\nexport const AU_TO_MORPHS: Record<number, MorphTargetsBySide> = {\n 1: {\n left: ['Brow_Raise_Inner_L'],\n right: ['Brow_Raise_Inner_R'],\n center: [],\n },\n 2: {\n left: ['Brow_Raise_Outer_L'],\n right: ['Brow_Raise_Outer_R'],\n center: [],\n },\n 4: {\n left: ['Brow_Drop_L'],\n right: ['Brow_Drop_R'],\n center: [],\n },\n 5: {\n left: ['Eye_Wide_L'],\n right: ['Eye_Wide_R'],\n center: [],\n },\n 6: {\n left: ['Cheek_Raise_L'],\n right: ['Cheek_Raise_R'],\n center: [],\n },\n 7: {\n left: ['Eye_Squint_L'],\n right: ['Eye_Squint_R'],\n center: [],\n },\n 8: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: ['Mouth_Close'],\n },\n 9: {\n left: ['Nose_Sneer_L'],\n right: ['Nose_Sneer_R'],\n center: [],\n },\n 10: {\n left: ['Mouth_Up_Upper_L'],\n right: ['Mouth_Up_Upper_R'],\n center: [],\n },\n 11: {\n left: ['Mouth_Up_Upper_L'],\n right: ['Mouth_Up_Upper_R'],\n center: [],\n },\n 12: {\n left: ['Mouth_Smile_L'],\n right: ['Mouth_Smile_R'],\n center: [],\n },\n 13: {\n left: ['Mouth_Smile_L', 'Mouth_Up_Upper_L'],\n right: ['Mouth_Smile_R', 'Mouth_Up_Upper_R'],\n center: [],\n },\n 14: {\n left: ['Mouth_Dimple_L'],\n right: ['Mouth_Dimple_R'],\n center: [],\n },\n 15: {\n left: ['Mouth_Frown_L'],\n right: ['Mouth_Frown_R'],\n center: [],\n },\n 16: {\n left: ['Mouth_Down_Lower_L'],\n right: ['Mouth_Down_Lower_R'],\n center: [],\n },\n 17: {\n left: [],\n right: [],\n center: ['Mouth_Shrug_Lower'],\n },\n 18: {\n left: [],\n right: [],\n center: ['Mouth_Pucker'],\n },\n 19: {\n left: [],\n right: [],\n center: ['Tongue_Out'],\n },\n 20: {\n left: ['Mouth_Stretch_L'],\n right: ['Mouth_Stretch_R'],\n center: [],\n },\n 22: {\n left: [],\n right: [],\n center: ['Mouth_Funnel'],\n },\n 23: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: [],\n },\n 24: {\n left: ['Mouth_Press_L'],\n right: ['Mouth_Press_R'],\n center: [],\n },\n 25: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 26: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 27: {\n left: [],\n right: [],\n center: ['Jaw_Open'],\n },\n 28: {\n left: [],\n right: [],\n center: ['Mouth_Roll_In_Upper', 'Mouth_Roll_In_Lower'],\n },\n 29: {\n left: [],\n right: [],\n center: ['Jaw_Forward'],\n },\n 30: {\n left: ['Jaw_L'],\n right: [],\n center: [],\n },\n 31: {\n left: [],\n right: [],\n center: [],\n },\n 32: {\n left: [],\n right: [],\n center: ['Mouth_Roll_In_Lower'],\n },\n 34: {\n left: ['Cheek_Puff_L'],\n right: ['Cheek_Puff_R'],\n center: [],\n },\n 35: {\n left: [],\n right: ['Jaw_R'],\n center: [],\n },\n 36: {\n left: ['Tongue_Bulge_L'],\n right: ['Tongue_Bulge_R'],\n center: [],\n },\n 37: {\n left: [],\n right: [],\n center: ['Tongue_Up'],\n },\n 38: {\n left: [],\n right: [],\n center: ['Tongue_Down'],\n },\n 39: {\n left: ['Tongue_L'],\n right: [],\n center: [],\n },\n 40: {\n left: [],\n right: ['Tongue_R'],\n center: [],\n },\n 41: {\n left: [],\n right: [],\n center: [],\n },\n 42: {\n left: [],\n right: [],\n center: [],\n },\n 43: {\n left: ['Eye_Blink_L'],\n right: ['Eye_Blink_R'],\n center: [],\n },\n 45: {\n left: ['Eye_Blink_L'],\n right: ['Eye_Blink_R'],\n center: [],\n },\n 51: {\n left: ['Head_Turn_L'],\n right: [],\n center: [],\n },\n 52: {\n left: [],\n right: ['Head_Turn_R'],\n center: [],\n },\n 53: {\n left: [],\n right: [],\n center: ['Head_Turn_Up'],\n },\n 54: {\n left: [],\n right: [],\n center: ['Head_Turn_Down'],\n },\n 55: {\n left: ['Head_Tilt_L'],\n right: [],\n center: [],\n },\n 56: {\n left: [],\n right: ['Head_Tilt_R'],\n center: [],\n },\n 61: {\n left: ['Eye_L_Look_L'],\n right: ['Eye_R_Look_L'],\n center: [],\n },\n 62: {\n left: ['Eye_L_Look_R'],\n right: ['Eye_R_Look_R'],\n center: [],\n },\n 63: {\n left: ['Eye_L_Look_Up'],\n right: ['Eye_R_Look_Up'],\n center: [],\n },\n 64: {\n left: ['Eye_L_Look_Down'],\n right: ['Eye_R_Look_Down'],\n center: [],\n },\n 65: {\n left: ['Eye_L_Look_L'],\n right: [],\n center: [],\n },\n 66: {\n left: [],\n right: ['Eye_L_Look_R'],\n center: [],\n },\n 67: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Up'],\n },\n 68: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Down'],\n },\n 69: {\n left: ['Eye_R_Look_L'],\n right: [],\n center: [],\n },\n 70: {\n left: [],\n right: ['Eye_R_Look_R'],\n center: [],\n },\n 71: {\n left: [],\n right: [],\n center: ['Eye_R_Look_Up'],\n },\n 72: {\n left: [],\n right: [],\n center: ['Eye_R_Look_Down'],\n },\n 73: {\n left: [],\n right: [],\n center: ['Tongue_Narrow'],\n },\n 74: {\n left: [],\n right: [],\n center: ['Tongue_Wide'],\n },\n 75: {\n left: [],\n right: [],\n center: ['Tongue_Roll'],\n },\n 76: {\n left: [],\n right: [],\n center: ['Tongue_Tip_Up'],\n },\n 77: {\n left: [],\n right: [],\n center: ['Tongue_Tip_Down'],\n },\n 80: {\n left: ['EO Bulge L'],\n right: ['EO Bulge R'],\n center: [],\n },\n 81: {\n left: ['EO Depth L'],\n right: ['EO Depth R'],\n center: [],\n },\n 82: {\n left: ['EO Inner Depth L'],\n right: ['EO Inner Depth R'],\n center: [],\n },\n 83: {\n left: ['EO Inner Height L'],\n right: ['EO Inner Height R'],\n center: [],\n },\n 84: {\n left: ['EO Inner Width L'],\n right: ['EO Inner Width R'],\n center: [],\n },\n 85: {\n left: ['EO Outer Depth L'],\n right: ['EO Outer Depth R'],\n center: [],\n },\n 86: {\n left: ['EO Outer Height L'],\n right: ['EO Outer Height R'],\n center: [],\n },\n 87: {\n left: ['EO Outer Width L'],\n right: ['EO Outer Width R'],\n center: [],\n },\n 88: {\n left: ['EO Upper Depth L'],\n right: ['EO Upper Depth R'],\n center: [],\n },\n 89: {\n left: ['EO Lower Depth L'],\n right: ['EO Lower Depth R'],\n center: [],\n },\n 90: {\n left: ['EO Center Upper Depth L'],\n right: ['EO Center Upper Depth R'],\n center: [],\n },\n 91: {\n left: ['EO Center Upper Height L'],\n right: ['EO Center Upper Height R'],\n center: [],\n },\n 92: {\n left: ['EO Center Lower Depth L'],\n right: ['EO Center Lower Depth R'],\n center: [],\n },\n 93: {\n left: ['EO Center Lower Height L'],\n right: ['EO Center Lower Height R'],\n center: [],\n },\n 94: {\n left: ['EO Inner Upper Depth L'],\n right: ['EO Inner Upper Depth R'],\n center: [],\n },\n 95: {\n left: ['EO Inner Upper Height L'],\n right: ['EO Inner Upper Height R'],\n center: [],\n },\n 96: {\n left: ['EO Inner Lower Depth L'],\n right: ['EO Inner Lower Depth R'],\n center: [],\n },\n 97: {\n left: ['EO Inner Lower Height L'],\n right: ['EO Inner Lower Height R'],\n center: [],\n },\n 98: {\n left: ['EO Outer Upper Depth L'],\n right: ['EO Outer Upper Depth R'],\n center: [],\n },\n 99: {\n left: ['EO Outer Upper Height L'],\n right: ['EO Outer Upper Height R'],\n center: [],\n },\n 100: {\n left: ['EO Outer Lower Depth L'],\n right: ['EO Outer Lower Depth R'],\n center: [],\n },\n 101: {\n left: ['EO Outer Lower Height L'],\n right: ['EO Outer Lower Height R'],\n center: [],\n },\n 102: {\n left: ['EO Duct Depth L'],\n right: ['EO Duct Depth R'],\n center: [],\n },\n};\n\n// ============================================================================\n// BONE NODE NAMES - CC4-specific skeleton hierarchy\n// ============================================================================\n\n/** Bone name prefix used by semantic CC4 profile metadata. */\nexport const CC4_BONE_PREFIX = 'CC_Base_';\n\n/**\n * Suffix pattern regex for fuzzy bone matching.\n * Matches numbered suffixes like _01, _038 (common in Sketchfab exports)\n * and .001, .002 (common in Blender exports).\n */\nexport const CC4_SUFFIX_PATTERN = '_\\\\d+$|\\\\.\\\\d+$';\n\n/** Actual CC4 skeleton node names used by the stock preset. */\nexport const CC4_BONES = {\n EYE_L: 'CC_Base_L_Eye',\n EYE_R: 'CC_Base_R_Eye',\n HEAD: 'CC_Base_Head',\n NECK: 'CC_Base_NeckTwist01',\n NECK_TWIST: 'CC_Base_NeckTwist02',\n JAW: 'CC_Base_JawRoot',\n TONGUE: 'CC_Base_Tongue01',\n SPINE_01: 'CC_Base_Spine01',\n SPINE_02: 'CC_Base_Spine02',\n CLAVICLE_L: 'CC_Base_L_Clavicle',\n CLAVICLE_R: 'CC_Base_R_Clavicle',\n HAND_L: 'CC_Base_L_Hand',\n HAND_R: 'CC_Base_R_Hand',\n FOOT_L: 'CC_Base_L_Foot',\n FOOT_R: 'CC_Base_R_Foot',\n TOEBASE_L: 'CC_Base_L_ToeBase',\n TOEBASE_R: 'CC_Base_R_ToeBase',\n} as const;\n\n/**\n * Semantic bone keys used by profile metadata and annotation regions. Runtime\n * AU/composite bindings may still use concrete CC4 node names directly.\n */\nexport const CC4_BONE_NODES = {\n EYE_L: 'L_Eye',\n EYE_R: 'R_Eye',\n HEAD: 'Head',\n NECK: 'NeckTwist01',\n NECK_TWIST: 'NeckTwist02',\n JAW: 'JawRoot',\n TONGUE: 'Tongue01',\n SPINE_01: 'Spine01',\n SPINE_02: 'Spine02',\n CLAVICLE_L: 'L_Clavicle',\n CLAVICLE_R: 'R_Clavicle',\n HAND_L: 'L_Hand',\n HAND_R: 'R_Hand',\n FOOT_L: 'L_Foot',\n FOOT_R: 'R_Foot',\n TOEBASE_L: 'L_ToeBase',\n TOEBASE_R: 'R_ToeBase',\n // Concrete-name aliases keep existing runtime callers compatible.\n [CC4_BONES.EYE_L]: CC4_BONES.EYE_L,\n [CC4_BONES.EYE_R]: CC4_BONES.EYE_R,\n [CC4_BONES.HEAD]: CC4_BONES.HEAD,\n [CC4_BONES.NECK]: CC4_BONES.NECK,\n [CC4_BONES.NECK_TWIST]: CC4_BONES.NECK_TWIST,\n [CC4_BONES.JAW]: CC4_BONES.JAW,\n [CC4_BONES.TONGUE]: CC4_BONES.TONGUE,\n [CC4_BONES.SPINE_01]: CC4_BONES.SPINE_01,\n [CC4_BONES.SPINE_02]: CC4_BONES.SPINE_02,\n [CC4_BONES.CLAVICLE_L]: CC4_BONES.CLAVICLE_L,\n [CC4_BONES.CLAVICLE_R]: CC4_BONES.CLAVICLE_R,\n [CC4_BONES.HAND_L]: CC4_BONES.HAND_L,\n [CC4_BONES.HAND_R]: CC4_BONES.HAND_R,\n [CC4_BONES.FOOT_L]: CC4_BONES.FOOT_L,\n [CC4_BONES.FOOT_R]: CC4_BONES.FOOT_R,\n [CC4_BONES.TOEBASE_L]: CC4_BONES.TOEBASE_L,\n [CC4_BONES.TOEBASE_R]: CC4_BONES.TOEBASE_R,\n} as const;\n\n// ============================================================================\n// AU TO BONES - Maps AU IDs to bone bindings (CC4 head/eye/jaw/tongue)\n// ============================================================================\n\nexport const BONE_AU_TO_BINDINGS: Record<number, BoneBinding[]> = {\n // Jaw open/close (jaw drop)\n 25: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 20 }],\n 26: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 30 }],\n 27: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 35 }],\n\n // Jaw lateral (left/right)\n 30: [{ node: CC4_BONES.JAW, channel: 'ry', scale: -1, maxDegrees: 15 }],\n 35: [{ node: CC4_BONES.JAW, channel: 'ry', scale: 1, maxDegrees: 15 }],\n\n // Head yaw (turn left/right)\n // AU 51 = Turn Left: positive ry rotation (scale: 1)\n // AU 52 = Turn Right: negative ry rotation (scale: -1)\n 51: [{ node: CC4_BONES.HEAD, channel: 'ry', scale: 1, maxDegrees: 60 }],\n 52: [{ node: CC4_BONES.HEAD, channel: 'ry', scale: -1, maxDegrees: 60 }],\n\n // Head pitch (up/down)\n // AU 53 = Head Up: negative rx rotation (scale: -1)\n // AU 54 = Head Down: positive rx rotation (scale: 1)\n 53: [{ node: CC4_BONES.HEAD, channel: 'rx', scale: -1, maxDegrees: 30 }],\n 54: [{ node: CC4_BONES.HEAD, channel: 'rx', scale: 1, maxDegrees: 30 }],\n\n // Head roll (tilt)\n 55: [{ node: CC4_BONES.HEAD, channel: 'rz', scale: -1, maxDegrees: 25 }],\n 56: [{ node: CC4_BONES.HEAD, channel: 'rz', scale: 1, maxDegrees: 25 }],\n\n // Eyes horizontal (left/right) - CC4 uses rz for yaw\n // AU 61 = Eyes Turn Left = character looks toward THEIR left = viewer's RIGHT\n // AU 62 = Eyes Turn Right = character looks toward THEIR right = viewer's LEFT\n // For CC4 rigs: positive rz = eyes rotate left (look right), negative rz = eyes rotate right (look left)\n 61: [\n { node: CC4_BONES.EYE_L, channel: 'rz', scale: 1, maxDegrees: 25, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rz', scale: 1, maxDegrees: 25, side: 'right' },\n ],\n 62: [\n { node: CC4_BONES.EYE_L, channel: 'rz', scale: -1, maxDegrees: 25, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rz', scale: -1, maxDegrees: 25, side: 'right' },\n ],\n\n // Eyes vertical (up/down) - rx\n // AU 63 = Eyes Up = character looks up\n // AU 64 = Eyes Down = character looks down\n // For CC4 rigs: negative rx = eyes rotate up, positive rx = eyes rotate down\n 63: [\n { node: CC4_BONES.EYE_L, channel: 'rx', scale: -1, maxDegrees: 20, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rx', scale: -1, maxDegrees: 20, side: 'right' },\n ],\n 64: [\n { node: CC4_BONES.EYE_L, channel: 'rx', scale: 1, maxDegrees: 20, side: 'left' },\n { node: CC4_BONES.EYE_R, channel: 'rx', scale: 1, maxDegrees: 20, side: 'right' },\n ],\n 65: [{ node: CC4_BONES.EYE_L, channel: 'rz', scale: 1, maxDegrees: 25, side: 'left' }],\n 66: [{ node: CC4_BONES.EYE_L, channel: 'rz', scale: -1, maxDegrees: 25, side: 'left' }],\n 67: [{ node: CC4_BONES.EYE_L, channel: 'rx', scale: -1, maxDegrees: 20, side: 'left' }],\n 68: [{ node: CC4_BONES.EYE_L, channel: 'rx', scale: 1, maxDegrees: 20, side: 'left' }],\n 69: [{ node: CC4_BONES.EYE_R, channel: 'rz', scale: 1, maxDegrees: 25, side: 'right' }],\n 70: [{ node: CC4_BONES.EYE_R, channel: 'rz', scale: -1, maxDegrees: 25, side: 'right' }],\n 71: [{ node: CC4_BONES.EYE_R, channel: 'rx', scale: -1, maxDegrees: 20, side: 'right' }],\n 72: [{ node: CC4_BONES.EYE_R, channel: 'rx', scale: 1, maxDegrees: 20, side: 'right' }],\n\n // Tongue controls (optional, for rigs that expose them)\n 37: [{ node: CC4_BONES.TONGUE, channel: 'rz', scale: 1, maxDegrees: 20 }],\n 38: [{ node: CC4_BONES.TONGUE, channel: 'rz', scale: -1, maxDegrees: 20 }],\n 39: [{ node: CC4_BONES.TONGUE, channel: 'ry', scale: -1, maxDegrees: 20 }],\n 40: [{ node: CC4_BONES.TONGUE, channel: 'ry', scale: 1, maxDegrees: 20 }],\n 41: [{ node: CC4_BONES.TONGUE, channel: 'rx', scale: -1, maxDegrees: 20 }],\n 42: [{ node: CC4_BONES.TONGUE, channel: 'rx', scale: 1, maxDegrees: 20 }],\n\n};\n\n// ============================================================================\n// LIP-SYNC SUPPORT CONTROL BINDINGS\n// ============================================================================\n\n/**\n * Lip-sync support controls are not FACS AUs. They are semantic controls emitted\n * by speech planning when the runtime needs articulation support that should not\n * activate a visible FACS morph. Control 103 opens the jaw bone for speech while\n * leaving AU 26's Jaw_Open morph untouched.\n *\n * This is kept as a separate preset object so the data model does not pretend\n * lip-sync support controls are ordinary AUs. `CC4_PROFILE_BONE_BINDINGS` folds\n * it into the legacy `Profile.auToBones` field until Embody has the canonical\n * control/binding model tracked in meekmachine/embody#30.\n */\nexport const LIP_SYNC_CONTROL_TO_BINDINGS: Record<number, BoneBinding[]> = {\n 103: [{ node: CC4_BONES.JAW, channel: 'rz', scale: 1, maxDegrees: 30 }],\n};\n\n/** Legacy compatibility map consumed by the current runtime profile shape. */\nexport const CC4_PROFILE_BONE_BINDINGS: Record<number, BoneBinding[]> = {\n ...BONE_AU_TO_BINDINGS,\n ...LIP_SYNC_CONTROL_TO_BINDINGS,\n};\n\n// ============================================================================\n// VISEME KEYS - CC4 1:1 Direct viseme morph targets (15)\n// ============================================================================\n\nexport const VISEME_KEYS: string[] = [\n 'AE',\n 'Ah',\n 'B_M_P',\n 'Ch_J',\n 'EE',\n 'Er',\n 'F_V',\n 'Ih',\n 'K_G_H_NG',\n 'Oh',\n 'R',\n 'S_Z',\n 'T_L_D_N',\n 'Th',\n 'W_OO',\n];\n\n/**\n * Jaw opening amounts for each viseme index (0-14).\n * Values are 0-1 representing how much the jaw should open.\n * Used by snippetToClip when autoVisemeJaw is enabled.\n */\nexport const VISEME_JAW_AMOUNTS: number[] = [\n 0.75, // 0: AE\n 0.80, // 1: Ah\n 0.00, // 2: B_M_P\n 0.30, // 3: Ch_J\n 0.20, // 4: EE\n 0.35, // 5: Er\n 0.10, // 6: F_V\n 0.20, // 7: Ih\n 0.35, // 8: K_G_H_NG\n 0.60, // 9: Oh\n 0.35, // 10: R\n 0.10, // 11: S_Z\n 0.30, // 12: T_L_D_N\n 0.15, // 13: Th\n 0.50, // 14: W_OO\n];\n\nexport const CC4_VISEME_SYSTEM_ID = 'cc4-arkit-15';\n\nexport const CC4_VISEME_SLOTS: VisemeSlot[] = [\n {\n id: 'ae',\n label: 'AE',\n order: 0,\n providerIds: { azure: [4], sapi: [4] },\n phonemes: ['AE', 'EH', 'EY', 'UH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ae|eh|ey)([_ .-]|$)'],\n features: { jawOpen: 0.75, lipSpread: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[0],\n },\n {\n id: 'ah',\n label: 'Ah',\n order: 1,\n providerIds: { azure: [1, 2, 9, 11, 12], sapi: [1, 2, 9, 11, 12] },\n phonemes: ['AA', 'AE', 'AH', 'AX', 'AW', 'AY', 'HH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ah|aa|aah|open)([_ .-]|$)'],\n features: { jawOpen: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[1],\n },\n {\n id: 'b-m-p',\n label: 'B_M_P',\n order: 2,\n providerIds: { azure: [0, 21], sapi: [0, 21] },\n phonemes: ['B', 'M', 'P'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(b[_ .-]?m[_ .-]?p|bmp|closed|sil|rest)([_ .-]|$)'],\n features: { jawOpen: 0, lipClosed: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[2],\n },\n {\n id: 'ch-j',\n label: 'Ch_J',\n order: 3,\n providerIds: { azure: [16], sapi: [16] },\n phonemes: ['CH', 'JH', 'SH', 'ZH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ch|j|sh|zh)([_ .-]|$)'],\n features: { jawOpen: 0.3, fricative: 0.6 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[3],\n },\n {\n id: 'ee',\n label: 'EE',\n order: 4,\n providerIds: { azure: [6], sapi: [6] },\n phonemes: ['IY', 'IH', 'IX', 'Y'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ee|iy|y)([_ .-]|$)'],\n features: { jawOpen: 0.2, lipSpread: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[4],\n },\n {\n id: 'er',\n label: 'Er',\n order: 5,\n providerIds: { azure: [5], sapi: [5] },\n phonemes: ['ER'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(er)([_ .-]|$)'],\n features: { jawOpen: 0.35, lipRound: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[5],\n },\n {\n id: 'f-v',\n label: 'F_V',\n order: 6,\n providerIds: { azure: [18], sapi: [18] },\n phonemes: ['F', 'V'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(f[_ .-]?v|fv)([_ .-]|$)'],\n features: { jawOpen: 0.1, fricative: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[6],\n },\n {\n id: 'ih',\n label: 'Ih',\n order: 7,\n providerIds: { azure: [6], sapi: [6] },\n phonemes: ['IH', 'IX'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(ih|ix)([_ .-]|$)'],\n features: { jawOpen: 0.2, lipSpread: 0.55 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[7],\n },\n {\n id: 'k-g-h-ng',\n label: 'K_G_H_NG',\n order: 8,\n providerIds: { azure: [20], sapi: [20] },\n phonemes: ['K', 'G', 'NG'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(k[_ .-]?g[_ .-]?h?[_ .-]?ng|kg|ng)([_ .-]|$)'],\n features: { jawOpen: 0.35 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[8],\n },\n {\n id: 'oh',\n label: 'Oh',\n order: 9,\n providerIds: { azure: [3, 8, 10], sapi: [3, 8, 10] },\n phonemes: ['AO', 'OW', 'OY'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(oh|ao|ow|oy)([_ .-]|$)'],\n features: { jawOpen: 0.6, lipRound: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[9],\n },\n {\n id: 'r',\n label: 'R',\n order: 10,\n providerIds: { azure: [13], sapi: [13] },\n phonemes: ['R'],\n matchers: ['(^|[_ .-])(v|viseme)[_ .-]?r([_ .-]|$)', '(^|[_ .-])r[_ .-]?(sound|viseme)([_ .-]|$)'],\n features: { jawOpen: 0.35, lipRound: 0.5 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[10],\n },\n {\n id: 's-z',\n label: 'S_Z',\n order: 11,\n providerIds: { azure: [15], sapi: [15] },\n phonemes: ['S', 'Z'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(s[_ .-]?z|sz)([_ .-]|$)'],\n features: { jawOpen: 0.1, fricative: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[11],\n },\n {\n id: 't-l-d-n',\n label: 'T_L_D_N',\n order: 12,\n providerIds: { azure: [14, 19], sapi: [14, 19] },\n phonemes: ['T', 'L', 'D', 'N'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(t[_ .-]?l[_ .-]?d[_ .-]?n|tldn)([_ .-]|$)', '(^|[_ .-])(v|viseme)[_ .-]?l([_ .-]|$)'],\n features: { jawOpen: 0.3, tongueTip: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[12],\n },\n {\n id: 'th',\n label: 'Th',\n order: 13,\n providerIds: { azure: [17], sapi: [17] },\n phonemes: ['TH', 'DH'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(th|dh)([_ .-]|$)'],\n features: { jawOpen: 0.15, tongueTip: 0.8, fricative: 0.8 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[13],\n },\n {\n id: 'w-oo',\n label: 'W_OO',\n order: 14,\n providerIds: { azure: [7], sapi: [7] },\n phonemes: ['W', 'UW'],\n matchers: ['(^|[_ .-])(v|viseme)?[_ .-]?(w[_ .-]?oo|woo|uw|oo)([_ .-]|$)'],\n features: { jawOpen: 0.5, lipRound: 1 },\n defaultJawAmount: VISEME_JAW_AMOUNTS[14],\n },\n];\n\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/** Check if an AU has both morphs and bones (can blend between them) */\nexport const isMixedAU = (id: number): boolean => {\n const morphs = AU_TO_MORPHS[id];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && BONE_AU_TO_BINDINGS[id]?.length);\n};\n\n/** Check if an AU has separate left/right morphs */\nexport const hasLeftRightMorphs = (auId: number): boolean => {\n const morphs = AU_TO_MORPHS[auId];\n return !!(morphs?.left?.length && morphs?.right?.length);\n};\n\n/** Check if an AU has bilateral bone bindings (L and R nodes) in CC4 preset */\nexport const hasLeftRightBones = (auId: number): boolean => {\n const bindings = BONE_AU_TO_BINDINGS[auId];\n return checkBindingsForLeftRight(bindings);\n};\n\n/** Helper to check if bone bindings have L and R nodes */\nexport const checkBindingsForLeftRight = (bindings: BoneBinding[] | undefined): boolean => {\n if (!bindings || bindings.length === 0) return false;\n\n // Check if bindings include both L and R nodes\n const nodes = bindings.map(b => b.node);\n // Match patterns like _L, _R, _L_, _R_, GILL_L, GILL_R, etc.\n const hasLeft = nodes.some(n => /_L$|_L_|GILL_L|_L\\d/i.test(n));\n const hasRight = nodes.some(n => /_R$|_R_|GILL_R|_R\\d/i.test(n));\n\n return hasLeft && hasRight;\n};\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Unified rotation control for bones\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n {\n node: CC4_BONES.JAW,\n pitch: { aus: [25, 26, 27, 103], axis: 'rz' }, // Jaw drop plus speech jaw pseudo-control\n yaw: { aus: [30, 35], axis: 'ry', negative: 30, positive: 35 }, // Jaw lateral (left/right)\n roll: null // Jaw doesn't have roll\n },\n {\n node: CC4_BONES.HEAD,\n pitch: { aus: [54, 53], axis: 'rx', negative: 54, positive: 53 }, // Head down/up\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head turn left/right\n roll: { aus: [55, 56], axis: 'rz', negative: 55, positive: 56 } // Head tilt left/right\n },\n {\n node: CC4_BONES.EYE_L,\n pitch: { aus: [64, 63, 68, 67], axis: 'rx', negative: [64, 68], positive: [63, 67] }, // Eyes down/up\n yaw: { aus: [61, 62, 65, 66], axis: 'rz', negative: [61, 65], positive: [62, 66] }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: CC4_BONES.EYE_R,\n pitch: { aus: [64, 63, 72, 71], axis: 'rx', negative: [64, 72], positive: [63, 71] }, // Eyes down/up\n yaw: { aus: [61, 62, 69, 70], axis: 'rz', negative: [61, 69], positive: [62, 70] }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: CC4_BONES.TONGUE,\n pitch: { aus: [38, 37], axis: 'rz', negative: 38, positive: 37 }, // Tongue down/up\n yaw: { aus: [39, 40], axis: 'ry', negative: 39, positive: 40 }, // Tongue left/right\n roll: { aus: [41, 42], axis: 'rx', negative: 41, positive: 42 } // Tongue tilt left/right\n }\n];\n\n// ============================================================================\n// CONTINUUM PAIRS - Bidirectional AU pair mappings\n// ============================================================================\n\n/**\n * Continuum pair mappings - precomputed from COMPOSITE_ROTATIONS\n * Maps AU ID to its continuum partner info for bidirectional axes\n * (e.g., AU 51 \"Head Left\" is paired with AU 52 \"Head Right\")\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n}> = {\n // Eyes horizontal - both eyes share same AUs (yaw maps to rz via COMPOSITE_ROTATIONS)\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_L },\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_L },\n 65: { pairId: 66, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_L },\n 66: { pairId: 65, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_L },\n 69: { pairId: 70, isNegative: true, axis: 'yaw', node: CC4_BONES.EYE_R },\n 70: { pairId: 69, isNegative: false, axis: 'yaw', node: CC4_BONES.EYE_R },\n // Eyes vertical (pitch)\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_L },\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_L },\n 68: { pairId: 67, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_L },\n 67: { pairId: 68, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_L },\n 72: { pairId: 71, isNegative: true, axis: 'pitch', node: CC4_BONES.EYE_R },\n 71: { pairId: 72, isNegative: false, axis: 'pitch', node: CC4_BONES.EYE_R },\n // Head yaw (turn left/right)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: CC4_BONES.HEAD },\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: CC4_BONES.HEAD },\n // Head pitch (up/down)\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: CC4_BONES.HEAD },\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: CC4_BONES.HEAD },\n // Head roll (tilt left/right)\n 55: { pairId: 56, isNegative: true, axis: 'roll', node: CC4_BONES.HEAD },\n 56: { pairId: 55, isNegative: false, axis: 'roll', node: CC4_BONES.HEAD },\n // Jaw yaw (left/right)\n 30: { pairId: 35, isNegative: true, axis: 'yaw', node: CC4_BONES.JAW },\n 35: { pairId: 30, isNegative: false, axis: 'yaw', node: CC4_BONES.JAW },\n // Tongue yaw (left/right)\n 39: { pairId: 40, isNegative: true, axis: 'yaw', node: CC4_BONES.TONGUE },\n 40: { pairId: 39, isNegative: false, axis: 'yaw', node: CC4_BONES.TONGUE },\n // Tongue pitch (up/down)\n 38: { pairId: 37, isNegative: true, axis: 'pitch', node: CC4_BONES.TONGUE },\n 37: { pairId: 38, isNegative: false, axis: 'pitch', node: CC4_BONES.TONGUE },\n // Tongue roll (tilt left/right)\n 41: { pairId: 42, isNegative: true, axis: 'roll', node: CC4_BONES.TONGUE },\n 42: { pairId: 41, isNegative: false, axis: 'roll', node: CC4_BONES.TONGUE },\n // Extended tongue morphs (continuum pairs)\n 73: { pairId: 74, isNegative: true, axis: 'yaw', node: CC4_BONES.TONGUE }, // Tongue Narrow/Wide\n 74: { pairId: 73, isNegative: false, axis: 'yaw', node: CC4_BONES.TONGUE },\n 76: { pairId: 77, isNegative: false, axis: 'pitch', node: CC4_BONES.TONGUE }, // Tongue Tip Up/Down\n 77: { pairId: 76, isNegative: true, axis: 'pitch', node: CC4_BONES.TONGUE },\n};\n\n/**\n * Human-readable labels for continuum pairs\n * Key format: \"negativeAU-positiveAU\"\n * Used by UI components (ContinuumSlider, AUSection) to display friendly axis names\n */\nexport const CONTINUUM_LABELS: Record<string, string> = {\n '61-62': 'Eyes — Horizontal',\n '64-63': 'Eyes — Vertical',\n '65-66': 'Left Eye — Horizontal',\n '68-67': 'Left Eye — Vertical',\n '69-70': 'Right Eye — Horizontal',\n '72-71': 'Right Eye — Vertical',\n '51-52': 'Head — Horizontal',\n '54-53': 'Head — Vertical',\n '55-56': 'Head — Tilt',\n '30-35': 'Jaw — Horizontal',\n '38-37': 'Tongue — Vertical',\n '39-40': 'Tongue — Horizontal',\n '41-42': 'Tongue — Tilt',\n '73-74': 'Tongue — Width',\n '76-77': 'Tongue Tip — Vertical',\n};\n\nexport const CC4_EYE_MESH_NODES = {\n LEFT: 'CC_Base_Eye',\n RIGHT: 'CC_Base_Eye_1'\n} as const;\n\n// ============================================================================\n// AU INFO - Metadata for each Action Unit\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Forehead / Brow (Upper)\n '1': { id:'1', name:'Inner Brow Raiser', muscularBasis:'frontalis (pars medialis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '2': { id:'2', name:'Outer Brow Raiser', muscularBasis:'frontalis (pars lateralis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '4': { id:'4', name:'Brow Lowerer', muscularBasis:'corrugator/depressor supercilii', links:['https://en.wikipedia.org/wiki/Corrugator_supercilii'], faceArea:'Upper', facePart:'Forehead' },\n\n // Eyelids / Eyes (Upper)\n '5': { id:'5', name:'Upper Lid Raiser', muscularBasis:'levator palpebrae superioris', links:['https://en.wikipedia.org/wiki/Levator_palpebrae_superioris'], faceArea:'Upper', facePart:'Eyelids' },\n '6': { id:'6', name:'Cheek Raiser', muscularBasis:'orbicularis oculi (pars orbitalis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Cheeks' },\n '7': { id:'7', name:'Lid Tightener', muscularBasis:'orbicularis oculi (pars palpebralis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Eyelids' },\n '43': { id:'43', name:'Eyes Closed', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '45': { id:'45', name:'Blink', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '61': { id:'61', name:'Eyes Turn Left', faceArea:'Upper', facePart:'Eyes' },\n '62': { id:'62', name:'Eyes Turn Right', faceArea:'Upper', facePart:'Eyes' },\n '63': { id:'63', name:'Eyes Up', faceArea:'Upper', facePart:'Eyes' },\n '64': { id:'64', name:'Eyes Down', faceArea:'Upper', facePart:'Eyes' },\n '65': { id:'65', name:'Left Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '66': { id:'66', name:'Left Eye Look Right', faceArea:'Upper', facePart:'Eyes' },\n '67': { id:'67', name:'Left Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '68': { id:'68', name:'Left Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n '69': { id:'69', name:'Right Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '70': { id:'70', name:'Right Eye Look Right',faceArea:'Upper', facePart:'Eyes' },\n '71': { id:'71', name:'Right Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '72': { id:'72', name:'Right Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n\n // Nose / Cheeks\n '9': { id:'9', name:'Nose Wrinkler', muscularBasis:'levator labii superioris alaeque nasi', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris_alaeque_nasi'], faceArea:'Upper', facePart:'Nose' },\n '34': { id:'34', name:'Cheek Puff', faceArea:'Lower', facePart:'Cheeks' },\n\n // Mouth (Lower)\n '8': { id:'8', name:'Lips Toward Each Other', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '10': { id:'10', name:'Upper Lip Raiser', muscularBasis:'levator labii superioris', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris'], faceArea:'Lower', facePart:'Mouth' },\n '11': { id:'11', name:'Nasolabial Deepener', muscularBasis:'zygomaticus minor', links:['https://en.wikipedia.org/wiki/Zygomaticus_minor'], faceArea:'Lower', facePart:'Cheeks' },\n '12': { id:'12', name:'Lip Corner Puller', muscularBasis:'zygomaticus major', links:['https://en.wikipedia.org/wiki/Zygomaticus_major'], faceArea:'Lower', facePart:'Mouth' },\n '13': { id:'13', name:'Sharp Lip Puller', muscularBasis:'levator anguli oris', links:['https://en.wikipedia.org/wiki/Levator_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '14': { id:'14', name:'Dimpler', muscularBasis:'buccinator', links:['https://en.wikipedia.org/wiki/Buccinator'], faceArea:'Lower', facePart:'Cheeks' },\n '15': { id:'15', name:'Lip Corner Depressor', muscularBasis:'depressor anguli oris', links:['https://en.wikipedia.org/wiki/Depressor_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '16': { id:'16', name:'Lower Lip Depressor', muscularBasis:'depressor labii inferioris', links:['https://en.wikipedia.org/wiki/Depressor_labii_inferioris'], faceArea:'Lower', facePart:'Mouth' },\n '17': { id:'17', name:'Chin Raiser', muscularBasis:'mentalis', links:['https://en.wikipedia.org/wiki/Mentalis'], faceArea:'Lower', facePart:'Chin' },\n '18': { id:'18', name:'Lip Pucker', faceArea:'Lower', facePart:'Mouth' },\n '20': { id:'20', name:'Lip Stretcher', muscularBasis:'risorius + platysma', links:['https://en.wikipedia.org/wiki/Risorius','https://en.wikipedia.org/wiki/Platysma'], faceArea:'Lower', facePart:'Mouth' },\n '22': { id:'22', name:'Lip Funneler', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '23': { id:'23', name:'Lip Tightener', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '24': { id:'24', name:'Lip Presser', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '25': { id:'25', name:'Lips Part', faceArea:'Lower', facePart:'Mouth' },\n '27': { id:'27', name:'Mouth Stretch', muscularBasis:'pterygoids + digastric', links:['https://en.wikipedia.org/wiki/Pterygoid_bone','https://en.wikipedia.org/wiki/Digastric_muscle'], faceArea:'Lower', facePart:'Mouth' },\n '28': { id:'28', name:'Lip Suck', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n\n // Tongue (Lower)\n '19': { id:'19', name:'Tongue Show', faceArea:'Lower', facePart:'Tongue' },\n '36': { id:'36', name:'Tongue Bulge', faceArea:'Lower', facePart:'Tongue' },\n '37': { id:'37', name:'Tongue Up', faceArea:'Lower', facePart:'Tongue' },\n '38': { id:'38', name:'Tongue Down', faceArea:'Lower', facePart:'Tongue' },\n '39': { id:'39', name:'Tongue Left', faceArea:'Lower', facePart:'Tongue' },\n '40': { id:'40', name:'Tongue Right', faceArea:'Lower', facePart:'Tongue' },\n '41': { id:'41', name:'Tongue Tilt Left', faceArea:'Lower', facePart:'Tongue' },\n '42': { id:'42', name:'Tongue Tilt Right', faceArea:'Lower', facePart:'Tongue' },\n // Extended tongue controls (CC4-specific morphs)\n '73': { id:'73', name:'Tongue Narrow', faceArea:'Lower', facePart:'Tongue' },\n '74': { id:'74', name:'Tongue Wide', faceArea:'Lower', facePart:'Tongue' },\n '75': { id:'75', name:'Tongue Roll', faceArea:'Lower', facePart:'Tongue' },\n '76': { id:'76', name:'Tongue Tip Up', faceArea:'Lower', facePart:'Tongue' },\n '77': { id:'77', name:'Tongue Tip Down', faceArea:'Lower', facePart:'Tongue' },\n\n // Jaw (Lower)\n '26': { id:'26', name:'Jaw Drop', muscularBasis:'masseter (relax temporalis)', links:['https://en.wikipedia.org/wiki/Masseter_muscle'], faceArea:'Lower', facePart:'Jaw' },\n '29': { id:'29', name:'Jaw Thrust', faceArea:'Lower', facePart:'Jaw' },\n '30': { id:'30', name:'Jaw Left', faceArea:'Lower', facePart:'Jaw' },\n '31': { id:'31', name:'Jaw Clencher', muscularBasis:'masseter + temporalis', faceArea:'Lower', facePart:'Jaw' },\n '32': { id:'32', name:'Lip Bite', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '35': { id:'35', name:'Jaw Right', faceArea:'Lower', facePart:'Jaw' },\n\n // Head position (M51-M56 in FACS notation)\n '51': { id:'51', name:'Head Turn Left', faceArea:'Upper', facePart:'Head' },\n '52': { id:'52', name:'Head Turn Right', faceArea:'Upper', facePart:'Head' },\n '53': { id:'53', name:'Head Up', faceArea:'Upper', facePart:'Head' },\n '54': { id:'54', name:'Head Down', faceArea:'Upper', facePart:'Head' },\n '55': { id:'55', name:'Head Tilt Left', faceArea:'Upper', facePart:'Head' },\n '56': { id:'56', name:'Head Tilt Right', faceArea:'Upper', facePart:'Head' },\n\n // Eye (Upper) - EO morphs applied to CC_Base_Eye meshes\n '80': { id:'80', name:'Eye Bulge', faceArea:'Upper', facePart:'Eye' },\n '81': { id:'81', name:'Eye Depth', faceArea:'Upper', facePart:'Eye' },\n '82': { id:'82', name:'Eye Inner Depth', faceArea:'Upper', facePart:'Eye' },\n '83': { id:'83', name:'Eye Inner Height', faceArea:'Upper', facePart:'Eye' },\n '84': { id:'84', name:'Eye Inner Width', faceArea:'Upper', facePart:'Eye' },\n '85': { id:'85', name:'Eye Outer Depth', faceArea:'Upper', facePart:'Eye' },\n '86': { id:'86', name:'Eye Outer Height', faceArea:'Upper', facePart:'Eye' },\n '87': { id:'87', name:'Eye Outer Width', faceArea:'Upper', facePart:'Eye' },\n '88': { id:'88', name:'Eye Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '89': { id:'89', name:'Eye Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '90': { id:'90', name:'Eye Center Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '91': { id:'91', name:'Eye Center Upper Height',faceArea:'Upper', facePart:'Eye' },\n '92': { id:'92', name:'Eye Center Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '93': { id:'93', name:'Eye Center Lower Height',faceArea:'Upper', facePart:'Eye' },\n '94': { id:'94', name:'Eye Inner Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '95': { id:'95', name:'Eye Inner Upper Height', faceArea:'Upper', facePart:'Eye' },\n '96': { id:'96', name:'Eye Inner Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '97': { id:'97', name:'Eye Inner Lower Height', faceArea:'Upper', facePart:'Eye' },\n '98': { id:'98', name:'Eye Outer Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '99': { id:'99', name:'Eye Outer Upper Height', faceArea:'Upper', facePart:'Eye' },\n '100': { id:'100', name:'Eye Outer Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '101': { id:'101', name:'Eye Outer Lower Height',faceArea:'Upper', facePart:'Eye' },\n '102': { id:'102', name:'Eye Duct Depth', faceArea:'Upper', facePart:'Eye' },\n};\n\n// ============================================================================\n// MIX DEFAULTS - Morph/bone blend weights\n// ============================================================================\n\n/** Default mix weights (0 = morph only, 1 = bone only) */\nexport const AU_MIX_DEFAULTS: Record<number, number> = {\n 31: 0.7, 32: 0.7, 33: 0.7, 54: 0.7, 55: 0.7, 56: 0.7, // head\n 61: 0.5, 62: 0.5, 63: 0.5, 64: 0.5, // eyes\n 25: 0.5, 26: 0.5, 27: 0.5, // jaw open (lips part, jaw drop, mouth stretch)\n 30: 0.5, 35: 0.5, // jaw left/right\n};\n\n// ============================================================================\n// CC4 MESH CLASSIFICATION\n// Types imported from '../mappings/types'\n// ============================================================================\n\n/** Exact mesh name -> category mapping from the character GLB */\nexport const CC4_MESHES: Record<string, MeshInfo> = {\n // Body (6 meshes, 80 morphs each) - default render order 0\n 'CC_Base_Body_1': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_2': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_3': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_4': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_5': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_6': { category: 'body', morphCount: 80 },\n // Eyes (bone-driven, no morphs) - render first (behind everything)\n 'CC_Base_Eye': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_1': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_2': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_3': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_4': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n // Eye occlusion (94 morphs each) - render on top of eyes with transparency support\n 'CC_Base_EyeOcclusion_1': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n 'CC_Base_EyeOcclusion_2': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n // Tear lines (90 morphs each) - on top of eyes/face\n 'CC_Base_TearLine_1': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n 'CC_Base_TearLine_2': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n // Cornea (no morphs) - render first with eyes\n 'CC_Base_Cornea': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Cornea_1': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n // Teeth (no morphs, follow jaw bone) - default render order\n 'CC_Base_Teeth_1': { category: 'teeth', morphCount: 0 },\n 'CC_Base_Teeth_2': { category: 'teeth', morphCount: 0 },\n // Tongue (23 morphs) - default render order\n 'CC_Base_Tongue': { category: 'tongue', morphCount: 23 },\n // Eyebrows (91 morphs each) - above face\n 'Male_Bushy_1': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n 'Male_Bushy_2': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n // Hair (14 styling morphs each) - render last (on top of everything)\n 'Side_part_wavy_1': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n 'Side_part_wavy_2': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n};\n\n// ============================================================================\n// MORPH TO MESH MAPPING\n// MorphCategory type imported from '../mappings/types'\n// ============================================================================\n\n/** Which mesh each morph category applies to */\nexport const MORPH_TO_MESH: Record<MorphCategory, string[]> = {\n // Face/AU morphs target the main body mesh only.\n // Include both CC4 naming variants (with and without _1/_2 suffixes).\n face: ['CC_Base_Body'],\n viseme: ['CC_Base_Body', 'CC_Base_Body_1'],\n eye: ['CC_Base_EyeOcclusion', 'CC_Base_EyeOcclusion_1', 'CC_Base_EyeOcclusion_2'],\n tongue: ['CC_Base_Tongue', 'CC_Base_Tongue_1'],\n hair: ['Side_part_wavy', 'Side_part_wavy_1', 'Side_part_wavy_2'],\n};\n\n/** Map AU facePart labels to morphToMesh categories for configurable AU mesh routing. */\nexport const AU_FACEPART_TO_MESH_CATEGORY: Record<string, MorphCategory> = {\n Eye: 'eye',\n Eyes: 'eye',\n Eyelids: 'eye',\n Tongue: 'tongue',\n};\n\nexport const CC4_MAPPING_SECTIONS: MappingEditorSection[] = [\n { id: 'Forehead', label: 'Forehead', kind: 'au', order: 0, meshCategory: 'face', facePart: 'Forehead' },\n { id: 'Eyelids', label: 'Eyelids', kind: 'au', order: 1, meshCategory: 'eye', facePart: 'Eyelids' },\n { id: 'Eyes', label: 'Eyes', kind: 'au', order: 2, meshCategory: 'eye', facePart: 'Eyes' },\n { id: 'Cheeks', label: 'Cheeks', kind: 'au', order: 3, meshCategory: 'face', facePart: 'Cheeks' },\n { id: 'Nose', label: 'Nose', kind: 'au', order: 4, meshCategory: 'face', facePart: 'Nose' },\n { id: 'Mouth', label: 'Mouth', kind: 'au', order: 5, meshCategory: 'face', facePart: 'Mouth' },\n { id: 'Chin', label: 'Chin', kind: 'au', order: 6, meshCategory: 'face', facePart: 'Chin' },\n { id: 'Jaw', label: 'Jaw', kind: 'au', order: 7, meshCategory: 'face', facePart: 'Jaw' },\n { id: 'Tongue', label: 'Tongue', kind: 'au', order: 8, meshCategory: 'tongue', facePart: 'Tongue' },\n { id: 'Head', label: 'Head', kind: 'au', order: 9, meshCategory: 'face', facePart: 'Head' },\n { id: 'Joint Controls', label: 'Joint Controls', kind: 'au', order: 10, meshCategory: 'face', facePart: 'Joint Controls' },\n { id: 'Eye', label: 'Eye', kind: 'au', order: 11, meshCategory: 'eye', facePart: 'Eye' },\n { id: 'Hair', label: 'Hair', kind: 'hair', order: 12, meshCategory: 'hair' },\n { id: 'Visemes', label: 'Visemes', kind: 'viseme', order: 13, meshCategory: 'viseme' },\n { id: 'LipSync', label: 'Lip Sync', kind: 'lipSync', order: 14, meshCategory: 'face' },\n { id: 'Unmapped', label: 'Unmapped', kind: 'unmapped', order: 15, meshCategory: 'face' },\n];\n\n// ============================================================================\n// HAIR PHYSICS DEFAULTS\n// ============================================================================\n\nexport const CC4_HAIR_PHYSICS: Profile['hairPhysics'] = {\n stiffness: 7.5,\n damping: 0.18,\n inertia: 3.5,\n gravity: 12,\n responseScale: 2.5,\n idleSwayAmount: 0.12,\n idleSwaySpeed: 1.0,\n windStrength: 0,\n windDirectionX: 1.0,\n windDirectionZ: 0,\n windTurbulence: 0.3,\n windFrequency: 1.4,\n idleClipDuration: 10,\n impulseClipDuration: 1.4,\n direction: {\n yawSign: -1,\n pitchSign: -1,\n },\n morphTargets: {\n swayLeft: { key: 'L_Hair_Left', axis: 'yaw' },\n swayRight: { key: 'L_Hair_Right', axis: 'yaw' },\n swayFront: { key: 'L_Hair_Front', axis: 'pitch' },\n fluffRight: { key: 'Fluffy_Right', axis: 'yaw' },\n fluffBottom: { key: 'Fluffy_Bottom_ALL', axis: 'pitch' },\n headUp: {\n Hairline_High_ALL: { value: 0.45, axis: 'pitch' },\n Length_Short: { value: 0.65, axis: 'pitch' },\n },\n headDown: {\n L_Hair_Front: { value: 2.0, axis: 'pitch' },\n Fluffy_Bottom_ALL: { value: 1.0, axis: 'pitch' },\n },\n },\n};\n\n// ============================================================================\n// CC4_PRESET - Main export for Profile\n// ============================================================================\n\nexport const CC4_PRESET: Profile = {\n name: 'Character Creator 4',\n animalType: 'human',\n // No emoji for humans - uses FaTheaterMasks icon instead\n auToMorphs: AU_TO_MORPHS,\n auToBones: CC4_PROFILE_BONE_BINDINGS,\n boneNodes: CC4_BONE_NODES,\n bonePrefix: CC4_BONE_PREFIX,\n suffixPattern: CC4_SUFFIX_PATTERN,\n morphToMesh: MORPH_TO_MESH,\n auFacePartToMeshCategory: AU_FACEPART_TO_MESH_CATEGORY,\n mappingSections: CC4_MAPPING_SECTIONS,\n visemeKeys: VISEME_KEYS,\n visemeSystemId: CC4_VISEME_SYSTEM_ID,\n visemeSlots: CC4_VISEME_SLOTS,\n visemeMeshCategory: 'viseme',\n visemeJawAmounts: VISEME_JAW_AMOUNTS,\n auMixDefaults: AU_MIX_DEFAULTS,\n auInfo: AU_INFO,\n eyeMeshNodes: CC4_EYE_MESH_NODES,\n meshes: CC4_MESHES,\n continuumPairs: CONTINUUM_PAIRS_MAP,\n continuumLabels: CONTINUUM_LABELS,\n hairPhysics: CC4_HAIR_PHYSICS,\n annotationRegions: [\n {\n name: 'full_body',\n objects: ['*'],\n paddingFactor: 2.0,\n },\n {\n name: 'head',\n bones: ['HEAD', 'JAW'],\n paddingFactor: 1.5,\n children: ['face', 'left_eye', 'right_eye', 'mouth'],\n expandAnimation: 'staggered',\n },\n {\n name: 'face',\n bones: ['HEAD'],\n // meshes: populated by user selection in wizard - varies per character\n paddingFactor: 1.3,\n parent: 'head',\n },\n {\n name: 'left_eye',\n bones: ['EYE_L'],\n paddingFactor: 0.9,\n parent: 'head',\n },\n {\n name: 'right_eye',\n bones: ['EYE_R'],\n paddingFactor: 0.9,\n parent: 'head',\n },\n {\n name: 'mouth',\n bones: ['JAW'],\n paddingFactor: 1.5,\n parent: 'head',\n },\n {\n name: 'upper_body',\n bones: [\n 'SPINE_02',\n 'HEAD',\n 'CLAVICLE_L',\n 'CLAVICLE_R',\n ],\n paddingFactor: 1.6,\n },\n {\n name: 'back',\n bones: ['SPINE_01', 'SPINE_02'],\n paddingFactor: 1.8,\n cameraAngle: 180,\n },\n {\n name: 'left_hand',\n bones: ['HAND_L'],\n paddingFactor: 1.3,\n cameraAngle: 270,\n },\n {\n name: 'right_hand',\n bones: ['HAND_R'],\n paddingFactor: 1.3,\n cameraAngle: 90,\n },\n {\n name: 'left_foot',\n bones: ['FOOT_L', 'TOEBASE_L'],\n paddingFactor: 2.5,\n cameraAngle: 270,\n },\n {\n name: 'right_foot',\n bones: ['FOOT_R', 'TOEBASE_R'],\n paddingFactor: 2.5,\n cameraAngle: 90,\n },\n ],\n};\n\nexport default CC4_PRESET;\n","import { Mesh } from 'three';\nimport type { Object3D } from 'three';\nimport type { ClipHandle, ClipOptions, CurvesMap } from '../../../core/types';\nimport type {\n HairPhysicsDirectionConfig as SharedHairPhysicsDirectionConfig,\n HairMorphTargetsConfig as SharedHairMorphTargetsConfig,\n HairPhysicsRuntimeConfig as SharedHairPhysicsConfig,\n HairPhysicsRuntimeConfigUpdate as SharedHairPhysicsConfigUpdate,\n HairAppearanceState,\n HairColorAppearance,\n} from '../../../interfaces/Hair';\nimport {\n colorToCssHex,\n DEFAULT_HAIR_COLOR_APPEARANCE,\n normalizeHairColorAppearance,\n} from '../../../hair/appearance';\nimport type { HairPhysicsProfileConfig } from '../../../mappings/types';\nimport { CC4_MESHES } from '../../../presets/cc4';\nimport type { EmbodyCoreWasmModule } from '../../../wasmTypes';\n\nexport type HairPhysicsDirectionConfig = SharedHairPhysicsDirectionConfig;\nexport type HairMorphTargets = SharedHairMorphTargetsConfig;\nexport type HairPhysicsConfig = SharedHairPhysicsConfig;\nexport type HairPhysicsConfigUpdate = SharedHairPhysicsConfigUpdate;\n\nexport interface HairPhysicsHost {\n getMeshByName: (name: string) => Mesh | undefined;\n getSelectedHairMeshNames?: () => string[];\n buildClip?: (clipName: string, curves: CurvesMap, options?: ClipOptions) => ClipHandle | null;\n cleanupSnippet?: (name: string) => void;\n}\n\nconst clamp01 = (value: number) => (value < 0 ? 0 : value > 1 ? 1 : value);\n\nexport class HairPhysicsController {\n private host: HairPhysicsHost;\n private core: EmbodyCoreWasmModule | null = null;\n private hairPhysicsEnabled = false;\n private hairPhysicsConfig: HairPhysicsConfig = {\n stiffness: 7.5,\n damping: 0.18,\n inertia: 3.5,\n gravity: 12,\n responseScale: 2.5,\n idleSwayAmount: 0.12,\n idleSwaySpeed: 1.0,\n windStrength: 0,\n windDirectionX: 1.0,\n windDirectionZ: 0,\n windTurbulence: 0.3,\n windFrequency: 1.4,\n idleClipDuration: 10,\n impulseClipDuration: 1.4,\n direction: {\n yawSign: -1,\n pitchSign: -1,\n },\n morphTargets: {\n swayLeft: 'L_Hair_Left',\n swayRight: 'L_Hair_Right',\n swayFront: 'L_Hair_Front',\n fluffRight: 'Fluffy_Right',\n fluffBottom: 'Fluffy_Bottom_ALL',\n headUp: {\n Hairline_High_ALL: 0.45,\n Length_Short: 0.65,\n },\n headDown: {\n L_Hair_Front: 2.0,\n Fluffy_Bottom_ALL: 1.0,\n },\n },\n };\n private readonly idleClipName = 'hair_idle';\n private readonly gravityClipName = 'hair_gravity';\n private readonly impulseClipNames = {\n left: 'hair_impulse_left',\n right: 'hair_impulse_right',\n front: 'hair_impulse_front',\n };\n private idleClipHandle: ClipHandle | null = null;\n private gravityClipHandle: ClipHandle | null = null;\n private idleClipDirty = true;\n private gravityClipDirty = true;\n private impulseClips: { left?: ClipHandle; right?: ClipHandle; front?: ClipHandle } = {};\n private impulseClipDirty = true;\n private impulseEndTimers: Partial<Record<'left' | 'right' | 'front', ReturnType<typeof setTimeout>>> = {};\n private impulseFadeSteps: Partial<Record<'left' | 'right' | 'front', ReturnType<typeof setTimeout>[]>> = {};\n private hasHeadState = false;\n private lastHeadHorizontal = 0;\n private lastHeadVertical = 0;\n private registeredHairObjects = new Map<string, Mesh>();\n private cachedHairMeshNames: string[] | null = null;\n private warnedMissingMorphTargets = new Set<string>();\n private appearance: HairAppearanceState = {\n hairColor: { ...DEFAULT_HAIR_COLOR_APPEARANCE },\n eyebrowColor: { ...DEFAULT_HAIR_COLOR_APPEARANCE },\n showOutline: false,\n outlineColor: '#00ff00',\n outlineOpacity: 1,\n };\n private appearanceSampled = false;\n\n constructor(host: HairPhysicsHost) {\n this.host = host;\n }\n\n /** Attach the Wasm module owned by the engine/session that created this controller. */\n setCore(core: EmbodyCoreWasmModule): void {\n this.core = core;\n }\n\n private requireCore(): EmbodyCoreWasmModule {\n if (!this.core) {\n throw new Error(\n 'HairPhysicsController has no Embody Wasm core. Create the engine with Embody.create() or call setCore() after initEmbodyCore().'\n );\n }\n return this.core;\n }\n\n private isEyebrowMesh(name: string, mesh?: Mesh): boolean {\n const info = CC4_MESHES[name];\n if (info?.category === 'eyebrow') return true;\n if (info?.category === 'hair') return false;\n const lower = name.toLowerCase();\n return lower.includes('eyebrow') || lower.includes('brow');\n }\n\n private sampleColorFromMesh(mesh: Mesh | undefined): HairAppearanceState['hairColor'] | null {\n if (!mesh || !mesh.material || Array.isArray(mesh.material)) return null;\n const mat = mesh.material as typeof mesh.material & {\n color?: { getHexString(): string };\n emissive?: { getHexString(): string };\n emissiveIntensity?: number;\n };\n const baseColor = colorToCssHex(mat.color);\n if (!baseColor) return null;\n return {\n baseColor,\n emissive: colorToCssHex(mat.emissive) ?? '#000000',\n emissiveIntensity: typeof mat.emissiveIntensity === 'number' ? mat.emissiveIntensity : 0,\n };\n }\n\n private ensureAppearanceSampled(): void {\n if (this.appearanceSampled) return;\n this.appearanceSampled = true;\n\n let hairSample: HairAppearanceState['hairColor'] | null = null;\n let browSample: HairAppearanceState['hairColor'] | null = null;\n for (const [name, mesh] of this.registeredHairObjects) {\n if (this.isEyebrowMesh(name, mesh)) {\n browSample ??= this.sampleColorFromMesh(mesh);\n } else {\n hairSample ??= this.sampleColorFromMesh(mesh);\n }\n if (hairSample && browSample) break;\n }\n\n if (hairSample) this.appearance.hairColor = hairSample;\n if (browSample) this.appearance.eyebrowColor = browSample;\n }\n\n private applyColorToCategory(\n category: 'hair' | 'eyebrow',\n color: HairAppearanceState['hairColor'],\n ): void {\n for (const [name, mesh] of this.registeredHairObjects) {\n const isBrow = this.isEyebrowMesh(name, mesh);\n if (category === 'eyebrow' ? !isBrow : isBrow) continue;\n this.applyHairStateToObject(name, {\n color: {\n baseColor: color.baseColor,\n emissive: color.emissive,\n emissiveIntensity: color.emissiveIntensity,\n },\n isEyebrow: isBrow,\n });\n }\n }\n\n getHairAppearance(): HairAppearanceState {\n this.ensureAppearanceSampled();\n return {\n hairColor: { ...this.appearance.hairColor },\n eyebrowColor: { ...this.appearance.eyebrowColor },\n showOutline: this.appearance.showOutline,\n outlineColor: this.appearance.outlineColor,\n outlineOpacity: this.appearance.outlineOpacity,\n };\n }\n\n setHairColor(color: HairColorAppearance | string): void {\n this.ensureAppearanceSampled();\n this.appearance.hairColor = normalizeHairColorAppearance(color, {\n ...DEFAULT_HAIR_COLOR_APPEARANCE,\n ...this.appearance.hairColor,\n name: this.appearance.hairColor.name ?? DEFAULT_HAIR_COLOR_APPEARANCE.name,\n });\n this.applyColorToCategory('hair', this.appearance.hairColor);\n }\n\n setEyebrowColor(color: HairColorAppearance | string): void {\n this.ensureAppearanceSampled();\n this.appearance.eyebrowColor = normalizeHairColorAppearance(color, {\n ...DEFAULT_HAIR_COLOR_APPEARANCE,\n ...this.appearance.eyebrowColor,\n name: this.appearance.eyebrowColor.name ?? DEFAULT_HAIR_COLOR_APPEARANCE.name,\n });\n this.applyColorToCategory('eyebrow', this.appearance.eyebrowColor);\n }\n\n setHairBaseColor(baseColor: string): void {\n this.ensureAppearanceSampled();\n this.setHairColor({\n ...this.appearance.hairColor,\n baseColor,\n });\n }\n\n setEyebrowBaseColor(baseColor: string): void {\n this.ensureAppearanceSampled();\n this.setEyebrowColor({\n ...this.appearance.eyebrowColor,\n baseColor,\n });\n }\n\n setHairGlow(emissive: string, intensity: number): void {\n this.ensureAppearanceSampled();\n this.setHairColor({\n ...this.appearance.hairColor,\n emissive,\n emissiveIntensity: intensity,\n });\n }\n\n setEyebrowGlow(emissive: string, intensity: number): void {\n this.ensureAppearanceSampled();\n this.setEyebrowColor({\n ...this.appearance.eyebrowColor,\n emissive,\n emissiveIntensity: intensity,\n });\n }\n\n setHairOutline(outline: { show: boolean; color?: string; opacity?: number }): void {\n this.ensureAppearanceSampled();\n this.appearance.showOutline = Boolean(outline.show);\n if (outline.color !== undefined) {\n this.appearance.outlineColor = outline.color;\n }\n if (outline.opacity !== undefined) {\n this.appearance.outlineOpacity = outline.opacity;\n }\n const payload = {\n outline: {\n show: this.appearance.showOutline,\n color: this.appearance.outlineColor,\n opacity: this.appearance.outlineOpacity,\n },\n };\n for (const name of this.registeredHairObjects.keys()) {\n this.applyHairStateToObject(name, payload);\n }\n }\n\n clearRegisteredHairObjects(): void {\n this.registeredHairObjects.clear();\n this.cachedHairMeshNames = null;\n this.appearanceSampled = false;\n this.stopIdleClip();\n this.stopGravityClip();\n this.stopImpulseClips();\n this.clearImpulseTimers();\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnedMissingMorphTargets.clear();\n }\n\n registerHairObjects(objects: Object3D[]): Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> {\n this.clearRegisteredHairObjects();\n\n const result: Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> = [];\n\n for (const obj of objects) {\n if (obj instanceof Mesh) {\n const mesh = obj;\n this.registeredHairObjects.set(mesh.name, mesh);\n\n const meshInfo = CC4_MESHES[mesh.name];\n const isEyebrow = meshInfo?.category === 'eyebrow';\n\n result.push({\n name: mesh.name,\n isMesh: true,\n isEyebrow,\n });\n }\n }\n\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n\n return result;\n }\n\n autoRegisterHairMesh(mesh: Mesh, category: 'hair' | 'eyebrow'): void {\n this.registeredHairObjects.set(mesh.name, mesh);\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n mesh.renderOrder = category === 'eyebrow' ? 5 : 10;\n }\n\n getRegisteredHairObjects(): Mesh[] {\n return Array.from(this.registeredHairObjects.values());\n }\n\n setHairPhysicsEnabled(enabled: boolean): void {\n this.hairPhysicsEnabled = enabled;\n if (!enabled) {\n this.stopIdleClip();\n this.stopGravityClip();\n this.stopImpulseClips();\n this.clearImpulseTimers();\n this.hasHeadState = false;\n return;\n }\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n\n isHairPhysicsEnabled(): boolean {\n return this.hairPhysicsEnabled;\n }\n\n setHairPhysicsProfileConfig(hairConfig?: HairPhysicsProfileConfig): void {\n if (!hairConfig) return;\n\n const runtimeConfig: HairPhysicsConfigUpdate = {};\n const numericKeys: Array<keyof HairPhysicsProfileConfig> = [\n 'stiffness',\n 'damping',\n 'inertia',\n 'gravity',\n 'responseScale',\n 'idleSwayAmount',\n 'idleSwaySpeed',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n 'idleClipDuration',\n 'impulseClipDuration',\n ];\n\n for (const key of numericKeys) {\n const value = hairConfig[key];\n if (value !== undefined) {\n (runtimeConfig as Record<string, unknown>)[key] = value;\n }\n }\n\n if (hairConfig.direction) {\n runtimeConfig.direction = { ...hairConfig.direction } as HairPhysicsDirectionConfig;\n }\n\n if (hairConfig.morphTargets) {\n const morphTargets: Partial<HairMorphTargets> = {};\n if (hairConfig.morphTargets.swayLeft) morphTargets.swayLeft = hairConfig.morphTargets.swayLeft.key;\n if (hairConfig.morphTargets.swayRight) morphTargets.swayRight = hairConfig.morphTargets.swayRight.key;\n if (hairConfig.morphTargets.swayFront) morphTargets.swayFront = hairConfig.morphTargets.swayFront.key;\n if (hairConfig.morphTargets.fluffRight) morphTargets.fluffRight = hairConfig.morphTargets.fluffRight.key;\n if (hairConfig.morphTargets.fluffBottom) morphTargets.fluffBottom = hairConfig.morphTargets.fluffBottom.key;\n\n if (hairConfig.morphTargets.headUp) {\n const headUp: Record<string, number> = {};\n for (const [key, value] of Object.entries(hairConfig.morphTargets.headUp)) {\n if (value && typeof value.value === 'number') {\n headUp[key] = value.value;\n }\n }\n if (Object.keys(headUp).length > 0) morphTargets.headUp = headUp;\n }\n\n if (hairConfig.morphTargets.headDown) {\n const headDown: Record<string, number> = {};\n for (const [key, value] of Object.entries(hairConfig.morphTargets.headDown)) {\n if (value && typeof value.value === 'number') {\n headDown[key] = value.value;\n }\n }\n if (Object.keys(headDown).length > 0) morphTargets.headDown = headDown;\n }\n\n if (Object.keys(morphTargets).length > 0) {\n runtimeConfig.morphTargets = morphTargets as HairMorphTargets;\n }\n }\n\n this.setHairPhysicsConfig(runtimeConfig);\n if (hairConfig.enabled !== undefined) {\n this.setHairPhysicsEnabled(Boolean(hairConfig.enabled));\n }\n }\n\n setHairPhysicsConfig(config: HairPhysicsConfigUpdate): void {\n const direction = config.direction\n ? { ...this.hairPhysicsConfig.direction, ...config.direction }\n : this.hairPhysicsConfig.direction;\n\n const morphTargets = config.morphTargets\n ? {\n ...this.hairPhysicsConfig.morphTargets,\n ...config.morphTargets,\n headUp: {\n ...this.hairPhysicsConfig.morphTargets.headUp,\n ...(config.morphTargets.headUp ?? {}),\n },\n headDown: {\n ...this.hairPhysicsConfig.morphTargets.headDown,\n ...(config.morphTargets.headDown ?? {}),\n },\n }\n : this.hairPhysicsConfig.morphTargets;\n\n this.hairPhysicsConfig = { ...this.hairPhysicsConfig, ...config, direction, morphTargets };\n\n const idleKeys: Array<keyof HairPhysicsConfigUpdate> = [\n 'idleSwayAmount',\n 'idleSwaySpeed',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n 'idleClipDuration',\n ];\n const idleChanged = idleKeys.some((key) => config[key] !== undefined);\n const morphTargetsChanged = config.morphTargets !== undefined;\n const directionChanged = config.direction !== undefined;\n\n const impulseKeys: Array<keyof HairPhysicsConfigUpdate> = [\n 'stiffness',\n 'damping',\n 'impulseClipDuration',\n ];\n const impulseChanged = impulseKeys.some((key) => config[key] !== undefined);\n const gravityChanged = morphTargetsChanged;\n\n if (idleChanged || morphTargetsChanged) {\n this.idleClipDirty = true;\n }\n if (impulseChanged || morphTargetsChanged) {\n this.impulseClipDirty = true;\n }\n if (gravityChanged) {\n this.gravityClipDirty = true;\n }\n if (directionChanged) {\n this.hasHeadState = false;\n this.lastHeadHorizontal = 0;\n this.lastHeadVertical = 0;\n }\n\n if (this.hairPhysicsEnabled) {\n if (idleChanged || morphTargetsChanged) this.startIdleClip();\n if (impulseChanged || morphTargetsChanged) this.buildImpulseClips();\n if (gravityChanged) this.startGravityClip();\n }\n if (morphTargetsChanged) {\n this.warnMissingHairMorphTargets();\n }\n }\n\n getHairPhysicsConfig(): HairPhysicsConfig {\n return {\n ...this.hairPhysicsConfig,\n direction: { ...this.hairPhysicsConfig.direction },\n morphTargets: {\n ...this.hairPhysicsConfig.morphTargets,\n headUp: { ...this.hairPhysicsConfig.morphTargets.headUp },\n headDown: { ...this.hairPhysicsConfig.morphTargets.headDown },\n },\n };\n }\n\n validateHairMorphTargets(): string[] {\n const configuredKeys = this.collectConfiguredMorphKeys();\n if (configuredKeys.length === 0) return [];\n\n const availableKeys = this.collectAvailableHairMorphKeys();\n if (availableKeys.size === 0) return [];\n\n return configuredKeys.filter((key) => !availableKeys.has(key));\n }\n\n update(dtSeconds: number): void {\n if (!this.hairPhysicsEnabled) return;\n if (!this.supportsMixerClips()) return;\n }\n\n onHeadRotationChanged(yaw: number, pitch: number): void {\n if (!this.hairPhysicsEnabled) return;\n if (!this.supportsMixerClips()) return;\n this.updateGravityFromHeadPitch(pitch);\n this.triggerHeadImpulse(yaw, pitch);\n }\n\n getHairMorphTargets(meshName?: string): string[] {\n let targetMesh: Mesh | undefined;\n\n if (meshName) {\n targetMesh = this.registeredHairObjects.get(meshName);\n } else {\n const hairMeshNames = this.getHairMeshNames();\n for (const name of hairMeshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n if (mesh) {\n targetMesh = mesh;\n break;\n }\n }\n }\n\n if (!targetMesh) return [];\n\n const dict = targetMesh.morphTargetDictionary;\n if (!dict) return [];\n\n return Object.keys(dict);\n }\n\n private collectConfiguredMorphKeys(): string[] {\n const { morphTargets } = this.hairPhysicsConfig;\n const keys = new Set<string>();\n const addKey = (key?: string) => {\n if (typeof key === 'string' && key.length > 0) keys.add(key);\n };\n\n addKey(morphTargets.swayLeft);\n addKey(morphTargets.swayRight);\n addKey(morphTargets.swayFront);\n addKey(morphTargets.fluffRight);\n addKey(morphTargets.fluffBottom);\n\n if (morphTargets.headUp) {\n Object.keys(morphTargets.headUp).forEach((key) => addKey(key));\n }\n if (morphTargets.headDown) {\n Object.keys(morphTargets.headDown).forEach((key) => addKey(key));\n }\n\n return Array.from(keys);\n }\n\n private collectAvailableHairMorphKeys(): Set<string> {\n const available = new Set<string>();\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) return available;\n\n for (const name of hairMeshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n const dict = mesh?.morphTargetDictionary;\n if (!dict) continue;\n for (const key of Object.keys(dict)) {\n available.add(key);\n }\n }\n\n return available;\n }\n\n private warnMissingHairMorphTargets(): void {\n const missing = this.validateHairMorphTargets();\n if (missing.length === 0) return;\n\n for (const key of missing) {\n if (this.warnedMissingMorphTargets.has(key)) continue;\n this.warnedMissingMorphTargets.add(key);\n console.warn(`[Embody] Hair physics morph \"${key}\" not found on registered hair meshes.`);\n }\n }\n\n setMorphOnMeshes(meshNames: string[], morphKey: string, value: number): void {\n const val = clamp01(value);\n for (const name of meshNames) {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n if (!mesh) continue;\n\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n\n const idx = dict[morphKey];\n if (idx !== undefined) {\n infl[idx] = val;\n }\n }\n }\n\n applyHairStateToObject(objectName: string, state: {\n color?: { baseColor: string; emissive: string; emissiveIntensity: number };\n outline?: { show: boolean; color: string; opacity: number };\n visible?: boolean;\n scale?: { x: number; y: number; z: number };\n position?: { x: number; y: number; z: number };\n isEyebrow?: boolean;\n }): void {\n const mesh = this.registeredHairObjects.get(objectName);\n if (!mesh) return;\n\n const obj = mesh;\n\n if (state.visible !== undefined) {\n obj.visible = state.visible;\n }\n\n if (state.scale) {\n obj.scale.set(state.scale.x, state.scale.y, state.scale.z);\n }\n\n if (state.position) {\n obj.position.set(state.position.x, state.position.y, state.position.z);\n }\n\n if (state.color && obj.material && !Array.isArray(obj.material)) {\n const mat = obj.material as typeof obj.material & {\n color?: { set(value: string): void };\n emissive?: { set(value: string): void };\n emissiveIntensity?: number;\n };\n if (mat.color) {\n mat.color.set(state.color.baseColor);\n }\n if (mat.emissive !== undefined) {\n mat.emissive.set(state.color.emissive);\n mat.emissiveIntensity = state.color.emissiveIntensity;\n }\n mat.needsUpdate = true;\n }\n }\n\n private getHairMeshNames(): string[] {\n if (this.cachedHairMeshNames) return this.cachedHairMeshNames;\n\n if (typeof this.host.getSelectedHairMeshNames === 'function') {\n const selectedHairMeshNames = this.host.getSelectedHairMeshNames() || [];\n const resolved = selectedHairMeshNames.filter((name) => {\n const mesh = this.registeredHairObjects.get(name) || this.host.getMeshByName(name);\n return !!mesh;\n });\n this.cachedHairMeshNames = Array.from(new Set(resolved));\n return this.cachedHairMeshNames;\n }\n\n const names: string[] = [];\n this.registeredHairObjects.forEach((mesh, name) => {\n const info = CC4_MESHES[name];\n if (info?.category === 'hair') {\n names.push(name);\n } else if (info?.category !== 'eyebrow') {\n const dict = mesh.morphTargetDictionary;\n if (dict && ('L_Hair_Left' in dict || 'L_Hair_Right' in dict || 'L_Hair_Front' in dict)) {\n names.push(name);\n }\n }\n });\n this.cachedHairMeshNames = names;\n return names;\n }\n\n refreshMeshSelection(): void {\n this.cachedHairMeshNames = null;\n this.idleClipDirty = true;\n this.gravityClipDirty = true;\n this.impulseClipDirty = true;\n this.warnMissingHairMorphTargets();\n if (this.hairPhysicsEnabled) {\n this.startIdleClip();\n this.startGravityClip();\n this.buildImpulseClips();\n }\n }\n\n private supportsMixerClips(): boolean {\n return typeof this.host.buildClip === 'function';\n }\n\n private startIdleClip(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const cfg = this.hairPhysicsConfig;\n const hasWind = cfg.windStrength > 0;\n const hasIdle = cfg.idleSwayAmount > 0;\n if (!hasWind && !hasIdle) {\n this.stopIdleClip();\n this.idleClipDirty = false;\n return;\n }\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopIdleClip();\n this.idleClipDirty = false;\n return;\n }\n\n if (!this.idleClipDirty && this.idleClipHandle) return;\n\n this.stopIdleClip();\n\n const duration = Math.max(0.5, cfg.idleClipDuration);\n const curves = this.buildIdleWindCurves(duration);\n const handle = this.host.buildClip?.(this.idleClipName, curves, {\n loop: true,\n loopMode: 'repeat',\n meshNames: hairMeshNames,\n });\n\n if (!handle) return;\n\n handle.setWeight?.(1);\n this.idleClipHandle = handle;\n this.idleClipDirty = false;\n }\n\n private startGravityClip(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopGravityClip();\n this.gravityClipDirty = false;\n return;\n }\n\n if (!this.gravityClipDirty && this.gravityClipHandle) return;\n\n this.stopGravityClip();\n\n const curves = this.buildGravityCurves();\n if (Object.keys(curves).length === 0) return;\n\n const handle = this.host.buildClip?.(this.gravityClipName, curves, {\n loop: false,\n loopMode: 'once',\n meshNames: hairMeshNames,\n });\n\n if (!handle) return;\n\n handle.setWeight?.(1);\n handle.pause();\n handle.setTime?.(0.5);\n this.gravityClipHandle = handle;\n this.gravityClipDirty = false;\n }\n\n private stopIdleClip(): void {\n if (this.idleClipHandle) {\n const clipName = this.idleClipHandle.clipName;\n this.idleClipHandle.stop();\n this.host.cleanupSnippet?.(clipName);\n this.idleClipHandle = null;\n } else {\n this.host.cleanupSnippet?.(this.idleClipName);\n }\n }\n\n private stopGravityClip(): void {\n if (this.gravityClipHandle) {\n const clipName = this.gravityClipHandle.clipName;\n this.gravityClipHandle.stop();\n this.host.cleanupSnippet?.(clipName);\n this.gravityClipHandle = null;\n } else {\n this.host.cleanupSnippet?.(this.gravityClipName);\n }\n }\n\n private buildImpulseClips(): void {\n if (!this.hairPhysicsEnabled || !this.supportsMixerClips()) return;\n\n const hairMeshNames = this.getHairMeshNames();\n if (hairMeshNames.length === 0) {\n this.stopImpulseClips();\n this.impulseClipDirty = false;\n return;\n }\n\n if (!this.impulseClipDirty && this.impulseClips.left && this.impulseClips.right && this.impulseClips.front) {\n return;\n }\n\n this.stopImpulseClips();\n\n const duration = Math.max(0.25, this.hairPhysicsConfig.impulseClipDuration);\n const options: ClipOptions = {\n loop: false,\n loopMode: 'once',\n meshNames: hairMeshNames,\n };\n\n const leftHandle = this.host.buildClip?.(\n this.impulseClipNames.left,\n this.buildImpulseCurves(duration, 1, 0),\n options\n );\n const rightHandle = this.host.buildClip?.(\n this.impulseClipNames.right,\n this.buildImpulseCurves(duration, -1, 0),\n options\n );\n const frontHandle = this.host.buildClip?.(\n this.impulseClipNames.front,\n this.buildImpulseCurves(duration, 0, 1),\n options\n );\n\n const primeHandle = (handle: ClipHandle | null | undefined) => {\n if (!handle) return;\n handle.setWeight?.(0);\n handle.pause();\n handle.setTime?.(0);\n };\n\n primeHandle(leftHandle);\n primeHandle(rightHandle);\n primeHandle(frontHandle);\n\n this.impulseClips = {\n left: leftHandle ?? undefined,\n right: rightHandle ?? undefined,\n front: frontHandle ?? undefined,\n };\n this.impulseClipDirty = false;\n }\n\n private stopImpulseClips(): void {\n this.clearImpulseTimers();\n const handles = Object.values(this.impulseClips);\n for (const handle of handles) {\n if (!handle) continue;\n const clipName = handle.clipName;\n handle.stop();\n this.host.cleanupSnippet?.(clipName);\n }\n this.impulseClips = {};\n }\n\n private clearImpulseTimers(slot?: 'left' | 'right' | 'front'): void {\n const slots: Array<'left' | 'right' | 'front'> = slot ? [slot] : ['left', 'right', 'front'];\n for (const key of slots) {\n const endTimer = this.impulseEndTimers[key];\n if (endTimer) {\n clearTimeout(endTimer);\n delete this.impulseEndTimers[key];\n }\n const steps = this.impulseFadeSteps[key];\n if (steps && steps.length > 0) {\n steps.forEach((t) => clearTimeout(t));\n delete this.impulseFadeSteps[key];\n }\n }\n }\n\n private triggerHeadImpulse(headYaw: number, headPitch: number): void {\n const cfg = this.hairPhysicsConfig;\n const signedYaw = headYaw * cfg.direction.yawSign;\n const signedPitch = headPitch * cfg.direction.pitchSign;\n const horizontal = signedYaw * cfg.inertia * cfg.responseScale;\n const vertical = signedPitch * cfg.gravity * 0.25 * cfg.responseScale;\n\n if (!this.hasHeadState) {\n this.hasHeadState = true;\n this.lastHeadHorizontal = horizontal;\n this.lastHeadVertical = vertical;\n return;\n }\n\n const deltaHorizontal = horizontal - this.lastHeadHorizontal;\n const deltaVertical = vertical - this.lastHeadVertical;\n this.lastHeadHorizontal = horizontal;\n this.lastHeadVertical = vertical;\n\n const leftWeight = clamp01(deltaHorizontal > 0 ? deltaHorizontal : 0);\n const rightWeight = clamp01(deltaHorizontal < 0 ? -deltaHorizontal : 0);\n const frontWeight = clamp01(deltaVertical > 0 ? deltaVertical : 0);\n const minTrigger = 0.01;\n\n if (leftWeight <= minTrigger && rightWeight <= minTrigger && frontWeight <= minTrigger) return;\n\n if (this.impulseClipDirty) {\n this.buildImpulseClips();\n }\n\n if (leftWeight > minTrigger) this.playImpulseClip('left', leftWeight);\n if (rightWeight > minTrigger) this.playImpulseClip('right', rightWeight);\n if (frontWeight > minTrigger) this.playImpulseClip('front', frontWeight);\n }\n\n private updateGravityFromHeadPitch(headPitch: number): void {\n if (!this.gravityClipHandle || this.gravityClipDirty) {\n this.startGravityClip();\n }\n if (!this.gravityClipHandle) return;\n\n const signedPitch = headPitch * this.hairPhysicsConfig.direction.pitchSign;\n const clampedPitch = Math.max(-1, Math.min(1, signedPitch));\n const normalized = (clampedPitch + 1) / 2;\n const duration = this.gravityClipHandle.getDuration?.() ?? 1;\n this.gravityClipHandle.setTime?.(normalized * duration);\n }\n\n private playImpulseClip(slot: 'left' | 'right' | 'front', weight: number): void {\n const handle = this.impulseClips[slot];\n if (!handle) return;\n this.clearImpulseTimers(slot);\n handle.setWeight?.(weight);\n handle.play();\n const durationSec = handle.getDuration?.() ?? this.hairPhysicsConfig.impulseClipDuration;\n const durationMs = Math.max(0, durationSec) * 1000;\n const fadeMs = Math.max(80, Math.min(350, durationMs * 0.2));\n this.impulseEndTimers[slot] = setTimeout(() => {\n this.fadeImpulseClip(slot, weight, fadeMs);\n }, durationMs);\n }\n\n private fadeImpulseClip(slot: 'left' | 'right' | 'front', startWeight: number, fadeMs: number): void {\n const handle = this.impulseClips[slot];\n if (!handle) return;\n if (fadeMs <= 0) {\n handle.setWeight?.(0);\n handle.pause();\n handle.setTime?.(0);\n return;\n }\n\n const steps = 6;\n const stepMs = fadeMs / steps;\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n for (let i = 1; i <= steps; i += 1) {\n const timer = setTimeout(() => {\n const nextWeight = startWeight * (1 - i / steps);\n handle.setWeight?.(nextWeight);\n if (i === steps) {\n handle.pause();\n handle.setTime?.(0);\n }\n }, stepMs * i);\n timers.push(timer);\n }\n\n this.impulseFadeSteps[slot] = timers;\n }\n\n private buildIdleWindCurves(durationSec: number): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_idle_curves(JSON.stringify(this.hairCurveConfigJson()), durationSec)\n ) as CurvesMap;\n }\n\n private buildImpulseCurves(durationSec: number, horizontal: number, vertical: number): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_impulse_curves(\n JSON.stringify(this.hairCurveConfigJson()),\n durationSec,\n horizontal,\n vertical\n )\n ) as CurvesMap;\n }\n\n private buildGravityCurves(): CurvesMap {\n const wasm = this.requireCore();\n return JSON.parse(\n wasm.build_hair_gravity_curves(JSON.stringify(this.hairCurveConfigJson()))\n ) as CurvesMap;\n }\n\n private hairCurveConfigJson() {\n const cfg = this.hairPhysicsConfig;\n return {\n idleSwayAmount: cfg.idleSwayAmount,\n idleSwaySpeed: cfg.idleSwaySpeed,\n windStrength: cfg.windStrength,\n windDirectionX: cfg.windDirectionX,\n windDirectionZ: cfg.windDirectionZ,\n windTurbulence: cfg.windTurbulence,\n windFrequency: cfg.windFrequency,\n stiffness: cfg.stiffness,\n damping: cfg.damping,\n morphTargets: cfg.morphTargets,\n };\n }\n\n}\n","import type { Profile } from './types';\nimport { initEmbodyCore } from '../wasm';\nimport type { EmbodyCoreWasmModule } from '../wasmTypes';\n\n/**\n * Extend a base preset with a profile extension.\n *\n * Implemented by the Rust Wasm core.\n *\n * Rules:\n * - Scalars: extension wins when provided.\n * - Maps: shallow-merged by key, values cloned.\n * - Mesh entries: merged by mesh name, including nested material settings.\n * - Arrays: replaced when the extension provides them (except annotationRegions).\n * - annotationRegions: merged by region name, with nested camera/style fields preserved.\n */\nexport function mergePresetWithProfile(\n core: EmbodyCoreWasmModule,\n base: Profile,\n extension?: Partial<Profile>\n): Profile {\n if (!extension) {\n return base;\n }\n\n return JSON.parse(\n core.merge_preset_profile(JSON.stringify(base), JSON.stringify(extension))\n ) as Profile;\n}\n\n/** Resolve a preset/profile pair through this package entry's Wasm loader. */\nexport async function extendPresetWithProfile(\n base: Profile,\n extension?: Partial<Profile>\n): Promise<Profile> {\n return mergePresetWithProfile(await initEmbodyCore(), base, extension);\n}\n","/**\n * Betta Fish Preset - Skeletal Animation Mappings\n *\n * Bone mappings for the betta fish model from Sketchfab.\n * This fish has 53 bones and 1 embedded animation (\"Take 01\" swimming).\n * No morph targets/blend shapes - all animation is skeletal.\n *\n * Bone structure (inferred from hierarchy):\n * - Armature_rootJoint: Root\n * - Bone_Armature: Main body root\n * - Bone.001_Armature: Head/Front body\n * - Bone.009-017: Likely eyes/gills area (left/right symmetry)\n * - Bone.002_Armature: Body spine chain\n * - Bone.003 → 004 → 005: Body to tail\n * - Bone.018-045: Tail fins (multiple branching chains)\n * - Bone.046/047: Pectoral fins (left/right)\n * - Bone.006_Armature: Dorsal fin area\n * - Bone.007/008: Dorsal fin bones\n */\n\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\nimport type { AnnotationRegion, MeshInfo, MeshCategory, Profile } from '../mappings/types';\nimport { checkBindingsForLeftRight } from './cc4';\n\n// ============================================================================\n// BONE NAMES - All 53 bones in the fish skeleton\n// Note: Bone names in the GLTF use dots (e.g., \"Bone.001_Armature\")\n// ============================================================================\n\nexport const BONES = [\n \"Armature_rootJoint\",\n \"Bone_Armature\",\n \"Bone.001_Armature\",\n \"Bone.009_Armature\",\n \"Bone.027_Armature\",\n \"Bone.029_Armature\",\n \"Bone.031_Armature\",\n \"Bone.028_Armature\",\n \"Bone.030_Armature\",\n \"Bone.032_Armature\",\n \"Bone.010_Armature\",\n \"Bone.012_Armature\",\n \"Bone.014_Armature\",\n \"Bone.016_Armature\",\n \"Bone.011_Armature\",\n \"Bone.013_Armature\",\n \"Bone.015_Armature\",\n \"Bone.017_Armature\",\n \"Bone.002_Armature\",\n \"Bone.003_Armature\",\n \"Bone.004_Armature\",\n \"Bone.005_Armature\",\n \"Bone.020_Armature\",\n \"Bone.025_Armature\",\n \"Bone.026_Armature\",\n \"Bone.039_Armature\",\n \"Bone.040_Armature\",\n \"Bone.041_Armature\",\n \"Bone.042_Armature\",\n \"Bone.043_Armature\",\n \"Bone.044_Armature\",\n \"Bone.045_Armature\",\n \"Bone.019_Armature\",\n \"Bone.023_Armature\",\n \"Bone.024_Armature\",\n \"Bone.034_Armature\",\n \"Bone.036_Armature\",\n \"Bone.038_Armature\",\n \"Bone.018_Armature\",\n \"Bone.021_Armature\",\n \"Bone.022_Armature\",\n \"Bone.033_Armature\",\n \"Bone.035_Armature\",\n \"Bone.037_Armature\",\n \"Bone.046_Armature\",\n \"Bone.048_Armature\",\n \"Bone.050_Armature\",\n \"Bone.047_Armature\",\n \"Bone.049_Armature\",\n \"Bone.051_Armature\",\n \"Bone.006_Armature\",\n \"Bone.007_Armature\",\n \"Bone.008_Armature\"\n] as const;\n\n// ============================================================================\n// BONE NAME CONFIGURATION\n// Uses prefix/suffix system: 'Bone.' + baseNumber + '_Armature' = 'Bone.001_Armature'\n// ============================================================================\n\nexport const BONE_PREFIX = 'Bone.';\nexport const BONE_SUFFIX = '_Armature';\n\n// ============================================================================\n// SEMANTIC BONE MAPPINGS - Human-readable names for key bones\n// Uses base names that get combined with prefix/suffix\n// Exception: ROOT, BODY_ROOT, and EYE nodes use full names (don't follow pattern)\n// ============================================================================\n\nexport const BONE_NODES = {\n // Root bones (special - don't use prefix/suffix)\n ROOT: 'Armature_rootJoint',\n BODY_ROOT: 'Bone_Armature',\n\n // Head and body (use base names)\n HEAD: '001',\n BODY_FRONT: '002',\n BODY_MID: '003',\n BODY_BACK: '004',\n TAIL_BASE: '005',\n\n // Gills - bilateral (even = left, odd = right)\n GILL_L: '046',\n GILL_L_MID: '048',\n GILL_L_TIP: '050',\n GILL_R: '047',\n GILL_R_MID: '049',\n GILL_R_TIP: '051',\n\n // Dorsal fin (top fin)\n DORSAL_ROOT: '006',\n DORSAL_L: '007',\n DORSAL_R: '008',\n\n // Ventral fins (belly fins)\n VENTRAL_L: '018',\n VENTRAL_L_MID: '021',\n VENTRAL_L_TIP: '022',\n VENTRAL_R: '033',\n VENTRAL_R_MID: '035',\n VENTRAL_R_TIP: '037',\n\n // Pectoral fins - left side chain\n PECTORAL_L_ROOT: '009',\n PECTORAL_L_CHAIN1: '027',\n PECTORAL_L_CHAIN1_MID: '029',\n PECTORAL_L_CHAIN1_TIP: '031',\n PECTORAL_L_CHAIN2: '028',\n PECTORAL_L_CHAIN2_MID: '030',\n PECTORAL_L_CHAIN2_TIP: '032',\n\n // Pectoral fins - right side chain\n PECTORAL_R_ROOT: '010',\n PECTORAL_R_CHAIN1: '012',\n PECTORAL_R_CHAIN1_A: '014',\n PECTORAL_R_CHAIN1_B: '016',\n PECTORAL_R_ROOT2: '011',\n PECTORAL_R_CHAIN2: '013',\n PECTORAL_R_CHAIN2_A: '015',\n PECTORAL_R_CHAIN2_B: '017',\n\n // Eyes (special - mesh name, not bone)\n EYE_L: 'EYES_0',\n EYE_R: 'EYES_0',\n\n // Main tail fins\n TAIL_TOP: '020',\n TAIL_TOP_MID: '025',\n TAIL_TOP_TIP: '026',\n TAIL_MID: '039',\n TAIL_MID_A: '040',\n TAIL_MID_A_TIP: '041',\n TAIL_MID_B: '042',\n TAIL_MID_B_TIP: '043',\n TAIL_MID_C: '044',\n TAIL_MID_C_TIP: '045',\n\n // Side tail chains\n TAIL_SIDE_L: '019',\n TAIL_SIDE_L_MID: '023',\n TAIL_SIDE_L_TIP: '024',\n TAIL_SIDE_R: '034',\n TAIL_SIDE_R_MID: '036',\n TAIL_SIDE_R_TIP: '038',\n} as const;\n\n// ============================================================================\n// AU ID CONSTANTS - Fish \"Action Units\" (analogous to FACS AUs for humans)\n// These use plain numbers like CC4 preset - no special fish-specific types\n// ============================================================================\n\n// Body orientation (AU 2-7)\n// 2 = Turn Left, 3 = Turn Right\n// 4 = Pitch Up, 5 = Pitch Down\n// 6 = Roll Left, 7 = Roll Right\n\n// Tail movements (AU 12-15)\n// 12 = Tail Sweep Left, 13 = Tail Sweep Right\n// 14 = Tail Fin Spread, 15 = Tail Fin Close\n\n// Pectoral fins (AU 20-27)\n// 20 = Pectoral L Up, 21 = Pectoral L Down\n// 22 = Pectoral R Up, 23 = Pectoral R Down\n// 24 = Pectoral L Forward, 25 = Pectoral L Back\n// 26 = Pectoral R Forward, 27 = Pectoral R Back\n\n// Ventral fins (AU 30-33)\n// 30 = Ventral L Up, 31 = Ventral L Down\n// 32 = Ventral R Up, 33 = Ventral R Down\n\n// Head (AU 51-54, matching FACS standard)\n// 51 = Head Turn Left, 52 = Head Turn Right\n// 53 = Head Up, 54 = Head Down\n// (AU 55/56 Head Tilt removed - fish don't have this motion)\n\n// Gills (AU 45-46) - separate L/R, single AU per side (0=closed, 1=flared)\n// 45 = Gill L, 46 = Gill R\n\n// Eye rotation (AU 61-64, like human FACS)\n// 61 = Eyes Left, 62 = Eyes Right\n// 63 = Eyes Up, 64 = Eyes Down\n\n// ============================================================================\n// BONE BINDINGS - Map AU IDs to bone rotations\n// ============================================================================\n\nexport const BONE_BINDINGS: Record<number, BoneBinding[]> = {\n // ========== BODY ORIENTATION (AU 2-7) ==========\n // AU 2: Turn Left\n 2: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: 1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n // AU 3: Turn Right\n 3: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: -1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n // AU 4: Pitch Up\n 4: [\n { node: 'HEAD', channel: 'rx', scale: -1, maxDegrees: 20 },\n { node: 'BODY_FRONT', channel: 'rx', scale: -1, maxDegrees: 5 },\n ],\n // AU 5: Pitch Down\n 5: [\n { node: 'HEAD', channel: 'rx', scale: 1, maxDegrees: 20 },\n { node: 'BODY_FRONT', channel: 'rx', scale: 1, maxDegrees: 5 },\n ],\n // AU 6: Roll Left\n 6: [\n { node: 'BODY_ROOT', channel: 'rz', scale: -1, maxDegrees: 25 },\n ],\n // AU 7: Roll Right\n 7: [\n { node: 'BODY_ROOT', channel: 'rz', scale: 1, maxDegrees: 25 },\n ],\n\n // ========== TAIL (AU 12-15) ==========\n // Tail sweep uses rz (roll axis) to sweep left/right in fish's local space\n // AU 12: Tail Sweep Left\n 12: [\n { node: 'BODY_BACK', channel: 'rz', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_BASE', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'TAIL_TOP', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'TAIL_MID', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 13: Tail Sweep Right\n 13: [\n { node: 'BODY_BACK', channel: 'rz', scale: -1, maxDegrees: 15 },\n { node: 'TAIL_BASE', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'TAIL_TOP', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'TAIL_MID', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n // Tail fin spread/close (fan motion)\n // AU 14: Tail Fin Spread\n 14: [\n { node: 'TAIL_TOP', channel: 'rx', scale: -1, maxDegrees: 20 },\n { node: 'TAIL_SIDE_L', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_SIDE_R', channel: 'rx', scale: -1, maxDegrees: 15 },\n ],\n // AU 15: Tail Fin Close\n 15: [\n { node: 'TAIL_TOP', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'TAIL_SIDE_L', channel: 'rx', scale: -1, maxDegrees: 12 },\n { node: 'TAIL_SIDE_R', channel: 'rx', scale: 1, maxDegrees: 12 },\n ],\n\n // ========== PECTORAL FINS (AU 20-27, front/head fins) ==========\n // These are the decorative fins attached to the head (bones 009-017)\n // AU 20: Pectoral L Up\n 20: [\n { node: 'PECTORAL_L_ROOT', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'PECTORAL_L_CHAIN1', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'PECTORAL_L_CHAIN2', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 21: Pectoral L Down\n 21: [\n { node: 'PECTORAL_L_ROOT', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'PECTORAL_L_CHAIN1', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'PECTORAL_L_CHAIN2', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n // AU 22: Pectoral R Up\n 22: [\n { node: 'PECTORAL_R_ROOT', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'PECTORAL_R_CHAIN1', channel: 'rz', scale: -1, maxDegrees: 20 },\n { node: 'PECTORAL_R_ROOT2', channel: 'rz', scale: -1, maxDegrees: 40 },\n ],\n // AU 23: Pectoral R Down\n 23: [\n { node: 'PECTORAL_R_ROOT', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'PECTORAL_R_CHAIN1', channel: 'rz', scale: 1, maxDegrees: 20 },\n { node: 'PECTORAL_R_ROOT2', channel: 'rz', scale: 1, maxDegrees: 40 },\n ],\n // AU 24: Pectoral L Forward\n 24: [\n { node: 'PECTORAL_L_ROOT', channel: 'ry', scale: 1, maxDegrees: 30 },\n ],\n // AU 25: Pectoral L Back\n 25: [\n { node: 'PECTORAL_L_ROOT', channel: 'ry', scale: -1, maxDegrees: 30 },\n ],\n // AU 26: Pectoral R Forward\n 26: [\n { node: 'PECTORAL_R_ROOT', channel: 'ry', scale: -1, maxDegrees: 30 },\n ],\n // AU 27: Pectoral R Back\n 27: [\n { node: 'PECTORAL_R_ROOT', channel: 'ry', scale: 1, maxDegrees: 30 },\n ],\n\n // ========== VENTRAL FINS (AU 30-33, belly fins) ==========\n // AU 30: Ventral L Up\n 30: [\n { node: 'VENTRAL_L', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'VENTRAL_L_MID', channel: 'rz', scale: 1, maxDegrees: 15 },\n ],\n // AU 31: Ventral L Down\n 31: [\n { node: 'VENTRAL_L', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'VENTRAL_L_MID', channel: 'rz', scale: -1, maxDegrees: 15 },\n ],\n // AU 32: Ventral R Up\n 32: [\n { node: 'VENTRAL_R', channel: 'rz', scale: -1, maxDegrees: 30 },\n { node: 'VENTRAL_R_MID', channel: 'rz', scale: -1, maxDegrees: 15 },\n ],\n // AU 33: Ventral R Down\n 33: [\n { node: 'VENTRAL_R', channel: 'rz', scale: 1, maxDegrees: 30 },\n { node: 'VENTRAL_R_MID', channel: 'rz', scale: 1, maxDegrees: 15 },\n ],\n\n // ========== GILLS (AU 45-46, separate L/R - 0=closed, 1=flared) ==========\n // AU 45: Gill L\n 45: [\n { node: 'GILL_L', channel: 'rz', scale: 1, maxDegrees: 40 },\n { node: 'GILL_L_MID', channel: 'rz', scale: 1, maxDegrees: 20 },\n ],\n // AU 46: Gill R\n 46: [\n { node: 'GILL_R', channel: 'rz', scale: -1, maxDegrees: 40 },\n { node: 'GILL_R_MID', channel: 'rz', scale: -1, maxDegrees: 20 },\n ],\n\n // ========== HEAD (AU 51-56, matching FACS standard) ==========\n // AU 51: Head Turn Left\n 51: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: 1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n // AU 52: Head Turn Right\n 52: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 },\n { node: 'BODY_FRONT', channel: 'ry', scale: -1, maxDegrees: 14 },\n { node: 'BODY_MID', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n // AU 53: Head Up\n 53: [\n { node: 'DORSAL_ROOT', channel: 'rx', scale: -1, maxDegrees: 25 },\n { node: 'DORSAL_L', channel: 'rx', scale: -1, maxDegrees: 15 },\n { node: 'DORSAL_R', channel: 'rx', scale: -1, maxDegrees: 15 },\n ],\n // AU 54: Head Down\n 54: [\n { node: 'DORSAL_ROOT', channel: 'rx', scale: 1, maxDegrees: 25 },\n { node: 'DORSAL_L', channel: 'rx', scale: 1, maxDegrees: 15 },\n { node: 'DORSAL_R', channel: 'rx', scale: 1, maxDegrees: 15 },\n ],\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // ========== EYES (AU 61-64, rotate the EYES_0 mesh) ==========\n // Fish has a single combined eyes mesh - both eyes rotate together\n // AU 61: Eyes Left\n 61: [\n { node: 'EYE_L', channel: 'ry', scale: 1, maxDegrees: 25 }, // Look left (yaw)\n ],\n // AU 62: Eyes Right\n 62: [\n { node: 'EYE_L', channel: 'ry', scale: -1, maxDegrees: 25 }, // Look right (yaw)\n ],\n // AU 63: Eyes Up\n 63: [\n { node: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 20 }, // Look up (pitch)\n ],\n // AU 64: Eyes Down\n 64: [\n { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 20 }, // Look down (pitch)\n ],\n};\n\n// ============================================================================\n// FISH AU INFO - Metadata for each action (compatible with loomlarge AUInfo)\n// facePart is used to group controls in the UI\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Body Orientation\n '2': { id: '2', name: 'Turn Left', facePart: 'Body Orientation', muscularBasis: 'Myomere muscles', links: ['https://en.wikipedia.org/wiki/Myomere'] },\n '3': { id: '3', name: 'Turn Right', facePart: 'Body Orientation', muscularBasis: 'Myomere muscles', links: ['https://en.wikipedia.org/wiki/Myomere'] },\n '4': { id: '4', name: 'Pitch Up', facePart: 'Body Orientation', muscularBasis: 'Epaxial muscles', links: ['https://en.wikipedia.org/wiki/Epaxial_muscles'] },\n '5': { id: '5', name: 'Pitch Down', facePart: 'Body Orientation', muscularBasis: 'Hypaxial muscles', links: ['https://en.wikipedia.org/wiki/Hypaxial_muscles'] },\n '6': { id: '6', name: 'Roll Left', facePart: 'Body Orientation', muscularBasis: 'Lateral body muscles', links: ['https://en.wikipedia.org/wiki/Fish_locomotion'] },\n '7': { id: '7', name: 'Roll Right', facePart: 'Body Orientation', muscularBasis: 'Lateral body muscles', links: ['https://en.wikipedia.org/wiki/Fish_locomotion'] },\n\n // Tail (Caudal fin)\n '12': { id: '12', name: 'Tail Sweep Left', facePart: 'Caudal Fin', muscularBasis: 'Caudal fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '13': { id: '13', name: 'Tail Sweep Right', facePart: 'Caudal Fin', muscularBasis: 'Caudal fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '14': { id: '14', name: 'Tail Fin Spread', facePart: 'Caudal Fin', muscularBasis: 'Fin ray muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n '15': { id: '15', name: 'Tail Fin Close', facePart: 'Caudal Fin', muscularBasis: 'Fin ray muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Caudal_fin'] },\n\n // Pectoral Fins (side fins for steering and braking)\n '20': { id: '20', name: 'Pectoral L Up', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '21': { id: '21', name: 'Pectoral L Down', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '22': { id: '22', name: 'Pectoral R Up', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '23': { id: '23', name: 'Pectoral R Down', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '24': { id: '24', name: 'Pectoral L Forward', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '25': { id: '25', name: 'Pectoral L Back', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '26': { id: '26', name: 'Pectoral R Forward', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n '27': { id: '27', name: 'Pectoral R Back', facePart: 'Pectoral Fins', muscularBasis: 'Pectoral fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pectoral_fins'] },\n\n // Ventral/Pelvic Fins (belly fins for stability)\n '30': { id: '30', name: 'Ventral L Up', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '31': { id: '31', name: 'Ventral L Down', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '32': { id: '32', name: 'Ventral R Up', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n '33': { id: '33', name: 'Ventral R Down', facePart: 'Pelvic Fins', muscularBasis: 'Pelvic fin muscles', links: ['https://en.wikipedia.org/wiki/Fish_fin#Pelvic_fins'] },\n\n // Gills (separate L/R - single AU per side, 0=closed, 1=flared)\n '45': { id: '45', name: 'Gill L', facePart: 'Gills', muscularBasis: 'Opercular muscles', links: ['https://en.wikipedia.org/wiki/Operculum_(fish)'] },\n '46': { id: '46', name: 'Gill R', facePart: 'Gills', muscularBasis: 'Opercular muscles', links: ['https://en.wikipedia.org/wiki/Operculum_(fish)'] },\n\n // Head (AU 51-56, matching FACS standard)\n '51': { id: '51', name: 'Head Turn Left', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '52': { id: '52', name: 'Head Turn Right', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '53': { id: '53', name: 'Head Up', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n '54': { id: '54', name: 'Head Down', facePart: 'Head', muscularBasis: 'Cranial muscles', links: ['https://en.wikipedia.org/wiki/Fish_anatomy#Head'] },\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // Eye movement (similar to human AU 61-64)\n '61': { id: '61', name: 'Eyes Left', facePart: 'Eyes', muscularBasis: 'Extraocular muscles', links: ['https://en.wikipedia.org/wiki/Extraocular_muscles'] },\n '62': { id: '62', name: 'Eyes Right', facePart: 'Eyes', muscularBasis: 'Extraocular muscles', links: ['https://en.wikipedia.org/wiki/Extraocular_muscles'] },\n '63': { id: '63', name: 'Eyes Up', facePart: 'Eyes', muscularBasis: 'Superior rectus', links: ['https://en.wikipedia.org/wiki/Superior_rectus_muscle'] },\n '64': { id: '64', name: 'Eyes Down', facePart: 'Eyes', muscularBasis: 'Inferior rectus', links: ['https://en.wikipedia.org/wiki/Inferior_rectus_muscle'] },\n};\n\n// ============================================================================\n// CONTINUUM PAIRS - Define which AUs form bidirectional pairs for sliders\n// ============================================================================\n\n/**\n * Continuum pairs - maps AU ID to its partner for bidirectional sliders\n * Format matches loomlarge's CONTINUUM_PAIRS_MAP (animal-agnostic)\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n}> = {\n // Body Orientation (AU 2-7)\n 2: { pairId: 3, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Turn Left ↔ Turn Right\n 3: { pairId: 2, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 5: { pairId: 4, isNegative: true, axis: 'pitch', node: 'HEAD' }, // Pitch Down ↔ Pitch Up\n 4: { pairId: 5, isNegative: false, axis: 'pitch', node: 'HEAD' },\n 6: { pairId: 7, isNegative: true, axis: 'roll', node: 'BODY_ROOT' }, // Roll Left ↔ Roll Right\n 7: { pairId: 6, isNegative: false, axis: 'roll', node: 'BODY_ROOT' },\n\n // Tail (AU 12-15)\n 12: { pairId: 13, isNegative: true, axis: 'roll', node: 'TAIL_BASE' }, // Tail Sweep Left ↔ Right\n 13: { pairId: 12, isNegative: false, axis: 'roll', node: 'TAIL_BASE' },\n 15: { pairId: 14, isNegative: true, axis: 'pitch', node: 'TAIL_TOP' }, // Tail Fin Close ↔ Spread\n 14: { pairId: 15, isNegative: false, axis: 'pitch', node: 'TAIL_TOP' },\n\n // Pectoral Fins (AU 20-27)\n 21: { pairId: 20, isNegative: true, axis: 'roll', node: 'PECTORAL_L_ROOT' }, // Pectoral L Down ↔ Up\n 20: { pairId: 21, isNegative: false, axis: 'roll', node: 'PECTORAL_L_ROOT' },\n 25: { pairId: 24, isNegative: true, axis: 'yaw', node: 'PECTORAL_L_ROOT' }, // Pectoral L Back ↔ Forward\n 24: { pairId: 25, isNegative: false, axis: 'yaw', node: 'PECTORAL_L_ROOT' },\n 23: { pairId: 22, isNegative: true, axis: 'roll', node: 'PECTORAL_R_ROOT' }, // Pectoral R Down ↔ Up\n 22: { pairId: 23, isNegative: false, axis: 'roll', node: 'PECTORAL_R_ROOT' },\n 27: { pairId: 26, isNegative: true, axis: 'yaw', node: 'PECTORAL_R_ROOT' }, // Pectoral R Back ↔ Forward\n 26: { pairId: 27, isNegative: false, axis: 'yaw', node: 'PECTORAL_R_ROOT' },\n\n // Ventral Fins (AU 30-33)\n 31: { pairId: 30, isNegative: true, axis: 'roll', node: 'VENTRAL_L' }, // Ventral L Down ↔ Up\n 30: { pairId: 31, isNegative: false, axis: 'roll', node: 'VENTRAL_L' },\n 33: { pairId: 32, isNegative: true, axis: 'roll', node: 'VENTRAL_R' }, // Ventral R Down ↔ Up\n 32: { pairId: 33, isNegative: false, axis: 'roll', node: 'VENTRAL_R' },\n\n // Head (AU 51-56, matching FACS standard)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Head Turn Left ↔ Right\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: 'DORSAL_ROOT' }, // Head Down ↔ Up\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: 'DORSAL_ROOT' },\n // Note: AU 55/56 (Head Tilt) removed - fish don't have this motion\n\n // Gills (AU 45-46) are NOT in continuum - they're single AUs (0=closed, 1=flared)\n // Each side is independent, not paired opposites\n\n // Eye movement (AU 61-64)\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: 'HEAD' }, // Eyes Left ↔ Right\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: 'HEAD' },\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: 'HEAD' }, // Eyes Down ↔ Up\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: 'HEAD' },\n};\n\n/**\n * Build continuum label from AU names.\n * Finds common prefix between AU names and extracts the differing part.\n * E.g. \"Head Turn Left\" + \"Head Turn Right\" → \"Head Turn — Left ↔ Right\"\n */\nfunction buildContinuumLabel(negativeAU: AUInfo, positiveAU: AUInfo): string {\n const negName = negativeAU.name;\n const posName = positiveAU.name;\n\n // Find common prefix (word-level)\n const negWords = negName.split(' ');\n const posWords = posName.split(' ');\n\n let commonPrefixWords: string[] = [];\n for (let i = 0; i < Math.min(negWords.length, posWords.length); i++) {\n if (negWords[i] === posWords[i]) {\n commonPrefixWords.push(negWords[i]);\n } else {\n break;\n }\n }\n\n const prefix = commonPrefixWords.join(' ');\n const negSuffix = negWords.slice(commonPrefixWords.length).join(' ');\n const posSuffix = posWords.slice(commonPrefixWords.length).join(' ');\n\n if (prefix && negSuffix && posSuffix) {\n return `${prefix} — ${negSuffix} ↔ ${posSuffix}`;\n }\n\n // Fallback: just combine the names\n return `${negName} ↔ ${posName}`;\n}\n\n/**\n * Get continuum label for a pair, derived from AU_INFO.\n * No need for a separate CONTINUUM_LABELS object.\n */\nexport function getContinuumLabelForPair(negativeId: number, positiveId: number): string {\n const negAU = AU_INFO[String(negativeId)];\n const posAU = AU_INFO[String(positiveId)];\n\n if (!negAU || !posAU) {\n return `AU ${negativeId} ↔ AU ${positiveId}`;\n }\n\n return buildContinuumLabel(negAU, posAU);\n}\n\n/**\n * Build all continuum labels from AU_INFO and CONTINUUM_PAIRS_MAP.\n * This replaces the need for a manually-maintained CONTINUUM_LABELS object.\n */\nexport function buildContinuumLabels(): Record<string, string> {\n const labels: Record<string, string> = {};\n const seen = new Set<string>();\n\n for (const [auIdStr, info] of Object.entries(CONTINUUM_PAIRS_MAP)) {\n if (info.isNegative) {\n const negId = Number(auIdStr);\n const posId = info.pairId;\n const key = `${negId}-${posId}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n labels[key] = getContinuumLabelForPair(negId, posId);\n }\n }\n }\n\n return labels;\n}\n\n// Build labels dynamically from AU_INFO (no separate CONTINUUM_LABELS needed)\nexport const CONTINUUM_LABELS = buildContinuumLabels();\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Defines how AUs map to bone rotation axes\n// This is required for the engine to properly apply bone rotations\n// Uses plain AU ID numbers (animal-agnostic, like CC4 preset)\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n // ========== HEAD & BODY - Combined entry per node (like CC4) ==========\n // AU 51/52 = Head Turn Left/Right (yaw)\n // AU 53/54 = Head Up/Down (pitch) - note: pitch on HEAD is from body AUs 4/5\n // No head tilt for fish - removed AU 55/56\n {\n node: 'HEAD',\n pitch: { aus: [4, 5], axis: 'rx', negative: 5, positive: 4 }, // Body Pitch Up/Down\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_FRONT',\n pitch: { aus: [4, 5], axis: 'rx', negative: 5, positive: 4 }, // Body Pitch Up/Down\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_MID',\n pitch: null,\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head Turn Left/Right\n roll: null,\n },\n {\n node: 'BODY_ROOT',\n pitch: null,\n yaw: null,\n roll: { aus: [6, 7], axis: 'rz', negative: 6, positive: 7 }, // Body Roll Left/Right\n },\n\n // ========== TAIL (AU 12-15) ==========\n // Tail sweep uses rz (roll axis) to sweep left/right in fish's local space\n {\n node: 'TAIL_BASE',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 }, // Tail Sweep Left/Right\n },\n {\n node: 'BODY_BACK',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n {\n node: 'TAIL_TOP',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 }, // Tail Fin Spread/Close\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n {\n node: 'TAIL_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [12, 13], axis: 'rz', negative: 13, positive: 12 },\n },\n // Side tail fins for spread/close\n {\n node: 'TAIL_SIDE_L',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 },\n yaw: null,\n roll: null,\n },\n {\n node: 'TAIL_SIDE_R',\n pitch: { aus: [14, 15], axis: 'rx', negative: 15, positive: 14 },\n yaw: null,\n roll: null,\n },\n\n // ========== PECTORAL FINS (AU 20-27, head-attached decorative fins) ==========\n {\n node: 'PECTORAL_L_ROOT',\n pitch: null,\n yaw: { aus: [24, 25], axis: 'ry', negative: 25, positive: 24 }, // Pectoral L Forward/Back\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 }, // Pectoral L Up/Down\n },\n {\n node: 'PECTORAL_L_CHAIN1',\n pitch: null,\n yaw: null,\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 },\n },\n {\n node: 'PECTORAL_L_CHAIN2',\n pitch: null,\n yaw: null,\n roll: { aus: [20, 21], axis: 'rz', negative: 21, positive: 20 },\n },\n {\n node: 'PECTORAL_R_ROOT',\n pitch: null,\n yaw: { aus: [26, 27], axis: 'ry', negative: 27, positive: 26 }, // Pectoral R Forward/Back\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 }, // Pectoral R Up/Down\n },\n {\n node: 'PECTORAL_R_ROOT2',\n pitch: null,\n yaw: null,\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 },\n },\n {\n node: 'PECTORAL_R_CHAIN1',\n pitch: null,\n yaw: null,\n roll: { aus: [22, 23], axis: 'rz', negative: 23, positive: 22 },\n },\n\n // ========== VENTRAL FINS (AU 30-33, belly fins) ==========\n {\n node: 'VENTRAL_L',\n pitch: null,\n yaw: null,\n roll: { aus: [30, 31], axis: 'rz', negative: 31, positive: 30 }, // Ventral L Up/Down\n },\n {\n node: 'VENTRAL_L_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [30, 31], axis: 'rz', negative: 31, positive: 30 },\n },\n {\n node: 'VENTRAL_R',\n pitch: null,\n yaw: null,\n roll: { aus: [32, 33], axis: 'rz', negative: 33, positive: 32 }, // Ventral R Up/Down\n },\n {\n node: 'VENTRAL_R_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [32, 33], axis: 'rz', negative: 33, positive: 32 },\n },\n\n // ========== DORSAL FIN (AU 53/54 - Head Up/Down via dorsal bones) ==========\n // In this fish model, the dorsal bones control the head's vertical movement\n // No head tilt for fish - AU 55/56 removed\n {\n node: 'DORSAL_ROOT',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 }, // Head Up/Down\n yaw: null,\n roll: null,\n },\n {\n node: 'DORSAL_L',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 },\n yaw: null,\n roll: null,\n },\n {\n node: 'DORSAL_R',\n pitch: { aus: [53, 54], axis: 'rx', negative: 54, positive: 53 },\n yaw: null,\n roll: null,\n },\n\n // ========== GILLS (AU 45-46, separate L/R - single AU per side, not continuum) ==========\n // AU 45 controls left side only, AU 46 controls right side only\n // These are intensity-only AUs (0=closed, 1=flared) - no negative partner\n {\n node: 'GILL_L',\n pitch: null,\n yaw: null,\n roll: { aus: [45], axis: 'rz', negative: undefined, positive: 45 }, // Gill L\n },\n {\n node: 'GILL_L_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [45], axis: 'rz', negative: undefined, positive: 45 },\n },\n {\n node: 'GILL_R',\n pitch: null,\n yaw: null,\n roll: { aus: [46], axis: 'rz', negative: undefined, positive: 46 }, // Gill R\n },\n {\n node: 'GILL_R_MID',\n pitch: null,\n yaw: null,\n roll: { aus: [46], axis: 'rz', negative: undefined, positive: 46 },\n },\n\n // ========== EYES (AU 61-64) ==========\n // Single EYES_0 mesh rotates both fish eyes together\n {\n node: 'EYE_L',\n pitch: { aus: [63, 64], axis: 'rx', negative: 64, positive: 63 }, // Eyes Up/Down\n yaw: { aus: [61, 62], axis: 'ry', negative: 62, positive: 61 }, // Eyes Left/Right\n roll: null,\n },\n];\n\n\n// ============================================================================\n// EYE MESH NODES - Fallback for eye rotation when no bone exists\n// Fish has a single combined EYES_0 mesh for both eyes\n// ============================================================================\n\nexport const EYE_MESH_NODES = {\n LEFT: 'EYES_0',\n RIGHT: 'EYES_0', // Same mesh, both eyes rotate together\n} as const;\n\n// ============================================================================\n// MESH SETTINGS - Material settings for fish meshes (depthWrite, blending, etc.)\n// ============================================================================\n\nexport const MESHES: Record<string, MeshInfo> = {\n // Body mesh - main fish body with proper depth and blending\n 'BODY_0': {\n category: 'body' as MeshCategory,\n morphCount: 0, // Fish model has no morphs\n material: {\n renderOrder: 20,\n transparent: true,\n opacity: 1,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n // Eyes mesh - render behind body with proper transparency support\n 'EYES_0': {\n category: 'eye' as MeshCategory,\n morphCount: 0,\n material: {\n renderOrder: 17,\n transparent: true,\n opacity: 1,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n // Hidden helper shell from the source asset; keep it suppressed by default\n // so Betta does not rely on a Firestore-only mesh override.\n 'Cube_0': {\n category: 'body' as MeshCategory,\n morphCount: 0,\n material: {\n renderOrder: -20,\n transparent: true,\n opacity: 0,\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n};\n\n// ============================================================================\n// ANNOTATION REGIONS - Camera/marker defaults for the fish preset\n// ============================================================================\n\nexport const ANNOTATION_REGIONS: AnnotationRegion[] = [\n {\n name: 'full_body',\n objects: ['*'],\n paddingFactor: 2.5,\n },\n {\n name: 'head',\n bones: ['HEAD'],\n paddingFactor: 1.8,\n children: ['left_eye', 'right_eye', 'mouth'],\n expandAnimation: 'staggered',\n },\n {\n name: 'left_eye',\n meshes: ['EYES_0'],\n parent: 'head',\n paddingFactor: 1.4,\n cameraAngle: 270,\n },\n {\n name: 'right_eye',\n meshes: ['EYES_0'],\n parent: 'head',\n paddingFactor: 1.4,\n cameraAngle: 90,\n },\n {\n name: 'mouth',\n bones: ['HEAD'],\n parent: 'head',\n paddingFactor: 1.5,\n },\n {\n name: 'body',\n bones: ['BODY_FRONT', 'BODY_MID', 'BODY_BACK'],\n paddingFactor: 1.8,\n },\n {\n name: 'tail',\n bones: ['TAIL_BASE', 'TAIL_TOP', 'TAIL_MID'],\n paddingFactor: 1.6,\n },\n {\n name: 'dorsal_fin',\n bones: ['DORSAL_ROOT', 'DORSAL_L', 'DORSAL_R'],\n paddingFactor: 1.8,\n },\n {\n name: 'pectoral_fins',\n bones: ['PECTORAL_L_ROOT', 'PECTORAL_R_ROOT'],\n paddingFactor: 1.8,\n children: ['pectoral_fin_left', 'pectoral_fin_right'],\n expandAnimation: 'outward',\n },\n {\n name: 'pectoral_fin_left',\n bones: ['PECTORAL_L_ROOT', 'PECTORAL_L_CHAIN1', 'PECTORAL_L_CHAIN2'],\n parent: 'pectoral_fins',\n paddingFactor: 1.6,\n cameraAngle: 270,\n },\n {\n name: 'pectoral_fin_right',\n bones: ['PECTORAL_R_ROOT', 'PECTORAL_R_CHAIN1', 'PECTORAL_R_ROOT2'],\n parent: 'pectoral_fins',\n paddingFactor: 1.6,\n cameraAngle: 90,\n },\n {\n name: 'ventral_fins',\n bones: ['VENTRAL_L', 'VENTRAL_R'],\n paddingFactor: 1.6,\n },\n {\n name: 'gills',\n bones: ['GILL_L', 'GILL_R'],\n paddingFactor: 1.6,\n children: ['gill_left', 'gill_right'],\n expandAnimation: 'outward',\n },\n {\n name: 'gill_left',\n bones: ['GILL_L', 'GILL_L_MID', 'GILL_L_TIP'],\n parent: 'gills',\n paddingFactor: 1.4,\n cameraAngle: 270,\n style: { lineDirection: 'left' },\n },\n {\n name: 'gill_right',\n bones: ['GILL_R', 'GILL_R_MID', 'GILL_R_TIP'],\n parent: 'gills',\n paddingFactor: 1.4,\n cameraAngle: 90,\n style: { lineDirection: 'right' },\n },\n];\n\n// ============================================================================\n// PRESET EXPORT\n// ============================================================================\n\nconst BETTA_FISH_PROFILE: Profile = {\n name: 'Betta Fish',\n animalType: 'fish',\n emoji: '🐟',\n auToBones: BONE_BINDINGS,\n boneNodes: BONE_NODES,\n // Prefix/suffix for bone resolution: 'Bone.' + '001' + '_Armature' = 'Bone.001_Armature'\n bonePrefix: BONE_PREFIX,\n boneSuffix: BONE_SUFFIX,\n // Suffix pattern for fuzzy matching (Sketchfab/Blender exports)\n suffixPattern: '_\\\\d+$|\\\\.\\\\d+$',\n auToMorphs: {} as Record<number, import('../mappings/types').MorphTargetsBySide>,\n morphToMesh: {} as Record<string, string[]>,\n visemeKeys: [] as string[],\n auInfo: AU_INFO,\n compositeRotations: COMPOSITE_ROTATIONS,\n eyeMeshNodes: EYE_MESH_NODES,\n meshes: MESHES,\n annotationRegions: ANNOTATION_REGIONS,\n auMixDefaults: {} as Record<number, number>, // No mixed AUs (morph+bone) in this model\n continuumPairs: CONTINUUM_PAIRS_MAP,\n continuumLabels: CONTINUUM_LABELS,\n};\n\nexport const BETTA_FISH_PRESET = {\n ...BETTA_FISH_PROFILE,\n bones: BONES,\n boneBindings: BONE_BINDINGS,\n actionInfo: AU_INFO,\n};\n\n/**\n * Check if an AU has bilateral bone bindings (L and R nodes)\n * Used to determine if a balance slider should be shown\n */\nexport const hasLeftRightBones = (auId: number): boolean => {\n const bindings = BONE_BINDINGS[auId];\n return checkBindingsForLeftRight(bindings);\n};\n\nexport default BETTA_FISH_PRESET;\n\n// ============================================================================\n// LEGACY ALIASES - For backwards compatibility with existing code\n// ============================================================================\n\n// Deprecated alias: the fish preset is now a single preset object, not a\n// parallel \"mapping config\" that differs from the real preset.\nexport const AU_MAPPING_CONFIG = BETTA_FISH_PRESET;\n\nexport const ACTION_INFO = AU_INFO;\nexport const FISH_BONES = BONES;\nexport const FISH_BONE_NODES = BONE_NODES;\nexport const FISH_BONE_BINDINGS = BONE_BINDINGS;\nexport const FISH_AU_INFO = AU_INFO;\nexport const FISH_ACTION_INFO = ACTION_INFO;\nexport const FISH_CONTINUUM_PAIRS_MAP = CONTINUUM_PAIRS_MAP;\nexport const FISH_CONTINUUM_LABELS = CONTINUUM_LABELS;\nexport const FISH_COMPOSITE_ROTATIONS = COMPOSITE_ROTATIONS;\nexport const FISH_EYE_MESH_NODES = EYE_MESH_NODES;\nexport const FISH_MESHES = MESHES;\nexport const FISH_AU_MAPPING_CONFIG = BETTA_FISH_PRESET;\nexport const fishHasLeftRightBones = hasLeftRightBones;\n","import type { Profile } from '../mappings/types';\nimport { BETTA_FISH_PRESET } from './bettaFish';\nimport { CC4_PRESET } from './cc4';\n\n/**\n * Authoring registry for presets embedded in the Rust/Wasm package.\n *\n * Preset IDs are data identifiers. Runtime code must look them up through the\n * generated Wasm registry rather than branching on individual characters.\n */\nexport const EMBEDDED_PRESETS = {\n cc4: CC4_PRESET,\n fish: BETTA_FISH_PRESET,\n} as const satisfies Record<string, Profile>;\n\nexport type EmbeddedPresetId = keyof typeof EMBEDDED_PRESETS;\n\nexport function getEmbeddedPreset(presetId: string): Profile | undefined {\n const normalized = presetId.trim().toLowerCase();\n return (EMBEDDED_PRESETS as Record<string, Profile>)[normalized];\n}\n","/**\n * Embody - Preset Exports\n *\n * All AU presets are exported from here.\n * Frontend passes a presetType string and Embody looks up or extends the preset internally.\n */\n\n// CC4 preset (default for humanoid characters)\nexport { CC4_PRESET, default } from './cc4';\nexport * from './cc4';\n\nimport type { Profile } from '../mappings/types';\nimport {\n extendPresetWithProfile,\n mergePresetWithProfile,\n} from '../mappings/extendPresetWithProfile';\nexport {\n extendPresetWithProfile,\n mergePresetWithProfile,\n} from '../mappings/extendPresetWithProfile';\n\n// Betta fish preset (skeletal animation, no morphs)\nexport { BETTA_FISH_PRESET, AU_MAPPING_CONFIG, FISH_AU_MAPPING_CONFIG } from './bettaFish';\nexport {\n EMBEDDED_PRESETS,\n getEmbeddedPreset,\n} from './registry';\nexport type { EmbeddedPresetId } from './registry';\n\n// Re-export fish-specific items with FISH_ prefix to avoid conflicts\nexport {\n BONE_NODES as FISH_BONE_NODES,\n BONE_BINDINGS as FISH_BONE_BINDINGS,\n COMPOSITE_ROTATIONS as FISH_COMPOSITE_ROTATIONS,\n EYE_MESH_NODES as FISH_EYE_MESH_NODES,\n} from './bettaFish';\n\n/**\n * Preset types that can be passed to Embody\n */\nimport {\n getEmbeddedPreset,\n type EmbeddedPresetId,\n} from './registry';\n\nexport type PresetType = EmbeddedPresetId | 'skeletal' | 'custom';\n\n// Import CC4_PRESET at module level for getPreset\nimport { CC4_PRESET } from './cc4';\n\n/**\n * Get a preset by type name.\n * This allows frontend to pass a string instead of importing the full preset.\n */\nexport function getPreset(presetType: PresetType | string | undefined) {\n const compatibilityId = presetType === 'skeletal' ? 'fish' : presetType;\n return compatibilityId\n ? getEmbeddedPreset(compatibilityId) ?? CC4_PRESET\n : CC4_PRESET;\n}\n\n// Backwards-compatible lookup alias retained for LoomLarge consumers.\nexport const resolvePreset = getPreset;\n\n/**\n * Get a preset, then extend it with an optional profile.\n */\nexport async function getPresetWithProfile(\n presetType: PresetType | string | undefined,\n profile?: Partial<Profile>\n): Promise<Profile> {\n return extendPresetWithProfile(getPreset(presetType), profile);\n}\n\n// Backwards-compatible extension alias retained for LoomLarge consumers.\nexport const resolvePresetWithOverrides = getPresetWithProfile;\n","/**\n * Embody - Three.js Implementation\n *\n * Default implementation of the Embody runtime interface for Three.js.\n * Controls 3D character facial animation using Action Units (AUs),\n * morph targets, visemes, and bone transformations.\n */\n\nimport {\n BufferAttribute,\n Quaternion,\n Vector3,\n Box3,\n Clock,\n} from 'three';\nimport type { Mesh, Object3D, AnimationClip } from 'three';\nimport type {\n EmbodyRuntime,\n ReadyPayload,\n EmbodyConfig,\n} from '../../interfaces/EmbodyRuntime';\nimport type { MeshInfo, MorphTargetRef, Profile } from '../../mappings/types';\nimport type {\n TransitionHandle,\n BoneKey,\n RotationsState,\n AnimationPlayOptions,\n AnimationClipInfo,\n AnimationState,\n AnimationActionHandle,\n CurvesMap,\n ClipOptions,\n ClipHandle,\n Snippet,\n SnippetChannel,\n TypedSnippet,\n CompositeRotation,\n RotationAxis,\n AnimationBlendMode,\n MorphTargetDelta,\n AddMorphTargetOptions,\n} from '../../core/types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from '../../core/compositeAxis';\nimport { ThreeAnimationRuntime, ThreeAnimationSystem } from './ThreeAnimationRuntime';\nimport { getSideScale } from './balanceUtils';\nimport { ThreeModelInspector } from './ThreeModelInspector';\nimport { ThreeFrameApplier, type ThreeFrameApplierBindings, type ThreeMaterialConfig, type ThreeResolvedMaterialConfig } from './ThreeFrameApplier';\nimport { WasmRuntimeCore } from '../../core/WasmRuntimeCore';\nimport type { ModelDescriptor } from '../../core/contracts';\nimport { initEmbodyCore, requireInitializedEmbodyCore } from '../../wasm';\nimport { HairPhysicsController, type HairPhysicsConfig, type HairPhysicsConfigUpdate } from './hair/HairPhysicsController';\nimport { CC4_PRESET, CC4_MESHES, COMPOSITE_ROTATIONS as CC4_COMPOSITE_ROTATIONS } from '../../presets/cc4';\nimport { getPreset } from '../../presets';\nimport { mergePresetWithProfile } from '../../mappings/extendPresetWithProfile';\nimport {\n getProfileVisemeSlots,\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n getVisemeSlotIndex,\n} from '../../mappings/visemeSystem';\nimport type { NodeBase, ResolvedBones } from './types';\n\nconst deg2rad = (d: number) => (d * Math.PI) / 180;\n\n// Axis vectors for quaternion rotation (like stable version)\nconst X_AXIS = new Vector3(1, 0, 0);\nconst Y_AXIS = new Vector3(0, 1, 0);\nconst Z_AXIS = new Vector3(0, 0, 1);\n\n/**\n * Build AU to composite map from composite rotations config.\n * Maps AU ID to { nodes, axis } so we know which semantic axis (pitch/yaw/roll) to use.\n */\nfunction buildAUToCompositeMap(composites: CompositeRotation[]): Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }> {\n const map = new Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }>();\n composites.forEach(comp => {\n (['pitch', 'yaw', 'roll'] as const).forEach(axisName => {\n const axisConfig = comp[axisName];\n if (axisConfig) {\n axisConfig.aus.forEach(auId => {\n const existing = map.get(auId);\n if (existing) {\n existing.nodes.push(comp.node);\n } else {\n map.set(auId, { nodes: [comp.node], axis: axisName });\n }\n });\n }\n });\n });\n return map;\n}\n\nfunction clamp01(x: number) {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\ntype MorphTargetHandle = { infl: number[]; idx: number };\ntype WeightedMorphTargetHandle = MorphTargetHandle & { weight: number };\ntype ResolvedMorphTargetsBySide = {\n left: MorphTargetHandle[];\n right: MorphTargetHandle[];\n center: MorphTargetHandle[];\n};\n\nconst RESOLVED_TRANSITION_HANDLE: TransitionHandle = {\n promise: Promise.resolve(),\n pause: () => {},\n resume: () => {},\n cancel: () => {},\n};\n\nexport class Embody implements EmbodyRuntime {\n // Optional hook for animation schedulers.\n onSnippetEnd?: (name: string) => void;\n\n /**\n * Create an engine with Rust-owned preset/profile resolution.\n *\n * Prefer this factory whenever a profile patch must be merged onto a preset.\n * The sync constructor accepts either a presetType with no patch, or an\n * already-resolved profile.\n */\n static async create(\n config: EmbodyConfig = {},\n animation?: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n }\n ): Promise<Embody> {\n const core = await initEmbodyCore();\n const basePreset = config.presetType ? getPreset(config.presetType) : CC4_PRESET;\n const resolvedProfile = mergePresetWithProfile(core, basePreset, config.profile);\n const engine = new Embody(\n {\n profile: resolvedProfile,\n animationRuntimeFactory: config.animationRuntimeFactory,\n },\n animation\n );\n engine.attachWasmCore(core);\n return engine;\n }\n\n // Configuration\n private config: Profile;\n\n // Animation driver (injectable)\n private animation: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n };\n\n // Composite rotation mappings (built from config or default CC4)\n private compositeRotations: CompositeRotation[];\n private auToCompositeMap: Map<number, { nodes: string[]; axis: 'pitch' | 'yaw' | 'roll' }>;\n\n // State\n private auValues: Record<number, number> = {};\n private auBalances: Record<number, number> = {}; // Balance values per AU (-1 to 1)\n private rigReady = false;\n private missingBoneWarnings = new Set<string>();\n\n // Rotation state\n private rotations: RotationsState = {};\n private pendingCompositeNodes = new Set<string>();\n private isPaused = false;\n private translations: Record<string, { x: number; y: number; z: number }> = {};\n\n // Mesh references\n private faceMesh: Mesh | null = null;\n private resolvedFaceMeshes: string[] = [];\n private meshes: Mesh[] = [];\n private model: Object3D | null = null;\n private meshByName = new Map<string, Mesh>();\n private morphKeyCache = new Map<string, MorphTargetHandle[]>();\n private morphIndexCache = new Map<string, MorphTargetHandle[]>();\n private resolvedAUMorphTargets = new Map<number, ResolvedMorphTargetsBySide>();\n private resolvedVisemeTargets: WeightedMorphTargetHandle[][] = [];\n\n // Bones\n private bones: ResolvedBones = {};\n private mixWeights: Record<number, number> = {};\n\n // Viseme state\n private visemeValues: number[] = [];\n private visemeJawScales: number[] = [];\n\n\n // Viseme jaw amounts\n private static readonly VISEME_JAW_AMOUNTS: number[] = [\n 0.15, 0.35, 0.25, 0.70, 0.55, 0.30, 0.10, 0.20, 0.08,\n 0.12, 0.18, 0.02, 0.25, 0.60, 0.40,\n ];\n\n private animationController: ThreeAnimationSystem;\n private hairPhysics: HairPhysicsController;\n private modelInspector = new ThreeModelInspector();\n private frameApplier = new ThreeFrameApplier();\n private modelDescriptor: ModelDescriptor | null = null;\n private wasmRuntimeCore: WasmRuntimeCore | null = null;\n private framePathReady = false;\n\n // Internal animation loop\n private clock = new Clock(false); // Don't auto-start\n private animationFrameId: number | null = null;\n private isRunning = false;\n\n constructor(\n config: EmbodyConfig = {},\n animation?: {\n tick(dtSeconds: number): void;\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing?: (t: number) => number\n ): TransitionHandle;\n clearTransitions(): void;\n getActiveTransitionCount(): number;\n }\n ) {\n // Sync construction does not merge profile patches. Use Embody.create() for\n // preset + override resolution through the Rust Wasm core.\n this.config = config.profile\n ? (config.profile as Profile)\n : config.presetType\n ? getPreset(config.presetType)\n : CC4_PRESET;\n this.mixWeights = { ...this.config.auMixDefaults };\n this.syncVisemeRuntimeState();\n this.animation = animation || new ThreeAnimationRuntime();\n\n // Use config's composite rotations or default to CC4\n this.compositeRotations = this.config.compositeRotations || CC4_COMPOSITE_ROTATIONS;\n this.auToCompositeMap = buildAUToCompositeMap(this.compositeRotations);\n\n this.animationController = new ThreeAnimationSystem({\n getModel: () => this.model,\n getMeshes: () => this.meshes,\n getMeshByName: (name) => this.meshByName.get(name),\n getMeshNamesForAU: (auId) => this.getMeshNamesForAU(auId),\n getMeshNamesForViseme: () => this.getMeshNamesForViseme(),\n getCurrentAUValue: (auId) => this.getAU(auId),\n getCurrentVisemeValue: (visemeIndex) => this.visemeValues[visemeIndex] ?? 0,\n getCurrentMorphValue: (morphKey, meshNames) => this.getMorphValueForMeshes(morphKey, meshNames),\n getCurrentMorphIndexValue: (morphIndex, meshNames) => this.getMorphValueByIndexForMeshes(morphIndex, meshNames),\n getCurrentBoneQuaternion: (nodeKey) => this.bones[nodeKey]?.obj.quaternion.clone() ?? null,\n getCurrentBonePositionValue: (nodeKey, axis) => this.bones[nodeKey]?.obj.position[axis] ?? null,\n getBones: () => this.bones,\n getConfig: () => this.config,\n getCompositeRotations: () => this.compositeRotations,\n computeSideValues: (base, balance) => this.computeSideValues(base, balance),\n getAUMixWeight: (auId) => this.getAUMixWeight(auId),\n isMixedAU: (auId) => this.isMixedAU(auId),\n reapplyProceduralState: () => this.reapplyProceduralStateAfterBakedUpdate(),\n }, {\n animationRuntimeFactory: config.animationRuntimeFactory,\n });\n\n this.hairPhysics = new HairPhysicsController({\n getMeshByName: (name) => this.meshByName.get(name),\n getSelectedHairMeshNames: () => this.config.morphToMesh?.hair || [],\n // Hair physics reuses the shared mixer-backed clip builder.\n buildClip: (clipName, curves, options) => this.animationController.buildClip(clipName, curves, options),\n cleanupSnippet: (name) => this.animationController.cleanupSnippet(name),\n });\n\n this.applyHairPhysicsProfileConfig();\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n onReady(payload: ReadyPayload): void {\n const { meshes, model } = payload;\n const inspection = this.modelInspector.inspectModel(model, {\n meshes,\n profile: this.config,\n previousBones: this.bones,\n });\n\n this.meshes = inspection.morphMeshes;\n this.model = model;\n this.meshByName = inspection.meshByName;\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n\n // Resolve bones\n this.bones = inspection.bones;\n this.rigReady = true;\n this.missingBoneWarnings.clear();\n this.initBoneRotations();\n\n // Find primary face mesh (use head bone proximity when available)\n this.resolvedFaceMeshes = inspection.resolvedFaceMeshes;\n this.faceMesh = inspection.faceMesh;\n\n // Auto-detect face morph meshes only if preset/profile doesn't define them.\n // When morphToMesh.face is already configured (e.g., CC4 preset specifies\n // body + eyebrows + occlusion + tear lines), trust that configuration.\n //\n // Important: Use only resolved face candidates here. Using all morph-capable\n // meshes makes AU/morph transitions spill into unrelated meshes.\n if (!this.config.morphToMesh?.face || this.config.morphToMesh.face.length === 0) {\n const faceMeshNames = this.resolvedFaceMeshes\n .filter((name) => this.meshByName.has(name));\n\n if (faceMeshNames.length > 0) {\n this.config.morphToMesh = {\n ...this.config.morphToMesh,\n face: Array.from(new Set(faceMeshNames)),\n };\n }\n }\n\n this.rebuildMorphTargetsCache();\n this.bindHostNeutralRuntime(inspection);\n\n if (this.resolvedFaceMeshes.length > 0) {\n for (const faceName of this.resolvedFaceMeshes) {\n const faceMesh = this.meshByName.get(faceName);\n const morphKeys = faceMesh?.morphTargetDictionary\n ? Object.keys(faceMesh.morphTargetDictionary)\n : [];\n console.log('[Embody] Face mesh resolved:', faceName);\n console.log('[Embody] Face mesh morphs:', morphKeys);\n }\n } else {\n console.log('[Embody] No face mesh resolved from morph targets.');\n }\n\n // Apply render order and material settings from CC4_MESHES\n this.applyMeshMaterialSettings(model);\n }\n\n private bindHostNeutralRuntime(inspection: ReturnType<ThreeModelInspector['inspectModel']>): void {\n this.modelDescriptor = inspection.descriptor;\n this.frameApplier.setBindings(buildFrameApplierBindings(inspection));\n const wasm = requireInitializedEmbodyCore();\n this.attachWasmCore(wasm);\n this.wasmRuntimeCore = new WasmRuntimeCore({\n profile: this.config,\n model: inspection.descriptor,\n wasm,\n allowEmptyBindings: true,\n });\n this.syncRuntimeCoreState();\n this.framePathReady = true;\n }\n\n private attachWasmCore(core: Awaited<ReturnType<typeof initEmbodyCore>>): void {\n this.hairPhysics.setCore(core);\n }\n\n private syncRuntimeCoreState(): void {\n if (this.wasmRuntimeCore) {\n this.wasmRuntimeCore.setProfile(this.config);\n if (this.modelDescriptor) {\n this.wasmRuntimeCore.setModelDescriptor(this.modelDescriptor);\n }\n this.wasmRuntimeCore.clear();\n for (const [auIdText, value] of Object.entries(this.auValues)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.wasmRuntimeCore.setAU(auId, value, this.auBalances[auId] ?? 0);\n }\n for (const [auIdText, weight] of Object.entries(this.mixWeights)) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n this.wasmRuntimeCore.setAUMixWeight(auId, weight);\n }\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n this.wasmRuntimeCore.setViseme(index, this.visemeValues[index] ?? 0, this.visemeJawScales[index] ?? 1);\n }\n }\n }\n\n /**\n * Re-inspect the current model and push a fresh ModelDescriptor into the\n * runtime cores and frame applier. Needed whenever host-side morph targets\n * or meshes change after onReady (e.g. addMorphTarget).\n */\n private refreshHostNeutralModelDescriptor(): void {\n if (!this.model || !this.framePathReady) return;\n const inspection = this.modelInspector.inspectModel(this.model, {\n meshes: this.meshes,\n profile: this.config,\n previousBones: this.bones,\n });\n this.modelDescriptor = inspection.descriptor;\n this.frameApplier.setBindings(buildFrameApplierBindings(inspection));\n this.wasmRuntimeCore?.setModelDescriptor(inspection.descriptor);\n }\n\n private applyLiveFrameDelta(): boolean {\n if (!this.framePathReady || !this.model || !this.wasmRuntimeCore) return false;\n this.frameApplier.applyFrameDelta(this.model, this.wasmRuntimeCore.evaluateFrameDelta());\n this.pendingCompositeNodes.clear();\n return true;\n }\n\n private rebuildMorphTargetsCache(): void {\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n this.resolvedAUMorphTargets.clear();\n this.resolvedVisemeTargets = [];\n\n if (!this.meshes.length) return;\n\n const resolveTargetsForKeys = (keys: MorphTargetRef[], meshNames: string[]): MorphTargetHandle[] => {\n if (!keys || keys.length === 0) return [];\n const targets: MorphTargetHandle[] = [];\n for (const key of keys) {\n const resolved = typeof key === 'number'\n ? this.resolveMorphTargetsByIndex(key, meshNames)\n : this.resolveMorphTargets(key, meshNames);\n if (resolved.length > 0) {\n targets.push(...resolved);\n }\n }\n return targets;\n };\n\n for (const [auIdStr, entry] of Object.entries(this.config.auToMorphs || {})) {\n const auId = Number(auIdStr);\n if (Number.isNaN(auId) || !entry) continue;\n const meshNames = this.getMeshNamesForAU(auId);\n const resolved: ResolvedMorphTargetsBySide = {\n left: resolveTargetsForKeys(entry.left, meshNames),\n right: resolveTargetsForKeys(entry.right, meshNames),\n center: resolveTargetsForKeys(entry.center, meshNames),\n };\n this.resolvedAUMorphTargets.set(auId, resolved);\n }\n\n for (let i = 0; i < getProfileVisemeSlots(this.config).length; i += 1) {\n const visemeMeshNames = this.getMeshNamesForViseme();\n const targets: WeightedMorphTargetHandle[] = [];\n for (const bindingTarget of getVisemeBindingTargets(this.config, i)) {\n const resolved = typeof bindingTarget.morph === 'number'\n ? this.resolveMorphTargetsByIndex(bindingTarget.morph, visemeMeshNames)\n : this.resolveMorphTargets(bindingTarget.morph, visemeMeshNames);\n for (const target of resolved) {\n targets.push({ ...target, weight: bindingTarget.weight });\n }\n }\n this.resolvedVisemeTargets[i] = targets;\n }\n }\n\n private resolveFaceMeshes(meshes: Mesh[]): string[] {\n const faceMeshNames = this.config.morphToMesh?.face || [];\n const availableMorphMeshes = meshes.filter((m) => {\n const dict = m.morphTargetDictionary;\n const infl = m.morphTargetInfluences;\n return (dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0);\n });\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n return [defaultFace.name];\n }\n\n const candidateByMorph = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n if (candidateByMorph) {\n return [candidateByMorph.name];\n }\n\n const head = this.bones[this.getHeadBoneNodeKey()]?.obj ?? this.bones.HEAD?.obj;\n if (head && availableMorphMeshes.length > 0) {\n const headPos = new Vector3();\n (head as any).getWorldPosition?.(headPos);\n const headCandidates = availableMorphMeshes.map((mesh) => {\n const box = new Box3().setFromObject(mesh as any);\n const center = new Vector3();\n box.getCenter(center);\n const distance = box.containsPoint(headPos) ? 0 : center.distanceTo(headPos);\n const morphCount = mesh.morphTargetDictionary\n ? Object.keys(mesh.morphTargetDictionary).length\n : 0;\n const name = mesh.name.toLowerCase();\n const penalty = /eye|occlusion|tear|teeth|tongue|hair|lash/.test(name) ? 10 : 0;\n return { name: mesh.name, distance, morphCount, penalty };\n });\n\n headCandidates.sort((a, b) => {\n if (a.distance !== b.distance) return a.distance - b.distance;\n if (a.penalty !== b.penalty) return a.penalty - b.penalty;\n return b.morphCount - a.morphCount;\n });\n\n const best = headCandidates[0];\n const extras = headCandidates\n .filter((entry) => /brow|eyebrow/.test(entry.name.toLowerCase()))\n .map((entry) => entry.name);\n\n return [best.name, ...extras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n if (availableMorphMeshes.length > 0) {\n const best = availableMorphMeshes.reduce((prev, current) => {\n const prevCount = prev.morphTargetDictionary ? Object.keys(prev.morphTargetDictionary).length : 0;\n const currCount = current.morphTargetDictionary ? Object.keys(current.morphTargetDictionary).length : 0;\n return currCount > prevCount ? current : prev;\n });\n const browExtras = availableMorphMeshes\n .filter((m) => {\n const dict = m.morphTargetDictionary || {};\n const morphKeys = Object.keys(dict);\n return /brow|eyebrow/i.test(m.name) || morphKeys.some((k) => /brow/i.test(k));\n })\n .map((m) => m.name);\n return [best.name, ...browExtras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n return [];\n }\n\n update(deltaSeconds: number): void {\n const dtSeconds = Math.max(0, deltaSeconds || 0);\n if (dtSeconds <= 0 || this.isPaused) return;\n\n this.animation.tick(dtSeconds);\n const wasmTransitionCount = this.wasmRuntimeCore?.activeTransitionCount() ?? 0;\n const remainingWasmTransitions = this.wasmRuntimeCore?.update(dtSeconds) ?? 0;\n if (wasmTransitionCount > 0 || remainingWasmTransitions > 0) {\n this.applyLiveFrameDelta();\n }\n this.flushPendingComposites();\n\n this.animationController.update(dtSeconds);\n this.hairPhysics.update(dtSeconds);\n }\n\n /** Start the internal animation loop using Three.js Clock */\n start(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n this.clock.start();\n\n const tick = () => {\n if (!this.isRunning) return;\n const delta = this.clock.getDelta();\n this.update(delta);\n this.animationFrameId = requestAnimationFrame(tick);\n };\n\n this.animationFrameId = requestAnimationFrame(tick);\n }\n\n /** Stop the internal animation loop */\n stop(): void {\n this.isRunning = false;\n this.clock.stop();\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n\n dispose(): void {\n this.stop();\n this.clearTransitions();\n this.animationController.dispose();\n this.meshes = [];\n this.model = null;\n this.bones = {};\n this.modelDescriptor = null;\n this.wasmRuntimeCore = null;\n this.framePathReady = false;\n }\n\n // ============================================================================\n // AU CONTROL\n // ============================================================================\n\n setAU(id: number | string, v: number, balance?: number): void {\n if (typeof id === 'string') {\n const match = id.match(/^(\\d+)([LR])$/i);\n if (match) {\n const au = Number(match[1]);\n const side = match[2].toUpperCase() as 'L' | 'R';\n const sideBalance = side === 'L' ? -1 : 1;\n this.setAU(au, v, sideBalance);\n return;\n }\n const n = Number(id);\n if (!Number.isNaN(n)) {\n this.setAU(n, v, balance);\n }\n return;\n }\n\n // Handle negative values for continuum pairs:\n // If v < 0 and this AU has a continuum pair, forward to setContinuum\n if (v < 0 && this.config.continuumPairs) {\n const pairInfo = this.config.continuumPairs[id];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? id : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : id;\n const continuumValue = pairInfo.isNegative ? -v : v;\n this.setContinuum(negAU, posAU, continuumValue, balance);\n return;\n }\n }\n\n this.auValues[id] = v;\n // Store balance for this AU (used by bilateral bone AUs like fish gills)\n if (balance !== undefined) {\n this.auBalances[id] = balance;\n }\n\n this.wasmRuntimeCore?.setAU(id, v, balance ?? this.auBalances[id] ?? 0);\n\n const appliedViaFrame = this.applyLiveFrameDelta();\n if (!appliedViaFrame) {\n const resolvedMorphTargets = this.resolvedAUMorphTargets.get(id);\n const { left: leftKeys, right: rightKeys, center: centerKeys } = this.getAUMorphsBySide(id);\n\n if (resolvedMorphTargets) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (resolvedMorphTargets.left.length || resolvedMorphTargets.right.length) {\n this.applyMorphTargets(resolvedMorphTargets.left, leftVal);\n this.applyMorphTargets(resolvedMorphTargets.right, rightVal);\n }\n\n this.applyMorphTargets(resolvedMorphTargets.center, base);\n } else if (leftKeys.length || rightKeys.length || centerKeys.length) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const meshNames = this.getMeshNamesForAU(id);\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, leftVal, meshNames);\n else this.setMorph(k, leftVal, meshNames);\n }\n for (const k of rightKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, rightVal, meshNames);\n else this.setMorph(k, rightVal, meshNames);\n }\n }\n\n for (const k of centerKeys) {\n if (typeof k === 'number') this.setMorphInfluence(k, base, meshNames);\n else this.setMorph(k, base, meshNames);\n }\n }\n }\n\n if (appliedViaFrame) return;\n\n // Check if this AU affects composite rotations\n const compositeInfo = this.auToCompositeMap.get(id);\n\n if (compositeInfo) {\n // This AU affects composite bone rotations - use axis from compositeRotations\n for (const nodeKey of compositeInfo.nodes) {\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) continue;\n\n const axisConfig = config[compositeInfo.axis];\n if (!axisConfig) continue;\n\n const axisValue = this.getCompositeAxisValueForNode(nodeKey, axisConfig);\n this.updateBoneRotation(nodeKey, compositeInfo.axis, axisValue);\n this.pendingCompositeNodes.add(nodeKey);\n }\n }\n\n // Handle translations (non-composite)\n const bindings = this.config.auToBones[id];\n if (bindings) {\n for (const binding of bindings) {\n if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n this.updateBoneTranslation(binding.node, binding.channel, v * binding.scale, binding.maxUnits);\n }\n }\n }\n }\n }\n\n transitionAU(id: number | string, to: number, durationMs = 200, balance?: number): TransitionHandle {\n const numId = typeof id === 'string' ? Number(id.replace(/[^\\d]/g, '')) : id;\n\n // Handle negative values for continuum pairs:\n // If to < 0 and this AU has a continuum pair, forward to transitionContinuum\n if (to < 0 && this.config.continuumPairs) {\n const pairInfo = this.config.continuumPairs[numId];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? numId : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : numId;\n const continuumValue = pairInfo.isNegative ? -to : to;\n return this.transitionContinuum(negAU, posAU, continuumValue, durationMs, balance);\n }\n }\n\n const target = clamp01(to);\n\n if (balance !== undefined) {\n this.auBalances[numId] = balance;\n }\n const storedBalance = this.auBalances[numId] ?? 0;\n\n const { left: leftKeys, right: rightKeys, center: centerKeys } = this.getAUMorphsBySide(numId);\n const bindings = this.config.auToBones[numId] || [];\n\n const mixWeight = this.isMixedAU(numId) ? this.getAUMixWeight(numId) : 1.0;\n const base = target * mixWeight;\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, storedBalance);\n\n this.auValues[numId] = target;\n\n if (this.wasmRuntimeCore) {\n this.wasmRuntimeCore.transitionAU(\n numId,\n target,\n durationMs,\n balance ?? this.auBalances[numId] ?? Number.NaN\n );\n this.update(0);\n if (durationMs <= 0) {\n this.applyLiveFrameDelta();\n }\n return RESOLVED_TRANSITION_HANDLE;\n }\n\n const handles: TransitionHandle[] = [];\n const meshNames = this.getMeshNamesForAU(numId);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, leftVal, durationMs, meshNames)\n : this.transitionMorph(k, leftVal, durationMs, meshNames)\n );\n }\n for (const k of rightKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, rightVal, durationMs, meshNames)\n : this.transitionMorph(k, rightVal, durationMs, meshNames)\n );\n }\n }\n\n for (const k of centerKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, base, durationMs, meshNames)\n : this.transitionMorph(k, base, durationMs, meshNames)\n );\n }\n\n // Handle bone rotations using auToCompositeMap\n const compositeInfo = this.auToCompositeMap.get(numId);\n if (compositeInfo) {\n for (const nodeKey of compositeInfo.nodes) {\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) continue;\n\n const axisConfig = config[compositeInfo.axis];\n if (!axisConfig) continue;\n\n const axisValue = this.getCompositeAxisValueForNode(nodeKey, axisConfig);\n handles.push(this.transitionBoneRotation(nodeKey, compositeInfo.axis, axisValue, durationMs));\n }\n }\n\n // Handle translations\n for (const binding of bindings) {\n if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n handles.push(this.transitionBoneTranslation(binding.node, binding.channel, target * binding.scale, binding.maxUnits, durationMs));\n }\n }\n }\n\n return this.combineHandles(handles);\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n getCompositeRotations(): CompositeRotation[] {\n return this.compositeRotations;\n }\n\n // ============================================================================\n // CONTINUUM CONTROL (for paired AUs like eyes left/right, head up/down)\n // ============================================================================\n\n /**\n * Set a continuum AU pair immediately (no animation).\n *\n * Sign convention:\n * - Negative value (-1 to 0): activates negAU (e.g., head left, eyes left)\n * - Positive value (0 to +1): activates posAU (e.g., head right, eyes right)\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Value from -1 (full negative) to +1 (full positive)\n * @param balance - Optional L/R balance for bilateral morphs\n */\n setContinuum(negAU: number, posAU: number, continuumValue: number, balance?: number): void {\n const value = Math.max(-1, Math.min(1, continuumValue));\n\n this.auValues[negAU] = value < 0 ? Math.abs(value) : 0;\n this.auValues[posAU] = value > 0 ? value : 0;\n if (balance !== undefined) {\n this.auBalances[negAU] = balance;\n this.auBalances[posAU] = balance;\n }\n\n if (this.wasmRuntimeCore) {\n this.wasmRuntimeCore.setContinuum(negAU, posAU, value, balance ?? 0);\n this.applyLiveFrameDelta();\n return;\n }\n\n if (value < 0) {\n this.setAU(posAU, 0, balance);\n this.setAU(negAU, Math.abs(value), balance);\n return;\n }\n if (value > 0) {\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, value, balance);\n return;\n }\n\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, 0, balance);\n }\n\n /**\n * Smoothly transition a continuum AU pair (e.g., eyes left/right, head up/down).\n * Takes a continuum value from -1 to +1 and internally manages both AU values.\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Target value from -1 (full negative) to +1 (full positive)\n * @param durationMs - Transition duration in milliseconds\n * @param balance - Optional L/R balance for bilateral morphs\n */\n transitionContinuum(negAU: number, posAU: number, continuumValue: number, durationMs = 200, balance?: number): TransitionHandle {\n const target = Math.max(-1, Math.min(1, continuumValue));\n\n // Get current continuum value: positive if posAU active, negative if negAU active\n const currentNeg = this.auValues[negAU] ?? 0;\n const currentPos = this.auValues[posAU] ?? 0;\n const currentContinuum = currentPos - currentNeg;\n\n this.auValues[negAU] = target < 0 ? Math.abs(target) : 0;\n this.auValues[posAU] = target > 0 ? target : 0;\n if (balance !== undefined) {\n this.auBalances[negAU] = balance;\n this.auBalances[posAU] = balance;\n }\n\n if (this.wasmRuntimeCore) {\n if (target < 0) {\n this.wasmRuntimeCore.transitionAU(posAU, 0, durationMs, balance ?? this.auBalances[posAU] ?? Number.NaN);\n this.wasmRuntimeCore.transitionAU(negAU, Math.abs(target), durationMs, balance ?? this.auBalances[negAU] ?? Number.NaN);\n } else if (target > 0) {\n this.wasmRuntimeCore.transitionAU(negAU, 0, durationMs, balance ?? this.auBalances[negAU] ?? Number.NaN);\n this.wasmRuntimeCore.transitionAU(posAU, target, durationMs, balance ?? this.auBalances[posAU] ?? Number.NaN);\n } else {\n this.wasmRuntimeCore.transitionAU(negAU, 0, durationMs, balance ?? this.auBalances[negAU] ?? Number.NaN);\n this.wasmRuntimeCore.transitionAU(posAU, 0, durationMs, balance ?? this.auBalances[posAU] ?? Number.NaN);\n }\n if (durationMs <= 0) {\n this.applyLiveFrameDelta();\n }\n return RESOLVED_TRANSITION_HANDLE;\n }\n\n const driverKey = `continuum_${negAU}_${posAU}`;\n\n return this.animation.addTransition(driverKey, currentContinuum, target, durationMs, (value) => this.setContinuum(negAU, posAU, value, balance));\n }\n\n // ============================================================================\n // MORPH CONTROL\n // ============================================================================\n\n addMorphTarget(target: MorphTargetDelta, options: AddMorphTargetOptions = {}): number {\n this.validateMorphTargetDelta(target, options);\n const staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n const index = this.applyMorphTargetDelta(target, options);\n this.refreshMorphTargets([target.meshName]);\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n return index;\n }\n\n addMorphTargets(targets: MorphTargetDelta[], options: AddMorphTargetOptions = {}): Record<string, number> {\n if (targets.length === 0) return {};\n\n const batchKeys = new Set<string>();\n const batchRelativeModeByMesh = new Map<string, boolean>();\n for (const target of targets) {\n const key = `${target.meshName}:${target.name}`;\n if (batchKeys.has(key)) {\n throw new Error(`Morph target \"${target.name}\" for mesh \"${target.meshName}\" appears more than once in the same batch.`);\n }\n batchKeys.add(key);\n this.validateMorphTargetDelta(target, options);\n const targetIsRelative = target.relative !== false;\n const batchRelativeMode = batchRelativeModeByMesh.get(target.meshName);\n if (batchRelativeMode !== undefined && batchRelativeMode !== targetIsRelative) {\n throw new Error(`Cannot mix relative and absolute morph targets for mesh \"${target.meshName}\" in the same batch.`);\n }\n batchRelativeModeByMesh.set(target.meshName, targetIsRelative);\n }\n\n const staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n const result: Record<string, number> = {};\n const touchedMeshes = new Set<string>();\n\n try {\n for (const target of targets) {\n const index = this.applyMorphTargetDelta(target, options);\n touchedMeshes.add(target.meshName);\n result[`${target.meshName}:${target.name}`] = index;\n }\n } finally {\n if (touchedMeshes.size > 0) {\n this.refreshMorphTargets(Array.from(touchedMeshes));\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n }\n }\n\n return result;\n }\n\n ensureMorphInfluence(meshName: string, morphName: string): number {\n const mesh = this.requireNamedMesh(meshName);\n const dict = this.getMeshMorphDictionary(mesh);\n const existing = dict[morphName];\n if (existing !== undefined) return existing;\n\n const position = mesh.geometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot create morph target \"${morphName}\" on mesh \"${meshName}\": geometry has no position attribute.`);\n }\n\n return this.addMorphTarget({\n meshName,\n name: morphName,\n position: new Float32Array(position.count * position.itemSize),\n relative: true,\n });\n }\n\n refreshMorphTargets(_meshNames?: string[]): void {\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n\n if (this.model) {\n this.meshByName.clear();\n this.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n this.meshByName.set(obj.name, obj);\n }\n });\n this.meshes = collectMorphMeshes(this.model);\n }\n\n this.rebuildMorphTargetsCache();\n this.refreshHostNeutralModelDescriptor();\n this.hairPhysics.refreshMeshSelection();\n }\n\n /**\n * Set a morph target value.\n *\n * Fast paths (in order of speed):\n * 1. Pass pre-resolved { infl, idx } array directly - zero lookups\n * 2. String key with cache hit - one Map lookup\n * 3. String key cache miss - dictionary lookup, then cached for next time\n */\n setMorph(key: string, v: number, meshNames?: string[]): void;\n setMorph(key: string, v: number, targets: { infl: number[]; idx: number }[]): void;\n setMorph(\n key: string,\n v: number,\n meshNamesOrTargets?: string[] | { infl: number[]; idx: number }[]\n ): void {\n const val = clamp01(v);\n\n // Fast path: pre-resolved targets array (from transitionMorph)\n if (Array.isArray(meshNamesOrTargets) && meshNamesOrTargets.length > 0 && typeof meshNamesOrTargets[0] === 'object' && 'infl' in meshNamesOrTargets[0]) {\n const targets = meshNamesOrTargets as { infl: number[]; idx: number }[];\n this.applyMorphTargets(targets, val);\n return;\n }\n\n const meshNames = meshNamesOrTargets as string[] | undefined;\n const targets = this.resolveMorphTargets(key, meshNames);\n if (targets.length === 0) return;\n this.applyMorphTargets(targets, val);\n }\n\n setMorphInfluence(index: number, v: number, meshNames?: string[]): void {\n const val = clamp01(v);\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n if (targets.length === 0) return;\n this.applyMorphTargets(targets, val);\n }\n\n /**\n * Resolve morph key to direct targets for ultra-fast repeated access.\n * Use this when you need to set the same morph many times (e.g., in animation loops).\n */\n private resolveMorphTargetIndex(\n dict: Record<string, number> | undefined,\n key: string\n ): number | undefined {\n if (!dict) return undefined;\n\n const prefix = this.config.morphPrefix || '';\n const suffix = this.config.morphSuffix || '';\n const fullName = prefix + key + suffix;\n\n // Validation treats the configured full name as the source of truth, so runtime\n // mirrors that ordering and only accepts suffix-pattern variants after an exact hit.\n // We intentionally do not fall back to the bare key here because that would let a\n // prefixed profile appear valid at runtime while validation still reports a miss.\n const exactIndex = dict[fullName];\n if (exactIndex !== undefined) {\n return exactIndex;\n }\n\n const suffixRegex = this.config.suffixPattern\n ? new RegExp(this.config.suffixPattern)\n : null;\n if (!suffixRegex) {\n return undefined;\n }\n\n for (const [candidate, index] of Object.entries(dict)) {\n if (!candidate.startsWith(fullName)) continue;\n const candidateSuffix = candidate.slice(fullName.length);\n if (candidateSuffix === '' || suffixRegex.test(candidateSuffix)) {\n return index;\n }\n }\n\n return undefined;\n }\n\n resolveMorphTargets(key: string, meshNames?: string[]): { infl: number[]; idx: number }[] {\n // Cache key includes mesh names to avoid conflicts between face and hair morphs\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n const cacheKey = this.getMorphKeyCacheKey(key, meshNames);\n\n // Check cache first\n const cached = this.morphKeyCache.get(cacheKey);\n if (cached) return cached;\n\n // Resolve and cache\n const targets: { infl: number[]; idx: number }[] = [];\n\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) {\n targets.push({ infl, idx });\n }\n }\n\n if (targets.length > 0) {\n this.morphKeyCache.set(cacheKey, targets);\n }\n return targets;\n }\n\n resolveMorphTargetsByIndex(index: number, meshNames?: string[]): { infl: number[]; idx: number }[] {\n const idx = Number.isInteger(index) && index >= 0 ? index : null;\n if (idx === null) return [];\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n const cacheKey = this.getMorphIndexCacheKey(idx, meshNames);\n\n const cached = this.morphIndexCache.get(cacheKey);\n if (cached) return cached;\n\n const targets: { infl: number[]; idx: number }[] = [];\n\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const infl = mesh.morphTargetInfluences;\n if (!infl || idx >= infl.length) continue;\n targets.push({ infl, idx });\n }\n\n if (targets.length > 0) {\n this.morphIndexCache.set(cacheKey, targets);\n }\n return targets;\n }\n\n transitionMorph(key: string, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = meshNames?.length\n ? `morph_${this.getMorphKeyCacheKey(key, meshNames)}`\n : `morph_${this.getMorphKeyCacheKey(key)}`;\n const target = clamp01(to);\n\n // Pre-resolve targets once, then use direct access during animation\n const targets = this.resolveMorphTargets(key, meshNames);\n\n // Get \"from\" value from the resolved targets (more accurate for hair meshes)\n const from = targets.length > 0 ? (targets[0].infl[targets[0].idx] ?? 0) : this.getMorphValue(key);\n\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => {\n // Ultra-fast path: direct array access, no lookups\n const val = clamp01(value);\n this.applyMorphTargets(targets, val);\n });\n }\n\n transitionMorphInfluence(index: number, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = meshNames?.length\n ? `morph_${this.getMorphIndexCacheKey(index, meshNames)}`\n : `morph_${this.getMorphIndexCacheKey(index)}`;\n const target = clamp01(to);\n\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n const from = targets.length > 0 ? (targets[0].infl[targets[0].idx] ?? 0) : this.getMorphValueByIndex(index);\n\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => {\n const val = clamp01(value);\n this.applyMorphTargets(targets, val);\n });\n }\n\n // ============================================================================\n // VISEME CONTROL\n // ============================================================================\n\n setViseme(visemeIndex: number, value: number, jawScale = 1.0): void {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) return;\n\n const val = clamp01(value);\n this.visemeValues[visemeIndex] = val;\n this.visemeJawScales[visemeIndex] = jawScale;\n this.applyVisemeRuntimeState();\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n\n const target = clamp01(to);\n const from = this.visemeValues[visemeIndex] ?? 0;\n this.visemeJawScales[visemeIndex] = jawScale;\n\n if (this.wasmRuntimeCore) {\n this.visemeValues[visemeIndex] = target;\n this.wasmRuntimeCore.transitionViseme(visemeIndex, target, durationMs, jawScale);\n if (durationMs <= 0) {\n this.applyLiveFrameDelta();\n }\n return RESOLVED_TRANSITION_HANDLE;\n }\n\n return this.animation.addTransition(\n `viseme_value_${visemeIndex}`,\n from,\n target,\n durationMs,\n (value) => {\n this.visemeValues[visemeIndex] = clamp01(value);\n this.visemeJawScales[visemeIndex] = jawScale;\n this.applyVisemeRuntimeState();\n }\n );\n }\n\n setVisemeById(slotId: string, value: number, jawScale = 1.0): void {\n const index = getVisemeSlotIndex(this.config, slotId);\n if (index < 0) return;\n this.setViseme(index, value, jawScale);\n }\n\n transitionVisemeById(slotId: string, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n const index = getVisemeSlotIndex(this.config, slotId);\n if (index < 0) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n return this.transitionViseme(index, to, durationMs, jawScale);\n }\n\n // ============================================================================\n // MIX WEIGHT CONTROL\n // ============================================================================\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n this.wasmRuntimeCore?.setAUMixWeight(id, weight);\n const v = this.auValues[id] ?? 0;\n if (v > 0) this.setAU(id, v);\n\n const boneBindings = this.config.auToBones[id];\n if (boneBindings) {\n for (const binding of boneBindings) {\n this.pendingCompositeNodes.add(binding.node);\n }\n }\n }\n\n getAUMixWeight(id: number): number {\n return this.mixWeights[id] ?? this.config.auMixDefaults?.[id] ?? 1.0;\n }\n\n /**\n * Check if an AU has bilateral bone bindings (left + right side hints).\n * Used to determine if a balance slider should be shown for bone-only bilateral AUs.\n */\n hasLeftRightBones(auId: number): boolean {\n const bindings = this.config.auToBones[auId] || [];\n const hasLeft = bindings.some((binding) => binding.side === 'left');\n const hasRight = bindings.some((binding) => binding.side === 'right');\n return hasLeft && hasRight;\n }\n\n // ============================================================================\n // PLAYBACK CONTROL\n // ============================================================================\n\n pause(): void { this.isPaused = true; }\n resume(): void { this.isPaused = false; }\n getPaused(): boolean { return this.isPaused; }\n clearTransitions(): void {\n this.animation.clearTransitions();\n this.wasmRuntimeCore?.clearTransitions();\n }\n getActiveTransitionCount(): number {\n return this.animation.getActiveTransitionCount() + (this.wasmRuntimeCore?.activeTransitionCount() ?? 0);\n }\n\n resetToNeutral(): void {\n this.auValues = {};\n const visemeCount = getProfileVisemeSlots(this.config).length;\n this.visemeValues = new Array(visemeCount).fill(0);\n this.visemeJawScales = new Array(visemeCount).fill(1);\n this.translations = {};\n this.initBoneRotations();\n this.clearTransitions();\n this.wasmRuntimeCore?.clear();\n\n const morphTargetsToReset: MorphTargetHandle[] = [];\n for (const m of this.meshes) {\n const infl = m.morphTargetInfluences;\n if (!infl) continue;\n for (let i = 0; i < infl.length; i++) {\n morphTargetsToReset.push({ infl, idx: i });\n }\n }\n this.frameApplier.resetMorphTargets(morphTargetsToReset);\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n }\n\n private reinitializeRuntimeStateFromCurrentControls(staleMorphTargets: MorphTargetHandle[] = []): void {\n this.clearTransitions();\n this.resetMorphTargetHandles(staleMorphTargets);\n this.translations = {};\n this.initBoneRotations();\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n\n for (const [auIdStr, value] of Object.entries(this.auValues)) {\n if (value <= 0) continue;\n const auId = Number(auIdStr);\n if (Number.isNaN(auId)) continue;\n this.setAU(auId, value, this.auBalances[auId]);\n }\n\n this.applyVisemeRuntimeState();\n\n if (this.model) {\n this.flushPendingComposites();\n this.model.updateMatrixWorld(true);\n }\n }\n\n private reapplyProceduralStateAfterBakedUpdate(): void {\n if (!this.model) {\n return;\n }\n\n let hasActiveOverrides = false;\n\n for (const [auIdStr, value] of Object.entries(this.auValues)) {\n if (value <= 0) continue;\n const auId = Number(auIdStr);\n if (Number.isNaN(auId)) continue;\n hasActiveOverrides = true;\n this.setAU(auId, value, this.auBalances[auId]);\n }\n\n for (let visemeIndex = 0; visemeIndex < this.visemeValues.length; visemeIndex += 1) {\n const value = this.visemeValues[visemeIndex] ?? 0;\n if (value <= 0) continue;\n hasActiveOverrides = true;\n this.setViseme(visemeIndex, value, this.visemeJawScales[visemeIndex] ?? 1);\n }\n\n if (!hasActiveOverrides) {\n return;\n }\n\n this.flushPendingComposites();\n this.model.updateMatrixWorld(true);\n }\n\n // ============================================================================\n // MESH CONTROL\n // ============================================================================\n\n getMeshList(): MeshInfo[] {\n if (!this.model) return [];\n const result: MeshInfo[] = [];\n this.model.traverse((obj: any) => {\n if (obj.isMesh) {\n const meshInfo = CC4_MESHES[obj.name];\n result.push({\n name: obj.name,\n visible: obj.visible,\n morphCount: obj.morphTargetInfluences?.length || 0,\n category: meshInfo?.category || 'other',\n });\n }\n });\n return result;\n }\n\n /** Get all morph targets grouped by mesh name */\n getMorphTargets(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n if (dict) {\n result[mesh.name] = Object.keys(dict).sort();\n }\n }\n return result;\n }\n\n /** Get morph target indices mapped to labels for each mesh */\n getMorphTargetIndices(): Record<string, { index: number; name: string }[]> {\n const result: Record<string, { index: number; name: string }[]> = {};\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n if (!dict) continue;\n\n const entries = Object.entries(dict).map(([name, index]) => ({\n name,\n index,\n }));\n\n entries.sort((a, b) => a.index - b.index);\n result[mesh.name] = entries;\n }\n return result;\n }\n\n /** Get all resolved bone names and their current transforms */\n getBones(): Record<string, { position: [number, number, number]; rotation: [number, number, number] }> {\n const result: Record<string, { position: [number, number, number]; rotation: [number, number, number] }> = {};\n for (const name of Object.keys(this.bones)) {\n const entry = this.bones[name];\n if (entry) {\n const pos = entry.obj.position;\n const rot = entry.obj.rotation;\n result[name] = {\n position: [pos.x, pos.y, pos.z],\n rotation: [rot.x * 180 / Math.PI, rot.y * 180 / Math.PI, rot.z * 180 / Math.PI],\n };\n }\n }\n return result;\n }\n\n setMeshVisible(meshName: string, visible: boolean): void {\n if (!this.model) return;\n this.frameApplier.setMeshVisible(this.model, meshName, visible);\n }\n\n /**\n * Highlight a mesh with an emissive glow effect\n * @param meshName - Name of the mesh to highlight (null to clear all highlights)\n * @param color - Highlight color (default: cyan 0x00ffff)\n * @param intensity - Emissive intensity (default: 0.5)\n */\n highlightMesh(meshName: string | null, color: number = 0x00ffff, intensity: number = 0.5): void {\n if (!this.model) return;\n this.frameApplier.highlightMesh(this.model, meshName, color, intensity);\n }\n\n /** Get material config for a mesh */\n getMeshMaterialConfig(meshName: string): ThreeResolvedMaterialConfig | null {\n if (!this.model) return null;\n return this.frameApplier.getMeshMaterialConfig(this.model, meshName);\n }\n\n /** Set material config for a mesh */\n setMeshMaterialConfig(meshName: string, config: ThreeMaterialConfig): void {\n if (!this.model) return;\n this.frameApplier.setMeshMaterialConfig(this.model, meshName, config);\n }\n\n // ============================================================================\n // CONFIGURATION\n // ============================================================================\n\n private applyHairPhysicsProfileConfig(): void {\n this.hairPhysics.setHairPhysicsProfileConfig(this.config.hairPhysics);\n }\n\n setProfile(profile: Profile): void {\n this.config = profile;\n this.compositeRotations = this.config.compositeRotations || CC4_COMPOSITE_ROTATIONS;\n this.auToCompositeMap = buildAUToCompositeMap(this.compositeRotations);\n this.mixWeights = { ...profile.auMixDefaults };\n this.syncVisemeRuntimeState();\n let staleMorphTargets: MorphTargetHandle[] = [];\n if (this.model) {\n staleMorphTargets = this.collectResolvedExpressionMorphTargets();\n this.bones = this.resolveBones(this.model);\n this.missingBoneWarnings.clear();\n this.rebuildMorphTargetsCache();\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n this.frameApplier.applyObjectTransform(entry.obj, {\n position: { x: entry.basePos.x, y: entry.basePos.y, z: entry.basePos.z },\n rotation: {\n x: entry.baseQuat.x,\n y: entry.baseQuat.y,\n z: entry.baseQuat.z,\n w: entry.baseQuat.w,\n },\n });\n });\n this.wasmRuntimeCore?.setProfile(this.config);\n this.refreshHostNeutralModelDescriptor();\n }\n this.hairPhysics.refreshMeshSelection();\n this.applyHairPhysicsProfileConfig();\n this.reinitializeRuntimeStateFromCurrentControls(staleMorphTargets);\n }\n\n getProfile(): Profile { return this.config; }\n\n /**\n * Get the mesh names that should receive morph influences for a given AU.\n * Routing is driven by `auFacePartToMeshCategory` in profile config.\n */\n getMeshNamesForAU(auId: number): string[] {\n return getMeshNamesForAUProfile(this.config, auId);\n }\n\n getMeshNamesForViseme(): string[] {\n return getMeshNamesForVisemeProfile(this.config);\n }\n\n // ============================================================================\n // HAIR PHYSICS\n // ============================================================================\n\n registerHairObjects(objects: Object3D[]): Array<{ name: string; isMesh: boolean; isEyebrow: boolean }> {\n return this.hairPhysics.registerHairObjects(objects);\n }\n\n getRegisteredHairObjects(): Mesh[] {\n return this.hairPhysics.getRegisteredHairObjects();\n }\n\n setHairPhysicsEnabled(enabled: boolean): void {\n this.hairPhysics.setHairPhysicsEnabled(enabled);\n if (enabled) {\n const head = this.getHeadRotation();\n this.hairPhysics.onHeadRotationChanged(head.yaw, head.pitch);\n }\n }\n\n isHairPhysicsEnabled(): boolean {\n return this.hairPhysics.isHairPhysicsEnabled();\n }\n\n setHairPhysicsConfig(config: HairPhysicsConfigUpdate): void {\n this.hairPhysics.setHairPhysicsConfig(config);\n }\n\n getHairPhysicsConfig(): HairPhysicsConfig {\n return this.hairPhysics.getHairPhysicsConfig();\n }\n\n validateHairMorphTargets(): string[] {\n return this.hairPhysics.validateHairMorphTargets();\n }\n\n /** Get head rotation values for hair physics (range -1 to 1) */\n getHeadRotation(): { yaw: number; pitch: number; roll: number } {\n const headNodeKey = this.getHeadBoneNodeKey();\n const headRotation = this.rotations[headNodeKey] ?? this.rotations.HEAD;\n return {\n yaw: headRotation?.yaw ?? 0,\n pitch: headRotation?.pitch ?? 0,\n roll: headRotation?.roll ?? 0,\n };\n }\n\n updateHairPhysics(dt: number): void {\n this.hairPhysics.update(dt);\n }\n\n getHairMorphTargets(meshName?: string): string[] {\n return this.hairPhysics.getHairMorphTargets(meshName);\n }\n\n setMorphOnMeshes(meshNames: string[], morphKey: string, value: number): void {\n this.hairPhysics.setMorphOnMeshes(meshNames, morphKey, value);\n }\n\n applyHairStateToObject(objectName: string, state: {\n color?: { baseColor: string; emissive: string; emissiveIntensity: number };\n outline?: { show: boolean; color: string; opacity: number };\n visible?: boolean;\n scale?: { x: number; y: number; z: number };\n position?: { x: number; y: number; z: number };\n isEyebrow?: boolean;\n }): void {\n this.hairPhysics.applyHairStateToObject(objectName, state);\n }\n\n getHairAppearance() {\n return this.hairPhysics.getHairAppearance();\n }\n\n setHairColor(color: Parameters<HairPhysicsController['setHairColor']>[0]): void {\n this.hairPhysics.setHairColor(color);\n }\n\n setEyebrowColor(color: Parameters<HairPhysicsController['setEyebrowColor']>[0]): void {\n this.hairPhysics.setEyebrowColor(color);\n }\n\n setHairBaseColor(baseColor: string): void {\n this.hairPhysics.setHairBaseColor(baseColor);\n }\n\n setEyebrowBaseColor(baseColor: string): void {\n this.hairPhysics.setEyebrowBaseColor(baseColor);\n }\n\n setHairGlow(emissive: string, intensity: number): void {\n this.hairPhysics.setHairGlow(emissive, intensity);\n }\n\n setEyebrowGlow(emissive: string, intensity: number): void {\n this.hairPhysics.setEyebrowGlow(emissive, intensity);\n }\n\n setHairOutline(outline: { show: boolean; color?: string; opacity?: number }): void {\n this.hairPhysics.setHairOutline(outline);\n }\n\n // ============================================================================\n // PRIVATE METHODS\n // ============================================================================\n\n private computeSideValues(base: number, balance?: number): { left: number; right: number } {\n const b = Math.max(-1, Math.min(1, balance ?? 0));\n if (b === 0) return { left: base, right: base };\n if (b < 0) return { left: base, right: base * (1 + b) };\n return { left: base * (1 - b), right: base };\n }\n\n private getAUMorphsBySide(\n auId: number\n ): { left: MorphTargetRef[]; right: MorphTargetRef[]; center: MorphTargetRef[] } {\n const entry = this.config.auToMorphs[auId];\n return {\n left: entry ? [...entry.left] : [],\n right: entry ? [...entry.right] : [],\n center: entry ? [...entry.center] : [],\n };\n }\n\n private applyMorphTargets(targets: MorphTargetHandle[], val: number): void {\n this.frameApplier.applyMorphTargets(targets, val);\n }\n\n private applyVisemeRuntimeState(): void {\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n this.wasmRuntimeCore?.setViseme(index, this.visemeValues[index] ?? 0, this.visemeJawScales[index] ?? 1);\n }\n\n const appliedViaFrame = this.applyLiveFrameDelta();\n if (!appliedViaFrame) {\n for (const targets of this.resolvedVisemeTargets) {\n this.frameApplier.resetMorphTargets(targets || []);\n }\n\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const targets = this.resolvedVisemeTargets[index] || [];\n for (const target of targets) {\n if (target.idx >= target.infl.length) continue;\n const weighted = clamp01(value * target.weight);\n this.frameApplier.applyMorphTargets(\n [target],\n Math.max(target.infl[target.idx] ?? 0, weighted)\n );\n }\n }\n }\n\n if (!appliedViaFrame) {\n this.updateBoneRotation(this.getJawBoneNodeKey(), 'pitch', this.getActiveVisemeJawAmount());\n }\n }\n\n private getJawBoneNodeKey(): BoneKey {\n const candidates = [\n this.config.auToBones[103]?.[0]?.node,\n this.config.auToBones[26]?.[0]?.node,\n 'JAW',\n ].filter((node): node is BoneKey => !!node);\n return candidates.find((node) => !!this.bones[node])\n ?? candidates[0]\n ?? 'JAW';\n }\n\n private getHeadBoneNodeKey(): BoneKey {\n const candidates = [\n this.config.auToBones[51]?.[0]?.node,\n this.config.auToBones[52]?.[0]?.node,\n this.compositeRotations.find((composite) => (\n composite.yaw?.aus.includes(51)\n || composite.yaw?.aus.includes(52)\n || composite.pitch?.aus.includes(53)\n || composite.pitch?.aus.includes(54)\n || composite.roll?.aus.includes(55)\n || composite.roll?.aus.includes(56)\n ))?.node\n ?? null,\n 'HEAD',\n ].filter((node): node is BoneKey => !!node);\n return candidates.find((node) => !!this.bones[node])\n ?? candidates[0]\n ?? 'HEAD';\n }\n\n private getActiveVisemeJawAmount(): number {\n let jawAmount = 0;\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const jawScale = this.visemeJawScales[index] ?? 1;\n if (Math.abs(jawScale) <= 1e-6) continue;\n jawAmount = Math.max(jawAmount, this.getVisemeJawAmount(index) * value * jawScale);\n }\n return jawAmount;\n }\n\n private getMorphValue(key: string): number {\n if (this.faceMesh) {\n const dict = this.faceMesh.morphTargetDictionary;\n const infl = this.faceMesh.morphTargetInfluences;\n if (dict && infl) {\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = this.resolveMorphTargetIndex(dict as Record<string, number>, key);\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private getMorphValueForMeshes(key: string, meshNames?: string[]): number {\n const targets = this.resolveMorphTargets(key, meshNames);\n if (targets.length > 0) {\n return targets[0].infl[targets[0].idx] ?? 0;\n }\n return this.getMorphValue(key);\n }\n\n private getMorphValueByIndex(index: number): number {\n const idx = Number.isInteger(index) && index >= 0 ? index : null;\n if (idx === null) return 0;\n if (this.faceMesh) {\n const infl = this.faceMesh.morphTargetInfluences;\n if (infl && idx < infl.length) {\n return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const infl = mesh.morphTargetInfluences;\n if (!infl) continue;\n if (idx < infl.length) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private getMorphValueByIndexForMeshes(index: number, meshNames?: string[]): number {\n const targets = this.resolveMorphTargetsByIndex(index, meshNames);\n if (targets.length > 0) {\n return targets[0].infl[targets[0].idx] ?? 0;\n }\n return this.getMorphValueByIndex(index);\n }\n\n private validateMorphTargetDelta(target: MorphTargetDelta, options: AddMorphTargetOptions): void {\n const mesh = this.requireNamedMesh(target.meshName);\n const geometry = mesh.geometry;\n const position = geometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot add morph target \"${target.name}\" to mesh \"${target.meshName}\": geometry has no position attribute.`);\n }\n if (!target.name || !target.name.trim()) {\n throw new Error(`Cannot add morph target to mesh \"${target.meshName}\": target name is required.`);\n }\n\n const existingIndex = this.getMeshMorphDictionary(mesh)[target.name];\n if (existingIndex !== undefined && options.replace !== true) {\n throw new Error(`Morph target \"${target.name}\" already exists on mesh \"${target.meshName}\". Pass replace: true to overwrite it.`);\n }\n\n this.assertMorphAttributeDataLength(target.name, 'position', target.position, position.itemSize, position.count);\n const normal = geometry.getAttribute('normal');\n if (target.normal) {\n this.assertMorphAttributeDataLength(target.name, 'normal', target.normal, normal?.itemSize ?? 3, position.count);\n }\n const tangent = geometry.getAttribute('tangent');\n if (target.tangent) {\n this.assertMorphAttributeDataLength(target.name, 'tangent', target.tangent, tangent?.itemSize ?? 4, position.count);\n }\n this.assertCompatibleMorphTargetMode(geometry, target);\n }\n\n private applyMorphTargetDelta(target: MorphTargetDelta, options: AddMorphTargetOptions): number {\n const mesh = this.requireNamedMesh(target.meshName);\n const sourceGeometry = mesh.geometry;\n const position = sourceGeometry.getAttribute('position');\n if (!position) {\n throw new Error(`Cannot add morph target \"${target.name}\" to mesh \"${target.meshName}\": geometry has no position attribute.`);\n }\n if (!target.name || !target.name.trim()) {\n throw new Error(`Cannot add morph target to mesh \"${target.meshName}\": target name is required.`);\n }\n\n const replace = options.replace === true;\n const resetInfluence = options.resetInfluence !== false;\n const forceGeometryReplacement = options.forceGeometryReplacement !== false;\n const previousInfluences = mesh.morphTargetInfluences ? [...mesh.morphTargetInfluences] : [];\n const previousDictionary = this.getMeshMorphDictionary(mesh);\n const existingIndex = previousDictionary[target.name];\n\n if (existingIndex !== undefined && !replace) {\n throw new Error(`Morph target \"${target.name}\" already exists on mesh \"${target.meshName}\". Pass replace: true to overwrite it.`);\n }\n this.assertCompatibleMorphTargetMode(sourceGeometry, target);\n\n const geometry = forceGeometryReplacement ? sourceGeometry.clone() : sourceGeometry;\n const dictionary = { ...previousDictionary };\n const usedIndices = Object.values(dictionary).filter(Number.isInteger);\n const existingAttributeTargetCount = Math.max(\n 0,\n ...Object.values(geometry.morphAttributes).map((attributes) => attributes?.length ?? 0)\n );\n const nextIndex = Math.max(existingAttributeTargetCount, usedIndices.length ? Math.max(...usedIndices) + 1 : 0);\n const index = existingIndex ?? nextIndex;\n dictionary[target.name] = index;\n\n this.setMorphAttributeAtIndex(geometry, 'position', target.position, position.itemSize, position.count, index, target.name);\n\n const normal = geometry.getAttribute('normal');\n if (target.normal) {\n this.setMorphAttributeAtIndex(geometry, 'normal', target.normal, normal?.itemSize ?? 3, position.count, index, target.name);\n } else {\n this.setZeroMorphAttributeAtIndex(geometry, 'normal', normal?.itemSize ?? 3, position.count, index, target.name);\n }\n\n const tangent = geometry.getAttribute('tangent');\n if (target.tangent) {\n this.setMorphAttributeAtIndex(geometry, 'tangent', target.tangent, tangent?.itemSize ?? 4, position.count, index, target.name);\n } else {\n this.setZeroMorphAttributeAtIndex(geometry, 'tangent', tangent?.itemSize ?? 4, position.count, index, target.name);\n }\n const color = geometry.getAttribute('color');\n const existingColorMorph = geometry.morphAttributes.color?.find(Boolean);\n this.setZeroMorphAttributeAtIndex(\n geometry,\n 'color',\n color?.itemSize ?? existingColorMorph?.itemSize ?? 3,\n position.count,\n index,\n target.name\n );\n\n geometry.morphTargetsRelative = target.relative !== false;\n (geometry as any).morphTargetDictionary = dictionary;\n\n if (forceGeometryReplacement) {\n mesh.geometry = geometry;\n sourceGeometry.dispose();\n }\n\n const influenceLength = Math.max(previousInfluences.length, index + 1);\n const influences = previousInfluences.slice(0, influenceLength);\n while (influences.length < influenceLength) {\n influences.push(0);\n }\n if (resetInfluence) {\n influences[index] = 0;\n }\n\n mesh.morphTargetDictionary = dictionary;\n mesh.morphTargetInfluences = influences;\n this.addRuntimeMorphMesh(mesh);\n\n if (!this.config.morphToMesh?.face?.length) {\n this.config.morphToMesh = {\n ...this.config.morphToMesh,\n face: [mesh.name],\n };\n }\n\n return index;\n }\n\n private requireNamedMesh(meshName: string): Mesh {\n const mesh = this.meshByName.get(meshName);\n if (mesh) return mesh;\n\n if (this.model) {\n let found: Mesh | null = null;\n this.model.traverse((obj: any) => {\n if (!found && obj.isMesh && obj.name === meshName) {\n found = obj as Mesh;\n }\n });\n if (found) {\n this.meshByName.set(meshName, found);\n return found;\n }\n }\n\n throw new Error(`Mesh \"${meshName}\" was not found in the current model.`);\n }\n\n private getMeshMorphDictionary(mesh: Mesh): Record<string, number> {\n const meshDictionary = mesh.morphTargetDictionary as Record<string, number> | undefined;\n const geometryDictionary = (mesh.geometry as any).morphTargetDictionary as Record<string, number> | undefined;\n const dictionary = meshDictionary || geometryDictionary || {};\n mesh.morphTargetDictionary = dictionary;\n (mesh.geometry as any).morphTargetDictionary = dictionary;\n return dictionary;\n }\n\n private assertMorphAttributeDataLength(\n name: string,\n semantic: string,\n data: Float32Array | number[],\n itemSize: number,\n vertexCount: number\n ): void {\n const expectedLength = vertexCount * itemSize;\n if (data.length !== expectedLength) {\n throw new Error(\n `Morph target \"${name}\" ${semantic} data has ${data.length} values; expected ${expectedLength} ` +\n `(${vertexCount} vertices * itemSize ${itemSize}).`\n );\n }\n }\n\n private assertCompatibleMorphTargetMode(geometry: Mesh['geometry'], target: MorphTargetDelta): void {\n const hasExistingMorphTargets = Object.values(geometry.morphAttributes).some((attributes) => (attributes?.length ?? 0) > 0);\n if (!hasExistingMorphTargets) return;\n\n const targetIsRelative = target.relative !== false;\n if (geometry.morphTargetsRelative !== targetIsRelative) {\n const existingMode = geometry.morphTargetsRelative ? 'relative' : 'absolute';\n const targetMode = targetIsRelative ? 'relative' : 'absolute';\n throw new Error(\n `Cannot add ${targetMode} morph target \"${target.name}\" to mesh \"${target.meshName}\" because existing morph targets are ${existingMode}.`\n );\n }\n }\n\n private setMorphAttributeAtIndex(\n geometry: Mesh['geometry'],\n semantic: string,\n data: Float32Array | number[],\n itemSize: number,\n vertexCount: number,\n index: number,\n name: string\n ): void {\n this.assertMorphAttributeDataLength(name, semantic, data, itemSize, vertexCount);\n\n const expectedLength = vertexCount * itemSize;\n const attributes = geometry.morphAttributes[semantic] ? [...geometry.morphAttributes[semantic]] : [];\n while (attributes.length < index) {\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = `morph_${attributes.length}`;\n attributes.push(empty);\n }\n\n const values = data instanceof Float32Array ? new Float32Array(data) : Float32Array.from(data);\n const attribute = new BufferAttribute(values, itemSize);\n (attribute as any).name = name;\n attributes[index] = attribute;\n geometry.morphAttributes[semantic] = attributes;\n }\n\n private setZeroMorphAttributeAtIndex(\n geometry: Mesh['geometry'],\n semantic: string,\n itemSize: number,\n vertexCount: number,\n index: number,\n name: string\n ): void {\n if (!geometry.morphAttributes[semantic]?.length) return;\n\n const expectedLength = vertexCount * itemSize;\n const attributes = [...geometry.morphAttributes[semantic]];\n while (attributes.length < index) {\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = `morph_${attributes.length}`;\n attributes.push(empty);\n }\n\n const empty = new BufferAttribute(new Float32Array(expectedLength), itemSize);\n (empty as any).name = name;\n attributes[index] = empty;\n geometry.morphAttributes[semantic] = attributes;\n }\n\n private addRuntimeMorphMesh(mesh: Mesh): void {\n const key = mesh.name || (mesh as any).uuid;\n const exists = this.meshes.some((candidate) => (candidate.name || (candidate as any).uuid) === key);\n if (!exists) {\n this.meshes.push(mesh);\n }\n }\n\n private getMorphKeyCacheKey(key: string, meshNames?: string[]): string {\n return meshNames?.length ? `key:${key}@${meshNames.join(',')}` : `key:${key}`;\n }\n\n private getMorphIndexCacheKey(index: number, meshNames?: string[]): string {\n return meshNames?.length ? `idx:${index}@${meshNames.join(',')}` : `idx:${index}`;\n }\n\n private syncVisemeRuntimeState(): void {\n const visemeCount = getProfileVisemeSlots(this.config).length;\n this.visemeValues = Array.from(\n { length: visemeCount },\n (_, index) => this.visemeValues[index] ?? 0\n );\n this.visemeJawScales = Array.from(\n { length: visemeCount },\n (_, index) => this.visemeJawScales[index] ?? 1\n );\n }\n\n private getVisemeJawAmount(visemeIndex: number): number {\n return getVisemeJawAmounts(this.config)?.[visemeIndex]\n ?? this.config.visemeJawAmounts?.[visemeIndex]\n ?? Embody.VISEME_JAW_AMOUNTS[visemeIndex]\n ?? 0;\n }\n\n private collectResolvedExpressionMorphTargets(): MorphTargetHandle[] {\n const targets: MorphTargetHandle[] = [];\n\n for (const resolved of this.resolvedAUMorphTargets.values()) {\n targets.push(...resolved.left, ...resolved.right, ...resolved.center);\n }\n\n for (const resolved of this.resolvedVisemeTargets) {\n if (resolved?.length) {\n targets.push(...resolved);\n }\n }\n\n return targets;\n }\n\n private resetMorphTargetHandles(targets: MorphTargetHandle[]): void {\n this.frameApplier.resetMorphTargets(targets);\n }\n\n private isMixedAU(id: number): boolean {\n const morphs = this.config.auToMorphs[id];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && this.config.auToBones[id]?.length);\n }\n\n private getEffectiveBoneAUValue(auId: number, nodeKey: string): number {\n const rawValue = clamp01(this.auValues[auId] ?? 0);\n if (rawValue <= 1e-6) return 0;\n\n const binding = this.config.auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n\n return rawValue * getSideScale(this.auBalances[auId] ?? 0, binding.side);\n }\n\n private getCompositeAxisValueForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined\n ): number {\n return getCompositeAxisValue(axisConfig, (auId: number) => this.getEffectiveBoneAUValue(auId, nodeKey));\n }\n\n private getCompositeAxisBindingForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined,\n direction: number\n ) {\n return getCompositeAxisBinding(\n nodeKey,\n axisConfig,\n direction,\n (auId: number) => this.getEffectiveBoneAUValue(auId, nodeKey),\n this.config.auToBones\n );\n }\n\n private initBoneRotations(): void {\n this.rotations = {};\n this.pendingCompositeNodes.clear();\n\n const allBoneKeys = Array.from(\n new Set(Object.values(this.config.auToBones).flat().map((binding) => binding.node))\n );\n\n for (const node of allBoneKeys) {\n this.rotations[node] = { pitch: 0, yaw: 0, roll: 0 };\n this.pendingCompositeNodes.add(node);\n }\n }\n\n /** Update rotation state - just stores -1 to 1 value like stable version */\n private updateBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', value: number): void {\n if (!this.rotations[nodeKey]) return;\n this.rotations[nodeKey][axis] = Math.max(-1, Math.min(1, value));\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private updateBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', value: number, maxUnits: number): void {\n if (!this.translations[nodeKey]) this.translations[nodeKey] = { x: 0, y: 0, z: 0 };\n const clamped = Math.max(-1, Math.min(1, value));\n const offset = clamped * maxUnits;\n if (channel === 'tx') this.translations[nodeKey].x = offset;\n else if (channel === 'ty') this.translations[nodeKey].y = offset;\n else this.translations[nodeKey].z = offset;\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private transitionBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', to: number, durationMs = 200): TransitionHandle {\n const transitionKey = `bone_${nodeKey}_${axis}`;\n const from = this.rotations[nodeKey]?.[axis] ?? 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneRotation(nodeKey, axis, value));\n }\n\n private transitionBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', to: number, maxUnits: number, durationMs = 200): TransitionHandle {\n const transitionKey = `boneT_${nodeKey}_${channel}`;\n const current = this.translations[nodeKey] || { x: 0, y: 0, z: 0 };\n const currentOffset = channel === 'tx' ? current.x : channel === 'ty' ? current.y : current.z;\n const from = maxUnits !== 0 ? Math.max(-1, Math.min(1, currentOffset / maxUnits)) : 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneTranslation(nodeKey, channel, value, maxUnits));\n }\n\n private flushPendingComposites(): void {\n if (this.pendingCompositeNodes.size === 0) return;\n\n const headNodeKey = this.getHeadBoneNodeKey();\n const headChanged = this.pendingCompositeNodes.has(headNodeKey) || this.pendingCompositeNodes.has('HEAD');\n\n for (const nodeKey of this.pendingCompositeNodes) {\n this.applyCompositeRotation(nodeKey as BoneKey);\n }\n this.pendingCompositeNodes.clear();\n\n // Update hair when head rotation changes\n if (headChanged && this.hairPhysics.isHairPhysicsEnabled()) {\n const headRotation = this.rotations[headNodeKey] ?? this.rotations.HEAD;\n this.hairPhysics.onHeadRotationChanged(\n headRotation?.yaw ?? 0,\n headRotation?.pitch ?? 0\n );\n }\n }\n\n /**\n * Apply composite rotation using quaternion composition like stable version.\n * Looks up maxDegrees and channel from BONE_AU_TO_BINDINGS.\n */\n private applyCompositeRotation(nodeKey: BoneKey): void {\n const entry = this.bones[nodeKey];\n if (!entry || !this.model) {\n if (!entry && this.rigReady && !this.missingBoneWarnings.has(nodeKey)) {\n this.missingBoneWarnings.add(nodeKey);\n }\n return;\n }\n\n const { obj, basePos, baseQuat } = entry;\n const rotState = this.rotations[nodeKey];\n if (!rotState) {\n return;\n }\n\n // Find the composite rotation config for this node\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) {\n return;\n }\n\n // Helper to get Vector3 axis from channel\n const getAxis = (channel: 'rx' | 'ry' | 'rz') =>\n channel === 'rx' ? X_AXIS : channel === 'ry' ? Y_AXIS : Z_AXIS;\n\n // Build composite quaternion from base\n const compositeQ = new Quaternion().copy(baseQuat);\n\n // Apply yaw rotation\n if (config.yaw && rotState.yaw !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.yaw, rotState.yaw);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.yaw) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n // Apply pitch rotation\n if (config.pitch && rotState.pitch !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.pitch, rotState.pitch);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.pitch) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n // Apply roll rotation\n if (config.roll && rotState.roll !== 0) {\n const binding = this.getCompositeAxisBindingForNode(nodeKey, config.roll, rotState.roll);\n if (binding?.maxDegrees && binding.channel) {\n const radians = deg2rad(binding.maxDegrees) * Math.abs(rotState.roll) * binding.scale;\n const axis = getAxis(binding.channel as 'rx' | 'ry' | 'rz');\n const deltaQ = new Quaternion().setFromAxisAngle(axis, radians);\n compositeQ.multiply(deltaQ);\n }\n }\n\n const t = this.translations[nodeKey];\n this.frameApplier.applyObjectTransform(obj, {\n position: {\n x: basePos.x + (t?.x ?? 0),\n y: basePos.y + (t?.y ?? 0),\n z: basePos.z + (t?.z ?? 0),\n },\n rotation: {\n x: compositeQ.x,\n y: compositeQ.y,\n z: compositeQ.z,\n w: compositeQ.w,\n },\n });\n this.model.updateMatrixWorld(true);\n }\n\n private resolveBones(root: Object3D): ResolvedBones {\n const resolved: ResolvedBones = {};\n const previousBones = this.bones;\n\n const snapshot = (obj: any): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const snapshotPreservingBasePose = (obj: Object3D): NodeBase => {\n const existing = Object.values(previousBones).find((entry) => entry?.obj === obj);\n if (!existing) {\n return snapshot(obj);\n }\n\n return {\n obj,\n basePos: { ...existing.basePos },\n baseQuat: existing.baseQuat.clone(),\n baseEuler: { ...existing.baseEuler },\n };\n };\n\n // Build suffix regex from config pattern\n const prefix = this.config.bonePrefix || '';\n const suffix = this.config.boneSuffix || '';\n const suffixRegex = this.config.suffixPattern\n ? new RegExp(this.config.suffixPattern)\n : null;\n\n const findNode = (baseName?: string | null): Object3D | undefined => {\n if (!baseName) return undefined;\n\n const directMatch = root.getObjectByName(baseName);\n if (directMatch) return directMatch;\n\n const prefixedBase = prefix && !baseName.startsWith(prefix)\n ? `${prefix}${baseName}`\n : baseName;\n const fullName = suffix && !prefixedBase.endsWith(suffix)\n ? `${prefixedBase}${suffix}`\n : prefixedBase;\n\n const exactMatch = root.getObjectByName(fullName);\n if (exactMatch) return exactMatch;\n\n // Try fuzzy match with suffix pattern if configured\n if (suffixRegex) {\n let found: Object3D | undefined;\n root.traverse((obj: any) => {\n if (found) return; // Already found\n if (obj.name && obj.name.startsWith(fullName)) {\n const suffix = obj.name.slice(fullName.length);\n // Match if suffix is empty or matches the pattern\n if (suffix === '' || suffixRegex.test(suffix)) {\n found = obj;\n }\n }\n });\n if (found) return found;\n }\n\n return undefined;\n };\n\n const addResolvedBone = (key: string, node: Object3D) => {\n const entry = snapshotPreservingBasePose(node);\n resolved[key] = entry;\n if (node.name) {\n resolved[node.name] = entry;\n }\n };\n\n for (const [key, nodeName] of Object.entries(this.config.boneNodes)) {\n const node = findNode(nodeName);\n if (node) {\n addResolvedBone(key, node);\n if (nodeName) {\n resolved[nodeName] = resolved[key]!;\n }\n }\n }\n\n if (!resolved.EYE_L && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.LEFT);\n if (node) {\n addResolvedBone('EYE_L', node);\n }\n }\n if (!resolved.EYE_R && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.RIGHT);\n if (node) {\n addResolvedBone('EYE_R', node);\n }\n }\n\n const referencedNodes = new Set<string>();\n Object.values(this.config.auToBones ?? {}).forEach((bindings) => {\n bindings.forEach((binding) => referencedNodes.add(binding.node));\n });\n this.compositeRotations.forEach((composite) => referencedNodes.add(composite.node));\n Object.values(this.config.continuumPairs ?? {}).forEach((pair) => {\n if (pair?.node) referencedNodes.add(pair.node);\n });\n this.config.annotationRegions?.forEach((region) => {\n region.bones?.forEach((boneName) => referencedNodes.add(boneName));\n });\n\n referencedNodes.forEach((nodeKey) => {\n if (resolved[nodeKey]) return;\n const configuredName = this.config.boneNodes?.[nodeKey] ?? nodeKey;\n const node = findNode(configuredName);\n if (node) {\n addResolvedBone(nodeKey, node);\n if (configuredName) {\n resolved[configuredName] = resolved[nodeKey]!;\n }\n }\n });\n\n return resolved;\n }\n\n private combineHandles(handles: TransitionHandle[]): TransitionHandle {\n if (handles.length === 0) return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n if (handles.length === 1) return handles[0];\n return {\n promise: Promise.all(handles.map((h) => h.promise)).then(() => {}),\n pause: () => handles.forEach((h) => h.pause()),\n resume: () => handles.forEach((h) => h.resume()),\n cancel: () => handles.forEach((h) => h.cancel()),\n };\n }\n\n /**\n * Apply render order and material settings from CC4_MESHES to all meshes.\n * This ensures proper layering (e.g., hair renders on top of eyebrows).\n * Also auto-registers hair and eyebrow meshes for hair physics.\n */\n private applyMeshMaterialSettings(root: Object3D): void {\n // Clear and rebuild hair object registry\n this.hairPhysics.clearRegisteredHairObjects();\n\n root.traverse((obj: any) => {\n if (!obj.isMesh || !obj.name) return;\n\n // Merge config.meshes (user overrides) with CC4_MESHES (preset defaults).\n // User overrides may only contain material settings, so always merge with\n // the preset to preserve category and other fields needed for registration.\n const configMesh = this.config.meshes?.[obj.name];\n const presetMesh = CC4_MESHES[obj.name];\n const meshInfo = configMesh && presetMesh ? { ...presetMesh, ...configMesh } : configMesh ?? presetMesh;\n const category = meshInfo?.category;\n\n // Auto-register hair and eyebrow meshes for hair physics\n if (category === 'hair' || category === 'eyebrow') {\n this.hairPhysics.autoRegisterHairMesh(obj as Mesh, category);\n }\n\n if (!meshInfo?.material) return;\n\n this.frameApplier.setMeshMaterialConfig(root, obj.name, meshInfo.material as ThreeMaterialConfig);\n });\n\n }\n\n // ============================================================================\n // MIXER / CLIP CONTROL\n // ============================================================================\n\n loadAnimationClips(clips: unknown[]): void {\n this.animationController.loadAnimationClips(clips);\n }\n\n getAnimationClips(): AnimationClipInfo[] {\n return this.animationController.getAnimationClips();\n }\n\n removeAnimationClip(clipName: string): boolean {\n return this.animationController.removeAnimationClip(clipName);\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.animationController.playAnimation(clipName, options);\n }\n\n stopAnimation(clipName: string): void {\n this.animationController.stopAnimation(clipName);\n }\n\n stopAllAnimations(): void {\n this.animationController.stopAllAnimations();\n }\n\n pauseAnimation(clipName: string): void {\n this.animationController.pauseAnimation(clipName);\n }\n\n resumeAnimation(clipName: string): void {\n this.animationController.resumeAnimation(clipName);\n }\n\n pauseAllAnimations(): void {\n this.animationController.pauseAllAnimations();\n }\n\n resumeAllAnimations(): void {\n this.animationController.resumeAllAnimations();\n }\n\n setAnimationSpeed(clipName: string, speed: number): void {\n this.animationController.setAnimationSpeed(clipName, speed);\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n this.animationController.setAnimationIntensity(clipName, intensity);\n }\n\n setAnimationLoopMode(clipName: string, loopMode: 'repeat' | 'once' | 'pingpong'): void {\n this.animationController.setAnimationLoopMode(clipName, loopMode);\n }\n\n setAnimationRepeatCount(clipName: string, repeatCount?: number): void {\n this.animationController.setAnimationRepeatCount(clipName, repeatCount);\n }\n\n setAnimationReverse(clipName: string, reverse: boolean): void {\n this.animationController.setAnimationReverse(clipName, reverse);\n }\n\n setAnimationBlendMode(clipName: string, blendMode: AnimationBlendMode): void {\n this.animationController.setAnimationBlendMode(clipName, blendMode);\n }\n\n seekAnimation(clipName: string, time: number): void {\n this.animationController.seekAnimation(clipName, time);\n }\n\n setAnimationTimeScale(timeScale: number): void {\n this.animationController.setAnimationTimeScale(timeScale);\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n return this.animationController.getAnimationState(clipName);\n }\n\n getPlayingAnimations(): AnimationState[] {\n return this.animationController.getPlayingAnimations();\n }\n\n crossfadeTo(clipName: string, duration = 0.3, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.animationController.crossfadeTo(clipName, duration, options);\n }\n\n snippetToClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): AnimationClip | null {\n return this.animationController.snippetToClip(clipName, curves, options);\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n return this.animationController.playClip(clip, options);\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap } | TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.playSnippet(snippet, options);\n }\n\n playTypedSnippet(\n snippet: TypedSnippet | { name: string; channels: SnippetChannel[] },\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.playTypedSnippet(snippet, options);\n }\n\n buildClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.buildClip(clipName, curves, options);\n }\n\n buildTypedClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): ClipHandle | null {\n return this.animationController.buildTypedClip(clipName, channels, options);\n }\n\n typedSnippetToClip(\n clipName: string,\n channels: SnippetChannel[],\n options?: ClipOptions\n ): AnimationClip | null {\n return this.animationController.typedSnippetToClip(clipName, channels, options);\n }\n\n cleanupSnippet(name: string) {\n this.animationController.cleanupSnippet(name);\n }\n\n updateClipParams(\n name: string,\n params: { weight?: number; rate?: number; loop?: boolean; loopMode?: 'once' | 'repeat' | 'pingpong'; repeatCount?: number; reverse?: boolean; actionId?: string }\n ): boolean {\n return this.animationController.updateClipParams(name, params);\n }\n\n /**\n * Check if curves can be played through buildClip.\n * Returns false if curves contain data that cannot be converted to mixer tracks.\n */\n supportsClipCurves(\n curves: Record<string, Array<{ time: number; intensity: number; inherit?: boolean }>>\n ): boolean {\n // Currently all curve-based playback is supported - bone AUs are handled via\n // quaternion tracks in the generated clip\n return Object.keys(curves).length > 0;\n }\n}\n\n/**\n * Helper function to collect meshes with morph targets from a scene.\n */\nexport function collectMorphMeshes(root: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n const dict = obj.morphTargetDictionary;\n const infl = obj.morphTargetInfluences;\n if ((dict && Object.keys(dict).length > 0) || (Array.isArray(infl) && infl.length > 0)) {\n meshes.push(obj);\n }\n }\n });\n return meshes;\n}\n\nexport function buildFrameApplierBindings(\n inspection: ReturnType<ThreeModelInspector['inspectModel']>\n): ThreeFrameApplierBindings {\n const meshes = new Map<import('../../core/contracts').MeshId, Mesh>();\n for (const meshDesc of inspection.descriptor.meshes) {\n const mesh = inspection.meshByName.get(meshDesc.name)\n || inspection.allMeshes.find((candidate) => candidate.name === meshDesc.name);\n if (mesh) {\n meshes.set(meshDesc.id, mesh);\n }\n }\n\n const morphTargets = new Map<\n import('../../core/contracts').MorphTargetId,\n { meshId: import('../../core/contracts').MeshId; mesh: Mesh; index: number }\n >();\n for (const morph of inspection.descriptor.morphTargets) {\n const mesh = meshes.get(morph.meshId);\n if (!mesh || morph.hostIndex === undefined) continue;\n morphTargets.set(morph.id, {\n meshId: morph.meshId,\n mesh,\n index: morph.hostIndex,\n });\n }\n\n const bonesByName = new Map<string, Object3D>();\n for (const entry of Object.values(inspection.bones)) {\n if (entry?.obj?.name) {\n bonesByName.set(entry.obj.name, entry.obj);\n }\n }\n if (inspection.allMeshes[0]?.parent) {\n let root: Object3D | null = inspection.allMeshes[0];\n while (root?.parent) root = root.parent;\n root?.traverse((obj) => {\n if (obj.name && !bonesByName.has(obj.name)) {\n bonesByName.set(obj.name, obj);\n }\n });\n }\n\n const bones = new Map<import('../../core/contracts').BoneId, Object3D>();\n for (const boneDesc of inspection.descriptor.bones) {\n const bone = bonesByName.get(boneDesc.name);\n if (bone) {\n bones.set(boneDesc.id, bone);\n }\n }\n\n return { meshes, morphTargets, bones };\n}\n","import {\n AnimationClip,\n NumberKeyframeTrack,\n QuaternionKeyframeTrack,\n VectorKeyframeTrack,\n} from 'three';\nimport type { Object3D } from 'three';\nimport type {\n BoneId,\n ClipIR,\n ClipTrackIR,\n MeshId,\n MorphTargetId,\n NumericArray,\n} from '../../core/contracts';\n\nexport interface ThreeClipMeshBinding {\n readonly trackName: string;\n}\n\nexport interface ThreeClipMorphTargetBinding {\n readonly meshId: MeshId;\n readonly index: number;\n}\n\nexport interface ThreeClipAdapterBindings {\n readonly meshes?: ReadonlyMap<MeshId, Object3D | ThreeClipMeshBinding>;\n readonly morphTargets?: ReadonlyMap<MorphTargetId, ThreeClipMorphTargetBinding>;\n readonly bones?: ReadonlyMap<BoneId, Object3D | string>;\n}\n\nexport class ThreeClipAdapter {\n private meshes = new Map<MeshId, Object3D | ThreeClipMeshBinding>();\n private morphTargets = new Map<MorphTargetId, ThreeClipMorphTargetBinding>();\n private bones = new Map<BoneId, Object3D | string>();\n\n constructor(bindings: ThreeClipAdapterBindings = {}) {\n this.setBindings(bindings);\n }\n\n setBindings(bindings: ThreeClipAdapterBindings): void {\n this.meshes = new Map(bindings.meshes || []);\n this.morphTargets = new Map(bindings.morphTargets || []);\n this.bones = new Map(bindings.bones || []);\n }\n\n toAnimationClip(clip: ClipIR): AnimationClip {\n return new AnimationClip(\n clip.name,\n clip.durationSeconds,\n clip.tracks.map((track) => this.toKeyframeTrack(track)).filter((track): track is NonNullable<typeof track> => !!track)\n );\n }\n\n private toKeyframeTrack(track: ClipTrackIR) {\n if (track.target.kind === 'morphTarget') {\n const morph = this.morphTargets.get(track.target.morphTargetId);\n const mesh = this.meshes.get(track.target.meshId);\n if (!morph || !mesh) return null;\n return new NumberKeyframeTrack(\n `${getTrackName(mesh)}.morphTargetInfluences[${morph.index}]`,\n toArray(track.times),\n toArray(track.values)\n );\n }\n\n if (track.target.kind === 'boneTransform') {\n const bone = this.bones.get(track.target.boneId);\n if (!bone) return null;\n const targetName = getTrackName(bone);\n const times = toArray(track.times);\n const values = toArray(track.values);\n\n if (track.target.property === 'rotation') {\n return new QuaternionKeyframeTrack(`${targetName}.quaternion`, times, values);\n }\n if (track.target.property === 'position') {\n return new VectorKeyframeTrack(`${targetName}.position`, times, values);\n }\n return new VectorKeyframeTrack(`${targetName}.scale`, times, values);\n }\n\n if (track.target.kind === 'meshVisibility') {\n const mesh = this.meshes.get(track.target.meshId);\n if (!mesh) return null;\n return new NumberKeyframeTrack(`${getTrackName(mesh)}.visible`, toArray(track.times), toArray(track.values));\n }\n\n return null;\n }\n}\n\nfunction getTrackName(value: Object3D | string | ThreeClipMeshBinding): string {\n if (typeof value === 'string') return value;\n if ('trackName' in value) return value.trackName;\n return value.uuid || value.name;\n}\n\nfunction toArray(values: NumericArray): number[] {\n return Array.from(values);\n}\n","/**\n * Default Three.js scene host for Embody characters.\n *\n * Creates renderer / scene / camera / lighting / shadow plane and mounts the\n * canvas into a caller-supplied HTMLElement. Advanced callers can skip this\n * and inject an existing Three.js scene via createCharacterHost.\n */\n\nimport {\n ACESFilmicToneMapping,\n Color,\n DirectionalLight,\n HemisphereLight,\n MathUtils,\n Mesh,\n PCFSoftShadowMap,\n PerspectiveCamera,\n PlaneGeometry,\n PMREMGenerator,\n Scene,\n ShadowMaterial,\n SRGBColorSpace,\n WebGLRenderer,\n type Texture,\n type WebGLRenderTarget,\n} from 'three';\nimport { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';\n\nexport type DefaultCharacterLightingPresetId =\n | 'cleanStudio'\n | 'softFill'\n | 'inspection'\n | 'contrast';\n\nexport interface DefaultCharacterLightingSettings {\n envMapEnabled: boolean;\n environmentIntensity: number;\n environmentBlur: number;\n exposure: number;\n ambientIntensity: number;\n keyIntensity: number;\n fillIntensity: number;\n rimIntensity: number;\n shadowOpacity: number;\n}\n\nexport interface DefaultCharacterLightingController {\n getSettings: () => DefaultCharacterLightingSettings;\n getEnvironmentTexture: () => Texture | null;\n setSettings: (patch: Partial<DefaultCharacterLightingSettings>) => DefaultCharacterLightingSettings;\n setPreset: (presetId: DefaultCharacterLightingPresetId) => DefaultCharacterLightingSettings;\n subscribe: (listener: (settings: DefaultCharacterLightingSettings) => void) => () => void;\n dispose: () => void;\n}\n\nexport type CharacterSceneTypeId = 'studio' | 'showcase' | 'inspection' | 'void';\n\n/** A named bundle of scene defaults (background, lighting preset, shadow plane). */\nexport interface CharacterSceneTypeDefinition {\n id: CharacterSceneTypeId;\n label: string;\n description: string;\n /** Scene background color (hex), or null for a transparent canvas. */\n background: number | null;\n lightingPreset: DefaultCharacterLightingPresetId;\n shadowPlane: boolean;\n}\n\nexport interface DefaultCharacterSceneOptions {\n /** Named scene type providing background/lighting/shadow defaults. Default: 'studio' */\n type?: CharacterSceneTypeId;\n /** Perspective camera FOV. Default: 45 */\n cameraFov?: number;\n /** Cap device pixel ratio. Default: 1.5 */\n pixelRatioCap?: number;\n /** Enable shadow maps. Default: true */\n shadows?: boolean;\n /** Add a ground shadow receiver. Default: from scene type */\n shadowPlane?: boolean;\n /** Scene background color (hex or CSS string), or null for transparent. Default: from scene type */\n background?: number | string | null;\n /** Initial lighting settings / overrides */\n lighting?: Partial<DefaultCharacterLightingSettings>;\n /** Lighting preset applied before lighting overrides. Default: from scene type */\n lightingPreset?: DefaultCharacterLightingPresetId;\n /** Listen for window resize. Default: true */\n manageResize?: boolean;\n}\n\nexport interface DefaultCharacterScene {\n container: HTMLElement;\n scene: Scene;\n renderer: WebGLRenderer;\n camera: PerspectiveCamera;\n lighting: DefaultCharacterLightingController;\n shadowPlane: Mesh | null;\n /** Resolved scene type used for defaults. */\n sceneType: CharacterSceneTypeId;\n ownsScene: true;\n resize: () => void;\n dispose: () => void;\n}\n\nexport const DEFAULT_CHARACTER_SCENE_TYPE_ID: CharacterSceneTypeId = 'studio';\n\nexport const CHARACTER_SCENE_TYPES: Record<CharacterSceneTypeId, CharacterSceneTypeDefinition> = {\n studio: {\n id: 'studio',\n label: 'Studio',\n description: 'Transparent background, soft studio lighting, ground shadow.',\n background: null,\n lightingPreset: 'cleanStudio',\n shadowPlane: true,\n },\n showcase: {\n id: 'showcase',\n label: 'Showcase',\n description: 'Dark backdrop with contrasty key/rim lighting for presentation shots.',\n background: 0x101216,\n lightingPreset: 'contrast',\n shadowPlane: true,\n },\n inspection: {\n id: 'inspection',\n label: 'Inspection',\n description: 'Bright, even lighting on a light backdrop for close-up review.',\n background: 0xe8eaed,\n lightingPreset: 'inspection',\n shadowPlane: true,\n },\n void: {\n id: 'void',\n label: 'Void',\n description: 'Transparent background, soft fill lighting, no ground shadow.',\n background: null,\n lightingPreset: 'softFill',\n shadowPlane: false,\n },\n};\n\nexport const CHARACTER_SCENE_TYPE_IDS: readonly CharacterSceneTypeId[] = [\n 'studio',\n 'showcase',\n 'inspection',\n 'void',\n];\n\nconst LIGHT_NAMES = {\n ambient: 'embodyCharacterAmbientHemisphereLight',\n key: 'embodyCharacterKeyLight',\n fill: 'embodyCharacterFillLight',\n rim: 'embodyCharacterRimLight',\n} as const;\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_ID: DefaultCharacterLightingPresetId = 'cleanStudio';\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESETS: Record<\n DefaultCharacterLightingPresetId,\n { id: DefaultCharacterLightingPresetId; label: string; settings: DefaultCharacterLightingSettings }\n> = {\n cleanStudio: {\n id: 'cleanStudio',\n label: 'Soft Studio',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.24,\n environmentBlur: 0.04,\n exposure: 1.08,\n ambientIntensity: 0.32,\n keyIntensity: 0.52,\n fillIntensity: 0.18,\n rimIntensity: 0.08,\n shadowOpacity: 0.22,\n },\n },\n softFill: {\n id: 'softFill',\n label: 'Soft Fill',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.3,\n environmentBlur: 0.04,\n exposure: 1.1,\n ambientIntensity: 0.38,\n keyIntensity: 0.44,\n fillIntensity: 0.24,\n rimIntensity: 0.1,\n shadowOpacity: 0.18,\n },\n },\n inspection: {\n id: 'inspection',\n label: 'Inspection',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.45,\n environmentBlur: 0.035,\n exposure: 1.18,\n ambientIntensity: 0.48,\n keyIntensity: 0.58,\n fillIntensity: 0.32,\n rimIntensity: 0.14,\n shadowOpacity: 0.12,\n },\n },\n contrast: {\n id: 'contrast',\n label: 'Contrast',\n settings: {\n envMapEnabled: true,\n environmentIntensity: 0.2,\n environmentBlur: 0.035,\n exposure: 1.08,\n ambientIntensity: 0.25,\n keyIntensity: 0.7,\n fillIntensity: 0.12,\n rimIntensity: 0.22,\n shadowOpacity: 0.28,\n },\n },\n};\n\nexport const DEFAULT_CHARACTER_LIGHTING_SETTINGS: DefaultCharacterLightingSettings = {\n ...DEFAULT_CHARACTER_LIGHTING_PRESETS[DEFAULT_CHARACTER_LIGHTING_PRESET_ID].settings,\n};\n\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_IDS: readonly DefaultCharacterLightingPresetId[] = [\n 'cleanStudio',\n 'softFill',\n 'inspection',\n 'contrast',\n];\n\nfunction cloneSettings(settings: DefaultCharacterLightingSettings): DefaultCharacterLightingSettings {\n return { ...settings };\n}\n\nfunction clampFinite(value: unknown, min: number, max: number, fallback: number): number {\n const numeric = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numeric)) return fallback;\n return MathUtils.clamp(numeric, min, max);\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === 'boolean' ? value : fallback;\n}\n\ntype DefaultCharacterLightingSettingsInput = Partial<\n Record<keyof DefaultCharacterLightingSettings, unknown>\n>;\n\nfunction normalizeSettings(\n settings: DefaultCharacterLightingSettingsInput,\n): DefaultCharacterLightingSettings {\n return {\n envMapEnabled: normalizeBoolean(settings.envMapEnabled, DEFAULT_CHARACTER_LIGHTING_SETTINGS.envMapEnabled),\n environmentIntensity: clampFinite(\n settings.environmentIntensity,\n 0,\n 1.5,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentIntensity,\n ),\n environmentBlur: clampFinite(\n settings.environmentBlur,\n 0,\n 0.04,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentBlur,\n ),\n exposure: clampFinite(settings.exposure, 0.6, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.exposure),\n ambientIntensity: clampFinite(\n settings.ambientIntensity,\n 0,\n 1.4,\n DEFAULT_CHARACTER_LIGHTING_SETTINGS.ambientIntensity,\n ),\n keyIntensity: clampFinite(settings.keyIntensity, 0, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.keyIntensity),\n fillIntensity: clampFinite(settings.fillIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.fillIntensity),\n rimIntensity: clampFinite(settings.rimIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.rimIntensity),\n shadowOpacity: clampFinite(settings.shadowOpacity, 0, 0.5, DEFAULT_CHARACTER_LIGHTING_SETTINGS.shadowOpacity),\n };\n}\n\n/**\n * Normalize persisted / untrusted lighting settings (e.g. profile JSON).\n * Returns null when the value is not a plain object.\n */\nexport function normalizeDefaultCharacterLightingSettings(\n value: unknown,\n): DefaultCharacterLightingSettings | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n\n return normalizeSettings(value as DefaultCharacterLightingSettingsInput);\n}\n\nfunction setRendererLighting(renderer: WebGLRenderer, settings: DefaultCharacterLightingSettings): void {\n renderer.outputColorSpace = SRGBColorSpace;\n renderer.toneMapping = ACESFilmicToneMapping;\n renderer.toneMappingExposure = settings.exposure;\n}\n\nfunction updateShadowPlaneOpacity(scene: Scene, opacity: number): void {\n const shadowPlane = scene.getObjectByName('shadowPlane');\n if (!(shadowPlane instanceof Mesh)) return;\n\n const materials = Array.isArray(shadowPlane.material) ? shadowPlane.material : [shadowPlane.material];\n materials.forEach((material) => {\n if (material instanceof ShadowMaterial) {\n material.opacity = opacity;\n material.needsUpdate = true;\n }\n });\n}\n\nfunction createLightRig(scene: Scene) {\n const ambient = new HemisphereLight(0xf7fbff, 0x6b7280, 0);\n ambient.name = LIGHT_NAMES.ambient;\n ambient.position.set(0, 8, 0);\n scene.add(ambient);\n\n const key = new DirectionalLight(0xfffbf4, 0);\n key.name = LIGHT_NAMES.key;\n key.position.set(4.5, 7.5, 6.2);\n key.castShadow = true;\n key.shadow.mapSize.width = 2048;\n key.shadow.mapSize.height = 2048;\n key.shadow.camera.near = 0.5;\n key.shadow.camera.far = 50;\n key.shadow.camera.left = -10;\n key.shadow.camera.right = 10;\n key.shadow.camera.top = 10;\n key.shadow.camera.bottom = -10;\n key.shadow.bias = -0.0001;\n key.shadow.radius = 4;\n scene.add(key);\n\n const fill = new DirectionalLight(0xe8f0ff, 0);\n fill.name = LIGHT_NAMES.fill;\n fill.position.set(-5.5, 4.2, 4.5);\n scene.add(fill);\n\n const rim = new DirectionalLight(0xdde8ff, 0);\n rim.name = LIGHT_NAMES.rim;\n rim.position.set(-3.5, 4.8, -5.4);\n scene.add(rim);\n\n return { ambient, key, fill, rim };\n}\n\nexport function createShadowPlane(\n scene: Scene,\n options: { size?: number; opacity?: number; yPosition?: number } = {},\n): Mesh {\n const { size = 20, opacity = 0.3, yPosition = -0.01 } = options;\n const shadowPlane = new Mesh(\n new PlaneGeometry(size, size),\n new ShadowMaterial({ opacity }),\n );\n shadowPlane.rotation.x = -Math.PI / 2;\n shadowPlane.position.y = yPosition;\n shadowPlane.receiveShadow = true;\n shadowPlane.name = 'shadowPlane';\n scene.add(shadowPlane);\n return shadowPlane;\n}\n\nexport function createDefaultCharacterLighting(\n scene: Scene,\n renderer: WebGLRenderer,\n initialSettings: Partial<DefaultCharacterLightingSettings> = DEFAULT_CHARACTER_LIGHTING_SETTINGS,\n): DefaultCharacterLightingController {\n const lights = createLightRig(scene);\n const pmremGenerator = new PMREMGenerator(renderer);\n const listeners = new Set<(settings: DefaultCharacterLightingSettings) => void>();\n let environmentTarget: WebGLRenderTarget | null = null;\n let settings = normalizeSettings(initialSettings);\n\n const notify = () => {\n const nextSettings = cloneSettings(settings);\n listeners.forEach((listener) => listener(nextSettings));\n };\n\n const disposeEnvironmentTarget = () => {\n environmentTarget?.dispose();\n environmentTarget = null;\n };\n\n const rebuildEnvironment = () => {\n disposeEnvironmentTarget();\n if (!settings.envMapEnabled) {\n scene.environment = null;\n scene.environmentIntensity = 0;\n return;\n }\n\n const roomEnvironment = new RoomEnvironment();\n try {\n environmentTarget = pmremGenerator.fromScene(roomEnvironment, settings.environmentBlur);\n } finally {\n roomEnvironment.dispose();\n }\n\n scene.environment = environmentTarget.texture;\n scene.environmentIntensity = settings.environmentIntensity;\n };\n\n const applySettings = () => {\n setRendererLighting(renderer, settings);\n scene.environmentIntensity = settings.envMapEnabled ? settings.environmentIntensity : 0;\n lights.ambient.intensity = settings.ambientIntensity;\n lights.key.intensity = settings.keyIntensity;\n lights.fill.intensity = settings.fillIntensity;\n lights.rim.intensity = settings.rimIntensity;\n updateShadowPlaneOpacity(scene, settings.shadowOpacity);\n };\n\n rebuildEnvironment();\n applySettings();\n\n const setSettings = (\n patch: Partial<DefaultCharacterLightingSettings>,\n ): DefaultCharacterLightingSettings => {\n const nextSettings = normalizeSettings({ ...settings, ...patch });\n const shouldRebuildEnvironment =\n nextSettings.envMapEnabled !== settings.envMapEnabled ||\n nextSettings.environmentBlur !== settings.environmentBlur;\n\n settings = nextSettings;\n if (shouldRebuildEnvironment) {\n rebuildEnvironment();\n }\n applySettings();\n notify();\n return cloneSettings(settings);\n };\n\n return {\n getSettings: () => cloneSettings(settings),\n getEnvironmentTexture: () => environmentTarget?.texture ?? null,\n setSettings,\n setPreset: (presetId) => {\n const preset = DEFAULT_CHARACTER_LIGHTING_PRESETS[presetId];\n if (!preset) return cloneSettings(settings);\n return setSettings(preset.settings);\n },\n subscribe: (listener) => {\n listeners.add(listener);\n listener(cloneSettings(settings));\n return () => {\n listeners.delete(listener);\n };\n },\n dispose: () => {\n listeners.clear();\n disposeEnvironmentTarget();\n pmremGenerator.dispose();\n scene.environment = null;\n scene.remove(lights.ambient, lights.key, lights.fill, lights.rim);\n },\n };\n}\n\nfunction resolveContainerSize(container: HTMLElement): { width: number; height: number } {\n const width = container.clientWidth || (typeof window !== 'undefined' ? window.innerWidth : 1);\n const height = container.clientHeight || (typeof window !== 'undefined' ? window.innerHeight : 1);\n return {\n width: Math.max(1, width),\n height: Math.max(1, height),\n };\n}\n\nfunction setPixelRatio(renderer: WebGLRenderer, pixelRatioCap: number): void {\n const deviceRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n renderer.setPixelRatio(Math.min(deviceRatio, pixelRatioCap));\n}\n\n/**\n * Create a default Embody character scene mounted into `container`.\n */\nexport function createDefaultCharacterScene(\n container: HTMLElement,\n options: DefaultCharacterSceneOptions = {},\n): DefaultCharacterScene {\n const sceneType =\n CHARACTER_SCENE_TYPES[options.type ?? DEFAULT_CHARACTER_SCENE_TYPE_ID]\n ?? CHARACTER_SCENE_TYPES[DEFAULT_CHARACTER_SCENE_TYPE_ID];\n const {\n cameraFov = 45,\n pixelRatioCap = 1.5,\n shadows = true,\n shadowPlane: enableShadowPlane = sceneType.shadowPlane,\n background = sceneType.background,\n lightingPreset = sceneType.lightingPreset,\n lighting: lightingOverrides = {},\n manageResize = true,\n } = options;\n\n const { width, height } = resolveContainerSize(container);\n\n const renderer = new WebGLRenderer({\n alpha: true,\n antialias: true,\n powerPreference: 'high-performance',\n });\n setPixelRatio(renderer, pixelRatioCap);\n renderer.setSize(width, height, true);\n renderer.shadowMap.enabled = shadows;\n renderer.shadowMap.type = PCFSoftShadowMap;\n container.appendChild(renderer.domElement);\n renderer.domElement.style.display = 'block';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n\n const scene = new Scene();\n scene.background = background === null || background === undefined ? null : new Color(background);\n\n const camera = new PerspectiveCamera(cameraFov, width / height, 0.1, 1000);\n\n const presetSettings = DEFAULT_CHARACTER_LIGHTING_PRESETS[lightingPreset]?.settings\n ?? DEFAULT_CHARACTER_LIGHTING_SETTINGS;\n const lighting = createDefaultCharacterLighting(scene, renderer, {\n ...presetSettings,\n ...lightingOverrides,\n });\n\n const shadowPlane = enableShadowPlane\n ? createShadowPlane(scene, { opacity: lighting.getSettings().shadowOpacity })\n : null;\n\n const resize = () => {\n const next = resolveContainerSize(container);\n camera.aspect = next.width / next.height;\n camera.updateProjectionMatrix();\n setPixelRatio(renderer, pixelRatioCap);\n renderer.setSize(next.width, next.height, false);\n };\n\n const onResize = () => resize();\n if (manageResize && typeof window !== 'undefined') {\n window.addEventListener('resize', onResize);\n }\n\n return {\n container,\n scene,\n renderer,\n camera,\n lighting,\n shadowPlane,\n sceneType: sceneType.id,\n ownsScene: true,\n resize,\n dispose: () => {\n if (manageResize && typeof window !== 'undefined') {\n window.removeEventListener('resize', onResize);\n }\n lighting.dispose();\n if (shadowPlane) {\n scene.remove(shadowPlane);\n shadowPlane.geometry.dispose();\n const material = shadowPlane.material;\n if (Array.isArray(material)) {\n material.forEach((entry) => entry.dispose());\n } else {\n material.dispose();\n }\n }\n if (renderer.domElement.parentElement === container) {\n container.removeChild(renderer.domElement);\n }\n renderer.dispose();\n },\n };\n}\n","/**\n * Character model loader for Embody hosts.\n *\n * Loads GLB/GLTF (optional Draco) and FBX, collects morph meshes, and provides\n * dispose helpers. App-specific asset routing (CDN aliases, HTML probing) stays\n * outside Embody — pass a resolved URL or ArrayBuffer.\n */\n\nimport {\n Box3,\n type AnimationClip,\n type Mesh,\n type Object3D,\n type Scene,\n} from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { GLTFLoader, type GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { collectMorphMeshes } from './Embody';\n\nexport interface CharacterModelLoadResult {\n model: Object3D;\n meshes: Mesh[];\n animations: AnimationClip[];\n gltf: GLTF | null;\n}\n\nexport interface CharacterModelLoadOptions {\n /** Load progress callback (0-100). */\n onProgress?: (progress: number) => void;\n /** Enable shadow casting on meshes. Default: true */\n castShadows?: boolean;\n /** Draco decoder base path. Default: '/draco-gltf/' */\n dracoDecoderPath?: string;\n}\n\nexport interface CharacterModelTransform {\n modelOffset?: { x?: number; y?: number; z?: number };\n modelRotation?: { x?: number; y?: number; z?: number };\n /**\n * Positive finite uniform scale applied to the model root.\n * Omit this field to preserve the scale authored in the model asset.\n */\n modelScale?: number;\n /** Lift model so its lowest point clears this Y value. */\n modelGroundClearance?: number;\n}\n\nconst DEFAULT_DRACO_DECODER_PATH = '/draco-gltf/';\n\nlet sharedDracoLoader: DRACOLoader | null = null;\nlet sharedDracoPath: string | null = null;\nlet sharedGltfLoader: GLTFLoader | null = null;\nlet sharedFbxLoader: FBXLoader | null = null;\n\nfunction getDracoLoader(decoderPath: string): DRACOLoader {\n if (!sharedDracoLoader || sharedDracoPath !== decoderPath) {\n sharedDracoLoader?.dispose();\n sharedDracoLoader = new DRACOLoader()\n .setDecoderPath(decoderPath.endsWith('/') ? decoderPath : `${decoderPath}/`)\n .setDecoderConfig({ type: 'wasm' });\n sharedDracoPath = decoderPath;\n sharedGltfLoader = null;\n }\n return sharedDracoLoader;\n}\n\nfunction getGltfLoader(decoderPath: string): GLTFLoader {\n if (!sharedGltfLoader || sharedDracoPath !== decoderPath) {\n const loader = new GLTFLoader();\n loader.setDRACOLoader(getDracoLoader(decoderPath));\n sharedGltfLoader = loader;\n }\n return sharedGltfLoader;\n}\n\nfunction getFbxLoader(): FBXLoader {\n if (!sharedFbxLoader) {\n sharedFbxLoader = new FBXLoader();\n }\n return sharedFbxLoader;\n}\n\nfunction createDistinctProgressReporter(\n onProgress?: (progress: number) => void,\n): ((progress: number) => void) | undefined {\n if (!onProgress) return undefined;\n\n let lastProgress: number | null = null;\n return (progress: number) => {\n if (!Number.isFinite(progress)) return;\n const normalized = Math.min(100, Math.max(0, Math.round(progress)));\n if (normalized === lastProgress) return;\n lastProgress = normalized;\n onProgress(normalized);\n };\n}\n\nfunction isFbxUrl(url: string): boolean {\n const lowercaseUrl = url.toLowerCase();\n return lowercaseUrl.endsWith('.fbx') || lowercaseUrl.includes('.fbx?');\n}\n\nfunction prepareLoadedModel(model: Object3D, castShadows: boolean): Mesh[] {\n model.traverse((obj) => {\n const mesh = obj as Mesh;\n if (!mesh.isMesh) return;\n if (castShadows) {\n mesh.castShadow = true;\n }\n });\n return collectMorphMeshes(model);\n}\n\n/**\n * Apply optional placement transforms used by character profiles.\n */\nexport function applyCharacterModelTransform(\n model: Object3D,\n transform: CharacterModelTransform = {},\n): void {\n const { modelOffset, modelRotation, modelScale, modelGroundClearance } = transform;\n\n if (modelOffset) {\n model.position.set(modelOffset.x ?? 0, modelOffset.y ?? 0, modelOffset.z ?? 0);\n }\n\n if (modelRotation) {\n const deg2rad = Math.PI / 180;\n model.rotation.set(\n (modelRotation.x ?? 0) * deg2rad,\n (modelRotation.y ?? 0) * deg2rad,\n (modelRotation.z ?? 0) * deg2rad,\n );\n }\n\n if (modelScale !== undefined && Number.isFinite(modelScale) && modelScale > 0) {\n model.scale.setScalar(modelScale);\n }\n\n // Apply ground clearance after scale so the bounds reflect the final size.\n if (modelGroundClearance !== undefined && Number.isFinite(modelGroundClearance)) {\n model.updateMatrixWorld(true);\n const bounds = new Box3().setFromObject(model);\n if (Number.isFinite(bounds.min.y) && bounds.min.y < modelGroundClearance) {\n model.position.y += modelGroundClearance - bounds.min.y;\n }\n }\n}\n\n/**\n * Dispose a model graph and remove it from a scene when present.\n *\n * Handles any renderable object (Mesh, Points, Line, ...) and releases\n * textures referenced by materials.\n */\nexport function disposeCharacterModel(scene: Scene | null, model: Object3D): void {\n scene?.remove(model);\n model.traverse((obj) => {\n const holder = obj as Object3D & {\n geometry?: { dispose?: () => void };\n material?: MaterialLike | MaterialLike[];\n };\n holder.geometry?.dispose?.();\n if (!holder.material) return;\n const materials = Array.isArray(holder.material) ? holder.material : [holder.material];\n materials.forEach(disposeMaterialWithTextures);\n });\n}\n\ninterface MaterialLike {\n dispose?: () => void;\n}\n\nfunction disposeMaterialWithTextures(material: MaterialLike): void {\n Object.values(material as Record<string, unknown>).forEach((value) => {\n const texture = value as { isTexture?: boolean; dispose?: () => void } | null;\n if (texture?.isTexture && typeof texture.dispose === 'function') {\n texture.dispose();\n }\n });\n material.dispose?.();\n}\n\nfunction loadGltf(\n url: string,\n options: CharacterModelLoadOptions,\n): Promise<CharacterModelLoadResult> {\n const { onProgress, castShadows = true, dracoDecoderPath = DEFAULT_DRACO_DECODER_PATH } = options;\n const reportProgress = createDistinctProgressReporter(onProgress);\n const loader = getGltfLoader(dracoDecoderPath);\n\n return new Promise((resolve, reject) => {\n loader.load(\n url,\n (gltf: GLTF) => {\n const model = gltf.scene;\n resolve({\n model,\n meshes: prepareLoadedModel(model, castShadows),\n animations: gltf.animations || [],\n gltf,\n });\n },\n (progressEvent: ProgressEvent) => {\n if (progressEvent.lengthComputable) {\n reportProgress?.((progressEvent.loaded / progressEvent.total) * 100);\n }\n },\n (error: unknown) => reject(error),\n );\n });\n}\n\nfunction loadFbx(\n url: string,\n options: CharacterModelLoadOptions,\n): Promise<CharacterModelLoadResult> {\n const { onProgress, castShadows = true } = options;\n const reportProgress = createDistinctProgressReporter(onProgress);\n const loader = getFbxLoader();\n\n return new Promise((resolve, reject) => {\n loader.load(\n url,\n (fbxGroup) => {\n resolve({\n model: fbxGroup,\n meshes: prepareLoadedModel(fbxGroup, castShadows),\n animations: fbxGroup.animations || [],\n gltf: null,\n });\n },\n (progressEvent: ProgressEvent) => {\n if (progressEvent.lengthComputable) {\n reportProgress?.((progressEvent.loaded / progressEvent.total) * 100);\n }\n },\n (error: unknown) => reject(error),\n );\n });\n}\n\n/**\n * Load a character model from a URL (GLB/GLTF or FBX).\n */\nexport function loadCharacterModel(\n url: string,\n options: CharacterModelLoadOptions = {},\n): Promise<CharacterModelLoadResult> {\n if (isFbxUrl(url)) {\n return loadFbx(url, options);\n }\n return loadGltf(url, options);\n}\n\n/**\n * Parse a character model from an already-fetched ArrayBuffer.\n */\nexport function parseCharacterModel(\n data: ArrayBuffer,\n resourcePath = '',\n options: CharacterModelLoadOptions = {},\n): Promise<CharacterModelLoadResult> {\n const { castShadows = true, dracoDecoderPath = DEFAULT_DRACO_DECODER_PATH } = options;\n const loader = getGltfLoader(dracoDecoderPath);\n\n return new Promise((resolve, reject) => {\n loader.parse(\n data,\n resourcePath,\n (gltf: GLTF) => {\n const model = gltf.scene;\n resolve({\n model,\n meshes: prepareLoadedModel(model, castShadows),\n animations: gltf.animations || [],\n gltf,\n });\n },\n (error: unknown) => reject(error),\n );\n });\n}\n","/**\n * High-level character host: default scene + model load + Embody binding.\n *\n * Default path: pass a container HTMLElement + character model URL.\n * Advanced path: inject an existing Three.js scene/renderer/camera.\n */\n\nimport {\n Box3,\n MathUtils,\n Vector3,\n type AnimationClip,\n type Camera,\n type Mesh,\n type Object3D,\n type PerspectiveCamera,\n type Scene,\n type WebGLRenderer,\n} from 'three';\nimport type { EmbodyConfig } from '../../interfaces/EmbodyRuntime';\nimport { getPresetWithProfile } from '../../presets';\nimport { Embody } from './Embody';\nimport {\n createDefaultCharacterScene,\n type DefaultCharacterLightingController,\n type DefaultCharacterSceneOptions,\n} from './characterScene';\nimport {\n applyCharacterModelTransform,\n disposeCharacterModel,\n loadCharacterModel,\n type CharacterModelLoadOptions,\n type CharacterModelTransform,\n} from './modelLoader';\n\nexport interface CharacterHostCharacterOptions extends CharacterModelTransform {\n /** Resolved model URL (GLB/GLTF/FBX). */\n modelUrl: string;\n /** Optional Embody preset / profile (also accepted via `embody`). */\n presetType?: EmbodyConfig['presetType'];\n profile?: EmbodyConfig['profile'];\n}\n\nexport interface CharacterHostExternalScene {\n scene: Scene;\n renderer: WebGLRenderer;\n camera: Camera;\n /**\n * When true, host appends `renderer.domElement` into `container` if it is not\n * already mounted. Default: false.\n */\n mountCanvas?: boolean;\n /** When true, host listens for window resize. Default: false for external. */\n manageResize?: boolean;\n}\n\nexport interface CharacterHostOptions {\n /** Element that receives the WebGL canvas in the default scene path. */\n container: HTMLElement;\n /** Character to load and bind. */\n character: CharacterHostCharacterOptions;\n /** Embody runtime config. `presetType` / `profile` on character win when both set. */\n embody?: EmbodyConfig;\n /** Default-scene options (ignored when `external` is provided). */\n scene?: DefaultCharacterSceneOptions;\n /** Advanced: inject an existing Three.js scene instead of creating one. */\n external?: CharacterHostExternalScene;\n /** Model loader options (progress, Draco path, shadows). */\n loader?: CharacterModelLoadOptions;\n /** Call `engine.start()` after binding. Default: true */\n autoStart?: boolean;\n /**\n * Run a requestAnimationFrame render loop (`renderer.render(scene, camera)`).\n * Default: true when Embody owns the scene, false when `external` is given.\n */\n renderLoop?: boolean;\n /**\n * Frame the camera on the loaded model (position + lookAt). Applies on every\n * `setCharacter`. Default: true when Embody owns the scene, false otherwise.\n */\n autoFrame?: boolean;\n}\n\nexport interface CharacterHost {\n engine: Embody;\n scene: Scene;\n renderer: WebGLRenderer;\n camera: Camera | PerspectiveCamera;\n model: Object3D;\n meshes: Mesh[];\n animations: AnimationClip[];\n lighting: DefaultCharacterLightingController | null;\n /** True when Embody created and owns the default scene/renderer. */\n ownsScene: boolean;\n container: HTMLElement;\n /** Replace the loaded character while keeping the same scene/engine. */\n setCharacter: (character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions) => Promise<void>;\n resize: () => void;\n dispose: () => void;\n}\n\nfunction resolveEmbodyConfig(\n options: CharacterHostOptions,\n character: CharacterHostCharacterOptions,\n): EmbodyConfig {\n return {\n ...(options.embody ?? {}),\n ...(character.presetType ? { presetType: character.presetType } : {}),\n ...(character.profile ? { profile: character.profile } : {}),\n };\n}\n\nconst AUTO_FRAME_PADDING = 1.2;\n\n/** Position a perspective camera so the whole model is in view. */\nfunction frameCameraOnModel(camera: Camera | PerspectiveCamera, model: Object3D): void {\n if (!('isPerspectiveCamera' in camera) || !(camera as PerspectiveCamera).isPerspectiveCamera) {\n return;\n }\n const perspective = camera as PerspectiveCamera;\n\n model.updateMatrixWorld(true);\n const bounds = new Box3().setFromObject(model);\n if (bounds.isEmpty()) return;\n\n const size = bounds.getSize(new Vector3());\n const center = bounds.getCenter(new Vector3());\n const halfFov = MathUtils.degToRad(perspective.fov) / 2;\n const aspect = perspective.aspect > 0 ? perspective.aspect : 1;\n const fitHeight = Math.max(size.y, 1e-3);\n const fitWidth = Math.max(size.x, 1e-3) / aspect;\n const distance = ((Math.max(fitHeight, fitWidth) / 2) / Math.tan(halfFov)) * AUTO_FRAME_PADDING;\n\n perspective.position.set(center.x, center.y + size.y * 0.05, center.z + distance);\n perspective.near = Math.max(distance / 100, 0.01);\n perspective.far = Math.max(distance * 10, 100);\n perspective.updateProjectionMatrix();\n perspective.lookAt(center);\n}\n\nfunction bindModelToEngine(\n engine: Embody,\n model: Object3D,\n meshes: Mesh[],\n animations: AnimationClip[],\n): void {\n engine.onReady({ meshes, model });\n if (animations.length > 0) {\n engine.loadAnimationClips(animations);\n }\n}\n\n/**\n * Create a character host.\n *\n * Default: Embody creates the Three.js scene inside `container` and loads\n * `character.modelUrl`. Advanced: pass `external` with an existing scene.\n */\nexport async function createCharacterHost(options: CharacterHostOptions): Promise<CharacterHost> {\n const {\n container,\n character,\n external,\n scene: sceneOptions,\n loader: loaderOptions = {},\n autoStart = true,\n } = options;\n\n if (!container) {\n throw new Error('createCharacterHost requires a container HTMLElement');\n }\n if (!character?.modelUrl) {\n throw new Error('createCharacterHost requires character.modelUrl');\n }\n\n let scene: Scene;\n let renderer: WebGLRenderer;\n let camera: Camera | PerspectiveCamera;\n let lighting: DefaultCharacterLightingController | null = null;\n let ownsScene = false;\n let disposeDefaultScene: (() => void) | null = null;\n let resizeImpl: () => void = () => undefined;\n let removeResizeListener: (() => void) | null = null;\n\n if (external) {\n scene = external.scene;\n renderer = external.renderer;\n camera = external.camera;\n ownsScene = false;\n\n if (external.mountCanvas && renderer.domElement.parentElement !== container) {\n container.appendChild(renderer.domElement);\n }\n\n resizeImpl = () => {\n const width = Math.max(1, container.clientWidth || (typeof window !== 'undefined' ? window.innerWidth : 1));\n const height = Math.max(1, container.clientHeight || (typeof window !== 'undefined' ? window.innerHeight : 1));\n if ('isPerspectiveCamera' in camera && (camera as PerspectiveCamera).isPerspectiveCamera) {\n const perspective = camera as PerspectiveCamera;\n perspective.aspect = width / height;\n perspective.updateProjectionMatrix();\n }\n renderer.setSize(width, height, false);\n };\n\n if (external.manageResize && typeof window !== 'undefined') {\n const onResize = () => resizeImpl();\n window.addEventListener('resize', onResize);\n removeResizeListener = () => window.removeEventListener('resize', onResize);\n }\n } else {\n const defaultScene = createDefaultCharacterScene(container, sceneOptions);\n scene = defaultScene.scene;\n renderer = defaultScene.renderer;\n camera = defaultScene.camera;\n lighting = defaultScene.lighting;\n ownsScene = true;\n disposeDefaultScene = defaultScene.dispose;\n resizeImpl = defaultScene.resize;\n }\n\n const shouldRenderLoop = options.renderLoop ?? !external;\n const shouldAutoFrame = options.autoFrame ?? !external;\n\n let renderFrameId: number | null = null;\n const startRenderLoop = () => {\n if (!shouldRenderLoop || renderFrameId !== null || typeof requestAnimationFrame === 'undefined') {\n return;\n }\n const renderFrame = () => {\n renderFrameId = requestAnimationFrame(renderFrame);\n renderer.render(scene, camera);\n };\n renderFrameId = requestAnimationFrame(renderFrame);\n };\n const stopRenderLoop = () => {\n if (renderFrameId !== null) {\n cancelAnimationFrame(renderFrameId);\n renderFrameId = null;\n }\n };\n\n const engine = await Embody.create(resolveEmbodyConfig(options, character));\n\n let model: Object3D | null = null;\n let meshes: Mesh[] = [];\n let animations: AnimationClip[] = [];\n let hasBoundCharacter = false;\n let activeCharacterKey = '';\n\n const characterConfigKey = (value: CharacterHostCharacterOptions): string =>\n JSON.stringify({\n modelUrl: value.modelUrl,\n presetType: value.presetType ?? null,\n profile: value.profile ?? null,\n modelOffset: value.modelOffset ?? null,\n modelRotation: value.modelRotation ?? null,\n modelScale: value.modelScale ?? null,\n modelGroundClearance: value.modelGroundClearance ?? null,\n });\n\n const setCharacter = async (\n nextCharacter: CharacterHostCharacterOptions,\n nextLoader: CharacterModelLoadOptions = loaderOptions,\n ): Promise<void> => {\n if (!nextCharacter?.modelUrl) {\n throw new Error('setCharacter requires character.modelUrl');\n }\n\n const loaded = await loadCharacterModel(nextCharacter.modelUrl, {\n ...loaderOptions,\n ...nextLoader,\n });\n\n applyCharacterModelTransform(loaded.model, nextCharacter);\n\n if (model) {\n disposeCharacterModel(scene, model);\n }\n\n model = loaded.model;\n meshes = loaded.meshes;\n animations = loaded.animations;\n scene.add(model);\n\n if (shouldAutoFrame) {\n frameCameraOnModel(camera, model);\n }\n\n const nextKey = characterConfigKey(nextCharacter);\n const shouldSwapProfile =\n hasBoundCharacter &&\n nextKey !== activeCharacterKey &&\n Boolean(nextCharacter.presetType || nextCharacter.profile);\n\n if (shouldSwapProfile) {\n // Swap presets in place so callers keep a stable `engine` reference.\n const config = resolveEmbodyConfig(options, nextCharacter);\n engine.setProfile(await getPresetWithProfile(config.presetType, config.profile));\n }\n\n bindModelToEngine(engine, model, meshes, animations);\n hasBoundCharacter = true;\n activeCharacterKey = nextKey;\n };\n\n try {\n await setCharacter(character, loaderOptions);\n } catch (error) {\n disposeDefaultScene?.();\n removeResizeListener?.();\n engine.dispose();\n throw error;\n }\n\n if (autoStart) {\n engine.start();\n }\n startRenderLoop();\n\n return {\n engine,\n get scene() {\n return scene;\n },\n get renderer() {\n return renderer;\n },\n get camera() {\n return camera;\n },\n get model() {\n if (!model) throw new Error('Character host has no model bound');\n return model;\n },\n get meshes() {\n return meshes;\n },\n get animations() {\n return animations;\n },\n get lighting() {\n return lighting;\n },\n ownsScene,\n container,\n setCharacter,\n resize: () => resizeImpl(),\n dispose: () => {\n stopRenderLoop();\n engine.stop();\n engine.dispose();\n if (model) {\n disposeCharacterModel(scene, model);\n model = null;\n }\n removeResizeListener?.();\n if (ownsScene) {\n disposeDefaultScene?.();\n }\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../three/annotations/boneResolutionProfile.ts","../three/annotations/adapter.ts","../three/annotations/annotationCameraCore.ts","../three/sceneRenderingBinding.ts","../three/modelSkinning.ts","../three/annotations/modelRenderPreparation.ts","../three/playbackRendering.ts","../three/annotations/DOMControls.ts","../three/annotations/markerSurfaceRaycast.ts","../three/annotations/loadFrame.ts","../three/annotations/animationFrameTaskScheduler.ts","../three/annotations/annotationAnchorModel.ts","../three/annotations/runtimeAnnotationSidePreview.ts","../three/annotations/DPthree3DMarkers.ts","../three/annotations/DPthreeHTMLMarkers.ts","../three/annotations/DPthreeCameraController.ts","../three/annotations/DPthree.ts","../three/annotations/DPthreeMarkers.ts","../three/annotations/markerVisibilityLifecycle.ts","../three/annotations/runtimeAnnotationPreview.ts","../three/annotations/runtimeAnnotationPreviewSide.ts","../three/authoring.ts","../three/reference-pose.ts","../three/clipBindings.ts","../three/nativePlayback.ts","../three/character.ts","../three/model.ts","../three/scene.ts","../three/characterHost.ts","../three/index.ts"],"names":["core","snapshot","target","THREE","document","THREE2","point","hasParent","dir","center","materials","getAnnotationRegionLabel","THREE4","framing","THREE5","cleaned","bindings","request","vec","THREE6","dx","dy","isPlainRecord","requireInitializedEmbodyCore","Matrix4","Vector3","Quaternion","resource","action","json","finite","DEFAULT_HAIR_COLOR_APPEARANCE","initEmbodyCore","AdditiveAnimationBlendMode","NormalAnimationBlendMode","progress","LoopOnce","LoopPingPong","Box3","Mesh","prepare","Color","coordinates","PerspectiveCamera","PropertyBinding","InterpolateDiscrete","AnimationClip","intensity"],"mappings":"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","file":"three.js","sourcesContent":["import type { BoneResolutionProfile } from './adapter';\n\n/**\n * Embody serializes bone-resolution inputs into Wasm. Passing a complete\n * character profile also serializes authored vertex deltas and saved clips\n * for every annotation lookup, even though the resolver cannot use them.\n */\nexport function boneResolutionProfile(\n profile: BoneResolutionProfile | null | undefined,\n): BoneResolutionProfile | null {\n if (!profile) return null;\n return {\n bonePrefix: profile.bonePrefix,\n boneSuffix: profile.boneSuffix,\n boneNodes: profile.boneNodes,\n suffixPattern: profile.suffixPattern,\n };\n}\n","import { Box3, Quaternion, Vector3, type Object3D } from 'three';\nimport { initEmbodyCore, requireInitializedEmbodyCore, type EmbodyCore, type CameraFlight, type CameraOrbit } from '@lovelace_lol/embody/wasm';\nimport type { AnnotationCharacterConfig, AnnotationLaterality, BoneResolutionProfile, Region } from './types';\nexport { initEmbodyCore } from '@lovelace_lol/embody/wasm';\nexport type { AnnotationLaterality, BoneResolutionProfile } from './types';\n\ntype Point = { x: number; y: number; z: number };\ntype Rotation = Point & { w: number };\ntype Bounds = { center: Point; size: Point };\nconst vec = (v: Point) => new Float32Array([v.x, v.y, v.z]);\nconst quat = (q?: Rotation | null) => new Float32Array(q ? [q.x, q.y, q.z, q.w] : []);\nconst bounds = (b?: Bounds | null) => new Float32Array(b ? [b.center.x, b.center.y, b.center.z, b.size.x, b.size.y, b.size.z] : []);\nconst point = (values: ArrayLike<number>, offset = 0): Point => ({ x: values[offset], y: values[offset + 1], z: values[offset + 2] });\nconst framing = (v: ArrayLike<number>) => ({ position: point(v), target: point(v, 3), distance: v[6] });\n\n/** Typed, allocation-only bridge to the canonical Rust camera and marker algorithms. */\nexport class RustAnnotationCameraCore {\n constructor(private readonly core: EmbodyCore) {}\n static async create() { return new RustAnnotationCameraCore(await initEmbodyCore()); }\n normalizeCameraAngle(angle: number) { return this.core.normalize_camera_angle_degrees(angle); }\n worldDirectionForCameraAngle(q: Rotation | undefined, angle: number) { return point(this.core.world_direction_for_camera_angle(quat(q), angle)); }\n resolveFocusCameraDirection(q: Rotation | undefined, effectiveAngle: number, cameraAngle?: number, angleSpace = 'model') {\n return point(this.core.resolve_focus_camera_direction(quat(q), effectiveAngle, cameraAngle != null, angleSpace === 'world'));\n }\n resolveAutoCloseupAngle(offset: number, focusSize: Point, modelSize: Point) { return this.core.resolve_auto_closeup_angle(offset, vec(focusSize), vec(modelSize)); }\n focusPaddingFactor(size: number, closeUp: number, zoom: number, fullBody: number) { return this.core.focus_padding_factor(size, closeUp, zoom, fullBody); }\n solveFocusFraming(o: { focusBounds?: Bounds; modelBounds?: Bounds | null; modelQuaternion?: Rotation; fovDegrees: number; aspect: number; minDistance: number; closeUpPaddingFactor: number; zoomPaddingFactor: number; fullBodyPaddingFactor: number; overridePadding?: number; cameraAngle?: number; angleSpace?: string }) {\n return framing(this.core.solve_focus_framing(bounds(o.focusBounds), bounds(o.modelBounds), quat(o.modelQuaternion), o.fovDegrees, o.aspect, o.minDistance, o.closeUpPaddingFactor, o.zoomPaddingFactor, o.fullBodyPaddingFactor, o.overridePadding, o.cameraAngle, o.angleSpace === 'world'));\n }\n solveFullBodyFraming(o: { boxMin: Point; boxMax: Point; modelQuaternion?: Rotation; fovDegrees: number; aspect: number; minDistance: number; fullBodyPaddingFactor: number; overridePadding?: number; cameraAngle?: number; angleSpace?: string }) {\n return framing(this.core.solve_full_body_framing(vec(o.boxMin), vec(o.boxMax), quat(o.modelQuaternion), o.fovDegrees, o.aspect, o.minDistance, o.fullBodyPaddingFactor, o.overridePadding, o.cameraAngle, o.angleSpace === 'world'));\n }\n passesMarkerCameraAngleGate(o: { markerAngle?: number; currentCameraAngle?: number; rangeDegrees?: number }) { return this.core.passes_marker_camera_angle_gate(o.markerAngle, o.currentCameraAngle, o.rangeDegrees); }\n shouldShowMarker(o: { hiddenChild: boolean; solo: 'none' | 'soloed' | 'other-soloed'; markerAngle?: number; currentCameraAngle?: number }) {\n return this.core.should_show_marker(o.hiddenChild, o.solo === 'soloed' ? 1 : o.solo === 'other-soloed' ? 2 : 0, o.markerAngle, o.currentCameraAngle);\n }\n resolveViewportConstrainedLineScale(o: { startClip: ArrayLike<number>; endClip: ArrayLike<number>; safeX: number; safeY: number; minLengthRatio?: number }) {\n const v = this.core.resolve_viewport_constrained_line_scale(new Float32Array(o.startClip), new Float32Array(o.endClip), o.safeX, o.safeY, o.minLengthRatio);\n return { visible: v[0] >= 1, lineScale: v[1] };\n }\n resolveViewportSafeBounds(o: { labelScaleX: number; labelScaleY: number; projectionXScale: number; projectionYScale: number; viewportWidth: number; viewportHeight: number; edgePaddingPx?: number }) {\n const v = this.core.resolve_viewport_safe_bounds(o.labelScaleX, o.labelScaleY, o.projectionXScale, o.projectionYScale, o.viewportWidth, o.viewportHeight, o.edgePaddingPx);\n return { safeX: v[0], safeY: v[1] };\n }\n sampleMarkerBezierCurve(start: Point, end: Point, segments = 16) { return this.core.sample_marker_bezier_curve(vec(start), vec(end), segments); }\n sampleMarkerArcCurve(start: Point, end: Point, segments = 16) { return this.core.sample_marker_arc_curve(vec(start), vec(end), segments); }\n markerVisibilityAnimationFactors(visible: boolean, t: number) {\n const v = this.core.marker_visibility_animation_factors(visible, t);\n return { itemOpacityFactor: v[0], labelScaleFactor: v[1], lineOpacityFactor: v[2] };\n }\n separateOverlappingMarkerEndpoints(o: { starts: ArrayLike<number>; ends: ArrayLike<number>; modelCenter: Point; modelHeight: number }) { return this.core.separate_overlapping_marker_endpoints(new Float32Array(o.starts), new Float32Array(o.ends), vec(o.modelCenter), o.modelHeight); }\n createCameraFlight(start: Point, startTarget: Point, end: Point, endTarget: Point, duration: number) { return animationHandle(new this.core.CameraFlight(vec(start), vec(startTarget), vec(end), vec(endTarget), duration)); }\n createCameraOrbit(center: Point, radius: number, height: number, duration: number) { return animationHandle(new this.core.CameraOrbit(vec(center), radius, height, duration)); }\n}\n\nfunction animationHandle(handle: CameraFlight | CameraOrbit) {\n let disposed = false;\n return {\n sample(elapsed: number) {\n const v = handle.sample(elapsed);\n return { position: point(v), target: point(v, 3), done: v[6] >= 1 };\n },\n get durationMs() { return handle.duration_ms(); },\n dispose() { if (!disposed) { disposed = true; handle.free(); } },\n };\n}\nexport const createRustAnnotationCameraCore = () => RustAnnotationCameraCore.create();\n\nfunction request<T>(op: string, payload: unknown): T {\n return JSON.parse(requireInitializedEmbodyCore().embody_request(JSON.stringify({ op, payload }))) as T;\n}\n\n/** Resolve only annotation/profile inputs, preserving host-only data by reference. */\nexport async function resolveAnnotationCharacterConfig<T extends AnnotationCharacterConfig>(config: T): Promise<T> {\n await initEmbodyCore();\n const keys = ['profilePresetId', 'presetId', 'baseProfileId', 'auPresetType', 'annotationRegions', 'regions', 'disabledRegions', 'boneNodes', 'bonePrefix', 'boneSuffix', 'suffixPattern', 'auToMorphs', 'auToBones', 'morphToMesh', 'markerGroups', 'lineDefaults', 'markerDefaults'] as const;\n const input: Record<string, unknown> = {};\n for (const key of keys) if (config[key] !== undefined) input[key] = config[key];\n if (config.profile) {\n input.profile = Object.fromEntries(keys.filter(k => config.profile?.[k] !== undefined).map(k => [k, config.profile![k]]));\n }\n const extended = request<Record<string, unknown>>('profile.extendConfig', { config: input });\n const resolved = { ...config };\n for (const key of keys) if (extended[key] !== undefined) (resolved as Record<string, unknown>)[key] = extended[key];\n resolved.regions ??= resolved.annotationRegions ?? [];\n return resolved;\n}\n\nexport function resolveBoneNames(names: string[] | undefined, profile?: BoneResolutionProfile | null): string[] {\n if (!names?.length) return [];\n return profile ? request('profile.resolveBoneNames', { profile, names }) : [...new Set(names)];\n}\nexport function fuzzyNameMatch(objectName: string, targetName: string, suffixPattern?: string): boolean { return request('name.fuzzyMatch', { objectName, targetName, suffixPattern }); }\nexport function getDefaultAnnotationLaterality(): AnnotationLaterality { return { leftSideX: -1, confidence: 0, evidence: ['default:left=-X'] }; }\nfunction semanticSide(name: string) { return /(^|[_\\s-])(left|right)(?=$|[_\\s-])/i.exec(name)?.[2].toLowerCase() as 'left' | 'right' | undefined; }\nexport function getSemanticHorizontalSignForSide(side: 'left' | 'right', laterality: AnnotationLaterality): 1 | -1 { return side === 'left' ? laterality.leftSideX : laterality.leftSideX === 1 ? -1 : 1; }\nexport function getSemanticHorizontalSign(name: string, laterality: AnnotationLaterality) { const side = semanticSide(name); return side ? getSemanticHorizontalSignForSide(side, laterality) : null; }\nexport function resolveRegionCameraAngle(region: Region, laterality: AnnotationLaterality) {\n if (region.cameraAngle == null) return undefined;\n const angle = requireInitializedEmbodyCore().normalize_camera_angle_degrees(region.cameraAngle);\n const side = semanticSide(region.name);\n return side && (angle === 90 || angle === 270) ? getSemanticHorizontalSignForSide(side, laterality) > 0 ? 90 : 270 : angle;\n}\nexport function resolveRegionVisibilityCameraAngle(region: Region, laterality: AnnotationLaterality) {\n const angle = resolveRegionCameraAngle(region, laterality);\n const side = semanticSide(region.name);\n return angle ?? (region.parent && side ? getSemanticHorizontalSignForSide(side, laterality) > 0 ? 90 : 270 : undefined);\n}\nfunction modelQuaternion(model: Object3D | null) { if (!model) return undefined; model.updateMatrixWorld(true); return model.getWorldQuaternion(new Quaternion()); }\nexport function toWorldDirection(model: Object3D | null, local: Vector3) { const q = modelQuaternion(model); const direction = local.clone(); return (q ? direction.applyQuaternion(q) : direction).normalize(); }\nexport function getWorldDirectionForCameraAngle(model: Object3D | null, angle: number) { const v = requireInitializedEmbodyCore().world_direction_for_camera_angle(quat(modelQuaternion(model)), angle); return new Vector3(v[0], v[1], v[2]); }\nexport function getModelLocalOrbitAngle(model: Object3D | null, center: Vector3, position: Vector3) {\n const local = position.clone().sub(center); const q = modelQuaternion(model); if (q) local.applyQuaternion(q.invert()); local.normalize();\n return requireInitializedEmbodyCore().normalize_camera_angle_degrees(Math.atan2(local.x, local.z) * 180 / Math.PI);\n}\nexport function passesMarkerCameraAngleGate(o: { markerAngle?: number; currentCameraAngle?: number; rangeDegrees?: number }) { return requireInitializedEmbodyCore().passes_marker_camera_angle_gate(o.markerAngle, o.currentCameraAngle, o.rangeDegrees); }\n\nconst matches = (name: string, target: string, suffix?: string) => fuzzyNameMatch(name, target, suffix) || name.toLowerCase().includes(target.toLowerCase());\nfunction matchingObject(model: Object3D, target: string, suffix?: string): Object3D | undefined {\n let found: Object3D | undefined;\n model.traverse(object => { if (!found && matches(object.name, target, suffix)) found = object; });\n return found;\n}\nfunction matchingCandidates(model: Object3D, targets: string[], suffix?: string) { for (const target of targets) { const object = matchingObject(model, target, suffix); if (object) return object; } }\n\n/** Reduce scene objects to a world-space annotation anchor; numeric camera math stays in Rust. */\nexport function resolveFaceCenter(model: Object3D, region: Region, profile?: BoneResolutionProfile | null) {\n model.updateMatrixWorld(true);\n const box = new Box3().setFromObject(model); const size = box.getSize(new Vector3());\n const suffix = profile?.suffixPattern;\n const heads = resolveBoneNames(region.bones, profile).filter(name => name.toLowerCase().includes('head'));\n const head = matchingCandidates(model, heads.length ? heads : ['CC_Base_Head', 'Head', 'head', 'Bip01_Head'], suffix);\n const left = matchingCandidates(model, ['CC_Base_L_Eye', 'LeftEye', 'Eye_L', 'L_Eye'], suffix);\n const right = matchingCandidates(model, ['CC_Base_R_Eye', 'RightEye', 'Eye_R', 'R_Eye'], suffix);\n const meshBox = new Box3();\n if (region.meshes?.length) model.traverse(object => { if ((object as any).isMesh && region.meshes!.some(name => matches(object.name, name, suffix))) { const b = new Box3().setFromObject(object); if (!b.isEmpty()) meshBox.union(b); } });\n if (!meshBox.isEmpty() && meshBox.getSize(new Vector3()).y <= size.y * 0.7) return { center: meshBox.getCenter(new Vector3()), method: 'mesh-center', debugInfo: [] as string[] };\n const headBonePosition = head?.getWorldPosition(new Vector3());\n if (left && right) return { center: left.getWorldPosition(new Vector3()).add(right.getWorldPosition(new Vector3())).multiplyScalar(0.5), headBonePosition, method: 'head-bone-offset', debugInfo: [] as string[] };\n if (headBonePosition) return { center: headBonePosition.clone().addScaledVector(toWorldDirection(model, new Vector3(0, 0, 1)), 0.08 * size.y / 1.8), headBonePosition, method: 'head-bone-offset', debugInfo: [] as string[] };\n const center = box.getCenter(new Vector3()); center.y = box.min.y + size.y * 0.9;\n return { center, method: 'fallback', debugInfo: [] as string[] };\n}\nexport function detectAnnotationLaterality(model: Object3D | null, regions: Region[], profile: BoneResolutionProfile | null): AnnotationLaterality {\n if (!model || !regions.length) return getDefaultAnnotationLaterality();\n model.updateMatrixWorld(true); let signed = 0; let total = 0;\n for (const region of regions) {\n const side = semanticSide(region.name); if (!side) continue;\n const object = matchingCandidates(model, resolveBoneNames(region.bones, profile), profile?.suffixPattern); if (!object) continue;\n const x = model.worldToLocal(object.getWorldPosition(new Vector3())).x;\n if (Math.abs(x) > 0.001) { signed += side === 'left' ? x : -x; total += Math.abs(x); }\n }\n return total > 0 ? { leftSideX: signed > 0 ? 1 : -1, confidence: Math.abs(signed) / total, evidence: [] } : getDefaultAnnotationLaterality();\n}\n","import {\n createRustAnnotationCameraCore,\n type RustAnnotationCameraCore,\n} from './adapter';\n\nlet core: RustAnnotationCameraCore | null = null;\nlet initialization: Promise<RustAnnotationCameraCore> | null = null;\n\n/** Share the stateless Rust math adapter across cameras and markers. */\nexport function getAnnotationCameraCore(): Promise<RustAnnotationCameraCore> {\n initialization ??= createRustAnnotationCameraCore().then(\n (initialized) => {\n core = initialized;\n return initialized;\n },\n (error: unknown) => {\n initialization = null;\n throw error;\n },\n );\n return initialization;\n}\n\n/** Synchronous render-loop math is available after the owning load awaits initialization. */\nexport function requireAnnotationCameraCore(): RustAnnotationCameraCore {\n if (!core) {\n throw new Error('Annotation camera core is not ready. Await getAnnotationCameraCore() before using annotation math.');\n }\n return core;\n}\n","import type { PerspectiveCamera, Scene } from 'three';\nimport type { CharacterSceneRenderer, CharacterSceneRenderingController } from './scene';\n\n/** Adapter-private binding. Applications pass config.rendering to the camera controller. */\nexport type SceneRenderingBinding = {\n suspend(): Promise<void>;\n prepare(renderer: CharacterSceneRenderer): Promise<void>;\n commit(renderer: CharacterSceneRenderer): Promise<void>;\n onError(error: unknown): void;\n};\n\ntype Owner = {\n scene: Scene;\n camera: PerspectiveCamera;\n binding: SceneRenderingBinding | null;\n disposed: boolean;\n drain: Promise<void> | null;\n settled: () => Promise<unknown> | null;\n reportFailure: (error: unknown, renderer?: CharacterSceneRenderer | null) => void;\n};\nconst owners = new WeakMap<CharacterSceneRenderingController, Owner>();\n\nexport function registerSceneRendering(controller: CharacterSceneRenderingController, scene: Scene, camera: PerspectiveCamera, settled: () => Promise<unknown> | null, reportFailure: (error: unknown, renderer?: CharacterSceneRenderer | null) => void) {\n const owner: Owner = { scene, camera, binding: null, disposed: false, drain: null, settled, reportFailure };\n owners.set(controller, owner);\n return owner;\n}\n\nexport function bindSceneRendering(controller: CharacterSceneRenderingController, scene: Scene, camera: PerspectiveCamera, binding: SceneRenderingBinding) {\n const owner = owners.get(controller);\n if (!owner || owner.disposed) throw new Error('Character scene rendering has been disposed or is not owned by Embody.');\n if (owner.scene !== scene || owner.camera !== camera) throw new Error('Rendering and camera controllers must share their scene and camera.');\n if (owner.binding) throw new Error('Character scene rendering already has a camera controller.');\n owner.binding = binding;\n const snapshot = controller.getSnapshot();\n if (snapshot.renderer) void binding.commit(snapshot.renderer).catch(binding.onError);\n if (snapshot.status !== 'ready' && snapshot.status !== 'error') void binding.suspend().catch(binding.onError);\n return () => {\n if (owner.binding === binding) {\n owner.drain = binding.suspend();\n void owner.drain.catch(() => undefined);\n owner.binding = null;\n return Promise.allSettled([owner.drain, owner.settled()]).then(() => undefined);\n }\n return null;\n };\n}\n\nexport function reportSceneRenderingFailure(controller: CharacterSceneRenderingController, error: unknown, renderer?: CharacterSceneRenderer | null) {\n const owner = owners.get(controller);\n if (owner && !owner.disposed) owner.reportFailure(error, renderer);\n}\n","import { Float32BufferAttribute, FloatType } from 'three';\nimport type { BufferAttribute, BufferGeometry, InterleavedBufferAttribute, Object3D, SkinnedMesh } from 'three';\n\n/** Keep joint indices compatible with both native WebGPU and WebGL skinning. */\nexport function prepareModelSkinning(model: Object3D): () => void {\n const replacements: { geometry: BufferGeometry; original: BufferAttribute | InterleavedBufferAttribute; prepared: BufferAttribute }[] = [];\n model.traverse(object => {\n const mesh = object as SkinnedMesh;\n if (!mesh.isSkinnedMesh) return;\n const geometry = mesh.geometry;\n const original = geometry.getAttribute('skinIndex');\n if (!original) return;\n if (original.array instanceof Float32Array && (!('gpuType' in original) || original.gpuType === FloatType)) return;\n\n // Three's native backend widens Uint8/Uint16 attributes in place to Uint32.\n // WebGL then uses vertexAttribIPointer, but its skinIndex shader input is\n // vec4. Float32 preserves every glTF joint index and avoids that mutation.\n // Read components so interleaved indices do not copy adjacent attributes.\n const prepared = new Float32BufferAttribute(original.count * original.itemSize, original.itemSize);\n for (let vertex = 0; vertex < original.count; vertex++) {\n for (let component = 0; component < original.itemSize; component++) {\n prepared.setComponent(vertex, component, original.getComponent(vertex, component));\n }\n }\n prepared.name = original.name;\n prepared.setUsage('data' in original ? original.data.usage : original.usage);\n geometry.setAttribute('skinIndex', prepared);\n replacements.push({ geometry, original, prepared });\n });\n // A replacement renderer may fail after compilation. The old native pipeline\n // still expects its original attribute format, so restore its exact objects.\n return () => {\n for (const { geometry, original, prepared } of replacements) {\n if (geometry.getAttribute('skinIndex') === prepared) geometry.setAttribute('skinIndex', original);\n }\n };\n}\n","import * as THREE from 'three';\nimport type { CharacterSceneRenderer } from '../scene';\nimport { prepareModelSkinning } from '../modelSkinning';\n\nfunction captureRenderTarget(renderer: CharacterSceneRenderer): () => void {\n const face = renderer.getActiveCubeFace();\n const mip = renderer.getActiveMipmapLevel();\n if ('isWebGPURenderer' in renderer) {\n const target = renderer.getRenderTarget();\n return () => renderer.setRenderTarget(target, face, mip);\n }\n const target = renderer.getRenderTarget();\n return () => renderer.setRenderTarget(target, face, mip);\n}\n\n/** Match the lazy bounds used by Three's Frustum.intersectsObject. */\nfunction initializeModelCullingBounds(model: THREE.Object3D): void {\n model.traverseVisible((object) => {\n if (!object.frustumCulled) return;\n const drawable = object as THREE.Mesh & THREE.Line & THREE.Points;\n if (!(drawable.isMesh || drawable.isLine || drawable.isPoints)) return;\n if ('boundingSphere' in drawable) {\n if (drawable.boundingSphere === null && 'computeBoundingSphere' in drawable\n && typeof drawable.computeBoundingSphere === 'function') drawable.computeBoundingSphere();\n } else if (drawable.geometry.boundingSphere === null) drawable.geometry.computeBoundingSphere();\n });\n}\n\n/** Only the model root is exposed; authored child visibility and layers are retained. */\nfunction withPreparedModel<T>(\n scene: THREE.Scene, model: THREE.Object3D, operation: () => T,\n options: { initializeBounds?: boolean } = {},\n): T {\n if (model === scene) throw new Error('Render preparation requires a model, not the controller scene.');\n let ancestor = model;\n while (ancestor.parent) {\n ancestor = ancestor.parent;\n if (!ancestor.visible) throw new Error('Render preparation requires visible model ancestors.');\n }\n if (model.parent && ancestor !== scene) throw new Error('Render preparation requires a detached model or a model in the controller scene.');\n const detached = !model.parent;\n const visible = model.visible;\n const culling = new Map<THREE.Object3D, boolean>();\n try {\n if (detached) scene.add(model);\n model.visible = true;\n if (options.initializeBounds) {\n // Skin bounds use bone.matrixWorld and current morph weights, not the\n // uploaded skeleton buffer. Refresh the same hierarchy the draw will use.\n scene.updateMatrixWorld(true);\n initializeModelCullingBounds(model);\n }\n model.traverseVisible((object) => {\n culling.set(object, object.frustumCulled);\n object.frustumCulled = false;\n });\n return operation();\n } finally {\n culling.forEach((value, object) => { object.frustumCulled = value; });\n model.visible = visible;\n if (detached) scene.remove(model);\n }\n}\n\n/** Three collects visible surfaces before yielding; no shared mutations span the await. */\nexport function compileModelForRender(\n renderer: CharacterSceneRenderer, scene: THREE.Scene, camera: THREE.Camera, model: THREE.Object3D,\n): Promise<unknown> {\n if ('isWebGPURenderer' in renderer && !renderer.hasInitialized()) {\n throw new Error('Model render preparation requires an initialized WebGPU renderer.');\n }\n // Only the caller-owned model is retained across asynchronous compilation.\n // Controller markers may still be replaced/disposed while this is pending.\n return withPreparedModel(scene, model, () => {\n prepareModelSkinning(model);\n return renderer.compileAsync(model, camera, scene);\n });\n}\n\n/** One complete scene draw initializes native geometry/textures and real shadow variants. */\nexport function drawModelForRender(\n renderer: CharacterSceneRenderer, scene: THREE.Scene, camera: THREE.Camera, model: THREE.Object3D,\n): () => void {\n const viewport = renderer.getViewport(new THREE.Vector4());\n const scissor = renderer.getScissor(new THREE.Vector4());\n const scissorTest = renderer.getScissorTest();\n const restoreRenderTarget = captureRenderTarget(renderer);\n const autoClear = renderer.autoClear;\n const clearColor = renderer.getClearColor(Object.assign(new THREE.Color(), { a: 1 }));\n const clearAlpha = renderer.getClearAlpha();\n const native = 'isWebGPURenderer' in renderer ? renderer : null;\n const renderObject = native?.getRenderObjectFunction();\n const mrt = native?.getMRT();\n const background = scene.background;\n const hasBackgroundNode = 'backgroundNode' in scene;\n const backgroundNode = hasBackgroundNode ? scene.backgroundNode : undefined;\n const overrideMaterial = scene.overrideMaterial;\n const sceneName = scene.name;\n const globalShadow = 'autoUpdate' in renderer.shadowMap ? renderer.shadowMap : null;\n const globalAutoUpdate = globalShadow?.autoUpdate;\n const globalNeedsUpdate = globalShadow?.needsUpdate;\n const shadows: { shadow: THREE.LightShadow; layers: number; autoUpdate: boolean; needsUpdate: boolean; remainingUpdate?: boolean }[] = [];\n let rendered = false;\n try {\n withPreparedModel(scene, model, () => {\n if (renderer.shadowMap.enabled) {\n scene.traverseVisible((object) => {\n const light = object as THREE.Light & { shadow?: THREE.LightShadow };\n if (light.isLight && light.castShadow && light.shadow && light.layers.test(camera.layers)) {\n const shadow = light.shadow;\n shadows.push({ shadow, layers: shadow.camera.layers.mask, autoUpdate: shadow.autoUpdate, needsUpdate: shadow.needsUpdate });\n shadow.needsUpdate = true;\n }\n });\n if (globalShadow) globalShadow.needsUpdate = true;\n }\n renderer.autoClear = false;\n // Color backgrounds force a framebuffer clear even with autoClear=false;\n // viewport clipping alone cannot keep that clear off the visible canvas.\n if (scene.background && 'isColor' in scene.background) scene.background = null;\n renderer.setViewport(0, 0, 0, 0);\n renderer.render(scene, camera);\n rendered = true;\n for (const state of shadows) state.remainingUpdate = state.shadow.needsUpdate;\n }, { initializeBounds: true });\n } finally {\n // Restore public state even when a native nested shadow draw throws before\n // Three's own restoration. The draw never changes authored layers/materials.\n restoreRenderTarget();\n renderer.setViewport(viewport);\n renderer.setScissor(scissor);\n renderer.setScissorTest(scissorTest);\n renderer.setClearColor(clearColor, clearAlpha);\n renderer.autoClear = autoClear;\n if (native) { native.setRenderObjectFunction(renderObject ?? null); native.setMRT(mrt ?? null); }\n scene.background = background;\n if (hasBackgroundNode) Object.assign(scene, { backgroundNode });\n else Reflect.deleteProperty(scene, 'backgroundNode');\n scene.overrideMaterial = overrideMaterial;\n scene.name = sceneName;\n for (const { shadow, layers, autoUpdate, needsUpdate, remainingUpdate } of shadows) {\n shadow.camera.layers.mask = layers;\n shadow.autoUpdate = autoUpdate;\n shadow.needsUpdate = rendered ? needsUpdate || !!remainingUpdate : true;\n }\n if (globalShadow) {\n globalShadow.autoUpdate = globalAutoUpdate!;\n globalShadow.needsUpdate = rendered ? globalNeedsUpdate! : true;\n }\n }\n // Cancellation can arrive between this synchronous draw and readiness\n // settlement. The host will not reveal that model, so its static maps expire.\n return () => {\n for (const { shadow } of shadows) shadow.needsUpdate = true;\n if (globalShadow && renderer.shadowMap.enabled) globalShadow.needsUpdate = true;\n };\n}\n","import { Timer } from 'three';\nimport type { AnimationMixer, Object3D } from 'three';\n\ntype Binding = { mixer: AnimationMixer; enabled: boolean; afterFrame: () => void };\nconst bindings = new WeakMap<Object3D, Set<Binding>>();\n\n/** Register native playback with the existing scene renderer; never starts a loop. */\nexport function bindPlaybackRendering(model: Object3D, mixer: AnimationMixer, afterFrame: () => void) {\n const binding: Binding = { mixer, enabled: true, afterFrame };\n const entries = bindings.get(model) ?? new Set<Binding>();\n entries.add(binding);\n bindings.set(model, entries);\n return {\n setEnabled(enabled: boolean) { binding.enabled = enabled; },\n dispose() {\n entries.delete(binding);\n if (!entries.size) bindings.delete(model);\n },\n };\n}\n\n/** Called once by the Three render integration, using its native Timer. */\nexport function renderScenePlayback(scene: Object3D, timer: Timer): void {\n const mixers = new Set<AnimationMixer>();\n const active: Binding[] = [];\n scene.traverse((object) => {\n for (const binding of bindings.get(object) ?? []) {\n if (binding.enabled) { active.push(binding); mixers.add(binding.mixer); }\n }\n });\n for (const mixer of mixers) mixer.update(timer.getDelta());\n // Native finished callbacks run inside mixer iteration. Resource release and\n // observers must wait until every mixer has finished sampling this frame.\n for (const binding of active) binding.afterFrame();\n}\n\n/** Frame hook for an existing Three/R3F renderer. Does not create a render loop. */\nexport function createScenePlaybackFrame(scene: Object3D, document?: Document) {\n const timer = new Timer();\n if (document) timer.connect(document);\n let disposed = false;\n let initialized = false;\n return {\n onFrame(timestamp?: number) {\n if (disposed) return;\n timer.update(timestamp);\n // The first render establishes this renderer's timestamp origin.\n if (!initialized) { initialized = true; return; }\n renderScenePlayback(scene, timer);\n },\n dispose() { if (!disposed) { disposed = true; timer.dispose(); } },\n };\n}\n","/**\n * Self-contained DOM controls for DPthreeCameraController\n * No React dependencies - vanilla DOM manipulation\n */\nexport interface DOMControlRegion {\n name: string;\n parent?: string;\n children?: string[];\n}\n\nexport interface DOMControlsConfig {\n /** Container element to append controls to */\n container: HTMLElement;\n /** Callback when user selects a region */\n onRegionSelect: (name: string) => void;\n /** Initial list of regions */\n regions: DOMControlRegion[];\n /** Currently selected region */\n currentRegion?: string;\n /** Initial annotation-marker visibility */\n markersVisible?: boolean;\n /** Callback when the Markers checkbox is toggled */\n onMarkersVisibleChange?: (visible: boolean) => void;\n}\n\n/** Temporary AU preview regions must never appear in the View dropdown. */\nexport const RUNTIME_ANNOTATION_REGION_PREFIX = 'runtime:annotation:';\n\nexport function isRuntimeAnnotationRegionName(name: string): boolean {\n return name.startsWith(RUNTIME_ANNOTATION_REGION_PREFIX);\n}\n\nexport function filterCameraViewRegions<T extends { name: string }>(regions: T[]): T[] {\n return regions.filter((region) => !isRuntimeAnnotationRegionName(region.name));\n}\n\n/**\n * CSS styles for the DOM controls\n * Scoped with unique class prefix to avoid conflicts\n */\nconst STYLES = `\n.acc-controls {\n position: absolute;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1000;\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: rgba(0, 0, 0, 0.7);\n border-radius: 8px;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.acc-select {\n background: rgba(255, 255, 255, 0.1);\n color: white;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 14px;\n cursor: pointer;\n outline: none;\n width: 160px;\n max-width: 160px;\n min-width: 160px;\n appearance: none;\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='white' d='M6 8L2 4h8z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 8px center;\n padding-right: 28px;\n}\n\n.acc-markers {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: 4px;\n padding-left: 10px;\n border-left: 1px solid rgba(255, 255, 255, 0.15);\n color: rgba(255, 255, 255, 0.85);\n font-size: 12px;\n user-select: none;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.acc-markers input {\n margin: 0;\n cursor: pointer;\n accent-color: #3182ce;\n}\n\n.acc-select:hover {\n background-color: rgba(255, 255, 255, 0.15);\n border-color: rgba(255, 255, 255, 0.3);\n}\n\n.acc-select:focus {\n border-color: #3182ce;\n box-shadow: 0 0 0 2px rgba(49, 130, 206, 0.3);\n}\n\n.acc-select option {\n background: #1a202c;\n color: white;\n padding: 8px;\n}\n\n.acc-label {\n color: rgba(255, 255, 255, 0.7);\n font-size: 12px;\n display: flex;\n align-items: center;\n margin-right: 4px;\n}\n`;\n\n// Track if styles have been injected\nlet stylesInjected = false;\n\nfunction injectStyles(): void {\n if (stylesInjected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.setAttribute('data-acc-styles', 'true');\n style.textContent = STYLES;\n document.head.appendChild(style);\n stylesInjected = true;\n}\n\n/**\n * Format region name for display\n * Converts snake_case to Title Case\n */\nfunction formatName(name: string): string {\n return name\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nfunction getRegionDepth(\n region: DOMControlRegion,\n regionByName: Map<string, DOMControlRegion>,\n seen: Set<string> = new Set()\n): number {\n if (!region.parent || seen.has(region.name)) {\n return 0;\n }\n\n const parent = regionByName.get(region.parent);\n if (!parent) {\n return 0;\n }\n\n seen.add(region.name);\n return getRegionDepth(parent, regionByName, seen) + 1;\n}\n\nexport function buildRegionDisplayOptions(\n regions: DOMControlRegion[]\n): Array<{ name: string; label: string }> {\n const viewRegions = filterCameraViewRegions(regions);\n const regionByName = new Map(viewRegions.map((region) => [region.name, region]));\n\n return viewRegions.map((region) => {\n const depth = getRegionDepth(region, regionByName);\n const prefix = depth > 0 ? `${'-- '.repeat(depth)}` : '';\n return {\n name: region.name,\n label: `${prefix}${formatName(region.name)}`,\n };\n });\n}\n\n/**\n * CameraDOMControls - Self-contained DOM UI for region selection\n */\nexport class CameraDOMControls {\n private container: HTMLElement;\n private wrapper: HTMLDivElement;\n private select: HTMLSelectElement;\n private markersCheckbox: HTMLInputElement | null = null;\n private onRegionSelect: (name: string) => void;\n private onMarkersVisibleChange?: (visible: boolean) => void;\n\n constructor(config: DOMControlsConfig) {\n // Inject styles once\n injectStyles();\n\n this.container = config.container;\n this.onRegionSelect = config.onRegionSelect;\n this.onMarkersVisibleChange = config.onMarkersVisibleChange;\n\n // Create wrapper\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'acc-controls';\n\n // Create label\n const label = document.createElement('span');\n label.className = 'acc-label';\n label.textContent = 'View:';\n this.wrapper.appendChild(label);\n\n // Create select\n this.select = document.createElement('select');\n this.select.className = 'acc-select';\n this.populateSelect(config.regions, config.currentRegion);\n\n // Handle selection changes\n this.select.addEventListener('change', () => {\n this.onRegionSelect(this.select.value);\n });\n\n this.wrapper.appendChild(this.select);\n\n if (this.onMarkersVisibleChange) {\n const markersLabel = document.createElement('label');\n markersLabel.className = 'acc-markers';\n\n this.markersCheckbox = document.createElement('input');\n this.markersCheckbox.type = 'checkbox';\n this.markersCheckbox.checked = Boolean(config.markersVisible);\n this.markersCheckbox.setAttribute('aria-label', 'Show annotation markers');\n this.markersCheckbox.addEventListener('change', () => {\n this.onMarkersVisibleChange?.(this.markersCheckbox!.checked);\n });\n\n const markersText = document.createElement('span');\n markersText.textContent = 'Markers';\n\n markersLabel.appendChild(this.markersCheckbox);\n markersLabel.appendChild(markersText);\n this.wrapper.appendChild(markersLabel);\n }\n\n // Append to container\n // Ensure container has relative positioning for absolute positioning to work\n const containerStyle = window.getComputedStyle(this.container);\n if (containerStyle.position === 'static') {\n this.container.style.position = 'relative';\n }\n\n this.container.appendChild(this.wrapper);\n }\n\n /**\n * Populate select options\n */\n private populateSelect(regions: DOMControlRegion[], current?: string): void {\n this.select.innerHTML = '';\n\n const viewRegions = filterCameraViewRegions(regions);\n\n if (viewRegions.length === 0) {\n const option = document.createElement('option');\n option.value = '';\n option.textContent = 'No regions';\n option.disabled = true;\n this.select.appendChild(option);\n return;\n }\n\n buildRegionDisplayOptions(viewRegions).forEach(({ name, label }) => {\n const option = document.createElement('option');\n option.value = name;\n option.textContent = label;\n if (name === current) {\n option.selected = true;\n }\n this.select.appendChild(option);\n });\n }\n\n /**\n * Update available regions\n */\n updateRegions(regions: DOMControlRegion[], current?: string): void {\n this.populateSelect(regions, current);\n }\n\n /**\n * Sync Markers checkbox with controller visibility state.\n */\n setMarkersVisible(visible: boolean): void {\n if (!this.markersCheckbox || this.markersCheckbox.checked === visible) return;\n this.markersCheckbox.checked = visible;\n }\n\n /**\n * Set current region (updates select value)\n */\n setCurrentRegion(name: string): void {\n if (this.select.value !== name) {\n this.select.value = name;\n }\n }\n\n /**\n * Show/hide controls\n */\n setVisible(visible: boolean): void {\n this.wrapper.style.display = visible ? 'flex' : 'none';\n }\n\n /**\n * Check if controls are visible\n */\n isVisible(): boolean {\n return this.wrapper.style.display !== 'none';\n }\n\n /**\n * Cleanup and remove from DOM\n */\n dispose(): void {\n this.wrapper.remove();\n }\n}\n","import type * as THREE from 'three';\n\nconst SLICE_BUDGET_MS = 4;\n\n/**\n * Keep Three's native per-mesh raycast, including skinning, morphs and material\n * sides. Yield between meshes once a slice is spent; one mesh is indivisible.\n * A null result means the owning model/region load was replaced or disposed.\n */\nexport async function intersectMeshesInSlices(\n raycaster: THREE.Raycaster,\n meshes: readonly THREE.Mesh[],\n options: { isCurrent: () => boolean; yieldToPaint: () => Promise<void>; now?: () => number },\n): Promise<THREE.Intersection[] | null> {\n const now = options.now ?? (() => performance.now());\n let sliceStart = now();\n const hits: THREE.Intersection[] = [];\n for (const [index, mesh] of meshes.entries()) {\n if (!options.isCurrent()) return null;\n // Let Raycaster apply its native layer checks and Mesh/SkinnedMesh logic.\n // Accumulate separately so earlier meshes' hits aren't sorted repeatedly.\n for (const hit of raycaster.intersectObject(mesh, false)) hits.push(hit);\n if (!options.isCurrent()) return null;\n if (index < meshes.length - 1 && now() - sliceStart >= SLICE_BUDGET_MS) {\n await options.yieldToPaint();\n if (!options.isCurrent()) return null;\n sliceStart = now();\n }\n }\n if (!options.isCurrent()) return null;\n // Same stable distance ordering as Raycaster.intersectObjects(meshes, false).\n return hits.sort((left, right) => left.distance - right.distance);\n}\n","/** Continue in a task after paint, rather than in the animation-frame microtask. */\nexport function waitForCharacterLoadPaint(): Promise<void> {\n return new Promise((resolve) => {\n let frame: number | undefined;\n let task: ReturnType<typeof setTimeout> | undefined;\n const finish = () => {\n clearTimeout(fallback);\n if (task !== undefined) clearTimeout(task);\n if (frame !== undefined && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(frame);\n resolve();\n };\n // Hidden tabs can suspend rAF, including after the visibility check.\n const fallback = setTimeout(finish, 100);\n if (typeof requestAnimationFrame === 'function' &&\n (typeof document === 'undefined' || document.visibilityState !== 'hidden')) {\n frame = requestAnimationFrame(() => { task = setTimeout(finish, 0); });\n } else {\n task = setTimeout(finish, 0);\n }\n });\n}\n","export type AnimationFrameTask = (now: number) => boolean;\n\n/**\n * Runs multiple short UI animation tasks from one requestAnimationFrame loop.\n *\n * Tasks return true while they need another frame and false when complete.\n */\nexport class AnimationFrameTaskScheduler {\n private frameId: number | null = null;\n private readonly tasks = new Map<string, AnimationFrameTask>();\n\n get size(): number {\n return this.tasks.size;\n }\n\n has(key: string): boolean {\n return this.tasks.has(key);\n }\n\n schedule(key: string, task: AnimationFrameTask, runImmediately = true): void {\n this.cancel(key);\n\n if (runImmediately && !task(performance.now())) {\n return;\n }\n\n this.tasks.set(key, task);\n this.requestFrame();\n }\n\n cancel(key: string): void {\n this.tasks.delete(key);\n this.cancelFrameIfIdle();\n }\n\n cancelAll(): void {\n this.tasks.clear();\n this.cancelFrameIfIdle();\n }\n\n private requestFrame(): void {\n if (this.frameId !== null || this.tasks.size === 0) {\n return;\n }\n\n this.frameId = requestAnimationFrame(this.tick);\n }\n\n private readonly tick = (now: number): void => {\n this.frameId = null;\n\n for (const [key, task] of Array.from(this.tasks)) {\n if (!this.tasks.has(key) || !task(now)) {\n this.tasks.delete(key);\n }\n }\n\n this.requestFrame();\n };\n\n private cancelFrameIfIdle(): void {\n if (this.tasks.size > 0 || this.frameId === null) {\n return;\n }\n\n cancelAnimationFrame(this.frameId);\n this.frameId = null;\n }\n}\n","import type {\n AnnotationAnchoredRegion,\n AnnotationMarkerAnchor,\n Region,\n} from './types';\n\nexport type MarkerAnchorProjectionMode = 'legacy' | 'project' | 'skip';\n\nexport interface ResolvedMarkerAnchorRegion {\n region: AnnotationAnchoredRegion;\n anchor: AnnotationMarkerAnchor | null;\n source: 'legacy-region' | 'marker-anchor';\n projection: MarkerAnchorProjectionMode;\n useLegacyRegionSemantics: boolean;\n}\n\nfunction cloneRegion(region: Region): AnnotationAnchoredRegion {\n return {\n ...(region as AnnotationAnchoredRegion),\n };\n}\n\nfunction copyTargets(\n target: AnnotationAnchoredRegion,\n anchor: AnnotationMarkerAnchor,\n): AnnotationAnchoredRegion {\n const next = cloneRegion(target);\n\n if (anchor.bones) {\n next.bones = [...anchor.bones];\n }\n if (anchor.meshes) {\n next.meshes = [...anchor.meshes];\n }\n if (anchor.objects) {\n next.objects = [...anchor.objects];\n }\n\n return next;\n}\n\nfunction getExplicitMarkerAnchor(region: Region): AnnotationMarkerAnchor | null {\n return (region as AnnotationAnchoredRegion).markerAnchor ?? null;\n}\n\nfunction resolveExplicitProjection(anchor: AnnotationMarkerAnchor): MarkerAnchorProjectionMode {\n if (anchor.projectToSurface !== undefined) {\n return anchor.projectToSurface ? 'project' : 'skip';\n }\n\n if (anchor.type === 'point' || anchor.type === 'mesh') {\n return 'skip';\n }\n\n return 'project';\n}\n\n/**\n * Convert explicit marker-anchor intent into the legacy region target fields\n * that the current marker renderers understand.\n */\nexport function resolveMarkerAnchorRegion(region: Region): ResolvedMarkerAnchorRegion {\n const anchor = getExplicitMarkerAnchor(region);\n if (!anchor) {\n return {\n region: region as AnnotationAnchoredRegion,\n anchor: null,\n source: 'legacy-region',\n projection: 'legacy',\n useLegacyRegionSemantics: true,\n };\n }\n\n if (anchor.type === 'region') {\n return {\n region: region as AnnotationAnchoredRegion,\n anchor,\n source: 'marker-anchor',\n projection: anchor.projectToSurface === undefined\n ? 'legacy'\n : anchor.projectToSurface\n ? 'project'\n : 'skip',\n useLegacyRegionSemantics: true,\n };\n }\n\n if (anchor.type === 'point' && anchor.position) {\n return {\n region: {\n ...cloneRegion(region),\n bones: undefined,\n meshes: undefined,\n objects: undefined,\n customPosition: { ...anchor.position },\n },\n anchor,\n source: 'marker-anchor',\n projection: resolveExplicitProjection(anchor),\n useLegacyRegionSemantics: false,\n };\n }\n\n const next = copyTargets(\n {\n ...cloneRegion(region),\n bones: undefined,\n meshes: undefined,\n objects: undefined,\n customPosition: undefined,\n },\n anchor,\n );\n\n if (anchor.type === 'bone' && !next.bones) {\n next.bones = (region as AnnotationAnchoredRegion).bones;\n } else if (anchor.type === 'mesh' && !next.meshes) {\n next.meshes = (region as AnnotationAnchoredRegion).meshes;\n } else if (anchor.type === 'object' && !next.objects) {\n next.objects = (region as AnnotationAnchoredRegion).objects;\n } else if (anchor.type === 'face-center') {\n next.bones = next.bones ?? (region as AnnotationAnchoredRegion).bones;\n next.meshes = next.meshes ?? (region as AnnotationAnchoredRegion).meshes;\n }\n\n return {\n region: next,\n anchor,\n source: 'marker-anchor',\n projection: resolveExplicitProjection(anchor),\n useLegacyRegionSemantics: false,\n };\n}\n\nexport function shouldUseFaceCenterForMarkerAnchor(\n resolved: ResolvedMarkerAnchorRegion,\n): boolean {\n if (resolved.anchor?.type === 'face-center') {\n return true;\n }\n\n return resolved.useLegacyRegionSemantics && resolved.region.name.toLowerCase().includes('face');\n}\n\nexport function shouldProjectMarkerAnchorToSurface(\n resolved: ResolvedMarkerAnchorRegion,\n legacyDefault: boolean,\n): boolean {\n if (resolved.projection === 'legacy') {\n return legacyDefault;\n }\n\n return resolved.projection === 'project';\n}\n","import * as THREE from 'three';\nimport type { AnnotationAnchoredRegion, RuntimeAnnotationSide } from './types';\n\nconst MORPH_ANCHOR_DELTA_EPSILON = 1e-5;\nconst MORPH_ANCHOR_CANDIDATE_DELTA_RATIO = 0.06;\nconst MORPH_ANCHOR_SIGNIFICANT_DELTA_RATIO = 0.18;\nconst MORPH_ANCHOR_MIN_SEMANTIC_CANDIDATES = 2;\n\ntype MorphAnchorCandidate = {\n point: THREE.Vector3;\n magnitude: number;\n};\n\ntype MorphAnchorVerticalBand = {\n min: number;\n max: number;\n};\n\nexport function getRuntimeAnnotationSide(region: AnnotationAnchoredRegion): RuntimeAnnotationSide | null {\n const side = region.runtimeAnnotation?.side;\n return side === 'left' || side === 'right' || side === 'center' ? side : null;\n}\n\nfunction getMorphPositionAttribute(\n mesh: THREE.Mesh,\n morphName: string,\n): THREE.BufferAttribute | THREE.InterleavedBufferAttribute | null {\n const morphIndex = mesh.morphTargetDictionary?.[morphName];\n if (morphIndex == null) return null;\n\n const morphPositions = mesh.geometry.morphAttributes.position;\n return morphPositions?.[morphIndex] ?? null;\n}\n\nfunction getMorphDeltaMagnitudeAtIndex(\n mesh: THREE.Mesh,\n basePositions: THREE.BufferAttribute | THREE.InterleavedBufferAttribute,\n morphAttribute: THREE.BufferAttribute | THREE.InterleavedBufferAttribute,\n index: number,\n): number {\n const relative = mesh.geometry.morphTargetsRelative;\n const dx = morphAttribute.getX(index) - (relative ? 0 : basePositions.getX(index));\n const dy = morphAttribute.getY(index) - (relative ? 0 : basePositions.getY(index));\n const dz = morphAttribute.getZ(index) - (relative ? 0 : basePositions.getZ(index));\n return Math.hypot(dx, dy, dz);\n}\n\nfunction getRuntimeAnnotationSearchText(region: AnnotationAnchoredRegion): string {\n return [\n region.name,\n region.label,\n ...(region.runtimeAnnotation?.morphNames ?? []),\n ].join(' ').toLowerCase();\n}\n\nfunction resolveMorphAnchorVerticalBand(region: AnnotationAnchoredRegion): MorphAnchorVerticalBand | null {\n const text = getRuntimeAnnotationSearchText(region);\n\n if (/brow|forehead|frontalis/.test(text)) {\n return { min: 0.75, max: 1 };\n }\n if (/eye|lid|blink|squint|wide|occlusion|tearline/.test(text)) {\n return { min: 0.45, max: 0.9 };\n }\n if (/nose|nasal|sneer/.test(text)) {\n return { min: 0.35, max: 0.8 };\n }\n if (/cheek/.test(text)) {\n return { min: 0.45, max: 0.9 };\n }\n if (/jaw|chin/.test(text)) {\n return { min: 0, max: 0.3 };\n }\n if (/mouth|lip|smile|frown|dimple|pucker|stretch|press|funnel|roll|shrug|close/.test(text)) {\n return { min: 0, max: 0.45 };\n }\n if (/tongue/.test(text)) {\n return { min: 0, max: 0.5 };\n }\n\n return null;\n}\n\nfunction getQuantile(sortedValues: number[], ratio: number): number | null {\n if (sortedValues.length === 0) return null;\n const index = Math.min(\n sortedValues.length - 1,\n Math.max(0, Math.floor((sortedValues.length - 1) * ratio)),\n );\n return sortedValues[index] ?? null;\n}\n\nfunction selectSemanticMorphAnchorCandidates(\n region: AnnotationAnchoredRegion,\n candidates: MorphAnchorCandidate[],\n): MorphAnchorCandidate[] | null {\n const band = resolveMorphAnchorVerticalBand(region);\n if (!band || candidates.length < MORPH_ANCHOR_MIN_SEMANTIC_CANDIDATES) {\n return null;\n }\n\n const sortedY = candidates\n .map((candidate) => candidate.point.y)\n .sort((a, b) => a - b);\n const minY = getQuantile(sortedY, band.min);\n const maxY = getQuantile(sortedY, band.max);\n if (minY == null || maxY == null) return null;\n\n const selected = candidates.filter((candidate) =>\n candidate.point.y >= minY - MORPH_ANCHOR_DELTA_EPSILON &&\n candidate.point.y <= maxY + MORPH_ANCHOR_DELTA_EPSILON\n );\n\n return selected.length >= MORPH_ANCHOR_MIN_SEMANTIC_CANDIDATES ? selected : null;\n}\n\nfunction getWeightedMorphAnchorCenter(candidates: MorphAnchorCandidate[]): THREE.Vector3 | null {\n const weightedCenter = new THREE.Vector3();\n let totalWeight = 0;\n\n for (const candidate of candidates) {\n weightedCenter.addScaledVector(candidate.point, candidate.magnitude);\n totalWeight += candidate.magnitude;\n }\n\n return totalWeight > 0\n ? weightedCenter.multiplyScalar(1 / totalWeight)\n : null;\n}\n\nexport function getRuntimeAUMorphAnchorPoint(\n region: AnnotationAnchoredRegion,\n mesh: THREE.Mesh,\n): THREE.Vector3 | null {\n const runtimeAnnotation = region.runtimeAnnotation;\n const morphNames = runtimeAnnotation?.morphNames;\n if (\n runtimeAnnotation?.targetType !== 'au' ||\n !Array.isArray(morphNames) ||\n morphNames.length === 0\n ) {\n return null;\n }\n\n const basePositions = mesh.geometry.getAttribute('position');\n if (!basePositions) return null;\n\n const morphAttributes = morphNames\n .map((morphName) => getMorphPositionAttribute(mesh, morphName))\n .filter((attribute): attribute is THREE.BufferAttribute | THREE.InterleavedBufferAttribute => Boolean(attribute));\n\n if (morphAttributes.length === 0) return null;\n\n const vertexCount = basePositions.count;\n const magnitudes = new Float32Array(vertexCount);\n let maxMagnitude = 0;\n\n for (const morphAttribute of morphAttributes) {\n for (let index = 0; index < vertexCount; index += 1) {\n const magnitude = getMorphDeltaMagnitudeAtIndex(mesh, basePositions, morphAttribute, index);\n if (magnitude <= magnitudes[index]) continue;\n\n magnitudes[index] = magnitude;\n maxMagnitude = Math.max(maxMagnitude, magnitude);\n }\n }\n\n if (maxMagnitude <= MORPH_ANCHOR_DELTA_EPSILON) return null;\n\n const significantThreshold = Math.max(\n MORPH_ANCHOR_DELTA_EPSILON,\n maxMagnitude * MORPH_ANCHOR_SIGNIFICANT_DELTA_RATIO,\n );\n const candidateThreshold = Math.max(\n MORPH_ANCHOR_DELTA_EPSILON,\n maxMagnitude * MORPH_ANCHOR_CANDIDATE_DELTA_RATIO,\n );\n const skinnedMesh = mesh as THREE.SkinnedMesh;\n mesh.updateWorldMatrix(true, false);\n if (skinnedMesh.isSkinnedMesh && skinnedMesh.skeleton) {\n skinnedMesh.skeleton.update();\n }\n\n const vertex = new THREE.Vector3();\n const candidates: MorphAnchorCandidate[] = [];\n const fallbackCandidates: MorphAnchorCandidate[] = [];\n let strongestIndex = -1;\n let strongestMagnitude = 0;\n\n for (let index = 0; index < vertexCount; index += 1) {\n const magnitude = magnitudes[index] ?? 0;\n if (magnitude > strongestMagnitude) {\n strongestMagnitude = magnitude;\n strongestIndex = index;\n }\n if (magnitude < candidateThreshold) continue;\n\n mesh.getVertexPosition(index, vertex);\n vertex.applyMatrix4(mesh.matrixWorld);\n const candidate = {\n point: vertex.clone(),\n magnitude,\n };\n candidates.push(candidate);\n if (magnitude >= significantThreshold) {\n fallbackCandidates.push(candidate);\n }\n }\n\n const selectedCandidates = selectSemanticMorphAnchorCandidates(region, candidates)\n ?? (fallbackCandidates.length > 0 ? fallbackCandidates : candidates);\n const weightedCenter = getWeightedMorphAnchorCenter(selectedCandidates);\n if (weightedCenter) return weightedCenter;\n\n if (strongestIndex < 0) return null;\n mesh.getVertexPosition(strongestIndex, vertex);\n return vertex.applyMatrix4(mesh.matrixWorld).clone();\n}\n\nexport function getRuntimeAUMeshSideOffset(\n region: AnnotationAnchoredRegion,\n sideSign: number,\n modelSize: THREE.Vector3,\n): THREE.Vector3 | null {\n const side = getRuntimeAnnotationSide(region);\n if (\n region.runtimeAnnotation?.targetType !== 'au' ||\n (side !== 'left' && side !== 'right')\n ) {\n return null;\n }\n\n const height = modelSize.y || 1;\n const width = modelSize.x || height * 0.35;\n const depth = modelSize.z || height * 0.25;\n const text = [\n region.name,\n region.label,\n ...(region.runtimeAnnotation.morphNames ?? []),\n ].join(' ').toLowerCase();\n\n const horizontalOffset = Math.max(\n Math.min(width * 0.18, height * 0.08),\n height * 0.035,\n );\n const depthOffset = Math.max(depth * 0.08, height * 0.025);\n let verticalOffset = height * 0.02;\n\n if (/brow|forehead|frontalis|eye|lid|blink|squint/.test(text)) {\n verticalOffset = height * 0.1;\n } else if (/nose|cheek|nasal/.test(text)) {\n verticalOffset = height * 0.04;\n } else if (/mouth|lip|smile|frown|jaw|chin|dimple|pucker|stretch/.test(text)) {\n verticalOffset = -height * 0.06;\n }\n\n return new THREE.Vector3(\n sideSign * horizontalOffset,\n verticalOffset,\n depthOffset,\n );\n}\n","import { boneResolutionProfile } from './boneResolutionProfile';\nimport {\n detectAnnotationLaterality,\n fuzzyNameMatch,\n getDefaultAnnotationLaterality,\n getModelLocalOrbitAngle,\n getSemanticHorizontalSign,\n getSemanticHorizontalSignForSide,\n getWorldDirectionForCameraAngle,\n resolveBoneNames,\n resolveFaceCenter,\n resolveRegionCameraAngle,\n resolveRegionVisibilityCameraAngle,\n toWorldDirection,\n type AnnotationLaterality,\n type RustAnnotationCameraCore,\n} from './adapter';\nimport * as THREE from 'three';\nimport type {\n Region,\n CharacterConfig,\n MarkerStyleOverrides,\n LineConfig,\n LineStyle,\n LineCurve,\n NamedDirection,\n ExpandAnimation,\n ExpandedRegionState,\n MarkerGroup,\n FallbackConfig,\n AnnotationAnchoredRegion,\n} from './types';\nimport { intersectMeshesInSlices } from './markerSurfaceRaycast';\nimport { waitForCharacterLoadPaint } from './loadFrame';\nimport { AnimationFrameTaskScheduler } from './animationFrameTaskScheduler';\nimport { getAnnotationCameraCore, requireAnnotationCameraCore } from './annotationCameraCore';\nimport {\n resolveMarkerAnchorRegion,\n shouldProjectMarkerAnchorToSurface,\n shouldUseFaceCenterForMarkerAnchor,\n} from './annotationAnchorModel';\nimport {\n getRuntimeAUMorphAnchorPoint,\n getRuntimeAnnotationSide,\n getRuntimeAUMeshSideOffset,\n} from './runtimeAnnotationSidePreview';\n\ninterface MarkerConfig {\n markerRadius?: number;\n markerColor?: number;\n lineColor?: number;\n lineLength?: number;\n labelColor?: string;\n labelBackground?: string;\n labelFontSize?: number;\n labelScale?: number;\n}\n\nconst DEFAULT_CONFIG: Required<MarkerConfig> = {\n markerRadius: 0.008, // Smaller, more professional dots\n markerColor: 0x4299e1,\n lineColor: 0x4299e1,\n lineLength: 0.5,\n labelColor: '#ffffff',\n labelBackground: 'rgba(0, 0, 0, 0.75)',\n labelFontSize: 32,\n labelScale: 0.04,\n};\n\n// Reference model height for scaling (human character is ~1.8 units tall)\nconst REFERENCE_MODEL_HEIGHT = 1.8;\n\n// Zoom threshold for scaling markers (relative to model height)\n// When camera is closer than this ratio of model height, markers shrink\nconst ZOOM_THRESHOLD_RATIO = 0.8;\nconst ZOOMED_IN_SPHERE_SCALE = 0.25; // Spheres get much smaller (25%) when zoomed in\nconst ZOOMED_IN_LABEL_SCALE = 0.85; // Labels stay readable - only slightly smaller\nconst ZOOMED_IN_LINE_SCALE = 0.3; // Lines get much shorter when zoomed in\n\nconst VISIBILITY_ANIMATION_DURATION = 220;\nconst POSITION_EPSILON_SQUARED = 1e-8;\nconst GROUP_VISIBILITY_ANIMATION_KEY = 'marker-group';\n\nfunction waitForNextMarkerFrame(): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => resolve());\n return;\n }\n\n globalThis.setTimeout(resolve, 0);\n });\n}\n\ntype MarkerVisibilityAnimationState = {\n arrow?: { object: THREE.Mesh; opacity: number };\n label?: { object: THREE.Sprite; opacity: number; scale: THREE.Vector3 };\n line?: { object: THREE.Line; opacity: number };\n sphere?: { object: THREE.Mesh; opacity: number };\n};\n\nexport function shouldShow3DMarker(params: {\n name: string;\n hiddenChildren: Set<string>;\n soloedMarker: string | null;\n markerAngle?: number;\n currentCameraAngle?: number;\n}): boolean {\n return requireAnnotationCameraCore().shouldShowMarker({\n hiddenChild: params.hiddenChildren.has(params.name),\n solo: params.soloedMarker === null\n ? 'none'\n : params.soloedMarker === params.name ? 'soloed' : 'other-soloed',\n markerAngle: params.markerAngle,\n currentCameraAngle: params.currentCameraAngle,\n });\n}\n\nfunction getAnnotationRegionLabel(region: Region): string | undefined {\n const label = (region as AnnotationAnchoredRegion).label;\n if (typeof label !== 'string') return undefined;\n const trimmed = label.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction isFiniteClipPoint(point: THREE.Vector4): boolean {\n return Number.isFinite(point.x) && Number.isFinite(point.y) &&\n Number.isFinite(point.z) && Number.isFinite(point.w);\n}\n\nexport function resolveViewportConstrainedLineScale(params: {\n startClip: THREE.Vector4;\n endClip: THREE.Vector4;\n safeX: number;\n safeY: number;\n minLengthRatio?: number;\n}): { visible: boolean; lineScale: number } {\n // Reject invalid projections before crossing the float32 Wasm boundary.\n if (!isFiniteClipPoint(params.endClip)) {\n return { visible: false, lineScale: 0 };\n }\n return requireAnnotationCameraCore().resolveViewportConstrainedLineScale({\n ...params,\n startClip: params.startClip.toArray(),\n endClip: params.endClip.toArray(),\n });\n}\n\nexport function 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 return requireAnnotationCameraCore().resolveViewportSafeBounds(params);\n}\n\n/**\n * Pure 3D visual markers for annotations.\n *\n * SIMPLE RULE: Lines always point AWAY from model center.\n * - Horizontal: left annotations go left, right go right\n * - Vertical: high annotations go up, low go down\n */\nexport class DPthree3DMarkers {\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private domElement: HTMLElement;\n private model: THREE.Object3D | null = null;\n private regions: Region[] = [];\n private currentRegion: string | null = null;\n private onSelect: (name: string) => void;\n private config: Required<MarkerConfig>;\n\n private markerGroup: THREE.Group;\n private markerMeshes: Map<string, THREE.Mesh> = new Map();\n private lineMeshes: Map<string, THREE.Line> = new Map();\n private lineEndpoints: Map<string, { start: THREE.Vector3; end: THREE.Vector3; direction: THREE.Vector3 }> = new Map();\n private labelSprites: Map<string, THREE.Sprite> = new Map();\n private labelScales: Map<string, { x: number; y: number }> = new Map();\n\n // Store the original line length (before zoom scaling) for each marker\n private originalLineLengths: Map<string, number> = new Map();\n // Store direct bone references and local offsets for efficient animation updates\n private boneRefs: Map<string, THREE.Object3D> = new Map();\n private localOffsets: Map<string, THREE.Vector3> = new Map(); // Offset in bone-local space\n\n // Model bounds - cached once when model is set\n private modelCenter = new THREE.Vector3();\n private modelSize = new THREE.Vector3();\n private modelMeshes: THREE.Mesh[] = [];\n private regionLoadHasFreshMatrices = false;\n\n // Zoom-based scaling state (only updates when crossing threshold)\n private isZoomedIn = false;\n private zoomThreshold = 1.0; // Calculated from model size\n private autoCollapseThreshold = 2.0; // Calculated from model size - collapse expanded regions when zoomed out\n private lastCameraDistance = -1; // Cache to avoid unnecessary checks\n private visibilityAnimationActive = false;\n private readonly visibilityAnimationScheduler = new AnimationFrameTaskScheduler();\n private visibilityAnimationStates: MarkerVisibilityAnimationState[] = [];\n private activeMarkerVisibilityAnimations = new Set<string>();\n private markerVisibilityAnimationStates: Map<string, MarkerVisibilityAnimationState> = new Map();\n private markerTargetVisibility: Map<string, boolean> = new Map();\n private markerAngleGateVisibility: Map<string, boolean> = new Map();\n private markerViewportVisibility: Map<string, boolean> = new Map();\n private hasCameraAngleUpdateSnapshot = false;\n private lastCameraAngleUpdatePosition = new THREE.Vector3();\n private lastCameraAngleUpdateQuaternion = new THREE.Quaternion();\n\n private raycaster = new THREE.Raycaster();\n private mouse = new THREE.Vector2();\n private scratchClipStart = new THREE.Vector4();\n private scratchClipEnd = new THREE.Vector4();\n private readonly scratchClipStartValues = [0, 0, 0, 0];\n private readonly scratchClipEndValues = [0, 0, 0, 0];\n private scratchWorldEnd = new THREE.Vector3();\n private scratchConstrainedEnd = new THREE.Vector3();\n private tempSurfacePoint = new THREE.Vector3();\n private scratchArrowDirection = new THREE.Vector3();\n private scratchArrowQuaternion = new THREE.Quaternion();\n private arrowUp = new THREE.Vector3(0, 1, 0);\n\n // === CUSTOMIZATION STATE ===\n // Character-level defaults (from config)\n private charLineDefaults: LineConfig = {};\n private charMarkerDefaults: Partial<MarkerStyleOverrides> = {};\n\n // Resolved styles per region (cached for performance)\n private resolvedStyles: Map<string, Required<MarkerStyleOverrides>> = new Map();\n\n // Expanding anchors state\n private expandedRegions: Map<string, boolean> = new Map();\n private parentChildIndex: Map<string, string[]> = new Map(); // parent -> children\n private childParentIndex: Map<string, string> = new Map(); // child -> parent\n private hiddenChildren: Set<string> = new Set();\n\n // Solo mode\n private soloedMarker: string | null = null;\n\n // Fallback markers\n private markerGroups: MarkerGroup[] = [];\n private groupVisibility: Map<string, Set<string>> = new Map(); // groupId -> visible region names\n\n // Arrow head meshes (for styled lines)\n private arrowMeshes: Map<string, THREE.Mesh> = new Map();\n\n // Character config for bone name resolution\n private characterConfig: CharacterConfig | null = null;\n private laterality: AnnotationLaterality = getDefaultAnnotationLaterality();\n private regionLoadGeneration = 0;\n\n constructor(inputConfig: {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n domElement: HTMLElement;\n onSelect: (name: string) => void;\n markerConfig?: MarkerConfig;\n }) {\n this.scene = inputConfig.scene;\n this.camera = inputConfig.camera;\n this.domElement = inputConfig.domElement;\n this.onSelect = inputConfig.onSelect;\n this.config = { ...DEFAULT_CONFIG, ...inputConfig.markerConfig };\n\n this.markerGroup = new THREE.Group();\n this.markerGroup.name = 'DPthree3DMarkers';\n this.scene.add(this.markerGroup);\n\n this.domElement.addEventListener('click', this.onClick);\n }\n\n /** Preserve marker state while a scene replaces its renderer canvas. */\n setDomElement(element: HTMLElement): void {\n if (element === this.domElement) return;\n this.domElement.removeEventListener('click', this.onClick);\n this.domElement = element;\n this.domElement.addEventListener('click', this.onClick);\n }\n\n setModel(model: THREE.Object3D): void {\n this.regionLoadGeneration += 1;\n this.regionLoadHasFreshMatrices = false;\n this.model = model;\n // Force update of world matrices before computing bounds\n model.updateMatrixWorld(true);\n this.modelMeshes = [];\n model.traverse((object) => {\n if ((object as THREE.Mesh).isMesh) {\n this.modelMeshes.push(object as THREE.Mesh);\n }\n });\n // Cache model bounds\n const box = new THREE.Box3().setFromObject(model);\n box.getCenter(this.modelCenter);\n box.getSize(this.modelSize);\n\n // Calculate zoom threshold based on model height\n this.zoomThreshold = this.modelSize.y * ZOOM_THRESHOLD_RATIO;\n // Auto-collapse threshold is 2.5x the zoom threshold - when zoomed out this far, collapse all expanded regions\n this.autoCollapseThreshold = this.zoomThreshold * 2.5;\n this.lastCameraDistance = -1; // Reset to force recalculation\n this.isZoomedIn = false;\n this.hasCameraAngleUpdateSnapshot = false;\n this.refreshLaterality();\n }\n\n async loadRegions(config: CharacterConfig, options: { sliceSurfaceQueries?: boolean } = {}): Promise<void> {\n const loadGeneration = ++this.regionLoadGeneration;\n const loadModel = this.model;\n const annotationCameraCore = await getAnnotationCameraCore();\n if (loadGeneration !== this.regionLoadGeneration || this.model !== loadModel) {\n return;\n }\n\n console.log(`[3DMarkers] loadRegions: ${config.characterId}, ${(config.regions ?? []).length} regions, model loaded: ${!!this.model}`);\n this.clear();\n const activeLoadGeneration = this.regionLoadGeneration;\n const isCurrent = () => activeLoadGeneration === this.regionLoadGeneration && this.model === loadModel;\n this.regions = config.regions ?? [];\n this.characterConfig = config;\n this.model?.updateMatrixWorld(true);\n this.regionLoadHasFreshMatrices = true;\n this.refreshLaterality();\n\n // Store character-level defaults\n this.charLineDefaults = config.lineDefaults || {};\n this.charMarkerDefaults = config.markerDefaults || {};\n this.markerGroups = config.markerGroups || [];\n\n // Build parent/child index\n this.parentChildIndex.clear();\n this.childParentIndex.clear();\n this.hiddenChildren.clear();\n for (const region of (config.regions ?? [])) {\n if (region.children && region.children.length > 0) {\n this.parentChildIndex.set(region.name, region.children);\n for (const childName of region.children) {\n this.childParentIndex.set(childName, region.name);\n this.hiddenChildren.add(childName);\n }\n }\n }\n\n // Resolve and cache styles for each region\n this.resolvedStyles.clear();\n for (const region of (config.regions ?? [])) {\n this.resolvedStyles.set(region.name, this.resolveRegionStyle(region));\n }\n\n // Initialize group visibility tracking\n this.groupVisibility.clear();\n for (const group of this.markerGroups) {\n this.groupVisibility.set(group.groupId, new Set());\n }\n\n try {\n // Create markers (children start hidden if they have a parent)\n for (const [index, region] of (config.regions ?? []).entries()) {\n if (!isCurrent()) {\n return;\n }\n\n const hasParent = this.childParentIndex.has(region.name);\n // Only initial reveal has a stable pose across render opportunities.\n // Interactive rebuilds preserve their synchronous surface sampling.\n if (options.sliceSurfaceQueries) {\n await this.createMarkerInSlices(region, hasParent, () => isCurrent() && this.regions.includes(region));\n } else {\n this.createMarker(region, hasParent);\n }\n if (!isCurrent()) return;\n\n // Marker placement performs geometry raycasts and label rasterization.\n // Yield between regions so it cannot monopolize the frame that begins\n // or completes the character's intro camera transition.\n if (index < (config.regions ?? []).length - 1) {\n await waitForNextMarkerFrame();\n }\n }\n\n if (!isCurrent()) {\n return;\n }\n\n // After all markers are created, separate any that are too close together\n this.separateOverlappingMarkers(annotationCameraCore);\n\n console.log(`[3DMarkers] loadRegions complete. Created markers for:`, Array.from(this.markerMeshes.keys()));\n console.log(`[3DMarkers] lineEndpoints:`, Array.from(this.lineEndpoints.keys()));\n console.log(`[3DMarkers] resolvedStyles:`, Array.from(this.resolvedStyles.keys()));\n } finally {\n if (isCurrent()) {\n this.regionLoadHasFreshMatrices = false;\n }\n }\n }\n\n /**\n * Update a region's configuration and recreate its marker.\n * This is the general method for updating any region properties.\n *\n * @param regionName - Name of the region to update\n * @param update - Partial region config to merge with existing config\n */\n updateRegion(regionName: string, update: Partial<Region>): void {\n console.log(`[3DMarkers] updateRegion: ${regionName}`, update);\n\n // Find the region\n const regionIndex = this.regions.findIndex(r => r.name === regionName);\n if (regionIndex === -1) {\n const newRegion: Region = { name: regionName, ...update };\n this.regions = [...this.regions, newRegion];\n if (this.characterConfig) {\n this.characterConfig = {\n ...this.characterConfig,\n regions: [...(this.characterConfig.regions ?? []), newRegion],\n };\n }\n this.refreshLaterality();\n this.resolvedStyles.set(regionName, this.resolveRegionStyle(newRegion));\n const hasParent = this.childParentIndex.has(newRegion.name);\n this.createMarker(newRegion, hasParent);\n this.hasCameraAngleUpdateSnapshot = false;\n console.log(`[3DMarkers] Region \"${regionName}\" marker created`);\n return;\n }\n\n // Merge update with existing region config\n this.regions[regionIndex] = {\n ...this.regions[regionIndex],\n ...update,\n };\n\n // Also update characterConfig if it exists\n if (this.characterConfig?.regions) {\n const configRegionIndex = this.characterConfig.regions.findIndex(r => r.name === regionName);\n if (configRegionIndex !== -1) {\n this.characterConfig.regions[configRegionIndex] = {\n ...this.characterConfig.regions[configRegionIndex],\n ...update,\n };\n }\n }\n\n this.refreshLaterality();\n this.resolvedStyles.set(regionName, this.resolveRegionStyle(this.regions[regionIndex]));\n\n // Remove and recreate the marker\n this.removeMarkerComponents(regionName);\n\n // Recreate the marker with updated configuration\n const region = this.regions[regionIndex];\n const hasParent = this.childParentIndex.has(region.name);\n this.createMarker(region, hasParent);\n this.hasCameraAngleUpdateSnapshot = false;\n\n console.log(`[3DMarkers] Region \"${regionName}\" marker recreated with updated config`);\n }\n\n removeRegion(regionName: string): void {\n const regionIndex = this.regions.findIndex(r => r.name === regionName);\n if (regionIndex !== -1) {\n this.regions = this.regions.filter((region) => region.name !== regionName);\n }\n\n if (this.characterConfig?.regions) {\n this.characterConfig = {\n ...this.characterConfig,\n regions: this.characterConfig.regions.filter((region) => region.name !== regionName),\n };\n }\n\n this.resolvedStyles.delete(regionName);\n this.parentChildIndex.delete(regionName);\n this.childParentIndex.delete(regionName);\n this.hiddenChildren.delete(regionName);\n this.removeMarkerComponents(regionName);\n this.hasCameraAngleUpdateSnapshot = false;\n }\n\n /**\n * Remove all marker components for a region (marker, line, label, bone refs)\n */\n private removeMarkerComponents(regionName: string): void {\n // Remove old marker for this region (markers are in markerGroup, not scene)\n const oldMarker = this.markerMeshes.get(regionName);\n if (oldMarker) {\n this.markerGroup.remove(oldMarker);\n this.markerMeshes.delete(regionName);\n }\n\n // Remove old line mesh (lines are in markerGroup, not scene)\n const oldLine = this.lineMeshes.get(regionName);\n if (oldLine) {\n this.markerGroup.remove(oldLine);\n this.lineMeshes.delete(regionName);\n }\n\n // Remove old line endpoint data\n this.lineEndpoints.delete(regionName);\n this.originalLineLengths.delete(regionName);\n\n // Remove old label sprite (labels are in markerGroup, not scene)\n const oldLabel = this.labelSprites.get(regionName);\n if (oldLabel) {\n this.markerGroup.remove(oldLabel);\n this.labelSprites.delete(regionName);\n this.labelScales.delete(regionName);\n }\n\n // Remove old arrow if exists\n const oldArrow = this.arrowMeshes.get(regionName);\n if (oldArrow) {\n this.markerGroup.remove(oldArrow);\n this.arrowMeshes.delete(regionName);\n }\n\n // Remove old bone reference and offset\n this.boneRefs.delete(regionName);\n this.localOffsets.delete(regionName);\n this.markerTargetVisibility.delete(regionName);\n this.markerAngleGateVisibility.delete(regionName);\n this.markerViewportVisibility.delete(regionName);\n }\n\n updateRegionMeshes(regionName: string, meshNames: string[]): void {\n console.log(`[3DMarkers] updateRegionMeshes: ${regionName} -> ${meshNames.join(', ')}`);\n this.updateRegion(regionName, { meshes: meshNames });\n }\n\n /**\n * Reposition an existing marker to a new position.\n * This moves the marker, line, and label without recreating them.\n *\n * @param regionName - Name of the region to reposition\n * @param newPosition - New world position for the marker\n */\n repositionMarker(regionName: string, newPosition: THREE.Vector3): void {\n console.log(`[3DMarkers] repositionMarker: ${regionName} -> (${newPosition.x.toFixed(3)}, ${newPosition.y.toFixed(3)}, ${newPosition.z.toFixed(3)})`);\n\n const marker = this.markerMeshes.get(regionName);\n\n if (!marker) {\n console.warn(`[3DMarkers] repositionMarker: No marker found for \"${regionName}\"`);\n return;\n }\n\n marker.position.copy(newPosition);\n this.updateMarkerLineLayout(regionName);\n\n console.log(`[3DMarkers] Marker \"${regionName}\" repositioned`);\n }\n\n /**\n * Get the current position of a marker\n */\n getMarkerPosition(regionName: string): THREE.Vector3 | null {\n const marker = this.markerMeshes.get(regionName);\n return marker ? marker.position.clone() : null;\n }\n\n /**\n * Resolve the effective style for a region by merging:\n * global defaults -> character defaults -> region style\n */\n private resolveRegionStyle(region: Region): Required<MarkerStyleOverrides> {\n const defaults: Required<MarkerStyleOverrides> = {\n markerColor: this.config.markerColor,\n markerRadius: this.config.markerRadius,\n lineColor: this.config.lineColor,\n labelColor: this.config.labelColor,\n labelBackground: this.config.labelBackground,\n labelFontSize: this.config.labelFontSize,\n opacity: 1,\n lineDirection: 'radial', // Default: from model center\n line: {\n style: 'solid',\n curve: 'straight',\n arrowHead: false,\n thickness: 2,\n length: this.config.lineLength,\n },\n };\n\n // Merge character-level defaults\n const charDefaults = this.charMarkerDefaults;\n if (charDefaults.markerColor !== undefined) defaults.markerColor = charDefaults.markerColor;\n if (charDefaults.markerRadius !== undefined) defaults.markerRadius = charDefaults.markerRadius;\n if (charDefaults.lineColor !== undefined) defaults.lineColor = charDefaults.lineColor;\n if (charDefaults.labelColor !== undefined) defaults.labelColor = charDefaults.labelColor;\n if (charDefaults.labelBackground !== undefined) defaults.labelBackground = charDefaults.labelBackground;\n if (charDefaults.labelFontSize !== undefined) defaults.labelFontSize = charDefaults.labelFontSize;\n if (charDefaults.opacity !== undefined) defaults.opacity = charDefaults.opacity;\n if (charDefaults.lineDirection !== undefined) defaults.lineDirection = charDefaults.lineDirection;\n if (charDefaults.line) {\n defaults.line = { ...defaults.line, ...charDefaults.line };\n }\n\n // Merge character-level line defaults\n if (this.charLineDefaults.style !== undefined) defaults.line.style = this.charLineDefaults.style;\n if (this.charLineDefaults.curve !== undefined) defaults.line.curve = this.charLineDefaults.curve;\n if (this.charLineDefaults.arrowHead !== undefined) defaults.line.arrowHead = this.charLineDefaults.arrowHead;\n if (this.charLineDefaults.thickness !== undefined) defaults.line.thickness = this.charLineDefaults.thickness;\n if (this.charLineDefaults.length !== undefined) defaults.line.length = this.charLineDefaults.length;\n\n // Merge region-level style overrides\n const regionStyle = region.style || {};\n if (regionStyle.markerColor !== undefined) defaults.markerColor = regionStyle.markerColor;\n if (regionStyle.markerRadius !== undefined) defaults.markerRadius = regionStyle.markerRadius;\n if (regionStyle.lineColor !== undefined) defaults.lineColor = regionStyle.lineColor;\n if (regionStyle.labelColor !== undefined) defaults.labelColor = regionStyle.labelColor;\n if (regionStyle.labelBackground !== undefined) defaults.labelBackground = regionStyle.labelBackground;\n if (regionStyle.labelFontSize !== undefined) defaults.labelFontSize = regionStyle.labelFontSize;\n if (regionStyle.opacity !== undefined) defaults.opacity = regionStyle.opacity;\n if (regionStyle.lineDirection !== undefined) defaults.lineDirection = regionStyle.lineDirection;\n if (regionStyle.line) {\n defaults.line = { ...defaults.line, ...regionStyle.line };\n }\n\n // Leaf regions (no children) use dashed lines by default\n if (!region.children || region.children.length === 0) {\n defaults.line.style = 'dashed';\n }\n\n return defaults;\n }\n\n /**\n * Resolve a named direction or custom vector to a THREE.Vector3.\n * For 'camera' direction, returns direction from position toward current camera.\n */\n private resolveLineDirection(\n direction: NamedDirection | { x: number; y: number; z: number },\n position: THREE.Vector3\n ): THREE.Vector3 {\n if (typeof direction === 'object') {\n return new THREE.Vector3(direction.x, direction.y, direction.z).normalize();\n }\n\n switch (direction) {\n case 'radial':\n return new THREE.Vector3().subVectors(position, this.modelCenter).normalize();\n case 'camera':\n return new THREE.Vector3().subVectors(this.camera.position, position).normalize();\n case 'up':\n return new THREE.Vector3(0, 1, 0);\n case 'down':\n return new THREE.Vector3(0, -1, 0);\n case 'left':\n return toWorldDirection(\n this.model,\n new THREE.Vector3(getSemanticHorizontalSignForSide('left', this.laterality), 0, 0)\n );\n case 'right':\n return toWorldDirection(\n this.model,\n new THREE.Vector3(getSemanticHorizontalSignForSide('right', this.laterality), 0, 0)\n );\n case 'forward':\n return toWorldDirection(this.model, new THREE.Vector3(0, 0, 1));\n case 'backward':\n return toWorldDirection(this.model, new THREE.Vector3(0, 0, -1));\n default:\n return toWorldDirection(this.model, new THREE.Vector3(0, 0, 1));\n }\n }\n\n /**\n * Create a bezier curve between two points.\n */\n private createBezierCurve(start: THREE.Vector3, end: THREE.Vector3, segments = 16): THREE.Vector3[] {\n const values = requireAnnotationCameraCore().sampleMarkerBezierCurve(start, end, segments);\n return this.unpackCurvePoints(values);\n }\n\n /**\n * Create an arc curve between two points.\n */\n private createArcCurve(start: THREE.Vector3, end: THREE.Vector3, segments = 16): THREE.Vector3[] {\n const values = requireAnnotationCameraCore().sampleMarkerArcCurve(start, end, segments);\n return this.unpackCurvePoints(values);\n }\n\n private unpackCurvePoints(values: Float32Array): THREE.Vector3[] {\n const points: THREE.Vector3[] = [];\n for (let i = 0; i < values.length; i += 3) {\n points.push(new THREE.Vector3(values[i], values[i + 1], values[i + 2]));\n }\n return points;\n }\n\n /**\n * Create a styled line with support for dashed/dotted, curves, and arrow heads.\n */\n private createStyledLine(\n start: THREE.Vector3,\n end: THREE.Vector3,\n lineConfig: Required<LineConfig>,\n color: number,\n opacity: number,\n regionName: string\n ): THREE.Line {\n console.log(`[3DMarkers] createStyledLine: ${regionName}`, {\n style: lineConfig.style,\n curve: lineConfig.curve,\n color: color.toString(16),\n opacity,\n });\n\n // Get curve points based on curve type\n let points: THREE.Vector3[];\n switch (lineConfig.curve) {\n case 'bezier':\n points = this.createBezierCurve(start, end);\n break;\n case 'arc':\n points = this.createArcCurve(start, end);\n break;\n default:\n points = [start.clone(), end.clone()];\n }\n\n console.log(`[3DMarkers] createStyledLine: ${regionName} has ${points.length} points (curve: ${lineConfig.curve})`);\n\n const geometry = new THREE.BufferGeometry().setFromPoints(points);\n\n // Create material based on style\n let material: THREE.LineBasicMaterial | THREE.LineDashedMaterial;\n\n if (lineConfig.style === 'dashed' || lineConfig.style === 'dotted') {\n const dashSize = lineConfig.style === 'dotted' ? 0.005 : 0.02;\n const gapSize = lineConfig.style === 'dotted' ? 0.01 : 0.01;\n\n console.log(`[3DMarkers] createStyledLine: ${regionName} using LineDashedMaterial (dashSize=${dashSize}, gapSize=${gapSize})`);\n\n material = new THREE.LineDashedMaterial({\n color,\n transparent: true,\n opacity,\n dashSize,\n gapSize,\n });\n } else {\n console.log(`[3DMarkers] createStyledLine: ${regionName} using LineBasicMaterial`);\n material = new THREE.LineBasicMaterial({\n color,\n transparent: true,\n opacity,\n });\n }\n\n const line = new THREE.Line(geometry, material);\n\n // Compute line distances for dashed materials\n if (lineConfig.style === 'dashed' || lineConfig.style === 'dotted') {\n line.computeLineDistances();\n const lineDistances = line.geometry.getAttribute('lineDistance');\n console.log(`[3DMarkers] createStyledLine: ${regionName} computed line distances, count=${lineDistances?.count}`);\n }\n\n // Create arrow head if requested\n if (lineConfig.arrowHead) {\n const lastPoint = points[points.length - 1];\n const secondLastPoint = points[points.length - 2];\n const arrowDirection = new THREE.Vector3()\n .subVectors(lastPoint, secondLastPoint)\n .normalize();\n\n const arrowMesh = this.createArrowHead(lastPoint, arrowDirection, color, opacity);\n arrowMesh.name = `arrow_${regionName}`;\n arrowMesh.userData.annotation = regionName;\n this.markerGroup.add(arrowMesh);\n this.arrowMeshes.set(regionName, arrowMesh);\n }\n\n return line;\n }\n\n /**\n * Create an arrow head cone mesh.\n */\n private createArrowHead(\n position: THREE.Vector3,\n direction: THREE.Vector3,\n color: number,\n opacity: number\n ): THREE.Mesh {\n const scale = this.modelSize.y / REFERENCE_MODEL_HEIGHT;\n const arrowLength = 0.02 * scale;\n const arrowRadius = 0.008 * scale;\n\n const geometry = new THREE.ConeGeometry(arrowRadius, arrowLength, 8);\n const material = new THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.position.copy(position);\n\n // Orient arrow to point along direction\n const up = new THREE.Vector3(0, 1, 0);\n const quaternion = new THREE.Quaternion().setFromUnitVectors(up, direction);\n mesh.setRotationFromQuaternion(quaternion);\n\n return mesh;\n }\n\n setCurrentRegion(name: string | null): void {\n this.currentRegion = name;\n this.updateMarkerStyles();\n }\n\n /**\n * Create a marker for an annotation.\n *\n * Algorithm:\n * 1. Find annotation center from bones/meshes\n * 2. Determine best outward direction based on annotation type, cameraAngle, or style.lineDirection\n * 3. Raycast from outside toward annotation center to find surface point\n * 4. Line extends outward from surface with configured styling\n *\n */\n private resolveMarkerPlacement(region: Region) {\n if (!this.model) {\n console.warn(`[3DMarkers] createMarker: No model for region ${region.name}`);\n return null;\n }\n\n // Get resolved style for this region\n const style = this.resolvedStyles.get(region.name);\n if (!style) {\n console.warn(`[3DMarkers] createMarker: No style for region ${region.name}`);\n return null;\n }\n\n // Get annotation center and bounding box\n const result = this.getRegionCenterAndBox(region);\n if (!result) {\n console.warn(`[3DMarkers] createMarker: Could not get center/box for region ${region.name}`);\n return null;\n }\n\n const { center: annotationCenter, usedRuntimeMorphAnchor } = result;\n const visibilityCameraAngle = resolveRegionVisibilityCameraAngle(region, this.laterality);\n\n // Resolve the bone now; store it only after projection is still current.\n const primaryBone = this.findPrimaryBone(region);\n\n // Determine outward direction based on:\n // 1. Custom lineDirection in style (highest priority)\n // 2. Region's cameraAngle\n // 3. Semantic direction based on region name\n let outwardDir: THREE.Vector3;\n if (style.lineDirection && style.lineDirection !== 'radial') {\n // Use custom direction from style\n outwardDir = this.resolveLineDirection(style.lineDirection, annotationCenter);\n } else {\n // Fall back to existing semantic direction logic\n outwardDir = this.getOutwardDirection(region, annotationCenter);\n }\n\n const resolvedAnchor = resolveMarkerAnchorRegion(region);\n const anchorRegion = resolvedAnchor.region;\n\n // For mesh-only annotations (like eyes), place marker at the annotation center\n // These are typically computed positions (e.g., bone + offset) where raycasting doesn't help\n const isMeshOnly =\n anchorRegion.meshes &&\n anchorRegion.meshes.length > 0 &&\n !anchorRegion.bones &&\n !anchorRegion.objects;\n\n return {\n style, annotationCenter, outwardDir, primaryBone, visibilityCameraAngle,\n projectToSurface: !usedRuntimeMorphAnchor && shouldProjectMarkerAnchorToSurface(resolvedAnchor, !isMeshOnly),\n };\n }\n\n private createMarker(region: Region, startHidden = false): void {\n const placement = this.resolveMarkerPlacement(region);\n if (!placement) return;\n const surfacePoint = placement.projectToSurface\n ? this.findSurfacePoint(placement.annotationCenter, placement.outwardDir)\n : placement.annotationCenter.clone();\n this.renderMarker(region, startHidden, placement, surfacePoint);\n }\n\n private async createMarkerInSlices(region: Region, startHidden: boolean, isCurrent: () => boolean): Promise<void> {\n if (!isCurrent()) return;\n const placement = this.resolveMarkerPlacement(region);\n if (!placement) return;\n const surfacePoint = placement.projectToSurface\n ? await this.findSurfacePointInSlices(placement.annotationCenter, placement.outwardDir, isCurrent)\n : placement.annotationCenter.clone();\n if (!surfacePoint || !isCurrent()) return;\n this.renderMarker(region, startHidden, placement, surfacePoint);\n }\n\n private renderMarker(\n region: Region,\n startHidden: boolean,\n placement: NonNullable<ReturnType<DPthree3DMarkers['resolveMarkerPlacement']>>,\n surfacePoint: THREE.Vector3,\n ): void {\n const { style, primaryBone, outwardDir, visibilityCameraAngle } = placement;\n if (primaryBone) this.boneRefs.set(region.name, primaryBone);\n\n // Scale relative to reference model height so fish and human look the same\n const modelHeight = this.modelSize.y;\n const scale = modelHeight / REFERENCE_MODEL_HEIGHT;\n const scaledRadius = style.markerRadius * scale;\n const lineLength = style.line.length ?? this.config.lineLength;\n const scaledLineLength = lineLength * scale;\n const opacity = style.opacity;\n\n // Store the offset in bone-local space for animation updates\n if (primaryBone) {\n // Convert surface point to bone-local coordinates\n const boneInverse = primaryBone.matrixWorld.clone().invert();\n const localSurfacePoint = surfacePoint.clone().applyMatrix4(boneInverse);\n this.localOffsets.set(region.name, localSurfacePoint);\n }\n\n // Create sphere at surface - use depth testing for natural occlusion\n const sphere = new THREE.Mesh(\n new THREE.SphereGeometry(scaledRadius, 12, 12),\n new THREE.MeshBasicMaterial({\n color: style.markerColor,\n transparent: true,\n opacity: 0.95 * opacity,\n })\n );\n sphere.position.copy(surfacePoint);\n sphere.name = `marker_${region.name}`;\n sphere.userData.annotation = region.name;\n sphere.userData.cameraAngle = visibilityCameraAngle;\n sphere.userData.groupId = region.groupId;\n sphere.userData.isFallback = region.isFallback;\n sphere.visible = !startHidden && !region.isFallback; // Fallbacks start hidden\n this.markerGroup.add(sphere);\n this.markerMeshes.set(region.name, sphere);\n\n // Line end point: extend outward from surface\n const lineEnd = surfacePoint.clone().add(\n outwardDir.clone().multiplyScalar(scaledLineLength)\n );\n\n // Store line endpoints for zoom scaling\n this.lineEndpoints.set(region.name, {\n start: surfacePoint.clone(),\n end: lineEnd.clone(),\n direction: outwardDir.clone(),\n });\n\n // Store original line length for animation updates\n this.originalLineLengths.set(region.name, scaledLineLength);\n\n // Create styled line\n const lineConfig: Required<LineConfig> = {\n style: style.line.style ?? 'solid',\n curve: style.line.curve ?? 'straight',\n arrowHead: style.line.arrowHead ?? false,\n thickness: style.line.thickness ?? 2,\n length: lineLength,\n };\n\n const line = this.createStyledLine(\n surfacePoint,\n lineEnd,\n lineConfig,\n style.lineColor,\n 0.9 * opacity,\n region.name\n );\n line.name = `line_${region.name}`;\n line.userData.annotation = region.name;\n line.visible = !startHidden && !region.isFallback;\n this.markerGroup.add(line);\n this.lineMeshes.set(region.name, line);\n\n // Create label at line end (using resolved style)\n const label = this.createLabelSprite(region, style);\n label.position.copy(lineEnd);\n label.name = `label_${region.name}`;\n label.userData.annotation = region.name;\n label.visible = !startHidden && !region.isFallback;\n this.markerGroup.add(label);\n this.labelSprites.set(region.name, label);\n this.labelScales.set(region.name, { x: label.scale.x, y: label.scale.y });\n\n // Hide arrow if marker starts hidden\n const arrow = this.arrowMeshes.get(region.name);\n if (arrow) {\n arrow.visible = !startHidden && !region.isFallback;\n }\n this.markerTargetVisibility.set(region.name, !startHidden && !region.isFallback);\n this.markerAngleGateVisibility.delete(region.name);\n this.markerViewportVisibility.set(region.name, true);\n\n }\n\n /**\n * Embody Rust owns endpoint layout; the Three adapter applies the returned positions\n * to its Three.js marker geometry and labels.\n */\n private separateOverlappingMarkers(annotationCameraCore: RustAnnotationCameraCore): void {\n const markerNames = Array.from(this.lineEndpoints.keys());\n if (markerNames.length < 2) {\n return;\n }\n\n const starts = new Float32Array(markerNames.length * 3);\n const ends = new Float32Array(markerNames.length * 3);\n markerNames.forEach((name, index) => {\n const endpoints = this.lineEndpoints.get(name)!;\n endpoints.start.toArray(starts, index * 3);\n endpoints.end.toArray(ends, index * 3);\n });\n\n const separatedEnds = annotationCameraCore.separateOverlappingMarkerEndpoints({\n starts,\n ends,\n modelCenter: this.modelCenter,\n modelHeight: this.modelSize.y,\n });\n if (separatedEnds.length !== ends.length) {\n throw new Error(\n `Marker endpoint separation returned ${separatedEnds.length} values for ${markerNames.length} markers`\n );\n }\n\n markerNames.forEach((name, index) => {\n const endpoints = this.lineEndpoints.get(name)!;\n const newEnd = new THREE.Vector3().fromArray(separatedEnds, index * 3);\n endpoints.direction.subVectors(newEnd, endpoints.start).normalize();\n this.updateMarkerGeometry(name, endpoints.start, newEnd);\n });\n }\n\n /**\n * Determine the outward direction for marker placement based on annotation type.\n *\n * This uses semantic knowledge about body parts:\n * - Face/eyes/mouth: forward (positive Z)\n * - Back: backward (negative Z)\n * - Left/right parts: semantic side, resolved against model laterality\n * - Feet: down (negative Y)\n * - If cameraAngle is specified, use that angle\n * - Default: direction from model center to annotation center\n */\n private getOutwardDirection(region: Region, annotationCenter: THREE.Vector3): THREE.Vector3 {\n const name = region.name.toLowerCase();\n const leftX = getSemanticHorizontalSignForSide('left', this.laterality);\n const rightX = getSemanticHorizontalSignForSide('right', this.laterality);\n\n const toWorld = (localDir: THREE.Vector3): THREE.Vector3 => {\n return toWorldDirection(this.model, localDir);\n };\n\n const resolvedCameraAngle = resolveRegionCameraAngle(region, this.laterality);\n\n // If annotation has a specific cameraAngle, use that direction in model-local space.\n if (resolvedCameraAngle !== undefined && resolvedCameraAngle !== 0) {\n return getWorldDirectionForCameraAngle(this.model, resolvedCameraAngle);\n }\n\n // Semantic direction based on region.name (in MODEL-LOCAL space, transformed to world).\n // Eyes should point outward to the semantic side of the model.\n const horizontalSign = getSemanticHorizontalSign(region.name, this.laterality);\n if (horizontalSign !== null && (name.includes('eye') || name.includes('hand'))) {\n return toWorld(new THREE.Vector3(horizontalSign, 0.1, 0.3).normalize());\n }\n\n // Eye (singular) - radial from center\n if (name === 'eye') {\n const dir = new THREE.Vector3().subVectors(annotationCenter, this.modelCenter);\n dir.y = 0;\n return dir.length() > 0.001 ? dir.normalize() : toWorld(new THREE.Vector3(0, 0, 1));\n }\n\n // Face/head/mouth should point FORWARD in model space\n if (name.includes('face') || name.includes('mouth') || name.includes('head')) {\n return toWorld(new THREE.Vector3(0, 0, 1));\n }\n\n // Full body points forward\n if (name.includes('full_body') || name.includes('full body')) {\n return toWorld(new THREE.Vector3(0, 0, 1));\n }\n\n // Body points forward\n if (name === 'body') {\n return toWorld(new THREE.Vector3(0, 0, 1));\n }\n\n // Upper body points forward\n if (name.includes('upper_body') || name.includes('torso') || name.includes('chest')) {\n return toWorld(new THREE.Vector3(0, 0, 1));\n }\n\n // Feet point down and slightly forward\n if (name.includes('foot') || name.includes('feet')) {\n return toWorld(new THREE.Vector3(0, -0.5, 0.5).normalize());\n }\n\n // Fins (for fish) - point toward outer edge of fin\n if (name.includes('pectoral')) {\n if (name.includes('left')) {\n return toWorld(new THREE.Vector3(leftX, -0.3, 0.2).normalize());\n } else if (name.includes('right')) {\n return toWorld(new THREE.Vector3(rightX, -0.3, 0.2).normalize());\n }\n }\n if (name.includes('ventral') || name.includes('pelvic')) {\n return toWorld(new THREE.Vector3(0, -0.7, -0.5).normalize());\n }\n if (name.includes('anal')) {\n // Anal fin points down and back\n return toWorld(new THREE.Vector3(0, -0.6, -0.6).normalize());\n }\n if (name.includes('dorsal')) {\n return toWorld(new THREE.Vector3(0, 1, -0.3).normalize());\n }\n if (name.includes('fin')) {\n if (name.includes('left')) {\n return toWorld(new THREE.Vector3(leftX, 0, 0));\n } else if (name.includes('right')) {\n return toWorld(new THREE.Vector3(rightX, 0, 0));\n }\n }\n\n // Tail/caudal fin points backward in model space\n if (name.includes('tail') || name.includes('caudal')) {\n return toWorld(new THREE.Vector3(0, 0, -1));\n }\n\n // Gills/operculum point to model's right side\n if (name.includes('gill') || name.includes('operculum')) {\n const semanticSign = getSemanticHorizontalSign(name, this.laterality);\n return toWorld(new THREE.Vector3(semanticSign ?? rightX, 0, 0.3).normalize());\n }\n\n // Mouth points forward\n if (name === 'mouth') {\n return toWorld(new THREE.Vector3(0, 0, 1));\n }\n\n // Throat points to model's left side\n if (name.includes('throat')) {\n return toWorld(new THREE.Vector3(leftX, 0, 0.3).normalize());\n }\n\n // Default: use direction from model center to annotation center (already in world space)\n const dir = new THREE.Vector3().subVectors(annotationCenter, this.modelCenter);\n if (dir.length() < 0.001) {\n return toWorld(new THREE.Vector3(0, 0, 1));\n }\n return dir.normalize();\n }\n\n /**\n * Find surface point by raycasting from OUTSIDE toward the annotation center.\n * This ensures we hit the outer surface facing the outward direction.\n */\n private findSurfacePoint(target: THREE.Vector3, outwardDir: THREE.Vector3): THREE.Vector3 {\n if (!this.model) return target.clone();\n\n if (this.modelMeshes.length === 0) return target.clone();\n\n const modelScale = Math.max(this.modelSize.x, this.modelSize.y, this.modelSize.z);\n const scale = this.modelSize.y / REFERENCE_MODEL_HEIGHT;\n\n // Cast ray from far outside, coming IN toward the target\n const rayOrigin = target.clone().add(outwardDir.clone().multiplyScalar(modelScale * 2));\n const rayDir = outwardDir.clone().negate();\n\n this.raycaster.set(rayOrigin, rayDir);\n this.raycaster.far = modelScale * 4;\n\n const hits = this.raycaster.intersectObjects(this.modelMeshes, false);\n\n // Find the first hit (outer surface)\n if (hits.length > 0) {\n const hit = hits[0].point.clone();\n // Offset slightly along outward direction to sit on surface\n hit.add(outwardDir.clone().multiplyScalar(this.config.markerRadius * scale));\n return hit;\n }\n\n // Fallback: try raycasting from model center outward through target\n const rayOrigin2 = this.modelCenter.clone();\n const rayDir2 = outwardDir.clone();\n this.raycaster.set(rayOrigin2, rayDir2);\n this.raycaster.far = modelScale * 2;\n\n const hits2 = this.raycaster.intersectObjects(this.modelMeshes, false);\n if (hits2.length > 0) {\n // Use the LAST hit (furthest out = outer surface)\n const hit = hits2[hits2.length - 1].point.clone();\n hit.add(outwardDir.clone().multiplyScalar(this.config.markerRadius * scale));\n return hit;\n }\n\n // Final fallback: place marker at annotation center offset outward\n return target.clone().add(outwardDir.clone().multiplyScalar(0.05 * scale));\n }\n\n private async findSurfacePointInSlices(\n target: THREE.Vector3,\n outwardDir: THREE.Vector3,\n isCurrent: () => boolean,\n ): Promise<THREE.Vector3 | null> {\n if (!isCurrent()) return null;\n if (!this.model || this.modelMeshes.length === 0) return target.clone();\n const meshes = this.modelMeshes;\n const modelCenter = this.modelCenter.clone();\n const modelScale = Math.max(this.modelSize.x, this.modelSize.y, this.modelSize.z);\n const scale = this.modelSize.y / REFERENCE_MODEL_HEIGHT;\n const raycaster = new THREE.Raycaster();\n const options = { isCurrent, yieldToPaint: waitForCharacterLoadPaint };\n raycaster.set(target.clone().addScaledVector(outwardDir, modelScale * 2), outwardDir.clone().negate());\n raycaster.far = modelScale * 4;\n const incoming = await intersectMeshesInSlices(raycaster, meshes, options);\n if (!incoming || !isCurrent()) return null;\n if (incoming.length > 0) {\n return incoming[0].point.clone().addScaledVector(outwardDir, this.config.markerRadius * scale);\n }\n\n // Separate the two searches too: an expensive last mesh must not be\n // followed by another query's first mesh in the same uninterrupted task.\n await waitForCharacterLoadPaint();\n if (!isCurrent()) return null;\n raycaster.set(modelCenter, outwardDir.clone());\n raycaster.far = modelScale * 2;\n const outgoing = await intersectMeshesInSlices(raycaster, meshes, options);\n if (!outgoing || !isCurrent()) return null;\n if (outgoing.length > 0) {\n return outgoing[outgoing.length - 1].point.clone().addScaledVector(outwardDir, this.config.markerRadius * scale);\n }\n return target.clone().addScaledVector(outwardDir, 0.05 * scale);\n }\n\n private getSuffixPattern(): string | undefined {\n return this.characterConfig?.suffixPattern;\n }\n\n /**\n * Get center point and bounding box of annotation's bones/meshes.\n * Uses fuzzy matching to handle bone names with numeric suffixes.\n */\n private getRegionCenterAndBox(\n region: Region,\n ): { center: THREE.Vector3; box: THREE.Box3; usedRuntimeMorphAnchor?: boolean } | null {\n const model = this.model;\n if (!model) return null;\n\n const resolvedAnchor = resolveMarkerAnchorRegion(region);\n const anchorRegion = resolvedAnchor.region;\n\n // Batch loads refresh once up front; one-off marker edits still need fresh\n // skeleton transforms before resolving their world positions.\n if (!this.regionLoadHasFreshMatrices) {\n model.updateMatrixWorld(true);\n }\n\n const modelRotation = new THREE.Matrix4();\n modelRotation.extractRotation(model.matrixWorld);\n const toWorldOffset = (localOffset: THREE.Vector3): THREE.Vector3 => {\n return localOffset.clone().applyMatrix4(modelRotation);\n };\n const leftX = getSemanticHorizontalSignForSide('left', this.laterality);\n const rightX = getSemanticHorizontalSignForSide('right', this.laterality);\n\n const box = new THREE.Box3();\n let found = false;\n let usedRuntimeMorphAnchor = false;\n const foundItems: string[] = [];\n\n // PRIORITY 0: If region has a custom position (user-adjusted), use it directly\n if (anchorRegion.customPosition) {\n const customCenter = new THREE.Vector3(\n anchorRegion.customPosition.x,\n anchorRegion.customPosition.y,\n anchorRegion.customPosition.z\n );\n box.expandByPoint(customCenter);\n console.log(`[3DMarkers] Region \"${anchorRegion.name}\" using customPosition: (${customCenter.x.toFixed(3)}, ${customCenter.y.toFixed(3)}, ${customCenter.z.toFixed(3)})`);\n return { center: customCenter, box };\n }\n\n // Handle full body (*)\n if (anchorRegion.objects?.includes('*')) {\n box.setFromObject(model);\n found = true;\n foundItems.push('full model');\n } else {\n // PRIORITY 1: For face regions, ALWAYS use resolveFaceCenter (embody)\n // This handles both user-selected meshes AND auto-detection by morph count\n // NEVER fall back to bone position for face regions (bones are at skull center = back of head)\n const isFaceRegion = shouldUseFaceCenterForMarkerAnchor(resolvedAnchor);\n\n if (isFaceRegion) {\n const hasMeshes = anchorRegion.meshes && anchorRegion.meshes.length > 0;\n console.log(`[3DMarkers] Face region \"${anchorRegion.name}\" - meshes: ${hasMeshes ? anchorRegion.meshes!.join(', ') : 'auto-detect by morph count'}`);\n\n // Use embody helper to find face center position\n // If no meshes provided, resolveFaceCenter will auto-detect by morph target count\n const faceCenterResult = resolveFaceCenter(model, anchorRegion, boneResolutionProfile(this.characterConfig) ?? undefined);\n\n console.log(`[3DMarkers] Face region \"${anchorRegion.name}\" - method: ${faceCenterResult.method}`);\n faceCenterResult.debugInfo.forEach(info => console.log(`[3DMarkers] ${info}`));\n\n // Copy values to our THREE.Vector3 to avoid type issues\n const faceCenter = new THREE.Vector3(\n faceCenterResult.center.x,\n faceCenterResult.center.y,\n faceCenterResult.center.z\n );\n\n box.expandByPoint(faceCenter);\n found = true;\n foundItems.push(`face-center: ${faceCenterResult.method} at (${faceCenter.x.toFixed(2)}, ${faceCenter.y.toFixed(2)}, ${faceCenter.z.toFixed(2)})`);\n\n const center = new THREE.Vector3();\n box.getCenter(center);\n console.log(`[3DMarkers] Returning face center: (${center.x.toFixed(3)}, ${center.y.toFixed(3)}, ${center.z.toFixed(3)})`);\n return { center, box };\n }\n\n // PRIORITY 2: Find bones (with fuzzy matching for numeric suffixes)\n if (anchorRegion.bones) {\n const tempVec = new THREE.Vector3();\n const resolvedBoneNames = resolveBoneNames(anchorRegion.bones, boneResolutionProfile(this.characterConfig));\n\n for (const boneName of resolvedBoneNames) {\n model.traverse((obj) => {\n if (fuzzyNameMatch(obj.name, boneName, this.getSuffixPattern())) {\n obj.getWorldPosition(tempVec);\n box.expandByPoint(tempVec);\n found = true;\n foundItems.push(`bone:${obj.name} (matched ${boneName}) at (${tempVec.x.toFixed(2)}, ${tempVec.y.toFixed(2)}, ${tempVec.z.toFixed(2)})`);\n }\n });\n }\n }\n\n // Find meshes (with fuzzy matching for numeric suffixes)\n if (anchorRegion.meshes) {\n for (const meshName of anchorRegion.meshes) {\n model.traverse((obj) => {\n if (fuzzyNameMatch(obj.name, meshName, this.getSuffixPattern()) && (obj as THREE.Mesh).isMesh) {\n const mesh = obj as THREE.Mesh;\n const runtimeMorphAnchorPoint = getRuntimeAUMorphAnchorPoint(\n anchorRegion as AnnotationAnchoredRegion,\n mesh,\n );\n if (runtimeMorphAnchorPoint) {\n box.expandByPoint(runtimeMorphAnchorPoint);\n found = true;\n usedRuntimeMorphAnchor = true;\n foundItems.push(`runtime-morph:${meshName} at (${runtimeMorphAnchorPoint.x.toFixed(2)}, ${runtimeMorphAnchorPoint.y.toFixed(2)}, ${runtimeMorphAnchorPoint.z.toFixed(2)})`);\n return;\n }\n\n // For skinned meshes, the geometry is at origin - we need to find the\n // associated bone position instead, or compute world-space bounds\n let meshCenter = new THREE.Vector3();\n\n // Check if this is a skinned mesh by looking for a parent bone\n // or if the mesh has very small bounds near origin\n const meshBox = new THREE.Box3().setFromObject(mesh);\n meshBox.getCenter(meshCenter);\n\n // If center is near origin, this is likely a skinned mesh\n // Try to find the bone that controls it by name pattern\n if (meshCenter.length() < 0.1) {\n // For CC_Base_Eye and CC_Base_Eye_1, use the eye bones (CC4/human)\n if (meshName.includes('CC_Base_Eye')) {\n const isLeft = !meshName.includes('_1'); // CC_Base_Eye is left, CC_Base_Eye_1 is right\n const eyeBoneName = isLeft ? 'CC_Base_L_Eye' : 'CC_Base_R_Eye';\n model.traverse((boneObj) => {\n if (boneObj.name === eyeBoneName) {\n boneObj.getWorldPosition(meshCenter);\n }\n });\n } else if (meshName === 'EYES_0') {\n // Fish eye mesh - use head bone and offset forward + sideways\n // The fish model is small and the head bone is deep inside the body,\n // so we need a forward offset to reach the visible eye surface\n // Additionally offset left/right based on region name for distinct eye markers\n const regionNameLower = anchorRegion.name.toLowerCase();\n const isLeftEye = regionNameLower.includes('left');\n const isRightEye = regionNameLower.includes('right');\n // Symmetric horizontal offset in MODEL space, aligned with semantic left/right.\n const sideOffset = isLeftEye ? 0.035 * leftX : isRightEye ? 0.035 * rightX : 0;\n\n model.traverse((boneObj) => {\n // Match head bone (either hardcoded or via fuzzy match)\n if (boneObj.name === 'Bone.001_Armature' || boneObj.name.includes('001_Armature')) {\n boneObj.getWorldPosition(meshCenter);\n // Offset in model-local space (will be transformed to world space):\n // X = left(-)/right(+), Y = up/down, Z = forward(+)/back(-)\n // Forward offset (Z) to reach eye surface, side offset (X) for left/right eye\n meshCenter.add(toWorldOffset(new THREE.Vector3(sideOffset, 0.01, 0.1)));\n }\n });\n } else if (meshName.includes('Tongue') || meshName.includes('Teeth')) {\n // For tongue/teeth, use jaw bone\n model.traverse((boneObj) => {\n if (boneObj.name === 'CC_Base_JawRoot') {\n boneObj.getWorldPosition(meshCenter);\n }\n });\n } else {\n // Fallback: use mesh world position\n mesh.getWorldPosition(meshCenter);\n }\n }\n\n const runtimeSide = getRuntimeAnnotationSide(anchorRegion);\n const runtimeSideSign = runtimeSide === 'left'\n ? leftX\n : runtimeSide === 'right'\n ? rightX\n : 0;\n const runtimeSideOffset = runtimeSideSign\n ? getRuntimeAUMeshSideOffset(anchorRegion, runtimeSideSign, this.modelSize)\n : null;\n if (runtimeSideOffset) {\n meshCenter.add(toWorldOffset(runtimeSideOffset));\n foundItems.push(`runtime-side:${runtimeSide}`);\n }\n\n box.expandByPoint(meshCenter);\n found = true;\n foundItems.push(`mesh:${meshName} center at (${meshCenter.x.toFixed(2)}, ${meshCenter.y.toFixed(2)}, ${meshCenter.z.toFixed(2)})`);\n }\n });\n }\n }\n }\n\n if (!found || box.isEmpty()) {\n return null;\n }\n\n const center = new THREE.Vector3();\n box.getCenter(center);\n\n // For fin annotations, offset center toward the outer edge of the fin\n // Bones are at the base (near body), but markers should be on the outer edge\n if (!resolvedAnchor.useLegacyRegionSemantics) {\n return { center, box };\n }\n\n const name = anchorRegion.name.toLowerCase();\n const modelScale = Math.max(this.modelSize.x, this.modelSize.y, this.modelSize.z);\n const finOffset = modelScale * 0.15; // Offset based on model scale\n\n if (name.includes('pectoral')) {\n if (name.includes('left')) {\n center.add(toWorldOffset(new THREE.Vector3(leftX, -0.3, 0).multiplyScalar(finOffset)));\n } else if (name.includes('right')) {\n center.add(toWorldOffset(new THREE.Vector3(rightX, -0.3, 0).multiplyScalar(finOffset)));\n }\n } else if (name.includes('ventral') || name.includes('pelvic')) {\n center.add(toWorldOffset(new THREE.Vector3(0, -0.5, -0.3).multiplyScalar(finOffset)));\n } else if (name.includes('anal')) {\n center.add(toWorldOffset(new THREE.Vector3(0, -0.5, -0.5).multiplyScalar(finOffset)));\n } else if (name.includes('caudal') || name.includes('tail')) {\n center.add(toWorldOffset(new THREE.Vector3(0, 0, -0.8).multiplyScalar(finOffset)));\n } else if (name.includes('dorsal')) {\n center.add(toWorldOffset(new THREE.Vector3(0, 0.5, -0.3).multiplyScalar(finOffset)));\n } else if (name === 'mouth') {\n center.add(toWorldOffset(new THREE.Vector3(0, 0, 0.6).multiplyScalar(finOffset)));\n } else if (name.includes('operculum') || name.includes('gill')) {\n // Offset slightly to the side for gill cover\n const semanticSign = getSemanticHorizontalSign(name, this.laterality);\n center.add(\n toWorldOffset(new THREE.Vector3(0.3 * (semanticSign ?? rightX), 0, 0).multiplyScalar(finOffset))\n );\n }\n\n return { center, box, usedRuntimeMorphAnchor };\n }\n\n private formatLabelText(regionOrName: Region | string): string {\n const name = typeof regionOrName === 'string' ? regionOrName : regionOrName.name;\n const explicitLabel = typeof regionOrName === 'string'\n ? undefined\n : getAnnotationRegionLabel(regionOrName);\n const text = name.split('_').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n const children = this.parentChildIndex.get(name);\n if (children && children.length > 0) {\n const isExpanded = this.expandedRegions.get(name);\n return `${explicitLabel ?? text} ${isExpanded ? '-' : '+'}`;\n }\n return explicitLabel ?? text;\n }\n\n private buildLabelTexture(\n text: string,\n style?: Required<MarkerStyleOverrides>\n ): { texture: THREE.CanvasTexture; aspect: number } {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n // Use style if provided, otherwise fall back to config\n const fontSize = style?.labelFontSize ?? this.config.labelFontSize;\n const labelColor = style?.labelColor ?? this.config.labelColor;\n const labelBackground = style?.labelBackground ?? this.config.labelBackground;\n\n const font = `bold ${fontSize}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`;\n ctx.font = font;\n\n const padding = fontSize * 0.5;\n const textWidth = ctx.measureText(text).width;\n canvas.width = Math.ceil(textWidth + padding * 2);\n canvas.height = Math.ceil(fontSize + padding * 1.5);\n\n // Background\n ctx.fillStyle = labelBackground;\n const r = fontSize * 0.3;\n ctx.beginPath();\n ctx.roundRect(0, 0, canvas.width, canvas.height, r);\n ctx.fill();\n\n // Border (derive from marker color if style provided)\n const borderColor = style ? `rgba(${(style.lineColor >> 16) & 0xff}, ${(style.lineColor >> 8) & 0xff}, ${style.lineColor & 0xff}, 0.6)` : 'rgba(66, 153, 225, 0.6)';\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.roundRect(1, 1, canvas.width - 2, canvas.height - 2, r);\n ctx.stroke();\n\n // Text\n ctx.font = font;\n ctx.fillStyle = labelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.minFilter = THREE.LinearFilter;\n const aspect = canvas.width / canvas.height;\n\n return { texture, aspect };\n }\n\n private createLabelSprite(regionOrName: Region | string, style?: Required<MarkerStyleOverrides>): THREE.Sprite {\n const text = this.formatLabelText(regionOrName);\n const { texture, aspect } = this.buildLabelTexture(text, style);\n\n const sprite = new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: texture,\n transparent: true,\n sizeAttenuation: false, // Disable size attenuation - we'll scale manually for consistent screen size\n })\n );\n\n // With sizeAttenuation: false, sprite scale is in normalized device coordinates (screen space)\n // Use a fixed screen-relative scale so labels appear same size regardless of model/camera distance\n const baseScale = 0.024; // Fixed screen-relative size\n sprite.scale.set(baseScale * aspect, baseScale, 1);\n\n return sprite;\n }\n\n private updateLabelSprite(name: string): void {\n const label = this.labelSprites.get(name);\n if (!label) return;\n const style = this.resolvedStyles.get(name);\n const text = this.formatLabelText(name);\n const { texture, aspect } = this.buildLabelTexture(text, style);\n const material = label.material as THREE.SpriteMaterial;\n if (material.map) material.map.dispose();\n material.map = texture;\n material.needsUpdate = true;\n\n const baseScale = 0.024;\n label.scale.set(baseScale * aspect, baseScale, 1);\n this.labelScales.set(name, { x: baseScale * aspect, y: baseScale });\n }\n\n private updateMarkerStyles(): void {\n // Get current zoom scale factors\n const labelScale = this.isZoomedIn ? ZOOMED_IN_LABEL_SCALE : 1.0;\n\n for (const [name, sphere] of this.markerMeshes) {\n const line = this.lineMeshes.get(name);\n const label = this.labelSprites.get(name);\n const baseScale = this.labelScales.get(name);\n const isSelected = name === this.currentRegion;\n\n // Use per-region resolved style (respects runtime style updates)\n const style = this.resolvedStyles.get(name);\n const markerColor = style?.markerColor ?? this.config.markerColor;\n const lineColor = style?.lineColor ?? this.config.lineColor;\n\n (sphere.material as THREE.MeshBasicMaterial).color.setHex(\n isSelected ? 0x63b3ed : markerColor\n );\n // Selection highlight scale (distance-based scaling is handled in update())\n if (isSelected) {\n const currentScale = sphere.scale.x; // Preserve distance-based scale\n sphere.scale.setScalar(currentScale * 1.3);\n }\n\n if (line) {\n (line.material as THREE.LineBasicMaterial).color.setHex(\n isSelected ? 0x63b3ed : lineColor\n );\n (line.material as THREE.LineBasicMaterial).opacity = isSelected ? 1 : (this.isZoomedIn ? 0.6 : 0.9);\n }\n\n if (label && baseScale) {\n const s = isSelected ? 1.1 : 1;\n // Apply label scale with selection highlight (labels stay more readable)\n label.scale.set(baseScale.x * s * labelScale, baseScale.y * s * labelScale, 1);\n }\n }\n }\n\n private getResolvedLineConfig(name: string): Required<LineConfig> {\n const style = this.resolvedStyles.get(name);\n return {\n style: style?.line.style ?? 'solid',\n curve: style?.line.curve ?? 'straight',\n arrowHead: style?.line.arrowHead ?? false,\n thickness: style?.line.thickness ?? 2,\n length: style?.line.length ?? this.config.lineLength,\n };\n }\n\n private getViewportSafeBounds(label: THREE.Sprite): { safeX: number; safeY: number } {\n const rect = this.domElement.getBoundingClientRect();\n return resolveViewportSafeBounds({\n labelScaleX: label.scale.x,\n labelScaleY: label.scale.y,\n projectionXScale: this.camera.projectionMatrix.elements[0] ?? 1,\n projectionYScale: this.camera.projectionMatrix.elements[5] ?? 1,\n viewportWidth: rect.width || this.domElement.clientWidth,\n viewportHeight: rect.height || this.domElement.clientHeight,\n });\n }\n\n private updateMarkerGeometry(name: string, start: THREE.Vector3, end: THREE.Vector3): void {\n const line = this.lineMeshes.get(name);\n const label = this.labelSprites.get(name);\n const arrow = this.arrowMeshes.get(name);\n const endpoints = this.lineEndpoints.get(name);\n if (!line || !label || !endpoints) return;\n\n endpoints.start.copy(start);\n endpoints.end.copy(end);\n\n const lineConfig = this.getResolvedLineConfig(name);\n let points: THREE.Vector3[] | null = null;\n\n if (lineConfig.curve === 'straight') {\n const positions = line.geometry.getAttribute('position') as THREE.BufferAttribute | undefined;\n if (positions?.count === 2) {\n positions.setXYZ(0, start.x, start.y, start.z);\n positions.setXYZ(1, end.x, end.y, end.z);\n positions.needsUpdate = true;\n } else {\n points = [start.clone(), end.clone()];\n line.geometry.setFromPoints(points);\n }\n } else {\n points = lineConfig.curve === 'bezier'\n ? this.createBezierCurve(start, end)\n : this.createArcCurve(start, end);\n line.geometry.setFromPoints(points);\n }\n\n if (line.material instanceof THREE.LineDashedMaterial) {\n line.computeLineDistances();\n }\n\n label.position.copy(end);\n\n if (arrow) {\n const tip = points ? points[points.length - 1] : end;\n const prev = points ? points[points.length - 2] : start;\n arrow.position.copy(tip);\n this.scratchArrowDirection.subVectors(tip, prev);\n if (this.scratchArrowDirection.lengthSq() > POSITION_EPSILON_SQUARED) {\n this.scratchArrowQuaternion.setFromUnitVectors(\n this.arrowUp,\n this.scratchArrowDirection.normalize(),\n );\n arrow.setRotationFromQuaternion(this.scratchArrowQuaternion);\n }\n }\n }\n\n private updateMarkerLineLayout(name: string): boolean {\n const sphere = this.markerMeshes.get(name);\n const label = this.labelSprites.get(name);\n const endpoints = this.lineEndpoints.get(name);\n const originalLength = this.originalLineLengths.get(name);\n\n if (!sphere || !label || !endpoints || originalLength === undefined) {\n this.markerViewportVisibility.set(name, true);\n return true;\n }\n\n const lineScaleFactor = this.isZoomedIn ? ZOOMED_IN_LINE_SCALE : 1.0;\n const fullLength = originalLength * lineScaleFactor;\n const start = sphere.position;\n\n this.scratchWorldEnd\n .copy(endpoints.direction)\n .multiplyScalar(fullLength)\n .add(start);\n\n const { safeX, safeY } = this.getViewportSafeBounds(label);\n this.scratchClipStart\n .set(start.x, start.y, start.z, 1)\n .applyMatrix4(this.camera.matrixWorldInverse)\n .applyMatrix4(this.camera.projectionMatrix);\n this.scratchClipEnd\n .set(this.scratchWorldEnd.x, this.scratchWorldEnd.y, this.scratchWorldEnd.z, 1)\n .applyMatrix4(this.camera.matrixWorldInverse)\n .applyMatrix4(this.camera.projectionMatrix);\n\n if (!isFiniteClipPoint(this.scratchClipEnd)) {\n this.markerViewportVisibility.set(name, false);\n return false;\n }\n const { visible, lineScale } = requireAnnotationCameraCore().resolveViewportConstrainedLineScale({\n startClip: this.scratchClipStart.toArray(this.scratchClipStartValues),\n endClip: this.scratchClipEnd.toArray(this.scratchClipEndValues),\n safeX,\n safeY,\n });\n this.markerViewportVisibility.set(name, visible);\n\n if (!visible) {\n return false;\n }\n\n this.scratchConstrainedEnd\n .copy(endpoints.direction)\n .multiplyScalar(fullLength * lineScale)\n .add(start);\n\n if (\n start.distanceToSquared(endpoints.start) > POSITION_EPSILON_SQUARED ||\n this.scratchConstrainedEnd.distanceToSquared(endpoints.end) > POSITION_EPSILON_SQUARED\n ) {\n this.updateMarkerGeometry(name, start, this.scratchConstrainedEnd);\n }\n\n return true;\n }\n\n private onClick = (event: MouseEvent): void => {\n const rect = this.domElement.getBoundingClientRect();\n this.mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n this.mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n\n this.raycaster.setFromCamera(this.mouse, this.camera);\n\n const clickables = [...this.markerMeshes.values(), ...this.labelSprites.values()];\n const hits = this.raycaster.intersectObjects(clickables, false);\n\n if (hits.length > 0 && hits[0].object.userData.annotation) {\n const regionName = hits[0].object.userData.annotation;\n\n // If this is a parent region with children, toggle expand/collapse\n const children = this.parentChildIndex.get(regionName);\n if (children && children.length > 0) {\n const region = this.regions.find(r => r.name === regionName);\n const animation = region?.expandAnimation || 'staggered';\n this.toggleRegion(regionName, animation);\n }\n\n // Always call onSelect for camera focus\n this.onSelect(regionName);\n }\n };\n\n /**\n * Update marker positions to follow animated bones.\n * Uses stored bone references and local offsets for efficiency.\n */\n private updateMarkerPositions(): void {\n for (const [name, bone] of this.boneRefs) {\n const sphere = this.markerMeshes.get(name);\n const localOffset = this.localOffsets.get(name);\n\n if (!sphere || !localOffset) continue;\n\n // Transform local offset to world space using current bone matrix\n const newSurfacePoint = this.tempSurfacePoint.copy(localOffset).applyMatrix4(bone.matrixWorld);\n sphere.position.copy(newSurfacePoint);\n }\n }\n\n /**\n * Find the primary bone for a region (for animation tracking).\n */\n private findPrimaryBone(region: Region): THREE.Object3D | null {\n if (!this.model) return null;\n\n // For full body markers, don't track any bone\n if (region.objects?.includes('*')) return null;\n\n // Find first bone from the region's bones list\n if (region.bones && region.bones.length > 0) {\n const primaryBoneName = resolveBoneNames([region.bones[0]], boneResolutionProfile(this.characterConfig))[0];\n let foundBone: THREE.Object3D | null = null;\n\n this.model.traverse((obj) => {\n if (!foundBone && fuzzyNameMatch(obj.name, primaryBoneName, this.getSuffixPattern())) {\n foundBone = obj;\n }\n });\n\n return foundBone;\n }\n\n // For mesh-only regions, find the mesh\n if (region.meshes && region.meshes.length > 0) {\n const primaryMeshName = region.meshes[0];\n let foundMesh: THREE.Object3D | null = null;\n\n this.model.traverse((obj) => {\n if (!foundMesh && fuzzyNameMatch(obj.name, primaryMeshName, this.getSuffixPattern()) && (obj as THREE.Mesh).isMesh) {\n foundMesh = obj;\n }\n });\n\n return foundMesh;\n }\n\n return null;\n }\n\n /**\n * Per-frame update: distance-based scaling + explicit cameraAngle visibility.\n * Markers scale continuously with camera distance to maintain consistent screen size.\n * Occlusion is handled by the GPU via depth testing (depthTest: true).\n */\n update(): void {\n if (!this.model) return;\n\n // Hidden markers do not need per-frame bone tracking or visibility work.\n if (!this.markerGroup.visible && !this.visibilityAnimationActive) {\n return;\n }\n\n // Update marker positions to follow animated bones (like HTML markers do)\n this.updateMarkerPositions();\n\n // Let the short visibility animation own scale/opacity while it runs.\n if (this.visibilityAnimationActive) {\n return;\n }\n\n const dx = this.camera.position.x - this.modelCenter.x;\n const dy = this.camera.position.y - this.modelCenter.y;\n const dz = this.camera.position.z - this.modelCenter.z;\n\n const cameraDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n\n // Only update if distance changed by more than 2% (avoids micro-updates)\n const distanceChanged = this.lastCameraDistance < 0 ||\n Math.abs(cameraDistance - this.lastCameraDistance) > this.lastCameraDistance * 0.02;\n\n if (distanceChanged) {\n const previousDistance = this.lastCameraDistance;\n this.lastCameraDistance = cameraDistance;\n\n // Scale markers proportionally to camera distance to maintain consistent screen size\n // Reference distance is the zoom threshold - at this distance, scale = 1.0\n const referenceDistance = this.zoomThreshold;\n const distanceScale = cameraDistance / referenceDistance;\n\n // Clamp the scale to reasonable bounds (0.3x to 2.0x)\n const clampedScale = Math.max(0.3, Math.min(2.0, distanceScale));\n\n // Apply continuous scaling to spheres\n for (const sphere of this.markerMeshes.values()) {\n sphere.scale.setScalar(clampedScale);\n }\n\n // Update zoom state for other effects (line length, label scale, etc.)\n const shouldBeZoomedIn = cameraDistance < this.zoomThreshold;\n if (shouldBeZoomedIn !== this.isZoomedIn) {\n this.isZoomedIn = shouldBeZoomedIn;\n // Apply zoom-based scaling to lines and labels when crossing threshold\n this.applyZoomScale(shouldBeZoomedIn ? ZOOMED_IN_LINE_SCALE : 1.0);\n }\n\n // Auto-collapse only when crossing the threshold to avoid immediate re-collapse.\n const crossedAutoCollapseThreshold =\n previousDistance >= 0 &&\n previousDistance <= this.autoCollapseThreshold &&\n cameraDistance > this.autoCollapseThreshold;\n if (crossedAutoCollapseThreshold) {\n this.collapseAllRegions();\n }\n }\n\n const cameraMoved =\n !this.hasCameraAngleUpdateSnapshot ||\n this.lastCameraAngleUpdatePosition.distanceToSquared(this.camera.position) > 0.0001 ||\n 1 - Math.abs(this.lastCameraAngleUpdateQuaternion.dot(this.camera.quaternion)) > 0.00001;\n if (!cameraMoved) {\n return;\n }\n\n this.lastCameraAngleUpdatePosition.copy(this.camera.position);\n this.lastCameraAngleUpdateQuaternion.copy(this.camera.quaternion);\n this.hasCameraAngleUpdateSnapshot = true;\n\n // Visibility comes from the combination of:\n // - collapsed child state\n // - solo mode\n // - explicit cameraAngle gates\n // Front-facing markers still rely on GPU depth testing for occlusion.\n //\n // cameraAngle-driven transitions should animate, while structural visibility\n // changes (collapse/solo) should apply immediately.\n const cameraAngle = getModelLocalOrbitAngle(this.model, this.modelCenter, this.camera.position);\n\n for (const [name, sphere] of this.markerMeshes) {\n const markerAngle = sphere.userData.cameraAngle;\n const isStructurallyVisible = shouldShow3DMarker({\n name,\n hiddenChildren: this.hiddenChildren,\n soloedMarker: this.soloedMarker,\n });\n const shouldPassAngleGate = requireAnnotationCameraCore().passesMarkerCameraAngleGate({\n markerAngle,\n currentCameraAngle: cameraAngle,\n });\n const passesViewportGate = isStructurallyVisible && shouldPassAngleGate\n ? this.updateMarkerLineLayout(name)\n : (this.markerViewportVisibility.get(name) ?? true);\n const visible = isStructurallyVisible && shouldPassAngleGate && passesViewportGate;\n\n const hadAngleGate = markerAngle !== undefined && markerAngle !== 0;\n const previousAngleGate = this.markerAngleGateVisibility.get(name);\n this.markerAngleGateVisibility.set(name, shouldPassAngleGate);\n const angleGateChanged =\n hadAngleGate &&\n previousAngleGate !== undefined &&\n previousAngleGate !== shouldPassAngleGate;\n\n if (!isStructurallyVisible) {\n this.stopMarkerVisibilityAnimation(name, true);\n this.setMarkerObjectsVisible(name, false);\n continue;\n }\n\n if (angleGateChanged) {\n this.animateMarkerVisibility(name, visible, VISIBILITY_ANIMATION_DURATION);\n continue;\n }\n\n if (!this.activeMarkerVisibilityAnimations.has(name)) {\n this.setMarkerObjectsVisible(name, visible);\n }\n }\n }\n\n private refreshLaterality(): void {\n this.laterality = detectAnnotationLaterality(this.model, this.regions, boneResolutionProfile(this.characterConfig));\n }\n\n /**\n * Apply zoom-based scaling to all markers, lines, and labels.\n * Only called when crossing the zoom threshold (not every frame).\n */\n private applyZoomScale(scaleFactor: number): void {\n const isZoomed = scaleFactor < 1;\n const sphereScaleFactor = isZoomed ? ZOOMED_IN_SPHERE_SCALE : 1.0;\n const labelScaleFactor = isZoomed ? ZOOMED_IN_LABEL_SCALE : 1.0;\n\n // Scale marker spheres (much smaller when zoomed in)\n for (const sphere of this.markerMeshes.values()) {\n sphere.scale.setScalar(sphereScaleFactor);\n }\n\n for (const line of this.lineMeshes.values()) {\n const material = line.material as THREE.LineBasicMaterial;\n material.opacity = isZoomed ? 0.6 : 0.9;\n }\n\n // Scale labels using their stored base scales (labels stay more readable)\n for (const [name, label] of this.labelSprites) {\n const baseScale = this.labelScales.get(name);\n if (baseScale) {\n label.scale.set(\n baseScale.x * labelScaleFactor,\n baseScale.y * labelScaleFactor,\n 1\n );\n }\n }\n }\n\n setVisible(visible: boolean): void {\n this.animateVisibility(visible);\n }\n\n private readObjectOpacity(object: { material?: THREE.Material | THREE.Material[] }): number {\n if (!object.material) return 1;\n const materials = Array.isArray(object.material) ? object.material : [object.material];\n const materialWithOpacity = materials.find((material) => 'opacity' in material) as THREE.Material | undefined;\n return materialWithOpacity && 'opacity' in materialWithOpacity\n ? materialWithOpacity.opacity\n : 1;\n }\n\n private setObjectOpacity(object: { material?: THREE.Material | THREE.Material[] }, opacity: number): void {\n if (!object.material) return;\n const materials = Array.isArray(object.material) ? object.material : [object.material];\n for (const material of materials) {\n if ('opacity' in material) {\n // Opacity is a uniform; only a transparency mode change needs Three\n // to revalidate the material's program during a visibility animation.\n if (!material.transparent) {\n material.transparent = true;\n material.needsUpdate = true;\n }\n material.opacity = opacity;\n }\n }\n }\n\n private captureVisibilityAnimationStates(): MarkerVisibilityAnimationState[] {\n const states: MarkerVisibilityAnimationState[] = [];\n\n for (const [name, sphere] of this.markerMeshes) {\n const line = this.lineMeshes.get(name);\n const label = this.labelSprites.get(name);\n const arrow = this.arrowMeshes.get(name);\n\n const state: MarkerVisibilityAnimationState = {};\n\n if (sphere.visible) {\n state.sphere = {\n object: sphere,\n opacity: this.readObjectOpacity(sphere),\n };\n }\n\n if (line?.visible) {\n state.line = {\n object: line,\n opacity: this.readObjectOpacity(line),\n };\n }\n\n if (label?.visible) {\n state.label = {\n object: label,\n opacity: this.readObjectOpacity(label),\n scale: label.scale.clone(),\n };\n }\n\n if (arrow?.visible) {\n state.arrow = {\n object: arrow,\n opacity: this.readObjectOpacity(arrow),\n };\n }\n\n if (state.sphere || state.line || state.label || state.arrow) {\n states.push(state);\n }\n }\n\n return states;\n }\n\n private getVisibilityAnimationFactors(visible: boolean, t: number): {\n itemOpacityFactor: number;\n labelScaleFactor: number;\n lineOpacityFactor: number;\n } {\n return requireAnnotationCameraCore().markerVisibilityAnimationFactors(visible, t);\n }\n\n private applyVisibilityAnimationStates(\n states: MarkerVisibilityAnimationState[],\n visible: boolean,\n t: number\n ): void {\n const { itemOpacityFactor, labelScaleFactor, lineOpacityFactor } = this.getVisibilityAnimationFactors(visible, t);\n\n for (const state of states) {\n if (state.sphere) {\n const { object, opacity } = state.sphere;\n object.visible = true;\n this.setObjectOpacity(object, opacity * itemOpacityFactor);\n }\n\n if (state.line) {\n const { object, opacity } = state.line;\n object.visible = true;\n this.setObjectOpacity(object, opacity * lineOpacityFactor);\n }\n\n if (state.label) {\n const { object, opacity, scale } = state.label;\n object.visible = true;\n object.scale.set(scale.x * labelScaleFactor, scale.y * labelScaleFactor, scale.z);\n this.setObjectOpacity(object, opacity * itemOpacityFactor);\n }\n\n if (state.arrow) {\n const { object, opacity } = state.arrow;\n object.visible = true;\n this.setObjectOpacity(object, opacity * itemOpacityFactor);\n }\n }\n }\n\n private restoreVisibilityAnimationStates(states: MarkerVisibilityAnimationState[]): void {\n for (const state of states) {\n if (state.sphere) {\n const { object, opacity } = state.sphere;\n this.setObjectOpacity(object, opacity);\n }\n\n if (state.line) {\n const { object, opacity } = state.line;\n this.setObjectOpacity(object, opacity);\n }\n\n if (state.label) {\n const { object, opacity, scale } = state.label;\n object.scale.copy(scale);\n this.setObjectOpacity(object, opacity);\n }\n\n if (state.arrow) {\n const { object, opacity } = state.arrow;\n this.setObjectOpacity(object, opacity);\n }\n }\n }\n\n private stopAllMarkerVisibilityAnimations(restoreState = false): void {\n for (const name of new Set([\n ...this.activeMarkerVisibilityAnimations,\n ...this.markerVisibilityAnimationStates.keys(),\n ])) {\n this.stopMarkerVisibilityAnimation(name, restoreState);\n }\n }\n\n private stopMarkerVisibilityAnimation(name: string, restoreState = false): void {\n this.visibilityAnimationScheduler.cancel(`marker:${name}`);\n this.activeMarkerVisibilityAnimations.delete(name);\n\n if (restoreState) {\n const state = this.markerVisibilityAnimationStates.get(name);\n if (state) {\n this.restoreVisibilityAnimationStates([state]);\n }\n }\n\n this.markerVisibilityAnimationStates.delete(name);\n }\n\n private getMarkerTargetVisibility(name: string): boolean {\n const target = this.markerTargetVisibility.get(name);\n if (target !== undefined) return target;\n return this.markerMeshes.get(name)?.visible ?? false;\n }\n\n private setMarkerObjectsVisible(name: string, visible: boolean, persistTarget = true): void {\n const sphere = this.markerMeshes.get(name);\n const line = this.lineMeshes.get(name);\n const label = this.labelSprites.get(name);\n const arrow = this.arrowMeshes.get(name);\n\n if (sphere) sphere.visible = visible;\n if (line) line.visible = visible;\n if (label) label.visible = visible;\n if (arrow) arrow.visible = visible;\n if (persistTarget) {\n this.markerTargetVisibility.set(name, visible);\n }\n }\n\n private getMarkerFallbackOpacity(name: string, kind: 'sphere' | 'line' | 'label' | 'arrow'): number {\n const style = this.resolvedStyles.get(name);\n\n switch (kind) {\n case 'sphere':\n return 0.95 * (style?.opacity ?? 1);\n case 'line':\n return name === this.currentRegion ? 1 : (this.isZoomedIn ? 0.6 : 0.9);\n case 'label':\n return 1;\n case 'arrow':\n return style?.opacity ?? 1;\n }\n }\n\n private getMarkerBaseLabelScale(name: string, label: THREE.Sprite): THREE.Vector3 {\n if (label.scale.x > 0.001 && label.scale.y > 0.001) {\n return label.scale.clone();\n }\n\n const baseScale = this.labelScales.get(name);\n if (!baseScale) {\n return new THREE.Vector3(1, 1, 1);\n }\n\n const selectionScale = name === this.currentRegion ? 1.1 : 1;\n const zoomScale = this.isZoomedIn ? ZOOMED_IN_LABEL_SCALE : 1;\n\n return new THREE.Vector3(\n baseScale.x * selectionScale * zoomScale,\n baseScale.y * selectionScale * zoomScale,\n 1,\n );\n }\n\n private captureMarkerVisibilityAnimationState(name: string): MarkerVisibilityAnimationState | null {\n const sphere = this.markerMeshes.get(name);\n const line = this.lineMeshes.get(name);\n const label = this.labelSprites.get(name);\n const arrow = this.arrowMeshes.get(name);\n\n const state: MarkerVisibilityAnimationState = {};\n\n if (sphere) {\n state.sphere = {\n object: sphere,\n opacity: Math.max(\n this.readObjectOpacity(sphere),\n this.getMarkerFallbackOpacity(name, 'sphere'),\n ),\n };\n }\n\n if (line) {\n state.line = {\n object: line,\n opacity: Math.max(\n this.readObjectOpacity(line),\n this.getMarkerFallbackOpacity(name, 'line'),\n ),\n };\n }\n\n if (label) {\n state.label = {\n object: label,\n opacity: Math.max(\n this.readObjectOpacity(label),\n this.getMarkerFallbackOpacity(name, 'label'),\n ),\n scale: this.getMarkerBaseLabelScale(name, label),\n };\n }\n\n if (arrow) {\n state.arrow = {\n object: arrow,\n opacity: Math.max(\n this.readObjectOpacity(arrow),\n this.getMarkerFallbackOpacity(name, 'arrow'),\n ),\n };\n }\n\n if (state.sphere || state.line || state.label || state.arrow) {\n return state;\n }\n\n return null;\n }\n\n // Child expand/collapse should use the exact same opacity and label-scale treatment\n // as the normal marker show/hide path. The earlier regressions came from layering a\n // second bespoke animation system on top of expansion instead of reusing this one.\n private animateMarkerVisibility(name: string, visible: boolean, duration: number): void {\n if (this.getMarkerTargetVisibility(name) === visible) {\n return;\n }\n this.markerTargetVisibility.set(name, visible);\n\n this.stopMarkerVisibilityAnimation(name, true);\n\n const state = this.captureMarkerVisibilityAnimationState(name);\n if (!state) {\n this.setMarkerObjectsVisible(name, visible, false);\n return;\n }\n\n this.markerVisibilityAnimationStates.set(name, state);\n this.setMarkerObjectsVisible(name, true, false);\n\n const startTime = performance.now();\n this.activeMarkerVisibilityAnimations.add(name);\n this.visibilityAnimationScheduler.schedule(`marker:${name}`, (now): boolean => {\n const elapsed = now - startTime;\n const t = Math.min(elapsed / duration, 1);\n this.applyVisibilityAnimationStates([state], visible, t);\n\n if (t < 1) {\n return true;\n }\n\n this.activeMarkerVisibilityAnimations.delete(name);\n this.markerVisibilityAnimationStates.delete(name);\n this.restoreVisibilityAnimationStates([state]);\n this.setMarkerObjectsVisible(name, visible, false);\n return false;\n });\n }\n\n private stopVisibilityAnimation(restoreState = false): void {\n this.visibilityAnimationScheduler.cancel(GROUP_VISIBILITY_ANIMATION_KEY);\n this.visibilityAnimationActive = false;\n\n if (restoreState && this.visibilityAnimationStates.length > 0) {\n this.markerGroup.visible = true;\n this.restoreVisibilityAnimationStates(this.visibilityAnimationStates);\n }\n }\n\n private animateVisibility(visible: boolean): void {\n if (visible === this.markerGroup.visible && !this.visibilityAnimationActive) {\n return;\n }\n\n this.stopAllMarkerVisibilityAnimations(true);\n this.stopVisibilityAnimation(true);\n\n if (visible) {\n this.markerGroup.visible = true;\n }\n\n this.visibilityAnimationStates = this.captureVisibilityAnimationStates();\n if (this.visibilityAnimationStates.length === 0) {\n this.markerGroup.visible = visible;\n return;\n }\n\n const startTime = performance.now();\n this.visibilityAnimationActive = true;\n this.visibilityAnimationScheduler.schedule(GROUP_VISIBILITY_ANIMATION_KEY, (now): boolean => {\n const elapsed = now - startTime;\n const t = Math.min(elapsed / VISIBILITY_ANIMATION_DURATION, 1);\n this.applyVisibilityAnimationStates(this.visibilityAnimationStates, visible, t);\n\n if (t < 1) {\n return true;\n }\n\n this.visibilityAnimationActive = false;\n this.restoreVisibilityAnimationStates(this.visibilityAnimationStates);\n if (!visible) {\n this.markerGroup.visible = false;\n }\n this.visibilityAnimationStates = [];\n return false;\n });\n }\n\n clear(): void {\n this.regionLoadGeneration += 1;\n this.regionLoadHasFreshMatrices = false;\n this.stopAllMarkerVisibilityAnimations(false);\n this.stopVisibilityAnimation(false);\n this.visibilityAnimationStates = [];\n while (this.markerGroup.children.length > 0) {\n const child = this.markerGroup.children[0];\n this.markerGroup.remove(child);\n\n const mesh = child as THREE.Mesh;\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) {\n const mat = mesh.material as THREE.Material;\n if ((mat as THREE.SpriteMaterial).map) {\n (mat as THREE.SpriteMaterial).map!.dispose();\n }\n mat.dispose();\n }\n }\n\n this.markerMeshes.clear();\n this.lineMeshes.clear();\n this.lineEndpoints.clear();\n this.labelSprites.clear();\n this.labelScales.clear();\n this.arrowMeshes.clear();\n this.resolvedStyles.clear();\n this.expandedRegions.clear();\n this.parentChildIndex.clear();\n this.childParentIndex.clear();\n this.hiddenChildren.clear();\n this.groupVisibility.clear();\n this.originalLineLengths.clear();\n this.boneRefs.clear();\n this.localOffsets.clear();\n this.markerTargetVisibility.clear();\n this.markerAngleGateVisibility.clear();\n this.markerViewportVisibility.clear();\n this.soloedMarker = null;\n this.hasCameraAngleUpdateSnapshot = false;\n }\n\n // ============ SOLO MODE ============\n\n /**\n * Solo a specific marker - hide all others.\n * Pass null to unsolo.\n */\n setSoloMarker(regionName: string | null): void {\n this.soloedMarker = regionName;\n\n for (const [name] of this.markerMeshes) {\n const shouldShow = regionName === null || name === regionName;\n const region = this.regions.find(r => r.name === name);\n\n // Skip fallback markers (they have their own visibility logic)\n if (region?.isFallback) continue;\n\n this.stopMarkerVisibilityAnimation(name, true);\n this.setMarkerObjectsVisible(name, shouldShow);\n }\n }\n\n /**\n * Get currently soloed marker name.\n */\n getSoloedMarker(): string | null {\n return this.soloedMarker;\n }\n\n // ============ EXPANDING ANCHORS ============\n\n /**\n * Expand a parent region to show its children.\n */\n async expandRegion(\n regionName: string,\n animation: ExpandAnimation = 'outward',\n duration = VISIBILITY_ANIMATION_DURATION\n ): Promise<void> {\n const children = this.parentChildIndex.get(regionName);\n if (!children || children.length === 0) return;\n\n // Already expanded\n if (this.expandedRegions.get(regionName)) return;\n\n this.expandedRegions.set(regionName, true);\n this.updateLabelSprite(regionName);\n\n // Get parent position\n const parentSphere = this.markerMeshes.get(regionName);\n if (!parentSphere) return;\n const parentPos = parentSphere.position.clone();\n\n // Animate children\n const staggerDelay = animation === 'staggered' ? 50 : 0;\n\n for (let i = 0; i < children.length; i++) {\n const childName = children[i];\n const delay = i * staggerDelay;\n this.hiddenChildren.delete(childName);\n\n // Schedule animation\n setTimeout(() => {\n this.animateMarkerIn(childName, parentPos, duration);\n }, delay);\n }\n }\n\n /**\n * Collapse a parent region to hide its children.\n */\n async collapseRegion(\n regionName: string,\n duration = VISIBILITY_ANIMATION_DURATION\n ): Promise<void> {\n const children = this.parentChildIndex.get(regionName);\n if (!children || children.length === 0) return;\n\n // Already collapsed\n if (!this.expandedRegions.get(regionName)) return;\n\n this.expandedRegions.set(regionName, false);\n this.updateLabelSprite(regionName);\n\n // Get parent position for animation target\n const parentSphere = this.markerMeshes.get(regionName);\n if (!parentSphere) return;\n const parentPos = parentSphere.position.clone();\n\n // Animate children out\n for (const childName of children) {\n this.animateMarkerOut(childName, parentPos, duration);\n setTimeout(() => {\n this.hiddenChildren.add(childName);\n }, duration);\n }\n }\n\n /**\n * Toggle expand/collapse state.\n */\n toggleRegion(\n regionName: string,\n animation: ExpandAnimation = 'outward',\n duration = VISIBILITY_ANIMATION_DURATION\n ): void {\n if (this.expandedRegions.get(regionName)) {\n this.collapseRegion(regionName, duration * 0.75);\n } else {\n this.expandRegion(regionName, animation, duration);\n }\n }\n\n /**\n * Get expanded state of all regions.\n */\n getExpandedRegions(): ExpandedRegionState[] {\n const states: ExpandedRegionState[] = [];\n for (const [regionName, isExpanded] of this.expandedRegions) {\n const children = this.parentChildIndex.get(regionName) || [];\n states.push({ regionName, isExpanded, children });\n }\n return states;\n }\n\n /**\n * Collapse all currently expanded regions.\n * Called automatically when zooming out past threshold.\n */\n private collapseAllRegions(duration = VISIBILITY_ANIMATION_DURATION): void {\n // Get list of expanded regions (iterate copy to avoid mutation during iteration)\n const expandedList = [...this.expandedRegions.entries()]\n .filter(([_, isExpanded]) => isExpanded)\n .map(([name, _]) => name);\n\n if (expandedList.length === 0) return;\n\n // Collapse all expanded regions\n for (const regionName of expandedList) {\n this.collapseRegion(regionName, duration);\n }\n }\n\n /**\n * Animate a child marker in place using the same visibility curve as regular markers.\n */\n private animateMarkerIn(name: string, _fromPos: THREE.Vector3, duration: number): void {\n this.animateMarkerVisibility(name, true, duration);\n }\n\n /**\n * Animate a child marker out in place using the same visibility curve as regular markers.\n */\n private animateMarkerOut(name: string, _toPos: THREE.Vector3, duration: number): void {\n this.animateMarkerVisibility(name, false, duration);\n }\n\n // ============ RUNTIME STYLE UPDATES ============\n\n /**\n * Update line style for a specific region at runtime.\n */\n updateLineStyle(regionName: string, lineConfig: Partial<LineConfig>): void {\n console.log(`[3DMarkers] updateLineStyle: region=${regionName}`, lineConfig);\n const style = this.resolvedStyles.get(regionName);\n if (!style) {\n console.warn(`[3DMarkers] updateLineStyle: No style found for region ${regionName}`);\n return;\n }\n\n // Update resolved style\n style.line = { ...style.line, ...lineConfig };\n\n // Get current endpoints\n const endpoints = this.lineEndpoints.get(regionName);\n if (!endpoints) {\n console.warn(`[3DMarkers] updateLineStyle: No endpoints for region ${regionName}. Available:`, Array.from(this.lineEndpoints.keys()));\n return;\n }\n console.log(`[3DMarkers] updateLineStyle: Found endpoints for ${regionName}, recreating line`);\n\n // Remove old line and arrow\n const oldLine = this.lineMeshes.get(regionName);\n const oldArrow = this.arrowMeshes.get(regionName);\n\n if (oldLine) {\n this.markerGroup.remove(oldLine);\n oldLine.geometry.dispose();\n (oldLine.material as THREE.Material).dispose();\n }\n if (oldArrow) {\n this.markerGroup.remove(oldArrow);\n oldArrow.geometry.dispose();\n (oldArrow.material as THREE.Material).dispose();\n this.arrowMeshes.delete(regionName);\n }\n\n // Create new styled line\n const newLineConfig: Required<LineConfig> = {\n style: style.line.style ?? 'solid',\n curve: style.line.curve ?? 'straight',\n arrowHead: style.line.arrowHead ?? false,\n thickness: style.line.thickness ?? 2,\n length: style.line.length ?? this.config.lineLength,\n };\n\n const line = this.createStyledLine(\n endpoints.start,\n endpoints.end,\n newLineConfig,\n style.lineColor,\n 0.9 * style.opacity,\n regionName\n );\n line.name = `line_${regionName}`;\n line.userData.annotation = regionName;\n\n // Preserve visibility from old line or sphere\n const sphere = this.markerMeshes.get(regionName);\n line.visible = sphere?.visible ?? true;\n\n this.markerGroup.add(line);\n this.lineMeshes.set(regionName, line);\n\n // For dashed/dotted lines, ensure line distances are computed after adding to scene\n if (newLineConfig.style === 'dashed' || newLineConfig.style === 'dotted') {\n line.computeLineDistances();\n }\n\n const mat = line.material as THREE.LineDashedMaterial;\n console.log(`[3DMarkers] updateLineStyle: Created new line for ${regionName}`, {\n style: newLineConfig.style,\n curve: newLineConfig.curve,\n arrowHead: newLineConfig.arrowHead,\n visible: line.visible,\n materialType: (line.material as THREE.Material).type,\n inScene: this.markerGroup.children.includes(line),\n childrenCount: this.markerGroup.children.length,\n color: mat.color?.getHexString(),\n opacity: mat.opacity,\n dashSize: 'dashSize' in mat ? mat.dashSize : 'N/A',\n gapSize: 'gapSize' in mat ? mat.gapSize : 'N/A',\n lineDistanceAttr: line.geometry.getAttribute('lineDistance')?.count ?? 0,\n });\n }\n\n /**\n * Update marker style for a specific region at runtime.\n */\n updateMarkerStyle(regionName: string, styleOverrides: Partial<MarkerStyleOverrides>): void {\n console.log(`[3DMarkers] updateMarkerStyle: region=${regionName}`, styleOverrides);\n const style = this.resolvedStyles.get(regionName);\n if (!style) {\n console.warn(`[3DMarkers] No resolved style for region: ${regionName}. Available regions:`, Array.from(this.resolvedStyles.keys()));\n return;\n }\n\n // Update resolved style\n if (styleOverrides.markerColor !== undefined) style.markerColor = styleOverrides.markerColor;\n if (styleOverrides.markerRadius !== undefined) style.markerRadius = styleOverrides.markerRadius;\n if (styleOverrides.lineColor !== undefined) style.lineColor = styleOverrides.lineColor;\n if (styleOverrides.opacity !== undefined) style.opacity = styleOverrides.opacity;\n if (styleOverrides.line) {\n style.line = { ...style.line, ...styleOverrides.line };\n }\n\n // Update sphere - use color.set() with new Color for reliable updates\n const sphere = this.markerMeshes.get(regionName);\n console.log(`[3DMarkers] Found sphere for ${regionName}:`, !!sphere, 'meshes keys:', Array.from(this.markerMeshes.keys()));\n if (sphere) {\n const mat = sphere.material as THREE.MeshBasicMaterial;\n console.log(`[3DMarkers] Setting sphere color to:`, style.markerColor?.toString(16));\n mat.color.set(new THREE.Color(style.markerColor));\n mat.opacity = 0.95 * style.opacity;\n mat.needsUpdate = true;\n }\n\n // Update line - use color.set() with new Color for reliable updates\n const line = this.lineMeshes.get(regionName);\n console.log(`[3DMarkers] Found line for ${regionName}:`, !!line);\n if (line) {\n const mat = line.material as THREE.LineBasicMaterial;\n mat.color.set(new THREE.Color(style.lineColor));\n mat.opacity = 0.9 * style.opacity;\n mat.needsUpdate = true;\n }\n\n // Update arrow - use color.set() with new Color for reliable updates\n const arrow = this.arrowMeshes.get(regionName);\n if (arrow) {\n const mat = arrow.material as THREE.MeshBasicMaterial;\n mat.color.set(new THREE.Color(style.lineColor));\n mat.opacity = style.opacity;\n mat.needsUpdate = true;\n }\n\n // If line config changed, rebuild the line\n if (styleOverrides.line) {\n this.updateLineStyle(regionName, styleOverrides.line);\n }\n }\n\n dispose(): void {\n this.domElement.removeEventListener('click', this.onClick);\n this.clear();\n this.scene.remove(this.markerGroup);\n }\n}\n","import { boneResolutionProfile } from './boneResolutionProfile';\nimport type {\n Region,\n CharacterConfig,\n ExpandAnimation,\n ExpandedRegionState,\n AnnotationAnchoredRegion,\n} from './types';\nimport {\n detectAnnotationLaterality,\n fuzzyNameMatch,\n getDefaultAnnotationLaterality,\n getModelLocalOrbitAngle,\n getSemanticHorizontalSignForSide,\n passesMarkerCameraAngleGate,\n resolveBoneNames,\n resolveFaceCenter,\n resolveRegionVisibilityCameraAngle,\n type AnnotationLaterality,\n} from './adapter';\nimport * as THREE from 'three';\nimport { AnimationFrameTaskScheduler } from './animationFrameTaskScheduler';\nimport {\n resolveMarkerAnchorRegion,\n shouldUseFaceCenterForMarkerAnchor,\n} from './annotationAnchorModel';\nimport {\n getRuntimeAUMorphAnchorPoint,\n getRuntimeAnnotationSide,\n getRuntimeAUMeshSideOffset,\n} from './runtimeAnnotationSidePreview';\n\nconst HTML_VISIBILITY_ANIMATION_KEY = 'html-marker-layer';\n\ninterface FaceCenterCacheEntry {\n center: THREE.Vector3;\n headBone: THREE.Object3D | null;\n headBoneLocalOffset: THREE.Vector3 | null;\n}\n\nfunction getAnnotationRegionLabel(region: Region): string | undefined {\n const label = (region as AnnotationAnchoredRegion).label;\n if (typeof label !== 'string') return undefined;\n const trimmed = label.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction formatFallbackRegionLabel(name: string): string {\n return name.split('_').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n}\n\n/**\n * HTML overlay markers with GPU-based occlusion via 3D proxy points.\n *\n * Architecture:\n * 1. Each HTML marker has a corresponding invisible 3D mesh in the scene\n * 2. The 3D mesh uses onBeforeRender callback to notify visibility\n * 3. When the mesh renders (passes depth test), it updates the HTML marker position\n * 4. When occluded, the callback doesn't fire, so we track \"was rendered this frame\"\n *\n * Performance: No per-frame visibility calculations - GPU depth testing determines\n * visibility, and we only update HTML when the 3D proxy actually renders.\n */\nexport class DPthreeHTMLMarkers {\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private domElement: HTMLElement;\n private model: THREE.Object3D | null = null;\n private regions: Region[] = [];\n private currentRegion: string | null = null;\n private onSelect: (name: string) => void;\n private characterConfig: CharacterConfig | null = null;\n\n // HTML layer\n private labelsContainer: HTMLDivElement;\n private markers: Map<string, HTMLDivElement> = new Map();\n\n // 3D occlusion proxies\n private occlusionGroup: THREE.Group;\n private occlusionMeshes: Map<string, THREE.Mesh> = new Map();\n\n // Track which markers were rendered this frame\n private renderedThisFrame: Set<string> = new Set();\n private frameId = 0;\n private markerFrameIds: Map<string, number> = new Map();\n private visibilityAnimationActive = false;\n private readonly visibilityAnimationScheduler = new AnimationFrameTaskScheduler();\n private visibilityAnimationToken = 0;\n\n // Model bounds\n private modelCenter = new THREE.Vector3();\n private modelSize = new THREE.Vector3();\n private autoCollapseThreshold = 2.0; // Calculated from model size\n private lastCameraDistance = -1; // Cache to detect zoom-out\n\n // Cached viewport size for marker positioning\n private viewportSize: { width: number; height: number } | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n // Expanding anchors state\n private expandedRegions: Map<string, boolean> = new Map();\n private parentChildIndex: Map<string, string[]> = new Map(); // parent -> children\n private childParentIndex: Map<string, string> = new Map(); // child -> parent\n private hiddenChildren: Set<string> = new Set(); // Children that should be hidden\n\n // Cache face center results per marker to avoid expensive recomputation every frame.\n private faceCenterCache: Map<string, FaceCenterCacheEntry> = new Map();\n private laterality: AnnotationLaterality = getDefaultAnnotationLaterality();\n\n constructor(config: {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n domElement: HTMLElement;\n onSelect: (name: string) => void;\n }) {\n this.scene = config.scene;\n this.camera = config.camera;\n this.domElement = config.domElement;\n this.onSelect = config.onSelect;\n\n // Create group for occlusion proxies\n this.occlusionGroup = new THREE.Group();\n this.occlusionGroup.name = 'DPthreeHTMLMarkers_Occlusion';\n this.scene.add(this.occlusionGroup);\n\n // Create container for HTML markers\n this.labelsContainer = document.createElement('div');\n this.labelsContainer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: hidden;\n transform-origin: center center;\n will-change: opacity, transform;\n opacity: 1;\n transform: scale(1);\n `;\n\n const parent = this.domElement.parentElement;\n if (parent) {\n const style = window.getComputedStyle(parent);\n if (style.position === 'static') {\n parent.style.position = 'relative';\n }\n parent.appendChild(this.labelsContainer);\n }\n\n this.updateViewportSize();\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => {\n this.updateViewportSize();\n });\n this.resizeObserver.observe(this.domElement);\n }\n }\n\n /** Keep labels/selection while rebinding viewport observation to a new canvas. */\n setDomElement(element: HTMLElement): void {\n if (element === this.domElement) return;\n this.resizeObserver?.disconnect();\n this.domElement = element;\n const parent = element.parentElement;\n if (parent && this.labelsContainer.parentElement !== parent) parent.appendChild(this.labelsContainer);\n this.resizeObserver?.observe(element);\n this.updateViewportSize();\n }\n\n setModel(model: THREE.Object3D): void {\n this.model = model;\n this.faceCenterCache.clear(); // Clear cache when model changes\n model.updateMatrixWorld(true);\n const box = new THREE.Box3().setFromObject(model);\n box.getCenter(this.modelCenter);\n box.getSize(this.modelSize);\n\n // Auto-collapse threshold: 2.5x model height - collapse when zoomed out this far\n this.autoCollapseThreshold = this.modelSize.y * 2.5;\n this.lastCameraDistance = -1; // Reset to force recalculation\n this.refreshLaterality();\n }\n\n loadRegions(config: CharacterConfig): void {\n this.clear();\n this.regions = config.regions ?? [];\n this.characterConfig = config;\n this.refreshLaterality();\n\n // Build parent/child index\n this.parentChildIndex.clear();\n this.childParentIndex.clear();\n this.hiddenChildren.clear();\n for (const region of (config.regions ?? [])) {\n if (region.children && region.children.length > 0) {\n this.parentChildIndex.set(region.name, region.children);\n for (const childName of region.children) {\n this.childParentIndex.set(childName, region.name);\n this.hiddenChildren.add(childName); // Children start hidden\n }\n }\n }\n\n (config.regions ?? []).forEach((region, index) => {\n this.createMarker(region, index + 1);\n });\n }\n\n setCurrentRegion(name: string | null): void {\n this.currentRegion = name;\n this.updateMarkerStyles();\n }\n\n /**\n * Update a region's configuration and recreate its marker.\n * This is the general method for updating any region properties.\n *\n * @param regionName - Name of the region to update\n * @param update - Partial region config to merge with existing config\n */\n updateRegion(regionName: string, update: Partial<Region>): void {\n console.log(`[HTMLMarkers] updateRegion: ${regionName}`, update);\n\n // Find the region\n const regionIndex = this.regions.findIndex(r => r.name === regionName);\n if (regionIndex === -1) {\n const newRegion: Region = { name: regionName, ...update };\n this.regions = [...this.regions, newRegion];\n if (this.characterConfig) {\n this.characterConfig = {\n ...this.characterConfig,\n regions: [...(this.characterConfig.regions ?? []), newRegion],\n };\n }\n this.refreshLaterality();\n this.faceCenterCache.delete(regionName);\n this.createMarker(newRegion, this.regions.length);\n console.log(`[HTMLMarkers] Region \"${regionName}\" marker created`);\n return;\n }\n\n // Merge update with existing region config\n this.regions[regionIndex] = {\n ...this.regions[regionIndex],\n ...update,\n };\n\n // Update characterConfig if it exists\n if (this.characterConfig?.regions) {\n const configRegionIndex = this.characterConfig.regions.findIndex(r => r.name === regionName);\n if (configRegionIndex !== -1) {\n this.characterConfig.regions[configRegionIndex] = {\n ...this.characterConfig.regions[configRegionIndex],\n ...update,\n };\n }\n }\n\n this.refreshLaterality();\n this.faceCenterCache.delete(regionName);\n\n // Remove and recreate the marker\n this.removeMarkerComponents(regionName);\n\n // Recreate marker with new position\n const region = this.regions[regionIndex];\n this.createMarker(region, regionIndex + 1);\n\n console.log(`[HTMLMarkers] Region \"${regionName}\" marker recreated with updated config`);\n }\n\n removeRegion(regionName: string): void {\n const regionIndex = this.regions.findIndex(r => r.name === regionName);\n if (regionIndex !== -1) {\n this.regions = this.regions.filter((region) => region.name !== regionName);\n }\n\n if (this.characterConfig?.regions) {\n this.characterConfig = {\n ...this.characterConfig,\n regions: this.characterConfig.regions.filter((region) => region.name !== regionName),\n };\n }\n\n this.parentChildIndex.delete(regionName);\n this.childParentIndex.delete(regionName);\n this.hiddenChildren.delete(regionName);\n this.removeMarkerComponents(regionName);\n }\n\n /**\n * Remove all marker components for a region\n */\n private removeMarkerComponents(regionName: string): void {\n const oldMarker = this.markers.get(regionName);\n if (oldMarker) {\n oldMarker.remove();\n this.markers.delete(regionName);\n }\n\n const oldOcclusionMesh = this.occlusionMeshes.get(regionName);\n if (oldOcclusionMesh) {\n oldOcclusionMesh.onBeforeRender = () => {}; // Clear callback\n this.occlusionGroup.remove(oldOcclusionMesh);\n if (oldOcclusionMesh.geometry) oldOcclusionMesh.geometry.dispose();\n if (oldOcclusionMesh.material) (oldOcclusionMesh.material as THREE.Material).dispose();\n this.occlusionMeshes.delete(regionName);\n }\n\n this.markerFrameIds.delete(regionName);\n this.faceCenterCache.delete(regionName);\n }\n\n updateRegionMeshes(regionName: string, meshNames: string[]): void {\n console.log(`[HTMLMarkers] updateRegionMeshes: ${regionName} -> ${meshNames.join(', ')}`);\n this.updateRegion(regionName, { meshes: meshNames });\n }\n\n /**\n * Reposition an existing marker to a new position.\n */\n repositionMarker(regionName: string, newPosition: THREE.Vector3): void {\n console.log(`[HTMLMarkers] repositionMarker: ${regionName} -> (${newPosition.x.toFixed(3)}, ${newPosition.y.toFixed(3)}, ${newPosition.z.toFixed(3)})`);\n\n const occlusionMesh = this.occlusionMeshes.get(regionName);\n if (occlusionMesh) {\n occlusionMesh.position.copy(newPosition);\n occlusionMesh.userData.position = newPosition.clone();\n }\n }\n\n /**\n * Get the current position of a marker.\n */\n getMarkerPosition(regionName: string): THREE.Vector3 | null {\n const occlusionMesh = this.occlusionMeshes.get(regionName);\n return occlusionMesh ? occlusionMesh.position.clone() : null;\n }\n\n private updateViewportSize(): void {\n const width = this.domElement.clientWidth || this.domElement.offsetWidth;\n const height = this.domElement.clientHeight || this.domElement.offsetHeight;\n\n if (width > 0 && height > 0) {\n this.viewportSize = { width, height };\n return;\n }\n\n const rect = this.domElement.getBoundingClientRect();\n this.viewportSize = { width: rect.width, height: rect.height };\n }\n\n private getViewportSize(): { width: number; height: number } {\n if (!this.viewportSize) {\n this.updateViewportSize();\n }\n\n return this.viewportSize ?? { width: 0, height: 0 };\n }\n\n private setMarkerDisplay(marker: HTMLDivElement, visible: boolean): void {\n const nextDisplay = visible ? 'flex' : 'none';\n if (marker.style.display !== nextDisplay) {\n marker.style.display = nextDisplay;\n }\n }\n\n private setMarkerScale(marker: HTMLDivElement, scale: number): void {\n marker.style.setProperty('--marker-scale', `${scale}`);\n }\n\n private setMarkerScreenPosition(marker: HTMLDivElement, x: number, y: number): void {\n marker.style.setProperty('--marker-x', `${x}px`);\n marker.style.setProperty('--marker-y', `${y}px`);\n }\n\n private createMarker(region: Region, number: number): void {\n if (!this.model) return;\n\n const position = this.getRegionCenter(region);\n if (!position) return;\n const visibilityCameraAngle = resolveRegionVisibilityCameraAngle(region, this.laterality);\n\n const name = region.name;\n const hasChildren = region.children && region.children.length > 0;\n\n // Create 3D occlusion proxy mesh\n // This mesh is tiny and invisible but participates in depth testing\n // When it renders, it notifies the HTML marker to show\n const occlusionMesh = new THREE.Mesh(\n new THREE.SphereGeometry(0.005, 4, 4),\n new THREE.MeshBasicMaterial({\n color: 0xff0000,\n transparent: true,\n opacity: 0, // Invisible\n depthTest: true,\n depthWrite: false,\n })\n );\n occlusionMesh.position.copy(position);\n occlusionMesh.name = `occlusion_${name}`;\n occlusionMesh.frustumCulled = true;\n\n // Store region data for visibility checks\n occlusionMesh.userData.regionName = name;\n occlusionMesh.userData.cameraAngle = visibilityCameraAngle;\n occlusionMesh.userData.position = position.clone();\n\n // This callback fires when the mesh is about to render (passed frustum + depth)\n occlusionMesh.onBeforeRender = () => {\n this.onProxyRendered(name, occlusionMesh);\n };\n\n this.occlusionGroup.add(occlusionMesh);\n this.occlusionMeshes.set(name, occlusionMesh);\n\n // Create HTML marker\n const marker = document.createElement('div');\n marker.className = 'annotation-html-marker';\n marker.dataset.annotation = name;\n marker.title = getAnnotationRegionLabel(region) ?? formatFallbackRegionLabel(name);\n marker.setAttribute('aria-label', marker.title);\n // Show + for parent markers, number for leaf markers\n marker.innerHTML = `<span>${hasChildren ? '+' : number}</span>`;\n marker.style.cssText = `\n position: absolute;\n --marker-x: 0px;\n --marker-y: 0px;\n --marker-scale: 1;\n transform: translate3d(var(--marker-x), var(--marker-y), 0) translate(-50%, -50%) scale(var(--marker-scale));\n pointer-events: auto;\n cursor: pointer;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: rgba(66, 153, 225, 0.9);\n border: 2px solid white;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n display: none;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 12px;\n font-weight: bold;\n color: white;\n transition: transform 0.15s ease, background 0.15s ease, opacity 0.15s ease, box-shadow 0.15s ease;\n z-index: 100;\n `;\n\n marker.addEventListener('mouseenter', () => {\n this.setMarkerScale(marker, 1.2);\n marker.style.background = 'rgba(99, 179, 237, 1)';\n });\n marker.addEventListener('mouseleave', () => {\n if (this.currentRegion !== name) {\n this.setMarkerScale(marker, 1);\n marker.style.background = 'rgba(66, 153, 225, 0.9)';\n }\n });\n marker.addEventListener('click', (e) => {\n e.stopPropagation();\n\n // If this is a parent region with children, toggle expand/collapse\n const children = this.parentChildIndex.get(name);\n if (children && children.length > 0) {\n const regionDef = this.regions.find(r => r.name === name);\n const animation = regionDef?.expandAnimation || 'staggered';\n this.toggleRegion(name, animation);\n }\n\n this.onSelect(name);\n });\n\n this.labelsContainer.appendChild(marker);\n this.markers.set(name, marker);\n }\n\n /**\n * Called when a 3D proxy mesh is about to render.\n * This means it passed frustum culling and depth test - it's visible!\n */\n private onProxyRendered(name: string, mesh: THREE.Mesh): void {\n const marker = this.markers.get(name);\n if (!marker) return;\n\n // Check if this is a hidden child (parent not expanded)\n if (this.hiddenChildren.has(name)) {\n this.setMarkerDisplay(marker, false);\n return;\n }\n\n // Check explicit cameraAngle visibility\n const cameraAngle = mesh.userData.cameraAngle;\n if (cameraAngle !== undefined && cameraAngle !== 0) {\n const currentAngle = getModelLocalOrbitAngle(this.model, this.modelCenter, this.camera.position);\n if (!passesMarkerCameraAngleGate({ markerAngle: cameraAngle, currentCameraAngle: currentAngle })) {\n this.setMarkerDisplay(marker, false);\n return;\n }\n }\n\n // Mark as rendered this frame\n this.markerFrameIds.set(name, this.frameId);\n\n const viewportSize = this.getViewportSize();\n\n // Project 3D position to screen\n const pos = mesh.userData.position as THREE.Vector3;\n const screenPos = pos.clone().project(this.camera);\n\n // Behind camera check\n if (screenPos.z > 1) {\n this.setMarkerDisplay(marker, false);\n return;\n }\n\n // Convert to CSS coordinates\n const x = (screenPos.x * 0.5 + 0.5) * viewportSize.width;\n const y = (-screenPos.y * 0.5 + 0.5) * viewportSize.height;\n\n this.setMarkerDisplay(marker, true);\n this.setMarkerScreenPosition(marker, x, y);\n }\n\n private getSuffixPattern(): string | undefined {\n return this.characterConfig?.suffixPattern;\n }\n\n /**\n * Get center point of a region's bones/meshes.\n * Uses fuzzy matching to handle bone names with numeric suffixes.\n * For face regions, uses resolveFaceCenter with auto-detection by morph count.\n */\n private getRegionCenter(region: Region): THREE.Vector3 | null {\n if (!this.model) return null;\n\n const resolvedAnchor = resolveMarkerAnchorRegion(region);\n const anchorRegion = resolvedAnchor.region;\n this.model.updateMatrixWorld(true);\n\n // PRIORITY 0: Custom position override\n if (anchorRegion.customPosition) {\n return new THREE.Vector3(\n anchorRegion.customPosition.x,\n anchorRegion.customPosition.y,\n anchorRegion.customPosition.z\n );\n }\n\n // PRIORITY 1: For face regions, use cached face center to avoid expensive recomputation\n const isFaceRegion = shouldUseFaceCenterForMarkerAnchor(resolvedAnchor);\n\n if (isFaceRegion) {\n const cacheKey = anchorRegion.name;\n let cachedFaceCenter = this.faceCenterCache.get(cacheKey);\n\n // Initialize cache on first call\n if (!cachedFaceCenter) {\n const faceCenterResult = resolveFaceCenter(this.model as any, anchorRegion as any, boneResolutionProfile(this.characterConfig) ?? undefined);\n\n // Find head bone for tracking animated position\n const headBones: THREE.Object3D[] = [];\n const headBoneNames = resolveBoneNames(anchorRegion.bones, boneResolutionProfile(this.characterConfig))\n .filter((name) => name.toLowerCase().includes('head'));\n this.model.traverse((obj) => {\n if (headBones.length === 0 && headBoneNames.some((name) => fuzzyNameMatch(obj.name, name, this.getSuffixPattern()))) {\n headBones.push(obj);\n }\n });\n\n const headBone = headBones[0] ?? null;\n const center = new THREE.Vector3(\n faceCenterResult.center.x,\n faceCenterResult.center.y,\n faceCenterResult.center.z\n );\n const headBoneLocalOffset = headBone\n ? headBone.worldToLocal(center.clone())\n : null;\n\n cachedFaceCenter = {\n center,\n headBone,\n headBoneLocalOffset,\n };\n this.faceCenterCache.set(cacheKey, cachedFaceCenter);\n }\n\n // If we have a head bone, use its current world position for animated models\n if (cachedFaceCenter.headBone && cachedFaceCenter.headBoneLocalOffset) {\n return cachedFaceCenter.headBone.localToWorld(\n cachedFaceCenter.headBoneLocalOffset.clone()\n );\n }\n\n // Otherwise return cached center\n return cachedFaceCenter.center.clone();\n }\n\n // Standard bone/mesh positioning for non-face regions\n const box = new THREE.Box3();\n let hasObjects = false;\n let usedRuntimeMorphAnchor = false;\n\n if (anchorRegion.objects?.includes('*')) {\n box.expandByObject(this.model);\n hasObjects = true;\n } else {\n if (anchorRegion.bones) {\n const resolvedBoneNames = resolveBoneNames(anchorRegion.bones, boneResolutionProfile(this.characterConfig));\n for (const boneName of resolvedBoneNames) {\n this.model.traverse((obj) => {\n if (fuzzyNameMatch(obj.name, boneName, this.getSuffixPattern())) {\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n box.expandByPoint(worldPos);\n hasObjects = true;\n }\n });\n }\n }\n\n if (anchorRegion.meshes) {\n for (const meshName of anchorRegion.meshes) {\n this.model.traverse((obj) => {\n if (fuzzyNameMatch(obj.name, meshName, this.getSuffixPattern()) && (obj as THREE.Mesh).isMesh) {\n const runtimeMorphAnchorPoint = getRuntimeAUMorphAnchorPoint(\n anchorRegion as AnnotationAnchoredRegion,\n obj as THREE.Mesh,\n );\n if (runtimeMorphAnchorPoint) {\n box.expandByPoint(runtimeMorphAnchorPoint);\n usedRuntimeMorphAnchor = true;\n } else {\n box.expandByObject(obj);\n }\n hasObjects = true;\n }\n });\n }\n }\n }\n\n if (!hasObjects || box.isEmpty()) return null;\n\n const center = new THREE.Vector3();\n box.getCenter(center);\n const runtimeSide = getRuntimeAnnotationSide(anchorRegion);\n const runtimeSideSign = runtimeSide === 'left'\n ? getSemanticHorizontalSignForSide('left', this.laterality)\n : runtimeSide === 'right'\n ? getSemanticHorizontalSignForSide('right', this.laterality)\n : 0;\n const runtimeSideOffset = runtimeSideSign && !usedRuntimeMorphAnchor\n ? getRuntimeAUMeshSideOffset(anchorRegion, runtimeSideSign, this.modelSize)\n : null;\n if (runtimeSideOffset) {\n const modelRotation = new THREE.Matrix4();\n modelRotation.extractRotation(this.model.matrixWorld);\n center.add(runtimeSideOffset.applyMatrix4(modelRotation));\n }\n return center;\n }\n\n private updateMarkerStyles(): void {\n for (const [name, element] of this.markers) {\n const isSelected = name === this.currentRegion;\n if (isSelected) {\n this.setMarkerScale(element, 1.3);\n element.style.background = 'rgba(99, 179, 237, 1)';\n element.style.boxShadow = '0 0 12px rgba(66, 153, 225, 0.8)';\n } else {\n this.setMarkerScale(element, 1);\n element.style.background = 'rgba(66, 153, 225, 0.9)';\n element.style.boxShadow = '0 2px 8px rgba(0, 0, 0, 0.3)';\n }\n }\n }\n\n /**\n * Call at start of each frame to reset state and update positions.\n * The onBeforeRender callbacks handle showing visible markers.\n * This method hides markers that didn't render.\n */\n update(): void {\n if (!this.model) return;\n\n // When HTML markers are hidden, skip all per-frame DOM and bone work.\n if (!this.occlusionGroup.visible) {\n return;\n }\n\n // Increment frame counter\n this.frameId++;\n if (!this.resizeObserver) {\n this.updateViewportSize();\n }\n\n // Check camera distance for auto-collapse\n const dx = this.camera.position.x - this.modelCenter.x;\n const dy = this.camera.position.y - this.modelCenter.y;\n const dz = this.camera.position.z - this.modelCenter.z;\n const cameraDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n\n // Only check threshold if distance changed significantly\n const distanceChanged = this.lastCameraDistance < 0 ||\n Math.abs(cameraDistance - this.lastCameraDistance) > this.lastCameraDistance * 0.05;\n\n if (distanceChanged) {\n const previousDistance = this.lastCameraDistance;\n this.lastCameraDistance = cameraDistance;\n\n // Auto-collapse only when crossing the threshold to avoid immediate re-collapse.\n const crossedAutoCollapseThreshold =\n previousDistance >= 0 &&\n previousDistance <= this.autoCollapseThreshold &&\n cameraDistance > this.autoCollapseThreshold;\n if (crossedAutoCollapseThreshold) {\n this.collapseAllRegions();\n }\n }\n\n // Update occlusion mesh positions (for animated models)\n for (const [name, mesh] of this.occlusionMeshes) {\n const region = this.regions.find(r => r.name === name);\n if (region) {\n const newPos = this.getRegionCenter(region);\n if (newPos) {\n mesh.position.copy(newPos);\n mesh.userData.position = newPos.clone();\n }\n }\n }\n\n // Hide markers that didn't render last frame (occluded)\n for (const [name, marker] of this.markers) {\n const lastFrame = this.markerFrameIds.get(name) || 0;\n // If marker wasn't rendered in the previous frame, hide it\n // Use frameId - 1 because onBeforeRender for current frame hasn't fired yet\n if (lastFrame < this.frameId - 1) {\n this.setMarkerDisplay(marker, false);\n }\n }\n }\n\n setVisible(visible: boolean): void {\n this.animateVisibility(visible);\n }\n\n private stopVisibilityAnimation(): void {\n this.visibilityAnimationScheduler.cancel(HTML_VISIBILITY_ANIMATION_KEY);\n this.visibilityAnimationActive = false;\n this.visibilityAnimationToken += 1;\n }\n\n private animateVisibility(visible: boolean): void {\n this.stopVisibilityAnimation();\n\n const wasVisible = this.labelsContainer.style.display !== 'none';\n if (visible) {\n this.labelsContainer.style.display = 'block';\n if (!wasVisible) {\n this.labelsContainer.style.opacity = '0';\n this.labelsContainer.style.transform = 'scale(0.92)';\n }\n this.occlusionGroup.visible = true;\n } else {\n this.occlusionGroup.visible = false;\n }\n\n const token = this.visibilityAnimationToken;\n const parsedStartOpacity = Number.parseFloat(window.getComputedStyle(this.labelsContainer).opacity || '1');\n const startOpacity = Number.isFinite(parsedStartOpacity) ? parsedStartOpacity : 1;\n const startScale = Number.parseFloat(\n this.labelsContainer.style.transform.match(/scale\\(([^)]+)\\)/)?.[1] ?? '1',\n ) || 1;\n const startTime = performance.now();\n const duration = 160;\n const targetOpacity = visible ? 1 : 0;\n const targetScale = visible ? 1 : 0.92;\n\n this.visibilityAnimationActive = true;\n this.visibilityAnimationScheduler.schedule(HTML_VISIBILITY_ANIMATION_KEY, (now): boolean => {\n if (token !== this.visibilityAnimationToken) return false;\n\n const elapsed = now - startTime;\n const t = Math.min(elapsed / duration, 1);\n const eased = visible\n ? 1 - Math.pow(1 - t, 3)\n : t * t * (3 - 2 * t);\n\n const opacity = startOpacity + (targetOpacity - startOpacity) * eased;\n const scale = startScale + (targetScale - startScale) * eased;\n this.labelsContainer.style.opacity = `${opacity}`;\n this.labelsContainer.style.transform = `scale(${scale})`;\n\n if (t < 1) {\n return true;\n }\n\n this.visibilityAnimationActive = false;\n if (!visible) {\n this.labelsContainer.style.display = 'none';\n }\n this.labelsContainer.style.opacity = visible ? '1' : '0';\n this.labelsContainer.style.transform = 'scale(1)';\n return false;\n });\n }\n\n clear(): void {\n this.stopVisibilityAnimation();\n this.labelsContainer.style.display = 'block';\n this.labelsContainer.style.opacity = '1';\n this.labelsContainer.style.transform = 'scale(1)';\n // Clear HTML markers\n for (const element of this.markers.values()) {\n element.remove();\n }\n this.markers.clear();\n\n // Clear occlusion meshes\n while (this.occlusionGroup.children.length > 0) {\n const child = this.occlusionGroup.children[0];\n const mesh = child as THREE.Mesh;\n mesh.onBeforeRender = () => {}; // Clear callback\n this.occlusionGroup.remove(child);\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) (mesh.material as THREE.Material).dispose();\n }\n this.occlusionMeshes.clear();\n this.markerFrameIds.clear();\n this.faceCenterCache.clear();\n this.expandedRegions.clear();\n this.parentChildIndex.clear();\n this.childParentIndex.clear();\n this.hiddenChildren.clear();\n }\n\n // ============ EXPANDING ANCHORS ============\n\n /**\n * Expand a parent region to show its children.\n */\n expandRegion(regionName: string, animation: ExpandAnimation = 'outward', duration = 400): void {\n const children = this.parentChildIndex.get(regionName);\n if (!children || children.length === 0) return;\n\n // Already expanded\n if (this.expandedRegions.get(regionName)) return;\n\n this.expandedRegions.set(regionName, true);\n\n // Update parent marker to show minus sign\n const parentMarker = this.markers.get(regionName);\n if (parentMarker) {\n parentMarker.innerHTML = '<span>−</span>'; // minus sign\n }\n\n // Show children with animation\n const staggerDelay = animation === 'staggered' ? 50 : 0;\n\n children.forEach((childName, index) => {\n setTimeout(() => {\n this.hiddenChildren.delete(childName);\n const marker = this.markers.get(childName);\n if (marker) {\n // Animate in with CSS\n marker.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`;\n this.setMarkerScale(marker, 0);\n marker.style.opacity = '0';\n this.setMarkerDisplay(marker, true);\n requestAnimationFrame(() => {\n this.setMarkerScale(marker, 1);\n marker.style.opacity = '1';\n });\n }\n }, index * staggerDelay);\n });\n }\n\n /**\n * Collapse a parent region to hide its children.\n */\n collapseRegion(regionName: string, duration = 300): void {\n const children = this.parentChildIndex.get(regionName);\n if (!children || children.length === 0) return;\n\n // Already collapsed\n if (!this.expandedRegions.get(regionName)) return;\n\n this.expandedRegions.set(regionName, false);\n\n // Update parent marker to show plus sign\n const parentMarker = this.markers.get(regionName);\n if (parentMarker) {\n parentMarker.innerHTML = '<span>+</span>';\n }\n\n // Hide children with animation\n for (const childName of children) {\n const marker = this.markers.get(childName);\n if (marker) {\n marker.style.transition = `transform ${duration}ms ease-in, opacity ${duration}ms ease-in`;\n this.setMarkerScale(marker, 0);\n marker.style.opacity = '0';\n }\n\n // Mark as hidden after animation\n setTimeout(() => {\n this.hiddenChildren.add(childName);\n if (marker) {\n this.setMarkerDisplay(marker, false);\n }\n }, duration);\n }\n }\n\n /**\n * Toggle expand/collapse state.\n */\n toggleRegion(regionName: string, animation: ExpandAnimation = 'outward', duration = 400): void {\n if (this.expandedRegions.get(regionName)) {\n this.collapseRegion(regionName, duration * 0.75);\n } else {\n this.expandRegion(regionName, animation, duration);\n }\n }\n\n /**\n * Get expanded state of all regions.\n */\n getExpandedRegions(): ExpandedRegionState[] {\n const states: ExpandedRegionState[] = [];\n for (const [regionName, isExpanded] of this.expandedRegions) {\n const children = this.parentChildIndex.get(regionName) || [];\n states.push({ regionName, isExpanded, children });\n }\n return states;\n }\n\n /**\n * Collapse all currently expanded regions.\n * Called automatically when zooming out past threshold.\n */\n private collapseAllRegions(duration = 150): void {\n // Get list of expanded regions (iterate copy to avoid mutation during iteration)\n const expandedList = [...this.expandedRegions.entries()]\n .filter(([_, isExpanded]) => isExpanded)\n .map(([name, _]) => name);\n\n if (expandedList.length === 0) return;\n\n // Collapse all expanded regions\n for (const regionName of expandedList) {\n this.collapseRegion(regionName, duration);\n }\n }\n\n dispose(): void {\n this.clear();\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.labelsContainer.remove();\n this.scene.remove(this.occlusionGroup);\n }\n\n private refreshLaterality(): void {\n this.laterality = detectAnnotationLaterality(this.model, this.regions, boneResolutionProfile(this.characterConfig));\n }\n}\n","import { boneResolutionProfile } from './boneResolutionProfile';\nimport { getAnnotationCameraCore, requireAnnotationCameraCore } from './annotationCameraCore';\nimport * as THREE from 'three';\nimport type { CharacterSceneRenderer } from '../scene';\nimport { bindSceneRendering, reportSceneRenderingFailure } from '../sceneRenderingBinding';\nimport { compileModelForRender, drawModelForRender } from './modelRenderPreparation';\nimport { prepareModelSkinning } from '../modelSkinning';\nimport { renderScenePlayback } from '../playbackRendering';\nimport {\n detectAnnotationLaterality,\n fuzzyNameMatch,\n getDefaultAnnotationLaterality,\n resolveBoneNames,\n resolveFaceCenter,\n resolveRegionCameraAngle,\n type AnnotationLaterality,\n} from './adapter';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport {\n CameraDOMControls,\n RUNTIME_ANNOTATION_REGION_PREFIX,\n filterCameraViewRegions,\n} from './DOMControls';\nimport { DPthree3DMarkers } from './DPthree3DMarkers';\nimport { DPthreeHTMLMarkers } from './DPthreeHTMLMarkers';\nimport { resolveAnnotationCharacterConfig } from './adapter';\nimport type {\n DPthreeCameraControllerConfig,\n CharacterConfig,\n Region,\n CameraState,\n FocusPosition,\n RegionChangeCallback,\n MarkerStyle,\n AnnotationAnchoredRegion,\n AnnotationFocusTarget,\n RuntimeAnnotationOptions,\n RuntimeAnnotationRegionSummary,\n RuntimeAnnotationSide,\n} from './types';\n\n/** Common interface for marker implementations */\ninterface DPthreeMarkers {\n setModel(model: THREE.Object3D): void;\n setDomElement(element: HTMLElement): void;\n loadRegions(config: CharacterConfig, options?: { sliceSurfaceQueries?: boolean }): void | Promise<void>;\n setCurrentRegion(name: string | null): void;\n update(): void;\n updateRegion?(regionName: string, update: Partial<AnnotationAnchoredRegion>): void;\n removeRegion?(regionName: string): void;\n setVisible(visible: boolean): void;\n clear(): void;\n dispose(): void;\n}\n\nexport function resolveFocusCameraDirection(\n model: THREE.Object3D | null,\n effectiveAngle: number,\n cameraAngle: number | undefined,\n angleSpace: 'model' | 'world' = 'model'\n): THREE.Vector3 {\n const direction = requireAnnotationCameraCore().resolveFocusCameraDirection(\n model?.getWorldQuaternion(new THREE.Quaternion()),\n effectiveAngle,\n cameraAngle,\n angleSpace,\n );\n return new THREE.Vector3(direction.x, direction.y, direction.z);\n}\n\nexport function resolveAutoCloseupAngle(\n horizontalOffset: number,\n focusSize: THREE.Vector3,\n modelSize: THREE.Vector3\n): number | undefined {\n return requireAnnotationCameraCore().resolveAutoCloseupAngle(horizontalOffset, focusSize, modelSize);\n}\n\ntype CameraPose = {\n position: { x: number; y: number; z: number };\n target: { x: number; y: number; z: number };\n};\n\ntype RustCameraAnimation = {\n sample(elapsedMs: number): CameraPose & { done: boolean };\n dispose(): void;\n};\n\ntype ModelRenderPreparation = {\n promise: Promise<void>;\n draw: (() => void) | null;\n cancel: (reason: Error) => void;\n};\n\nfunction renderPreparationAborted(): Error {\n const error = new Error('Model render preparation was cancelled.');\n error.name = 'AbortError';\n return error;\n}\n\nfunction toFocusPosition(framing: CameraPose & { distance: number }): FocusPosition {\n return {\n position: new THREE.Vector3(framing.position.x, framing.position.y, framing.position.z),\n target: new THREE.Vector3(framing.target.x, framing.target.y, framing.target.z),\n distance: framing.distance,\n };\n}\n\nexport type MarkerStateSnapshot = {\n style: MarkerStyle;\n visible: boolean;\n};\n\n/**\n * Default configuration values\n */\nconst DEFAULTS = {\n enableDamping: true,\n dampingFactor: 0.05,\n minDistance: 0.5,\n maxDistance: 10,\n transitionDuration: 1400, // Slower, more graceful camera transitions\n zoomPaddingFactor: 1.5,\n closeUpPaddingFactor: 1.2,\n fullBodyPaddingFactor: 2.0,\n showDOMControls: true,\n};\n\nconst INTRO_LEFT_EYE_PADDING_CAP = 0.85;\nconst INTRO_LEFT_EYE_PADDING_SCALE = 0.72;\nconst INTRO_LEFT_EYE_VERTICAL_BIAS_RATIO = 0.025;\nconst INTRO_LEFT_EYE_MIN_VERTICAL_BIAS = 0.025;\ntype RuntimeAnnotationProfileSource = {\n auToBones?: unknown;\n auToMorphs?: unknown;\n profile?: unknown;\n};\n\ntype RuntimeAnnotationBoneTarget = {\n boneName: string;\n side?: RuntimeAnnotationSide;\n};\n\ntype RuntimeAnnotationMorphTarget = {\n morphName: string;\n side?: RuntimeAnnotationSide;\n};\n\ntype RuntimeAnnotationMorphSelection = {\n morphNames: string[];\n side?: RuntimeAnnotationSide;\n};\n\ntype RuntimeAnnotationMeshTarget = {\n meshName: string;\n morphNames: string[];\n side?: RuntimeAnnotationSide;\n};\n\ntype RuntimeAnnotationResolvedTargets = {\n bones: string[];\n meshTargets: RuntimeAnnotationMeshTarget[];\n};\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeRuntimeAnnotationText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : String(value ?? '').trim();\n}\n\nfunction readRuntimeAnnotationSide(value: unknown): RuntimeAnnotationSide | undefined {\n return value === 'left' || value === 'right' || value === 'center' ? value : undefined;\n}\n\nfunction inferRuntimeAnnotationSideFromText(value: string): RuntimeAnnotationSide | undefined {\n const normalized = value\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase();\n const tokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const hasLeft = tokens.includes('left') || tokens.includes('l');\n const hasRight = tokens.includes('right') || tokens.includes('r');\n\n if (hasLeft === hasRight) return undefined;\n return hasLeft ? 'left' : 'right';\n}\n\nfunction encodeRuntimeAnnotationSegment(value: string): string {\n return encodeURIComponent(value).replace(/%/g, '~');\n}\n\nfunction getRuntimeAnnotationRegionLabel(region: AnnotationAnchoredRegion): string {\n return region.label ?? region.name;\n}\n\nfunction buildRuntimeAnnotationRegionSignature(region: AnnotationAnchoredRegion): string {\n return JSON.stringify({\n label: region.label,\n bones: region.bones,\n meshes: region.meshes,\n paddingFactor: region.paddingFactor,\n cameraAngle: region.cameraAngle,\n markerAnchor: region.markerAnchor,\n focusTarget: region.focusTarget,\n style: region.style,\n runtimeAnnotation: region.runtimeAnnotation,\n });\n}\n\nfunction buildRuntimeAnnotationStyle(\n options: RuntimeAnnotationOptions,\n): AnnotationAnchoredRegion['style'] | undefined {\n const style: NonNullable<AnnotationAnchoredRegion['style']> = {};\n\n if (options.markerColor !== undefined) style.markerColor = options.markerColor;\n if (options.lineColor !== undefined) style.lineColor = options.lineColor;\n if (options.markerRadius !== undefined) style.markerRadius = options.markerRadius;\n if (options.labelColor !== undefined) style.labelColor = options.labelColor;\n if (options.labelBackground !== undefined) style.labelBackground = options.labelBackground;\n if (options.labelFontSize !== undefined) style.labelFontSize = options.labelFontSize;\n if (options.opacity !== undefined) style.opacity = options.opacity;\n\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\nfunction getRuntimeAnnotationProfileCandidates(\n characterConfig: CharacterConfig | null,\n profileOverride?: unknown,\n): RuntimeAnnotationProfileSource[] {\n const candidates: RuntimeAnnotationProfileSource[] = [];\n\n if (isPlainRecord(profileOverride)) {\n candidates.push(profileOverride);\n if (isPlainRecord(profileOverride.profile)) {\n candidates.push(profileOverride.profile);\n }\n }\n\n if (characterConfig) {\n candidates.push(characterConfig);\n if (isPlainRecord(characterConfig.profile)) {\n candidates.push(characterConfig.profile);\n }\n }\n\n return candidates;\n}\n\nfunction readRuntimeAnnotationBoneTarget(value: unknown): RuntimeAnnotationBoneTarget | null {\n if (typeof value === 'string') {\n const cleaned = value.trim();\n return cleaned.length > 0\n ? { boneName: cleaned, side: inferRuntimeAnnotationSideFromText(cleaned) }\n : null;\n }\n\n if (!isPlainRecord(value)) {\n return null;\n }\n\n const candidate = value.node ?? value.boneName ?? value.bone ?? value.name;\n if (typeof candidate !== 'string') {\n return null;\n }\n\n const cleaned = candidate.trim();\n return cleaned.length > 0\n ? {\n boneName: cleaned,\n side: readRuntimeAnnotationSide(value.side) ?? inferRuntimeAnnotationSideFromText(cleaned),\n }\n : null;\n}\n\nfunction readRuntimeAnnotationStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n\n return value.flatMap((entry) => {\n if (typeof entry !== 'string') return [];\n const cleaned = entry.trim();\n return cleaned.length > 0 ? [cleaned] : [];\n });\n}\n\nfunction selectRuntimeAnnotationBoneTargets(\n targets: RuntimeAnnotationBoneTarget[],\n targetSide?: RuntimeAnnotationSide,\n): RuntimeAnnotationBoneTarget[] {\n if (!targetSide) return targets;\n\n const preferredTargets = targets.filter((target) => target.side === targetSide);\n if (preferredTargets.length > 0) return preferredTargets;\n\n return targets.filter((target) => !target.side || target.side === 'center');\n}\n\nfunction resolveRuntimeAnnotationAUBoneTargets(\n auId: string,\n candidates: RuntimeAnnotationProfileSource[],\n targetSide?: RuntimeAnnotationSide,\n): RuntimeAnnotationBoneTarget[] {\n const seen = new Set<string>();\n const boneTargets: RuntimeAnnotationBoneTarget[] = [];\n\n for (const candidate of candidates) {\n if (!isPlainRecord(candidate.auToBones)) continue;\n const bindings = candidate.auToBones[auId];\n if (!Array.isArray(bindings)) continue;\n\n for (const binding of bindings) {\n const target = readRuntimeAnnotationBoneTarget(binding);\n if (!target || seen.has(target.boneName)) continue;\n seen.add(target.boneName);\n boneTargets.push(target);\n }\n }\n\n return selectRuntimeAnnotationBoneTargets(boneTargets, targetSide);\n}\n\nfunction readRuntimeAnnotationMorphTargets(\n value: unknown,\n side?: RuntimeAnnotationSide,\n): RuntimeAnnotationMorphTarget[] {\n return readRuntimeAnnotationStringArray(value).map((morphName) => ({\n morphName,\n side: side ?? inferRuntimeAnnotationSideFromText(morphName),\n }));\n}\n\nfunction resolveRuntimeAnnotationAUMorphSelection(\n auId: string,\n candidates: RuntimeAnnotationProfileSource[],\n targetSide?: RuntimeAnnotationSide,\n): RuntimeAnnotationMorphSelection {\n const seen = new Set<string>();\n const morphTargets: RuntimeAnnotationMorphTarget[] = [];\n\n for (const candidate of candidates) {\n if (!isPlainRecord(candidate.auToMorphs)) continue;\n const mapping = candidate.auToMorphs[auId];\n const entries = isPlainRecord(mapping)\n ? [\n ...readRuntimeAnnotationMorphTargets(mapping.left, 'left'),\n ...readRuntimeAnnotationMorphTargets(mapping.right, 'right'),\n ...readRuntimeAnnotationMorphTargets(mapping.center, 'center'),\n ]\n : readRuntimeAnnotationMorphTargets(mapping);\n\n for (const target of entries) {\n if (seen.has(target.morphName)) continue;\n seen.add(target.morphName);\n morphTargets.push(target);\n }\n }\n\n const selectedTargets = targetSide\n ? (() => {\n const preferredTargets = morphTargets.filter((target) => target.side === targetSide);\n if (preferredTargets.length > 0) return preferredTargets;\n return morphTargets.filter((target) => !target.side || target.side === 'center');\n })()\n : morphTargets;\n\n const hasPreferredSide = targetSide && selectedTargets.some((target) => target.side === targetSide);\n const hasOnlyCenterSide = selectedTargets.length > 0 && selectedTargets.every((target) => target.side === 'center');\n\n return {\n morphNames: selectedTargets.map((target) => target.morphName),\n side: hasPreferredSide\n ? targetSide\n : hasOnlyCenterSide\n ? 'center'\n : targetSide && selectedTargets.length > 0\n ? targetSide\n : undefined,\n };\n}\n\nfunction resolveRuntimeAnnotationMorphMeshes(\n morphNames: string[],\n morphTargetsByMesh?: unknown,\n side?: RuntimeAnnotationSide,\n): RuntimeAnnotationMeshTarget[] {\n if (!isPlainRecord(morphTargetsByMesh) || morphNames.length === 0) {\n return [];\n }\n\n const requestedByLowerName = new Map<string, string>();\n for (const morphName of morphNames) {\n requestedByLowerName.set(morphName.toLowerCase(), morphName);\n }\n\n const meshTargets: RuntimeAnnotationMeshTarget[] = [];\n for (const [meshName, targets] of Object.entries(morphTargetsByMesh)) {\n const matched = new Set<string>();\n for (const targetName of readRuntimeAnnotationStringArray(targets)) {\n const requestedName = requestedByLowerName.get(targetName.toLowerCase());\n if (requestedName) {\n matched.add(requestedName);\n }\n }\n if (matched.size > 0) {\n meshTargets.push({ meshName, morphNames: Array.from(matched), side });\n }\n }\n\n return meshTargets.sort(compareRuntimeAnnotationMeshTargets);\n}\n\nfunction getRuntimeAnnotationMeshTargetScore(target: RuntimeAnnotationMeshTarget): number {\n const meshName = target.meshName.toLowerCase();\n const morphText = target.morphNames.join(' ').toLowerCase();\n let score = 0;\n\n if (/brow|forehead|frontalis/.test(morphText)) {\n if (/brow|eyebrow|bushy/.test(meshName)) score -= 100;\n if (/body|skin|head/.test(meshName)) score += 20;\n if (/eyeocclusion|tearline/.test(meshName)) score += 40;\n } else if (/mouth|lip|smile|frown|dimple|pucker|stretch|press|funnel|roll|shrug|close|jaw|chin/.test(morphText)) {\n if (/body|skin|head/.test(meshName)) score -= 100;\n if (/brow|eyebrow|bushy|hair|eyeocclusion|tearline/.test(meshName)) score += 80;\n } else if (/eye|lid|blink|squint|wide/.test(morphText)) {\n if (/eyeocclusion|tearline|eye/.test(meshName)) score -= 80;\n if (/body|skin|head/.test(meshName)) score += 10;\n if (/brow|eyebrow|bushy|hair/.test(meshName)) score += 60;\n } else if (/tongue/.test(morphText)) {\n if (/tongue/.test(meshName)) score -= 100;\n }\n\n return score;\n}\n\nfunction compareRuntimeAnnotationMeshTargets(\n left: RuntimeAnnotationMeshTarget,\n right: RuntimeAnnotationMeshTarget,\n): number {\n const scoreDelta = getRuntimeAnnotationMeshTargetScore(left) - getRuntimeAnnotationMeshTargetScore(right);\n if (scoreDelta !== 0) return scoreDelta;\n\n return left.meshName.localeCompare(right.meshName);\n}\n\nfunction resolveRuntimeAnnotationTargetLimit(\n options: RuntimeAnnotationOptions,\n): number | null {\n const maxTargets = options.maxTargets;\n if (typeof maxTargets !== 'number' || !Number.isFinite(maxTargets) || maxTargets < 1) {\n return null;\n }\n\n return Math.floor(maxTargets);\n}\n\nfunction limitRuntimeAnnotationTargets(\n bones: string[],\n meshTargets: RuntimeAnnotationMeshTarget[],\n options: RuntimeAnnotationOptions,\n): RuntimeAnnotationResolvedTargets {\n const maxTargets = resolveRuntimeAnnotationTargetLimit(options);\n if (maxTargets === null || bones.length + meshTargets.length <= maxTargets) {\n return { bones, meshTargets };\n }\n\n const limitedBones: string[] = [];\n const limitedMeshTargets: RuntimeAnnotationMeshTarget[] = [];\n\n const takeBones = () => {\n for (const boneName of bones) {\n if (limitedBones.length + limitedMeshTargets.length >= maxTargets) return;\n limitedBones.push(boneName);\n }\n };\n const takeMeshTargets = () => {\n for (const meshTarget of meshTargets) {\n if (limitedBones.length + limitedMeshTargets.length >= maxTargets) return;\n limitedMeshTargets.push(meshTarget);\n }\n };\n\n if (options.targetPreference === 'mesh') {\n takeMeshTargets();\n takeBones();\n } else {\n takeBones();\n takeMeshTargets();\n }\n\n return {\n bones: limitedBones,\n meshTargets: limitedMeshTargets,\n };\n}\n\n/**\n * DPthreeCameraController - A unified camera controller for character viewers\n *\n * Features:\n * - OrbitControls wrapper for smooth camera interaction\n * - Focus on specific bones, meshes, or named regions\n * - Smart bounding box calculation with size-based padding\n * - Smooth animated transitions between views\n * - Self-contained DOM controls for region selection\n *\n * Designed for future NPM packaging - no React dependencies.\n */\nexport class DPthreeCameraController {\n // Public readonly properties\n readonly camera: THREE.PerspectiveCamera;\n readonly controls: OrbitControls;\n readonly scene: THREE.Scene;\n\n private readonly resolveCharacterConfig: NonNullable<DPthreeCameraControllerConfig['resolveCharacterConfig']>;\n private readonly selectRegion: (name: string) => void;\n\n // Configuration\n private config: Required<\n Pick<\n DPthreeCameraControllerConfig,\n | 'enableDamping'\n | 'dampingFactor'\n | 'minDistance'\n | 'maxDistance'\n | 'transitionDuration'\n | 'zoomPaddingFactor'\n | 'closeUpPaddingFactor'\n | 'fullBodyPaddingFactor'\n | 'showDOMControls'\n >\n >;\n private controlsContainer: HTMLElement;\n\n // State\n private model: THREE.Object3D | null = null;\n private regions: AnnotationAnchoredRegion[] = [];\n private currentRegion: string | null = null;\n private characterConfig: CharacterConfig | null = null;\n private runtimeAnnotationRegionNames = new Set<string>();\n\n // Animation state - driven by update() in render loop\n private timerAnimationFallbackToken = 0;\n private cameraRequestGeneration = 0;\n private regionLoadGeneration = 0;\n private disposed = false;\n private pendingAnimation: {\n startTime: number;\n runtime: RustCameraAnimation;\n resolve: () => void;\n } | null = null;\n\n // DOM Controls\n private domControls: CameraDOMControls | null = null;\n\n // Markers (can be 3D or HTML style)\n private markers: DPthreeMarkers | null = null;\n private currentMarkerStyle: MarkerStyle = '3d';\n private markersLoaded = false;\n private markersVisible = false;\n private markerStateListeners = new Set<(state: MarkerStateSnapshot) => void>();\n private domElement: HTMLElement;\n\n // Renderer and render loop (when controller manages the render loop)\n private renderer: CharacterSceneRenderer | null = null;\n private readonly playbackTimer = new THREE.Timer();\n private renderFrame: DPthreeCameraControllerConfig['renderFrame'] = undefined;\n private resizeRenderer: DPthreeCameraControllerConfig['resizeRenderer'] = undefined;\n private onRenderError: DPthreeCameraControllerConfig['onRenderError'] = undefined;\n private renderingSuspended = false;\n private unbindRendering: (() => Promise<void> | null) | null = null;\n private renderingFailure: ((error: unknown) => void) | null = null;\n private framePending = false;\n private frameCompletion: Promise<void> | null = null;\n private modelPreparation: ModelRenderPreparation | null = null;\n private renderFailed = false;\n private resizeObserver: ResizeObserver | null = null;\n private boundResizeHandler: (() => void) | null = null;\n private laterality: AnnotationLaterality = getDefaultAnnotationLaterality();\n\n // Callbacks\n private onRegionChangeCallbacks: RegionChangeCallback[] = [];\n\n constructor(inputConfig: DPthreeCameraControllerConfig) {\n this.resolveCharacterConfig = inputConfig.resolveCharacterConfig ?? resolveAnnotationCharacterConfig;\n this.selectRegion = inputConfig.onRegionSelect ?? ((name) => { void this.focusRegion(name); });\n this.camera = inputConfig.camera;\n this.scene = inputConfig.scene;\n this.domElement = inputConfig.domElement;\n this.controlsContainer = inputConfig.controlsContainer || (inputConfig.rendering && inputConfig.domElement.tagName === 'CANVAS'\n ? inputConfig.domElement.parentElement || inputConfig.domElement : inputConfig.domElement);\n\n // Merge config with defaults\n this.config = {\n enableDamping: inputConfig.enableDamping ?? DEFAULTS.enableDamping,\n dampingFactor: inputConfig.dampingFactor ?? DEFAULTS.dampingFactor,\n minDistance: inputConfig.minDistance ?? DEFAULTS.minDistance,\n maxDistance: inputConfig.maxDistance ?? DEFAULTS.maxDistance,\n transitionDuration: inputConfig.transitionDuration ?? DEFAULTS.transitionDuration,\n zoomPaddingFactor: inputConfig.zoomPaddingFactor ?? DEFAULTS.zoomPaddingFactor,\n closeUpPaddingFactor: inputConfig.closeUpPaddingFactor ?? DEFAULTS.closeUpPaddingFactor,\n fullBodyPaddingFactor: inputConfig.fullBodyPaddingFactor ?? DEFAULTS.fullBodyPaddingFactor,\n showDOMControls: inputConfig.showDOMControls ?? DEFAULTS.showDOMControls,\n };\n\n // Set initial camera position before creating OrbitControls\n // This ensures camera isn't at origin (inside model)\n this.camera.position.set(0, 1, 3);\n\n // Create OrbitControls\n this.controls = new OrbitControls(this.camera, inputConfig.domElement);\n this.controls.enableDamping = this.config.enableDamping;\n this.controls.dampingFactor = this.config.dampingFactor;\n this.controls.minDistance = this.config.minDistance;\n this.controls.maxDistance = this.config.maxDistance;\n\n // Set initial target to roughly character center height\n this.controls.target.set(0, 1, 0);\n this.controls.update();\n\n // Initialize DOM controls if enabled\n if (this.config.showDOMControls) {\n this.initDOMControls();\n }\n\n this.renderFrame = inputConfig.renderFrame;\n this.resizeRenderer = inputConfig.resizeRenderer;\n this.onRenderError = inputConfig.onRenderError;\n if (inputConfig.rendering) {\n const rendering = inputConfig.rendering;\n this.renderingFailure = (error) => reportSceneRenderingFailure(rendering, error, this.renderer);\n this.unbindRendering = bindSceneRendering(inputConfig.rendering, this.scene, this.camera, {\n suspend: async () => {\n this.renderingSuspended = true;\n const preparation = this.modelPreparation;\n this.cancelModelPreparation();\n // A lost device can reject loop shutdown. Still drain every borrower\n // before allowing the scene owner to release its model resources.\n let stopping: Promise<void>;\n try { stopping = Promise.resolve(this.renderer?.setAnimationLoop(null)); }\n catch (failure) { stopping = Promise.reject(failure); }\n const [stopped] = await Promise.allSettled([\n stopping,\n this.frameCompletion,\n preparation?.promise,\n ]);\n if (stopped.status === 'rejected') throw stopped.reason;\n },\n prepare: async (renderer) => {\n if (this.disposed) throw renderPreparationAborted();\n const model = this.model;\n if (model) {\n await compileModelForRender(renderer, this.scene, this.camera, model);\n if (this.disposed || model !== this.model) throw renderPreparationAborted();\n drawModelForRender(renderer, this.scene, this.camera, model);\n } else renderer.render(this.scene, this.camera);\n },\n commit: async (renderer) => {\n if (this.disposed) throw renderPreparationAborted();\n this.cleanupResizeHandling();\n this.controls.disconnect();\n this.controls.connect(renderer.domElement);\n this.domElement = renderer.domElement;\n this.markers?.setDomElement(renderer.domElement);\n this.renderer = renderer;\n this.renderFailed = false;\n this.renderingSuspended = false;\n this.setupResizeHandling();\n this.boundResizeHandler?.();\n await this.startRenderLoop(true);\n if (this.disposed) { this.stopRenderLoop(); throw renderPreparationAborted(); }\n },\n onError: (error) => this.handleRenderError(error),\n });\n } else if (inputConfig.renderer) {\n this.renderer = inputConfig.renderer;\n void this.startRenderLoop();\n this.setupResizeHandling();\n }\n\n // Markers will be initialized when loadRegions is called\n // based on the character's markerStyle preference\n }\n\n /**\n * Start the render loop (only when renderer is provided)\n */\n private startRenderLoop(propagateFailure = false): void | Promise<void> {\n if (!this.renderer) return;\n const renderer = this.renderer;\n this.playbackTimer.disconnect();\n const ownerDocument = renderer.domElement?.ownerDocument;\n if (ownerDocument) this.playbackTimer.connect(ownerDocument);\n this.playbackTimer.reset();\n let playbackStarted = false;\n try {\n const started = renderer.setAnimationLoop((timestamp?: number) => {\n if (this.disposed || renderer !== this.renderer) return;\n this.playbackTimer.update(timestamp);\n const samplePlayback = playbackStarted;\n playbackStarted = true;\n if (this.renderFailed || this.renderingSuspended || this.framePending) return;\n try {\n // Native shadows are updated once per camera/frame. Prepare the full\n // scene first and leave its pixels untouched until the next frame.\n const preparationDraw = this.modelPreparation?.draw;\n if (preparationDraw) { preparationDraw(); return; }\n if (samplePlayback) renderScenePlayback(this.scene, this.playbackTimer);\n this.update();\n const frame = this.renderFrame\n ? this.renderFrame(this.renderer!, this.scene, this.camera)\n : this.renderer!.render(this.scene, this.camera);\n if (frame) {\n this.framePending = true;\n this.frameCompletion = Promise.resolve(frame).then(\n () => { this.framePending = false; },\n (error) => { this.framePending = false; this.handleRenderError(error); },\n );\n }\n } catch (error) { this.handleRenderError(error); }\n });\n if (started) return started.catch((error) => {\n if (propagateFailure) throw error;\n if (renderer === this.renderer) this.handleRenderError(error);\n });\n } catch (error) {\n if (propagateFailure) throw error;\n this.handleRenderError(error);\n }\n }\n\n private handleRenderError(error: unknown): void {\n if (this.disposed || this.renderFailed) return;\n this.renderFailed = true;\n this.cancelModelPreparation(error instanceof Error ? error : new Error(String(error)));\n this.stopRenderLoop();\n const failure = error instanceof Error ? error : new Error(String(error));\n if (this.renderingFailure) { this.renderingFailure(failure); return; }\n try {\n if (this.onRenderError) this.onRenderError(failure);\n else console.error('Character camera render loop failed.', failure);\n } catch (callbackError) {\n console.error('Character camera render-error callback failed.', callbackError);\n }\n }\n\n /**\n * Stop the render loop\n */\n private stopRenderLoop(): void {\n this.playbackTimer.reset();\n try {\n const stopped = this.renderer?.setAnimationLoop(null);\n if (stopped) void stopped.catch((error) => console.error('Character camera render loop stop failed.', error));\n } catch (error) { console.error('Character camera render loop stop failed.', error); }\n }\n\n private shouldDriveTimerAnimationFallback(): boolean {\n return !this.renderer;\n }\n\n private getTimerAnimationFallbackDelay(): number {\n return 16;\n }\n\n private scheduleTimerAnimationFallback(hasPendingAnimation: () => boolean): void {\n if (!this.shouldDriveTimerAnimationFallback()) return;\n\n const token = ++this.timerAnimationFallbackToken;\n const tick = () => {\n if (token !== this.timerAnimationFallbackToken || !hasPendingAnimation()) return;\n\n this.update();\n\n if (token === this.timerAnimationFallbackToken && hasPendingAnimation()) {\n setTimeout(tick, this.getTimerAnimationFallbackDelay());\n }\n };\n\n setTimeout(tick, this.getTimerAnimationFallbackDelay());\n }\n\n /**\n * Set up resize handling for the renderer\n * Uses ResizeObserver for container size changes\n */\n private setupResizeHandling(): void {\n if (!this.renderer) return;\n\n const container = this.domElement.parentElement || this.domElement;\n\n // Create resize handler\n this.boundResizeHandler = () => {\n const width = container.clientWidth || window.innerWidth;\n const height = container.clientHeight || window.innerHeight;\n\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n\n if (this.renderer) {\n if (this.resizeRenderer) {\n this.resizeRenderer(this.renderer, width, height);\n } else {\n this.renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n this.renderer.setSize(width, height, false);\n }\n }\n };\n\n // Use ResizeObserver for container size changes\n this.resizeObserver = new ResizeObserver(this.boundResizeHandler);\n this.resizeObserver.observe(container);\n\n // Also listen to window resize as fallback\n window.addEventListener('resize', this.boundResizeHandler);\n }\n\n /**\n * Clean up resize handling\n */\n private cleanupResizeHandling(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n if (this.boundResizeHandler) {\n window.removeEventListener('resize', this.boundResizeHandler);\n this.boundResizeHandler = null;\n }\n }\n\n // ====== CORE PUBLIC METHODS ======\n\n /**\n * Prepare the currently visible material variants before first reveal.\n * Borrows model/renderer; callers retain them until this promise settles,\n * including after cancellation or controller disposal.\n */\n prepareModelForRender(model: THREE.Object3D, options: { signal?: AbortSignal } = {}): Promise<void> {\n if (this.disposed || options.signal?.aborted) return Promise.reject(renderPreparationAborted());\n if (this.renderingSuspended) return Promise.reject(new Error('Model render preparation is unavailable during renderer replacement.'));\n if (!this.renderer || this.renderFailed) return Promise.reject(new Error('Model render preparation requires an active controller-owned renderer.'));\n const renderer = this.renderer;\n const previous = this.modelPreparation;\n previous?.cancel(renderPreparationAborted());\n let cancelled: Error | null = null;\n let invalidatePreparedShadows: (() => void) | null = null;\n let rejectDraw: ((error: Error) => void) | null = null;\n let resolve!: () => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<void>((yes, no) => { resolve = yes; reject = no; });\n const request: ModelRenderPreparation = {\n promise, draw: null,\n cancel: (reason) => {\n cancelled ??= reason;\n invalidatePreparedShadows?.();\n request.draw = null;\n rejectDraw?.(cancelled);\n },\n };\n this.modelPreparation = request;\n const abort = () => request.cancel(renderPreparationAborted());\n options.signal?.addEventListener('abort', abort, { once: true });\n const checkCancelled = () => { if (cancelled) throw cancelled; };\n void (async () => {\n try {\n // Supersession never compiles over a predecessor's borrowed objects.\n if (previous) await previous.promise.catch(() => undefined);\n // A host callback may have started while the predecessor was settling.\n // Read its current completion here, immediately before acquiring state.\n if (this.framePending && this.frameCompletion) await this.frameCompletion;\n checkCancelled();\n const compilation = compileModelForRender(renderer, this.scene, this.camera, model);\n try { await compilation; }\n catch (error) { throw cancelled ?? error; }\n checkCancelled();\n await new Promise<void>((done, failed) => {\n rejectDraw = failed;\n request.draw = () => {\n request.draw = null;\n try {\n checkCancelled();\n invalidatePreparedShadows = drawModelForRender(renderer, this.scene, this.camera, model);\n checkCancelled();\n done();\n } catch (error) { invalidatePreparedShadows?.(); failed(cancelled ?? error); }\n };\n });\n checkCancelled();\n } finally {\n options.signal?.removeEventListener('abort', abort);\n if (this.modelPreparation === request) this.modelPreparation = null;\n }\n })().then(resolve, reject);\n return promise;\n }\n\n private cancelModelPreparation(reason = renderPreparationAborted()): void {\n this.modelPreparation?.cancel(reason);\n }\n\n /**\n * Set the model to use for bone/mesh lookups\n * Must be called after model loads\n */\n setModel(model: THREE.Object3D): void {\n if (this.disposed) return;\n prepareModelSkinning(model);\n this.cancelModelPreparation();\n this.regionLoadGeneration += 1;\n this.cameraRequestGeneration += 1;\n this.cancelCameraAnimation();\n this.model = model;\n this.markers?.setModel(model);\n\n // Force update world matrices\n this.scene.updateMatrixWorld(true);\n if (this.characterConfig && this.regions.length > 0) {\n this.refreshLaterality();\n }\n }\n\n /** Release model references before the host disposes it, under a rendering lease. */\n clearModel(): void {\n if (this.disposed) return;\n this.clearMarkers();\n this.model = null;\n this.markers?.dispose();\n this.markers = null;\n }\n\n /**\n * Load region config for a character\n */\n async loadRegions(config: CharacterConfig): Promise<void> {\n if (this.disposed) return;\n const request = ++this.regionLoadGeneration;\n const model = this.model;\n const runtimeConfig = await this.resolveCharacterConfig(config);\n if (!this.isRegionLoadCurrent(request, model)) return;\n await this.prepareRegionsAndMarkersForReveal(runtimeConfig);\n }\n\n /**\n * Prime an already-resolved runtime config before the character becomes visible.\n * Marker construction is intentionally separate so startup can defer the expensive\n * per-region marker geometry/DOM work until after the first visible frame.\n */\n prepareRegionsForReveal(config: CharacterConfig): void {\n if (this.disposed) return;\n this.prepareRegionState(config);\n this.startPreparedCameraTransition(config);\n }\n\n /**\n * Prepare marker geometry while the character loading overlay is still up,\n * then start the intro camera transition after that work has completed.\n */\n async prepareRegionsAndMarkersForReveal(\n config: CharacterConfig,\n beforeReveal?: () => Promise<boolean>,\n ): Promise<void> {\n if (this.disposed) return;\n this.prepareRegionState(config);\n const request = this.regionLoadGeneration;\n const model = this.model;\n // The character has not started animating yet, so surface queries can span\n // frames without sampling different poses within the same marker.\n await this.loadMarkersForCurrentRegions(true);\n\n if (!this.isRegionLoadCurrent(request, model) || this.characterConfig !== config) return;\n if (beforeReveal && !await beforeReveal()) return;\n if (this.isRegionLoadCurrent(request, model) && this.characterConfig === config) {\n this.startPreparedCameraTransition(config);\n }\n }\n\n private prepareRegionState(config: CharacterConfig): void {\n this.cancelModelPreparation();\n this.regionLoadGeneration += 1;\n this.cameraRequestGeneration += 1;\n this.cancelCameraAnimation();\n this.characterConfig = config;\n this.regions = config.regions ?? [];\n this.currentRegion = null;\n this.runtimeAnnotationRegionNames.clear();\n this.markersLoaded = false;\n this.refreshLaterality();\n this.updateDOMControls();\n this.setMarkerStyleState(config.markerStyle ?? '3d');\n }\n\n private startPreparedCameraTransition(config: CharacterConfig): void {\n // Play intro animation or focus default region\n if (config.playIntroOnLoad) {\n // Play intro animation (orbit + zoom to torso)\n this.playIntroAnimation();\n } else if (config.defaultRegion) {\n // Focus default region if specified (immediate, no animation)\n this.focusRegion(config.defaultRegion, 0);\n }\n }\n\n /**\n * Build marker objects for the current character config.\n * This is separated from prepareRegionsForReveal so callers can defer the\n * expensive marker construction until after the first visible frame.\n */\n async loadMarkersForCurrentRegions(sliceSurfaceQueries = false): Promise<void> {\n if (this.disposed || !this.characterConfig) {\n return;\n }\n\n const characterConfig = this.characterConfig;\n const request = this.regionLoadGeneration;\n const model = this.model;\n this.ensureMarkersForCurrentStyle();\n const markers = this.markers;\n if (!markers) return;\n markers.setVisible(this.markersVisible);\n await markers.loadRegions(characterConfig, { sliceSurfaceQueries });\n if (!this.isRegionLoadCurrent(request, model) || markers !== this.markers || characterConfig !== this.characterConfig) {\n return;\n }\n\n if (this.currentRegion) {\n markers.setCurrentRegion(this.currentRegion);\n }\n markers.setVisible(this.markersVisible);\n this.markersLoaded = true;\n }\n\n /**\n * Focus on a named region from the loaded config\n */\n async focusRegion(name: string, duration?: number): Promise<void> {\n const region = this.regions.find((a) => a.name === name);\n if (!region) {\n return;\n }\n\n if (await this.beginCameraRequest() === null) return;\n\n this.currentRegion = name;\n this.notifyRegionChange(name);\n\n const focusPos = this.resolveRegionFocusPosition(region);\n if (!focusPos) {\n return;\n }\n\n // Apply camera offset if specified\n if (region.cameraOffset) {\n if (region.cameraOffset.x) focusPos.position.x += region.cameraOffset.x;\n if (region.cameraOffset.y) focusPos.position.y += region.cameraOffset.y;\n if (region.cameraOffset.z) focusPos.position.z += region.cameraOffset.z;\n }\n\n await this.animateCamera(focusPos.position, focusPos.target, duration ?? this.config.transitionDuration);\n }\n\n private resolveRegionFocusPosition(region: Region): FocusPosition | null {\n const focusTarget = (region as AnnotationAnchoredRegion).focusTarget;\n if (!focusTarget || focusTarget.type === 'region') {\n return this.resolveLegacyRegionFocusPosition(\n region,\n focusTarget?.paddingFactor,\n focusTarget?.cameraAngle,\n );\n }\n\n const paddingFactor = focusTarget.paddingFactor ?? region.paddingFactor;\n const cameraAngle = focusTarget.cameraAngle ?? resolveRegionCameraAngle(region, this.laterality);\n\n if (focusTarget.type === 'point') {\n if (!focusTarget.position) return null;\n return this.calculatePointFocusPosition(\n new THREE.Vector3(\n focusTarget.position.x,\n focusTarget.position.y,\n focusTarget.position.z,\n ),\n paddingFactor,\n cameraAngle,\n );\n }\n\n if (focusTarget.type === 'face-center') {\n if (!this.model) return null;\n const faceRegion: Region = {\n ...region,\n bones: focusTarget.bones ?? region.bones,\n meshes: focusTarget.meshes ?? region.meshes,\n objects: focusTarget.objects ?? region.objects,\n };\n const faceCenter = resolveFaceCenter(this.model as any, faceRegion as any, boneResolutionProfile(this.characterConfig) ?? undefined);\n return this.calculatePointFocusPosition(\n new THREE.Vector3(\n faceCenter.center.x,\n faceCenter.center.y,\n faceCenter.center.z,\n ),\n paddingFactor,\n cameraAngle,\n );\n }\n\n const objects = this.resolveFocusTargetObjects(region, focusTarget);\n if (objects.length === 0) {\n return null;\n }\n\n return this.calculateFocusPosition(objects, paddingFactor, cameraAngle);\n }\n\n private resolveLegacyRegionFocusPosition(\n region: Region,\n overridePadding?: number,\n overrideCameraAngle?: number,\n ): FocusPosition | null {\n if (this.isFullBodyRegion(region)) {\n if (!this.model) {\n return null;\n }\n return this.calculateFullBodyFocusPosition(\n overridePadding ?? region.paddingFactor,\n overrideCameraAngle,\n );\n }\n\n const objects = this.resolveRegionObjects(region);\n if (objects.length === 0) {\n return null;\n }\n\n return this.calculateFocusPosition(\n objects,\n overridePadding ?? region.paddingFactor,\n overrideCameraAngle ?? resolveRegionCameraAngle(region, this.laterality),\n );\n }\n\n private resolveFocusTargetObjects(\n region: Region,\n focusTarget: AnnotationFocusTarget,\n ): THREE.Object3D[] {\n if (focusTarget.type === 'bone') {\n const boneNames = focusTarget.bones ?? region.bones ?? [];\n return this.findObjectsByNames(resolveBoneNames(boneNames, boneResolutionProfile(this.characterConfig)), 'Bone');\n }\n\n if (focusTarget.type === 'mesh') {\n return this.findObjectsByNames(focusTarget.meshes ?? region.meshes ?? [], 'Mesh');\n }\n\n if (focusTarget.type === 'object') {\n return this.resolveRegionObjects({\n ...region,\n bones: undefined,\n meshes: undefined,\n objects: focusTarget.objects ?? region.objects,\n });\n }\n\n return [];\n }\n\n /**\n * Focus on specific bones by name\n */\n async focusBones(boneNames: string[], duration?: number): Promise<void> {\n const objects = this.findObjectsByNames(boneNames, 'Bone');\n if (objects.length === 0) {\n return;\n }\n\n if (await this.beginCameraRequest() === null) return;\n\n const focusPos = this.calculateFocusPosition(objects);\n await this.animateCamera(focusPos.position, focusPos.target, duration ?? this.config.transitionDuration);\n }\n\n /**\n * Focus on specific meshes by name\n */\n async focusMeshes(meshNames: string[], duration?: number): Promise<void> {\n const objects = this.findObjectsByNames(meshNames, 'Mesh');\n if (objects.length === 0) {\n return;\n }\n\n if (await this.beginCameraRequest() === null) return;\n\n const focusPos = this.calculateFocusPosition(objects);\n await this.animateCamera(focusPos.position, focusPos.target, duration ?? this.config.transitionDuration);\n }\n\n /**\n * Focus on the full body (entire model bounding box)\n */\n async focusFullBody(duration?: number): Promise<void> {\n if (!this.model) {\n return;\n }\n\n if (await this.beginCameraRequest() === null) return;\n\n const focusPos = this.calculateFullBodyFocusPosition();\n await this.animateCamera(focusPos.position, focusPos.target, duration ?? this.config.transitionDuration);\n }\n\n /**\n * Focus on arbitrary objects\n */\n async focusObjects(objects: THREE.Object3D[], duration?: number): Promise<void> {\n if (objects.length === 0) {\n return;\n }\n\n if (await this.beginCameraRequest() === null) return;\n\n const focusPos = this.calculateFocusPosition(objects);\n await this.animateCamera(focusPos.position, focusPos.target, duration ?? this.config.transitionDuration);\n }\n\n /**\n * Play intro animation: orbit around the character, then settle into a tight\n * left-eye hero closeup when the character provides a left-eye region.\n * @param orbitDuration - Duration of the 360° orbit in ms (default: 3000)\n * @param zoomDuration - Duration of the final zoom in ms (default: 1500)\n */\n async playIntroAnimation(orbitDuration = 3000, zoomDuration = 1500): Promise<void> {\n const request = await this.beginCameraRequest();\n if (request === null) return;\n\n if (!this.model) {\n return;\n }\n\n // Force update world matrices to ensure all geometry positions are current\n this.scene.updateMatrixWorld(true);\n\n // Get full model bounds - includes all meshes and their current deformed positions\n const box = new THREE.Box3().setFromObject(this.model);\n const center = new THREE.Vector3();\n const size = new THREE.Vector3();\n box.getCenter(center);\n box.getSize(size);\n\n // Calculate orbit parameters based on full model extent\n // Use the maximum horizontal extent (X or Z) to ensure we clear all geometry including fins\n const horizontalExtent = Math.max(size.x, size.z);\n const verticalExtent = size.y;\n\n // Orbit distance: far enough to see the full model from any angle\n // Include extra padding to account for fins and other protrusions\n const orbitRadius = Math.max(horizontalExtent, verticalExtent) * 1.8;\n\n // Orbit height: centered on the model with a slight upward bias\n const orbitHeight = center.y;\n\n // The Rust orbit owns both the initial pose and all subsequent samples.\n await this.animateOrbit(center, orbitRadius, orbitHeight, orbitDuration);\n if (!this.isCameraRequestCurrent(request)) return;\n\n const leftEyeRegion = this.findIntroLeftEyeRegion();\n const leftEyeFocus = leftEyeRegion\n ? this.calculateIntroLeftEyeFocusPosition(leftEyeRegion)\n : null;\n if (leftEyeFocus && leftEyeRegion) {\n await this.animateCamera(leftEyeFocus.position, leftEyeFocus.target, zoomDuration);\n if (!this.isCameraRequestCurrent(request)) return;\n this.currentRegion = leftEyeRegion.name;\n this.notifyRegionChange(leftEyeRegion.name);\n return;\n }\n\n const finalAngle = -30; // degrees, matching the legacy 11 o'clock intro landing\n const fullBodyRegion = this.regions.find((region) => this.isFullBodyRegion(region));\n const focusPos = this.calculateFullBodyFocusPosition(fullBodyRegion?.paddingFactor, finalAngle, 'world');\n\n await this.animateCamera(focusPos.position, focusPos.target, zoomDuration);\n if (!this.isCameraRequestCurrent(request)) return;\n\n if (fullBodyRegion) {\n this.currentRegion = fullBodyRegion.name;\n this.notifyRegionChange(fullBodyRegion.name);\n }\n }\n\n /**\n * Animate a smooth 360° orbit around a center point\n * Animation is driven by the update() method which is called from the render loop.\n */\n private animateOrbit(\n center: THREE.Vector3,\n radius: number,\n height: number,\n duration: number\n ): Promise<void> {\n return this.runCameraAnimation(\n requireAnnotationCameraCore().createCameraOrbit(center, radius, height, duration),\n );\n }\n\n // ====== CONFIG/STATE METHODS ======\n\n /**\n * Get list of available region names\n */\n getRegionNames(): string[] {\n return this.regions.map((a) => a.name);\n }\n\n /**\n * Get current region name\n */\n getCurrentRegion(): string | null {\n return this.currentRegion;\n }\n\n /**\n * Get loaded character config\n */\n getCharacterConfig(): CharacterConfig | null {\n return this.characterConfig;\n }\n\n /**\n * Get current camera state\n */\n getCameraState(): CameraState {\n return {\n position: [this.camera.position.x, this.camera.position.y, this.camera.position.z],\n target: [this.controls.target.x, this.controls.target.y, this.controls.target.z],\n };\n }\n\n /**\n * Set camera state directly (no animation)\n */\n setCameraState(state: CameraState): void {\n this.cameraRequestGeneration += 1;\n this.cancelCameraAnimation();\n this.camera.position.set(...state.position);\n this.controls.target.set(...state.target);\n this.controls.update();\n }\n\n /**\n * Animate to camera state\n */\n async animateToCameraState(state: CameraState, duration?: number): Promise<void> {\n if (await this.beginCameraRequest() === null) return;\n\n const targetPosition = new THREE.Vector3(...state.position);\n const targetLookAt = new THREE.Vector3(...state.target);\n await this.animateCamera(targetPosition, targetLookAt, duration ?? this.config.transitionDuration);\n }\n\n // ====== MARKERS ======\n\n /**\n * Show/hide region markers\n */\n setMarkersVisible(visible: boolean): void {\n if (this.disposed) return;\n // Keep startup light by only constructing markers once something actually\n // requests that they be shown.\n if (visible && !this.markersLoaded && this.characterConfig) {\n void this.loadMarkersForCurrentRegions();\n }\n\n if (this.markersVisible === visible) return;\n this.markersVisible = visible;\n this.markers?.setVisible(visible);\n this.domControls?.setMarkersVisible(visible);\n this.emitMarkerState();\n }\n\n /**\n * Get current markers visibility state\n */\n getMarkersVisible(): boolean {\n return this.markersVisible;\n }\n\n /**\n * Clear all markers and reset region state\n */\n clearMarkers(): void {\n if (this.disposed) return;\n this.cancelModelPreparation();\n this.regionLoadGeneration += 1;\n this.cameraRequestGeneration += 1;\n this.cancelCameraAnimation();\n this.markers?.clear();\n this.markersLoaded = false;\n this.regions = [];\n this.currentRegion = null;\n this.characterConfig = null;\n this.runtimeAnnotationRegionNames.clear();\n if (this.currentMarkerStyle !== '3d') {\n this.currentMarkerStyle = '3d';\n this.emitMarkerState();\n }\n this.updateDOMControls();\n }\n\n /**\n * Get current marker style\n */\n getMarkerStyle(): MarkerStyle {\n return this.currentMarkerStyle;\n }\n\n /**\n * Set marker style (html or 3d) - recreates markers with new style\n */\n setMarkerStyle(style: MarkerStyle): void {\n if (this.disposed) return;\n console.log(`[CameraController] setMarkerStyle: ${this.currentMarkerStyle} -> ${style}`);\n if (style === this.currentMarkerStyle) return;\n\n this.setMarkerStyleState(style);\n\n // If startup intentionally deferred marker construction, just remember the\n // new style and let the deferred load build the correct marker flavor.\n if (!this.markersLoaded) {\n this.markers?.dispose();\n this.markers = null;\n return;\n }\n\n void this.loadMarkersForCurrentRegions();\n }\n\n private setMarkerStyleState(style: MarkerStyle): void {\n if (style === this.currentMarkerStyle) {\n return;\n }\n\n this.currentMarkerStyle = style;\n this.emitMarkerState();\n }\n\n private ensureMarkersForCurrentStyle(): void {\n if (this.markers) {\n this.markers.dispose();\n this.markers = null;\n }\n\n if (this.currentMarkerStyle === 'html') {\n this.markers = new DPthreeHTMLMarkers({\n scene: this.scene,\n camera: this.camera,\n domElement: this.domElement,\n onSelect: this.selectRegion,\n });\n } else {\n this.markers = new DPthree3DMarkers({\n scene: this.scene,\n camera: this.camera,\n domElement: this.domElement,\n onSelect: this.selectRegion,\n });\n }\n\n console.log(`[CameraController] Created ${this.currentMarkerStyle} markers, has model: ${!!this.model}, has config: ${!!this.characterConfig}`);\n\n if (this.model) {\n this.markers.setModel(this.model);\n }\n }\n\n subscribeMarkerState(listener: (state: MarkerStateSnapshot) => void): () => void {\n this.markerStateListeners.add(listener);\n listener(this.getMarkerState());\n return () => {\n this.markerStateListeners.delete(listener);\n };\n }\n\n private getMarkerState(): MarkerStateSnapshot {\n return {\n style: this.currentMarkerStyle,\n visible: this.markersVisible,\n };\n }\n\n private emitMarkerState(): void {\n const snapshot = this.getMarkerState();\n for (const listener of this.markerStateListeners) {\n listener(snapshot);\n }\n }\n\n // ====== MARKER STYLING ======\n\n /**\n * Solo a marker - show only this marker, hide all others\n * @param regionName - Region to solo (null to unsolo all)\n */\n soloMarker(regionName: string | null): void {\n if (this.markers && 'setSoloMarker' in this.markers) {\n (this.markers as DPthree3DMarkers).setSoloMarker(regionName);\n }\n }\n\n /**\n * Get currently soloed marker name (or null)\n */\n getSoloedMarker(): string | null {\n if (this.markers && 'getSoloedMarker' in this.markers) {\n return (this.markers as DPthree3DMarkers).getSoloedMarker();\n }\n return null;\n }\n\n /**\n * Expand a region to show its children\n * @param regionName - Name of the parent region to expand\n * @param duration - Animation duration in ms (default: 400)\n */\n expandRegion(regionName: string, duration?: number): void {\n if (this.markers && 'expandRegion' in this.markers) {\n (this.markers as DPthree3DMarkers).expandRegion(regionName, 'outward', duration);\n }\n }\n\n /**\n * Collapse a region to hide its children\n * @param regionName - Name of the parent region to collapse\n * @param duration - Animation duration in ms (default: 300)\n */\n collapseRegion(regionName: string, duration?: number): void {\n if (this.markers && 'collapseRegion' in this.markers) {\n (this.markers as DPthree3DMarkers).collapseRegion(regionName, duration);\n }\n }\n\n /**\n * Toggle expand/collapse state of a region\n * @param regionName - Name of the parent region to toggle\n * @param animation - Animation style: 'outward' or 'staggered'\n * @param duration - Animation duration in ms\n */\n toggleRegion(regionName: string, animation: 'outward' | 'staggered' = 'outward', duration?: number): void {\n if (this.markers && 'toggleRegion' in this.markers) {\n (this.markers as DPthree3DMarkers).toggleRegion(regionName, animation, duration);\n }\n }\n\n /**\n * Get current expanded state of all regions\n */\n getExpandedRegions(): { regionName: string; isExpanded: boolean; children: string[] }[] {\n if (this.markers && 'getExpandedRegions' in this.markers) {\n return (this.markers as DPthree3DMarkers).getExpandedRegions();\n }\n return [];\n }\n\n /**\n * Update line style for a specific region at runtime\n */\n setRegionLineStyle(regionName: string, lineConfig: { style?: 'solid' | 'dashed' | 'dotted'; curve?: 'straight' | 'bezier' | 'arc'; arrowHead?: boolean; thickness?: number; length?: number }): void {\n console.log(`[CameraController] setRegionLineStyle: region=${regionName}, markerStyle=${this.currentMarkerStyle}`, lineConfig);\n if (this.markers && 'updateLineStyle' in this.markers) {\n (this.markers as DPthree3DMarkers).updateLineStyle(regionName, lineConfig);\n } else {\n console.warn(`[CameraController] updateLineStyle not available (markers: ${!!this.markers}, method: ${'updateLineStyle' in (this.markers || {})})`);\n }\n }\n\n /**\n * Update marker style for a specific region at runtime\n */\n setRegionStyle(regionName: string, style: { markerColor?: number; markerRadius?: number; lineColor?: number; labelColor?: string; labelBackground?: string; labelFontSize?: number; opacity?: number }): void {\n console.log(`[CameraController] setRegionStyle: region=${regionName}, markerStyle=${this.currentMarkerStyle}`, style);\n if (this.markers && 'updateMarkerStyle' in this.markers) {\n (this.markers as DPthree3DMarkers).updateMarkerStyle(regionName, style);\n } else {\n console.warn(`[CameraController] updateMarkerStyle not available (markers: ${!!this.markers}, method: ${'updateMarkerStyle' in (this.markers || {})})`);\n }\n }\n\n /**\n * Update the face mesh configuration for a region and recalculate its position.\n * This is called when the user selects a different face mesh in the wizard.\n *\n * @param regionName - Name of the region to update (e.g., 'face')\n * @param meshNames - Array of mesh names to use for positioning\n */\n updateRegionMeshes(regionName: string, meshNames: string[]): void {\n console.log(`[CameraController] updateRegionMeshes: region=${regionName}, meshes=${meshNames.join(', ')}`);\n if (this.markers && 'updateRegionMeshes' in this.markers) {\n (this.markers as DPthree3DMarkers).updateRegionMeshes(regionName, meshNames);\n } else {\n console.warn(`[CameraController] updateRegionMeshes not available (markers: ${!!this.markers}, method: ${'updateRegionMeshes' in (this.markers || {})})`);\n }\n }\n\n /**\n * Reposition an existing marker to a new position.\n *\n * @param regionName - Name of the region to reposition\n * @param position - New world position { x, y, z }\n */\n repositionMarker(regionName: string, position: { x: number; y: number; z: number }): void {\n console.log(`[CameraController] repositionMarker: ${regionName} -> (${position.x.toFixed(3)}, ${position.y.toFixed(3)}, ${position.z.toFixed(3)})`);\n if (this.markers && 'repositionMarker' in this.markers) {\n const vec = new THREE.Vector3(position.x, position.y, position.z);\n (this.markers as DPthree3DMarkers).repositionMarker(regionName, vec);\n } else {\n console.warn(`[CameraController] repositionMarker not available`);\n }\n }\n\n /**\n * Get the current position of a marker\n */\n getMarkerPosition(regionName: string): { x: number; y: number; z: number } | null {\n if (this.markers && 'getMarkerPosition' in this.markers) {\n const pos = (this.markers as DPthree3DMarkers).getMarkerPosition(regionName);\n return pos ? { x: pos.x, y: pos.y, z: pos.z } : null;\n }\n return null;\n }\n\n /**\n * Get the current model reference\n */\n getModel(): THREE.Object3D | null {\n return this.model;\n }\n\n /**\n * Remove an annotation region from the active runtime config and marker set.\n *\n * Persistence still happens through the canonical profile annotation overrides\n * saved by the authoring UI; this only keeps the live scene in sync.\n */\n removeAnnotationRegion(regionName: string): void {\n if (this.disposed) return;\n this.runtimeAnnotationRegionNames.delete(regionName);\n const nextRegions = this.regions.filter((region) => region.name !== regionName);\n if (nextRegions.length === this.regions.length) {\n return;\n }\n\n this.regionLoadGeneration += 1;\n this.regions = nextRegions;\n if (this.characterConfig) {\n this.characterConfig = {\n ...this.characterConfig,\n regions: (this.characterConfig.regions ?? []).filter((region) => region.name !== regionName),\n };\n }\n if (this.currentRegion === regionName) {\n this.currentRegion = null;\n }\n this.refreshLaterality();\n this.updateDOMControls();\n // A pending surface query must also see removals before it creates a marker.\n if (this.markers?.removeRegion) {\n this.markers.removeRegion(regionName);\n } else if (this.markersLoaded) {\n void this.loadMarkersForCurrentRegions();\n }\n }\n\n /**\n * Update an annotation region's configuration without reloading the character.\n * This updates the region's bones, meshes, or other properties and recalculates\n * the marker position automatically.\n *\n * @param regionName - Name of the region to update (e.g., 'face', 'left_eye')\n * @param update - Partial region config to merge with existing config\n */\n updateAnnotationRegion(regionName: string, update: Partial<AnnotationAnchoredRegion>): void {\n if (this.disposed) return;\n this.regionLoadGeneration += 1;\n console.log(`[CameraController] updateAnnotationRegion: ${regionName}`, update);\n\n // Find and update the region in our local state\n const regionIndex = this.regions.findIndex(r => r.name === regionName);\n if (regionIndex === -1) {\n const newRegion: AnnotationAnchoredRegion = { name: regionName, ...update };\n this.regions = [...this.regions, newRegion];\n if (this.characterConfig) {\n this.characterConfig = {\n ...this.characterConfig,\n regions: [...(this.characterConfig.regions ?? []), newRegion],\n };\n }\n this.refreshLaterality();\n this.updateDOMControls();\n if (this.markersLoaded) {\n if (this.markers?.updateRegion) {\n this.markers.updateRegion(regionName, newRegion);\n } else {\n void this.loadMarkersForCurrentRegions();\n }\n }\n console.log(`[CameraController] Region \"${regionName}\" added successfully`);\n return;\n }\n\n // Merge the update with existing region config\n const updatedRegion = { ...this.regions[regionIndex], ...update };\n this.regions[regionIndex] = updatedRegion;\n\n // Also update in characterConfig if present\n if (this.characterConfig?.regions) {\n const configIndex = this.characterConfig.regions.findIndex(r => r.name === regionName);\n if (configIndex !== -1) {\n this.characterConfig.regions[configIndex] = updatedRegion;\n }\n }\n\n this.refreshLaterality();\n\n // Update the marker system using the general updateRegion method\n if (this.markers && 'updateRegion' in this.markers) {\n (this.markers as DPthree3DMarkers).updateRegion(regionName, update);\n } else if (this.markers && 'updateRegionMeshes' in this.markers && update.meshes) {\n // Fallback to updateRegionMeshes if updateRegion not available\n (this.markers as DPthree3DMarkers).updateRegionMeshes(regionName, update.meshes);\n }\n\n this.updateDOMControls();\n console.log(`[CameraController] Region \"${regionName}\" updated successfully`);\n }\n\n /**\n * Get the current configuration for a specific region\n */\n getAnnotationRegion(regionName: string): AnnotationAnchoredRegion | undefined {\n return this.regions.find(r => r.name === regionName);\n }\n\n /**\n * Get all annotation regions\n */\n getAnnotationRegions(): AnnotationAnchoredRegion[] {\n return [...this.regions];\n }\n\n private buildRuntimeAnnotationRegionName(\n targetType: 'bone' | 'au',\n target: string,\n boneName: string,\n side?: RuntimeAnnotationSide,\n ): string {\n return [\n RUNTIME_ANNOTATION_REGION_PREFIX,\n targetType,\n ':',\n encodeRuntimeAnnotationSegment(target),\n ...(side ? [':', encodeRuntimeAnnotationSegment(side)] : []),\n ':bone:',\n encodeRuntimeAnnotationSegment(boneName),\n ].join('');\n }\n\n private buildRuntimeBoneAnnotationRegion(\n targetType: 'bone' | 'au',\n target: string,\n boneName: string,\n options: RuntimeAnnotationOptions,\n side?: RuntimeAnnotationSide,\n ): AnnotationAnchoredRegion {\n const regionName = this.buildRuntimeAnnotationRegionName(targetType, target, boneName, side);\n const defaultLabel = targetType === 'au' ? `AU ${target}: ${boneName}` : `Bone: ${boneName}`;\n const style = buildRuntimeAnnotationStyle(options);\n\n return {\n name: regionName,\n label: options.label ?? defaultLabel,\n bones: [boneName],\n paddingFactor: options.paddingFactor ?? 0.8,\n cameraAngle: options.cameraAngle,\n markerAnchor: {\n type: 'bone',\n bones: [boneName],\n projectToSurface: options.projectToSurface,\n },\n focusTarget: {\n type: 'bone',\n bones: [boneName],\n paddingFactor: options.paddingFactor ?? 0.8,\n cameraAngle: options.cameraAngle,\n },\n ...(style ? { style } : {}),\n runtimeAnnotation: {\n targetType,\n target,\n boneName,\n ...(side ? { side } : {}),\n },\n };\n }\n\n private buildRuntimeMeshAnnotationRegionName(\n targetType: 'bone' | 'au',\n target: string,\n meshName: string,\n side?: RuntimeAnnotationSide,\n ): string {\n return [\n RUNTIME_ANNOTATION_REGION_PREFIX,\n targetType,\n ':',\n encodeRuntimeAnnotationSegment(target),\n ...(side ? [':', encodeRuntimeAnnotationSegment(side)] : []),\n ':mesh:',\n encodeRuntimeAnnotationSegment(meshName),\n ].join('');\n }\n\n private buildRuntimeMeshAnnotationRegion(\n targetType: 'bone' | 'au',\n target: string,\n meshName: string,\n morphNames: string[],\n options: RuntimeAnnotationOptions,\n side?: RuntimeAnnotationSide,\n ): AnnotationAnchoredRegion {\n const regionName = this.buildRuntimeMeshAnnotationRegionName(targetType, target, meshName, side);\n const defaultLabel = targetType === 'au' ? `AU ${target}: ${meshName}` : `Mesh: ${meshName}`;\n const style = buildRuntimeAnnotationStyle(options);\n\n return {\n name: regionName,\n label: options.label ?? defaultLabel,\n meshes: [meshName],\n paddingFactor: options.paddingFactor ?? 0.8,\n cameraAngle: options.cameraAngle,\n markerAnchor: {\n type: 'mesh',\n meshes: [meshName],\n projectToSurface: options.projectToSurface,\n },\n focusTarget: {\n type: 'mesh',\n meshes: [meshName],\n paddingFactor: options.paddingFactor ?? 0.8,\n cameraAngle: options.cameraAngle,\n },\n ...(style ? { style } : {}),\n runtimeAnnotation: {\n targetType,\n target,\n meshName,\n morphNames,\n ...(side ? { side } : {}),\n },\n };\n }\n\n private upsertRuntimeBoneAnnotationRegion(\n targetType: 'bone' | 'au',\n target: string,\n boneName: string,\n options: RuntimeAnnotationOptions,\n side?: RuntimeAnnotationSide,\n ): RuntimeAnnotationRegionSummary {\n const region = this.buildRuntimeBoneAnnotationRegion(targetType, target, boneName, options, side);\n this.runtimeAnnotationRegionNames.add(region.name);\n const existingRegion = this.getAnnotationRegion(region.name);\n if (\n !existingRegion ||\n buildRuntimeAnnotationRegionSignature(existingRegion) !== buildRuntimeAnnotationRegionSignature(region)\n ) {\n this.updateAnnotationRegion(region.name, region);\n }\n\n return {\n name: region.name,\n label: getRuntimeAnnotationRegionLabel(region),\n targetType,\n target,\n bones: [boneName],\n ...(side ? { side } : {}),\n };\n }\n\n private upsertRuntimeMeshAnnotationRegion(\n targetType: 'bone' | 'au',\n target: string,\n meshName: string,\n morphNames: string[],\n options: RuntimeAnnotationOptions,\n side?: RuntimeAnnotationSide,\n ): RuntimeAnnotationRegionSummary {\n const region = this.buildRuntimeMeshAnnotationRegion(targetType, target, meshName, morphNames, options, side);\n this.runtimeAnnotationRegionNames.add(region.name);\n const existingRegion = this.getAnnotationRegion(region.name);\n if (\n !existingRegion ||\n buildRuntimeAnnotationRegionSignature(existingRegion) !== buildRuntimeAnnotationRegionSignature(region)\n ) {\n this.updateAnnotationRegion(region.name, region);\n }\n\n return {\n name: region.name,\n label: getRuntimeAnnotationRegionLabel(region),\n targetType,\n target,\n bones: [],\n meshes: [meshName],\n morphs: [...morphNames],\n ...(side ? { side } : {}),\n };\n }\n\n private clearRuntimeAnnotationsForTarget(\n targetType: 'bone' | 'au',\n target: string,\n keepRegionNames = new Set<string>(),\n ): string[] {\n const removed: string[] = [];\n\n for (const regionName of Array.from(this.runtimeAnnotationRegionNames)) {\n if (keepRegionNames.has(regionName)) continue;\n\n const region = this.getAnnotationRegion(regionName);\n const runtimeAnnotation = region?.runtimeAnnotation;\n if (\n runtimeAnnotation?.targetType === targetType\n && runtimeAnnotation.target === target\n ) {\n this.removeAnnotationRegion(regionName);\n removed.push(regionName);\n }\n }\n\n return removed;\n }\n\n private clearRuntimeAnnotationsExcept(keepRegionNames: Set<string>): string[] {\n const removed: string[] = [];\n\n for (const regionName of Array.from(this.runtimeAnnotationRegionNames)) {\n if (keepRegionNames.has(regionName)) continue;\n\n this.removeAnnotationRegion(regionName);\n removed.push(regionName);\n }\n\n return removed;\n }\n\n /**\n * Show a temporary annotation marker for a bone. Runtime annotations are\n * ordinary regions with explicit bone marker/focus anchors, tracked separately\n * so they can be cleared without modifying saved character annotations.\n */\n showRuntimeBoneAnnotation(\n boneName: string,\n options: RuntimeAnnotationOptions = {},\n ): RuntimeAnnotationRegionSummary {\n const normalizedBoneName = normalizeRuntimeAnnotationText(boneName);\n if (!normalizedBoneName) {\n throw new Error('Bone name is required');\n }\n\n const summary = this.upsertRuntimeBoneAnnotationRegion(\n 'bone',\n normalizedBoneName,\n normalizedBoneName,\n options,\n );\n this.setMarkersVisible(true);\n return summary;\n }\n\n /**\n * Show temporary annotation markers for every bone binding used by an AU.\n * The optional profile override lets remote-control callers use the active\n * Embody engine profile, while normal controller consumers can rely on the\n * loaded character config.\n */\n showRuntimeAUAnnotations(\n auId: string | number,\n profileOverride?: unknown,\n options: RuntimeAnnotationOptions = {},\n morphTargetsByMesh?: unknown,\n ): RuntimeAnnotationRegionSummary[] {\n const normalizedAuId = normalizeRuntimeAnnotationText(auId);\n if (!normalizedAuId) {\n throw new Error('AU id is required');\n }\n\n const profileCandidates = getRuntimeAnnotationProfileCandidates(this.characterConfig, profileOverride);\n const targetSide = options.targetSide;\n const boneTargets = resolveRuntimeAnnotationAUBoneTargets(\n normalizedAuId,\n profileCandidates,\n targetSide,\n );\n const morphSelection = resolveRuntimeAnnotationAUMorphSelection(normalizedAuId, profileCandidates, targetSide);\n const meshTargets = resolveRuntimeAnnotationMorphMeshes(\n morphSelection.morphNames,\n morphTargetsByMesh,\n morphSelection.side,\n );\n\n if (boneTargets.length === 0 && meshTargets.length === 0) {\n if (morphSelection.morphNames.length > 0) {\n throw new Error(`AU ${normalizedAuId} has morph bindings but no matching morph target meshes to annotate`);\n }\n throw new Error(`AU ${normalizedAuId} has no bone or morph bindings to annotate`);\n }\n\n const bones = boneTargets.map((target) => target.boneName);\n const limitedTargets = limitRuntimeAnnotationTargets(bones, meshTargets, options);\n\n const desiredRegionNames = new Set<string>();\n for (const boneName of limitedTargets.bones) {\n const boneTarget = boneTargets.find((target) => target.boneName === boneName);\n desiredRegionNames.add(this.buildRuntimeAnnotationRegionName(\n 'au',\n normalizedAuId,\n boneName,\n targetSide ? boneTarget?.side ?? targetSide : undefined,\n ));\n }\n for (const meshTarget of limitedTargets.meshTargets) {\n desiredRegionNames.add(this.buildRuntimeMeshAnnotationRegionName(\n 'au',\n normalizedAuId,\n meshTarget.meshName,\n meshTarget.side,\n ));\n }\n\n if (options.replaceExisting) {\n this.clearRuntimeAnnotationsExcept(desiredRegionNames);\n } else if (targetSide) {\n this.clearRuntimeAnnotationsForTarget('au', normalizedAuId, desiredRegionNames);\n }\n\n const boneSummaries = limitedTargets.bones.map((boneName) => {\n const boneTarget = boneTargets.find((target) => target.boneName === boneName);\n return this.upsertRuntimeBoneAnnotationRegion(\n 'au',\n normalizedAuId,\n boneName,\n options.label\n ? { ...options, label: `${options.label}: ${boneName}` }\n : options,\n targetSide ? boneTarget?.side ?? targetSide : undefined,\n );\n });\n const meshSummaries = limitedTargets.meshTargets.map(({ meshName, morphNames: targetMorphNames, side }) =>\n this.upsertRuntimeMeshAnnotationRegion(\n 'au',\n normalizedAuId,\n meshName,\n targetMorphNames,\n options.label\n ? { ...options, label: `${options.label}: ${meshName}` }\n : options,\n side,\n )\n );\n const summaries = [...boneSummaries, ...meshSummaries];\n this.setMarkersVisible(true);\n return summaries;\n }\n\n /**\n * Remove all temporary runtime annotations created through the AU/bone API.\n */\n clearRuntimeAnnotations(): string[] {\n const removed = Array.from(this.runtimeAnnotationRegionNames);\n for (const regionName of removed) {\n this.removeAnnotationRegion(regionName);\n }\n return removed;\n }\n\n // ====== DOM CONTROLS ======\n\n /**\n * Show/hide built-in DOM controls\n */\n setDOMControlsVisible(visible: boolean): void {\n this.domControls?.setVisible(visible);\n }\n\n /**\n * Update DOM controls to reflect current regions\n */\n updateDOMControls(): void {\n if (!this.domControls) return;\n // AU slider previews create temporary runtime:annotation:* regions; keep\n // those out of the View dropdown so option text cannot widen the control.\n this.domControls.updateRegions(\n filterCameraViewRegions(this.getAnnotationRegions()),\n this.currentRegion ?? undefined,\n );\n this.domControls.setMarkersVisible(this.markersVisible);\n }\n\n // ====== CALLBACKS ======\n\n /**\n * Register callback for region changes\n */\n onRegionChange(callback: RegionChangeCallback): () => void {\n this.onRegionChangeCallbacks.push(callback);\n return () => {\n const index = this.onRegionChangeCallbacks.indexOf(callback);\n if (index > -1) this.onRegionChangeCallbacks.splice(index, 1);\n };\n }\n\n // ====== LIFECYCLE ======\n\n /**\n * Update loop - call in animation frame (from render loop)\n * This drives camera animations and marker updates\n */\n update(): void {\n if (this.disposed) return;\n if (this.pendingAnimation) {\n const animation = this.pendingAnimation;\n const sample = animation.runtime.sample(performance.now() - animation.startTime);\n this.applyCameraPose(sample);\n if (sample.done) {\n this.pendingAnimation = null;\n animation.runtime.dispose();\n animation.resolve();\n }\n }\n\n this.controls.update();\n this.markers?.update();\n }\n\n /**\n * Cleanup and dispose\n */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.cancelModelPreparation();\n this.regionLoadGeneration += 1;\n this.cameraRequestGeneration += 1;\n\n // Stop render loop if we're managing it\n this.stopRenderLoop();\n this.playbackTimer.dispose();\n const renderingSettled = this.unbindRendering?.();\n this.unbindRendering = null;\n\n // Clean up resize handling\n this.cleanupResizeHandling();\n\n this.cancelCameraAnimation();\n\n // Dispose DOM controls\n this.domControls?.dispose();\n this.domControls = null;\n\n // A candidate may still compile the scene including these owned markers.\n const markers = this.markers;\n this.markers = null;\n if (renderingSettled) void renderingSettled.then(() => markers?.dispose());\n else markers?.dispose();\n\n // Dispose OrbitControls\n this.controls.dispose();\n\n // Clear callbacks\n this.onRegionChangeCallbacks = [];\n }\n\n // ====== PRIVATE METHODS ======\n\n private initDOMControls(): void {\n this.domControls = new CameraDOMControls({\n container: this.controlsContainer,\n regions: filterCameraViewRegions(this.getAnnotationRegions()),\n currentRegion: this.currentRegion ?? undefined,\n markersVisible: this.markersVisible,\n onRegionSelect: this.selectRegion,\n onMarkersVisibleChange: (visible) => this.setMarkersVisible(visible),\n });\n }\n\n private notifyRegionChange(name: string): void {\n this.onRegionChangeCallbacks.forEach((cb) => cb(name));\n this.domControls?.setCurrentRegion(name);\n this.markers?.setCurrentRegion(name);\n }\n\n /**\n * Resolve region definition to actual Object3D instances\n */\n private resolveRegionObjects(region: Region): THREE.Object3D[] {\n if (!this.model) return [];\n\n const objects: THREE.Object3D[] = [];\n\n // Handle special '*' case for all objects - collect all meshes\n if (region.objects?.includes('*')) {\n const meshes: THREE.Object3D[] = [];\n this.model.traverse((obj) => {\n if ((obj as THREE.Mesh).isMesh) {\n meshes.push(obj);\n }\n });\n return meshes.length > 0 ? meshes : [this.model];\n }\n\n // Find bones - resolve semantic names to actual GLB names first\n if (region.bones) {\n const resolvedBoneNames = resolveBoneNames(region.bones, boneResolutionProfile(this.characterConfig));\n objects.push(...this.findObjectsByNames(resolvedBoneNames, 'Bone'));\n }\n\n // Find meshes\n if (region.meshes) {\n objects.push(...this.findObjectsByNames(region.meshes, 'Mesh'));\n }\n\n // Find any objects\n if (region.objects) {\n objects.push(...this.findObjectsByNames(region.objects));\n }\n\n return objects;\n }\n\n /**\n * Find objects by name with optional type filter.\n * Uses fuzzy matching to handle bone names with numeric suffixes\n * (e.g., \"CC_Base_Head_038\" matches \"CC_Base_Head\").\n */\n private findObjectsByNames(names: string[], type?: string): THREE.Object3D[] {\n if (!this.model) return [];\n\n const found: THREE.Object3D[] = [];\n const nameSet = new Set(names);\n\n this.model.traverse((obj) => {\n // Exact match first\n if (nameSet.has(obj.name)) {\n if (!type || obj.type === type) {\n found.push(obj);\n }\n return;\n }\n\n // Fuzzy match - check if obj.name starts with any target + numeric suffix\n for (const target of names) {\n if (fuzzyNameMatch(obj.name, target, this.characterConfig?.suffixPattern)) {\n if (!type || obj.type === type) {\n found.push(obj);\n }\n break;\n }\n }\n });\n\n return found;\n }\n\n /**\n * Get bounding box of vertices influenced by a bone from skinned meshes\n * This finds the actual geometry size around a bone for proper framing\n *\n * For skinned meshes, we need to compute the actual skinned vertex positions,\n * not just the bind pose positions.\n */\n private getBoneInfluencedBoundingBox(bone: THREE.Bone): THREE.Box3 | null {\n if (!this.model) return null;\n\n const box = new THREE.Box3();\n\n // Find the bone index in any skeleton\n let boneIndex = -1;\n let skeleton: THREE.Skeleton | null = null;\n\n this.model.traverse((obj) => {\n const mesh = obj as THREE.SkinnedMesh;\n if (mesh.isSkinnedMesh && mesh.skeleton) {\n const idx = mesh.skeleton.bones.indexOf(bone);\n if (idx !== -1) {\n boneIndex = idx;\n skeleton = mesh.skeleton;\n }\n }\n });\n\n if (boneIndex === -1 || !skeleton) {\n return null;\n }\n\n // Find all skinned meshes and collect vertices influenced by this bone\n const tempVertex = new THREE.Vector3();\n const skinned = new THREE.Vector3();\n const tempMatrix = new THREE.Matrix4();\n\n this.model.traverse((obj) => {\n const mesh = obj as THREE.SkinnedMesh;\n if (!mesh.isSkinnedMesh || mesh.skeleton !== skeleton) return;\n const boneMatrices = mesh.skeleton.boneMatrices;\n if (!boneMatrices) return;\n\n // Ensure bone matrices are up to date\n mesh.skeleton.update();\n\n const geometry = mesh.geometry;\n const positionAttr = geometry.getAttribute('position');\n const skinIndexAttr = geometry.getAttribute('skinIndex');\n const skinWeightAttr = geometry.getAttribute('skinWeight');\n\n if (!positionAttr || !skinIndexAttr || !skinWeightAttr) return;\n\n // Get the bind matrix inverse for skinning calculation\n const bindMatrixInverse = mesh.bindMatrixInverse;\n\n // Check each vertex\n for (let i = 0; i < positionAttr.count; i++) {\n // Check if this vertex is influenced by our bone (weight > 0.1)\n let isInfluenced = false;\n for (let j = 0; j < 4; j++) {\n const skinIdx = skinIndexAttr.getComponent(i, j);\n const weight = skinWeightAttr.getComponent(i, j);\n if (skinIdx === boneIndex && weight > 0.1) {\n isInfluenced = true;\n break;\n }\n }\n\n if (isInfluenced) {\n // Get the vertex position in local space\n tempVertex.fromBufferAttribute(positionAttr, i);\n\n // Apply skinning transformation\n // skinned = sum(weight_i * boneMatrix_i * bindMatrixInverse * vertex)\n skinned.set(0, 0, 0);\n\n for (let j = 0; j < 4; j++) {\n const skinIdx = skinIndexAttr.getComponent(i, j);\n const weight = skinWeightAttr.getComponent(i, j);\n\n if (weight > 0) {\n // Get bone matrix (already includes world transform)\n tempMatrix.fromArray(boneMatrices, skinIdx * 16);\n\n // Transform vertex: boneMatrix * bindMatrixInverse * vertex\n const transformed = tempVertex.clone();\n transformed.applyMatrix4(bindMatrixInverse);\n transformed.applyMatrix4(tempMatrix);\n transformed.multiplyScalar(weight);\n\n skinned.add(transformed);\n }\n }\n\n // Apply mesh world matrix to get final world position\n skinned.applyMatrix4(mesh.matrixWorld);\n box.expandByPoint(skinned);\n }\n }\n });\n\n return box.isEmpty() ? null : box;\n }\n\n /**\n * Calculate optimal camera position to frame objects\n * @param objects - Objects to focus on\n * @param overridePadding - Optional padding factor override\n * @param cameraAngle - Camera angle in degrees around Y axis (0 = front, 180 = back)\n */\n private calculateFocusPosition(\n objects: THREE.Object3D[],\n overridePadding?: number,\n cameraAngle?: number,\n angleSpace: 'model' | 'world' = 'model'\n ): FocusPosition {\n // Force update world matrices on entire scene before computing bounding box\n this.scene.updateMatrixWorld(true);\n\n // Compute combined bounding box\n const box = new THREE.Box3();\n\n for (const obj of objects) {\n // For bones, find the geometry influenced by this bone from skinned meshes\n if (obj.type === 'Bone') {\n const bone = obj as THREE.Bone;\n const worldPos = new THREE.Vector3();\n bone.getWorldPosition(worldPos);\n\n // Find skinned meshes and get vertices influenced by this bone\n const boneBox = this.getBoneInfluencedBoundingBox(bone);\n if (boneBox && !boneBox.isEmpty()) {\n box.union(boneBox);\n } else {\n // Fallback: just use the bone position\n box.expandByPoint(worldPos);\n }\n } else {\n // For meshes and other objects, use expandByObject\n const objBox = new THREE.Box3().setFromObject(obj);\n if (!objBox.isEmpty()) {\n box.union(objBox);\n }\n }\n }\n\n // Explicit front views need no model-wide clearance bounds.\n const modelBox = this.model && cameraAngle !== 0\n ? new THREE.Box3().setFromObject(this.model)\n : null;\n return toFocusPosition(requireAnnotationCameraCore().solveFocusFraming({\n focusBounds: box.isEmpty() ? undefined : {\n center: box.getCenter(new THREE.Vector3()),\n size: box.getSize(new THREE.Vector3()),\n },\n modelBounds: modelBox && !modelBox.isEmpty() ? {\n center: modelBox.getCenter(new THREE.Vector3()),\n size: modelBox.getSize(new THREE.Vector3()),\n } : undefined,\n modelQuaternion: this.model?.getWorldQuaternion(new THREE.Quaternion()),\n fovDegrees: this.camera.fov,\n aspect: this.camera.aspect,\n minDistance: this.config.minDistance,\n closeUpPaddingFactor: this.config.closeUpPaddingFactor,\n zoomPaddingFactor: this.config.zoomPaddingFactor,\n fullBodyPaddingFactor: this.config.fullBodyPaddingFactor,\n overridePadding,\n cameraAngle,\n angleSpace,\n }));\n }\n\n private calculatePointFocusPosition(\n target: THREE.Vector3,\n overridePadding?: number,\n cameraAngle?: number,\n ): FocusPosition {\n const pointSize = this.resolvePointFocusSize();\n const focusProxy = new THREE.Mesh(\n new THREE.BoxGeometry(pointSize, pointSize, pointSize)\n );\n focusProxy.position.copy(target);\n focusProxy.updateMatrixWorld(true);\n\n const focusPosition = this.calculateFocusPosition([focusProxy], overridePadding, cameraAngle);\n focusProxy.geometry.dispose();\n return focusPosition;\n }\n\n private resolvePointFocusSize(): number {\n if (!this.model) {\n return 0.1;\n }\n\n const box = new THREE.Box3().setFromObject(this.model);\n if (box.isEmpty()) {\n return 0.1;\n }\n\n const size = new THREE.Vector3();\n box.getSize(size);\n const maxDimension = Math.max(size.x, size.y, size.z);\n return Math.max(maxDimension * 0.04, 0.02);\n }\n\n private getFallbackFocusPosition(): FocusPosition {\n return {\n position: new THREE.Vector3(0, 0.8, 2.5),\n target: new THREE.Vector3(0, 0.8, 0),\n distance: 2.5,\n };\n }\n\n private isFullBodyRegion(region: Region): boolean {\n const normalizedName = region.name.trim().toLowerCase().replace(/\\s+/g, '_');\n return normalizedName === 'full_body'\n || normalizedName === 'fullbody'\n || region.objects?.includes('*') === true;\n }\n\n private isLeftEyeRegion(region: Region): boolean {\n const normalizedName = region.name.trim().toLowerCase().replace(/[\\s-]+/g, '_');\n return normalizedName === 'left_eye'\n || normalizedName === 'lefteye'\n || normalizedName === 'eye_l'\n || normalizedName === 'l_eye'\n || (normalizedName.includes('left') && normalizedName.includes('eye'));\n }\n\n private findIntroLeftEyeRegion(): Region | undefined {\n return this.regions.find((region) => this.isLeftEyeRegion(region));\n }\n\n private resolveIntroLeftEyePadding(region: Region): number {\n const requestedPadding = region.paddingFactor ?? this.config.closeUpPaddingFactor;\n return Math.min(requestedPadding * INTRO_LEFT_EYE_PADDING_SCALE, INTRO_LEFT_EYE_PADDING_CAP);\n }\n\n private calculateIntroLeftEyeFocusPosition(region: Region): FocusPosition | null {\n const objects = this.resolveRegionObjects(region);\n if (objects.length === 0) {\n return null;\n }\n\n const focusPos = this.calculateFocusPosition(\n objects,\n this.resolveIntroLeftEyePadding(region),\n resolveRegionCameraAngle(region, this.laterality)\n );\n\n if (region.cameraOffset) {\n if (region.cameraOffset.x) focusPos.position.x += region.cameraOffset.x;\n if (region.cameraOffset.y) focusPos.position.y += region.cameraOffset.y;\n if (region.cameraOffset.z) focusPos.position.z += region.cameraOffset.z;\n }\n\n return this.applyIntroLeftEyeCompositionBias(focusPos);\n }\n\n private applyIntroLeftEyeCompositionBias(focusPos: FocusPosition): FocusPosition {\n if (!this.model) {\n return focusPos;\n }\n\n const modelBox = new THREE.Box3().setFromObject(this.model);\n if (modelBox.isEmpty()) {\n return focusPos;\n }\n\n const modelSize = new THREE.Vector3();\n modelBox.getSize(modelSize);\n const verticalBias = Math.max(\n modelSize.y * INTRO_LEFT_EYE_VERTICAL_BIAS_RATIO,\n INTRO_LEFT_EYE_MIN_VERTICAL_BIAS\n );\n\n const position = focusPos.position.clone();\n const target = focusPos.target.clone();\n position.y -= verticalBias;\n target.y -= verticalBias;\n\n return {\n position,\n target,\n distance: position.distanceTo(target),\n };\n }\n\n private calculateFullBodyFocusPosition(\n overridePadding?: number,\n cameraAngle?: number,\n angleSpace: 'model' | 'world' = 'model'\n ): FocusPosition {\n if (!this.model) return this.getFallbackFocusPosition();\n\n this.scene.updateMatrixWorld(true);\n const box = new THREE.Box3().setFromObject(this.model);\n if (box.isEmpty()) return this.getFallbackFocusPosition();\n\n return toFocusPosition(requireAnnotationCameraCore().solveFullBodyFraming({\n boxMin: box.min,\n boxMax: box.max,\n modelQuaternion: this.model.getWorldQuaternion(new THREE.Quaternion()),\n fovDegrees: this.camera.fov,\n aspect: this.camera.aspect,\n minDistance: this.config.minDistance,\n fullBodyPaddingFactor: this.config.fullBodyPaddingFactor,\n overridePadding,\n cameraAngle,\n angleSpace,\n }));\n }\n\n private refreshLaterality(): void {\n this.laterality = detectAnnotationLaterality(this.model, this.regions, boneResolutionProfile(this.characterConfig));\n }\n\n /** Resolver and paint continuations belong to one model/configuration load. */\n private isRegionLoadCurrent(request: number, model: THREE.Object3D | null): boolean {\n return !this.disposed && request === this.regionLoadGeneration && model === this.model;\n }\n\n /** Await Wasm once per request and abandon requests superseded during initialization. */\n private async beginCameraRequest(): Promise<number | null> {\n const request = ++this.cameraRequestGeneration;\n this.cancelCameraAnimation();\n if (this.disposed) return null;\n await getAnnotationCameraCore();\n return this.isCameraRequestCurrent(request) ? request : null;\n }\n\n private isCameraRequestCurrent(request: number): boolean {\n return !this.disposed && request === this.cameraRequestGeneration;\n }\n\n private cancelCameraAnimation(): void {\n this.timerAnimationFallbackToken += 1;\n const animation = this.pendingAnimation;\n this.pendingAnimation = null;\n if (animation) {\n animation.runtime.dispose();\n animation.resolve();\n }\n }\n\n private applyCameraPose(pose: CameraPose): void {\n this.camera.position.set(pose.position.x, pose.position.y, pose.position.z);\n this.controls.target.set(pose.target.x, pose.target.y, pose.target.z);\n }\n\n private runCameraAnimation(runtime: RustCameraAnimation): Promise<void> {\n this.cancelCameraAnimation();\n const initial = runtime.sample(0);\n this.applyCameraPose(initial);\n this.camera.lookAt(this.controls.target);\n this.controls.update();\n if (initial.done) {\n runtime.dispose();\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.pendingAnimation = { startTime: performance.now(), runtime, resolve };\n this.scheduleTimerAnimationFallback(() => this.pendingAnimation !== null);\n });\n }\n\n /** Sample the shared Rust flight from update(), alongside the renderer. */\n private animateCamera(\n targetPosition: THREE.Vector3,\n targetLookAt: THREE.Vector3,\n duration: number\n ): Promise<void> {\n return this.runCameraAnimation(requireAnnotationCameraCore().createCameraFlight(\n this.camera.position,\n this.controls.target,\n targetPosition,\n targetLookAt,\n duration,\n ));\n }\n}\n","import * as THREE from 'three';\nimport { DPthreeCameraController } from './DPthreeCameraController';\nimport { DPthree3DMarkers } from './DPthree3DMarkers';\nimport { DPthreeHTMLMarkers } from './DPthreeHTMLMarkers';\nimport { CameraDOMControls } from './DOMControls';\nimport type {\n CharacterConfig,\n DPthreeCameraControllerConfig,\n MarkerStyle,\n LineConfig,\n MarkerStyleOverrides,\n ExpandAnimation,\n ExpandedRegionState,\n} from './types';\n\n/**\n * DPthree Configuration\n */\nexport interface DPthreeConfig {\n /** Three.js scene */\n scene: THREE.Scene;\n /** Three.js camera */\n camera: THREE.PerspectiveCamera;\n /** Canvas or container element */\n domElement: HTMLElement;\n /** Marker style: '3d' (default) or 'html' */\n markerStyle?: MarkerStyle;\n /** Show DOM controls dropdown. Default: false */\n showControls?: boolean;\n /** Callback when a region is selected */\n onRegionSelect?: (name: string) => void;\n /** Camera controller options */\n cameraOptions?: Partial<DPthreeCameraControllerConfig>;\n}\n\n/**\n * DPthree - Camera & Marker System for Three.js\n *\n * Factory class that creates and manages camera controller and markers.\n *\n * @example\n * ```typescript\n * const dp = new DPthree({\n * scene,\n * camera,\n * domElement: canvas,\n * markerStyle: '3d',\n * });\n *\n * dp.setModel(model);\n * await dp.loadCharacter(config);\n * dp.focus('head');\n *\n * // In render loop\n * dp.update();\n * ```\n */\nexport class DPthree {\n private readonly cameraController: DPthreeCameraController;\n private markerStyle: MarkerStyle;\n private model: THREE.Object3D | null = null;\n\n constructor(options: DPthreeConfig) {\n this.markerStyle = options.markerStyle ?? '3d';\n this.cameraController = new DPthreeCameraController({\n scene: options.scene,\n camera: options.camera,\n domElement: options.domElement,\n showDOMControls: options.showControls ?? false,\n onRegionSelect: options.onRegionSelect,\n ...options.cameraOptions,\n });\n this.cameraController.setMarkersVisible(true);\n }\n\n setModel(model: THREE.Object3D): this {\n this.model = model;\n this.cameraController.setModel(model);\n return this;\n }\n\n async loadCharacter(config: CharacterConfig): Promise<this> {\n this.markerStyle = config.markerStyle ?? this.markerStyle;\n await this.cameraController.loadRegions({ ...config, markerStyle: this.markerStyle });\n return this;\n }\n\n focus(regionName: string, duration?: number): Promise<void> { return this.cameraController.focusRegion(regionName, duration); }\n getRegions(): string[] { return this.cameraController.getRegionNames(); }\n getCurrentRegion(): string | null { return this.cameraController.getCurrentRegion(); }\n setMarkerStyle(style: MarkerStyle): this { this.markerStyle = style; this.cameraController.setMarkerStyle(style); return this; }\n setMarkersVisible(visible: boolean): this { this.cameraController.setMarkersVisible(visible); return this; }\n setControlsVisible(visible: boolean): this { this.cameraController.setDOMControlsVisible(visible); return this; }\n getCameraState() { return this.cameraController.getCameraState(); }\n setCameraState(position: [number, number, number], target: [number, number, number], _animate?: boolean): this {\n this.cameraController.setCameraState({ position, target }); return this;\n }\n get controller(): DPthreeCameraController { return this.cameraController; }\n update(): void { this.cameraController.update(); }\n expandRegion(name: string, duration?: number): this { this.cameraController.expandRegion(name, duration); return this; }\n collapseRegion(name: string, duration?: number): this { this.cameraController.collapseRegion(name, duration); return this; }\n toggleRegion(name: string, animation: ExpandAnimation = 'outward', duration?: number): this { this.cameraController.toggleRegion(name, animation, duration); return this; }\n getExpandedRegions(): ExpandedRegionState[] { return this.cameraController.getExpandedRegions(); }\n soloMarker(name: string | null): this { this.cameraController.soloMarker(name); return this; }\n getSoloedMarker(): string | null { return this.cameraController.getSoloedMarker(); }\n setRegionLineStyle(name: string, line: Partial<LineConfig>): this { this.cameraController.setRegionLineStyle(name, line); return this; }\n setRegionStyle(name: string, style: Partial<MarkerStyleOverrides>): this { this.cameraController.setRegionStyle(name, style); return this; }\n dispose(): void { this.cameraController.dispose(); this.model = null; }\n\n // ============ CHARACTER VALIDATION ============\n\n /**\n * Validate a loaded character model against expected bone/morph mappings\n * @param expectedBones - Map of semantic bone names to actual bone names\n * @param expectedMorphs - List of expected morph target names\n * @returns Validation result with found/missing bones and morphs\n */\n validateCharacter(\n expectedBones?: Record<string, string>,\n expectedMorphs?: string[]\n ): CharacterValidationResult {\n if (!this.model) {\n return {\n valid: false,\n bones: { found: [], missing: [], unexpected: [] },\n morphs: { found: [], missing: [], unexpected: [] },\n meshes: { found: [], total: 0 },\n summary: 'No model loaded',\n };\n }\n\n // Collect actual bones and morphs from model\n const actualBones: string[] = [];\n const actualMorphs: Map<string, string[]> = new Map(); // meshName -> morphNames\n const meshNames: string[] = [];\n\n this.model.traverse((obj) => {\n if ((obj as THREE.Bone).isBone) {\n actualBones.push(obj.name);\n }\n if ((obj as THREE.Mesh).isMesh) {\n const mesh = obj as THREE.Mesh;\n meshNames.push(mesh.name);\n if (mesh.morphTargetDictionary) {\n actualMorphs.set(mesh.name, Object.keys(mesh.morphTargetDictionary));\n }\n }\n });\n\n // Flatten morph names\n const allActualMorphs = new Set<string>();\n actualMorphs.forEach((morphs) => morphs.forEach((m) => allActualMorphs.add(m)));\n\n // Compare bones\n const boneResult: ValidationCategory = { found: [], missing: [], unexpected: [] };\n const expectedBoneNames = new Set(expectedBones ? Object.values(expectedBones) : []);\n const actualBoneSet = new Set(actualBones);\n\n if (expectedBones) {\n for (const [semantic, boneName] of Object.entries(expectedBones)) {\n if (actualBoneSet.has(boneName)) {\n boneResult.found.push({ name: boneName, semantic });\n } else {\n boneResult.missing.push({ name: boneName, semantic });\n }\n }\n }\n\n // Find unexpected bones (bones in model not in expected mapping)\n for (const bone of actualBones) {\n if (!expectedBoneNames.has(bone)) {\n boneResult.unexpected.push({ name: bone });\n }\n }\n\n // Compare morphs\n const morphResult: ValidationCategory = { found: [], missing: [], unexpected: [] };\n const expectedMorphSet = new Set(expectedMorphs || []);\n\n if (expectedMorphs) {\n for (const morphName of expectedMorphs) {\n if (allActualMorphs.has(morphName)) {\n morphResult.found.push({ name: morphName });\n } else {\n morphResult.missing.push({ name: morphName });\n }\n }\n }\n\n // Find unexpected morphs\n for (const morph of allActualMorphs) {\n if (!expectedMorphSet.has(morph)) {\n morphResult.unexpected.push({ name: morph });\n }\n }\n\n // Calculate validity\n const bonesValid = boneResult.missing.length === 0;\n const morphsValid = morphResult.missing.length === 0;\n const valid = bonesValid && morphsValid;\n\n // Generate summary\n const summaryParts: string[] = [];\n if (boneResult.missing.length > 0) {\n summaryParts.push(`${boneResult.missing.length} missing bones`);\n }\n if (morphResult.missing.length > 0) {\n summaryParts.push(`${morphResult.missing.length} missing morphs`);\n }\n if (boneResult.unexpected.length > 0) {\n summaryParts.push(`${boneResult.unexpected.length} extra bones`);\n }\n if (morphResult.unexpected.length > 0) {\n summaryParts.push(`${morphResult.unexpected.length} extra morphs`);\n }\n\n const summary = valid\n ? `Valid: ${boneResult.found.length} bones, ${morphResult.found.length} morphs`\n : summaryParts.join(', ');\n\n return {\n valid,\n bones: boneResult,\n morphs: morphResult,\n meshes: { found: meshNames, total: meshNames.length },\n summary,\n };\n }\n\n /**\n * Get all bone names in the loaded model\n */\n getBoneNames(): string[] {\n const bones: string[] = [];\n this.model?.traverse((obj) => {\n if ((obj as THREE.Bone).isBone) {\n bones.push(obj.name);\n }\n });\n return bones;\n }\n\n /**\n * Get all morph target names in the loaded model\n */\n getMorphNames(): string[] {\n const morphs = new Set<string>();\n this.model?.traverse((obj) => {\n if ((obj as THREE.Mesh).isMesh) {\n const mesh = obj as THREE.Mesh;\n if (mesh.morphTargetDictionary) {\n Object.keys(mesh.morphTargetDictionary).forEach((m) => morphs.add(m));\n }\n }\n });\n return Array.from(morphs);\n }\n\n /**\n * Get all mesh names in the loaded model\n */\n getMeshNames(): string[] {\n const meshes: string[] = [];\n this.model?.traverse((obj) => {\n if ((obj as THREE.Mesh).isMesh) {\n meshes.push(obj.name);\n }\n });\n return meshes;\n }\n}\n\n// ============ VALIDATION TYPES ============\n\nexport interface ValidationItem {\n name: string;\n semantic?: string;\n}\n\nexport interface ValidationCategory {\n found: ValidationItem[];\n missing: ValidationItem[];\n unexpected: ValidationItem[];\n}\n\nexport interface CharacterValidationResult {\n valid: boolean;\n bones: ValidationCategory;\n morphs: ValidationCategory;\n meshes: { found: string[]; total: number };\n summary: string;\n}\n\n// Re-export for convenience\nexport { DPthreeCameraController as CameraController } from './DPthreeCameraController';\nexport { DPthree3DMarkers as Markers3D } from './DPthree3DMarkers';\nexport { DPthreeHTMLMarkers as MarkersHTML } from './DPthreeHTMLMarkers';\nexport { CameraDOMControls as Controls } from './DOMControls';\n","import { boneResolutionProfile } from './boneResolutionProfile';\nimport * as THREE from 'three';\nimport { fuzzyNameMatch, passesMarkerCameraAngleGate, resolveBoneNames } from './adapter';\nimport type { Region, CharacterConfig } from './types';\n\n/**\n * 3D visual markers for regions that can be clicked\n */\nexport class DPthreeMarkers {\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private domElement: HTMLElement;\n private markers: Map<string, THREE.Sprite> = new Map();\n private labels: Map<string, HTMLDivElement> = new Map();\n private labelsContainer: HTMLDivElement;\n private raycaster: THREE.Raycaster;\n private onSelect: (name: string) => void;\n private model: THREE.Object3D | null = null;\n private regions: Region[] = [];\n private characterConfig: CharacterConfig | null = null;\n private currentRegion: string | null = null;\n\n constructor(config: {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n domElement: HTMLElement;\n onSelect: (name: string) => void;\n }) {\n this.scene = config.scene;\n this.camera = config.camera;\n this.domElement = config.domElement;\n this.onSelect = config.onSelect;\n this.raycaster = new THREE.Raycaster();\n\n // Create container for HTML labels\n this.labelsContainer = document.createElement('div');\n this.labelsContainer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: hidden;\n `;\n\n // Find parent with relative positioning or the canvas parent\n const parent = this.domElement.parentElement;\n if (parent) {\n const style = window.getComputedStyle(parent);\n if (style.position === 'static') {\n parent.style.position = 'relative';\n }\n parent.appendChild(this.labelsContainer);\n }\n\n // Add click handler\n this.domElement.addEventListener('click', this.onClick);\n }\n\n setModel(model: THREE.Object3D): void {\n this.model = model;\n }\n\n loadRegions(config: CharacterConfig): void {\n this.clear();\n this.characterConfig = config;\n this.regions = config.regions ?? [];\n\n for (const region of (config.regions ?? [])) {\n this.createMarker(region);\n }\n }\n\n setCurrentRegion(name: string | null): void {\n this.currentRegion = name;\n this.updateMarkerStyles();\n }\n\n private createMarker(region: Region): void {\n if (!this.model) return;\n\n // Calculate center position for this annotation\n const position = this.getRegionCenter(region);\n if (!position) return;\n\n // Create HTML label (more reliable than sprites for clicking)\n const label = document.createElement('div');\n label.className = 'annotation-marker';\n label.dataset.annotation = region.name;\n label.innerHTML = `\n <div class=\"marker-dot\"></div>\n <div class=\"marker-label\">${this.formatName(region.name)}</div>\n `;\n label.style.cssText = `\n position: absolute;\n transform: translate(-50%, -50%);\n pointer-events: auto;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n background: rgba(0, 0, 0, 0.6);\n border-radius: 16px;\n border: 1px solid rgba(255, 255, 255, 0.2);\n transition: all 0.2s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 11px;\n color: white;\n white-space: nowrap;\n z-index: 100;\n `;\n\n // Style the dot\n const dot = label.querySelector('.marker-dot') as HTMLElement;\n if (dot) {\n dot.style.cssText = `\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #4299e1;\n box-shadow: 0 0 6px #4299e1;\n `;\n }\n\n // Add hover effect\n label.addEventListener('mouseenter', () => {\n label.style.background = 'rgba(66, 153, 225, 0.8)';\n label.style.borderColor = '#4299e1';\n });\n label.addEventListener('mouseleave', () => {\n if (this.currentRegion !== region.name) {\n label.style.background = 'rgba(0, 0, 0, 0.6)';\n label.style.borderColor = 'rgba(255, 255, 255, 0.2)';\n }\n });\n\n // Add click handler\n label.addEventListener('click', (e) => {\n e.stopPropagation();\n this.onSelect(region.name);\n });\n\n this.labelsContainer.appendChild(label);\n this.labels.set(region.name, label);\n\n // Store position for updates\n (label as any).__position = position.clone();\n }\n\n private getRegionCenter(region: Region): THREE.Vector3 | null {\n if (!this.model) return null;\n\n const box = new THREE.Box3();\n let hasObjects = false;\n\n // Handle '*' for full model\n if (region.objects?.includes('*')) {\n box.expandByObject(this.model);\n hasObjects = true;\n } else {\n // Find bones\n if (region.bones) {\n const resolvedBoneNames = resolveBoneNames(region.bones, boneResolutionProfile(this.characterConfig) ?? undefined);\n for (const boneName of resolvedBoneNames) {\n this.model.traverse((obj) => {\n if (fuzzyNameMatch(obj.name, boneName, this.characterConfig?.suffixPattern)) {\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n box.expandByPoint(worldPos);\n hasObjects = true;\n }\n });\n }\n }\n\n // Find meshes - Note: For skinned meshes, prefer also specifying bones\n // for accurate marker positioning since mesh world position may be at origin\n if (region.meshes) {\n for (const meshName of region.meshes) {\n this.model.traverse((obj) => {\n if (obj.name === meshName && (obj as THREE.Mesh).isMesh) {\n box.expandByObject(obj);\n hasObjects = true;\n }\n });\n }\n }\n }\n\n if (!hasObjects || box.isEmpty()) return null;\n\n const center = new THREE.Vector3();\n box.getCenter(center);\n\n // If annotation has a cameraAngle, offset the marker position to that side of the model\n // This makes markers appear on the appropriate surface (e.g., back marker on the back)\n if (region.cameraAngle !== undefined && region.cameraAngle !== 0) {\n // Get the model's bounding box to determine offset distance\n const modelBox = new THREE.Box3().setFromObject(this.model);\n const modelSize = new THREE.Vector3();\n modelBox.getSize(modelSize);\n\n // Use half the depth (z-axis) as the offset distance\n const offsetDistance = modelSize.z * 0.5;\n\n // Calculate offset direction based on camera angle\n const angleRad = (region.cameraAngle * Math.PI) / 180;\n center.x += Math.sin(angleRad) * offsetDistance;\n center.z -= Math.cos(angleRad) * offsetDistance;\n }\n\n return center;\n }\n\n private formatName(name: string): string {\n return name\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n\n private updateMarkerStyles(): void {\n for (const [name, label] of this.labels) {\n if (name === this.currentRegion) {\n label.style.background = 'rgba(66, 153, 225, 0.8)';\n label.style.borderColor = '#4299e1';\n } else {\n label.style.background = 'rgba(0, 0, 0, 0.6)';\n label.style.borderColor = 'rgba(255, 255, 255, 0.2)';\n }\n }\n }\n\n private onClick = (event: MouseEvent): void => {\n // This handles clicks on the 3D canvas that might hit markers\n // The HTML labels handle their own clicks\n };\n\n /**\n * Update label positions - call this in render loop\n *\n * Occlusion: Uses efficient dot product check - if marker is on opposite side\n * of model from camera (dot product < 0), hide it. O(1) per marker.\n */\n update(): void {\n if (!this.model) return;\n\n const rect = this.domElement.getBoundingClientRect();\n\n // Calculate camera's viewing angle around the model (in degrees)\n // This tells us if we're looking from front (0°), back (180°), etc.\n const modelCenter = new THREE.Vector3();\n new THREE.Box3().setFromObject(this.model).getCenter(modelCenter);\n\n // Camera direction from model center (for dot product occlusion)\n const dx = this.camera.position.x - modelCenter.x;\n const dy = this.camera.position.y - modelCenter.y;\n const dz = this.camera.position.z - modelCenter.z;\n const cameraDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n const cameraDirX = dx / cameraDistance;\n const cameraDirY = dy / cameraDistance;\n const cameraDirZ = dz / cameraDistance;\n\n const cameraAngle = Math.atan2(dx, dz) * (180 / Math.PI);\n\n // First pass: calculate positions and visibility\n const visibleLabels: Array<{ name: string; label: HTMLDivElement; x: number; y: number }> = [];\n\n for (const [name, label] of this.labels) {\n const position = (label as any).__position as THREE.Vector3;\n if (!position) continue;\n\n // Update position based on current model transform\n const region = this.regions.find(a => a.name === name);\n if (region) {\n const newPos = this.getRegionCenter(region);\n if (newPos) {\n position.copy(newPos);\n }\n }\n\n // Project to screen space\n const screenPos = position.clone().project(this.camera);\n\n // Check if in front of camera\n if (screenPos.z > 1) {\n label.style.display = 'none';\n continue;\n }\n\n let visible = true;\n\n // For markers with a cameraAngle, only show when camera is viewing from approximately that angle\n // This ensures \"back\" marker only shows when viewing from behind\n if (region?.cameraAngle !== undefined && region.cameraAngle !== 0) {\n visible = passesMarkerCameraAngleGate({\n markerAngle: region.cameraAngle,\n currentCameraAngle: cameraAngle,\n });\n } else {\n // Dot product occlusion for front-facing markers\n const markerDirX = position.x - modelCenter.x;\n const markerDirY = position.y - modelCenter.y;\n const markerDirZ = position.z - modelCenter.z;\n\n // Dot product: positive = same side as camera, negative = opposite side\n const dot = markerDirX * cameraDirX + markerDirY * cameraDirY + markerDirZ * cameraDirZ;\n visible = dot > -0.01;\n }\n\n if (!visible) {\n label.style.display = 'none';\n continue;\n }\n\n label.style.display = 'flex';\n\n // Convert to CSS coordinates\n const x = (screenPos.x * 0.5 + 0.5) * rect.width;\n const y = (-screenPos.y * 0.5 + 0.5) * rect.height;\n\n visibleLabels.push({ name, label, x, y });\n }\n\n // Second pass: spread overlapping labels vertically and horizontally\n const labelHeight = 24; // Approximate label height\n const labelWidth = 80; // Approximate label width\n const minVerticalGap = 8;\n const minHorizontalGap = 10;\n\n // Sort by Y position (top to bottom) then by X (left to right)\n visibleLabels.sort((a, b) => a.y - b.y || a.x - b.x);\n\n // Check for overlaps and spread labels apart\n for (let i = 0; i < visibleLabels.length; i++) {\n for (let j = i + 1; j < visibleLabels.length; j++) {\n const a = visibleLabels[i];\n const b = visibleLabels[j];\n\n const dx = Math.abs(a.x - b.x);\n const dy = Math.abs(a.y - b.y);\n\n // Check if labels overlap (within bounding box)\n if (dx < labelWidth && dy < labelHeight + minVerticalGap) {\n // Labels overlap - spread them apart\n const overlapY = (labelHeight + minVerticalGap) - dy;\n const overlapX = (labelWidth + minHorizontalGap) - dx;\n\n // Prefer vertical spreading, but also spread horizontally if needed\n if (overlapY > 0) {\n // Spread vertically: move upper label up, lower label down\n const spreadY = overlapY / 2 + minVerticalGap;\n if (a.y < b.y) {\n a.y -= spreadY;\n b.y += spreadY;\n } else {\n a.y += spreadY;\n b.y -= spreadY;\n }\n }\n\n // If still horizontally close, also spread horizontally\n if (dx < labelWidth * 0.5 && overlapX > 0) {\n const spreadX = overlapX / 2 + minHorizontalGap;\n if (a.x < b.x) {\n a.x -= spreadX * 0.3;\n b.x += spreadX * 0.3;\n } else {\n a.x += spreadX * 0.3;\n b.x -= spreadX * 0.3;\n }\n }\n }\n }\n }\n\n // Apply final positions\n for (const { label, x, y } of visibleLabels) {\n label.style.left = `${x}px`;\n label.style.top = `${y}px`;\n }\n }\n\n /**\n * Show/hide all markers\n */\n setVisible(visible: boolean): void {\n this.labelsContainer.style.display = visible ? 'block' : 'none';\n }\n\n /**\n * Clear all markers\n */\n clear(): void {\n for (const label of this.labels.values()) {\n label.remove();\n }\n this.labels.clear();\n this.markers.clear();\n }\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n this.domElement.removeEventListener('click', this.onClick);\n this.clear();\n this.labelsContainer.remove();\n }\n}\n","import type { DPthreeCameraController } from './DPthreeCameraController';\nimport type { MarkerStyle } from './types';\n\nexport const DEFAULT_MARKER_AUTO_HIDE_MS = 5_000;\nconst INTRO_MARKER_REVEAL_DELAY_MS = 4_500;\nconst POST_LOAD_MARKER_REVEAL_DELAY_MS = 120;\n\nexport type MarkerLifecycleRevealOptions = {\n durationMs?: number;\n markerStyle?: MarkerStyle;\n revealDelayMs?: number;\n};\n\nexport type MarkerLifecycleRevealSource = {\n markerStyle?: MarkerStyle;\n playIntroOnLoad?: boolean;\n};\n\ntype MarkerLifecycleController = Pick<DPthreeCameraController, 'setMarkersVisible' | 'setMarkerStyle'>;\n\nexport function createMarkerLifecycleRevealOptions(\n config: MarkerLifecycleRevealSource | null | undefined,\n): MarkerLifecycleRevealOptions {\n return {\n markerStyle: config?.markerStyle ?? '3d',\n revealDelayMs: config?.playIntroOnLoad ? INTRO_MARKER_REVEAL_DELAY_MS : POST_LOAD_MARKER_REVEAL_DELAY_MS,\n };\n}\n\nexport function createMarkerVisibilityLifecycle(\n getController: () => MarkerLifecycleController | null,\n defaultDurationMs = DEFAULT_MARKER_AUTO_HIDE_MS,\n) {\n let revealTimer: ReturnType<typeof setTimeout> | null = null;\n let autoHideTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearTimers = () => {\n if (revealTimer) {\n clearTimeout(revealTimer);\n revealTimer = null;\n }\n\n if (autoHideTimer) {\n clearTimeout(autoHideTimer);\n autoHideTimer = null;\n }\n };\n\n return {\n setManualVisibility(visible: boolean): void {\n clearTimers();\n getController()?.setMarkersVisible(visible);\n },\n\n prepareForCharacterLoad(): void {\n clearTimers();\n getController()?.setMarkersVisible(false);\n },\n\n showForCharacterLoad(options: MarkerLifecycleRevealOptions = {}): void {\n clearTimers();\n\n const controller = getController();\n if (!controller) return;\n\n const reveal = () => {\n revealTimer = null;\n\n if (getController() !== controller) {\n return;\n }\n\n controller.setMarkerStyle(options.markerStyle ?? '3d');\n controller.setMarkersVisible(true);\n\n autoHideTimer = setTimeout(() => {\n autoHideTimer = null;\n\n if (getController() !== controller) {\n return;\n }\n\n controller.setMarkersVisible(false);\n }, options.durationMs ?? defaultDurationMs);\n };\n\n if (options.revealDelayMs && options.revealDelayMs > 0) {\n revealTimer = setTimeout(reveal, options.revealDelayMs);\n return;\n }\n\n reveal();\n },\n\n dispose(): void {\n clearTimers();\n },\n };\n}\n","export const DEFAULT_PREVIEW_AUTO_CLEAR_MS = 1200;\n\nexport interface RuntimeAnnotationPreviewLifecycleOptions {\n getDisabled?: () => boolean;\n getAutoClearMs?: () => number | undefined;\n onPreviewStart?: () => void;\n onPreviewEnd?: () => void;\n}\n\n/** Framework-independent annotation preview lifetime; hosts supply input events. */\nexport function createRuntimeAnnotationPreviewLifecycle(options: RuntimeAnnotationPreviewLifecycleOptions) {\n let active = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const clearTimer = () => { if (timer !== null) clearTimeout(timer); timer = null; };\n const end = () => {\n clearTimer();\n if (!active) return;\n active = false;\n options.onPreviewEnd?.();\n };\n const scheduleEnd = () => {\n clearTimer();\n const duration = options.getAutoClearMs?.() ?? DEFAULT_PREVIEW_AUTO_CLEAR_MS;\n if (duration <= 0 || !active) return;\n timer = setTimeout(end, duration);\n };\n return {\n start(forceRefresh = false) {\n if (options.getDisabled?.()) return;\n const wasActive = active;\n active = true;\n if (!wasActive || forceRefresh) options.onPreviewStart?.();\n scheduleEnd();\n },\n end,\n scheduleEnd,\n isActive: () => active,\n dispose: end,\n };\n}\n","import type { RuntimeAnnotationSide } from './types';\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((entry) => typeof entry === 'string' && entry.trim() ? [entry.trim()] : []);\n}\n\nfunction inferSideFromText(value: string): RuntimeAnnotationSide | undefined {\n const normalized = value\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase();\n const tokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const hasLeft = tokens.includes('left') || tokens.includes('l');\n const hasRight = tokens.includes('right') || tokens.includes('r');\n\n if (hasLeft === hasRight) return undefined;\n return hasLeft ? 'left' : 'right';\n}\n\nfunction addSide(sides: Set<RuntimeAnnotationSide>, side: unknown): void {\n if (side === 'left' || side === 'right' || side === 'center') {\n sides.add(side);\n }\n}\n\nexport function inferRuntimeAnnotationPreviewSide(\n auId: number,\n profile: { auToMorphs?: unknown; auToBones?: unknown } | null | undefined,\n): RuntimeAnnotationSide | undefined {\n if (!profile) return undefined;\n\n const auKey = String(auId);\n const sides = new Set<RuntimeAnnotationSide>();\n const profileRecord = profile as unknown as Record<string, unknown>;\n const auToMorphs = isPlainRecord(profileRecord.auToMorphs) ? profileRecord.auToMorphs : {};\n const auToBones = isPlainRecord(profileRecord.auToBones) ? profileRecord.auToBones : {};\n const morphMapping = auToMorphs[auKey];\n\n if (isPlainRecord(morphMapping)) {\n if (readStringArray(morphMapping.left).length > 0) sides.add('left');\n if (readStringArray(morphMapping.right).length > 0) sides.add('right');\n if (readStringArray(morphMapping.center).length > 0) sides.add('center');\n } else {\n for (const morphName of readStringArray(morphMapping)) {\n addSide(sides, inferSideFromText(morphName));\n }\n }\n\n const boneBindings = auToBones[auKey];\n if (Array.isArray(boneBindings)) {\n for (const binding of boneBindings) {\n if (typeof binding === 'string') {\n addSide(sides, inferSideFromText(binding));\n } else if (isPlainRecord(binding)) {\n addSide(sides, binding.side);\n const name = binding.node ?? binding.boneName ?? binding.bone ?? binding.name;\n if (typeof name === 'string') {\n addSide(sides, inferSideFromText(name));\n }\n }\n }\n }\n\n const lateralSides = [...sides].filter((side) => side === 'left' || side === 'right');\n if (lateralSides.length === 1) return lateralSides[0];\n if (lateralSides.length > 1) return undefined;\n return sides.has('center') ? 'center' : undefined;\n}\n\n/**\n * Pick which continuum AU to annotate. While a drag gesture is sticky, keep\n * the original side so crossing 0 does not rebuild runtime markers mid-drag.\n */\nexport function pickContinuumAnnotationAuId(\n value: number,\n negId: number,\n posId: number,\n stickyId: number | null,\n): number {\n if (stickyId === negId || stickyId === posId) {\n return stickyId;\n }\n if (value < 0) return negId;\n if (value > 0) return posId;\n return negId;\n}\n","import type { AnimationClip, Mesh, Object3D } from 'three';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { requireInitializedEmbodyCore, CC4_HUMANOID_SKELETON_TEMPLATE, HUMANOID_SKELETON_TEMPLATES, DEFAULT_HAIR_COLOR_APPEARANCE } from '@lovelace_lol/embody/wasm';\nimport { ThreeModelInspector, serializeAnimationClips } from './index';\nimport type { Region } from './annotations/types';\nimport type * as Types from './authoringTypes';\n\nexport * from './authoringTypes';\nexport { resolveBoneNames, fuzzyNameMatch } from './annotations/adapter';\nexport {\n DEFAULT_AXIS_TO_CHANNEL, DEFAULT_BONE_MAX_DEGREES, JOINT_CONTROL_SECTION,\n VISEME_KEYS, HAIR_COLOR_PRESETS, DEFAULT_HAIR_COLOR_APPEARANCE,\n HUMANOID_SKELETON_TEMPLATES, CC4_HUMANOID_SKELETON_TEMPLATE,\n} from '@lovelace_lol/embody/wasm';\n\nconst json = (value: unknown) => JSON.stringify(value ?? {});\nfunction request<T>(op: string, payload: unknown = {}): T {\n return JSON.parse(requireInitializedEmbodyCore().embody_request(json({ op, payload }))) as T;\n}\n\nexport const getPreset = (id: Types.PresetType): Types.Profile => request('preset.get', { id });\nexport const extendCharacterConfigWithPreset = <T extends Types.ProfileRuntimeConfig>(config: T): T => request('profile.extendConfig', { config });\nexport const extractProfileOverrides = (config: Types.ProfileRuntimeConfig): Partial<Types.Profile> => request('profile.extractOverrides', { config });\nexport const mergeCharacterRegionsByName = (base?: Region[], override?: Region[]): Region[] => request('profile.mergeRegions', { base, override });\nexport const getMeshNamesForAUProfile = (profile: Types.Profile, auId: number): string[] => request('profile.getMeshNamesForAU', { profile, auId });\nexport const getHumanoidSpecification = (): Types.HumanoidSpecification => request('humanoid.getSpecification');\nexport const setAUMorphTargets = (profile: Types.Profile, auId: number, side: 'left' | 'right' | 'center', targets: Types.MorphTargetRef[]): Types.Profile => request('profile.setAUMorphTargets', { profile, auId, side, targets });\nexport const setHumanoidRoleBinding = (profile: Types.Profile, role: Types.VRMHumanoidRole, boneName: string | null): Types.Profile => request('profile.setHumanoidRoleBinding', { profile, role, boneName });\nexport const resolveHumanoidCharacterization = (profile: Types.Profile): Types.HumanoidCharacterizationResolution => request('profile.resolveHumanoidCharacterization', { profile });\n\nexport const hasLeftRightMorphs = (profile: Types.Profile, auId: number): boolean => request('profile.hasLeftRightMorphs', { profile, auId });\nexport const isMixedAU = (profile: Types.Profile, auId: number): boolean => request('profile.isMixedAU', { profile, auId });\nexport const resolveVisemeProfile = (profile: Partial<Types.Profile>): Types.ResolvedVisemeProfile => request('profile.resolveVisemes', { profile });\n\nexport const isMaxDegreesOnlyAxisBindingUpdate = (update: Types.BoneAxisBindingUpdate): boolean => request('bone.isMaxDegreesOnlyUpdate', { update });\nexport const findNodeKeyForBone = (boneName: string, profile: Types.Profile | null): string | null => profile ? request('bone.findNodeKey', { profile, boneName }) : null;\nexport const ensureBoneNodeKey = (profile: Types.Profile, boneName: string): { nodeKey: string; boneNodes: Record<string, string> } => request('bone.ensureNodeKey', { profile, boneName });\nexport const ensureBilateralBoneNodeKeys = (profile: Types.Profile, leftBoneName: string, rightBoneName: string): Types.Profile => request('bone.ensureBilateralNodeKeys', { profile, leftBoneName, rightBoneName });\nexport const resolveBoneNameForNodeKey = (profile: Types.Profile, nodeKey: string): string | null => request('bone.resolveBoneName', { profile, nodeKey });\nexport const stripConfiguredBoneAffixes = (profile: Pick<Types.Profile, 'bonePrefix' | 'boneSuffix'> | null | undefined, boneName: string): string => request('bone.stripAffixes', { profile: profile ?? {}, boneName });\nexport const inferChiralBoneNamePair = (boneNames: string[], selectedBoneName: string): Types.ChiralBoneNamePair | null => request('bone.inferChiralPair', { boneNames, selectedBoneName });\nexport const formatAxisLabel = (axis: Types.BoneAxisKey): string => request('bone.formatAxisLabel', { axis });\nexport const formatAxisDirectionLabel = (axis: Types.BoneAxisKey, direction: Types.BoneAxisDirection): string => request('bone.formatDirectionLabel', { axis, direction });\nexport const getAxisFromChannel = (channel?: string): Types.BoneAxisKey | null => channel ? request('bone.getAxisFromChannel', { channel }) : null;\nexport const getBoneAxisBindingState = (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey): Types.BoneAxisBindingState | null => request('bone.getAxisState', { profile, boneName, axis });\nexport const resolveBoneAxisChannel = (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey): Types.RotationChannel => request('bone.resolveAxisChannel', { profile, boneName, axis });\nexport const getBilateralAxisBindingState = (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey): Types.BilateralAxisBindingState | null => request('bone.getBilateralAxisState', { profile, boneName, axis });\nexport const getAUBoneBindingState = (profile: Types.Profile, auId: number): Types.AUBoneBindingState => request('bone.getAUBindingState', { profile, auId });\nexport const inferEyeControlScope = (profile: Pick<Types.Profile, 'auToBones'>, binding: Pick<Types.BoneAxisBindingState, 'nodeKey' | 'negativeAuId' | 'positiveAuId'>): Types.BoneControlScope | null => request('bone.inferEyeScope', { profile, binding });\nexport const inferEyeControlFamily = (binding: Pick<Types.BoneAxisBindingState, 'nodeKey' | 'axis'>): Types.BoneControlFamily | null => request('bone.inferEyeFamily', { binding });\nexport const applyBoneAxisBindingUpdate = (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey, update: Types.BoneAxisBindingUpdate): Types.Profile => request('bone.applyAxisUpdate', { profile, boneName, axis, update });\nexport const applyBilateralAxisBindingUpdate = (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey, scope: Types.BilateralBoneAxisScope, update: Types.BoneAxisBindingUpdate): Types.Profile => request('bone.applyBilateralAxisUpdate', { profile, boneName, axis, scope, update });\nexport const applyAUBoneBindingUpdate = (profile: Types.Profile, auId: number, update: { boneName: string | null; axis: Types.BoneAxisKey; direction: Types.BoneAxisDirection; maxDegrees: number | null }): Types.Profile => request('bone.applyAUBindingUpdate', { profile, auId, update });\nexport const createBoneAxisAu = (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey, direction: Types.BoneAxisDirection, options: { name?: string } = {}): Types.CreatedBoneAxisAu => request('bone.createAxisAU', { profile, boneName, axis, direction, name: options.name });\nexport const createBilateralBoneAxisAu = (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey, scope: Types.BilateralBoneAxisScope, direction: Types.BoneAxisDirection, options: { name?: string } = {}): Types.CreatedBoneAxisAu => request('bone.createBilateralAxisAU', { profile, boneName, axis, scope, direction, name: options.name });\nexport const buildBoneAuOptions = (profile: Types.Profile): Array<{ value: string; label: string; detail?: string }> => request('bone.buildAUOptions', { profile });\nexport const isJointControlAuInfo = (info?: Pick<Types.AUInfo, 'facePart'> | null): boolean => request('bone.isJointControlInfo', { info });\nexport const classifyAuAsJointControl = (profile: Types.Profile, auId: number, options: { boneName?: string | null; nodeKey?: string | null } = {}): Types.Profile => request('bone.classifyJointControl', { profile, auId, boneName: options.boneName, nodeKey: options.nodeKey });\nexport const resolveContinuumDisplayLabel = (profile: Pick<Types.Profile, 'continuumPairs' | 'continuumLabels' | 'auInfo' | 'boneNodes' | 'bonePrefix' | 'boneSuffix'>, negativeAuId: number, positiveAuId: number): string => request<string | null>('bone.resolveContinuumLabel', { profile, negativeAuId, positiveAuId }) ?? `AU ${negativeAuId} <-> AU ${positiveAuId}`;\n\nfunction inspectModel(model: Object3D, meshes?: Mesh[], profile?: Types.Profile) {\n return new ThreeModelInspector().inspectModel(model, { meshes, profile });\n}\nexport function getBodyControls(profile: Types.Profile, model?: Object3D): Types.BodyControlDescriptor[] {\n return request('profile.getBodyControls', { profile, ...(model ? { model: inspectModel(model, undefined, profile).descriptor } : {}) });\n}\nexport function extractModelData(model: Object3D, meshes?: Mesh[], animations: AnimationClip[] = []): Types.ModelData {\n const inspection = inspectModel(model, meshes);\n return JSON.parse(requireInitializedEmbodyCore().extract_model_data_json(json(inspection.descriptor), json(serializeAnimationClips(model, animations, inspection))));\n}\nexport async function analyzeModel(options: {\n source: { type: 'gltf'; gltf: GLTF } | { type: 'runtime'; model: Object3D; meshes?: Mesh[]; animations?: AnimationClip[] };\n preset?: Types.Profile; suggestCorrections?: boolean;\n}): Promise<Types.ModelAnalysisReport> {\n const source = options.source;\n const model = source.type === 'gltf' ? source.gltf.scene ?? source.gltf.scenes[0] : source.model;\n const animations = source.type === 'gltf' ? source.gltf.animations : source.animations ?? [];\n const inspection = inspectModel(model, source.type === 'runtime' ? source.meshes : undefined);\n return JSON.parse(requireInitializedEmbodyCore().analyze_model_descriptor(json(inspection.descriptor), json(serializeAnimationClips(model, animations, inspection)), options.preset ? json(options.preset) : '', json({ suggestCorrections: Boolean(options.suggestCorrections) })));\n}\ntype ValidationMesh = { name?: string; morphTargetDictionary?: Record<string, number>; geometry?: { morphTargetDictionary?: Record<string, number> } };\nexport function validateMappings(meshes: unknown[], skeleton: unknown, profile: Types.Profile, options: Record<string, unknown> = {}): Types.ValidationResult {\n let nextMorphId = 1;\n const morphTargets: Array<{ id: number; meshId: number; name: string; hostIndex: number }> = [];\n const descriptorMeshes = (meshes ?? []).map((value, index) => {\n const mesh = value as ValidationMesh;\n const id = index + 1;\n const morphTargetIds = Object.entries(mesh.morphTargetDictionary ?? mesh.geometry?.morphTargetDictionary ?? {}).map(([name, hostIndex]) => {\n const morphId = nextMorphId++;\n morphTargets.push({ id: morphId, meshId: id, name, hostIndex });\n return morphId;\n });\n return { id, name: mesh.name ?? '', morphTargetIds, visible: true };\n });\n const bones = ((skeleton as { bones?: Array<string | { name?: string }> } | null)?.bones ?? []).map((bone, index) => ({ id: index + 1, name: typeof bone === 'string' ? bone : bone.name ?? '' }));\n return JSON.parse(requireInitializedEmbodyCore().validate_profile_model(json(profile), json({ meshes: descriptorMeshes, morphTargets, bones, objects: [] }), json(options)));\n}\nexport function validateHumanoidCharacterization(model: Object3D, profile: Types.Profile): Types.HumanoidCharacterizationResolution {\n return JSON.parse(requireInitializedEmbodyCore().validate_humanoid_characterization(json(profile), json(inspectModel(model, undefined, profile).descriptor)));\n}\nexport function normalizeHairColorAppearance(value: Types.HairColorAppearance | string, fallback: Types.HairColorAppearance = DEFAULT_HAIR_COLOR_APPEARANCE): Types.HairColorAppearance {\n return JSON.parse(requireInitializedEmbodyCore().normalize_hair_color_appearance_json(json(value), json(fallback)));\n}\nexport const getHumanoidSkeletonTemplate = (id: string): Types.HumanoidSkeletonTemplate | null => (HUMANOID_SKELETON_TEMPLATES.find(template => template.id === id) ?? null) as unknown as Types.HumanoidSkeletonTemplate | null;\nexport function getHumanoidSkeletonTemplateBoneNames(template: Types.HumanoidSkeletonTemplate = CC4_HUMANOID_SKELETON_TEMPLATE as unknown as Types.HumanoidSkeletonTemplate): string[] {\n return JSON.parse(requireInitializedEmbodyCore().humanoid_skeleton_template_bone_names(json(template)));\n}\nexport function createValidationSkeletonFromHumanoidTemplate(template: Types.HumanoidSkeletonTemplate = CC4_HUMANOID_SKELETON_TEMPLATE as unknown as Types.HumanoidSkeletonTemplate): { bones: Array<{ name: string }> } {\n return JSON.parse(requireInitializedEmbodyCore().create_validation_skeleton_json(json(template)));\n}\nexport function computeHumanoidSkeletonTemplateRestBounds(template: Types.HumanoidSkeletonTemplate): Types.HumanoidSkeletonTemplateBounds {\n return Array.from(requireInitializedEmbodyCore().compute_humanoid_skeleton_template_rest_bounds(json(template))) as unknown as Types.HumanoidSkeletonTemplateBounds;\n}\nexport function extractHumanoidSkeletonTemplateFromModel(model: Object3D, options: { id: string; sourceCharacterId: string; sourceAsset?: string; sourceSkinName?: string }): Types.HumanoidSkeletonTemplate {\n return JSON.parse(requireInitializedEmbodyCore().extract_humanoid_skeleton_template_json(json(inspectModel(model).descriptor), json(options)));\n}\n","import { Matrix4, Quaternion, Vector3 } from 'three';\nimport type { Object3D } from 'three';\n\ntype ReferenceVector3 = Readonly<{ x: number; y: number; z: number }>;\ntype ReferenceQuaternion = Readonly<{ x: number; y: number; z: number; w: number }>;\n\nexport type ThreeReferencePoseNode = Readonly<{\n /** Child-index path relative to the captured model. The model itself has path ''. */\n path: string;\n parentPath: string | null;\n name: string;\n type: string;\n isBone: boolean;\n rotationOrder: Object3D['rotation']['order'];\n /** Authored Euler values for automatic TRS, including rotations beyond one turn. */\n rotationEuler?: ReferenceVector3;\n childCount: number;\n /** For manual matrices, this is a decomposition; matrices remain authoritative for shear. */\n transform: Readonly<{\n position: ReferenceVector3;\n rotation: ReferenceQuaternion;\n scale: ReferenceVector3;\n }>;\n /** Column-major local and world matrices, including shear and non-bone ancestors. */\n localMatrix: readonly number[];\n worldMatrix: readonly number[];\n worldPosition: ReferenceVector3;\n /** Optional morph baseline captured independently from later live influences. */\n morphInfluences?: readonly number[];\n}>;\n\nexport type ThreeModelReferencePose = Readonly<{\n version: 1;\n /** Captured transform above the model root; identity for an unparented model. */\n parentWorldMatrix: readonly number[];\n nodes: readonly ThreeReferencePoseNode[];\n}>;\n\nconst isBone = (object: Object3D) => !!((object as Object3D & { isBone?: boolean }).isBone || object.type === 'Bone');\n\nconst finite = (values: readonly number[], description: string) => {\n if (!values.every(Number.isFinite)) {\n throw new Error(`Cannot capture reference pose: ${description} contains non-finite values`);\n }\n};\n\nconst matrixValues = (matrix: Matrix4, description: string): readonly number[] => {\n const values = matrix.elements.slice();\n finite(values, description);\n return Object.freeze(values);\n};\n\nconst localMatrix = (object: Object3D) => object.matrixAutoUpdate\n ? new Matrix4().compose(object.position, object.quaternion, object.scale)\n : object.matrix.clone();\n\nconst referenceTransform = (object: Object3D, matrix: Matrix4): ThreeReferencePoseNode['transform'] => {\n // Manual matrices can contain shear that TRS cannot represent exactly. Retain the\n // original matrix independently and expose a decomposition only for TRS consumers.\n const position = object.matrixAutoUpdate ? object.position : new Vector3();\n const rotation = object.matrixAutoUpdate ? object.quaternion : new Quaternion();\n const scale = object.matrixAutoUpdate ? object.scale : new Vector3();\n if (!object.matrixAutoUpdate) {\n // r184 substitutes identity TRS for singular matrices. Keep rejecting a\n // missing basis axis instead of inventing its authored rotation and scale.\n const elements = matrix.elements;\n if ([0, 4, 8].some((start) => Math.hypot(elements[start], elements[start + 1], elements[start + 2]) === 0)) {\n throw new Error(`Cannot capture reference pose: manual transform for ${JSON.stringify(object.name)} has a zero-length basis axis`);\n }\n matrix.decompose(position, rotation, scale);\n }\n finite([...position.toArray(), ...rotation.toArray(), ...scale.toArray()], `transform for ${JSON.stringify(object.name)}`);\n return Object.freeze({\n position: Object.freeze({ x: position.x, y: position.y, z: position.z }),\n rotation: Object.freeze({ x: rotation.x, y: rotation.y, z: rotation.z, w: rotation.w }),\n scale: Object.freeze({ x: scale.x, y: scale.y, z: scale.z }),\n });\n};\n\nconst captureSubtree = (\n object: Object3D,\n path: string,\n parentPath: string | null,\n parentMatrix: Matrix4,\n nodes: ThreeReferencePoseNode[],\n) => {\n const local = localMatrix(object);\n const localValues = matrixValues(local, `local matrix at ${JSON.stringify(path)}`);\n const world = new Matrix4().multiplyMatrices(parentMatrix, local);\n const worldValues = matrixValues(world, `world matrix at ${JSON.stringify(path)}`);\n const influences = (object as Object3D & { morphTargetInfluences?: readonly number[] }).morphTargetInfluences;\n const morphInfluences = influences === undefined ? undefined : Array.from(influences);\n if (morphInfluences) finite(morphInfluences, `morph influences at ${JSON.stringify(path)}`);\n const rotationEuler = object.matrixAutoUpdate\n ? { x: object.rotation.x, y: object.rotation.y, z: object.rotation.z }\n : undefined;\n if (rotationEuler) finite(Object.values(rotationEuler), `Euler rotation at ${JSON.stringify(path)}`);\n nodes.push(Object.freeze({\n path,\n parentPath,\n name: object.name,\n type: object.type,\n isBone: isBone(object),\n rotationOrder: object.rotation.order,\n ...(rotationEuler ? { rotationEuler: Object.freeze(rotationEuler) } : {}),\n childCount: object.children.length,\n transform: referenceTransform(object, local),\n localMatrix: localValues,\n worldMatrix: worldValues,\n worldPosition: Object.freeze({ x: worldValues[12], y: worldValues[13], z: worldValues[14] }),\n ...(morphInfluences ? { morphInfluences: Object.freeze(morphInfluences) } : {}),\n }));\n object.children.forEach((child, index) => captureSubtree(child, `${path}/${index}`, path, world, nodes));\n};\n\nconst matchesNode = (object: Object3D, node: ThreeReferencePoseNode | undefined, path: string, parentPath: string | null) =>\n node !== undefined\n && node.path === path\n && node.parentPath === parentPath\n && node.name === object.name\n && node.type === object.type\n && node.isBone === isBone(object);\n\nconst incompatible = (object: Object3D, path: string) =>\n new Error(`Incompatible reference pose hierarchy at ${JSON.stringify(path)} (${JSON.stringify(object.name)})`);\n\n/**\n * Explicitly capture the authored reference pose before starting animation.\n * This does not infer a skin bind pose or animation frame zero: it snapshots the\n * transforms supplied by the caller, without updating or otherwise mutating the scene.\n * World matrices are calculated from the full ancestor chain's local transforms,\n * not potentially stale matrixWorld values. All returned data is deeply frozen and\n * JSON-serializable; no object, UUID, or live transform references are retained.\n * Existing morph influences are copied as an optional baseline. Non-finite data\n * or manual matrices with a zero-length basis axis/non-finite TRS decomposition throw.\n */\nexport function captureModelReferencePose(model: Object3D): ThreeModelReferencePose {\n const ancestors: Object3D[] = [];\n for (let ancestor = model.parent; ancestor; ancestor = ancestor.parent) ancestors.push(ancestor);\n const parentWorld = new Matrix4();\n for (const ancestor of ancestors.reverse()) parentWorld.multiply(localMatrix(ancestor));\n const parentWorldMatrix = matrixValues(parentWorld, 'parent world matrix');\n const nodes: ThreeReferencePoseNode[] = [];\n\n captureSubtree(model, '', null, parentWorld, nodes);\n return Object.freeze({ version: 1, parentWorldMatrix, nodes: Object.freeze(nodes) });\n}\n\n/**\n * Explicitly extend a reference after appending children, such as a generated\n * skeleton. Existing structural paths, names, kinds and child order must match;\n * removing or inserting before an existing child is incompatible. Existing\n * captured data remains unchanged except child counts. Newly appended subtrees\n * use their current local transforms beneath the CAPTURED parent world matrix,\n * so playback and later scene placement never become the old rig's reference.\n * Returns a new deeply frozen snapshot without mutating the model or previous\n * data. Identical sibling swaps cannot be distinguished by structural identity.\n */\nexport function extendModelReferencePose(\n model: Object3D,\n previous: ThreeModelReferencePose,\n): ThreeModelReferencePose {\n if (previous.version !== 1) throw new Error('Unsupported model reference pose version');\n const nodes: ThreeReferencePoseNode[] = [];\n let index = 0;\n const extend = (object: Object3D, path: string, parentPath: string | null) => {\n const node = previous.nodes[index++];\n if (!matchesNode(object, node, path, parentPath) || object.children.length < node.childCount) {\n throw incompatible(object, path);\n }\n // Copy even a deserialized snapshot into frozen data; never freeze or mutate\n // the caller's input, or reuse any current transform/morph values here.\n nodes.push(Object.freeze({\n ...node,\n childCount: object.children.length,\n transform: Object.freeze({\n position: Object.freeze({ ...node.transform.position }),\n rotation: Object.freeze({ ...node.transform.rotation }),\n scale: Object.freeze({ ...node.transform.scale }),\n }),\n localMatrix: Object.freeze([...node.localMatrix]),\n worldMatrix: Object.freeze([...node.worldMatrix]),\n worldPosition: Object.freeze({ ...node.worldPosition }),\n ...(node.rotationEuler ? { rotationEuler: Object.freeze({ ...node.rotationEuler }) } : {}),\n ...(node.morphInfluences ? { morphInfluences: Object.freeze([...node.morphInfluences]) } : {}),\n }));\n for (let childIndex = 0; childIndex < node.childCount; childIndex += 1) {\n extend(object.children[childIndex], `${path}/${childIndex}`, path);\n }\n const parentWorld = new Matrix4().fromArray(node.worldMatrix);\n for (let childIndex = node.childCount; childIndex < object.children.length; childIndex += 1) {\n captureSubtree(object.children[childIndex], `${path}/${childIndex}`, path, parentWorld, nodes);\n }\n };\n extend(model, '', null);\n if (index !== previous.nodes.length) throw new Error('Incompatible reference pose hierarchy: extra captured nodes');\n return Object.freeze({\n version: 1,\n parentWorldMatrix: Object.freeze([...previous.parentWorldMatrix]),\n nodes: Object.freeze(nodes),\n });\n}\n\n/**\n * Resolve captured data against an identically structured model, including a fresh\n * clone/load with new UUIDs. Names, types, bone flags, and child ordering must match;\n * duplicate names are distinguished by structural path, never name lookup.\n * Current transforms and the model's external scene parent are deliberately ignored.\n * An incompatible hierarchy throws before a binding map is returned.\n */\nexport function bindModelReferencePose(\n model: Object3D,\n referencePose: ThreeModelReferencePose,\n): ReadonlyMap<Object3D, ThreeReferencePoseNode> {\n if (referencePose.version !== 1) throw new Error('Unsupported model reference pose version');\n const bindings = new Map<Object3D, ThreeReferencePoseNode>();\n let index = 0;\n const bind = (object: Object3D, path: string, parentPath: string | null) => {\n const node = referencePose.nodes[index++];\n if (!matchesNode(object, node, path, parentPath) || node.childCount !== object.children.length) {\n throw incompatible(object, path);\n }\n bindings.set(object, node);\n object.children.forEach((child, childIndex) => bind(child, `${path}/${childIndex}`, path));\n };\n bind(model, '', null);\n if (index !== referencePose.nodes.length) throw new Error('Incompatible reference pose hierarchy: extra captured nodes');\n return bindings;\n}\n","import type { AnimationClip } from 'three';\nimport type { ClipIRTrack, ThreeModelInspection } from './index';\n\n/** One PropertyMixer cache key for every concrete renderer destination. */\nexport function concreteTrackName(target: ClipIRTrack['target'] | undefined, inspection: ThreeModelInspection): string | undefined {\n if (!target) return undefined;\n if (target.kind === 'morphTarget') {\n const binding = inspection.morphBindings.get(Number(target.morphTargetId));\n return binding && `${binding.mesh.uuid}.morphTargetInfluences[${binding.index}]`;\n }\n if (target.kind === 'boneTransform' || target.kind === 'objectTransform') {\n const object = target.kind === 'boneTransform'\n ? inspection.boneBindings.get(Number(target.boneId))\n : inspection.objectBindings.get(Number(target.objectId));\n const property = target.property ?? 'rotation';\n if (!object) return undefined;\n if (property === 'rotation' || property === 'quaternion') return `${object.uuid}.quaternion`;\n if (property === 'position' || property === 'scale') return `${object.uuid}.${property}`;\n }\n if (target.kind === 'meshVisibility') {\n const mesh = inspection.meshBindings.get(Number(target.meshId));\n return mesh && `${mesh.uuid}.visible`;\n }\n return undefined;\n}\n\n/** Retain authored samples and interpolants; normalize only cloned binding names. */\nexport function cloneWithConcreteTrackNames(clip: AnimationClip, tracks: readonly ClipIRTrack[], inspection: ThreeModelInspection): AnimationClip {\n const native = clip.clone();\n for (let index = 0; index < tracks.length; index += 1) {\n const name = concreteTrackName(tracks[index].target, inspection);\n if (!name) throw new Error('Every native playback track must resolve on the bound model.');\n native.tracks[index].name = name;\n }\n return native;\n}\n","import {\n AdditiveAnimationBlendMode,\n AnimationMixer,\n LoopOnce,\n LoopPingPong,\n LoopRepeat,\n NormalAnimationBlendMode,\n} from 'three';\nimport type { AnimationAction, AnimationClip, KeyframeTrack, Object3D } from 'three';\nimport type { NativePlaybackSession } from '../wasm/index';\nimport { createAnimationClipFromClipIR, serializeAnimationClips } from './index';\nimport type { ClipIR, ThreeModelInspection } from './index';\nimport { bindPlaybackRendering } from './playbackRendering';\nimport { cloneWithConcreteTrackNames } from './clipBindings';\n\nexport type ThreeNativeLoop = { mode: 'once' | 'repeat' | 'pingPong'; count?: number | null };\nexport type ThreeNativePlaybackOptions = {\n replace?: string;\n startSeconds?: number;\n speed?: number;\n /** Native contribution only; semantic intensity belongs in the compiled clip. */\n weight?: number;\n blendMode?: 'normal' | 'additive';\n loop?: ThreeNativeLoop;\n finalPose?: 'release' | 'hold';\n};\nexport type ThreeNativePlaybackControl =\n | { type: 'pause' | 'resume' | 'stop' }\n | { type: 'seek'; seconds: number }\n | { type: 'setSpeed'; speed: number }\n | { type: 'setWeight'; weight: number }\n | { type: 'setBlendMode'; blendMode: 'normal' | 'additive' }\n | { type: 'setLoop'; loop: ThreeNativeLoop }\n | { type: 'setFinalPose'; finalPose: 'release' | 'hold' }\n | { type: 'fadeIn' | 'fadeOut'; seconds: number };\nexport type ThreeNativePlaybackEvent =\n | { type: 'completed'; handle: string }\n | { type: 'cancelled'; handle: string; reason: string }\n | { type: 'error'; handle: string; message: string };\nexport type ThreeNativePlaybackBinding = {\n model: Object3D;\n inspection: ThreeModelInspection;\n /** Optional existing native mixer. Otherwise the connector owns one. */\n mixer?: AnimationMixer;\n};\ntype BoundPlayback = ThreeNativePlaybackBinding & { mixer: AnimationMixer };\n\ntype Settings = Required<Omit<ThreeNativePlaybackOptions, 'replace'>>;\ntype Command =\n | { type: 'play'; handle: string; clip: ClipIR; settings: Settings }\n | { type: 'replaceClip'; handle: string; clip: ClipIR }\n | { type: 'control'; handle: string; control: ThreeNativePlaybackControl }\n | { type: 'release'; handle: string };\ntype Batch = { handle?: string; commands: Command[]; events: ThreeNativePlaybackEvent[] };\ntype NativeNotification = { type: 'completed' | 'cancelled' | 'error'; handle: string; message?: string };\ntype PausedFade = { seconds: number; from: number; to: number; weight: number };\ntype Resource = { clip: AnimationClip; action?: AnimationAction; binding: BoundPlayback; fadingOut?: boolean; pausedFade?: PausedFade; explicitlyPaused?: boolean; suspendedPaused?: boolean };\ntype PendingBatch = { batch: Batch; nextCommand: number; clip?: AnimationClip; afterCommands?: () => void };\ntype NativeInterpolant = { resultBuffer: unknown; settings?: unknown; valueSize: number };\ntype NativeTrack = KeyframeTrack & { createInterpolant: ((buffer: unknown) => NativeInterpolant) & { isInterpolantFactoryMethodGLTFCubicSpline?: boolean } };\ntype FadeInterpolant = { parameterPositions: ArrayLike<number>; sampleValues: { [index: number]: number }; evaluate(time: number): ArrayLike<number> };\ntype EditableAction = AnimationAction & { _interpolants: NativeInterpolant[]; _interpolantSettings: unknown; _weightInterpolant: FadeInterpolant | null };\nconst sampleSize = (track: KeyframeTrack) => track.getValueSize() / ((track as NativeTrack).createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ? 3 : 1);\n\nconst asError = (error: unknown): Error => error instanceof Error ? error : new Error(String(error));\nconst blendMode = (mode: 'normal' | 'additive') => mode === 'additive' ? AdditiveAnimationBlendMode : NormalAnimationBlendMode;\nconst loopMode = (mode: ThreeNativeLoop['mode']) => mode === 'once' ? LoopOnce : mode === 'repeat' ? LoopRepeat : LoopPingPong;\n\nfunction validateBinding(binding: ThreeNativePlaybackBinding): void {\n if (!binding.model?.isObject3D || (binding.mixer && binding.mixer.getRoot() !== binding.model)) {\n throw new Error('Native playback requires a Three model and its render integration mixer.');\n }\n const objects = new Set<Object3D>();\n binding.model.traverse((object) => objects.add(object));\n const { inspection } = binding;\n for (const object of [\n ...inspection.meshBindings.values(), ...inspection.boneBindings.values(),\n ...inspection.objectBindings.values(), ...Array.from(inspection.morphBindings.values(), (entry) => entry.mesh),\n ]) {\n if (!objects.has(object)) throw new Error('Native playback inspection contains an object outside the bound model.');\n }\n}\n\n/**\n * Execute validated Rust commands on the native mixer. There is no\n * clock or update API. Each play owns a unique clip/action; other mixer users\n * remain untouched by stop, replacement, rebind and disposal.\n *\n * The connector owns the supplied Wasm session and frees it after successful\n * disposal. A failed release retains ownership and can be retried by dispose.\n */\nexport class ThreeNativePlaybackConnector {\n private binding: BoundPlayback;\n private rendering: ReturnType<typeof bindPlaybackRendering>;\n private renderingEnabled = true;\n private readonly resources = new Map<string, Resource>();\n private readonly actionHandles = new Map<AnimationAction, string>();\n private readonly listeners = new Set<(event: ThreeNativePlaybackEvent) => void>();\n private readonly pending: PendingBatch[] = [];\n private readonly notifications: NativeNotification[] = [];\n private depth = 0;\n private flushingNotifications = false;\n private notificationScheduled = false;\n private sessionDisposed = false;\n private disposed = false;\n private readonly onError?: (error: Error) => void;\n private readonly onRelease?: (handle: string) => void;\n\n constructor(\n private readonly session: NativePlaybackSession,\n binding: ThreeNativePlaybackBinding & { onError?: (error: Error) => void; onRelease?: (handle: string) => void },\n ) {\n validateBinding(binding);\n this.binding = { ...binding, mixer: binding.mixer ?? new AnimationMixer(binding.model) };\n this.onError = binding.onError;\n this.onRelease = binding.onRelease;\n this.binding.mixer.addEventListener('finished', this.finished);\n this.rendering = bindPlaybackRendering(binding.model, this.binding.mixer, () => this.flushEvents());\n }\n\n /** Prepare bindings first; old actions are released before the new binding is exposed. */\n rebind(modelKey: string, profileKey: string, binding: ThreeNativePlaybackBinding = this.binding): void {\n validateBinding(binding);\n this.beforeOperation();\n this.dispatch(this.session.rebind(modelKey, profileKey), undefined, () => {\n this.binding.mixer.removeEventListener('finished', this.finished);\n this.rendering.dispose();\n this.binding = { ...binding, mixer: binding.mixer ?? new AnimationMixer(binding.model) };\n this.binding.mixer.addEventListener('finished', this.finished);\n this.rendering = bindPlaybackRendering(binding.model, this.binding.mixer, () => this.flushEvents());\n this.rendering.setEnabled(this.renderingEnabled);\n });\n }\n\n play(clip: ClipIR, options: ThreeNativePlaybackOptions = {}): string {\n this.beforeOperation();\n const native = createAnimationClipFromClipIR(clip, this.binding.inspection);\n if (native.tracks.length !== clip.tracks.length) {\n throw new Error('Every playback track must resolve on the bound model.');\n }\n return this.dispatch(this.session.play(JSON.stringify(clip), JSON.stringify(options)), native).handle!;\n }\n\n /**\n * Validate native track bindings through the existing serializer, then retain\n * the native clone's interpolants and authored/additive sample values. Concrete\n * binding names match compiled tracks so Three shares their PropertyMixer.\n */\n playNativeClip(clip: AnimationClip, options: ThreeNativePlaybackOptions = {}): string {\n this.beforeOperation();\n const [ir] = serializeAnimationClips(this.binding.model, [clip], this.binding.inspection);\n if (ir.tracks.length !== clip.tracks.length) {\n throw new Error('Every native playback track must serialize against the bound model.');\n }\n const native = cloneWithConcreteTrackNames(clip, ir.tracks, this.binding.inspection);\n const settings = {\n ...options,\n blendMode: options.blendMode ?? (clip.blendMode === AdditiveAnimationBlendMode ? 'additive' : 'normal'),\n };\n return this.dispatch(this.session.play(JSON.stringify(ir), JSON.stringify(settings)), native).handle!;\n }\n\n control(handle: string, control: ThreeNativePlaybackControl): void {\n this.beforeOperation();\n this.dispatch(this.session.control(handle, JSON.stringify(control)));\n }\n\n setRendering(enabled: boolean): void {\n this.beforeOperation();\n if (enabled === this.renderingEnabled) return;\n this.renderingEnabled = enabled;\n this.rendering.setEnabled(enabled);\n for (const resource of this.resources.values()) {\n if (!resource.action) continue;\n if (!enabled) {\n resource.suspendedPaused = resource.action.paused;\n this.pauseFade(resource);\n resource.action.paused = true;\n } else if (resource.suspendedPaused !== undefined) {\n resource.action.paused = resource.suspendedPaused;\n if (!resource.explicitlyPaused) this.resumeFade(resource);\n resource.suspendedPaused = undefined;\n }\n }\n }\n\n setTimeScale(value: number): void {\n this.beforeOperation();\n if (!Number.isFinite(value)) throw new Error('Native mixer speed must be finite.');\n this.binding.mixer.timeScale = value;\n }\n\n fadeIn(handle: string, seconds: number): void { this.control(handle, { type: 'fadeIn', seconds }); }\n fadeOut(handle: string, seconds: number): void { this.control(handle, { type: 'fadeOut', seconds }); }\n\n /** Edit authored samples, retaining the native action and its loop/fade progress. */\n replaceClip(handle: string, clip: AnimationClip): void {\n this.beforeOperation();\n const resource = this.resources.get(handle);\n if (!resource) throw new Error('Unknown, foreign or stale playback handle.');\n const [ir] = serializeAnimationClips(this.binding.model, [clip], this.binding.inspection);\n if (ir.tracks.length !== clip.tracks.length) throw new Error('Every edited track must resolve on the bound model.');\n const native = cloneWithConcreteTrackNames(clip, ir.tracks, this.binding.inspection);\n if (native.tracks.length !== resource.clip.tracks.length || native.tracks.some((track, index) => {\n const old = resource.clip.tracks[index];\n return track.name !== old.name || track.ValueTypeName !== old.ValueTypeName || sampleSize(track) !== sampleSize(old);\n })) throw new Error('Editing samples must preserve track bindings; play a new clip to change its bindings.');\n const editable = resource.action as EditableAction | undefined;\n if (!editable || !Array.isArray(editable._interpolants) || editable._interpolants.length !== native.tracks.length) {\n throw new Error('This Three version does not support editing native action samples.');\n }\n this.dispatch(this.session.replace_clip(handle, JSON.stringify(ir)), native);\n }\n\n /** Native state for the owning adapter; never exposed through Polymer. */\n getAction(handle: string): AnimationAction | undefined {\n return this.resources.get(handle)?.action;\n }\n\n /** Deliver native completion after the borrowed mixer has finished sampling. */\n flushEvents(): void {\n if (this.disposed) return;\n this.notificationScheduled = false;\n for (const [handle, resource] of this.resources) {\n // Three evaluates fade weights on its mixer clock. Observe completion;\n // do not calculate a deadline or interpolate another weight here.\n if (resource.fadingOut && resource.action?.getEffectiveWeight() === 0) {\n resource.fadingOut = false;\n this.notifications.push({ type: 'cancelled', handle });\n }\n }\n this.flushNotifications();\n }\n\n subscribe(listener: (event: ThreeNativePlaybackEvent) => void): () => void {\n if (this.disposed) throw new Error('Native playback connector is disposed.');\n this.listeners.add(listener);\n return () => { this.listeners.delete(listener); };\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.retryPending();\n if (!this.sessionDisposed) {\n const batch = this.session.dispose();\n this.sessionDisposed = true;\n this.dispatch(batch);\n }\n // A failed release throws above, leaving listeners, resources and session\n // owned until a later dispose successfully retries the remaining effects.\n this.binding.mixer.removeEventListener('finished', this.finished);\n this.rendering.dispose();\n this.notifications.length = 0;\n this.listeners.clear();\n this.session.free();\n this.disposed = true;\n }\n\n private pauseFade(resource: Resource): void {\n const action = resource.action as EditableAction | undefined;\n const fade = action?._weightInterpolant;\n if (!action || !fade) return;\n // Preserve Three's own fade segment. Mixer time remains its only clock.\n resource.pausedFade = {\n seconds: Math.max(0, fade.parameterPositions[1] - resource.binding.mixer.time),\n from: fade.evaluate(resource.binding.mixer.time)[0], to: fade.sampleValues[1], weight: action.weight,\n };\n action.stopFading();\n action.setEffectiveWeight(resource.pausedFade.weight * resource.pausedFade.from);\n }\n\n private resumeFade(resource: Resource): void {\n const action = resource.action as EditableAction | undefined;\n const fade = resource.pausedFade;\n if (!action || !fade) return;\n resource.pausedFade = undefined;\n action.setEffectiveWeight(fade.weight);\n action.fadeIn(fade.seconds);\n const interpolant = action._weightInterpolant!;\n interpolant.sampleValues[0] = fade.from;\n interpolant.sampleValues[1] = fade.to;\n }\n\n private beforeOperation(): void {\n if (this.disposed || this.sessionDisposed) throw new Error('Native playback connector is disposed.');\n this.retryPending();\n }\n\n private retryPending(): void {\n if (this.pending.length) this.drain();\n }\n\n private dispatch(serialized: string, clip?: AnimationClip, afterCommands?: () => void): Batch {\n const batch = JSON.parse(serialized) as Batch;\n this.pending.push({ batch, nextCommand: 0, clip, afterCommands });\n this.drain();\n return batch;\n }\n\n private drain(): void {\n const errors: Error[] = [];\n this.depth += 1;\n try {\n while (this.pending.length) {\n const pending = this.pending[0];\n while (pending.nextCommand < pending.batch.commands.length) {\n const command = pending.batch.commands[pending.nextCommand];\n try {\n this.execute(command, pending.clip);\n } catch (error) {\n // A release failure cannot be represented by a late terminal event.\n // Keep this command and its undelivered events available for retry.\n if (command.type === 'release') throw asError(error);\n const failure = asError(error);\n errors.push(failure);\n this.notifications.push({ type: 'error', handle: command.handle, message: failure.message || 'Native operation failed.' });\n }\n pending.nextCommand += 1;\n }\n pending.afterCommands?.();\n this.pending.shift();\n // Commands have finished before any observer may reenter playback.\n for (const event of pending.batch.events) {\n for (const listener of [...this.listeners]) {\n // An observer failure must not make a successful play look like an\n // allocation failure to its caller and orphan the new handle.\n try { listener(event); } catch (error) {\n const failure = asError(error);\n queueMicrotask(() => { if (this.onError) this.onError(failure); else throw failure; });\n }\n }\n }\n }\n } finally {\n this.depth -= 1;\n }\n if (this.depth === 0 && !this.flushingNotifications) this.flushNotifications();\n if (errors.length) throw errors[0];\n }\n\n private execute(command: Command, preparedClip?: AnimationClip): void {\n if (command.type === 'release') {\n const resource = this.resources.get(command.handle);\n if (!resource) return;\n resource.action?.stop();\n resource.binding.mixer.uncacheAction(resource.clip, resource.binding.model);\n resource.binding.mixer.uncacheClip(resource.clip);\n if (resource.action) this.actionHandles.delete(resource.action);\n this.resources.delete(command.handle);\n // Releasing a completed held pose is not a second terminal event. The\n // owning facade still needs to retire its resource bookkeeping.\n try { this.onRelease?.(command.handle); } catch (error) {\n const failure = asError(error);\n queueMicrotask(() => { if (this.onError) this.onError(failure); else throw failure; });\n }\n return;\n }\n if (command.type === 'replaceClip') {\n const resource = this.resources.get(command.handle);\n if (!resource || !preparedClip) throw new Error('Native clip edit has no owned resource.');\n // Three has no public action sample-edit method. Keep this adapter access\n // isolated: rebuild native interpolants with the existing PropertyMixer\n // result buffers, without reading or changing time, loop counters or fades.\n const action = resource.action as EditableAction;\n const tracks = preparedClip.tracks.map((track) => track.clone());\n const interpolants = tracks.map((track, index) => {\n const interpolant = (track as NativeTrack).createInterpolant(action._interpolants[index].resultBuffer);\n if (interpolant.settings) Object.assign(action._interpolantSettings as object, interpolant.settings);\n interpolant.settings = action._interpolantSettings;\n return interpolant;\n });\n resource.clip.tracks = tracks;\n action._interpolants = interpolants;\n return;\n }\n if (command.type === 'play') {\n if (!preparedClip) throw new Error('Native playback has no prepared clip.');\n const resource: Resource = { clip: preparedClip, binding: this.binding };\n this.resources.set(command.handle, resource);\n const settings = command.settings;\n const action = this.binding.mixer.clipAction(preparedClip, this.binding.model, blendMode(settings.blendMode));\n resource.action = action;\n this.actionHandles.set(action, command.handle);\n action.setLoop(loopMode(settings.loop.mode), settings.loop.count ?? Infinity);\n action.clampWhenFinished = settings.finalPose === 'hold';\n action.setEffectiveTimeScale(settings.speed);\n action.setEffectiveWeight(settings.weight);\n action.time = settings.startSeconds;\n if (!this.renderingEnabled) { resource.suspendedPaused = false; action.paused = true; }\n action.play();\n return;\n }\n const resource = this.resources.get(command.handle);\n const action = resource?.action;\n if (!resource || !action) throw new Error('Native playback action is unavailable.');\n const control = command.control;\n switch (control.type) {\n case 'pause':\n resource.explicitlyPaused = true;\n this.pauseFade(resource);\n action.paused = true;\n if (!this.renderingEnabled) this.resources.get(command.handle)!.suspendedPaused = true;\n break;\n case 'resume':\n resource.explicitlyPaused = false;\n if (this.renderingEnabled) { action.paused = false; this.resumeFade(resource); }\n else this.resources.get(command.handle)!.suspendedPaused = false;\n break;\n case 'seek': action.time = control.seconds; break;\n case 'setSpeed': action.setEffectiveTimeScale(control.speed); break;\n case 'setWeight':\n resource.pausedFade = undefined;\n action.setEffectiveWeight(control.weight);\n this.resources.get(command.handle)!.fadingOut = false;\n break;\n case 'setBlendMode': action.blendMode = blendMode(control.blendMode); break;\n case 'setLoop': action.setLoop(loopMode(control.loop.mode), control.loop.count ?? Infinity); break;\n case 'setFinalPose': action.clampWhenFinished = control.finalPose === 'hold'; break;\n case 'fadeIn':\n resource.pausedFade = undefined;\n action.fadeIn(control.seconds); resource.fadingOut = false;\n if (resource.explicitlyPaused || !this.renderingEnabled) this.pauseFade(resource);\n break;\n case 'fadeOut':\n resource.pausedFade = undefined;\n if (control.seconds === 0) this.notifications.push({ type: 'cancelled', handle: command.handle });\n else { action.fadeOut(control.seconds); resource.fadingOut = true; if (resource.explicitlyPaused || !this.renderingEnabled) this.pauseFade(resource); }\n break;\n case 'stop': throw new Error('Rust must translate stop into a resource release.');\n }\n }\n\n private readonly finished = (event: { action: AnimationAction }): void => {\n const handle = this.actionHandles.get(event.action);\n if (!handle || this.disposed) return;\n this.notifications.push({ type: this.resources.get(handle)?.fadingOut ? 'cancelled' : 'completed', handle });\n // Three dispatches finished while iterating its active action arrays.\n // Releasing/uncaching an action there would mutate that iteration.\n if (this.notificationScheduled) return;\n this.notificationScheduled = true;\n queueMicrotask(() => {\n this.notificationScheduled = false;\n if (this.disposed) return;\n try { this.flushNotifications(); } catch (error) {\n const failure = asError(error);\n if (this.onError) this.onError(failure);\n else throw failure;\n }\n });\n };\n\n private flushNotifications(): void {\n if (this.flushingNotifications || this.depth > 0 || this.disposed || this.notificationScheduled) return;\n this.flushingNotifications = true;\n try {\n while (this.notifications.length) {\n const event = this.notifications.shift()!;\n this.dispatch(this.session.notify(JSON.stringify(event)));\n }\n } finally {\n this.flushingNotifications = false;\n }\n }\n}\n","import {\n AdditiveAnimationBlendMode, AnimationClip, AnimationUtils, LoopOnce, LoopPingPong,\n NormalAnimationBlendMode, PropertyBinding, Quaternion, InterpolateDiscrete, InterpolateLinear,\n} from 'three';\nimport type { KeyframeTrack, Mesh, Object3D } from 'three';\nimport { initEmbodyCore, requireInitializedEmbodyCore, DEFAULT_HAIR_COLOR_APPEARANCE } from '@lovelace_lol/embody/wasm';\nimport type { RuntimeCore } from '@lovelace_lol/embody/wasm';\nimport {\n ThreeFrameApplier, ThreeModelInspector, createAnimationClipFromClipIR,\n serializeAnimationClips,\n} from './index';\nimport type { ClipIR, ClipIRTrack, ThreeModelInspection } from './index';\nimport {\n bindModelReferencePose, captureModelReferencePose, extendModelReferencePose,\n} from './reference-pose';\nimport type { ThreeModelReferencePose, ThreeReferencePoseNode } from './reference-pose';\nimport { ThreeNativePlaybackConnector } from './nativePlayback';\nimport type { ThreeNativePlaybackControl, ThreeNativePlaybackEvent, ThreeNativePlaybackOptions } from './nativePlayback';\n\ntype JsonObject = Record<string, any>;\ntype NativeTrack = KeyframeTrack & { createInterpolant: ((result?: Float32Array) => { evaluate(time: number): ArrayLike<number> }) & { isInterpolantFactoryMethodGLTFCubicSpline?: boolean } };\nexport type RustEmbodyHostConfig = {\n profileMode?: 'preset' | 'profile';\n presetId?: string;\n presetType?: string;\n profile?: JsonObject;\n meshes?: Mesh[];\n referencePose?: ThreeModelReferencePose;\n};\nexport type CharacterPlaybackOptions = JsonObject;\nexport type CharacterPlaybackEvent = ThreeNativePlaybackEvent & { actionId: string; clipName: string };\nexport interface CharacterPlaybackHandle {\n readonly name: string;\n actionId?: string;\n promise: Promise<CharacterPlaybackEvent>;\n readonly finished: Promise<CharacterPlaybackEvent>;\n play(): CharacterPlaybackHandle;\n stop(): CharacterPlaybackHandle;\n cancel(): CharacterPlaybackHandle;\n pause(): CharacterPlaybackHandle;\n resume(): CharacterPlaybackHandle;\n setWeight(value: number): CharacterPlaybackHandle;\n setIntensity(value: number): CharacterPlaybackHandle;\n setSpeed(value: number): CharacterPlaybackHandle;\n setPlaybackRate(value: number): CharacterPlaybackHandle;\n setTime(value: number): CharacterPlaybackHandle;\n seek(value: number): CharacterPlaybackHandle;\n updateParams(value: CharacterPlaybackOptions): CharacterPlaybackHandle;\n setParams(value: CharacterPlaybackOptions): CharacterPlaybackHandle;\n subscribe(listener: ((event: CharacterPlaybackEvent) => void) | { next(event: CharacterPlaybackEvent): void }): () => void;\n}\nexport interface CharacterTransitionHandle {\n promise: Promise<void>;\n pause(): void;\n resume(): void;\n cancel(): void;\n}\n\ntype Source =\n | { name: string; kind: 'native'; clip: AnimationClip }\n | { name: string; kind: 'curves' | 'typed' | 'semantic'; input: any; options: CharacterPlaybackOptions }\n | { name: string; kind: 'compiled'; clip: ClipIR };\ntype Playback = {\n id: string;\n source: Source;\n options: CharacterPlaybackOptions;\n connector: ThreeNativePlaybackConnector;\n terminal: boolean;\n inheritedStarts: Map<string, number[]>;\n replay(options: CharacterPlaybackOptions): CharacterPlaybackHandle;\n notify(event: CharacterPlaybackEvent): void;\n};\nconst json = (value: unknown): string => JSON.stringify(value ?? {});\nconst targetKey = (target: ClipIRTrack['target']): string => JSON.stringify([target.kind, target.meshId, target.morphTargetId, target.boneId, target.objectId, target.property]);\nconst copy = <T>(value: T): T => JSON.parse(JSON.stringify(value));\nconst parse = <T = any>(value: string): T => JSON.parse(value);\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\nconst intensity = (options: CharacterPlaybackOptions, fallback = 1): number => {\n const value = options.intensityScale ?? options.intensity ?? options.weight;\n return finite(value) ? Math.max(0, Math.min(2, value)) : fallback;\n};\nconst presetId = (value?: string): string => value?.trim().toLowerCase() || 'cc4';\n\nexport function supportsRustEmbodyPreset(value?: string): boolean {\n return requireInitializedEmbodyCore().has_preset(presetId(value));\n}\n\n/** Character commands compile in Rust and play exclusively on the native connector. */\nexport class Embody {\n readonly meshes: Mesh[] = [];\n meshByName = new Map<string, Mesh>();\n bones: ThreeModelInspection['bones'] = {};\n private readonly wasm = requireInitializedEmbodyCore();\n private core: RuntimeCore;\n private readonly inspector = new ThreeModelInspector();\n private readonly applier = new ThreeFrameApplier();\n private readonly references = new WeakMap<Object3D, ThreeModelReferencePose>();\n private referenceBindings: ReadonlyMap<Object3D, ThreeReferencePoseNode> = new Map();\n private boundModel?: Object3D;\n get model(): Object3D | undefined { return this.boundModel; }\n private inspection?: ThreeModelInspection;\n private connector?: ThreeNativePlaybackConnector;\n private profile: JsonObject;\n private profileSource: JsonObject;\n private readonly profileMode: 'preset' | 'profile';\n private readonly preset: string;\n private readonly sources = new Map<string, Source>();\n private readonly playbacks = new Map<string, Playback>();\n private readonly current = new Map<string, Playback>();\n private playDepth = 0;\n private readonly pendingEvents: ThreeNativePlaybackEvent[] = [];\n private bindingGeneration = 0;\n private disposed = false;\n private rendering = true;\n private timeScale = 1;\n private nextLiveTarget = 0;\n private readonly liveTargets = new Map<string, { track: ClipIRTrack; handle: CharacterPlaybackHandle; releasing: boolean }>();\n private readonly hairObjects = new Map<string, Mesh>();\n private hairConfig: JsonObject = {};\n private hairAppearance: JsonObject = {\n hairColor: copy(DEFAULT_HAIR_COLOR_APPEARANCE),\n eyebrowColor: copy(DEFAULT_HAIR_COLOR_APPEARANCE),\n showOutline: false, outlineColor: '#000000', outlineOpacity: 1,\n };\n\n constructor(private readonly config: RustEmbodyHostConfig = {}) {\n const mode = config.profileMode ?? 'preset';\n if (mode !== 'profile' && mode !== 'preset') throw new Error(`Unknown profile mode: ${mode}`);\n if (mode === 'profile' && !config.profile) throw new Error('Resolved profile mode requires a profile object.');\n this.profileMode = mode;\n this.preset = presetId(config.presetId ?? config.presetType);\n if (mode === 'preset' && !this.wasm.has_preset(this.preset)) throw new Error(`Unknown Embody preset: ${this.preset}`);\n this.profileSource = this.validateProfile(config.profile ?? {});\n this.profile = this.resolveProfile(this.profileSource);\n this.core = new this.wasm.RuntimeCore(0);\n }\n\n static async create(config: RustEmbodyHostConfig = {}): Promise<Embody> {\n await initEmbodyCore();\n return new Embody(config);\n }\n\n private assertAlive(): void { if (this.disposed) throw new Error('Character is disposed.'); }\n private requireModel(): Object3D {\n this.assertAlive();\n if (!this.boundModel) throw new Error('Bind a character model with onReady before using this operation.');\n return this.boundModel;\n }\n private requireConnector(): ThreeNativePlaybackConnector {\n this.requireModel();\n if (!this.connector) throw new Error('Character playback is not bound.');\n return this.connector;\n }\n private validateProfile(value: JsonObject): JsonObject {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Embody profile must be a JSON object.');\n return copy(value);\n }\n private resolveProfile(value: JsonObject): JsonObject {\n return this.profileMode === 'profile' ? copy(value) : parse(this.wasm.merge_embedded_preset(this.preset, json(value)));\n }\n\n onReady(options: { model: Object3D; meshes?: Mesh[]; animations?: AnimationClip[]; referencePose?: ThreeModelReferencePose }): void {\n this.assertAlive();\n const model = options.model;\n if (!model?.isObject3D) throw new Error('onReady requires a Three Object3D model.');\n const reference = this.references.get(model) ?? options.referencePose ?? (!this.boundModel ? this.config.referencePose : undefined) ?? captureModelReferencePose(model);\n const inspection = this.inspector.inspectModel(model, { meshes: options.meshes, profile: this.profile, referencePose: reference });\n this.bind(model, reference, inspection, this.profileSource, this.profile);\n if (options.animations) this.loadAnimationClips(options.animations);\n }\n\n private bind(model: Object3D, reference: ThreeModelReferencePose, inspection: ThreeModelInspection, source: JsonObject, profile: JsonObject, preserveLiveState = true): void {\n // Prepare every fallible profile/reference operation before releasing the old binding.\n const referenceBindings = bindModelReferencePose(model, reference);\n // Inspection stays live; release clips need the separately captured baseline.\n const runtimeDescriptor = {\n ...inspection.descriptor,\n morphTargets: inspection.descriptor.morphTargets.map((morph) => {\n const binding = inspection.morphBindings.get(morph.id);\n const baseline = binding && referenceBindings.get(binding.mesh)?.morphInfluences?.[binding.index];\n return { ...morph, initialValue: baseline ?? morph.initialValue };\n }),\n };\n const replacingModel = !!this.boundModel && this.boundModel !== model;\n const core = new this.wasm.RuntimeCore(0);\n try {\n if (this.profileMode === 'profile') core.configure_with_profile(json(source), json(runtimeDescriptor));\n else core.configure_with_preset(this.preset, json(source), json(runtimeDescriptor));\n if (preserveLiveState && this.boundModel) core.copy_live_state_from(this.core);\n for (const registered of replacingModel ? [] : this.sources.values()) {\n if (registered.kind === 'native') {\n const [clip] = serializeAnimationClips(model, [registered.clip], inspection);\n core.register_animation_clip(json(clip), 'baked');\n }\n }\n } catch (error) { core.free(); throw error; }\n try { this.connector?.dispose(); }\n catch (error) { core.free(); throw error; }\n this.core.free();\n this.core = core;\n if (replacingModel) this.sources.clear();\n this.boundModel = model;\n this.inspection = inspection;\n this.referenceBindings = referenceBindings;\n this.references.set(model, reference);\n this.profileSource = source;\n this.profile = profile;\n this.bindingGeneration += 1;\n this.playbacks.clear();\n this.current.clear();\n this.liveTargets.clear();\n this.meshes.splice(0, this.meshes.length, ...(inspection.morphMeshes.length ? inspection.morphMeshes : inspection.allMeshes));\n this.meshByName = inspection.meshByName;\n this.bones = inspection.bones;\n this.applier.setBindings(inspection);\n this.applier.applyMeshMaterialConfigs(model, profile.meshes ?? {});\n const session = new this.wasm.NativePlaybackSession();\n try {\n this.connector = new ThreeNativePlaybackConnector(session, {\n model, inspection,\n onRelease: (id) => {\n const playback = this.playbacks.get(id);\n if (playback?.terminal) this.forget(playback);\n },\n });\n }\n catch (error) { session.free(); throw error; }\n this.connector.rebind(model.uuid, String(this.bindingGeneration));\n this.connector.setRendering(this.rendering);\n this.connector.setTimeScale(this.timeScale);\n this.connector.subscribe((event) => this.onPlaybackEvent(event));\n this.hairConfig = parse(this.core.get_hair_config_json());\n this.registerHairObjects(inspection.allMeshes.filter((mesh) => ['hair', 'eyebrow'].includes(this.meshCategory(mesh))));\n if (preserveLiveState) this.commitLive();\n }\n\n bindModel(meshes?: Mesh[]): void {\n const model = this.requireModel();\n const reference = this.references.get(model)!;\n const inspection = this.inspector.inspectModel(model, { meshes, profile: this.profile, referencePose: reference });\n this.bind(model, reference, inspection, this.profileSource, this.profile);\n }\n extendReferencePose(): ThreeModelReferencePose {\n const model = this.requireModel();\n const reference = extendModelReferencePose(model, this.references.get(model)!);\n const inspection = this.inspector.inspectModel(model, { profile: this.profile, referencePose: reference });\n this.bind(model, reference, inspection, this.profileSource, this.profile);\n return reference;\n }\n setProfile(value: JsonObject): void {\n this.assertAlive();\n const source = this.validateProfile(value);\n const profile = this.resolveProfile(source);\n if (!this.boundModel) { this.profileSource = source; this.profile = profile; return; }\n const reference = this.references.get(this.boundModel)!;\n const inspection = this.inspector.inspectModel(this.boundModel, { profile, referencePose: reference });\n this.bind(this.boundModel, reference, inspection, source, profile, false);\n }\n getProfile(): JsonObject { return this.profile; }\n getProfileMode(): 'preset' | 'profile' { return this.profileMode; }\n getPresetId(): string | null { return this.profileMode === 'preset' ? this.preset : null; }\n supportsPreset(value?: string): boolean { return supportsRustEmbodyPreset(value); }\n\n private onPlaybackEvent(event: ThreeNativePlaybackEvent): void {\n if (this.playDepth) { this.pendingEvents.push(event); return; }\n const playback = this.playbacks.get(event.handle);\n if (!playback) return;\n playback.terminal = true;\n if (!playback.connector.getAction(playback.id)) {\n this.playbacks.delete(playback.id);\n if (this.current.get(playback.source.name) === playback) this.current.delete(playback.source.name);\n }\n playback.notify({ ...event, actionId: event.handle, clipName: playback.source.name });\n }\n private compile(source: Source, options: CharacterPlaybackOptions): ClipIR {\n const buildOptions = { ...('options' in source ? source.options : {}), ...options, intensityScale: intensity(options) };\n switch (source.kind) {\n case 'curves': return parse(this.core.build_clip(source.name, json(source.input), json(buildOptions)));\n case 'typed': return parse(this.core.build_typed_clip(source.name, json(source.input), json(buildOptions)));\n case 'semantic': return parse(this.core.build_semantic_clip(source.name, json(source.input), json(buildOptions)));\n case 'compiled': return source.clip;\n case 'native': throw new Error('Native animation sources do not require semantic compilation.');\n }\n }\n\n private restValues(track: KeyframeTrack): number[] | undefined {\n const model = this.requireModel();\n const parsed = PropertyBinding.parseTrackName(track.name);\n let object = PropertyBinding.findNode(model, parsed.nodeName) as Object3D | undefined;\n if (parsed.objectName === 'bones' && object) {\n const skeleton = (object as Object3D & { skeleton?: { bones: Object3D[] } }).skeleton;\n object = skeleton?.bones.find((bone) => bone.name === String(parsed.objectIndex)) ??\n skeleton?.bones[Number(parsed.objectIndex)];\n }\n if (!object) return undefined;\n const reference = this.referenceBindings.get(object);\n if (!reference) return undefined;\n switch (parsed.propertyName) {\n case 'quaternion': return Object.values(reference.transform.rotation);\n case 'position': return Object.values(reference.transform.position);\n case 'scale': return Object.values(reference.transform.scale);\n case 'morphTargetInfluences': {\n const mesh = object as Mesh;\n const index = typeof parsed.propertyIndex === 'string' && !/^\\d+$/.test(parsed.propertyIndex)\n ? mesh.morphTargetDictionary?.[parsed.propertyIndex] : Number(parsed.propertyIndex);\n return [reference.morphInfluences?.[index ?? -1] ?? 0];\n }\n default: return undefined;\n }\n }\n\n private materialize(source: Source, options: CharacterPlaybackOptions, inheritedStarts = new Map<string, number[]>()): AnimationClip {\n if (!this.inspection) throw new Error('Character has no model inspection.');\n const nativeSource = source.kind === 'native';\n let ir: ClipIR | undefined;\n if (!nativeSource) {\n ir = this.compile(source, options);\n }\n const clip = nativeSource ? source.clip.clone() : createAnimationClipFromClipIR(ir!, this.inspection);\n if (ir) {\n const predecessor = this.current.get(source.name);\n const outgoing = predecessor?.connector.getAction(predecessor.id);\n for (let index = 0; index < ir.tracks.length; index += 1) {\n if (!ir.tracks[index].inheritStart) continue;\n const track = clip.tracks[index];\n if (!track) throw new Error('Every inherited track must bind to the character.');\n const startKey = `${index}:${track.name}`;\n let previous = inheritedStarts.get(startKey);\n if (!previous && options.blendMode === 'additive') {\n // Additive inheritance belongs to this request's contribution, not\n // the full mixed pose containing baked clips and other controls.\n const rest = this.restValues(track);\n const candidates = outgoing?.getClip().tracks;\n const oldTrack = candidates?.[index]?.name === track.name ? candidates[index] : candidates?.find((candidate) => candidate.name === track.name);\n if (oldTrack && outgoing) {\n previous = Array.from((oldTrack as NativeTrack).createInterpolant().evaluate(outgoing.time));\n if (outgoing.blendMode === AdditiveAnimationBlendMode && rest) {\n previous = track.ValueTypeName === 'quaternion'\n ? new Quaternion().fromArray(rest).multiply(new Quaternion().fromArray(previous)).toArray()\n : previous.map((value, axis) => value + rest[axis]);\n }\n } else if (rest) previous = rest;\n }\n if (previous) track.values.set(previous, 0);\n inheritedStarts.set(startKey, previous ?? Array.from(track.values.subarray(0, track.getValueSize())));\n }\n }\n const authoredAdditive = clip.blendMode === AdditiveAnimationBlendMode;\n const scale = intensity(options);\n const additive = options.blendMode === 'additive' || (options.blendMode === undefined && authoredAdditive);\n // Native custom curves remain exact at their authored settings. Editing\n // strength/blend/easing materializes their native interpolant once into\n // ordinary keyframes; no custom sampling occurs during rendering.\n this.applyEasing(clip, options.easing ?? 'linear', nativeSource && (scale !== 1 || additive !== authoredAdditive));\n if (nativeSource && scale !== 1) {\n for (const track of clip.tracks) {\n const rest = authoredAdditive ? (track.ValueTypeName === 'quaternion' ? [0, 0, 0, 1] : Array(track.getValueSize()).fill(0)) : this.restValues(track);\n if (!rest) continue;\n const stride = track.getValueSize();\n const cubic = (track as NativeTrack).createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true;\n const width = cubic ? stride / 3 : stride;\n for (let offset = 0; offset < track.values.length; offset += stride) {\n const sample = offset + (cubic ? width : 0);\n if (track.ValueTypeName === 'quaternion') {\n const neutral = new Quaternion().fromArray(rest);\n const value = new Quaternion().fromArray(track.values, sample);\n neutral.slerp(value, scale).toArray(track.values, sample);\n } else {\n for (let axis = 0; axis < width; axis += 1) {\n track.values[sample + axis] = rest[axis] + (track.values[sample + axis] - rest[axis]) * scale;\n if (cubic) {\n track.values[offset + axis] *= scale;\n track.values[offset + 2 * width + axis] *= scale;\n }\n }\n }\n }\n }\n }\n if (additive && !authoredAdditive) {\n const reference = clip.clone();\n for (const track of reference.tracks) {\n const rest = this.restValues(track);\n if (!rest) continue;\n const width = track.getValueSize();\n for (let offset = 0; offset < track.values.length; offset += width) track.values.set(rest, offset);\n }\n const explicitReference = options.additiveReferenceTimeSec;\n if (finite(explicitReference)) AnimationUtils.makeClipAdditive(clip, explicitReference * 30, clip.clone(), 30);\n else AnimationUtils.makeClipAdditive(clip, 0, reference, 30);\n }\n if (!additive && authoredAdditive) {\n // Native additive clips contain offsets; restore captured reference values.\n for (const track of clip.tracks) {\n const rest = this.restValues(track);\n if (!rest) continue;\n const width = track.getValueSize();\n for (let offset = 0; offset < track.values.length; offset += width) {\n if (track.ValueTypeName === 'quaternion') new Quaternion().fromArray(rest).multiply(new Quaternion().fromArray(track.values, offset)).toArray(track.values, offset);\n else for (let axis = 0; axis < width; axis += 1) track.values[offset + axis] += rest[axis];\n }\n }\n }\n clip.blendMode = additive ? AdditiveAnimationBlendMode : NormalAnimationBlendMode;\n return clip;\n }\n\n private applyEasing(clip: AnimationClip, easing: string, resampleCustom = false): void {\n if (easing === 'linear' && !resampleCustom) return;\n const curve = (progress: number): number => {\n switch (easing) {\n case 'easeIn': return progress * progress;\n case 'easeOut': return 1 - (1 - progress) ** 2;\n case 'easeInOut': return progress < 0.5 ? 2 * progress * progress : 1 - (-2 * progress + 2) ** 2 / 2;\n case 'easeInOutCubic': return progress < 0.5 ? 4 * progress ** 3 : 1 - (-2 * progress + 2) ** 3 / 2;\n default: return progress;\n }\n };\n for (const track of clip.tracks) {\n if (track.getInterpolation() === InterpolateDiscrete || track.times.length === 0) continue;\n const customInterpolant = (track as NativeTrack).createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true;\n if (track.times.length === 1) {\n if (customInterpolant && resampleCustom) {\n track.values = new Float32Array((track as NativeTrack).createInterpolant().evaluate(track.times[0]));\n track.setInterpolation(InterpolateLinear);\n }\n continue;\n }\n if ((customInterpolant || track.getInterpolation() !== InterpolateLinear) && easing === 'linear' && !resampleCustom) continue;\n const stride = track.getValueSize();\n const width = customInterpolant ? stride / 3 : stride;\n const interpolant = (track as NativeTrack).createInterpolant();\n const times: number[] = [];\n const values: number[] = [];\n const append = (time: number, value: ArrayLike<number>) => { times.push(time); for (let axis = 0; axis < width; axis += 1) values.push(value[axis]); };\n for (let index = 0; index < track.times.length - 1; index += 1) {\n const start = track.times[index];\n const end = track.times[index + 1];\n // Retain duplicate keyframe times and their authored values verbatim.\n const offset = index * stride + (customInterpolant ? width : 0);\n append(start, track.values.subarray(offset, offset + width));\n if (end <= start) continue;\n for (let part = 1; part < 16; part += 1) {\n const progress = part / 16;\n append(start + (end - start) * progress, interpolant.evaluate(start + (end - start) * curve(progress)));\n }\n }\n const lastOffset = (track.times.length - 1) * stride + (customInterpolant ? width : 0);\n append(track.times[track.times.length - 1], track.values.subarray(lastOffset, lastOffset + width));\n track.times = new Float32Array(times);\n track.values = new Float32Array(values);\n if (customInterpolant || track.getInterpolation() !== InterpolateLinear) track.setInterpolation(InterpolateLinear);\n }\n }\n\n private nativeOptions(options: CharacterPlaybackOptions, clip: AnimationClip): ThreeNativePlaybackOptions {\n const mode = clip.duration === 0 ? 'once' : options.loopMode ?? (options.loop === true ? 'repeat' : 'once');\n const count = finite(options.repeatCount) && options.repeatCount > 0 ? options.repeatCount : null;\n let speed = options.speed ?? options.playbackRate ?? options.rate ?? options.timeScale ?? 1;\n if (options.reverse === true) speed = -Math.abs(speed);\n return {\n startSeconds: finite(options.time) ? options.time : finite(options.offsetSec) ? options.offsetSec : speed < 0 ? clip.duration : 0,\n speed,\n weight: finite(options.mixerWeight) ? options.mixerWeight : 1,\n blendMode: clip.blendMode === AdditiveAnimationBlendMode ? 'additive' : 'normal',\n loop: { mode: mode === 'once' ? 'once' : mode === 'pingpong' || mode === 'pingPong' ? 'pingPong' : 'repeat', count: mode === 'once' ? 1 : count },\n finalPose: options.finalPose === 'release' || options.clampWhenFinished === false ? 'release' : 'hold',\n };\n }\n private validateEasing(options: CharacterPlaybackOptions): void {\n if (options.easing !== undefined && !['linear', 'easeIn', 'easeOut', 'easeInOut', 'easeInOutCubic'].includes(options.easing)) throw new Error(`Unknown playback easing: ${options.easing}`);\n }\n\n private handle(source: Source, options: CharacterPlaybackOptions, autoPlay: boolean): CharacterPlaybackHandle {\n options = { ...('options' in source ? source.options : {}), ...options };\n const listeners = new Set<(event: CharacterPlaybackEvent) => void>();\n const generation = this.bindingGeneration;\n let current: Playback | undefined;\n let resolvePromise: (event: CharacterPlaybackEvent) => void = () => {};\n const result = { name: source.name } as CharacterPlaybackHandle;\n Object.defineProperty(result, 'finished', { get: () => result.promise, enumerable: true });\n const newPromise = () => { result.promise = new Promise((resolve) => { resolvePromise = resolve; }); };\n newPromise();\n result.subscribe = (listener) => {\n const callback = typeof listener === 'function' ? listener : (event: CharacterPlaybackEvent) => listener.next(event);\n listeners.add(callback);\n return () => { listeners.delete(callback); };\n };\n const start = (): CharacterPlaybackHandle => {\n if (generation !== this.bindingGeneration) throw new Error('Playback handle belongs to an obsolete model binding.');\n this.validateEasing(options);\n const connector = this.requireConnector();\n const inheritedStarts = new Map<string, number[]>();\n const clip = this.materialize(source, options, inheritedStarts);\n const hairMotion = this.authoredHeadMotion(clip);\n const previous = this.current.get(source.name);\n const settings = this.nativeOptions(options, clip);\n if (previous && connector.getAction(previous.id)) settings.replace = previous.id;\n if (current) newPromise();\n const resolve = resolvePromise;\n let settled = false;\n this.playDepth += 1;\n let id: string;\n try { id = connector.playNativeClip(clip, settings); }\n catch (error) {\n this.playDepth -= 1;\n while (!this.playDepth && this.pendingEvents.length) this.onPlaybackEvent(this.pendingEvents.shift()!);\n throw error;\n }\n const playback: Playback = {\n id, source, options: { ...options, intensityScale: intensity(options) }, connector, terminal: false, inheritedStarts,\n replay: (next) => { options = next; return start(); },\n notify: (event) => {\n if (settled) return;\n settled = true;\n resolve(event);\n for (const listener of [...listeners]) {\n try { listener(event); }\n catch (error) { queueMicrotask(() => { throw error; }); }\n }\n },\n };\n current = playback;\n result.actionId = id;\n this.playbacks.set(id, playback);\n this.current.set(source.name, playback);\n const ensure = () => {\n this.assertAlive();\n if (this.connector !== connector || !connector.getAction(id)) throw new Error('Unknown, released or obsolete playback handle.');\n };\n const control = (command: ThreeNativePlaybackControl): CharacterPlaybackHandle => {\n ensure();\n connector.control(id, command);\n if (command.type === 'stop') this.forget(playback);\n return result;\n };\n result.stop = result.cancel = () => {\n if (this.connector !== connector || !connector.getAction(id)) return result;\n ensure();\n const seconds = finite(playback.options.fadeOutSec) ? playback.options.fadeOutSec : 0;\n if (seconds > 0 && !playback.terminal) connector.fadeOut(id, seconds);\n else control({ type: 'stop' });\n return result;\n };\n result.pause = () => control({ type: 'pause' });\n result.resume = () => {\n ensure();\n if (playback.terminal) {\n options = { ...playback.options, time: connector.getAction(id)!.time };\n return start();\n }\n return control({ type: 'resume' });\n };\n result.setSpeed = result.setPlaybackRate = (speed) => { ensure(); this.updatePlayback(playback, { speed }); return result; };\n result.setTime = result.seek = (seconds) => control({ type: 'seek', seconds });\n result.setWeight = result.setIntensity = (value) => {\n ensure();\n this.updatePlayback(playback, { intensityScale: value });\n return result;\n };\n result.updateParams = result.setParams = (value) => { ensure(); this.updatePlayback(playback, value); return result; };\n try {\n const fade = options.fadeInSec ?? options.crossfadeDuration;\n if (finite(fade) && fade > 0) connector.fadeIn(id, fade);\n } finally {\n this.playDepth -= 1;\n while (!this.playDepth && this.pendingEvents.length) this.onPlaybackEvent(this.pendingEvents.shift()!);\n }\n if (hairMotion && connector.getAction(id)) {\n this.playHairImpulse(hairMotion.horizontal, hairMotion.vertical);\n this.setHairGravity(hairMotion.pitch, clip.duration);\n }\n return result;\n };\n result.play = () => { if (current) options = { ...current.options }; return start(); };\n const beforePlay = () => { throw new Error('Play this compiled clip before changing playback.'); };\n // A prepared clip has options but owns no native action to stop or pause.\n result.stop = result.cancel = () => result;\n result.pause = result.resume = beforePlay;\n result.updateParams = result.setParams = (patch) => {\n this.assertAlive();\n this.validateEasing(patch);\n options = { ...options, ...patch };\n if ('finalPose' in patch && !('clampWhenFinished' in patch)) options.clampWhenFinished = patch.finalPose !== 'release';\n if ('clampWhenFinished' in patch && !('finalPose' in patch)) options.finalPose = patch.clampWhenFinished === false ? 'release' : 'hold';\n if ('loop' in patch && !('loopMode' in patch)) options.loopMode = patch.loop ? 'repeat' : 'once';\n if ('loopMode' in patch && !('repeatCount' in patch)) delete options.repeatCount;\n if ('weight' in patch || 'intensity' in patch || 'intensityScale' in patch) options.intensityScale = intensity(patch);\n if ('time' in patch || 'offsetSec' in patch) options.time = patch.time ?? patch.offsetSec;\n if ('speed' in patch || 'playbackRate' in patch || 'rate' in patch || 'timeScale' in patch || 'reverse' in patch) {\n let speed = patch.speed ?? patch.playbackRate ?? patch.rate ?? patch.timeScale ?? options.speed ?? options.playbackRate ?? options.rate ?? options.timeScale ?? 1;\n if ('reverse' in patch) speed = Math.abs(speed) * (patch.reverse ? -1 : 1);\n options.speed = speed;\n delete options.reverse;\n }\n return result;\n };\n result.setWeight = result.setIntensity = (value) => result.updateParams({ intensityScale: value });\n result.setSpeed = result.setPlaybackRate = (speed) => result.updateParams({ speed });\n result.setTime = result.seek = (time) => result.updateParams({ time });\n return autoPlay ? start() : result;\n }\n\n private forget(playback: Playback): void {\n this.playbacks.delete(playback.id);\n if (this.current.get(playback.source.name) === playback) this.current.delete(playback.source.name);\n }\n private updatePlayback(playback: Playback, patch: CharacterPlaybackOptions): void {\n this.validateEasing(patch);\n const connector = playback.connector;\n const action = connector.getAction(playback.id);\n if (connector !== this.connector || !action) throw new Error('Unknown, released or obsolete playback handle.');\n const options = { ...playback.options, ...patch };\n if ('finalPose' in patch && !('clampWhenFinished' in patch)) options.clampWhenFinished = patch.finalPose !== 'release';\n if ('clampWhenFinished' in patch && !('finalPose' in patch)) options.finalPose = patch.clampWhenFinished === false ? 'release' : 'hold';\n if ('loop' in patch && !('loopMode' in patch)) options.loopMode = patch.loop ? 'repeat' : 'once';\n if ('loopMode' in patch && !('repeatCount' in patch)) delete options.repeatCount;\n if ('weight' in patch || 'intensity' in patch || 'intensityScale' in patch) options.intensityScale = intensity(patch);\n if (['weight', 'intensity', 'intensityScale', 'blendMode', 'easing', 'balance', 'balanceMap', 'mixWeights'].some((key) => key in patch)) {\n const clip = this.materialize(playback.source, options, playback.inheritedStarts);\n connector.replaceClip(playback.id, clip);\n if ('blendMode' in patch) connector.control(playback.id, { type: 'setBlendMode', blendMode: clip.blendMode === AdditiveAnimationBlendMode ? 'additive' : 'normal' });\n }\n if ('mixerWeight' in patch) connector.control(playback.id, { type: 'setWeight', weight: patch.mixerWeight });\n if ('speed' in patch || 'playbackRate' in patch || 'rate' in patch || 'timeScale' in patch || 'reverse' in patch) {\n let speed = patch.speed ?? patch.playbackRate ?? patch.rate ?? patch.timeScale ?? action.timeScale;\n if ('reverse' in patch) speed = Math.abs(speed) * (patch.reverse ? -1 : 1);\n connector.control(playback.id, { type: 'setSpeed', speed });\n options.speed = speed;\n delete options.reverse;\n }\n if ('time' in patch || 'offsetSec' in patch) {\n options.time = patch.time ?? patch.offsetSec;\n connector.control(playback.id, { type: 'seek', seconds: options.time });\n }\n if ('loopMode' in patch || 'loop' in patch || 'repeatCount' in patch) {\n if (playback.terminal) {\n playback.replay({ ...options, time: action.time });\n return;\n }\n connector.control(playback.id, { type: 'setLoop', loop: this.nativeOptions(options, action.getClip()).loop! });\n }\n if ('clampWhenFinished' in patch || 'finalPose' in patch) connector.control(playback.id, { type: 'setFinalPose', finalPose: this.nativeOptions(options, action.getClip()).finalPose! });\n playback.options = options;\n if (!connector.getAction(playback.id)) this.forget(playback);\n }\n\n registerAnimationClips(clips: AnimationClip[]): void {\n const model = this.requireModel();\n for (const clip of clips) {\n if (this.sources.get(clip.name)?.kind === 'native' && (this.sources.get(clip.name) as { clip: AnimationClip }).clip === clip) continue;\n const [ir] = serializeAnimationClips(model, [clip], this.inspection!);\n this.core.register_animation_clip(json(ir), 'baked');\n this.sources.set(clip.name, { name: clip.name, kind: 'native', clip });\n }\n }\n loadAnimationClips(clips: AnimationClip[]): void {\n this.stopAllAnimations();\n for (const source of [...this.sources.values()]) if (source.kind === 'native') {\n this.sources.delete(source.name);\n this.core.remove_animation_clip(source.name);\n }\n this.registerAnimationClips(clips ?? []);\n this.restartHair();\n }\n removeAnimationClip(name: string): boolean {\n this.stopAnimation(name);\n this.sources.delete(name);\n return this.core.remove_animation_clip(name);\n }\n getAnimationClips(): any[] { return parse(this.core.get_animation_clips()); }\n playAnimation(name: string, options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle {\n const source = this.sources.get(name);\n if (!source) throw new Error(`Unknown animation clip: ${name}`);\n return this.handle(source, options, true);\n }\n private build(source: Source, options: CharacterPlaybackOptions, play: boolean): CharacterPlaybackHandle {\n this.requireModel();\n this.validateEasing(options);\n this.compile(source, options);\n this.sources.set(source.name, source);\n return this.handle(source, options, play);\n }\n buildClip(name: string, curves: JsonObject, options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle {\n return options.semanticAnimation\n ? this.semanticAnimationToClip(name, options.semanticAnimation, { ...options, faceCurves: curves })\n : this.build({ name, kind: 'curves', input: copy(curves), options: copy(options) }, options, false);\n }\n snippetToClip(name: string, curves: JsonObject, options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle { return this.buildClip(name, curves, options); }\n buildTypedClip(name: string, channels: any[], options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle {\n return this.build({ name, kind: 'typed', input: copy(channels), options: copy(options) }, options, false);\n }\n typedSnippetToClip(name: string, channels: any[], options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle { return this.buildTypedClip(name, channels, options); }\n semanticAnimationToClip(name: string, animation: JsonObject, options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle {\n return this.build({ name, kind: 'semantic', input: copy(animation), options: copy(options) }, options, false);\n }\n playSnippet(snippet: string | { name: string; curves: JsonObject }, curvesOrOptions: JsonObject = {}, options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle {\n return typeof snippet === 'string' ? this.buildClip(snippet, curvesOrOptions, options).play() : this.buildClip(snippet.name, snippet.curves, curvesOrOptions).play();\n }\n playTypedSnippet(snippet: { name: string; channels: any[] }, options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle { return this.buildTypedClip(snippet.name, snippet.channels, options).play(); }\n playClip(value: string | CharacterPlaybackHandle): CharacterPlaybackHandle { return typeof value === 'string' ? this.playAnimation(value) : value.play(); }\n supportsClipCurves(): boolean { return true; }\n cleanupSnippet(name: string): void { this.stopAnimation(name); this.sources.delete(name); this.core.cleanup_snippet(name); }\n crossfadeTo(name: string, seconds: number, options: CharacterPlaybackOptions = {}): CharacterPlaybackHandle {\n const outgoing = [...this.current.values()].filter((playback) => !playback.source.name.startsWith('__embody_'));\n const handle = this.playAnimation(name, { ...options, fadeInSec: seconds });\n for (const playback of outgoing) if (playback.connector.getAction(playback.id)) playback.connector.fadeOut(playback.id, seconds);\n return handle;\n }\n stopAnimation(name: string): void {\n const playback = this.current.get(name);\n if (!playback) return;\n if (playback.connector.getAction(playback.id)) playback.connector.control(playback.id, { type: 'stop' });\n this.forget(playback);\n }\n stopAllAnimations(): void {\n for (const playback of [...this.playbacks.values()]) {\n if (playback.source.kind === 'compiled') continue;\n if (playback.connector.getAction(playback.id)) playback.connector.control(playback.id, { type: 'stop' });\n this.forget(playback);\n }\n }\n pauseAnimation(name: string): void { const p = this.current.get(name); if (p) p.connector.control(p.id, { type: 'pause' }); }\n resumeAnimation(name: string): void {\n const p = this.current.get(name);\n if (!p) return;\n if (p.terminal) p.replay({ ...p.options, time: p.connector.getAction(p.id)?.time ?? 0 });\n else p.connector.control(p.id, { type: 'resume' });\n }\n pauseAllAnimations(): void { for (const p of this.playbacks.values()) if (!p.terminal) p.connector.control(p.id, { type: 'pause' }); }\n resumeAllAnimations(): void { for (const name of [...this.current.keys()]) this.resumeAnimation(name); }\n updateClipParams(name: string, options: CharacterPlaybackOptions): void { const p = this.current.get(name); if (p) this.updatePlayback(p, options); }\n setAnimationSpeed(name: string, value: number): void { this.updateClipParams(name, { speed: value }); }\n setAnimationIntensity(name: string, value: number): void { this.updateClipParams(name, { intensityScale: value }); }\n setAnimationLoop(name: string, value: boolean): void { this.updateClipParams(name, { loopMode: value ? 'repeat' : 'once' }); }\n setAnimationLoopMode(name: string, value: string): void { this.updateClipParams(name, { loopMode: value }); }\n setAnimationRepeatCount(name: string, value: number | null): void { this.updateClipParams(name, { loopMode: 'repeat', repeatCount: value }); }\n setAnimationReverse(name: string, value: boolean): void { this.updateClipParams(name, { reverse: value }); }\n setAnimationBlendMode(name: string, value: string): void { this.updateClipParams(name, { blendMode: value }); }\n setAnimationEasing(name: string, value: string): void { this.validateEasing({ easing: value }); this.updateClipParams(name, { easing: value }); }\n seekAnimation(name: string, value: number): void { this.updateClipParams(name, { time: value }); }\n setAnimationTime(name: string, value: number): void { this.seekAnimation(name, value); }\n setSnippetTime(name: string, value: number): void { this.seekAnimation(name, value); }\n seekSnippet(name: string, value: number): void { this.seekAnimation(name, value); }\n seek(name: string, value: number): void { this.seekAnimation(name, value); }\n setAnimationTimeScale(value: number): void { this.requireConnector().setTimeScale(value); this.timeScale = value; }\n getAnimationState(name: string): JsonObject {\n const p = this.current.get(name);\n const action = p?.connector.getAction(p.id);\n if (!action || !p) { if (p) this.forget(p); return { name, playing: false, isPlaying: false }; }\n const playing = action.isRunning();\n return { name, actionId: p.id, playing, isPlaying: playing, paused: action.paused, completed: p.terminal,\n time: action.time, duration: action.getClip().duration, speed: action.timeScale,\n intensityScale: intensity(p.options), mixerWeight: action.getEffectiveWeight(),\n loopMode: action.loop === LoopOnce ? 'once' : action.loop === LoopPingPong ? 'pingpong' : 'repeat',\n repeatCount: Number.isFinite(action.repetitions) ? action.repetitions : null,\n blendMode: action.blendMode === AdditiveAnimationBlendMode ? 'additive' : 'replace' };\n }\n getPlayingAnimations(): string[] { return [...this.current.keys()].filter((name) => this.getAnimationState(name).playing); }\n\n private commitLive(durationMs = 0): CharacterPlaybackHandle[] {\n const connector = this.requireConnector();\n const duration = Math.max(0, durationMs) / 1000;\n const clip = parse<ClipIR>(this.core.build_live_clip('__embody_live', duration));\n const touched = new Set(parse<ClipIRTrack['target'][]>(this.core.live_command_targets_json()).map(targetKey));\n const tracks = new Map<string, ClipIRTrack>(clip.tracks.map((track) => [targetKey(track.target), track]));\n const handles: CharacterPlaybackHandle[] = [];\n for (const [key, previous] of this.liveTargets) {\n if (tracks.has(key)) continue;\n if (previous.releasing && !touched.has(key)) continue;\n const action = previous.handle.actionId && connector.getAction(previous.handle.actionId);\n if (!action || duration === 0) {\n previous.handle.stop();\n this.liveTargets.delete(key);\n continue;\n }\n // Fade this action's own contribution. Inheriting the already mixed pose\n // would blend it a second time and jump when the released track disappears.\n const nativeTrack = action.getClip().tracks[0] as NativeTrack;\n const sample = Array.from(nativeTrack.createInterpolant().evaluate(action.time));\n const released: ClipIRTrack = { ...previous.track, times: [0, duration], values: [...sample, ...sample], inheritStart: false };\n const releaseClip = { ...clip, name: previous.handle.name, tracks: [released] };\n const handle = this.handle({ name: releaseClip.name, kind: 'compiled', clip: releaseClip },\n { loopMode: 'once', finalPose: 'release', mixerWeight: action.getEffectiveWeight() }, true);\n connector.fadeOut(handle.actionId!, duration);\n const record = { track: released, handle, releasing: true };\n this.liveTargets.set(key, record);\n void handle.promise.then(() => { if (this.liveTargets.get(key) === record) this.liveTargets.delete(key); });\n handles.push(handle);\n }\n for (const [key, track] of tracks) {\n const previous = this.liveTargets.get(key);\n const endpoint = (value: ClipIRTrack) => value.values.slice(value.values.length / value.times.length * (value.times.length - 1));\n // Rust identifies semantic command destinations. Concrete targets outside\n // that command keep their native action, including an intentionally cancelled one.\n if (previous && !previous.releasing && !touched.has(key) && json(endpoint(previous.track)) === json(endpoint(track))) continue;\n const name = previous?.handle.name ?? `__embody_live_${this.nextLiveTarget++}`;\n const outgoing = previous?.handle.actionId && connector.getAction(previous.handle.actionId);\n let nativeTrack = track;\n if (duration > 0 && outgoing) {\n const start = Array.from((outgoing.getClip().tracks[0] as NativeTrack).createInterpolant().evaluate(outgoing.time));\n nativeTrack = { ...track, values: [...start, ...endpoint(track)], inheritStart: false };\n }\n const targetClip = { ...clip, name, tracks: [nativeTrack] };\n const handle = this.handle({ name, kind: 'compiled', clip: targetClip }, { loopMode: 'once', finalPose: 'hold' }, true);\n this.liveTargets.set(key, { track, handle, releasing: false });\n handles.push(handle);\n }\n return handles;\n }\n private mutateLive(mutate: () => void, durationMs = 0): CharacterPlaybackHandle[] {\n this.requireModel();\n this.core.begin_live_command();\n mutate();\n return this.commitLive(durationMs);\n }\n private transition(handles: CharacterPlaybackHandle[]): CharacterTransitionHandle {\n // A single control may own several concrete tracks. Replacement of one\n // shared target must not settle or cancel its other independent targets.\n let settled = handles.length === 0;\n const promise = Promise.all(handles.map((handle) => handle.promise)).then(() => { settled = true; });\n const control = (command: 'pause' | 'resume' | 'cancel') => {\n if (settled) return;\n for (const handle of handles) {\n const playback = handle.actionId && this.playbacks.get(handle.actionId);\n if (!playback || !playback.connector.getAction(playback.id)) continue;\n if (command === 'cancel' || !playback.terminal) handle[command]();\n }\n };\n return { promise, pause: () => control('pause'), resume: () => control('resume'), cancel: () => control('cancel') };\n }\n setAU(id: number, value: number, balance = this.core.get_au_balance(id)): void { this.mutateLive(() => this.core.set_au_signed(id, value, balance)); }\n getAU(id: number): number { return this.core.get_au(id); }\n getAUBalance(id: number): number { return this.core.get_au_balance(id); }\n getBodyControls(): any[] { return parse(this.core.get_body_controls_json()); }\n getSemanticPoseCatalog(): any[] { return parse(this.core.get_semantic_pose_catalog_json()); }\n captureSemanticPose(): JsonObject { return parse(this.core.capture_semantic_pose_json()); }\n validateSemanticPose(pose: JsonObject): JsonObject { return parse(this.core.validate_semantic_pose_json(json(pose))); }\n applySemanticPose(pose: JsonObject): void { this.mutateLive(() => this.core.apply_semantic_pose_json(json(pose))); }\n validateSemanticAnimation(animation: JsonObject, options: JsonObject = {}): void { this.core.validate_semantic_animation_json(json(animation), json(options)); }\n resetBodyControls(): void { this.mutateLive(() => this.core.reset_body_controls()); }\n setContinuum(negative: number, positive: number, value: number, balance = NaN): void { this.mutateLive(() => this.core.set_continuum(negative, positive, value, balance)); }\n getContinuum(negative: number, positive: number): number { return this.core.get_continuum(negative, positive); }\n transitionAU(id: number, value: number, durationMs = 200, balance = this.core.get_au_balance(id)): CharacterTransitionHandle { return this.transition(this.mutateLive(() => this.core.set_au_signed(id, value, balance), durationMs)); }\n setViseme(index: number, value: number, jawScale = 1): void { this.mutateLive(() => { this.core.set_viseme(index, value); this.core.set_viseme_jaw_scale(index, jawScale); }); }\n getViseme(index: number): number { return this.core.get_viseme(index); }\n getVisemeJawScale(index: number): number { return this.core.get_viseme_jaw_scale(index); }\n setVisemeById(id: string, value: number, jawScale = 1): void { const index = this.core.viseme_slot_index(id); if (index < 0) throw new Error(`Unknown viseme: ${id}`); this.setViseme(index, value, jawScale); }\n transitionViseme(index: number, value: number, durationMs = 80, jawScale = 1): CharacterTransitionHandle { return this.transition(this.mutateLive(() => { this.core.set_viseme(index, value); this.core.set_viseme_jaw_scale(index, jawScale); }, durationMs)); }\n transitionVisemeById(id: string, value: number, durationMs = 80, jawScale = 1): CharacterTransitionHandle { const index = this.core.viseme_slot_index(id); if (index < 0) return this.transition([]); return this.transitionViseme(index, value, durationMs, jawScale); }\n setAUMixWeight(id: number, value: number): void {\n const weight = Math.max(0, Math.min(1, value));\n this.mutateLive(() => this.core.set_au_mix_weight(id, weight));\n (this.profile.auMixDefaults ??= {})[id] = weight;\n (this.profileSource.auMixDefaults ??= {})[id] = weight;\n }\n getAUMixWeight(id: number): number { return this.core.get_au_mix_weight(id); }\n hasLeftRightBones(id: number): boolean { return this.core.has_left_right_bones(id); }\n setMorph(key: string | number, value: number, meshNames: string[] = []): void { this.mutateLive(() => { if (typeof key === 'number') this.core.set_morph_index(key, value, json(meshNames)); else this.core.set_morph(key, value, json(meshNames)); }); }\n setMorphOnMeshes(meshNames: string[], key: string | number, value: number): void { this.setMorph(key, value, meshNames); }\n releaseMorph(key: string | number, meshNames: string[] = []): void { this.mutateLive(() => { if (typeof key === 'number') this.core.release_morph_index(key, json(meshNames)); else this.core.release_morph(key, json(meshNames)); }); }\n transitionMorph(key: string | number, value: number, durationMs = 120, meshNames: string[] = []): CharacterTransitionHandle { return this.transition(this.mutateLive(() => { if (typeof key === 'number') this.core.set_morph_index(key, value, json(meshNames)); else this.core.set_morph(key, value, json(meshNames)); }, durationMs)); }\n\n getMorphTargets(): Record<string, string[]> { return Object.fromEntries(this.meshes.map((mesh) => [mesh.name, Object.keys(mesh.morphTargetDictionary ?? {}).sort()])); }\n getMorphTargetIndices(): Record<string, { name: string; index: number }[]> { return Object.fromEntries(this.meshes.map((mesh) => [mesh.name, Object.entries(mesh.morphTargetDictionary ?? {}).map(([name, index]) => ({ name, index })).sort((a, b) => a.index - b.index)])); }\n addMorphTarget(target: Parameters<ThreeFrameApplier['addMorphTarget']>[1], options?: Parameters<ThreeFrameApplier['addMorphTarget']>[2]): number { const index = this.applier.addMorphTarget(this.requireModel(), target, options); this.bindModel(); return index; }\n addMorphTargets(targets: Parameters<ThreeFrameApplier['addMorphTargets']>[1], options?: Parameters<ThreeFrameApplier['addMorphTargets']>[2]): Record<string, number> { const result = this.applier.addMorphTargets(this.requireModel(), targets, options); this.bindModel(); return result; }\n private meshCategory(mesh: Object3D): string { return this.profile.meshes?.[mesh.name]?.category ?? 'other'; }\n getMeshList(): JsonObject[] { return (this.inspection?.allMeshes ?? []).map((mesh) => ({ name: mesh.name, visible: mesh.visible, morphCount: mesh.morphTargetInfluences?.length ?? 0, category: this.meshCategory(mesh) })); }\n getBones(): ThreeModelInspection['bones'] { return this.bones; }\n private meshProfile(name: string): JsonObject { return (this.profile.meshes ??= {})[name] ??= { category: 'other' }; }\n setMeshVisible(name: string, visible: boolean): void { this.applier.setMeshVisible(this.requireModel(), name, visible); this.meshProfile(name).visible = visible; }\n highlightMesh(name: string | null, color?: number, value?: number): void { this.applier.highlightMesh(this.requireModel(), name, color, value); }\n getMeshMaterialConfig(name: string): Record<string, unknown> | null { return this.applier.getMeshMaterialConfig(this.requireModel(), name); }\n setMeshMaterialConfig(name: string, value: Parameters<ThreeFrameApplier['setMeshMaterialConfig']>[2]): void { this.applier.setMeshMaterialConfig(this.requireModel(), name, value); const entry = this.meshProfile(name); entry.material = { ...entry.material, ...value }; }\n\n registerHairObjects(objects: Object3D[]): { name: string; isMesh: boolean; isEyebrow: boolean }[] {\n this.hairObjects.clear();\n for (const object of objects) if ((object as Mesh).isMesh) this.hairObjects.set(object.name, object as Mesh);\n for (const category of ['hair', 'eyebrow']) {\n const mesh = [...this.hairObjects.values()].find((object) => this.meshCategory(object) === category);\n const material: any = mesh && (Array.isArray(mesh.material) ? mesh.material[0] : mesh.material);\n if (material) this.hairAppearance[`${category}Color`] = { ...this.hairAppearance[`${category}Color`], baseColor: material.color ? `#${material.color.getHexString()}` : '#000000', emissive: material.emissive ? `#${material.emissive.getHexString()}` : '#000000', emissiveIntensity: material.emissiveIntensity ?? 0 };\n }\n this.restartHair();\n return [...this.hairObjects.values()].map((mesh) => ({ name: mesh.name, isMesh: true, isEyebrow: this.meshCategory(mesh) === 'eyebrow' }));\n }\n getRegisteredHairObjects(): Object3D[] { return [...this.hairObjects.values()]; }\n getHairMorphTargets(name?: string): string[] { const meshes = name ? [this.hairObjects.get(name)] : [...this.hairObjects.values()]; return [...new Set(meshes.flatMap((mesh) => Object.keys(mesh?.morphTargetDictionary ?? {})))].sort(); }\n getHairAppearance(): JsonObject { return copy(this.hairAppearance); }\n private setHairAppearance(category: 'hair' | 'eyebrow', value: string | JsonObject): void {\n const key = `${category}Color`;\n const next = parse(this.wasm.normalize_hair_color_appearance_json(json(value), json(this.hairAppearance[key])));\n this.hairAppearance[key] = next;\n this.applier.applyHairAppearance([...this.hairObjects.values()].filter((mesh) => this.meshCategory(mesh) === category), next);\n }\n setHairColor(value: string | JsonObject): void { this.setHairAppearance('hair', value); }\n setEyebrowColor(value: string | JsonObject): void { this.setHairAppearance('eyebrow', value); }\n setHairBaseColor(value: string): void { this.setHairColor({ baseColor: value }); }\n setEyebrowBaseColor(value: string): void { this.setEyebrowColor({ baseColor: value }); }\n setHairGlow(color: string, value: number): void { this.setHairColor({ emissive: color, emissiveIntensity: value }); }\n setEyebrowGlow(color: string, value: number): void { this.setEyebrowColor({ emissive: color, emissiveIntensity: value }); }\n setHairOutline(value: { show: boolean; color?: string; opacity?: number }): void { Object.assign(this.hairAppearance, { showOutline: value.show }, value.color ? { outlineColor: value.color } : {}, value.opacity !== undefined ? { outlineOpacity: value.opacity } : {}); }\n private restartHair(): void {\n for (const name of [...this.current.keys()]) if (name.startsWith('__embody_hair')) this.stopAnimation(name);\n if (!this.hairConfig.enabled || !this.hairObjects.size || !this.connector) return;\n if (this.hairConfig.idleSwayAmount > 0 || this.hairConfig.windStrength > 0) {\n const curves = parse(this.wasm.build_hair_idle_curves(json(this.hairConfig), this.hairConfig.idleClipDuration));\n if (Object.keys(curves).length) this.playSnippet('__embody_hair_idle', curves, { loopMode: 'repeat', meshNames: [...this.hairObjects.keys()], source: 'hair', blendMode: 'additive' });\n }\n }\n setHairPhysicsEnabled(value: boolean): void { this.setHairPhysicsConfig({ enabled: value }); }\n isHairPhysicsEnabled(): boolean { return !!this.hairConfig.enabled; }\n setHairPhysicsConfig(value: JsonObject): void { this.hairConfig = parse(this.core.set_hair_config_json(json(value))); this.restartHair(); }\n getHairPhysicsConfig(): JsonObject { return copy(this.hairConfig); }\n validateHairMorphTargets(): string[] {\n return parse(this.core.get_missing_hair_morph_targets_json(json(this.getHairMorphTargets())));\n }\n applyHairStateToObject(name: string, state: JsonObject): void {\n const mesh = this.hairObjects.get(name);\n if (!mesh) return;\n if (state.visible !== undefined) mesh.visible = state.visible;\n if (state.scale) mesh.scale.set(state.scale.x, state.scale.y, state.scale.z);\n if (state.position) mesh.position.set(state.position.x, state.position.y, state.position.z);\n if (state.color) this.applier.applyHairAppearance([mesh], state.color);\n }\n private authoredHeadMotion(clip: AnimationClip): { horizontal: number; vertical: number; pitch: number } | undefined {\n if (!this.hairConfig.enabled || clip.name.startsWith('__embody_hair') || !this.hairObjects.size) return undefined;\n // Serialize native bindings and sample storage only. The core resolves the\n // character's head role and compiles its configured hair response.\n const tracks: Array<{ boneName: string; current: number[]; reference: number[]; samples: number[][] }> = [];\n for (const track of clip.tracks) {\n if (track.ValueTypeName !== 'quaternion') continue;\n const parsed = PropertyBinding.parseTrackName(track.name);\n let object = PropertyBinding.findNode(this.requireModel(), parsed.nodeName) as Object3D | undefined;\n if (parsed.objectName === 'bones' && object) {\n const skeleton = (object as Object3D & { skeleton?: { bones: Object3D[] } }).skeleton;\n object = skeleton?.bones.find((bone) => bone.name === String(parsed.objectIndex)) ?? skeleton?.bones[Number(parsed.objectIndex)];\n }\n if (!object) continue;\n const cubic = (track as NativeTrack).createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true;\n const stride = track.getValueSize();\n const reference = this.restValues(track);\n if (!reference) continue;\n const samples: number[][] = [];\n for (let index = 0; index < track.times.length; index += 1) {\n const offset = index * stride + (cubic ? 4 : 0);\n samples.push(Array.from(track.values.subarray(offset, offset + 4)));\n }\n tracks.push({ boneName: object.name, current: object.quaternion.toArray(), reference, samples });\n }\n return parse(this.core.resolve_hair_motion_json(json(tracks), clip.blendMode === AdditiveAnimationBlendMode)) ?? undefined;\n }\n private setHairGravity(pitch: number, durationSeconds: number): void {\n const clip = parse<ClipIR>(this.core.build_hair_gravity_clip('__embody_hair_gravity', pitch, durationSeconds, json({ meshNames: [...this.hairObjects.keys()], source: 'hair' })));\n if (!clip.tracks.length) return;\n this.handle({ name: clip.name, kind: 'compiled', clip }, { loopMode: 'once', finalPose: 'hold', blendMode: 'additive' }, true);\n }\n playHairImpulse(horizontal: number, vertical: number): CharacterPlaybackHandle | undefined {\n if (!this.hairConfig.enabled || !this.hairObjects.size) return undefined;\n const curves = parse(this.wasm.build_hair_impulse_curves(json(this.hairConfig), this.hairConfig.impulseClipDuration, horizontal, vertical));\n if (!Object.keys(curves).length) return undefined;\n return this.playSnippet('__embody_hair_impulse', curves, { loopMode: 'once', finalPose: 'release', meshNames: [...this.hairObjects.keys()], source: 'hair', blendMode: 'additive' });\n }\n start(): void { this.assertAlive(); this.rendering = true; this.connector?.setRendering(true); }\n stop(): void { this.assertAlive(); this.rendering = false; this.connector?.setRendering(false); }\n clear(): void { this.mutateLive(() => this.core.clear()); }\n resetToNeutral(): void { this.clear(); }\n dispose(): void {\n if (this.disposed) return;\n this.connector?.dispose();\n this.core.free();\n this.playbacks.clear();\n this.current.clear();\n this.sources.clear();\n this.hairObjects.clear();\n this.meshes.length = 0;\n this.meshByName.clear();\n this.bones = {};\n this.liveTargets.clear();\n this.connector = undefined;\n this.inspection = undefined;\n this.boundModel = undefined;\n this.disposed = true;\n }\n}\n\nexport function createRustEmbodyHostUnbound(config: RustEmbodyHostConfig = {}): Embody { return new Embody(config); }\nexport async function createRustEmbodyHost(model: Object3D, config: RustEmbodyHostConfig = {}): Promise<Embody> {\n const character = await Embody.create(config);\n try { character.onReady({ model, meshes: config.meshes, referencePose: config.referencePose }); return character; }\n catch (error) { character.dispose(); throw error; }\n}\n","import { Box3 } from 'three';\nimport type { AnimationClip, Mesh, Object3D, Scene } from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\nexport type CharacterModelLoadResult = { model: Object3D; meshes: Mesh[]; animations: AnimationClip[]; gltf: GLTF | null };\nexport type CharacterModelLoadOptions = { onProgress?: (progress: number) => void; castShadows?: boolean; dracoDecoderPath?: string };\nexport type CharacterModelTransform = { modelOffset?: { x?: number; y?: number; z?: number }; modelRotation?: { x?: number; y?: number; z?: number }; modelScale?: number; modelGroundClearance?: number };\n\nlet draco: DRACOLoader | null = null;\nlet dracoPath = '';\nlet gltfLoader: GLTFLoader | null = null;\nlet gltfLoaderUsesDraco = false;\nlet fbxLoader: FBXLoader | null = null;\n\nconst getGltfLoader = (dracoDecoderPath?: string) => {\n const wantsDraco = typeof dracoDecoderPath === 'string' && dracoDecoderPath.length > 0;\n const normalizedPath = wantsDraco\n ? (dracoDecoderPath!.endsWith('/') ? dracoDecoderPath! : `${dracoDecoderPath!}/`)\n : '';\n\n // Rebuild only when Draco enablement/path changes. Non-Draco assets must not\n // pay for constructing/attaching DRACOLoader at all.\n if (!gltfLoader || gltfLoaderUsesDraco !== wantsDraco || (wantsDraco && normalizedPath !== dracoPath)) {\n draco?.dispose();\n draco = null;\n dracoPath = normalizedPath;\n gltfLoaderUsesDraco = wantsDraco;\n gltfLoader = new GLTFLoader();\n if (wantsDraco) {\n draco = new DRACOLoader().setDecoderPath(normalizedPath).setDecoderConfig({ type: 'wasm' });\n gltfLoader.setDRACOLoader(draco);\n }\n }\n return gltfLoader;\n};\n\nconst prepare = (model: Object3D, castShadows = true) => {\n const meshes: Mesh[] = [];\n model.traverse((object: any) => {\n if (!object.isMesh) return;\n if (castShadows) object.castShadow = true;\n if (object.morphTargetInfluences?.length) meshes.push(object);\n });\n return meshes;\n};\n\nconst progress = (listener?: (progress: number) => void) => {\n let last = -1;\n return (event: ProgressEvent) => {\n if (!listener || !event.lengthComputable) return;\n const next = Math.min(100, Math.max(0, Math.round(event.loaded / event.total * 100)));\n if (next !== last) { last = next; listener(next); }\n };\n};\n\nexport function applyCharacterModelTransform(model: Object3D, value: CharacterModelTransform = {}) {\n if (value.modelOffset) model.position.set(value.modelOffset.x ?? 0, value.modelOffset.y ?? 0, value.modelOffset.z ?? 0);\n if (value.modelRotation) model.rotation.set(...(['x', 'y', 'z'] as const).map((axis) => (value.modelRotation?.[axis] ?? 0) * Math.PI / 180) as [number, number, number]);\n if (Number.isFinite(value.modelScale) && (value.modelScale ?? 0) > 0) model.scale.setScalar(value.modelScale!);\n if (Number.isFinite(value.modelGroundClearance)) { model.updateMatrixWorld(true); const min = new Box3().setFromObject(model).min.y; if (Number.isFinite(min) && min < value.modelGroundClearance!) model.position.y += value.modelGroundClearance! - min; }\n}\n\nexport function disposeCharacterModel(scene: Scene | null, model: Object3D) {\n scene?.remove(model);\n model.traverse((object: any) => {\n object.geometry?.dispose?.();\n for (const material of object.material ? (Array.isArray(object.material) ? object.material : [object.material]) : []) {\n for (const value of Object.values(material) as any[]) if (value?.isTexture) value.dispose?.();\n material.dispose?.();\n }\n });\n}\n\nexport function loadCharacterModel(url: string, options: CharacterModelLoadOptions = {}): Promise<CharacterModelLoadResult> {\n const done = (model: Object3D, animations: AnimationClip[], gltf: GLTF | null) => ({ model, meshes: prepare(model, options.castShadows), animations, gltf });\n if (/\\.fbx(?:\\?|$)/i.test(url)) {\n fbxLoader ??= new FBXLoader();\n return new Promise((resolve, reject) => fbxLoader!.load(url, (model) => resolve(done(model, model.animations ?? [], null)), progress(options.onProgress), reject));\n }\n const loader = getGltfLoader(options.dracoDecoderPath);\n return new Promise((resolve, reject) => loader.load(url, (gltf) => resolve(done(gltf.scene, gltf.animations ?? [], gltf)), progress(options.onProgress), reject));\n}\n\nexport function parseCharacterModel(data: ArrayBuffer, resourcePath = '', options: CharacterModelLoadOptions = {}): Promise<CharacterModelLoadResult> {\n const loader = getGltfLoader(options.dracoDecoderPath);\n return new Promise((resolve, reject) => loader.parse(data, resourcePath, (gltf) => resolve({ model: gltf.scene, meshes: prepare(gltf.scene, options.castShadows), animations: gltf.animations ?? [], gltf }), reject));\n}\n","import {\n ACESFilmicToneMapping,\n Color,\n DirectionalLight,\n HemisphereLight,\n MathUtils,\n Mesh,\n PCFShadowMap,\n PCFSoftShadowMap,\n PerspectiveCamera,\n PlaneGeometry,\n PMREMGenerator,\n Scene,\n ShadowMaterial,\n SRGBColorSpace,\n WebGLCoordinateSystem,\n WebGLRenderer,\n WebGPUCoordinateSystem,\n} from 'three';\nimport type { ColorRepresentation, CoordinateSystem, Light, LightShadow, OrthographicCamera, RenderTarget, Texture } from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';\nimport { registerSceneRendering } from './sceneRenderingBinding';\nimport { prepareModelSkinning } from './modelSkinning';\n\nexport type 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 const DEFAULT_CHARACTER_LIGHTING_PRESETS = {\n cleanStudio: { id: 'cleanStudio', label: 'Soft Studio', settings: { envMapEnabled: true, environmentIntensity: .24, environmentBlur: .04, exposure: 1.08, ambientIntensity: .32, keyIntensity: .52, fillIntensity: .18, rimIntensity: .08, shadowOpacity: .22 } },\n softFill: { id: 'softFill', label: 'Soft Fill', settings: { envMapEnabled: true, environmentIntensity: .3, environmentBlur: .04, exposure: 1.1, ambientIntensity: .38, keyIntensity: .44, fillIntensity: .24, rimIntensity: .1, shadowOpacity: .18 } },\n inspection: { id: 'inspection', label: 'Inspection', settings: { envMapEnabled: true, environmentIntensity: .45, environmentBlur: .035, exposure: 1.18, ambientIntensity: .48, keyIntensity: .58, fillIntensity: .32, rimIntensity: .14, shadowOpacity: .12 } },\n contrast: { id: 'contrast', label: 'Contrast', settings: { envMapEnabled: true, environmentIntensity: .2, environmentBlur: .035, exposure: 1.08, ambientIntensity: .25, keyIntensity: .7, fillIntensity: .12, rimIntensity: .22, shadowOpacity: .28 } },\n} as const;\n\nexport type DefaultCharacterLightingPresetId = keyof typeof DEFAULT_CHARACTER_LIGHTING_PRESETS;\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_ID: DefaultCharacterLightingPresetId = 'cleanStudio';\nexport const DEFAULT_CHARACTER_LIGHTING_PRESET_IDS = Object.keys(DEFAULT_CHARACTER_LIGHTING_PRESETS) as DefaultCharacterLightingPresetId[];\nexport const DEFAULT_CHARACTER_LIGHTING_SETTINGS: DefaultCharacterLightingSettings = { ...DEFAULT_CHARACTER_LIGHTING_PRESETS.cleanStudio.settings };\n\nexport const CHARACTER_SCENE_TYPES = {\n studio: { id: 'studio', label: 'Studio', description: 'Transparent background, soft studio lighting, ground shadow.', background: null, lightingPreset: 'cleanStudio', shadowPlane: true },\n showcase: { id: 'showcase', label: 'Showcase', description: 'Dark backdrop with contrasty key/rim lighting for presentation shots.', background: 0x101216, lightingPreset: 'contrast', shadowPlane: true },\n inspection: { id: 'inspection', label: 'Inspection', description: 'Bright, even lighting on a light backdrop for close-up review.', background: 0xe8eaed, lightingPreset: 'inspection', shadowPlane: true },\n void: { id: 'void', label: 'Void', description: 'Transparent background, soft fill lighting, no ground shadow.', background: null, lightingPreset: 'softFill', shadowPlane: false },\n} as const;\nexport type CharacterSceneTypeId = keyof typeof CHARACTER_SCENE_TYPES;\nexport const CHARACTER_SCENE_TYPE_IDS = Object.keys(CHARACTER_SCENE_TYPES) as CharacterSceneTypeId[];\nexport const DEFAULT_CHARACTER_SCENE_TYPE_ID: CharacterSceneTypeId = 'studio';\n\nexport type DefaultCharacterSceneOptions = {\n type?: CharacterSceneTypeId;\n background?: ColorRepresentation | null;\n cameraFov?: number;\n pixelRatioCap?: number;\n shadows?: boolean;\n lightingPreset?: DefaultCharacterLightingPresetId;\n lighting?: Partial<DefaultCharacterLightingSettings>;\n shadowPlane?: boolean;\n manageResize?: boolean;\n};\n\nexport type DefaultCharacterSceneAsyncOptions = DefaultCharacterSceneOptions & {\n /** Auto (default) tries native WebGPU initialization, then falls back to WebGL. */\n renderer?: CharacterSceneRendererPreference;\n /** Persistent settings take precedence over the legacy renderer option. */\n rendering?: Partial<CharacterSceneRenderingSettings>;\n /** Cancels construction, not ownership of a successfully returned scene. */\n signal?: AbortSignal;\n /** Compatibility notification; rendering snapshots also expose device loss. */\n onDeviceLost?: (error: Error) => void;\n};\n\nexport type CharacterSceneRenderer = WebGLRenderer | WebGPURenderer;\nexport type CharacterSceneBackend = 'webgl' | 'webgpu';\nexport type CharacterSceneRendererPreference = 'auto' | CharacterSceneBackend;\n\ntype CharacterScene<R extends CharacterSceneRenderer> = {\n container: HTMLElement;\n scene: Scene;\n renderer: R;\n camera: PerspectiveCamera;\n lighting: ReturnType<typeof createDefaultCharacterLighting>;\n shadowPlane: ReturnType<typeof createShadowPlane> | null;\n sceneType: CharacterSceneTypeId;\n ownsScene: true;\n resize: () => void;\n dispose: () => void;\n};\n\nexport type DefaultCharacterScene = CharacterScene<WebGLRenderer>;\nexport type CharacterSceneRenderingSettings = { preference: CharacterSceneRendererPreference };\nexport type CharacterSceneRenderingStatus = 'initializing' | 'switching' | 'ready' | 'error' | 'lost' | 'disposed';\nexport type CharacterSceneRenderingSnapshot = {\n readonly settings: CharacterSceneRenderingSettings;\n readonly status: CharacterSceneRenderingStatus;\n readonly error: Error | null;\n} & (\n | { readonly backend: 'webgl'; readonly renderer: WebGLRenderer }\n | { readonly backend: 'webgpu'; readonly renderer: WebGPURenderer }\n | { readonly backend: null; readonly renderer: null }\n);\nexport type CharacterSceneRendererLease = { readonly renderer: CharacterSceneRenderer; release(): void };\nexport interface CharacterSceneRenderingController {\n getSettings(): CharacterSceneRenderingSettings;\n getSnapshot(): CharacterSceneRenderingSnapshot;\n setSettings(patch: Partial<CharacterSceneRenderingSettings>): Promise<CharacterSceneRenderingSnapshot>;\n subscribe(listener: (snapshot: CharacterSceneRenderingSnapshot) => void): () => void;\n /** Borrow for capture/readback; release in finally. Unavailable during switching/loss. */\n acquireRenderer(): CharacterSceneRendererLease;\n /** Drain borrowed work, then synchronously detach/free caller-owned resources, even after loss/disposal. */\n releaseSceneResources(release: () => void): Promise<void>;\n}\nexport type DefaultCharacterSceneRuntimeOptions = DefaultCharacterSceneAsyncOptions;\nexport type DefaultCharacterSceneRuntime = Omit<CharacterScene<CharacterSceneRenderer>, 'renderer' | 'dispose'> & {\n readonly renderer: CharacterSceneRenderer | null;\n readonly backend: CharacterSceneBackend | null;\n dispose(): Promise<void>;\n readonly rendering: CharacterSceneRenderingController;\n readonly ready: Promise<CharacterSceneRenderingSnapshot>;\n};\nexport type ReadyDefaultCharacterScene = (\n | (Omit<DefaultCharacterScene, 'dispose'> & { readonly backend: 'webgl' })\n | (Omit<CharacterScene<WebGPURenderer>, 'dispose'> & { readonly backend: 'webgpu' })\n) & { readonly rendering: CharacterSceneRenderingController; dispose(): Promise<void> };\n\n// Register each resource as it is acquired. A failing disposer must not prevent\n// later resources from being released, and repeated disposal is harmless.\nfunction createDisposer() {\n const callbacks: Array<() => void> = [];\n let disposed = false;\n return {\n add: (callback: () => void) => { callbacks.push(callback); },\n isDisposed: () => disposed,\n dispose: () => {\n if (disposed) return;\n disposed = true;\n let failed = false;\n let firstError: unknown;\n for (const callback of callbacks.reverse()) {\n try { callback(); } catch (error) {\n if (!failed) firstError = error;\n failed = true;\n }\n }\n callbacks.length = 0;\n if (failed) throw firstError;\n },\n };\n}\n\nfunction rollback(dispose: () => void) {\n // Preserve the construction/preparation error after attempting all cleanup.\n try { dispose(); } catch { /* The original failure is more useful to callers. */ }\n}\n\nconst finite = (value: unknown, min: number, max: number, fallback: number) => {\n const number = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(number) ? MathUtils.clamp(number, min, max) : fallback;\n};\n\nconst normalize = (value: Partial<Record<keyof DefaultCharacterLightingSettings, unknown>>): DefaultCharacterLightingSettings => ({\n envMapEnabled: typeof value.envMapEnabled === 'boolean' ? value.envMapEnabled : DEFAULT_CHARACTER_LIGHTING_SETTINGS.envMapEnabled,\n environmentIntensity: finite(value.environmentIntensity, 0, 1.5, DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentIntensity),\n environmentBlur: finite(value.environmentBlur, 0, .04, DEFAULT_CHARACTER_LIGHTING_SETTINGS.environmentBlur),\n exposure: finite(value.exposure, .6, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.exposure),\n ambientIntensity: finite(value.ambientIntensity, 0, 1.4, DEFAULT_CHARACTER_LIGHTING_SETTINGS.ambientIntensity),\n keyIntensity: finite(value.keyIntensity, 0, 2.2, DEFAULT_CHARACTER_LIGHTING_SETTINGS.keyIntensity),\n fillIntensity: finite(value.fillIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.fillIntensity),\n rimIntensity: finite(value.rimIntensity, 0, 1.6, DEFAULT_CHARACTER_LIGHTING_SETTINGS.rimIntensity),\n shadowOpacity: finite(value.shadowOpacity, 0, .5, DEFAULT_CHARACTER_LIGHTING_SETTINGS.shadowOpacity),\n});\n\nexport const normalizeDefaultCharacterLightingSettings = (value: unknown) =>\n value && typeof value === 'object' && !Array.isArray(value)\n ? normalize(value as Partial<Record<keyof DefaultCharacterLightingSettings, unknown>>)\n : null;\n\nexport function createShadowPlane(scene: Scene, options: { size?: number; opacity?: number; yPosition?: number } = {}) {\n const plane = new Mesh(new PlaneGeometry(options.size ?? 20, options.size ?? 20), new ShadowMaterial({ opacity: options.opacity ?? .3 }));\n plane.rotation.x = -Math.PI / 2;\n plane.position.y = options.yPosition ?? -.01;\n plane.receiveShadow = true;\n plane.name = 'shadowPlane';\n scene.add(plane);\n return plane;\n}\n\nexport function createDefaultCharacterLighting(scene: Scene, renderer: WebGLRenderer, initial: Partial<DefaultCharacterLightingSettings> = {}) {\n return createCharacterLighting(scene, renderer, () => new PMREMGenerator(renderer), initial);\n}\n\ntype ScenePMREM = { fromScene(scene: Scene, sigma?: number): RenderTarget; dispose(): void };\n\ntype LightingRenderer = {\n renderer: CharacterSceneRenderer;\n pmrem: ScenePMREM;\n environment: RenderTarget | null;\n revision: number;\n dispose(): void;\n};\n\nfunction createCharacterLighting(scene: Scene, renderer: CharacterSceneRenderer, createPMREM: () => ScenePMREM, initial: Partial<DefaultCharacterLightingSettings>) {\n const lighting = createMutableCharacterLighting(scene, initial);\n try { lighting.commit(lighting.prepare(renderer, createPMREM)); return lighting.controller; }\n catch (error) { rollback(lighting.controller.dispose); throw error; }\n}\n\n/** Lights/settings stay stable; only backend-specific environment resources move. */\nfunction createMutableCharacterLighting(scene: Scene, initial: Partial<DefaultCharacterLightingSettings>) {\n const lifetime = createDisposer();\n try {\n const ambient = new HemisphereLight(0xf7fbff, 0x6b7280, 0);\n const key = new DirectionalLight(0xfffbf4, 0);\n const fill = new DirectionalLight(0xe8f0ff, 0);\n const rim = new DirectionalLight(0xdde8ff, 0);\n ambient.name = 'embodyCharacterAmbientHemisphereLight'; ambient.position.set(0, 8, 0);\n key.name = 'embodyCharacterKeyLight'; key.position.set(4.5, 7.5, 6.2); key.castShadow = true;\n key.shadow.mapSize.set(2048, 2048); Object.assign(key.shadow.camera, { near: .5, far: 50, left: -10, right: 10, top: 10, bottom: -10 }); key.shadow.bias = -.0001; key.shadow.radius = 4;\n fill.name = 'embodyCharacterFillLight'; fill.position.set(-5.5, 4.2, 4.5);\n rim.name = 'embodyCharacterRimLight'; rim.position.set(-3.5, 4.8, -5.4);\n lifetime.add(() => scene.remove(ambient, key, fill, rim));\n for (const light of [key, fill, rim]) lifetime.add(() => light.dispose());\n scene.add(ambient, key, fill, rim);\n const listeners = new Set<(value: DefaultCharacterLightingSettings) => void>();\n lifetime.add(() => listeners.clear());\n let active: LightingRenderer | null = null;\n let held = false;\n let closed = false;\n let revision = 0;\n let settings = normalize({ ...DEFAULT_CHARACTER_LIGHTING_SETTINGS, ...initial });\n lifetime.add(() => { scene.environment = null; active?.dispose(); active = null; });\n const rebuild = (target: LightingRenderer) => {\n let environment: RenderTarget | null = null;\n if (settings.envMapEnabled) {\n const room = new RoomEnvironment();\n try { environment = target.pmrem.fromScene(room, settings.environmentBlur); } finally { room.dispose(); }\n }\n target.environment?.dispose(); target.environment = environment; target.revision = revision;\n };\n const show = (target: LightingRenderer | null) => {\n if (target) {\n target.renderer.outputColorSpace = SRGBColorSpace;\n target.renderer.toneMapping = ACESFilmicToneMapping;\n target.renderer.toneMappingExposure = settings.exposure;\n }\n scene.environment = target?.environment?.texture ?? null;\n scene.environmentIntensity = settings.envMapEnabled ? settings.environmentIntensity : 0;\n ambient.intensity = settings.ambientIntensity; key.intensity = settings.keyIntensity; fill.intensity = settings.fillIntensity; rim.intensity = settings.rimIntensity;\n const plane = scene.getObjectByName('shadowPlane') as Mesh | undefined;\n for (const material of plane ? (Array.isArray(plane.material) ? plane.material : [plane.material]) : []) if (material instanceof ShadowMaterial) material.opacity = settings.shadowOpacity;\n };\n const prepare = (renderer: CharacterSceneRenderer, createPMREM: () => ScenePMREM): LightingRenderer => {\n const resources = createDisposer();\n try {\n const pmrem = createPMREM(); resources.add(() => pmrem.dispose());\n const target: LightingRenderer = { renderer, pmrem, environment: null, revision, dispose: resources.dispose };\n resources.add(() => { target.environment?.dispose(); target.environment = null; });\n rebuild(target); return target;\n } catch (error) { rollback(resources.dispose); throw error; }\n };\n const setSettings = (patch: Partial<DefaultCharacterLightingSettings>) => {\n if (closed || lifetime.isDisposed()) throw new Error('Character lighting has been disposed.');\n const previous = settings; settings = normalize({ ...settings, ...patch }); revision++;\n if (!held) {\n if (active && (previous.envMapEnabled !== settings.envMapEnabled || previous.environmentBlur !== settings.environmentBlur)) rebuild(active);\n show(active);\n }\n listeners.forEach((listener) => listener({ ...settings })); return { ...settings };\n };\n show(null);\n const controller = {\n getSettings: () => ({ ...settings }), getEnvironmentTexture: (): Texture | null => active?.environment?.texture ?? null,\n setSettings, setPreset: (id: DefaultCharacterLightingPresetId) => setSettings(DEFAULT_CHARACTER_LIGHTING_PRESETS[id]?.settings ?? {}),\n subscribe: (listener: (value: DefaultCharacterLightingSettings) => void) => {\n if (closed || lifetime.isDisposed()) throw new Error('Character lighting has been disposed.');\n listeners.add(listener); listener({ ...settings }); return () => { listeners.delete(listener); };\n },\n dispose: lifetime.dispose,\n };\n return {\n controller, prepare, show, close: () => { closed = true; }, revision: () => revision,\n hold: () => { held = true; },\n restore: () => {\n held = false;\n try { if (active && active.revision !== revision) rebuild(active); } finally { show(active); }\n },\n commit: (target: LightingRenderer) => {\n const previous = active; active = target; held = false; show(active);\n return previous;\n },\n };\n } catch (error) { rollback(lifetime.dispose); throw error; }\n}\n\nfunction constructDefaultCharacterScene<R extends CharacterSceneRenderer>(\n container: HTMLElement,\n options: DefaultCharacterSceneOptions,\n renderer: R,\n disposeRenderer: () => void,\n createLighting: (scene: Scene, settings: Partial<DefaultCharacterLightingSettings>) => ReturnType<typeof createDefaultCharacterLighting>,\n) {\n const lifetime = createDisposer();\n lifetime.add(disposeRenderer);\n try {\n const sceneType = CHARACTER_SCENE_TYPES[options.type as CharacterSceneTypeId] ?? CHARACTER_SCENE_TYPES.studio;\n const width = Math.max(1, container.clientWidth || globalThis.innerWidth || 1);\n const height = Math.max(1, container.clientHeight || globalThis.innerHeight || 1);\n const ratio = () => Math.min(globalThis.devicePixelRatio || 1, options.pixelRatioCap ?? 1.5);\n renderer.setPixelRatio(ratio()); renderer.setSize(width, height, true); renderer.shadowMap.enabled = options.shadows ?? true; renderer.shadowMap.type = PCFShadowMap;\n Object.assign(renderer.domElement.style, { display: 'block', width: '100%', height: '100%' });\n const scene = new Scene(); const background = options.background === undefined ? sceneType.background : options.background; scene.background = background == null ? null : new Color(background);\n const camera = new PerspectiveCamera(options.cameraFov ?? 45, width / height, .1, 1000);\n const preset = DEFAULT_CHARACTER_LIGHTING_PRESETS[(options.lightingPreset ?? sceneType.lightingPreset) as DefaultCharacterLightingPresetId]?.settings ?? DEFAULT_CHARACTER_LIGHTING_SETTINGS;\n const lighting = createLighting(scene, { ...preset, ...options.lighting });\n lifetime.add(() => lighting.dispose());\n const shadowPlane = (options.shadowPlane ?? sceneType.shadowPlane) ? createShadowPlane(scene, { opacity: lighting.getSettings().shadowOpacity }) : null;\n if (shadowPlane) {\n lifetime.add(() => shadowPlane.material.dispose());\n lifetime.add(() => shadowPlane.geometry.dispose());\n lifetime.add(() => scene.remove(shadowPlane));\n }\n const resize = () => {\n if (lifetime.isDisposed()) return;\n const w = Math.max(1, container.clientWidth || globalThis.innerWidth || 1);\n const h = Math.max(1, container.clientHeight || globalThis.innerHeight || 1);\n camera.aspect = w / h; camera.updateProjectionMatrix();\n renderer.setPixelRatio(ratio()); renderer.setSize(w, h, false);\n };\n const handle: CharacterScene<R> = { container, scene, renderer, camera, lighting, shadowPlane, sceneType: sceneType.id, ownsScene: true, resize, dispose: lifetime.dispose };\n const attach = () => {\n lifetime.add(() => { if (renderer.domElement.parentElement === container) container.removeChild(renderer.domElement); });\n container.appendChild(renderer.domElement);\n if (options.manageResize !== false) {\n lifetime.add(() => globalThis.removeEventListener?.('resize', resize));\n globalThis.addEventListener?.('resize', resize);\n }\n };\n return { handle, attach };\n } catch (error) {\n rollback(lifetime.dispose);\n throw error;\n }\n}\n\n/** The existing synchronous WebGL path; it does not wait for shader compilation. */\nexport function createDefaultCharacterScene(container: HTMLElement, options: DefaultCharacterSceneOptions = {}): DefaultCharacterScene {\n const { handle, attach } = constructWebGLScene(container, options);\n try { attach(); return handle; } catch (error) {\n rollback(handle.dispose);\n throw error;\n }\n}\n\nfunction constructWebGLScene(container: HTMLElement, options: DefaultCharacterSceneOptions) {\n const renderer = new WebGLRenderer({ alpha: true, antialias: true, powerPreference: 'high-performance' });\n return constructDefaultCharacterScene(container, options, renderer, () => renderer.dispose(),\n (scene, settings) => createDefaultCharacterLighting(scene, renderer, settings));\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (signal?.aborted) throw new DOMException('Character scene creation was aborted.', 'AbortError');\n}\n\ntype RendererCandidate = (\n | { backend: 'webgl'; renderer: WebGLRenderer }\n | { backend: 'webgpu'; renderer: WebGPURenderer }\n) & { createPMREM(): ScenePMREM; dispose(): void; lost: Error | null };\n\nfunction acquireWebGLRenderer(): RendererCandidate {\n const renderer = new WebGLRenderer({ alpha: true, antialias: true, powerPreference: 'high-performance' });\n const lifetime = createDisposer(); lifetime.add(() => renderer.dispose());\n return { backend: 'webgl', renderer, createPMREM: () => new PMREMGenerator(renderer), dispose: lifetime.dispose, lost: null };\n}\n\n// @types/three r184 omits this backend capability, which failed init still owns.\nfunction disposeBackend(backend: object) {\n if ('dispose' in backend && typeof backend.dispose === 'function') backend.dispose();\n}\n\nasync function acquireNativeRenderer(check: () => void, onLoss: (candidate: RendererCandidate) => void): Promise<RendererCandidate> {\n const lifetime = createDisposer();\n try {\n if (typeof navigator === 'undefined' || !('gpu' in navigator) || !navigator.gpu) {\n throw new Error('WebGPU is unavailable. Use WebGL or a browser with WebGPU in a secure context.');\n }\n const { WebGPURenderer, PMREMGenerator: WebGPUPMREMGenerator } = await import('three/webgpu');\n check();\n const renderer = new WebGPURenderer({ alpha: true, antialias: true, powerPreference: 'high-performance' });\n const initialBackend = renderer.backend;\n const candidate: RendererCandidate = {\n backend: 'webgpu', renderer, lost: null,\n createPMREM: () => new WebGPUPMREMGenerator(renderer), dispose: lifetime.dispose,\n };\n const originalDeviceLost = renderer.onDeviceLost.bind(renderer);\n renderer.onDeviceLost = (info) => {\n originalDeviceLost(info);\n if (lifetime.isDisposed() || candidate.lost) return;\n candidate.lost = new Error(`WebGPU device lost: ${info.message || 'Unknown reason'}`);\n onLoss(candidate);\n };\n lifetime.add(() => {\n try {\n if (renderer.hasInitialized()) renderer.dispose();\n else disposeBackend(renderer.backend);\n } finally {\n if (renderer.backend !== initialBackend) disposeBackend(initialBackend);\n }\n });\n await renderer.init(); check();\n if (candidate.lost) throw candidate.lost;\n if (!('isWebGPUBackend' in renderer.backend) || renderer.backend.isWebGPUBackend !== true) {\n throw new Error('Native WebGPU initialization failed; Three selected WebGL2. Select WebGL to retry.');\n }\n return candidate;\n } catch (error) { rollback(lifetime.dispose); check(); throw error; }\n}\n\nfunction renderingAborted() { return new DOMException('Character scene renderer request was cancelled.', 'AbortError'); }\nfunction rendererPreference(value: unknown): CharacterSceneRendererPreference {\n if (value === 'auto' || value === 'webgl' || value === 'webgpu') return value;\n throw new Error(`Unsupported character scene renderer: ${String(value)}`);\n}\n\n/** Three's WebGPU renderer changes these cameras; WebGLRenderer does not undo it. */\nfunction prepareCameraCoordinates(scene: Scene, camera: PerspectiveCamera, backend: CharacterSceneBackend): () => void {\n const cameras = new Set<PerspectiveCamera | OrthographicCamera>([camera]);\n const shadows: LightShadow<PerspectiveCamera | OrthographicCamera>[] = [];\n scene.traverse(object => {\n const light = object as Light & { shadow?: LightShadow<PerspectiveCamera | OrthographicCamera> };\n if (light.isLight && light.shadow) {\n cameras.add(light.shadow.camera);\n shadows.push(light.shadow);\n }\n });\n const previous = Array.from(cameras, current => [current, current.coordinateSystem] as const);\n const apply = (current: PerspectiveCamera | OrthographicCamera, coordinates: CoordinateSystem) => {\n current.coordinateSystem = coordinates;\n current.updateProjectionMatrix();\n };\n const coordinates = backend === 'webgpu' ? WebGPUCoordinateSystem : WebGLCoordinateSystem;\n cameras.forEach(current => apply(current, coordinates));\n shadows.forEach(shadow => { shadow.needsUpdate = true; });\n return () => {\n previous.forEach(([current, original]) => apply(current, original));\n shadows.forEach(shadow => { shadow.needsUpdate = true; });\n };\n}\n\n/** Stable scene ownership, including a recoverable initial renderer failure. */\nexport function createDefaultCharacterSceneRuntime(\n container: HTMLElement,\n options: DefaultCharacterSceneRuntimeOptions = {},\n): DefaultCharacterSceneRuntime {\n throwIfAborted(options.signal);\n const lifetime = createDisposer();\n try {\n const sceneType = CHARACTER_SCENE_TYPES[options.type as CharacterSceneTypeId] ?? CHARACTER_SCENE_TYPES.studio;\n const scene = new Scene();\n const background = options.background === undefined ? sceneType.background : options.background;\n scene.background = background == null ? null : new Color(background);\n const camera = new PerspectiveCamera(options.cameraFov ?? 45, 1, .1, 1000);\n const preset = DEFAULT_CHARACTER_LIGHTING_PRESETS[(options.lightingPreset ?? sceneType.lightingPreset) as DefaultCharacterLightingPresetId]?.settings ?? DEFAULT_CHARACTER_LIGHTING_SETTINGS;\n const lighting = createMutableCharacterLighting(scene, { ...preset, ...options.lighting });\n lifetime.add(lighting.controller.dispose);\n const shadowPlane = (options.shadowPlane ?? sceneType.shadowPlane) ? createShadowPlane(scene, { opacity: lighting.controller.getSettings().shadowOpacity }) : null;\n if (shadowPlane) {\n lifetime.add(() => shadowPlane.material.dispose());\n lifetime.add(() => shadowPlane.geometry.dispose());\n lifetime.add(() => scene.remove(shadowPlane));\n }\n let settings: CharacterSceneRenderingSettings = { preference: rendererPreference(options.rendering?.preference ?? options.renderer ?? 'auto') };\n let active: RendererCandidate | null = null;\n let candidateInUse: RendererCandidate | null = null;\n let status: CharacterSceneRenderingStatus = 'initializing';\n let error: Error | null = null;\n let disposed = false;\n let disposal: Promise<void> | null = null;\n let generation = 0;\n let pending: Promise<CharacterSceneRenderingSnapshot> | null = null;\n let pendingRendererChange: Promise<CharacterSceneRenderingSnapshot> | null = null;\n let leaseCount = 0;\n let pendingResourceReleases = 0;\n let leasesReleased: (() => void) | null = null;\n let leaseBarrier: Promise<void> | null = null;\n let resizeAttached = false;\n const listeners = new Set<(snapshot: CharacterSceneRenderingSnapshot) => void>();\n const getSnapshot = (): CharacterSceneRenderingSnapshot => {\n const common = { settings: { ...settings }, status, error };\n if (active?.backend === 'webgl') return { ...common, backend: 'webgl', renderer: active.renderer };\n if (active?.backend === 'webgpu') return { ...common, backend: 'webgpu', renderer: active.renderer };\n return { ...common, backend: null, renderer: null };\n };\n const notify = () => {\n const snapshot = getSnapshot();\n for (const listener of listeners) {\n try { listener(snapshot); } catch (failure) { console.error('Character rendering subscriber failed.', failure); }\n }\n };\n const sizeRenderer = (renderer: CharacterSceneRenderer, style = false) => {\n const w = Math.max(1, container.clientWidth || globalThis.innerWidth || 1);\n const h = Math.max(1, container.clientHeight || globalThis.innerHeight || 1);\n camera.aspect = w / h; camera.updateProjectionMatrix();\n renderer.setPixelRatio(Math.min(globalThis.devicePixelRatio || 1, options.pixelRatioCap ?? 1.5));\n renderer.setSize(w, h, style);\n };\n const resize = () => { if (!disposed && active) sizeRenderer(active.renderer); };\n lifetime.add(() => { if (resizeAttached) globalThis.removeEventListener?.('resize', resize); });\n const onLoss = (candidate: RendererCandidate) => {\n if (disposed || candidate !== active) return;\n status = status === 'switching' ? 'switching' : 'lost'; error = candidate.lost;\n void Promise.resolve().then(() => candidate.renderer.setAnimationLoop(null)).catch(() => undefined);\n void owner.binding?.suspend().catch((failure) => console.error('Character renderer suspension failed.', failure));\n notify();\n try { options.onDeviceLost?.(candidate.lost!); } catch (failure) { console.error('Character scene device-loss callback failed.', failure); }\n };\n const setSettings = (patch: Partial<CharacterSceneRenderingSettings>): Promise<CharacterSceneRenderingSnapshot> => {\n if (disposed) return Promise.reject(renderingAborted());\n let preference: CharacterSceneRendererPreference;\n try { preference = patch.preference === undefined ? settings.preference : rendererPreference(patch.preference); }\n catch (failure) { return Promise.reject(failure); }\n if (pendingRendererChange && preference === settings.preference && (status === 'initializing' || status === 'switching')) return pendingRendererChange;\n if (status === 'ready' && preference === settings.preference) return Promise.resolve(getSnapshot());\n settings = { preference };\n const request = ++generation;\n const previous = pending;\n status = active ? 'switching' : 'initializing'; error = null;\n const execute = async (): Promise<CharacterSceneRenderingSnapshot> => {\n let candidate: RendererCandidate | null = null;\n let environment: LightingRenderer | null = null;\n let suspended = false;\n let attached = false;\n let restoreCameraCoordinates = () => {};\n let restoreModelSkinning = () => {};\n const check = () => {\n if (disposed || generation !== request) throw renderingAborted();\n if (!active) throwIfAborted(options.signal);\n if (candidate?.lost) throw candidate.lost;\n };\n try {\n check();\n if (preference === 'webgl') candidate = acquireWebGLRenderer();\n else {\n try { candidate = await acquireNativeRenderer(check, onLoss); }\n catch (failure) {\n check();\n if (preference !== 'auto' || (failure instanceof Error && failure.name === 'AbortError')) throw failure;\n candidate = acquireWebGLRenderer();\n }\n }\n check();\n candidateInUse = candidate;\n const renderer = candidate.renderer;\n sizeRenderer(renderer, true);\n renderer.shadowMap.enabled = options.shadows ?? true;\n // WebGL PCF is already soft in supported Three versions; the old\n // constant warns and is replaced on the first draw. Keep native filtering.\n renderer.shadowMap.type = candidate.backend === 'webgl' ? PCFShadowMap : PCFSoftShadowMap;\n Object.assign(renderer.domElement.style, { display: 'block', width: '100%', height: '100%' });\n if (leaseCount) await leaseBarrier;\n check();\n if (owner.drain) await owner.drain;\n check();\n if (owner.binding) { suspended = true; await owner.binding.suspend(); }\n check();\n restoreCameraCoordinates = prepareCameraCoordinates(scene, camera, candidate.backend);\n restoreModelSkinning = prepareModelSkinning(scene);\n lighting.hold();\n // Environment changes during asynchronous compilation are deferred. If\n // authored settings changed meanwhile, prepare that revision before commit.\n do {\n environment?.dispose(); environment = lighting.prepare(renderer, candidate.createPMREM);\n lighting.show(environment);\n if (typeof renderer.compileAsync !== 'function') throw new Error('Async character scenes require Three.js WebGLRenderer.compileAsync.');\n await renderer.compileAsync(scene, camera); check();\n if (owner.binding) await owner.binding.prepare(renderer);\n else if (active) renderer.render(scene, camera);\n check();\n } while (environment.revision !== lighting.revision());\n sizeRenderer(renderer);\n // Stage the new canvas before removing the old one. A failed attach\n // or library binding leaves the old scene/renderer available.\n attached = true; container.appendChild(renderer.domElement);\n if (!resizeAttached && options.manageResize !== false) {\n resizeAttached = true; globalThis.addEventListener?.('resize', resize);\n }\n check();\n await owner.binding?.commit(renderer);\n check();\n const oldRenderer = active;\n const oldEnvironment = lighting.commit(environment); environment = null;\n active = candidate; candidate = null; attached = false;\n rollback(() => { if (oldRenderer?.renderer.domElement.parentElement === container) container.removeChild(oldRenderer.renderer.domElement); });\n rollback(() => oldEnvironment?.dispose());\n rollback(() => oldRenderer?.dispose());\n status = 'ready'; error = null;\n const snapshot = getSnapshot(); notify(); return snapshot;\n } catch (failure) {\n if (suspended) {\n try { await owner.binding?.suspend(); } catch { /* Preserve the switch failure. */ }\n if (owner.drain) await owner.drain.catch(() => undefined);\n }\n if (attached && candidate?.renderer.domElement.parentElement === container) container.removeChild(candidate.renderer.domElement);\n rollback(() => environment?.dispose());\n rollback(() => candidate?.dispose());\n const canceled = disposed || generation !== request || (!active && options.signal?.aborted);\n if (!disposed) {\n rollback(restoreModelSkinning);\n rollback(restoreCameraCoordinates);\n rollback(lighting.restore);\n if (suspended && active && !active.lost) {\n try { await owner.binding?.commit(active.renderer); } catch (resumeError) { owner.reportFailure(resumeError, active.renderer); }\n }\n if (generation === request) {\n status = active?.lost ? 'lost' : 'error';\n error = failure instanceof Error ? failure : new Error(String(failure)); notify();\n }\n }\n if (canceled) throw renderingAborted();\n throw failure;\n } finally { candidateInUse = null; }\n };\n const operation = previous ? previous.catch(() => undefined).then(execute) : Promise.resolve().then(execute);\n pending = operation;\n pendingRendererChange = operation;\n notify();\n const settled = () => {\n if (pending === operation) pending = null;\n if (pendingRendererChange === operation) pendingRendererChange = null;\n };\n void operation.then(settled, settled);\n return operation;\n };\n const rendering: CharacterSceneRenderingController = {\n getSettings: () => ({ ...settings }), getSnapshot, setSettings,\n subscribe: (listener) => {\n if (disposed) throw new Error('Character scene rendering has been disposed.');\n listeners.add(listener);\n try { listener(getSnapshot()); } catch (failure) { console.error('Character rendering subscriber failed.', failure); }\n return () => { listeners.delete(listener); };\n },\n acquireRenderer: () => {\n if (!active || active.lost || disposed || pendingResourceReleases || (status !== 'ready' && status !== 'error')) throw new Error('Character renderer is not available for capture.');\n if (leaseCount++ === 0) leaseBarrier = new Promise<void>((resolve) => { leasesReleased = resolve; });\n let released = false;\n return { renderer: active.renderer, release: () => {\n if (released) return; released = true;\n if (--leaseCount === 0) { leasesReleased?.(); leasesReleased = null; leaseBarrier = null; }\n } };\n },\n releaseSceneResources: (release) => {\n // Disposal already owns the drain. A later caller can free its resources\n // once that completion settles, including when owned cleanup failed.\n if (disposal) return disposal.then(release, release);\n const previous = pending;\n pendingResourceReleases++;\n const operation = Promise.resolve(previous).catch(() => undefined).then(async () => {\n if (leaseCount) await leaseBarrier;\n if (owner.drain) await owner.drain.catch(() => undefined);\n if (owner.binding) {\n await owner.binding.suspend().catch(failure => owner.reportFailure(failure, active?.renderer));\n }\n try {\n release();\n } finally {\n if (!disposed && active && !active.lost) {\n await owner.binding?.commit(active.renderer).catch(failure => owner.reportFailure(failure, active?.renderer));\n }\n }\n return getSnapshot();\n }).finally(() => { pendingResourceReleases--; });\n // Serialize release with replacement so a recovery requested during the\n // drain cannot compile resources that the callback is about to free.\n pending = operation;\n void operation.then(() => { if (pending === operation) pending = null; }, () => { if (pending === operation) pending = null; });\n return operation.then(() => undefined);\n },\n };\n const owner = registerSceneRendering(rendering, scene, camera, () => pending, (failure, renderer) => {\n if (disposed) return;\n const problem = failure instanceof Error ? failure : new Error(String(failure));\n if (candidateInUse && renderer === candidateInUse.renderer && renderer !== active?.renderer) { candidateInUse.lost = problem; return; }\n if (active) active.lost = problem;\n status = active ? 'lost' : 'error'; error = problem;\n void owner.binding?.suspend().catch(() => undefined);\n notify();\n });\n const dispose = (): Promise<void> => {\n if (disposal) return disposal;\n let resolve!: () => void;\n let reject!: (failure: unknown) => void;\n disposal = new Promise<void>((yes, no) => { resolve = yes; reject = no; });\n void disposal.catch(() => undefined);\n disposed = true; owner.disposed = true; generation++; lighting.close();\n status = 'disposed'; notify(); listeners.clear();\n const drain = owner.binding?.suspend() ?? owner.drain;\n const cleanup = () => {\n try {\n if (active?.renderer.domElement.parentElement === container) container.removeChild(active.renderer.domElement);\n try { lifetime.dispose(); } finally { active?.dispose(); }\n resolve();\n } catch (failure) { reject(failure); }\n };\n // Callers await this before releasing borrowed character resources. The\n // same completion also drains captures and a recently disposed camera.\n if (pending || leaseCount || drain) void Promise.allSettled([pending, drain, leaseBarrier]).then(cleanup);\n else cleanup();\n return disposal;\n };\n const ready = setSettings(settings);\n return { container, scene, camera, lighting: lighting.controller, shadowPlane, sceneType: sceneType.id, ownsScene: true,\n rendering, ready, get renderer() { return active?.renderer ?? null; }, get backend() { return active?.backend ?? null; }, resize, dispose };\n } catch (failure) { rollback(lifetime.dispose); throw failure; }\n}\n\n/** Compatibility factory: failure releases all owned resources. Use the runtime factory for initial retry. */\nexport async function createDefaultCharacterSceneAsync(\n container: HTMLElement,\n options: DefaultCharacterSceneAsyncOptions = {},\n): Promise<ReadyDefaultCharacterScene> {\n const runtime = createDefaultCharacterSceneRuntime(container, options);\n try {\n const snapshot = await runtime.ready;\n if (!snapshot.renderer) throw new Error('Character scene renderer was not initialized.');\n const handle: ReadyDefaultCharacterScene = snapshot.backend === 'webgl'\n ? { ...runtime, renderer: snapshot.renderer, backend: 'webgl' }\n : { ...runtime, renderer: snapshot.renderer, backend: 'webgpu' };\n // Existing callers keep their non-null contract after first success. Read\n // rendering.getSnapshot() when an atomic backend/renderer pair is needed.\n Object.defineProperties(handle, {\n renderer: { get: () => runtime.renderer }, backend: { get: () => runtime.backend },\n });\n return handle;\n } catch (failure) {\n try { await runtime.dispose(); } catch { /* Preserve acquisition failure. */ }\n throw failure;\n }\n}\n","import { PerspectiveCamera } from 'three';\nimport type { Camera, Scene } from 'three';\nimport { initEmbodyCore } from '@lovelace_lol/embody/wasm';\nimport { Embody } from './character';\nimport type { RustEmbodyHostConfig } from './character';\nimport { loadCharacterModel, applyCharacterModelTransform, disposeCharacterModel } from './model';\nimport type { CharacterModelLoadOptions, CharacterModelLoadResult, CharacterModelTransform } from './model';\nimport { createDefaultCharacterSceneAsync } from './scene';\nimport type { CharacterSceneBackend, CharacterSceneRenderer, CharacterSceneRenderingController, DefaultCharacterSceneAsyncOptions, ReadyDefaultCharacterScene } from './scene';\nimport { DPthreeCameraController } from './annotations/DPthreeCameraController';\nimport type { Profile } from './authoringTypes';\n\nexport interface CharacterHostCharacterOptions extends CharacterModelTransform {\n modelUrl: string;\n presetType?: string;\n profile?: Profile;\n}\nexport interface CharacterHostExternalScene {\n scene: Scene;\n renderer: CharacterSceneRenderer;\n backend?: CharacterSceneBackend;\n rendering?: CharacterSceneRenderingController;\n camera: Camera;\n mountCanvas?: boolean;\n manageResize?: boolean;\n}\nexport interface CharacterHostOptions {\n signal?: AbortSignal;\n container: HTMLElement;\n character: CharacterHostCharacterOptions;\n embody?: RustEmbodyHostConfig;\n scene?: Omit<DefaultCharacterSceneAsyncOptions, 'signal'>;\n external?: CharacterHostExternalScene;\n loader?: CharacterModelLoadOptions;\n autoStart?: boolean;\n renderLoop?: boolean;\n autoFrame?: boolean;\n}\nexport interface CharacterHost extends Omit<CharacterModelLoadResult, 'gltf'> {\n engine: Embody;\n scene: Scene;\n readonly renderer: CharacterSceneRenderer | null;\n readonly backend: CharacterSceneBackend | null;\n readonly rendering: CharacterSceneRenderingController | null;\n camera: Camera;\n lighting: ReadyDefaultCharacterScene['lighting'] | null;\n ownsScene: boolean;\n container: HTMLElement;\n setCharacter(character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions): Promise<void>;\n resize(): void;\n dispose(): Promise<void>;\n}\n\n/** Acquire a character and bind it to the existing Three rendering integration. */\nexport async function createCharacterHost(options: CharacterHostOptions): Promise<CharacterHost> {\n if (!options.container) throw new Error('createCharacterHost requires a container HTMLElement');\n if (!options.character?.modelUrl) throw new Error('createCharacterHost requires character.modelUrl');\n let loaded: CharacterModelLoadResult | undefined;\n let state: ReadyDefaultCharacterScene | CharacterHostExternalScene | undefined;\n let engine: Embody | undefined;\n let controller: DPthreeCameraController | undefined;\n let disposed = false;\n let disposal: Promise<void> | undefined;\n let switching: Promise<void> = Promise.resolve();\n let mountedCanvas: HTMLCanvasElement | undefined;\n const aborted = () => new DOMException('Character host creation was aborted', 'AbortError');\n const checkCreation = () => { if (options.signal?.aborted) throw aborted(); };\n const releaseModel = async (value: CharacterModelLoadResult) => {\n const release = () => disposeCharacterModel(state?.scene ?? null, value.model);\n if (state?.rendering) await state.rendering.releaseSceneResources(release);\n else release();\n };\n const makeEngine = (value: CharacterModelLoadResult, character: CharacterHostCharacterOptions) => {\n const next = new Embody({ ...options.embody, presetType: character.presetType ?? options.embody?.presetType, profile: character.profile ?? options.embody?.profile });\n try { next.onReady(value); return next; }\n catch (error) {\n try { next.dispose(); } catch { /* Preserve the binding failure. */ }\n throw error;\n }\n };\n const dispose = (): Promise<void> => {\n if (disposal) return disposal;\n disposed = true;\n disposal = (async () => {\n let failure: unknown;\n const attempt = async (release: () => unknown) => { try { await release(); } catch (error) { failure ??= error; } };\n // Cancel a queued preparation draw before waiting for replacement. It\n // may otherwise wait indefinitely for a frame on a suspended surface.\n await attempt(() => controller?.dispose());\n await switching.catch(() => {});\n await attempt(() => engine?.dispose());\n const ownedScene = !options.external && state && 'dispose' in state ? state : undefined;\n if (ownedScene) await attempt(() => ownedScene.dispose());\n const lastModel = loaded;\n if (lastModel) await attempt(() => releaseModel(lastModel));\n mountedCanvas?.remove();\n if (failure !== undefined) throw failure;\n })();\n return disposal;\n };\n try {\n checkCreation();\n loaded = await loadCharacterModel(options.character.modelUrl, options.loader);\n checkCreation();\n state = options.external ?? await createDefaultCharacterSceneAsync(options.container, { ...options.scene, signal: options.signal });\n checkCreation();\n await initEmbodyCore();\n checkCreation();\n applyCharacterModelTransform(loaded.model, options.character);\n state.scene.add(loaded.model);\n engine = makeEngine(loaded, options.character);\n if (options.external?.mountCanvas && !state.renderer.domElement.parentElement) {\n mountedCanvas = state.renderer.domElement;\n options.container.appendChild(mountedCanvas);\n }\n // Borrowed scenes keep their existing render owner unless explicitly requested.\n if (options.renderLoop ?? !options.external) {\n if (!(state.camera instanceof PerspectiveCamera)) throw new Error('Character host rendering requires a PerspectiveCamera');\n controller = new DPthreeCameraController({\n scene: state.scene, camera: state.camera, domElement: state.renderer.domElement,\n ...(state.rendering ? { rendering: state.rendering } : { renderer: state.renderer }),\n showDOMControls: false,\n });\n controller.setModel(loaded.model);\n await controller.prepareModelForRender(loaded.model, { signal: options.signal });\n if (options.autoFrame !== false) await controller.focusFullBody(0);\n }\n checkCreation();\n if (options.autoStart === false) engine.stop();\n else engine.start();\n const sceneState = state;\n const rendering = state.rendering ?? null;\n const host: CharacterHost = {\n engine, scene: state.scene, camera: state.camera,\n get renderer() { return rendering ? rendering.getSnapshot().renderer : sceneState.renderer; },\n get backend() { return rendering ? rendering.getSnapshot().backend : sceneState.backend ?? null; },\n rendering, model: loaded.model, meshes: loaded.meshes, animations: loaded.animations,\n lighting: 'lighting' in state ? state.lighting : null,\n ownsScene: !options.external, container: options.container,\n resize() { if ('resize' in sceneState) sceneState.resize(); },\n setCharacter(character, loader = options.loader) {\n if (disposed) return Promise.reject(new Error('Character host is disposed'));\n const change = switching.catch(() => {}).then(async () => {\n if (disposed) throw new Error('Character host is disposed');\n const next = await loadCharacterModel(character.modelUrl, loader);\n let nextEngine: Embody | undefined;\n try {\n if (disposed) throw new Error('Character host is disposed');\n applyCharacterModelTransform(next.model, character);\n nextEngine = makeEngine(next, character);\n nextEngine.stop();\n sceneState.scene.add(next.model);\n if (controller) await controller.prepareModelForRender(next.model);\n if (disposed) throw new Error('Character host is disposed');\n } catch (error) {\n try { nextEngine?.dispose(); } catch { /* Still release the acquired model. */ }\n try { await releaseModel(next); } catch { /* Preserve the replacement failure. */ }\n throw error;\n }\n const previous = loaded!;\n try { engine!.dispose(); }\n catch (error) {\n try { nextEngine?.dispose(); } catch { /* Still release the uncommitted model. */ }\n try { await releaseModel(next); } catch { /* Preserve the retirement failure. */ }\n throw error;\n }\n engine = nextEngine!;\n loaded = next;\n host.engine = engine;\n host.model = next.model;\n host.meshes = next.meshes;\n host.animations = next.animations;\n controller?.setModel(next.model);\n if (options.autoStart !== false) engine.start();\n await releaseModel(previous);\n if (controller && options.autoFrame !== false) await controller.focusFullBody(0);\n });\n switching = change;\n return change;\n },\n dispose,\n };\n return host;\n } catch (error) {\n try { await dispose(); } catch { /* Preserve the acquisition error. */ }\n throw error;\n }\n}\n","import {\n AdditiveBlending,\n AnimationClip,\n BufferAttribute,\n Euler,\n InterpolateDiscrete,\n MultiplyBlending,\n NoBlending,\n NormalBlending,\n NumberKeyframeTrack,\n PropertyBinding,\n Quaternion,\n QuaternionKeyframeTrack,\n SubtractiveBlending,\n VectorKeyframeTrack,\n} from 'three';\nexport * from './annotations/index';\nexport * from './authoring';\nexport * from './character';\nexport * from './characterHost';\nexport { renderScenePlayback, createScenePlaybackFrame } from './playbackRendering';\nimport { bindModelReferencePose } from './reference-pose';\nimport { concreteTrackName } from './clipBindings';\nimport type { ThreeModelReferencePose, ThreeReferencePoseNode } from './reference-pose';\n\nexport { captureModelReferencePose, bindModelReferencePose, extendModelReferencePose } from './reference-pose';\nexport type { ThreeModelReferencePose, ThreeReferencePoseNode } from './reference-pose';\nexport { ThreeNativePlaybackConnector } from './nativePlayback';\nexport type {\n ThreeNativeLoop,\n ThreeNativePlaybackOptions,\n ThreeNativePlaybackControl,\n ThreeNativePlaybackEvent,\n ThreeNativePlaybackBinding,\n} from './nativePlayback';\nimport type {\n KeyframeTrack,\n Material,\n Mesh,\n Object3D,\n} from 'three';\n\nexport const THREE_BLENDING_MODES = {\n Normal: NormalBlending,\n Additive: AdditiveBlending,\n Subtractive: SubtractiveBlending,\n Multiply: MultiplyBlending,\n None: NoBlending,\n} as const;\nexport const BLENDING_MODES = THREE_BLENDING_MODES;\n\ntype BoneEntry = {\n obj: Object3D;\n basePos: { x: number; y: number; z: number };\n baseQuat: ReturnType<Object3D['quaternion']['clone']>;\n baseEuler: { x: number; y: number; z: number; order: string };\n};\n\nconst MORPH_ATTRIBUTE_SEMANTICS = ['position', 'normal', 'tangent', 'color'] as const;\ntype MorphAttributeSemantic = typeof MORPH_ATTRIBUTE_SEMANTICS[number];\n\ntype MorphTargetInput = {\n meshName: string;\n name: string;\n relative?: boolean;\n position: ArrayLike<number>;\n normal?: ArrayLike<number>;\n tangent?: ArrayLike<number>;\n color?: ArrayLike<number>;\n};\n\ntype AddMorphTargetOptions = {\n forceGeometryReplacement?: boolean;\n replace?: boolean;\n resetInfluence?: boolean;\n};\n\ntype MorphMutationStage = {\n mesh: Mesh;\n sourceGeometry: Mesh['geometry'];\n geometry: Mesh['geometry'];\n dictionary: Record<string, number>;\n influences: number[];\n};\n\nconst createNeutralMorphAttribute = (\n geometry: Mesh['geometry'],\n semantic: MorphAttributeSemantic,\n name: string,\n) => {\n const base = geometry.getAttribute(semantic);\n if (!base) throw new Error(`Cannot create ${semantic} morph data without a base attribute`);\n\n const values = new Float32Array(base.count * base.itemSize);\n if (!geometry.morphTargetsRelative) {\n for (let vertexIndex = 0; vertexIndex < base.count; vertexIndex += 1) {\n for (let component = 0; component < base.itemSize; component += 1) {\n values[vertexIndex * base.itemSize + component] = base.getComponent(vertexIndex, component);\n }\n }\n }\n\n const attribute = new BufferAttribute(values, base.itemSize);\n attribute.name = name;\n return attribute;\n};\n\nconst createMorphAttribute = (\n geometry: Mesh['geometry'],\n semantic: MorphAttributeSemantic,\n name: string,\n data: ArrayLike<number>,\n sourceIsRelative: boolean,\n) => {\n const base = geometry.getAttribute(semantic);\n if (!base || data.length !== base.count * base.itemSize) {\n throw new Error(`Invalid ${semantic} morph data length`);\n }\n\n const values = new Float32Array(Array.from(data));\n const destinationIsRelative = geometry.morphTargetsRelative;\n if (sourceIsRelative !== destinationIsRelative) {\n for (let vertexIndex = 0; vertexIndex < base.count; vertexIndex += 1) {\n for (let component = 0; component < base.itemSize; component += 1) {\n const offset = vertexIndex * base.itemSize + component;\n const baseValue = base.getComponent(vertexIndex, component);\n values[offset] = destinationIsRelative\n ? values[offset] - baseValue\n : values[offset] + baseValue;\n }\n }\n }\n\n const attribute = new BufferAttribute(values, base.itemSize);\n attribute.name = name;\n return attribute;\n};\n\nexport type ThreeModelInspection = {\n descriptor: Record<string, unknown> & {\n morphTargets: Array<{\n id: number;\n meshId: number | undefined;\n name: string;\n hostIndex: number;\n initialValue: number;\n }>;\n };\n meshByName: Map<string, Mesh>;\n allMeshes: Mesh[];\n morphMeshes: Mesh[];\n bones: Record<string, BoneEntry>;\n meshBindings: Map<number, Mesh>;\n morphBindings: Map<number, { mesh: Mesh; index: number }>;\n boneBindings: Map<number, Object3D>;\n objectBindings: Map<number, Object3D>;\n};\n\nconst transform = (obj: Object3D) => ({\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\nconst snapshot = (obj: Object3D, reference?: ThreeReferencePoseNode): BoneEntry => {\n if (!reference) {\n return {\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 { position, rotation } = reference.transform;\n const baseQuat = new Quaternion(rotation.x, rotation.y, rotation.z, rotation.w);\n const euler = reference.rotationEuler ?? new Euler().setFromQuaternion(baseQuat, reference.rotationOrder);\n return {\n obj,\n basePos: { ...position },\n baseQuat,\n baseEuler: { x: euler.x, y: euler.y, z: euler.z, order: reference.rotationOrder },\n };\n};\n\nconst boneDepth = (obj: Object3D) => {\n let depth = 0;\n let parent = obj.parent;\n while (parent) {\n if ((parent as any).isBone || parent.type === 'Bone') depth += 1;\n parent = parent.parent;\n }\n return depth;\n};\n\nconst morphEntries = (mesh: Mesh) => {\n const dictionary = mesh.morphTargetDictionary\n ?? (mesh.geometry as unknown as { morphTargetDictionary?: Record<string, number> }).morphTargetDictionary;\n if (dictionary) {\n return Object.entries(dictionary)\n .map(([name, index]) => ({ name, index }))\n .sort((left, right) => left.index - right.index);\n }\n return (mesh.morphTargetInfluences ?? []).map((_, index) => ({ name: `morph_${index}`, index }));\n};\n\nexport class ThreeModelInspector {\n inspectModel(model: Object3D, options: {\n meshes?: Mesh[];\n profile?: any;\n /** Explicit reference captured before playback; omitted keeps legacy current-pose inspection. */\n referencePose?: ThreeModelReferencePose;\n } = {}): ThreeModelInspection {\n const references = options.referencePose ? bindModelReferencePose(model, options.referencePose) : undefined;\n const restTransform = (object: Object3D) => {\n const reference = references?.get(object);\n return reference ? {\n position: { ...reference.transform.position },\n rotation: { ...reference.transform.rotation },\n scale: { ...reference.transform.scale },\n } : transform(object);\n };\n const objects: Object3D[] = [];\n const allMeshes: Mesh[] = [];\n const boneObjects: Object3D[] = [];\n model.traverse((obj: any) => {\n objects.push(obj);\n if (obj.isMesh) allMeshes.push(obj);\n if (obj.isBone || obj.type === 'Bone') boneObjects.push(obj);\n });\n const inputMeshes = options.meshes ?? [];\n const morphMeshes = Array.from(new Set([...inputMeshes, ...allMeshes.filter((mesh) => morphEntries(mesh).length > 0)]));\n const meshByName = new Map(allMeshes.filter((mesh) => mesh.name).map((mesh) => [mesh.name, mesh]));\n const meshBindings = new Map(allMeshes.map((mesh, index) => [index + 1, mesh]));\n const boneBindings = new Map(boneObjects.map((bone, index) => [index + 1, bone]));\n const objectBindings = new Map(objects.map((object, index) => [index + 1, object]));\n const meshIds = new Map(Array.from(meshBindings, ([id, mesh]) => [mesh, id]));\n const boneIds = new Map(Array.from(boneBindings, ([id, bone]) => [bone, id]));\n const objectIds = new Map(Array.from(objectBindings, ([id, object]) => [object, id]));\n const morphBindings = new Map<number, { mesh: Mesh; index: number }>();\n const morphTargets: ThreeModelInspection['descriptor']['morphTargets'] = [];\n const morphIdsByMesh = new Map<Mesh, number[]>();\n let morphId = 1;\n for (const mesh of allMeshes) {\n const ids: number[] = [];\n for (const entry of morphEntries(mesh)) {\n ids.push(morphId);\n morphBindings.set(morphId, { mesh, index: entry.index });\n morphTargets.push({\n id: morphId,\n meshId: meshIds.get(mesh),\n name: entry.name,\n hostIndex: entry.index,\n initialValue: mesh.morphTargetInfluences?.[entry.index] ?? 0,\n });\n morphId += 1;\n }\n morphIdsByMesh.set(mesh, ids);\n }\n const bones: Record<string, BoneEntry> = {};\n for (const bone of boneObjects) {\n if (bone.name) bones[bone.name] = snapshot(bone, references?.get(bone));\n }\n const profile = options.profile;\n if (profile?.boneNodes) {\n for (const [key, base] of Object.entries(profile.boneNodes as Record<string, string>)) {\n const prefix = profile.bonePrefix ?? '';\n const suffix = profile.boneSuffix ?? '';\n const name = `${base.startsWith(prefix) ? '' : prefix}${base}${base.endsWith(suffix) ? '' : suffix}`;\n const object = model.getObjectByName(name) ?? model.getObjectByName(base);\n if (object) bones[key] = bones[object.name] ?? snapshot(object, references?.get(object));\n }\n }\n return {\n descriptor: {\n id: model.uuid,\n name: model.name || undefined,\n meshes: allMeshes.map((mesh) => ({\n id: meshIds.get(mesh),\n name: mesh.name,\n morphTargetIds: morphIdsByMesh.get(mesh) ?? [],\n visible: mesh.visible,\n })),\n morphTargets,\n bones: boneObjects.map((bone) => {\n const world = references?.get(bone)?.worldPosition ?? bone.getWorldPosition(bone.position.clone());\n const parent = bone.parent && ((bone.parent as any).isBone || bone.parent.type === 'Bone')\n ? bone.parent.name || null\n : null;\n return {\n id: boneIds.get(bone),\n name: bone.name,\n parentName: parent,\n worldPosition: { x: world.x, y: world.y, z: world.z },\n depth: boneDepth(bone),\n restTransform: restTransform(bone),\n };\n }),\n objects: objects.map((object) => ({\n id: objectIds.get(object),\n name: object.name,\n isBone: !!((object as any).isBone || object.type === 'Bone'),\n isCamera: !!(object as any).isCamera,\n restTransform: restTransform(object),\n })),\n },\n meshByName,\n allMeshes,\n morphMeshes,\n bones,\n meshBindings,\n morphBindings,\n boneBindings,\n objectBindings,\n };\n }\n}\n\nconst findTrackTarget = (model: Object3D, track: KeyframeTrack) => {\n try {\n const parsed = PropertyBinding.parseTrackName(track.name);\n const key = parsed.objectName === 'bones' && parsed.objectIndex\n ? String(parsed.objectIndex)\n : parsed.nodeName;\n const object = key\n ? model.getObjectByProperty('uuid', key) ?? PropertyBinding.findNode(model, key)\n : model;\n return { parsed, object };\n } catch {\n return null;\n }\n};\n\nexport type ClipIRTrack = {\n id?: number;\n channelId?: number;\n target: {\n kind?: string;\n meshId?: number;\n morphTargetId?: number;\n boneId?: number;\n objectId?: number;\n property?: string;\n };\n valueType: string;\n times: number[];\n values: number[];\n interpolation?: string;\n /** Replace the first sample with the bound property's current value. */\n inheritStart?: boolean;\n sourceName?: string;\n};\n\nexport type ClipIR = {\n name: string;\n durationSeconds?: number;\n channels?: Array<{ id: number; kind: string; name?: string }>;\n tracks: ClipIRTrack[];\n};\n\n/**\n * Convert host-neutral ClipIR (concrete morph/bone tracks) into a Three.js\n * AnimationClip. The host AnimationMixer owns playback and lerping.\n *\n * Inherited starts are captured from the current scene during this call. Cache\n * the ClipIR and call this again immediately before each play/replay, including\n * utterance replacement. Reusing a returned AnimationClip retains its old start.\n * The source ClipIR is never modified. A delayed inherited first key holds the\n * captured pose until that timestamp, matching ordinary Three track sampling.\n */\nexport function createAnimationClipFromClipIR(\n clip: ClipIR,\n inspection: ThreeModelInspection,\n): AnimationClip {\n const tracks: KeyframeTrack[] = [];\n for (const track of clip.tracks ?? []) {\n const kind = track.target?.kind;\n const trackName = concreteTrackName(track.target, inspection);\n if (!trackName) continue;\n const times = Array.from(track.times ?? []);\n const values = Array.from(track.values ?? []);\n if (!times.length || !values.length) continue;\n // Imported step tracks must keep their hold semantics on the host mixer.\n // Omitted/linear interpolation retains the existing Three default.\n const interpolation = track.interpolation === 'step' ? InterpolateDiscrete : undefined;\n\n if (kind === 'morphTarget') {\n const binding = inspection.morphBindings.get(Number(track.target.morphTargetId));\n if (!binding?.mesh) continue;\n if (track.inheritStart) {\n values[0] = binding.mesh.morphTargetInfluences?.[binding.index] ?? 0;\n }\n tracks.push(new NumberKeyframeTrack(trackName, times, values, interpolation));\n continue;\n }\n\n if (kind === 'boneTransform' || kind === 'objectTransform') {\n const object = kind === 'boneTransform'\n ? inspection.boneBindings.get(Number(track.target.boneId))\n : inspection.objectBindings.get(Number(track.target.objectId));\n if (!object) continue;\n const property = track.target.property ?? 'rotation';\n if (property === 'rotation' || property === 'quaternion') {\n if (track.inheritStart) object.quaternion.toArray(values, 0);\n tracks.push(new QuaternionKeyframeTrack(trackName, times, values, interpolation));\n } else if (property === 'position') {\n if (track.inheritStart) object.position.toArray(values, 0);\n tracks.push(new VectorKeyframeTrack(trackName, times, values, interpolation));\n } else if (property === 'scale') {\n if (track.inheritStart) object.scale.toArray(values, 0);\n tracks.push(new VectorKeyframeTrack(trackName, times, values, interpolation));\n }\n continue;\n }\n\n if (kind === 'meshVisibility') {\n const mesh = inspection.meshBindings.get(Number(track.target.meshId));\n if (!mesh) continue;\n if (track.inheritStart) values[0] = Number(mesh.visible);\n tracks.push(new NumberKeyframeTrack(trackName, times, values, interpolation));\n }\n }\n\n const duration = Number.isFinite(clip.durationSeconds)\n ? Number(clip.durationSeconds)\n : -1;\n return new AnimationClip(clip.name || 'clip', duration, tracks);\n}\n\nexport function serializeAnimationClips(\n model: Object3D,\n clips: readonly AnimationClip[],\n inspection: ThreeModelInspection,\n) {\n const meshIds = new Map(Array.from(inspection.meshBindings, ([id, mesh]) => [mesh, id]));\n const boneIds = new Map<object, number>(Array.from(inspection.boneBindings, ([id, bone]) => [bone, id]));\n const objectIds = new Map<object, number>(Array.from(inspection.objectBindings, ([id, object]) => [object, id]));\n return clips.map((clip) => {\n const tracks: ClipIRTrack[] = [];\n const channelKinds = new Map<string, number>();\n const channelId = (kind: 'face' | 'body' | 'scene') => {\n const existing = channelKinds.get(kind);\n if (existing) return existing;\n const id = channelKinds.size + 1;\n channelKinds.set(kind, id);\n return id;\n };\n clip.tracks.forEach((track, index) => {\n const found = findTrackTarget(model, track);\n if (!found?.object) return;\n const { parsed, object } = found;\n let target: ClipIRTrack['target'] | null = null;\n const property = parsed.propertyName;\n if ((property === 'morphTargetInfluences' || property === 'weights') && (object as any).isMesh) {\n const mesh = object as Mesh;\n const requested = parsed.propertyIndex;\n const indexValue = typeof requested === 'number'\n ? requested\n : Number.isFinite(Number(requested))\n ? Number(requested)\n : mesh.morphTargetDictionary?.[String(requested)];\n const binding = Array.from(inspection.morphBindings).find(([, entry]) => entry.mesh === mesh && entry.index === indexValue);\n if (binding) target = { kind: 'morphTarget', meshId: meshIds.get(mesh), morphTargetId: binding[0] };\n } else if (property === 'visible' && (object as any).isMesh) {\n target = { kind: 'meshVisibility', meshId: meshIds.get(object as Mesh) };\n } else {\n const transformProperty = property === 'quaternion' || property === 'rotation'\n ? 'rotation'\n : property === 'position'\n ? 'position'\n : property === 'scale'\n ? 'scale'\n : null;\n if (transformProperty) {\n const boneId = boneIds.get(object);\n target = boneId\n ? { kind: 'boneTransform', boneId, property: transformProperty }\n : { kind: 'objectTransform', objectId: objectIds.get(object), property: transformProperty };\n }\n }\n if (!target) return;\n const kind = target.kind === 'morphTarget'\n ? 'face'\n : target.kind === 'boneTransform'\n ? 'body'\n : 'scene';\n // glTF cubic tracks store in-tangent/value/out-tangent per key. The\n // registry/validation view describes values; native playback retains\n // the original track and its Three interpolant, including its tangents.\n const cubic = !!(track as KeyframeTrack & {\n createInterpolant: { isInterpolantFactoryMethodGLTFCubicSpline?: boolean };\n }).createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline;\n const size = track.getValueSize() / (cubic ? 3 : 1);\n if (!Array.from(track.values).every(Number.isFinite)) {\n throw new Error(`Animation track ${JSON.stringify(track.name)} contains non-finite samples.`);\n }\n const values = cubic\n ? Array.from(track.times).flatMap((_, key) => Array.from(track.values.slice((key * 3 + 1) * size, (key * 3 + 2) * size)))\n : Array.from(track.values);\n tracks.push({\n id: index + 1,\n channelId: channelId(kind),\n target,\n valueType: size === 4 ? 'quat' : size === 3 ? 'vec3' : 'scalar',\n times: Array.from(track.times),\n values,\n interpolation: track.getInterpolation() === InterpolateDiscrete ? 'step' : 'linear',\n sourceName: track.name,\n });\n });\n return {\n name: clip.name,\n durationSeconds: clip.duration,\n channels: Array.from(channelKinds, ([kind, id]) => ({ id, kind, name: kind })),\n tracks,\n };\n });\n}\n\ntype MaterialConfig = {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: keyof typeof THREE_BLENDING_MODES;\n};\n\nconst materials = (value: Material | Material[] | undefined): Material[] =>\n value ? (Array.isArray(value) ? value : [value]) : [];\n\nexport class ThreeFrameApplier {\n private meshes = new Map<number, Mesh>();\n private morphs = new Map<number, { mesh: Mesh; index: number }>();\n private bones = new Map<number, Object3D>();\n private objects = new Map<number, Object3D>();\n private originalEmissive = new Map<string, { color: number; intensity: number }>();\n\n setBindings(inspection: ThreeModelInspection) {\n this.meshes = new Map(inspection.meshBindings);\n this.morphs = new Map(inspection.morphBindings);\n this.bones = new Map(inspection.boneBindings);\n this.objects = new Map(inspection.objectBindings);\n }\n\n applyPackedMorphFrameDelta(values: ArrayLike<number>, stride = 4) {\n for (let offset = 0; offset + stride <= values.length; offset += stride) {\n const binding = this.morphs.get(values[offset + 1]);\n if (binding?.mesh.morphTargetInfluences) {\n binding.mesh.morphTargetInfluences[binding.index] = values[offset + 2] ?? 0;\n }\n }\n }\n\n applyPackedBoneFrameDelta(values: ArrayLike<number>, stride = 9) {\n for (let offset = 0; offset + stride <= values.length; offset += stride) {\n const bone = this.bones.get(values[offset]);\n if (!bone) continue;\n const flags = values[offset + 8] ?? 0;\n if (flags & 1) bone.position.set(values[offset + 1], values[offset + 2], values[offset + 3]);\n if (flags & 2) bone.quaternion.set(values[offset + 4], values[offset + 5], values[offset + 6], values[offset + 7]).normalize();\n bone.updateMatrixWorld(false);\n }\n }\n\n applySceneFrame(frame: string | Record<string, any>) {\n const value = typeof frame === 'string' ? JSON.parse(frame) : frame;\n for (const write of value.boneScales ?? []) this.bones.get(write.boneId)?.scale.fromArray(write.scale);\n for (const write of value.objects ?? []) {\n const object = this.objects.get(write.objectId);\n if (!object) continue;\n if (write.position) object.position.fromArray(write.position);\n if (write.rotation) object.quaternion.fromArray(write.rotation).normalize();\n if (write.scale) object.scale.fromArray(write.scale);\n object.updateMatrixWorld(false);\n }\n for (const write of value.meshes ?? []) {\n const mesh = this.meshes.get(write.meshId);\n if (mesh) mesh.visible = write.visible;\n }\n }\n\n applyMeshMaterialConfigs(root: Object3D, configs: Record<string, { visible?: boolean; material?: MaterialConfig }>) {\n root.traverse((object: any) => {\n if (!object.isMesh || !object.name) return;\n const config = configs[object.name];\n if (!config) return;\n // Profile replay runs when a model binds and when its profile changes.\n // A visibility-only entry is just as authored as a material override.\n if (typeof config.visible === 'boolean') object.visible = config.visible;\n if (config.material) this.applyMaterial(object, config.material);\n });\n }\n\n getMeshMaterialConfig(root: Object3D, name: string) {\n let result: Record<string, unknown> | null = null;\n this.visitMesh(root, name, (mesh) => {\n const material: any = materials((mesh as any).material)[0];\n if (!material) return;\n const blending = Object.entries(THREE_BLENDING_MODES).find(([, value]) => value === material.blending)?.[0] ?? 'Normal';\n result = { renderOrder: mesh.renderOrder, transparent: material.transparent, opacity: material.opacity, depthWrite: material.depthWrite, depthTest: material.depthTest, blending };\n });\n return result;\n }\n\n setMeshMaterialConfig(root: Object3D, name: string, config: MaterialConfig) {\n this.visitMesh(root, name, (mesh) => this.applyMaterial(mesh, config));\n }\n\n setMeshVisible(root: Object3D, name: string, visible: boolean) {\n this.visitMesh(root, name, (mesh) => { mesh.visible = visible; });\n }\n\n highlightMesh(root: Object3D, name: string | null, color = 0x00ffff, intensity = 0.5) {\n root.traverse((object: any) => {\n if (!object.isMesh) return;\n for (const material of materials(object.material) as any[]) {\n if (!material.emissive) continue;\n const key = `${object.uuid}:${material.uuid}`;\n if (name === object.name) {\n if (!this.originalEmissive.has(key)) this.originalEmissive.set(key, { color: material.emissive.getHex(), intensity: material.emissiveIntensity ?? 0 });\n material.emissive.setHex(color);\n material.emissiveIntensity = intensity;\n } else {\n const original = this.originalEmissive.get(key);\n if (original) {\n material.emissive.setHex(original.color);\n material.emissiveIntensity = original.intensity;\n }\n }\n }\n });\n }\n\n applyHairAppearance(meshes: readonly Mesh[], appearance: any) {\n for (const mesh of meshes) {\n for (const material of materials((mesh as any).material) as any[]) {\n if (appearance.baseColor && material.color) material.color.set(appearance.baseColor);\n if (appearance.emissive && material.emissive) material.emissive.set(appearance.emissive);\n if (typeof appearance.emissiveIntensity === 'number') material.emissiveIntensity = appearance.emissiveIntensity;\n material.needsUpdate = true;\n }\n }\n }\n\n addMorphTarget(\n root: Object3D,\n target: MorphTargetInput,\n options: AddMorphTargetOptions = {},\n ) {\n return this.addMorphTargets(root, [target], options)[`${target.meshName}:${target.name}`];\n }\n\n addMorphTargets(\n root: Object3D,\n targets: readonly MorphTargetInput[],\n options: AddMorphTargetOptions = {},\n ) {\n if (targets.length === 0) return {};\n\n const stages = new Map<string, MorphMutationStage>();\n const result: Record<string, number> = {};\n const batchKeys = new Set<string>();\n\n try {\n for (const target of targets) {\n const key = `${target.meshName}:${target.name}`;\n if (batchKeys.has(key)) throw new Error(`Morph target appears more than once in batch: ${key}`);\n batchKeys.add(key);\n\n let stage = stages.get(target.meshName);\n if (!stage) {\n const mesh = root.getObjectByName(target.meshName) as Mesh | null;\n if (!mesh || !(mesh as any).isMesh) throw new Error(`Mesh not found: ${target.meshName}`);\n stage = {\n mesh,\n sourceGeometry: mesh.geometry,\n geometry: mesh.geometry.clone(),\n dictionary: {\n ...(mesh.morphTargetDictionary\n ?? (mesh.geometry as unknown as { morphTargetDictionary?: Record<string, number> })\n .morphTargetDictionary\n ?? {}),\n },\n influences: [...(mesh.morphTargetInfluences ?? [])],\n };\n stages.set(target.meshName, stage);\n }\n\n result[key] = this.applyMorphTargetToStage(stage, target, options);\n }\n } catch (error) {\n for (const stage of stages.values()) stage.geometry.dispose();\n throw error;\n }\n\n const replaceGeometry = options.forceGeometryReplacement !== false;\n for (const stage of stages.values()) {\n const committedGeometry: any = replaceGeometry ? stage.geometry : stage.sourceGeometry;\n if (!replaceGeometry) {\n committedGeometry.morphAttributes = stage.geometry.morphAttributes;\n committedGeometry.morphTargetsRelative = stage.geometry.morphTargetsRelative;\n committedGeometry.boundingBox = stage.geometry.boundingBox;\n committedGeometry.boundingSphere = stage.geometry.boundingSphere;\n }\n committedGeometry.morphTargetDictionary = { ...stage.dictionary };\n stage.mesh.geometry = committedGeometry;\n stage.mesh.morphTargetDictionary = { ...stage.dictionary };\n stage.mesh.morphTargetInfluences = [...stage.influences];\n if (!replaceGeometry) stage.geometry.dispose();\n }\n if (replaceGeometry) {\n const replacedGeometries = new Set(Array.from(stages.values(), (stage) => stage.sourceGeometry));\n for (const sourceGeometry of replacedGeometries) {\n let stillInUse = false;\n root.traverse((object: any) => {\n if (object.isMesh && object.geometry === sourceGeometry) stillInUse = true;\n });\n if (!stillInUse) sourceGeometry.dispose();\n }\n }\n\n return result;\n }\n\n private applyMorphTargetToStage(\n stage: MorphMutationStage,\n target: MorphTargetInput,\n options: AddMorphTargetOptions,\n ) {\n const geometry: any = stage.geometry;\n const dictionary = stage.dictionary;\n if (!target.name?.trim()) throw new Error(`Morph target name is required for mesh: ${target.meshName}`);\n const configuredIndex = dictionary[target.name];\n const existing = Number.isInteger(configuredIndex) && configuredIndex >= 0\n ? configuredIndex\n : undefined;\n if (existing !== undefined && !options.replace) throw new Error(`Morph target already exists: ${target.name}`);\n\n const usedIndices = Object.values(dictionary)\n .map((value) => {\n if (!Number.isInteger(value) || value < 0) throw new Error(`Invalid morph target index on ${target.meshName}: ${value}`);\n return value;\n });\n const currentTargetCount = Math.max(\n 0,\n ...Object.values(geometry.morphAttributes as Record<string, unknown[]>).map((attributes) => attributes?.length ?? 0),\n usedIndices.length > 0 ? Math.max(...usedIndices) + 1 : 0,\n stage.influences.length,\n );\n const index = existing ?? currentTargetCount;\n const targetCount = Math.max(currentTargetCount, index + 1);\n const sourceIsRelative = target.relative !== false;\n if (currentTargetCount === 0) geometry.morphTargetsRelative = sourceIsRelative;\n\n for (const semantic of MORPH_ATTRIBUTE_SEMANTICS) {\n const data = target[semantic] as ArrayLike<number> | undefined;\n const existingAttributes = geometry.morphAttributes[semantic] as Array<BufferAttribute | undefined> | undefined;\n if (!data && existingAttributes?.length === 0) {\n delete geometry.morphAttributes[semantic];\n continue;\n }\n if (!data && !existingAttributes) continue;\n\n const base = geometry.getAttribute(semantic);\n if (!base || (data && data.length !== base.count * base.itemSize)) {\n throw new Error(`Invalid ${semantic} morph data length`);\n }\n\n const attributes = [...(existingAttributes ?? [])];\n for (let targetIndex = 0; targetIndex < targetCount; targetIndex += 1) {\n if (targetIndex === index && data) {\n attributes[targetIndex] = createMorphAttribute(\n geometry,\n semantic,\n target.name,\n data,\n sourceIsRelative,\n );\n } else if (!attributes[targetIndex] || targetIndex === index) {\n attributes[targetIndex] = createNeutralMorphAttribute(\n geometry,\n semantic,\n targetIndex === index ? target.name : `morph_${targetIndex}`,\n );\n }\n }\n geometry.morphAttributes[semantic] = attributes;\n }\n\n dictionary[target.name] = index;\n geometry.morphTargetDictionary = { ...dictionary };\n while (stage.influences.length < targetCount) stage.influences.push(0);\n if (options.resetInfluence !== false) stage.influences[index] = 0;\n geometry.computeBoundingBox?.();\n geometry.computeBoundingSphere?.();\n return index;\n }\n\n private applyMaterial(mesh: Mesh, config: MaterialConfig) {\n if (typeof config.renderOrder === 'number') mesh.renderOrder = config.renderOrder;\n for (const material of materials((mesh as any).material) as any[]) {\n if (typeof config.opacity === 'number') material.opacity = config.opacity;\n if (typeof config.transparent === 'boolean') material.transparent = config.transparent;\n else if (typeof config.opacity === 'number' && config.opacity < 1) material.transparent = true;\n if (typeof config.depthWrite === 'boolean') material.depthWrite = config.depthWrite;\n if (typeof config.depthTest === 'boolean') material.depthTest = config.depthTest;\n if (config.blending) material.blending = THREE_BLENDING_MODES[config.blending];\n material.needsUpdate = true;\n }\n }\n\n private visitMesh(root: Object3D, name: string, visit: (mesh: Mesh) => void) {\n root.traverse((object: any) => { if (object.isMesh && object.name === name) visit(object); });\n }\n}\n\nexport const collectMorphMeshes = (root: Object3D) => {\n const meshes: Mesh[] = [];\n root.traverse((object: any) => { if (object.isMesh && morphEntries(object).length > 0) meshes.push(object); });\n return meshes;\n};\n\nexport * from './model';\nexport * from './scene';\n"]}