@lovelace_lol/loom3 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1667 -0
- package/dist/index.cjs +6226 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2384 -0
- package/dist/index.d.ts +2384 -0
- package/dist/index.js +6160 -0
- package/dist/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engines/three/AnimationThree.ts","../src/presets/cc4.ts","../src/engines/three/hair/HairPhysicsController.ts","../src/mappings/resolveProfile.ts","../src/presets/bettaFish.ts","../src/presets/index.ts","../src/engines/three/Loom3.ts","../src/mappings/types.ts","../src/validation/geometryHelpers.ts","../src/regions/regionMapping.ts","../src/physics/HairPhysics.ts","../src/validation/generateMappingCorrections.ts","../src/validation/validateMappings.ts","../src/validation/extractModelData.ts","../src/validation/analyzeModel.ts"],"names":["auId","mode","repeatCount","reps","next","AU_INFO","CONTINUUM_PAIRS_MAP","CONTINUUM_LABELS","COMPOSITE_ROTATIONS","X_AXIS","Vector3","Y_AXIS","Z_AXIS","clamp01","targets","Quaternion","suffix","headPos","eyes","THREE2","score"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * AnimationThree - 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 NumberKeyframeTrack,\n QuaternionKeyframeTrack,\n LoopRepeat,\n LoopPingPong,\n LoopOnce,\n Quaternion,\n Vector3,\n} from 'three';\nimport type { Mesh, Object3D } from 'three';\nimport type {\n TransitionHandle,\n AnimationPlayOptions,\n AnimationClipInfo,\n AnimationState,\n AnimationActionHandle,\n CurvesMap,\n ClipOptions,\n ClipHandle,\n Snippet,\n BoneKey,\n CompositeRotation,\n} from '../../core/types';\nimport type { Profile } from '../../mappings/types';\nimport type { ResolvedBones } from './types';\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\nexport class AnimationThree {\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 BakedAnimationHost {\n getModel: () => Object3D | null;\n getMeshes: () => Mesh[];\n getMeshByName: (name: string) => Mesh | undefined;\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}\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);\n\nexport class BakedAnimationController {\n private host: BakedAnimationHost;\n private animationMixer: AnimationMixer | null = null;\n private mixerFinishedListenerAttached = false;\n private animationClips: AnimationClip[] = [];\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 actionIds = new WeakMap<AnimationAction, string>();\n private actionIdToClip = new Map<string, string>();\n\n constructor(host: BakedAnimationHost) {\n this.host = host;\n }\n\n update(dtSeconds: number): void {\n if (this.animationMixer) {\n this.animationMixer.update(dtSeconds);\n }\n }\n\n dispose(): void {\n this.stopAllAnimations();\n if (this.animationMixer) {\n this.animationMixer.stopAllAction();\n this.animationMixer = null;\n }\n this.animationClips = [];\n this.animationActions.clear();\n this.animationFinishedCallbacks.clear();\n this.clipActions.clear();\n this.clipHandles.clear();\n }\n\n loadAnimationClips(clips: unknown[]): void {\n if (!this.host.getModel()) {\n console.warn('Loom3: Cannot load animation clips before calling onReady()');\n return;\n }\n\n this.ensureMixer();\n this.animationClips = clips as AnimationClip[];\n\n for (const clip of this.animationClips) {\n if (!this.animationActions.has(clip.name) && this.animationMixer) {\n const action = this.animationMixer.clipAction(clip);\n this.animationActions.set(clip.name, action);\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 }));\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n const action = this.animationActions.get(clipName);\n if (!action) {\n console.warn(`Loom3: Animation clip \"${clipName}\" not found`);\n return null;\n }\n\n const {\n speed = 1.0,\n intensity = 1.0,\n loop = true,\n loopMode = 'repeat',\n repeatCount,\n crossfadeDuration = 0,\n clampWhenFinished = true,\n startTime = 0,\n } = options;\n\n action.setEffectiveTimeScale(speed);\n action.setEffectiveWeight(intensity);\n action.clampWhenFinished = clampWhenFinished;\n\n const reps = repeatCount ?? Infinity;\n if (!loop || loopMode === 'once') {\n action.setLoop(LoopOnce, 1);\n } else if (loopMode === 'pingpong') {\n action.setLoop(LoopPingPong, reps);\n } else {\n action.setLoop(LoopRepeat, reps);\n }\n\n if (startTime > 0) {\n action.time = startTime;\n }\n\n if (crossfadeDuration > 0) {\n action.reset();\n action.fadeIn(crossfadeDuration);\n } else {\n action.reset();\n }\n\n action.play();\n\n this.animationActions.set(clipName, action);\n this.clipActions.set(clipName, action);\n\n let resolveFinished: () => void;\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n\n if (!loop || loopMode === 'once') {\n this.animationFinishedCallbacks.set(clipName, () => resolveFinished());\n }\n\n return this.createAnimationHandle(clipName, action, finishedPromise);\n }\n\n stopAnimation(clipName: string): void {\n const action = this.animationActions.get(clipName);\n if (action) {\n action.stop();\n // Fully remove from mixer to prevent accumulation\n if (this.animationMixer) {\n try {\n const clip = action.getClip();\n if (clip) {\n this.animationMixer.uncacheAction(clip);\n this.animationMixer.uncacheClip(clip);\n }\n } catch {}\n }\n this.animationActions.delete(clipName);\n this.animationFinishedCallbacks.delete(clipName);\n }\n const clipAction = this.clipActions.get(clipName);\n if (clipAction && clipAction !== action) {\n try {\n clipAction.stop();\n if (this.animationMixer) {\n const clip = clipAction.getClip();\n if (clip) {\n this.animationMixer.uncacheAction(clip);\n this.animationMixer.uncacheClip(clip);\n }\n }\n } catch {}\n this.clipActions.delete(clipName);\n }\n this.clipHandles.delete(clipName);\n }\n\n stopAllAnimations(): void {\n for (const [name, action] of this.animationActions) {\n try {\n action.stop();\n if (this.animationMixer) {\n const clip = action.getClip();\n if (clip) {\n this.animationMixer.uncacheAction(clip);\n this.animationMixer.uncacheClip(clip);\n }\n }\n } catch {}\n try { this.animationFinishedCallbacks.delete(name); } catch {}\n }\n for (const [name, action] of this.clipActions) {\n if (!this.animationActions.has(name)) {\n try {\n action.stop();\n if (this.animationMixer) {\n const clip = action.getClip();\n if (clip) {\n this.animationMixer.uncacheAction(clip);\n this.animationMixer.uncacheClip(clip);\n }\n }\n } catch {}\n }\n }\n this.animationActions.clear();\n this.clipActions.clear();\n this.clipHandles.clear();\n }\n\n pauseAnimation(clipName: string): void {\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = true;\n }\n }\n\n resumeAnimation(clipName: string): void {\n const action = this.animationActions.get(clipName);\n if (action) {\n action.paused = false;\n }\n }\n\n pauseAllAnimations(): void {\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 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 const action = this.animationActions.get(clipName);\n if (action) {\n action.setEffectiveTimeScale(speed);\n }\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n const action = this.animationActions.get(clipName);\n if (action) {\n action.setEffectiveWeight(Math.max(0, Math.min(1, intensity)));\n }\n }\n\n setAnimationTimeScale(timeScale: number): void {\n if (this.animationMixer) {\n this.animationMixer.timeScale = timeScale;\n }\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n const action = this.animationActions.get(clipName);\n if (!action) return null;\n\n const clip = action.getClip();\n return {\n name: clip.name,\n isPlaying: action.isRunning() && !action.paused,\n isPaused: action.paused,\n time: action.time,\n duration: clip.duration,\n speed: action.getEffectiveTimeScale(),\n weight: action.getEffectiveWeight(),\n isLooping: action.loop !== LoopOnce,\n };\n }\n\n getPlayingAnimations(): AnimationState[] {\n const playing: AnimationState[] = [];\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 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(`[Loom3] snippetToClip: No model loaded for \"${clipName}\"`);\n return null;\n }\n if (Object.keys(curves).length === 0) {\n console.warn(`[Loom3] 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 balance = options?.balance ?? 0;\n const meshNames = options?.meshNames;\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 < config.visemeKeys.length;\n };\n\n const sampleAt = (arr: Array<{ time: number; intensity: number }>, t: number) => {\n if (!arr.length) return 0;\n if (t <= arr[0].time) return arr[0].intensity;\n if (t >= arr[arr.length - 1].time) return arr[arr.length - 1].intensity;\n for (let i = 0; i < arr.length - 1; i++) {\n const a = arr[i];\n const b = arr[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 return a.intensity + (b.intensity - a.intensity) * p;\n }\n }\n return 0;\n };\n\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 return clampIntensity(sampleAt(arr, t) * intensityScale);\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 visemeKey = config.visemeKeys[auId];\n if (typeof visemeKey === 'number') {\n this.addMorphIndexTracks(tracks, visemeKey, keyframes, intensityScale, meshNames);\n } else if (visemeKey) {\n this.addMorphTracks(tracks, visemeKey, keyframes, intensityScale, meshNames);\n }\n } else {\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 for (const morphKey of leftKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (balance > 0) effectiveScale *= (1 - balance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, meshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, meshNames);\n }\n }\n for (const morphKey of rightKeys) {\n let effectiveScale = intensityScale * mixWeight;\n if (balance < 0) effectiveScale *= (1 + balance);\n if (typeof morphKey === 'number') {\n this.addMorphIndexTracks(tracks, morphKey, keyframes, effectiveScale, meshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, meshNames);\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, meshNames);\n } else {\n this.addMorphTracks(tracks, morphKey, keyframes, effectiveScale, meshNames);\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 = config.visemeJawAmounts;\n\n if (\n autoVisemeJaw &&\n jawScale > 0 &&\n visemeJawAmounts &&\n options?.snippetCategory === 'visemeSnippet' &&\n keyframeTimes.length > 0\n ) {\n const bones = this.host.getBones();\n const jawEntry = bones['JAW'];\n\n if (jawEntry) {\n // Sample all viseme curves at each keyframe time and compute weighted jaw amount\n const jawValues: number[] = [];\n\n for (const t of keyframeTimes) {\n let jawAmount = 0;\n\n // Sum contributions from all active visemes at time t\n for (let visemeIdx = 0; visemeIdx < config.visemeKeys.length; visemeIdx++) {\n const visemeCurve = curves[String(visemeIdx)];\n if (!visemeCurve) continue;\n\n const visemeValue = clampIntensity(sampleAt(visemeCurve, t) * intensityScale);\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 // Convert jaw amount to quaternion rotation\n // JAW pitch uses rz axis with maxDegrees from AU 26 binding\n const jawBinding = config.auToBones[26]?.[0];\n const maxDegrees = jawBinding?.maxDegrees ?? 30;\n const radians = (maxDegrees * Math.PI / 180) * jawAmount;\n const jawQ = new Quaternion().copy(jawEntry.baseQuat);\n jawQ.multiply(new Quaternion().setFromAxisAngle(Z_AXIS, radians));\n\n jawValues.push(jawQ.x, jawQ.y, jawQ.z, jawQ.w);\n }\n\n const trackName = `${(jawEntry.obj as any).uuid}.quaternion`;\n tracks.push(new QuaternionKeyframeTrack(trackName, keyframeTimes, jawValues));\n }\n }\n\n if (keyframeTimes.length > 0) {\n const bones = this.host.getBones();\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: CompositeRotation['pitch'] | CompositeRotation['yaw'] | CompositeRotation['roll'],\n axisValue: number,\n t: number\n ) => {\n if (!axisConfig) return null;\n\n if (axisConfig.negative !== undefined && axisConfig.positive !== undefined) {\n const auId = axisValue < 0 ? axisConfig.negative : axisConfig.positive;\n return config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n }\n\n if (axisConfig.aus.length > 1) {\n let maxAU = axisConfig.aus[0];\n let maxVal = sampleCurve(String(maxAU), t);\n for (const auId of axisConfig.aus) {\n const val = sampleCurve(String(auId), t);\n if (val > maxVal) {\n maxVal = val;\n maxAU = auId;\n }\n }\n return config.auToBones[maxAU]?.find((b) => b.node === nodeKey) ?? null;\n }\n\n const auId = axisConfig.aus[0];\n return config.auToBones[auId]?.find((b) => b.node === nodeKey) ?? null;\n };\n\n const getAxisValue = (\n axisConfig: CompositeRotation['pitch'] | CompositeRotation['yaw'] | CompositeRotation['roll'],\n t: number\n ) => {\n if (!axisConfig) return 0;\n\n if (axisConfig.negative !== undefined && axisConfig.positive !== undefined) {\n const posValue = sampleCurve(String(axisConfig.positive), t);\n const negValue = sampleCurve(String(axisConfig.negative), t);\n return posValue - negValue;\n }\n\n if (axisConfig.aus.length > 1) {\n let maxVal = 0;\n for (const auId of axisConfig.aus) {\n const val = sampleCurve(String(auId), t);\n if (val > maxVal) maxVal = val;\n }\n return maxVal;\n }\n\n return sampleCurve(String(axisConfig.aus[0]), t);\n };\n\n // Track if autoVisemeJaw already added a JAW track\n const autoVisemeJawHandledJaw =\n autoVisemeJaw &&\n jawScale > 0 &&\n visemeJawAmounts &&\n options?.snippetCategory === 'visemeSnippet';\n\n for (const composite of compositeRotations) {\n const nodeKey = composite.node as BoneKey;\n\n // Skip JAW composite if autoVisemeJaw already handled it\n if (nodeKey === 'JAW' && autoVisemeJawHandledJaw) {\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 hasRelevantAU = [composite.pitch, composite.yaw, composite.roll]\n .filter(Boolean)\n .some((axisConfig) => axisConfig!.aus.some((auId) => hasCurveAU.has(auId)));\n\n if (!hasRelevantAU) {\n continue;\n }\n\n const values: number[] = [];\n\n for (const t of keyframeTimes) {\n const compositeQ = new Quaternion().copy(entry.baseQuat);\n\n const applyAxis = (\n axisConfig: CompositeRotation['pitch'] | CompositeRotation['yaw'] | CompositeRotation['roll']\n ) => {\n if (!axisConfig) return;\n let axisValue = getAxisValue(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 as any).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 values: number[] = [];\n\n for (const t of keyframeTimes) {\n const v = sampleCurve(curveId, t);\n const delta = v * binding.maxUnits * binding.scale;\n values.push(basePos + delta);\n }\n\n const trackName = `${(entry.obj as any).uuid}.position[${axisIndex}]`;\n tracks.push(new NumberKeyframeTrack(trackName, keyframeTimes, values));\n }\n }\n }\n\n if (tracks.length === 0) {\n console.warn(`[Loom3] snippetToClip: No tracks created for \"${clipName}\"`);\n return null;\n }\n\n const clip = new AnimationClip(clipName, maxTime, tracks);\n console.log(`[Loom3] snippetToClip: Created clip \"${clipName}\" with ${tracks.length} tracks, duration ${maxTime.toFixed(2)}s`);\n\n return clip;\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n this.ensureMixer();\n\n if (!this.animationMixer) {\n console.warn('[Loom3] playClip: No model loaded, cannot create mixer');\n return null;\n }\n\n const {\n loop = false,\n loopMode,\n repeatCount,\n reverse = false,\n playbackRate = 1.0,\n mixerWeight,\n } = options || {};\n\n let action = this.clipActions.get(clip.name);\n let actionId = action ? (this.actionIds.get(action) || (action as any).__actionId) : undefined;\n if (action && !actionId) {\n actionId = makeActionId();\n this.actionIds.set(action, actionId);\n this.actionIdToClip.set(actionId, clip.name);\n (action as any).__actionId = actionId;\n }\n if (!action) {\n action = this.animationMixer.clipAction(clip);\n actionId = makeActionId();\n this.actionIds.set(action, actionId);\n this.actionIdToClip.set(actionId, clip.name);\n (action as any).__actionId = actionId;\n }\n\n const existingClip = this.animationClips.find(c => c.name === clip.name);\n if (!existingClip) {\n this.animationClips.push(clip);\n }\n\n const timeScale = reverse ? -playbackRate : playbackRate;\n action.setEffectiveTimeScale(timeScale);\n const weight = typeof mixerWeight === 'number' ? mixerWeight : 1.0;\n action.setEffectiveWeight(weight);\n const mode = loopMode || (loop ? 'repeat' : 'once');\n action.clampWhenFinished = mode === 'once';\n const reps = repeatCount ?? Infinity;\n\n if (mode === 'pingpong') {\n action.setLoop(LoopPingPong, reps);\n } else if (mode === 'once') {\n action.setLoop(LoopOnce, 1);\n } else {\n action.setLoop(LoopRepeat, reps);\n }\n\n let resolveFinished: () => void;\n const finishedPromise = new Promise<void>((resolve) => {\n resolveFinished = resolve;\n });\n\n const cleanup = () => {\n try { this.animationFinishedCallbacks.delete(clip.name); } catch {}\n try { action.paused = true; } catch {}\n };\n\n this.animationFinishedCallbacks.set(clip.name, () => {\n resolveFinished();\n cleanup();\n });\n finishedPromise.catch(() => cleanup());\n\n action.reset();\n action.play();\n\n this.clipActions.set(clip.name, action);\n this.animationActions.set(clip.name, action);\n console.log(`[Loom3] playClip: Playing \"${clip.name}\" (rate: ${playbackRate}, loop: ${loop}, actionId: ${actionId})`);\n\n const handle: ClipHandle = {\n clipName: clip.name,\n actionId,\n\n play: () => {\n action.reset();\n action.play();\n },\n\n stop: () => {\n action.stop();\n // Fully remove action from mixer to prevent accumulation and weight blending issues\n if (this.animationMixer) {\n try { this.animationMixer.uncacheAction(clip); } catch {}\n try { this.animationMixer.uncacheClip(clip); } catch {}\n }\n this.clipActions.delete(clip.name);\n this.animationActions.delete(clip.name);\n this.animationFinishedCallbacks.delete(clip.name);\n resolveFinished();\n cleanup();\n },\n\n pause: () => {\n action.paused = true;\n },\n\n resume: () => {\n action.paused = false;\n },\n\n setWeight: (w: number) => {\n action.setEffectiveWeight(typeof w === 'number' && Number.isFinite(w) ? w : 1.0);\n },\n\n setPlaybackRate: (r: number) => {\n const rate = Number.isFinite(r) ? r : 1.0;\n action.setEffectiveTimeScale(rate);\n },\n\n setLoop: (mode: 'once' | 'repeat' | 'pingpong', repeatCount?: number) => {\n const reps = repeatCount ?? Infinity;\n if (mode === 'pingpong') {\n action.setLoop(LoopPingPong, reps);\n } else if (mode === 'once') {\n action.setLoop(LoopOnce, 1);\n } else {\n action.setLoop(LoopRepeat, reps);\n }\n },\n\n setTime: (t: number) => {\n const clamped = Math.max(0, Math.min(clip.duration, t));\n action.time = clamped;\n try { this.animationMixer?.update(0); } catch {}\n },\n\n getTime: () => action.time,\n\n getDuration: () => clip.duration,\n\n finished: finishedPromise,\n };\n this.clipHandles.set(clip.name, handle);\n\n return handle;\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap },\n options?: ClipOptions\n ): ClipHandle | null {\n const clip = this.snippetToClip(snippet.name, snippet.curves, options);\n if (!clip) {\n return null;\n }\n return this.playClip(clip, options);\n }\n\n buildClip(\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.playClip(clip, options);\n }\n\n cleanupSnippet(name: string) {\n if (!this.animationMixer || !this.host.getModel()) return;\n for (const [clipName, action] of Array.from(this.clipActions.entries())) {\n if (clipName === name || clipName.startsWith(`${name}_`)) {\n try {\n action.stop();\n // Fully remove action from mixer to prevent accumulation\n const clip = action.getClip();\n if (clip) {\n this.animationMixer.uncacheAction(clip);\n this.animationMixer.uncacheClip(clip);\n }\n } catch {}\n this.clipActions.delete(clipName);\n this.animationActions.delete(clipName);\n this.clipHandles.delete(clipName);\n this.animationFinishedCallbacks.delete(clipName);\n }\n }\n }\n\n updateClipParams(name: string, params: { weight?: number; rate?: number; loop?: boolean; loopMode?: 'once' | 'repeat' | 'pingpong'; repeatCount?: number; reverse?: boolean; actionId?: string }): 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.actionIds.get(a) || (a as any).__actionId })),\n animationActions: Array.from(this.animationActions.entries()).map(([k, a]) => ({ name: k, actionId: this.actionIds.get(a) || (a as any).__actionId })),\n clipHandles: Array.from(this.clipHandles.entries()).map(([k, h]) => ({ name: k, actionId: h.actionId })),\n mixerActions: ((this.animationMixer as any)?._actions || []).map((a: any) => ({ name: a?.getClip?.()?.name || '', actionId: this.actionIds.get(a) || (a as any).__actionId })),\n });\n\n console.log('[Loom3] updateClipParams start', debugSnapshot());\n\n const apply = (action: AnimationAction | null | undefined) => {\n if (!action) return;\n try { action.paused = false; } catch {}\n if (typeof params.weight === 'number' && Number.isFinite(params.weight)) {\n action.setEffectiveWeight(params.weight);\n updated = true;\n }\n if (typeof params.rate === 'number' && Number.isFinite(params.rate)) {\n const signedRate = params.reverse ? -params.rate : params.rate;\n action.setEffectiveTimeScale(signedRate);\n updated = true;\n }\n if (typeof params.loop === 'boolean' || params.loopMode || params.repeatCount !== undefined) {\n const mode = params.loopMode || (params.loop ? 'repeat' : 'once');\n const reps = params.repeatCount ?? Infinity;\n if (mode === 'pingpong') {\n action.setLoop(LoopPingPong, reps);\n } else if (mode === 'once') {\n action.setLoop(LoopOnce, 1);\n } else {\n action.setLoop(LoopRepeat, reps);\n }\n updated = true;\n }\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 console.log('[Loom3] updateClipParams end', debugSnapshot());\n return updated;\n }\n\n private addMorphTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphKey: string,\n keyframes: Array<{ time: number; intensity: number }>,\n intensityScale: number,\n meshNames?: string[]\n ): void {\n const config = this.host.getConfig();\n const meshes = this.host.getMeshes();\n const hasExplicitMeshes = !!(meshNames && meshNames.length > 0);\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 : meshes;\n let added = false;\n\n const addTrackForMesh = (mesh: Mesh) => {\n const dict = mesh.morphTargetDictionary;\n if (!dict || dict[morphKey] === undefined) return;\n\n const morphIndex = dict[morphKey];\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(Math.max(0, Math.min(2, kf.intensity * intensityScale)));\n }\n\n const trackName = `${(mesh as any).uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n added = true;\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n\n if (!added && !hasExplicitMeshes && targetMeshes !== meshes) {\n for (const mesh of meshes) {\n addTrackForMesh(mesh);\n }\n }\n }\n\n private addMorphIndexTracks(\n tracks: Array<NumberKeyframeTrack | QuaternionKeyframeTrack>,\n morphIndex: number,\n keyframes: Array<{ time: number; intensity: number }>,\n intensityScale: number,\n meshNames?: string[]\n ): void {\n if (!Number.isInteger(morphIndex) || morphIndex < 0) return;\n const config = this.host.getConfig();\n const meshes = this.host.getMeshes();\n const hasExplicitMeshes = !!(meshNames && meshNames.length > 0);\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 : meshes;\n let added = false;\n\n const addTrackForMesh = (mesh: Mesh) => {\n const infl = mesh.morphTargetInfluences;\n if (!infl || morphIndex < 0 || morphIndex >= infl.length) return;\n\n const times: number[] = [];\n const values: number[] = [];\n\n for (const kf of keyframes) {\n times.push(kf.time);\n values.push(Math.max(0, Math.min(2, kf.intensity * intensityScale)));\n }\n\n const trackName = `${(mesh as any).uuid}.morphTargetInfluences[${morphIndex}]`;\n const track = new NumberKeyframeTrack(trackName, times, values);\n\n tracks.push(track);\n added = true;\n };\n\n for (const mesh of targetMeshes) {\n addTrackForMesh(mesh);\n }\n\n if (!added && !hasExplicitMeshes && targetMeshes !== meshes) {\n for (const mesh of meshes) {\n addTrackForMesh(mesh);\n }\n }\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 as any);\n }\n\n if (this.animationMixer && !this.mixerFinishedListenerAttached) {\n this.animationMixer.addEventListener('finished', (event: any) => {\n const action = event.action as AnimationAction;\n const clip = action.getClip();\n const callback = this.animationFinishedCallbacks.get(clip.name);\n if (callback) {\n callback();\n this.animationFinishedCallbacks.delete(clip.name);\n }\n });\n this.mixerFinishedListenerAttached = true;\n }\n\n return this.animationMixer;\n }\n\n private createAnimationHandle(\n clipName: string,\n action: AnimationAction,\n finishedPromise: Promise<void>\n ): AnimationActionHandle {\n return {\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) => {\n action.time = Math.max(0, Math.min(time, action.getClip().duration));\n },\n getState: () => this.getAnimationState(clipName)!,\n crossfadeTo: (targetClip: string, dur?: number) => this.crossfadeTo(targetClip, dur),\n finished: finishedPromise,\n };\n }\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 } 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', 'Eye_R_Look_L'],\n right: [],\n center: [],\n },\n 62: {\n left: [],\n right: ['Eye_L_Look_R', 'Eye_R_Look_R'],\n center: [],\n },\n 63: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Up', 'Eye_R_Look_Up'],\n },\n 64: {\n left: [],\n right: [],\n center: ['Eye_L_Look_Down', 'Eye_R_Look_Down'],\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// 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: 'JAW', channel: 'rz', scale: 1, maxDegrees: 20 }],\n 26: [{ node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 30 }],\n 27: [{ node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 35 }],\n\n // Jaw lateral (left/right)\n 30: [{ node: 'JAW', channel: 'ry', scale: -1, maxDegrees: 15 }],\n 35: [{ node: '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: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 60 }],\n 52: [{ node: '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: 'HEAD', channel: 'rx', scale: -1, maxDegrees: 30 }],\n 54: [{ node: 'HEAD', channel: 'rx', scale: 1, maxDegrees: 30 }],\n\n // Head roll (tilt)\n 55: [{ node: 'HEAD', channel: 'rz', scale: -1, maxDegrees: 25 }],\n 56: [{ node: '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: 'EYE_L', channel: 'rz', scale: 1, maxDegrees: 25, side: 'left' },\n { node: 'EYE_R', channel: 'rz', scale: 1, maxDegrees: 25, side: 'right' },\n ],\n 62: [\n { node: 'EYE_L', channel: 'rz', scale: -1, maxDegrees: 25, side: 'left' },\n { node: '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: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 20, side: 'left' },\n { node: 'EYE_R', channel: 'rx', scale: -1, maxDegrees: 20, side: 'right' },\n ],\n 64: [\n { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 20, side: 'left' },\n { node: 'EYE_R', channel: 'rx', scale: 1, maxDegrees: 20, side: 'right' },\n ],\n\n // Tongue controls (optional, for rigs that expose them)\n 37: [{ node: 'TONGUE', channel: 'rz', scale: 1, maxDegrees: 20 }],\n 38: [{ node: 'TONGUE', channel: 'rz', scale: -1, maxDegrees: 20 }],\n 39: [{ node: 'TONGUE', channel: 'ry', scale: -1, maxDegrees: 20 }],\n 40: [{ node: 'TONGUE', channel: 'ry', scale: 1, maxDegrees: 20 }],\n 41: [{ node: 'TONGUE', channel: 'rx', scale: -1, maxDegrees: 20 }],\n 42: [{ node: 'TONGUE', channel: 'rx', scale: 1, maxDegrees: 20 }],\n};\n\n// ============================================================================\n// VISEME KEYS - CC4 viseme morph targets (15)\n// ============================================================================\n\nexport const VISEME_KEYS: string[] = [\n 'EE',\n 'Ah',\n 'Oh',\n 'OO',\n 'I',\n 'U',\n 'W',\n 'L',\n 'F_V',\n 'Th',\n 'S_Z',\n 'B_M_P',\n 'K_G_H_NG',\n 'AE',\n 'R',\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.20, // 0: EE\n 0.80, // 1: Ah\n 0.60, // 2: Oh\n 0.50, // 3: OO\n 0.20, // 4: I\n 0.50, // 5: U\n 0.40, // 6: W\n 0.30, // 7: L\n 0.10, // 8: F_V\n 0.15, // 9: Th\n 0.10, // 10: S_Z\n 0.00, // 11: B_M_P\n 0.35, // 12: K_G_H_NG\n 0.75, // 13: AE\n 0.35, // 14: R\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: 'JAW',\n pitch: { aus: [25, 26, 27], axis: 'rz' }, // Jaw drop (opens mouth downward)\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: '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: 'EYE_L',\n pitch: { aus: [64, 63], axis: 'rx', negative: 64, positive: 63 }, // Eyes down/up\n yaw: { aus: [61, 62], axis: 'rz', negative: 61, positive: 62 }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: 'EYE_R',\n pitch: { aus: [64, 63], axis: 'rx', negative: 64, positive: 63 }, // Eyes down/up\n yaw: { aus: [61, 62], axis: 'rz', negative: 61, positive: 62 }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: '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: 'JAW' | 'HEAD' | 'EYE_L' | 'EYE_R' | 'TONGUE';\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: 'EYE_L' },\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: 'EYE_L' },\n // Eyes vertical (pitch)\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: 'EYE_L' },\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: 'EYE_L' },\n // Head yaw (turn left/right)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: 'HEAD' },\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: 'HEAD' },\n // Head pitch (up/down)\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: 'HEAD' },\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: 'HEAD' },\n // Head roll (tilt left/right)\n 55: { pairId: 56, isNegative: true, axis: 'roll', node: 'HEAD' },\n 56: { pairId: 55, isNegative: false, axis: 'roll', node: 'HEAD' },\n // Jaw yaw (left/right)\n 30: { pairId: 35, isNegative: true, axis: 'yaw', node: 'JAW' },\n 35: { pairId: 30, isNegative: false, axis: 'yaw', node: 'JAW' },\n // Tongue yaw (left/right)\n 39: { pairId: 40, isNegative: true, axis: 'yaw', node: 'TONGUE' },\n 40: { pairId: 39, isNegative: false, axis: 'yaw', node: 'TONGUE' },\n // Tongue pitch (up/down)\n 38: { pairId: 37, isNegative: true, axis: 'pitch', node: 'TONGUE' },\n 37: { pairId: 38, isNegative: false, axis: 'pitch', node: 'TONGUE' },\n // Tongue roll (tilt left/right)\n 41: { pairId: 42, isNegative: true, axis: 'roll', node: 'TONGUE' },\n 42: { pairId: 41, isNegative: false, axis: 'roll', node: 'TONGUE' },\n // Extended tongue morphs (continuum pairs)\n 73: { pairId: 74, isNegative: true, axis: 'yaw', node: 'TONGUE' }, // Tongue Narrow/Wide\n 74: { pairId: 73, isNegative: false, axis: 'yaw', node: 'TONGUE' },\n 76: { pairId: 77, isNegative: false, axis: 'pitch', node: 'TONGUE' }, // Tongue Tip Up/Down\n 77: { pairId: 76, isNegative: true, axis: 'pitch', node: '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 '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\n// ============================================================================\n// BONE NODE NAMES - CC4-specific skeleton hierarchy\n// ============================================================================\n\n/**\n * Bone name prefix for CC4 rigs.\n * Base bone names are stored without this prefix in CC4_BONE_NODES.\n * The engine will prepend this when resolving bones.\n */\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// Canonical CC4 bone names WITHOUT prefix (engine will prepend CC4_BONE_PREFIX).\n// This allows fuzzy matching for models with suffixed bone names.\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} as const;\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// ============================================================================\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: BONE_AU_TO_BINDINGS,\n boneNodes: CC4_BONE_NODES,\n bonePrefix: CC4_BONE_PREFIX,\n suffixPattern: CC4_SUFFIX_PATTERN,\n morphToMesh: MORPH_TO_MESH,\n visemeKeys: VISEME_KEYS,\n visemeJawAmounts: VISEME_JAW_AMOUNTS,\n auMixDefaults: AU_MIX_DEFAULTS,\n auInfo: AU_INFO,\n eyeMeshNodes: CC4_EYE_MESH_NODES,\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: ['CC_Base_Head', 'CC_Base_JawRoot'],\n paddingFactor: 1.5,\n children: ['face', 'left_eye', 'right_eye', 'mouth'],\n expandAnimation: 'staggered',\n showChildConnections: true,\n },\n {\n name: 'face',\n bones: ['CC_Base_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: ['CC_Base_L_Eye'],\n paddingFactor: 1.2,\n parent: 'head',\n },\n {\n name: 'right_eye',\n bones: ['CC_Base_R_Eye'],\n paddingFactor: 1.2,\n parent: 'head',\n },\n {\n name: 'mouth',\n bones: ['CC_Base_JawRoot'],\n paddingFactor: 1.5,\n parent: 'head',\n },\n {\n name: 'upper_body',\n bones: [\n 'CC_Base_Spine02',\n 'CC_Base_Head',\n 'CC_Base_L_Clavicle',\n 'CC_Base_R_Clavicle',\n ],\n paddingFactor: 1.6,\n },\n {\n name: 'back',\n bones: ['CC_Base_Spine01', 'CC_Base_Spine02'],\n paddingFactor: 1.8,\n cameraAngle: 180,\n },\n {\n name: 'left_hand',\n bones: ['CC_Base_L_Hand'],\n paddingFactor: 1.3,\n cameraAngle: 270,\n },\n {\n name: 'right_hand',\n bones: ['CC_Base_R_Hand'],\n paddingFactor: 1.3,\n cameraAngle: 90,\n },\n {\n name: 'left_foot',\n bones: ['CC_Base_L_Foot', 'CC_Base_L_ToeBase'],\n paddingFactor: 2.5,\n cameraAngle: 270,\n },\n {\n name: 'right_foot',\n bones: ['CC_Base_R_Foot', 'CC_Base_R_ToeBase'],\n paddingFactor: 2.5,\n cameraAngle: 90,\n },\n ],\n};\n\nexport default CC4_PRESET;\n","import type { Mesh, Object3D } from 'three';\nimport type { ClipHandle, ClipOptions, CurvesMap } from '../../../core/types';\nimport { CC4_MESHES } from '../../../presets/cc4';\n\nexport type HairPhysicsDirectionConfig = {\n // Multiplies head rotation inputs before mapping to hair motion.\n // yawSign = -1 means hair lags opposite head yaw (inertia).\n // pitchSign = -1 means head down (negative pitch) maps to forward hair motion.\n yawSign: 1 | -1;\n pitchSign: 1 | -1;\n};\n\nexport type HairMorphTargets = {\n swayLeft: string;\n swayRight: string;\n swayFront: string;\n fluffRight: string;\n fluffBottom: string;\n headUp: Record<string, number>;\n headDown: Record<string, number>;\n};\n\nexport type HairPhysicsConfig = {\n stiffness: number;\n damping: number;\n inertia: number;\n gravity: number;\n responseScale: number;\n idleSwayAmount: number;\n idleSwaySpeed: number;\n windStrength: number;\n windDirectionX: number;\n windDirectionZ: number;\n windTurbulence: number;\n windFrequency: number;\n idleClipDuration: number;\n impulseClipDuration: number;\n direction: HairPhysicsDirectionConfig;\n morphTargets: HairMorphTargets;\n};\n\nexport type HairPhysicsConfigUpdate = Partial<HairPhysicsConfig> & {\n direction?: Partial<HairPhysicsDirectionConfig>;\n morphTargets?: Partial<HairMorphTargets>;\n};\n\nexport interface HairPhysicsHost {\n getMeshByName: (name: string) => Mesh | undefined;\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 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\n constructor(host: HairPhysicsHost) {\n this.host = host;\n }\n\n clearRegisteredHairObjects(): void {\n this.registeredHairObjects.clear();\n this.cachedHairMeshNames = null;\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 as any).isMesh) {\n const mesh = obj as unknown as Mesh;\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 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 idleChanged = [\n 'idleSwayAmount',\n 'idleSwaySpeed',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n 'idleClipDuration',\n ].some((key) => (config as Record<string, unknown>)[key] !== undefined);\n const morphTargetsChanged = config.morphTargets !== undefined;\n const directionChanged = config.direction !== undefined;\n\n const impulseChanged = [\n 'stiffness',\n 'damping',\n 'impulseClipDuration',\n ].some((key) => (config as Record<string, unknown>)[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 for (const [name, mesh] of this.registeredHairObjects) {\n const info = CC4_MESHES[name];\n if (info?.category === 'hair') {\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(`[Loom3] 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 as any;\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) {\n const mat = obj.material;\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 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 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) return;\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) return;\n\n if (!this.gravityClipDirty && this.gravityClipHandle) return;\n\n this.stopGravityClip();\n\n // Head up (time=0) uses morphTargets.headUp; head down (time=1) uses morphTargets.headDown.\n const morphTargets = this.hairPhysicsConfig.morphTargets;\n const curves: CurvesMap = {};\n const headUpKeys = Object.keys(morphTargets.headUp ?? {});\n const headDownKeys = Object.keys(morphTargets.headDown ?? {});\n const keys = new Set([...headUpKeys, ...headDownKeys]);\n\n for (const key of keys) {\n const up = morphTargets.headUp?.[key] ?? 0;\n const down = morphTargets.headDown?.[key] ?? 0;\n curves[key] = [\n { time: 0, intensity: up },\n { time: 0.5, intensity: 0 },\n { time: 1, intensity: down },\n ];\n }\n\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) return;\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 cfg = this.hairPhysicsConfig;\n const morphTargets = this.hairPhysicsConfig.morphTargets;\n const curves: CurvesMap = {};\n const sampleCount = Math.max(16, Math.min(120, Math.round(durationSec * 12)));\n const hasWind = cfg.windStrength > 0;\n const hasIdle = cfg.idleSwayAmount > 0;\n const windScale = cfg.windStrength * 0.1;\n\n const pushPoint = (key: string, time: number, intensity: number) => {\n if (!curves[key]) curves[key] = [];\n curves[key].push({ time, intensity });\n };\n\n for (let i = 0; i <= sampleCount; i += 1) {\n const t = (durationSec * i) / sampleCount;\n\n const idleOffset = hasIdle\n ? Math.sin(t * cfg.idleSwaySpeed * Math.PI * 2) * cfg.idleSwayAmount\n : 0;\n\n let windOffsetX = 0;\n let windOffsetZ = 0;\n if (hasWind) {\n const basePhase = t * cfg.windFrequency * Math.PI * 2;\n const primaryWave = Math.sin(basePhase);\n const secondaryWave = Math.sin(basePhase * 1.7) * 0.3;\n const turbulenceWave = Math.sin(basePhase * 3.3) * cfg.windTurbulence * 0.2;\n const waveStrength = primaryWave + secondaryWave + turbulenceWave;\n windOffsetX = cfg.windDirectionX * waveStrength * windScale;\n windOffsetZ = cfg.windDirectionZ * waveStrength * windScale;\n }\n\n const combinedX = idleOffset + windOffsetX;\n const combinedZ = windOffsetZ;\n\n const leftValue = clamp01(combinedX > 0 ? combinedX : 0);\n const rightValue = clamp01(combinedX < 0 ? -combinedX : 0);\n const frontValue = clamp01(combinedZ > 0 ? combinedZ : 0);\n const fluffyRightValue = clamp01(rightValue * 0.7);\n const movementIntensity = Math.abs(combinedX) + Math.abs(combinedZ);\n const fluffyBottomValue = clamp01(movementIntensity * 0.25);\n\n if (morphTargets.swayLeft) pushPoint(morphTargets.swayLeft, t, leftValue);\n if (morphTargets.swayRight) pushPoint(morphTargets.swayRight, t, rightValue);\n if (morphTargets.swayFront) pushPoint(morphTargets.swayFront, t, frontValue);\n if (morphTargets.fluffRight) pushPoint(morphTargets.fluffRight, t, fluffyRightValue);\n if (morphTargets.fluffBottom) pushPoint(morphTargets.fluffBottom, t, fluffyBottomValue);\n }\n\n for (const points of Object.values(curves)) {\n if (points.length > 1) {\n points[points.length - 1].intensity = points[0].intensity;\n }\n }\n\n return curves;\n }\n\n private buildImpulseCurves(durationSec: number, horizontal: number, vertical: number): CurvesMap {\n const cfg = this.hairPhysicsConfig;\n const morphTargets = this.hairPhysicsConfig.morphTargets;\n const curves: CurvesMap = {};\n const sampleCount = Math.max(12, Math.min(90, Math.round(durationSec * 30)));\n const frequency = Math.max(0.5, cfg.stiffness * 0.2);\n const decay = Math.max(0.1, cfg.damping * 4);\n const omega = Math.PI * 2 * frequency;\n\n const pushPoint = (key: string, time: number, intensity: number) => {\n if (!curves[key]) curves[key] = [];\n curves[key].push({ time, intensity });\n };\n\n for (let i = 0; i <= sampleCount; i += 1) {\n const t = (durationSec * i) / sampleCount;\n const wave = Math.cos(omega * t) * Math.exp(-decay * t);\n const horizontalValue = horizontal * wave;\n const verticalValue = vertical * wave;\n\n const leftValue = clamp01(horizontalValue > 0 ? horizontalValue : 0);\n const rightValue = clamp01(horizontalValue < 0 ? -horizontalValue : 0);\n const frontValue = clamp01(verticalValue > 0 ? verticalValue : 0);\n const fluffyRightValue = clamp01(rightValue * 0.7);\n const movementIntensity = Math.abs(horizontalValue) + Math.abs(verticalValue);\n const fluffyBottomValue = clamp01(movementIntensity * 0.25);\n\n if (morphTargets.swayLeft) pushPoint(morphTargets.swayLeft, t, leftValue);\n if (morphTargets.swayRight) pushPoint(morphTargets.swayRight, t, rightValue);\n if (morphTargets.swayFront) pushPoint(morphTargets.swayFront, t, frontValue);\n if (morphTargets.fluffRight) pushPoint(morphTargets.fluffRight, t, fluffyRightValue);\n if (morphTargets.fluffBottom) pushPoint(morphTargets.fluffBottom, t, fluffyBottomValue);\n }\n\n for (const points of Object.values(curves)) {\n if (points.length > 0) {\n points[points.length - 1].intensity = 0;\n }\n }\n\n return curves;\n }\n\n}\n","import type { Profile, AnnotationRegion, MorphTargetsBySide, HairPhysicsProfileConfig } from './types';\nimport type { BoneBinding } from '../core/types';\n\ntype RecordValue = string | number | boolean | object | null | undefined;\ntype RecordKey = string | number;\n\nconst cloneArray = <T>(value: T[]): T[] => value.map((item) => {\n if (item && typeof item === 'object') {\n return { ...(item as Record<string, unknown>) } as T;\n }\n return item;\n});\n\nconst cloneValue = <T extends RecordValue>(value: T): T => {\n if (Array.isArray(value)) {\n return cloneArray(value as unknown[]) as T;\n }\n if (value && typeof value === 'object') {\n return { ...(value as Record<string, unknown>) } as T;\n }\n return value;\n};\n\nconst mergeRecord = <T extends RecordValue>(\n base: Record<RecordKey, T>,\n override?: Record<RecordKey, T>\n): Record<RecordKey, T> => {\n if (!override) {\n const next: Record<string, T> = {};\n for (const [key, value] of Object.entries(base)) {\n next[key] = cloneValue(value as T);\n }\n return next;\n }\n const next: Record<string, T> = {};\n for (const [key, value] of Object.entries(base)) {\n next[key] = cloneValue(value as T);\n }\n for (const [key, value] of Object.entries(override)) {\n next[key] = cloneValue(value as T);\n }\n return next;\n};\n\nconst mergeAnnotationRegion = (\n base: AnnotationRegion,\n override: AnnotationRegion\n): AnnotationRegion => {\n const merged: AnnotationRegion = {\n ...base,\n ...override,\n };\n\n merged.bones = override.bones ? [...override.bones] : base.bones ? [...base.bones] : undefined;\n merged.meshes = override.meshes ? [...override.meshes] : base.meshes ? [...base.meshes] : undefined;\n merged.objects = override.objects ? [...override.objects] : base.objects ? [...base.objects] : undefined;\n merged.children = override.children ? [...override.children] : base.children ? [...base.children] : undefined;\n merged.cameraOffset = override.cameraOffset\n ? { ...override.cameraOffset }\n : base.cameraOffset\n ? { ...base.cameraOffset }\n : undefined;\n merged.style = override.style\n ? {\n ...base.style,\n ...override.style,\n line: override.style.line\n ? { ...base.style?.line, ...override.style.line }\n : base.style?.line\n ? { ...base.style.line }\n : undefined,\n }\n : base.style\n ? { ...base.style, line: base.style.line ? { ...base.style.line } : undefined }\n : undefined;\n\n return merged;\n};\n\nconst mergeAnnotationRegions = (\n base?: AnnotationRegion[],\n override?: AnnotationRegion[]\n): AnnotationRegion[] | undefined => {\n if (!base && !override) return undefined;\n if (!base) return override ? override.map((region) => mergeAnnotationRegion(region, region)) : undefined;\n const regionMap = new Map<string, AnnotationRegion>();\n for (const region of base) {\n regionMap.set(region.name, mergeAnnotationRegion(region, region));\n }\n if (override) {\n for (const region of override) {\n const existing = regionMap.get(region.name);\n regionMap.set(region.name, existing ? mergeAnnotationRegion(existing, region) : mergeAnnotationRegion(region, region));\n }\n }\n return Array.from(regionMap.values());\n};\n\nconst mergeHairPhysicsConfig = (\n base?: HairPhysicsProfileConfig,\n override?: HairPhysicsProfileConfig\n): HairPhysicsProfileConfig | undefined => {\n if (!base && !override) return undefined;\n const merged: HairPhysicsProfileConfig = {\n ...base,\n ...override,\n };\n\n if (base?.direction || override?.direction) {\n merged.direction = {\n ...base?.direction,\n ...override?.direction,\n };\n }\n\n if (base?.morphTargets || override?.morphTargets) {\n const nextMorphTargets = {\n ...base?.morphTargets,\n ...override?.morphTargets,\n };\n if (base?.morphTargets?.headUp || override?.morphTargets?.headUp) {\n nextMorphTargets.headUp = mergeRecord(\n base?.morphTargets?.headUp || {},\n override?.morphTargets?.headUp || {}\n );\n }\n if (base?.morphTargets?.headDown || override?.morphTargets?.headDown) {\n nextMorphTargets.headDown = mergeRecord(\n base?.morphTargets?.headDown || {},\n override?.morphTargets?.headDown || {}\n );\n }\n merged.morphTargets = nextMorphTargets;\n }\n\n return merged;\n};\n\n/**\n * Merge a base preset with a profile override.\n *\n * Rules:\n * - Scalars: override if provided.\n * - Maps: shallow-merged by key (override wins), values cloned.\n * - Arrays: replaced when override is provided (except annotationRegions).\n * - annotationRegions: merged by region name, shallow field merge (override wins).\n */\nexport function resolveProfile(base: Profile, override: Partial<Profile>): Profile {\n return {\n ...base,\n ...override,\n auToMorphs: mergeRecord(base.auToMorphs, override.auToMorphs) as Record<number, MorphTargetsBySide>,\n auToBones: mergeRecord(base.auToBones, override.auToBones) as Record<number, BoneBinding[]>,\n boneNodes: mergeRecord(base.boneNodes, override.boneNodes),\n morphToMesh: mergeRecord(base.morphToMesh, override.morphToMesh),\n visemeKeys: override.visemeKeys ? [...override.visemeKeys] : [...base.visemeKeys],\n auMixDefaults: base.auMixDefaults || override.auMixDefaults\n ? mergeRecord(base.auMixDefaults || {}, override.auMixDefaults || {})\n : undefined,\n auInfo: base.auInfo || override.auInfo\n ? mergeRecord(base.auInfo || {}, override.auInfo || {})\n : undefined,\n eyeMeshNodes: override.eyeMeshNodes ?? base.eyeMeshNodes,\n compositeRotations: override.compositeRotations ?? base.compositeRotations,\n meshes: base.meshes || override.meshes\n ? mergeRecord(base.meshes || {}, override.meshes || {})\n : undefined,\n continuumPairs: base.continuumPairs || override.continuumPairs\n ? mergeRecord(base.continuumPairs || {}, override.continuumPairs || {})\n : undefined,\n continuumLabels: base.continuumLabels || override.continuumLabels\n ? mergeRecord(base.continuumLabels || {}, override.continuumLabels || {})\n : undefined,\n annotationRegions: mergeAnnotationRegions(base.annotationRegions, override.annotationRegions),\n hairPhysics: mergeHairPhysicsConfig(base.hairPhysics, override.hairPhysics),\n };\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 { MeshInfo, MeshCategory } 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 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: -10, // Render early (behind body)\n depthWrite: true,\n depthTest: true,\n blending: 'Normal',\n },\n },\n};\n\n// ============================================================================\n// PRESET EXPORT\n// ============================================================================\n\nexport const BETTA_FISH_PRESET = {\n name: 'Betta Fish',\n animalType: 'fish',\n emoji: '🐟',\n bones: BONES,\n boneNodes: BONE_NODES,\n boneBindings: BONE_BINDINGS,\n actionInfo: AU_INFO,\n eyeMeshNodes: EYE_MESH_NODES,\n // No morph targets in this model\n auToMorphs: {} as Record<number, import('../mappings/types').MorphTargetsBySide>,\n morphToMesh: {} as Record<string, string[]>,\n visemeKeys: [] as string[],\n};\n\n// Engine-compatible config format for Loom3\nexport const AU_MAPPING_CONFIG = {\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 auMixDefaults: {} as Record<number, number>, // No mixed AUs (morph+bone) in this model\n continuumPairs: CONTINUUM_PAIRS_MAP,\n continuumLabels: CONTINUUM_LABELS,\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\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 = AU_MAPPING_CONFIG;\nexport const fishHasLeftRightBones = hasLeftRightBones;\n","/**\n * Loom3 - Preset Exports\n *\n * All AU presets are exported from here.\n * Frontend passes a presetType string and loom3 resolves the preset internally.\n */\n\n// CC4 preset (default for humanoid characters)\nexport { CC4_PRESET, default } from './cc4';\nexport * from './cc4';\nexport { resolveProfile } from '../mappings/resolveProfile';\n\nimport type { Profile } from '../mappings/types';\nimport { resolveProfile } from '../mappings/resolveProfile';\n\n// Betta fish preset (skeletal animation, no morphs)\nimport { AU_MAPPING_CONFIG } from './bettaFish';\nexport { BETTA_FISH_PRESET, AU_MAPPING_CONFIG as FISH_AU_MAPPING_CONFIG } from './bettaFish';\n\n// Re-export fish-specific items with FISH_ prefix to avoid conflicts\nexport {\n BONE_NODES as FISH_BONE_NODES,\n BONE_BINDINGS as FISH_BONE_BINDINGS,\n COMPOSITE_ROTATIONS as FISH_COMPOSITE_ROTATIONS,\n EYE_MESH_NODES as FISH_EYE_MESH_NODES,\n} from './bettaFish';\n\n/**\n * Preset types that can be passed to Loom3\n */\nexport type PresetType = 'cc4' | 'skeletal' | 'fish' | 'custom';\n\n// Import CC4_PRESET at module level for resolvePreset\nimport { CC4_PRESET } from './cc4';\n\n/**\n * Resolve a preset by type name.\n * This allows frontend to pass a string instead of importing the full preset.\n */\nexport function resolvePreset(presetType: PresetType | string | undefined) {\n switch (presetType) {\n case 'fish':\n case 'skeletal':\n return AU_MAPPING_CONFIG;\n case 'cc4':\n case 'custom':\n default:\n return CC4_PRESET;\n }\n}\n\n/**\n * Resolve a preset and merge optional overrides.\n */\nexport function resolvePresetWithOverrides(\n presetType: PresetType | string | undefined,\n overrides?: Partial<Profile>\n): Profile {\n const base = resolvePreset(presetType);\n return overrides ? resolveProfile(base, overrides) : base;\n}\n","/**\n * Loom3 - Three.js Implementation\n *\n * Default implementation of the LoomLarge 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 Quaternion,\n Vector3,\n Box3,\n Clock,\n} from 'three';\nimport type { Mesh, Object3D, AnimationClip } from 'three';\nimport type {\n LoomLarge,\n ReadyPayload,\n LoomLargeConfig,\n} from '../../interfaces/LoomLarge';\nimport type { MeshInfo, MorphTargetRef, Profile, HairPhysicsProfileConfig } 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} from '../../core/types';\nimport { AnimationThree, BakedAnimationController } from './AnimationThree';\nimport { HairPhysicsController, type HairPhysicsConfig, type HairPhysicsConfigUpdate, type HairPhysicsDirectionConfig, type HairMorphTargets } from './hair/HairPhysicsController';\nimport { CC4_PRESET, CC4_MESHES, COMPOSITE_ROTATIONS as CC4_COMPOSITE_ROTATIONS } from '../../presets/cc4';\nimport { resolvePreset } from '../../presets';\nimport { resolveProfile } from '../../mappings/resolveProfile';\nimport type { CompositeRotation, BoneBinding } from '../../core/types';\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 ResolvedMorphTargetsBySide = {\n left: MorphTargetHandle[];\n right: MorphTargetHandle[];\n center: MorphTargetHandle[];\n};\n\nexport class Loom3 implements LoomLarge {\n // Optional hook for animation schedulers.\n onSnippetEnd?: (name: string) => void;\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: MorphTargetHandle[][] = [];\n\n // Bones\n private bones: ResolvedBones = {};\n private mixWeights: Record<number, number> = {};\n\n // Viseme state\n private visemeValues: number[] = new Array(15).fill(0);\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 bakedAnimations: BakedAnimationController;\n private hairPhysics: HairPhysicsController;\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: LoomLargeConfig = {},\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 const basePreset = config.presetType ? resolvePreset(config.presetType) : CC4_PRESET;\n this.config = config.profile ? resolveProfile(basePreset, config.profile) : basePreset;\n this.mixWeights = { ...this.config.auMixDefaults };\n this.animation = animation || new AnimationThree();\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.hairPhysics = new HairPhysicsController({\n getMeshByName: (name) => this.meshByName.get(name),\n buildClip: (clipName, curves, options) => this.buildClip(clipName, curves, options),\n cleanupSnippet: (name) => this.cleanupSnippet(name),\n });\n\n this.bakedAnimations = new BakedAnimationController({\n getModel: () => this.model,\n getMeshes: () => this.meshes,\n getMeshByName: (name) => this.meshByName.get(name),\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 });\n\n this.applyHairPhysicsProfileConfig();\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n onReady(payload: ReadyPayload): void {\n const { meshes, model } = payload;\n\n const collectedMeshes = collectMorphMeshes(model);\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 meshes.forEach(addMesh);\n collectedMeshes.forEach(addMesh);\n\n this.meshes = Array.from(meshByKey.values());\n this.model = model;\n this.meshByName.clear();\n this.morphKeyCache.clear();\n this.morphIndexCache.clear();\n\n // Build mesh lookup\n model.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n const infl = obj.morphTargetInfluences;\n const dict = obj.morphTargetDictionary;\n if ((Array.isArray(infl) && infl.length > 0) || (dict && Object.keys(dict).length > 0)) {\n this.meshByName.set(obj.name, obj);\n }\n }\n });\n\n // Resolve bones\n this.bones = this.resolveBones(model);\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 = this.resolveFaceMeshes(this.meshes);\n this.faceMesh = this.resolvedFaceMeshes.length > 0\n ? this.meshByName.get(this.resolvedFaceMeshes[0]) || null\n : null;\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 if (!this.config.morphToMesh?.face || this.config.morphToMesh.face.length === 0) {\n const morphMeshNames = this.meshes\n .filter((m) => {\n const infl = m.morphTargetInfluences;\n const dict = m.morphTargetDictionary;\n return (Array.isArray(infl) && infl.length > 0) || (dict && Object.keys(dict).length > 0);\n })\n .map((m) => m.name)\n .filter(Boolean);\n\n if (morphMeshNames.length > 0) {\n this.config.morphToMesh = {\n ...this.config.morphToMesh,\n face: Array.from(new Set(morphMeshNames)),\n };\n }\n }\n\n this.rebuildMorphTargetsCache();\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('[Loom3] Face mesh resolved:', faceName);\n console.log('[Loom3] Face mesh morphs:', morphKeys);\n }\n } else {\n console.log('[Loom3] 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 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 < (this.config.visemeKeys || []).length; i += 1) {\n const key = this.config.visemeKeys[i];\n const targets = typeof key === 'number'\n ? this.resolveMorphTargetsByIndex(key)\n : this.resolveMorphTargets(key);\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['HEAD']?.obj;\n if (head && availableMorphMeshes.length > 0) {\n const headPos = new Vector3();\n (head as any).getWorldPosition?.(headPos);\n const headCandidates = availableMorphMeshes.map((mesh) => {\n const box = new Box3().setFromObject(mesh as any);\n const center = new Vector3();\n box.getCenter(center);\n const distance = box.containsPoint(headPos) ? 0 : center.distanceTo(headPos);\n const morphCount = mesh.morphTargetDictionary\n ? Object.keys(mesh.morphTargetDictionary).length\n : 0;\n const name = mesh.name.toLowerCase();\n const penalty = /eye|occlusion|tear|teeth|tongue|hair|lash/.test(name) ? 10 : 0;\n return { name: mesh.name, distance, morphCount, penalty };\n });\n\n headCandidates.sort((a, b) => {\n if (a.distance !== b.distance) return a.distance - b.distance;\n if (a.penalty !== b.penalty) return a.penalty - b.penalty;\n return b.morphCount - a.morphCount;\n });\n\n const best = headCandidates[0];\n const extras = headCandidates\n .filter((entry) => /brow|eyebrow/.test(entry.name.toLowerCase()))\n .map((entry) => entry.name);\n\n return [best.name, ...extras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n if (availableMorphMeshes.length > 0) {\n const best = availableMorphMeshes.reduce((prev, current) => {\n const prevCount = prev.morphTargetDictionary ? Object.keys(prev.morphTargetDictionary).length : 0;\n const currCount = current.morphTargetDictionary ? Object.keys(current.morphTargetDictionary).length : 0;\n return currCount > prevCount ? current : prev;\n });\n const browExtras = availableMorphMeshes\n .filter((m) => {\n const dict = m.morphTargetDictionary || {};\n const morphKeys = Object.keys(dict);\n return /brow|eyebrow/i.test(m.name) || morphKeys.some((k) => /brow/i.test(k));\n })\n .map((m) => m.name);\n return [best.name, ...browExtras].filter((value, index, arr) => arr.indexOf(value) === index);\n }\n\n return [];\n }\n\n update(deltaSeconds: number): void {\n const dtSeconds = Math.max(0, deltaSeconds || 0);\n if (dtSeconds <= 0 || this.isPaused) return;\n\n this.animation.tick(dtSeconds);\n this.flushPendingComposites();\n\n this.bakedAnimations.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.bakedAnimations.dispose();\n this.meshes = [];\n this.model = null;\n this.bones = {};\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 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 for (const t of resolvedMorphTargets.left) {\n t.infl[t.idx] = leftVal;\n }\n for (const t of resolvedMorphTargets.right) {\n t.infl[t.idx] = rightVal;\n }\n }\n\n for (const t of resolvedMorphTargets.center) {\n t.infl[t.idx] = base;\n }\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 // Check if this AU affects composite rotations\n const compositeInfo = this.auToCompositeMap.get(id);\n\n if (compositeInfo) {\n // Compute balance-adjusted values for bilateral bone AUs\n const storedBalance = this.auBalances[id] ?? 0;\n const { left: leftVal, right: rightVal } = this.computeSideValues(clamp01(v), storedBalance);\n\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 // Calculate axis value based on whether it's a continuum pair\n let axisValue: number;\n if (axisConfig.negative !== undefined && axisConfig.positive !== undefined) {\n // Continuum: calculate difference between positive and negative AUs\n const negValue = this.auValues[axisConfig.negative] ?? 0;\n const posValue = this.auValues[axisConfig.positive] ?? 0;\n axisValue = posValue - negValue;\n } else if (axisConfig.aus.length > 1) {\n // Multiple AUs affect same axis (e.g., jaw drop) - use max\n axisValue = Math.max(...axisConfig.aus.map((auId: number) => this.auValues[auId] ?? 0));\n } else {\n // Single AU controls this axis\n axisValue = v;\n }\n\n // Apply balance based on mapping-provided side hints, not name heuristics.\n const auBoneBindings = this.config.auToBones[id] || [];\n const sideByNode = new Map<string, 'left' | 'right'>();\n for (const binding of auBoneBindings) {\n if (binding.side === 'left' || binding.side === 'right') {\n sideByNode.set(binding.node, binding.side);\n }\n }\n const side = sideByNode.get(nodeKey);\n if (side) {\n const baseValue = clamp01(v);\n const balanceValue = side === 'left' ? leftVal : rightVal;\n const denom = baseValue > 0 ? baseValue : 1;\n axisValue = axisValue * (balanceValue / denom);\n }\n\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 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, balance);\n\n this.auValues[numId] = target;\n\n const handles: TransitionHandle[] = [];\n const meshNames = this.getMeshNamesForAU(numId);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, leftVal, durationMs, meshNames)\n : this.transitionMorph(k, leftVal, durationMs, meshNames)\n );\n }\n for (const k of rightKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, rightVal, durationMs, meshNames)\n : this.transitionMorph(k, rightVal, durationMs, meshNames)\n );\n }\n }\n\n for (const k of centerKeys) {\n handles.push(\n typeof k === 'number'\n ? this.transitionMorphInfluence(k, base, durationMs, meshNames)\n : this.transitionMorph(k, base, durationMs, meshNames)\n );\n }\n\n // Handle bone rotations using auToCompositeMap\n const compositeInfo = this.auToCompositeMap.get(numId);\n if (compositeInfo) {\n for (const nodeKey of compositeInfo.nodes) {\n const config = this.compositeRotations.find((c: CompositeRotation) => c.node === nodeKey);\n if (!config) continue;\n\n const axisConfig = config[compositeInfo.axis];\n if (!axisConfig) continue;\n\n // Calculate axis value based on whether it's a continuum pair\n let axisValue: number;\n if (axisConfig.negative !== undefined && axisConfig.positive !== undefined) {\n const negValue = this.auValues[axisConfig.negative] ?? 0;\n const posValue = this.auValues[axisConfig.positive] ?? 0;\n axisValue = posValue - negValue;\n } else if (axisConfig.aus.length > 1) {\n axisValue = Math.max(...axisConfig.aus.map((auId: number) => this.auValues[auId] ?? 0));\n } else {\n axisValue = target;\n }\n\n handles.push(this.transitionBoneRotation(nodeKey, compositeInfo.axis, axisValue, durationMs));\n }\n }\n\n // Handle translations\n for (const binding of bindings) {\n if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n handles.push(this.transitionBoneTranslation(binding.node, binding.channel, target * binding.scale, binding.maxUnits, durationMs));\n }\n }\n }\n\n return this.combineHandles(handles);\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n getCompositeRotations(): CompositeRotation[] {\n return this.compositeRotations;\n }\n\n // ============================================================================\n // CONTINUUM CONTROL (for paired AUs like eyes left/right, head up/down)\n // ============================================================================\n\n /**\n * Set a continuum AU pair immediately (no animation).\n *\n * Sign convention:\n * - Negative value (-1 to 0): activates negAU (e.g., head left, eyes left)\n * - Positive value (0 to +1): activates posAU (e.g., head right, eyes right)\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Value from -1 (full negative) to +1 (full positive)\n * @param balance - Optional L/R balance for bilateral morphs\n */\n setContinuum(negAU: number, posAU: number, continuumValue: number, balance?: number): void {\n const value = Math.max(-1, Math.min(1, continuumValue));\n\n if (value < 0) {\n this.setAU(posAU, 0, balance);\n this.setAU(negAU, Math.abs(value), balance);\n return;\n }\n if (value > 0) {\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, value, balance);\n return;\n }\n\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, 0, balance);\n }\n\n /**\n * Smoothly transition a continuum AU pair (e.g., eyes left/right, head up/down).\n * Takes a continuum value from -1 to +1 and internally manages both AU values.\n *\n * @param negAU - AU ID for negative direction (e.g., 61 for eyes left)\n * @param posAU - AU ID for positive direction (e.g., 62 for eyes right)\n * @param continuumValue - Target value from -1 (full negative) to +1 (full positive)\n * @param durationMs - Transition duration in milliseconds\n * @param balance - Optional L/R balance for bilateral morphs\n */\n transitionContinuum(negAU: number, posAU: number, continuumValue: number, durationMs = 200, balance?: number): TransitionHandle {\n const target = Math.max(-1, Math.min(1, continuumValue));\n const driverKey = `continuum_${negAU}_${posAU}`;\n\n // Get current continuum value: positive if posAU active, negative if negAU active\n const currentNeg = this.auValues[negAU] ?? 0;\n const currentPos = this.auValues[posAU] ?? 0;\n const currentContinuum = currentPos - currentNeg;\n\n return this.animation.addTransition(driverKey, currentContinuum, target, durationMs, (value) => this.setContinuum(negAU, posAU, value, balance));\n }\n\n // ============================================================================\n // MORPH CONTROL\n // ============================================================================\n\n /**\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 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 = dict[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.config.visemeKeys.length) return;\n\n const val = clamp01(value);\n this.visemeValues[visemeIndex] = val;\n\n const targets = this.resolvedVisemeTargets[visemeIndex];\n if (targets && targets.length > 0) {\n this.applyMorphTargets(targets, val);\n } else {\n const morphKey = this.config.visemeKeys[visemeIndex];\n if (typeof morphKey === 'number') {\n this.setMorphInfluence(morphKey, val);\n } else if (typeof morphKey === 'string') {\n this.setMorph(morphKey, val);\n }\n }\n\n const jawAmount = Loom3.VISEME_JAW_AMOUNTS[visemeIndex] * val * jawScale;\n if (Math.abs(jawScale) > 1e-6 && Math.abs(jawAmount) > 1e-6) {\n this.updateBoneRotation('JAW', 'pitch', jawAmount);\n }\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n if (visemeIndex < 0 || visemeIndex >= this.config.visemeKeys.length) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n\n const morphKey = this.config.visemeKeys[visemeIndex];\n const target = clamp01(to);\n this.visemeValues[visemeIndex] = target;\n\n const morphHandle = typeof morphKey === 'number'\n ? this.transitionMorphInfluence(morphKey, target, durationMs)\n : this.transitionMorph(morphKey, target, durationMs);\n\n const jawAmount = Loom3.VISEME_JAW_AMOUNTS[visemeIndex] * target * jawScale;\n if (Math.abs(jawScale) <= 1e-6 || Math.abs(jawAmount) <= 1e-6) {\n return morphHandle;\n }\n\n const jawHandle = this.transitionBoneRotation('JAW', 'pitch', jawAmount, durationMs);\n return this.combineHandles([morphHandle, jawHandle]);\n }\n\n // ============================================================================\n // MIX WEIGHT CONTROL\n // ============================================================================\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n const v = this.auValues[id] ?? 0;\n if (v > 0) this.setAU(id, v);\n\n const boneBindings = this.config.auToBones[id];\n if (boneBindings) {\n for (const binding of boneBindings) {\n this.pendingCompositeNodes.add(binding.node);\n }\n }\n }\n\n getAUMixWeight(id: number): number {\n return this.mixWeights[id] ?? this.config.auMixDefaults?.[id] ?? 1.0;\n }\n\n /**\n * Check if an AU has bilateral bone bindings (left + right side hints).\n * Used to determine if a balance slider should be shown for bone-only bilateral AUs.\n */\n hasLeftRightBones(auId: number): boolean {\n const bindings = this.config.auToBones[auId] || [];\n const hasLeft = bindings.some((binding) => binding.side === 'left');\n const hasRight = bindings.some((binding) => binding.side === 'right');\n return hasLeft && hasRight;\n }\n\n // ============================================================================\n // PLAYBACK CONTROL\n // ============================================================================\n\n pause(): void { this.isPaused = true; }\n resume(): void { this.isPaused = false; }\n getPaused(): boolean { return this.isPaused; }\n clearTransitions(): void { this.animation.clearTransitions(); }\n getActiveTransitionCount(): number { return this.animation.getActiveTransitionCount(); }\n\n resetToNeutral(): void {\n this.auValues = {};\n this.initBoneRotations();\n this.clearTransitions();\n\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 infl[i] = 0;\n }\n }\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n entry.obj.position.copy(entry.basePos as any);\n entry.obj.quaternion.copy(entry.baseQuat);\n });\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.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n obj.visible = visible;\n }\n });\n }\n\n /** Store original emissive colors for highlight reset */\n private originalEmissive = new Map<string, { color: number; intensity: number }>();\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\n this.model.traverse((obj: any) => {\n if (!obj.isMesh) return;\n\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n for (const mat of materials) {\n if (!mat || !('emissive' in mat)) continue;\n\n if (meshName === null || obj.name !== meshName) {\n // Reset to original emissive\n const original = this.originalEmissive.get(obj.name);\n if (original) {\n mat.emissive.setHex(original.color);\n mat.emissiveIntensity = original.intensity;\n }\n } else if (obj.name === meshName) {\n // Store original if not already stored\n if (!this.originalEmissive.has(obj.name)) {\n this.originalEmissive.set(obj.name, {\n color: mat.emissive.getHex(),\n intensity: mat.emissiveIntensity || 0,\n });\n }\n // Apply highlight\n mat.emissive.setHex(color);\n mat.emissiveIntensity = intensity;\n }\n }\n });\n }\n\n /** Blending mode options for Three.js materials */\n private static readonly BLENDING_MODES: Record<string, number> = {\n 'Normal': 1, // THREE.NormalBlending\n 'Additive': 2, // THREE.AdditiveBlending\n 'Subtractive': 3, // THREE.SubtractiveBlending\n 'Multiply': 4, // THREE.MultiplyBlending\n 'None': 0, // THREE.NoBlending\n };\n\n /** Get material config for a mesh */\n getMeshMaterialConfig(meshName: string): {\n renderOrder: number;\n transparent: boolean;\n opacity: number;\n depthWrite: boolean;\n depthTest: boolean;\n blending: string;\n } | null {\n if (!this.model) return null;\n let result: ReturnType<Loom3['getMeshMaterialConfig']> = null;\n\n this.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n const mat = obj.material;\n if (mat) {\n // Reverse lookup blending mode name\n let blendingName = 'Normal';\n for (const [name, value] of Object.entries(Loom3.BLENDING_MODES)) {\n if (mat.blending === value) {\n blendingName = name;\n break;\n }\n }\n result = {\n renderOrder: obj.renderOrder,\n transparent: mat.transparent,\n opacity: mat.opacity,\n depthWrite: mat.depthWrite,\n depthTest: mat.depthTest,\n blending: blendingName,\n };\n }\n }\n });\n\n return result;\n }\n\n /** Set material config for a mesh */\n setMeshMaterialConfig(meshName: string, config: {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: string;\n }): void {\n if (!this.model) return;\n\n this.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n const mat = obj.material;\n\n if (config.renderOrder !== undefined) {\n obj.renderOrder = config.renderOrder;\n }\n\n if (mat) {\n // Handle transparency - auto-enable when opacity < 1\n if (config.opacity !== undefined) {\n mat.opacity = config.opacity;\n // Auto-enable transparency when opacity is reduced\n if (config.opacity < 1 && config.transparent === undefined) {\n mat.transparent = true;\n }\n }\n if (config.transparent !== undefined) {\n mat.transparent = config.transparent;\n }\n if (config.depthWrite !== undefined) {\n mat.depthWrite = config.depthWrite;\n }\n if (config.depthTest !== undefined) {\n mat.depthTest = config.depthTest;\n }\n if (config.blending !== undefined) {\n const blendValue = Loom3.BLENDING_MODES[config.blending];\n if (blendValue !== undefined) {\n mat.blending = blendValue;\n }\n }\n // Always mark material as needing update after any change\n mat.needsUpdate = true;\n }\n }\n });\n }\n\n // ============================================================================\n // CONFIGURATION\n // ============================================================================\n\n private applyHairPhysicsProfileConfig(): void {\n const hairConfig: HairPhysicsProfileConfig | undefined = this.config.hairPhysics;\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.hairPhysics.setHairPhysicsConfig(runtimeConfig);\n }\n\n setProfile(profile: Profile): void {\n this.config = profile;\n this.mixWeights = { ...profile.auMixDefaults };\n if (this.model) {\n this.rebuildMorphTargetsCache();\n }\n this.applyHairPhysicsProfileConfig();\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 * Routes by facePart: Tongue → tongue, Eye → eye, everything else → face.\n */\n getMeshNamesForAU(auId: number): string[] {\n const m = this.config.morphToMesh;\n const info = this.config.auInfo?.[String(auId)];\n if (!info?.facePart) return m?.face || [];\n switch (info.facePart) {\n case 'Tongue': return m?.tongue || [];\n case 'Eye': return m?.eye || [];\n default: return m?.face || [];\n }\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 return {\n yaw: this.rotations.HEAD?.yaw ?? 0,\n pitch: this.rotations.HEAD?.pitch ?? 0,\n roll: this.rotations.HEAD?.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 // ============================================================================\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 for (const target of targets) {\n target.infl[target.idx] = val;\n }\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 = dict[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 = dict[key];\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\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 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 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 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 // Check if HEAD changed - triggers hair physics update\n const headChanged = 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 this.hairPhysics.onHeadRotationChanged(\n this.rotations.HEAD?.yaw ?? 0,\n this.rotations.HEAD?.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 binding from the correct AU for an axis based on direction\n const getBindingForAxis = (\n axisConfig: typeof config.pitch | typeof config.yaw | typeof config.roll,\n direction: number\n ) => {\n if (!axisConfig) return null;\n\n // For continuum pairs, select the AU based on direction\n if (axisConfig.negative !== undefined && axisConfig.positive !== undefined) {\n const auId = direction < 0 ? axisConfig.negative : axisConfig.positive;\n return this.config.auToBones[auId]?.find((b: BoneBinding) => b.node === nodeKey);\n }\n\n // If multiple AUs, find which one is active (has highest value)\n if (axisConfig.aus.length > 1) {\n let maxAU = axisConfig.aus[0];\n let maxValue = this.auValues[maxAU] ?? 0;\n for (const auId of axisConfig.aus) {\n const val = this.auValues[auId] ?? 0;\n if (val > maxValue) {\n maxValue = val;\n maxAU = auId;\n }\n }\n return this.config.auToBones[maxAU]?.find((b: BoneBinding) => b.node === nodeKey);\n }\n\n // Single AU\n return this.config.auToBones[axisConfig.aus[0]]?.find((b: BoneBinding) => b.node === nodeKey);\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 = getBindingForAxis(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 = getBindingForAxis(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 = getBindingForAxis(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 // Apply position\n obj.position.copy(basePos as any);\n const t = this.translations[nodeKey];\n if (t) {\n obj.position.x += t.x;\n obj.position.y += t.y;\n obj.position.z += t.z;\n }\n\n // Apply composite quaternion rotation\n (obj.quaternion as any).copy(compositeQ);\n obj.updateMatrixWorld(false);\n this.model.updateMatrixWorld(true);\n }\n\n private resolveBones(root: Object3D): ResolvedBones {\n const resolved: ResolvedBones = {};\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 // 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 // Find node with exact match first, then fuzzy match with suffix pattern\n const findNode = (baseName?: string | null): Object3D | undefined => {\n if (!baseName) return undefined;\n\n // Build full name with prefix and suffix\n const fullName = prefix + baseName + suffix;\n\n // Try exact match first\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 // Fallback: try without prefix (for configs that don't use prefix)\n if (prefix) {\n const noPrefix = root.getObjectByName(baseName);\n if (noPrefix) return noPrefix;\n }\n\n return undefined;\n };\n\n for (const [key, nodeName] of Object.entries(this.config.boneNodes)) {\n const node = findNode(nodeName);\n if (node) {\n resolved[key] = snapshot(node);\n }\n }\n\n if (!resolved.EYE_L && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.LEFT);\n if (node) {\n resolved.EYE_L = snapshot(node);\n }\n }\n if (!resolved.EYE_R && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.RIGHT);\n if (node) {\n resolved.EYE_R = snapshot(node);\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 const settings = meshInfo.material;\n\n // Apply renderOrder to the mesh itself\n if (typeof settings.renderOrder === 'number') {\n obj.renderOrder = settings.renderOrder;\n }\n\n // Apply material settings if the mesh has a material\n if (obj.material) {\n if (typeof settings.transparent === 'boolean') {\n obj.material.transparent = settings.transparent;\n }\n if (typeof settings.opacity === 'number') {\n obj.material.opacity = settings.opacity;\n }\n if (typeof settings.depthWrite === 'boolean') {\n obj.material.depthWrite = settings.depthWrite;\n }\n if (typeof settings.depthTest === 'boolean') {\n obj.material.depthTest = settings.depthTest;\n }\n if (typeof settings.blending === 'string') {\n const blendValue = Loom3.BLENDING_MODES[settings.blending];\n if (blendValue !== undefined) {\n obj.material.blending = blendValue;\n }\n }\n obj.material.needsUpdate = true;\n }\n });\n\n }\n\n // ===========wha=================================================================\n // BAKED ANIMATION CONTROL (Three.js AnimationMixer)\n // ============================================================================\n\n loadAnimationClips(clips: unknown[]): void {\n this.bakedAnimations.loadAnimationClips(clips);\n }\n\n getAnimationClips(): AnimationClipInfo[] {\n return this.bakedAnimations.getAnimationClips();\n }\n\n playAnimation(clipName: string, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.bakedAnimations.playAnimation(clipName, options);\n }\n\n stopAnimation(clipName: string): void {\n this.bakedAnimations.stopAnimation(clipName);\n }\n\n stopAllAnimations(): void {\n this.bakedAnimations.stopAllAnimations();\n }\n\n pauseAnimation(clipName: string): void {\n this.bakedAnimations.pauseAnimation(clipName);\n }\n\n resumeAnimation(clipName: string): void {\n this.bakedAnimations.resumeAnimation(clipName);\n }\n\n pauseAllAnimations(): void {\n this.bakedAnimations.pauseAllAnimations();\n }\n\n resumeAllAnimations(): void {\n this.bakedAnimations.resumeAllAnimations();\n }\n\n setAnimationSpeed(clipName: string, speed: number): void {\n this.bakedAnimations.setAnimationSpeed(clipName, speed);\n }\n\n setAnimationIntensity(clipName: string, intensity: number): void {\n this.bakedAnimations.setAnimationIntensity(clipName, intensity);\n }\n\n setAnimationTimeScale(timeScale: number): void {\n this.bakedAnimations.setAnimationTimeScale(timeScale);\n }\n\n getAnimationState(clipName: string): AnimationState | null {\n return this.bakedAnimations.getAnimationState(clipName);\n }\n\n getPlayingAnimations(): AnimationState[] {\n return this.bakedAnimations.getPlayingAnimations();\n }\n\n crossfadeTo(clipName: string, duration = 0.3, options: AnimationPlayOptions = {}): AnimationActionHandle | null {\n return this.bakedAnimations.crossfadeTo(clipName, duration, options);\n }\n\n snippetToClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): AnimationClip | null {\n return this.bakedAnimations.snippetToClip(clipName, curves, options);\n }\n\n playClip(clip: AnimationClip, options?: ClipOptions): ClipHandle | null {\n return this.bakedAnimations.playClip(clip, options);\n }\n\n playSnippet(\n snippet: Snippet | { name: string; curves: CurvesMap },\n options?: ClipOptions\n ): ClipHandle | null {\n return this.bakedAnimations.playSnippet(snippet, options);\n }\n\n buildClip(\n clipName: string,\n curves: CurvesMap,\n options?: ClipOptions\n ): ClipHandle | null {\n return this.bakedAnimations.buildClip(clipName, curves, options);\n }\n\n cleanupSnippet(name: string) {\n this.bakedAnimations.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.bakedAnimations.updateClipParams(name, params);\n }\n\n /**\n * Check if curves can be played through buildClip.\n * Returns false if curves contain bone-only AUs that can't be baked to morph 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","/**\n * Loom3 - Profile Types\n *\n * Type definitions for character profiles.\n * Profiles define how Action Units map to morphs/bones for a specific rig.\n */\n\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\n\n/**\n * Profile - Complete configuration for AU-to-morph/bone mappings\n *\n * This is the main configuration object that defines how Action Units\n * map to morph targets and bone transformations for a specific rig type.\n */\nexport interface Profile {\n /** Human-readable name for this profile (e.g., 'Character Creator 4', 'Betta Fish') */\n name?: string;\n\n /** Type of animal/creature this profile is for (e.g., 'human', 'fish', 'dog') */\n animalType?: string;\n\n /** Emoji representing this animal type (e.g., '😊' for human, '🐟' for fish) */\n emoji?: string;\n\n /** AU ID to morph target names split by side */\n auToMorphs: Record<number, MorphTargetsBySide>;\n\n /** AU ID to bone bindings (e.g., AU 51 → [{ node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 }]) */\n auToBones: Record<number, BoneBinding[]>;\n\n /** Bone key to actual node name in the model (e.g., 'HEAD' → 'Head' or 'CC_Base_Head') */\n boneNodes: Record<string, string>;\n\n /**\n * Optional: Prefix to prepend to bone names when resolving nodes.\n * If set, boneNodes should contain base names without prefix (e.g., 'Head' instead of 'CC_Base_Head').\n * The engine will try: prefix + baseName + suffix, then fuzzy match with suffixPattern.\n */\n bonePrefix?: string;\n\n /**\n * Optional: Suffix to append to bone names when resolving nodes.\n * Combined with bonePrefix: prefix + baseName + suffix (e.g., 'Bone.' + '001' + '_Armature' = 'Bone.001_Armature')\n */\n boneSuffix?: string;\n\n /**\n * Optional: Prefix to prepend to morph target names when resolving.\n * Similar to bonePrefix but for morph targets.\n */\n morphPrefix?: string;\n\n /**\n * Optional: Suffix to append to morph target names when resolving.\n * Similar to boneSuffix but for morph targets.\n */\n morphSuffix?: string;\n\n /**\n * Optional: Regex pattern string for fuzzy matching bone/morph names with suffixes.\n * Common patterns: \"_\\\\d+$\" for numbered suffixes (_01, _038), \"\\\\.\\\\d+$\" for Blender (.001)\n * When set, the engine will try exact match first, then fuzzy match using this pattern.\n */\n suffixPattern?: string;\n\n /**\n * Optional: Suffixes that indicate left-side morph targets.\n * Used for auto-detecting laterality in the mapping editor.\n * Default: ['_L', ' L']\n */\n leftMorphSuffixes?: string[];\n\n /**\n * Optional: Suffixes that indicate right-side morph targets.\n * Used for auto-detecting laterality in the mapping editor.\n * Default: ['_R', ' R']\n */\n rightMorphSuffixes?: string[];\n\n /** Morph category to mesh names (e.g., 'face' → ['CC_Base_Body_1']) */\n morphToMesh: Record<string, string[]>;\n\n /** Viseme targets in order (typically 15 phoneme positions) */\n visemeKeys: MorphTargetRef[];\n\n /** Optional: Jaw opening amounts per viseme index (0-1). Used for auto-generating jaw rotation in clips. */\n visemeJawAmounts?: number[];\n\n /** Optional: Default mix weights for bone/morph blending (0 = morph only, 1 = bone only) */\n auMixDefaults?: Record<number, number>;\n\n /** Optional: AU metadata (names, muscle basis, etc.) */\n auInfo?: Record<string, AUInfo>;\n\n /** Optional: Eye mesh node fallbacks (some rigs use mesh nodes instead of bone nodes) */\n eyeMeshNodes?: {\n LEFT: string;\n RIGHT: string;\n };\n\n /** Optional: Composite rotation definitions for bones (defaults to CC4 composites) */\n compositeRotations?: CompositeRotation[];\n\n /** Optional: Mesh info for material settings (depthWrite, blending, renderOrder, etc.) */\n meshes?: Record<string, MeshInfo>;\n\n /**\n * Optional: Continuum pair mappings for bidirectional AU axes.\n * Maps AU ID to its partner info (pairId, isNegative, axis, node).\n * Enables negative value shorthand: setAU(51, -0.5) activates AU 52 at 0.5\n */\n continuumPairs?: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: string;\n }>;\n\n /**\n * Optional: Human-readable labels for continuum pairs.\n * Key format: \"negativeAU-positiveAU\" (e.g., \"51-52\")\n * Value: Display label (e.g., \"Head Turn — Left ↔ Right\")\n */\n continuumLabels?: Record<string, string>;\n\n /**\n * Optional: Annotation regions for camera/marker overlays.\n */\n annotationRegions?: AnnotationRegion[];\n\n /**\n * Optional: Hair physics defaults for this preset/profile.\n */\n hairPhysics?: HairPhysicsProfileConfig;\n}\n\n/**\n * Hair physics morph mapping axis types.\n */\nexport type HairMorphAxis = 'yaw' | 'pitch' | 'roll';\n\n/**\n * Single morph target mapping with axis metadata.\n */\nexport interface HairMorphTargetMapping {\n key: string;\n axis: HairMorphAxis;\n}\n\n/**\n * Morph target mapping with axis metadata and intensity value.\n */\nexport interface HairMorphTargetValueMapping {\n value: number;\n axis: HairMorphAxis;\n}\n\n/**\n * Hair physics defaults stored in presets/profiles.\n */\nexport interface HairPhysicsProfileConfig {\n stiffness?: number;\n damping?: number;\n inertia?: number;\n gravity?: number;\n responseScale?: number;\n idleSwayAmount?: number;\n idleSwaySpeed?: number;\n windStrength?: number;\n windDirectionX?: number;\n windDirectionZ?: number;\n windTurbulence?: number;\n windFrequency?: number;\n idleClipDuration?: number;\n impulseClipDuration?: number;\n direction?: {\n yawSign?: 1 | -1;\n pitchSign?: 1 | -1;\n };\n morphTargets?: {\n swayLeft?: HairMorphTargetMapping;\n swayRight?: HairMorphTargetMapping;\n swayFront?: HairMorphTargetMapping;\n fluffRight?: HairMorphTargetMapping;\n fluffBottom?: HairMorphTargetMapping;\n headUp?: Record<string, HairMorphTargetValueMapping>;\n headDown?: Record<string, HairMorphTargetValueMapping>;\n };\n}\n\n\n/**\n * Annotation region definition for camera markers.\n */\nexport interface AnnotationRegion {\n name: string;\n bones?: string[];\n meshes?: string[];\n objects?: string[];\n paddingFactor?: number;\n cameraAngle?: number;\n cameraOffset?: {\n x?: number;\n y?: number;\n z?: number;\n };\n parent?: string;\n children?: string[];\n expandAnimation?: 'outward' | 'staggered';\n showChildConnections?: boolean;\n style?: {\n markerColor?: number;\n markerRadius?: number;\n lineColor?: number;\n labelColor?: string;\n labelBackground?: string;\n labelFontSize?: number;\n opacity?: number;\n lineDirection?: 'radial' | 'camera' | 'up' | 'down' | 'left' | 'right' | 'forward' | 'backward' | { x: number; y: number; z: number };\n line?: {\n style?: 'solid' | 'dashed' | 'dotted';\n curve?: 'straight' | 'bezier' | 'arc';\n arrowHead?: boolean;\n thickness?: number;\n length?: number;\n };\n };\n groupId?: string;\n isFallback?: boolean;\n}\n\n/**\n * Morph target key (name in morphTargetDictionary).\n */\nexport type MorphTargetKey = string;\n\n/**\n * Morph target index (morphTargetInfluences slot).\n */\nexport type MorphTargetIndex = number;\n\n/**\n * Morph target reference (key or index).\n */\nexport type MorphTargetRef = MorphTargetKey | MorphTargetIndex;\n\nexport interface MorphTargetsBySide {\n left: MorphTargetRef[];\n right: MorphTargetRef[];\n center: MorphTargetRef[];\n}\n\n/**\n * Helper type for mesh categories in morphToMesh\n */\nexport type MorphCategory = 'face' | 'viseme' | 'eye' | 'tongue' | 'hair';\n\n/**\n * Mesh category types for character mesh classification\n */\nexport type MeshCategory = 'body' | 'eye' | 'eyeOcclusion' | 'tearLine' | 'teeth' | 'tongue' | 'hair' | 'eyebrow' | 'cornea' | 'eyelash';\n\n/**\n * Blending mode names (matches Three.js constants)\n */\nexport type BlendingMode = 'Normal' | 'Additive' | 'Subtractive' | 'Multiply' | 'None';\n\n/**\n * Blending mode options for Three.js materials\n * Maps mode name to Three.js blending constant value\n */\nexport const BLENDING_MODES: Record<BlendingMode, number> = {\n 'Normal': 1, // THREE.NormalBlending\n 'Additive': 2, // THREE.AdditiveBlending\n 'Subtractive': 3, // THREE.SubtractiveBlending\n 'Multiply': 4, // THREE.MultiplyBlending\n 'None': 0, // THREE.NoBlending\n};\n\n/**\n * Material settings for mesh rendering\n */\nexport interface MeshMaterialSettings {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: BlendingMode;\n}\n\n/**\n * Mesh info including category, morph count, and optional material settings.\n * Used in presets, profiles, and runtime.\n */\nexport interface MeshInfo {\n name?: string;\n visible?: boolean;\n category: MeshCategory;\n morphCount: number;\n material?: MeshMaterialSettings;\n}\n","/**\n * Loom3 - Geometry Helpers\n *\n * Helper functions for finding face positions, annotation centers,\n * and other geometry-related calculations for character models.\n */\n\nimport * as THREE from 'three';\n\n/**\n * Result of finding a face center position\n */\nexport interface FaceCenterResult {\n /** The calculated face center position in world space */\n center: THREE.Vector3;\n /** The head bone position (if found) */\n headBonePosition?: THREE.Vector3;\n /** How the center was determined */\n method: 'head-bone-offset' | 'bone-average' | 'mesh-center' | 'fallback';\n /** Debug info about what was found */\n debugInfo: string[];\n}\n\n/**\n * Options for finding face center\n */\nexport interface FindFaceCenterOptions {\n /** Names of bones to search for head bone (e.g., ['CC_Base_Head']) */\n headBoneNames?: string[];\n /** Names of face meshes - when provided, uses mesh bounding box center for positioning */\n faceMeshNames?: string[];\n /** Forward offset from head bone to face surface (default: 0.08 = 8cm) */\n forwardOffset?: number;\n /** Reference model height for scaling (default: 1.8m) */\n referenceHeight?: number;\n}\n\nconst DEFAULT_HEAD_BONE_NAMES = ['CC_Base_Head', 'Head', 'head', 'Bip01_Head'];\nconst DEFAULT_REFERENCE_HEIGHT = 1.8;\nconst DEFAULT_FORWARD_OFFSET = 0.08; // 8cm forward from head bone\n\n// Eye bone names for detecting forward direction\nconst EYE_BONE_NAMES = {\n left: ['CC_Base_L_Eye', 'LeftEye', 'Eye_L', 'L_Eye'],\n right: ['CC_Base_R_Eye', 'RightEye', 'Eye_R', 'R_Eye'],\n};\n\n/**\n * Find the center position of a character's face.\n *\n * Strategy:\n * 1. If face mesh names provided and they're face-only meshes, use mesh center\n * 2. Otherwise find head bone and use EYE positions to determine forward direction\n * (Eyes are reliably IN FRONT of the head bone, unlike jaw which is below)\n *\n * @param model - The root Object3D of the character model\n * @param options - Configuration options\n * @returns FaceCenterResult with the calculated position\n */\nexport function findFaceCenter(\n model: THREE.Object3D,\n options: FindFaceCenterOptions = {}\n): FaceCenterResult {\n const {\n headBoneNames = DEFAULT_HEAD_BONE_NAMES,\n faceMeshNames,\n forwardOffset = DEFAULT_FORWARD_OFFSET,\n referenceHeight = DEFAULT_REFERENCE_HEIGHT,\n } = options;\n\n const debugInfo: string[] = [];\n\n // Calculate model size for scaling\n const boundingBox = new THREE.Box3().setFromObject(model);\n const modelSize = new THREE.Vector3();\n boundingBox.getSize(modelSize);\n const scale = modelSize.y / referenceHeight;\n\n debugInfo.push(`Model height: ${modelSize.y.toFixed(2)}m, scale factor: ${scale.toFixed(2)}`);\n\n // Helper to find head bone\n const findHeadBone = (): THREE.Vector3 | null => {\n let headPos: THREE.Vector3 | null = null;\n model.traverse((obj) => {\n if (headPos) return;\n const objName = obj.name.toLowerCase();\n for (const boneName of headBoneNames) {\n if (objName === boneName.toLowerCase() || objName.includes(boneName.toLowerCase())) {\n headPos = new THREE.Vector3();\n obj.getWorldPosition(headPos);\n debugInfo.push(`Found head bone \"${obj.name}\" at (${headPos.x.toFixed(3)}, ${headPos.y.toFixed(3)}, ${headPos.z.toFixed(3)})`);\n return;\n }\n }\n });\n return headPos;\n };\n\n // Helper to find eye positions - eyes are IN FRONT of head bone\n const findEyes = (): { left: THREE.Vector3 | null; right: THREE.Vector3 | null } => {\n const eyes: { left: THREE.Vector3 | null; right: THREE.Vector3 | null } = {\n left: null,\n right: null,\n };\n\n model.traverse((obj) => {\n const objName = obj.name;\n\n if (!eyes.left) {\n for (const name of EYE_BONE_NAMES.left) {\n if (objName.includes(name)) {\n eyes.left = new THREE.Vector3();\n obj.getWorldPosition(eyes.left);\n debugInfo.push(`Found left eye \"${obj.name}\" at (${eyes.left.x.toFixed(3)}, ${eyes.left.y.toFixed(3)}, ${eyes.left.z.toFixed(3)})`);\n break;\n }\n }\n }\n\n if (!eyes.right) {\n for (const name of EYE_BONE_NAMES.right) {\n if (objName.includes(name)) {\n eyes.right = new THREE.Vector3();\n obj.getWorldPosition(eyes.right);\n debugInfo.push(`Found right eye \"${obj.name}\" at (${eyes.right.x.toFixed(3)}, ${eyes.right.y.toFixed(3)}, ${eyes.right.z.toFixed(3)})`);\n break;\n }\n }\n }\n });\n\n return eyes;\n };\n\n // PRIORITY 1: If face mesh names are provided, check if it's a face-only mesh\n if (faceMeshNames && faceMeshNames.length > 0) {\n debugInfo.push(`Looking for face meshes: ${faceMeshNames.join(', ')}`);\n\n const meshBox = new THREE.Box3();\n let foundMesh = false;\n\n model.traverse((obj) => {\n const isMesh = (obj as THREE.Mesh).isMesh;\n if (!isMesh) return;\n\n for (const meshName of faceMeshNames) {\n if (obj.name === meshName || obj.name.includes(meshName)) {\n const mesh = obj as THREE.Mesh;\n const tempBox = new THREE.Box3().setFromObject(mesh);\n meshBox.union(tempBox);\n foundMesh = true;\n debugInfo.push(`Found mesh: \"${obj.name}\"`);\n break;\n }\n }\n });\n\n if (foundMesh && !meshBox.isEmpty()) {\n const meshBoundsSize = new THREE.Vector3();\n meshBox.getSize(meshBoundsSize);\n\n // Check if this is a full-body mesh\n const isFullBodyMesh = meshBoundsSize.y > modelSize.y * 0.7;\n\n if (!isFullBodyMesh) {\n // Face-only mesh - use its center\n const meshCenter = new THREE.Vector3();\n meshBox.getCenter(meshCenter);\n debugInfo.push(`Using face mesh center: (${meshCenter.x.toFixed(3)}, ${meshCenter.y.toFixed(3)}, ${meshCenter.z.toFixed(3)})`);\n\n return {\n center: meshCenter,\n method: 'mesh-center',\n debugInfo,\n };\n }\n\n debugInfo.push(`Mesh is full-body (${meshBoundsSize.y.toFixed(2)}m), using eye-based direction instead`);\n }\n }\n\n // PRIORITY 2: Use eye positions to find face center\n // The midpoint between the eyes IS the face center (no offset needed)\n const eyes = findEyes();\n if (eyes.left && eyes.right) {\n const eyeCenter = new THREE.Vector3()\n .addVectors(eyes.left, eyes.right)\n .multiplyScalar(0.5);\n\n debugInfo.push(`Eye center (face position): (${eyeCenter.x.toFixed(3)}, ${eyeCenter.y.toFixed(3)}, ${eyeCenter.z.toFixed(3)})`);\n\n // Find head bone for reference\n const headPos = findHeadBone();\n\n return {\n center: eyeCenter,\n headBonePosition: headPos || undefined,\n method: 'head-bone-offset',\n debugInfo,\n };\n }\n\n // PRIORITY 3: Use head bone with model forward direction\n const headPos = findHeadBone();\n if (headPos) {\n const forwardDir = getModelForwardDirection(model);\n debugInfo.push('No eyes found, using head bone + model forward direction');\n const scaledOffset = forwardOffset * scale;\n const faceCenter = headPos.clone().add(forwardDir.multiplyScalar(scaledOffset));\n\n debugInfo.push(`Face center: (${faceCenter.x.toFixed(3)}, ${faceCenter.y.toFixed(3)}, ${faceCenter.z.toFixed(3)})`);\n\n return {\n center: faceCenter,\n headBonePosition: headPos.clone(),\n method: 'head-bone-offset',\n debugInfo,\n };\n }\n\n // Fallback: use model bounding box center, offset upward for face\n debugInfo.push('No head bone found, using model center fallback');\n const modelCenter = new THREE.Vector3();\n boundingBox.getCenter(modelCenter);\n\n const headHeight = boundingBox.min.y + modelSize.y * 0.9;\n const fallbackCenter = new THREE.Vector3(modelCenter.x, headHeight, modelCenter.z);\n\n debugInfo.push(`Fallback center: (${fallbackCenter.x.toFixed(3)}, ${fallbackCenter.y.toFixed(3)}, ${fallbackCenter.z.toFixed(3)})`);\n\n return {\n center: fallbackCenter,\n method: 'fallback',\n debugInfo,\n };\n}\n\n/**\n * Get the forward direction of a model in world space.\n * Assumes the model's local forward is positive Z.\n *\n * @param model - The model to get forward direction for\n * @returns Normalized forward direction vector in world space\n */\nexport function getModelForwardDirection(model: THREE.Object3D): THREE.Vector3 {\n const forward = new THREE.Vector3(0, 0, 1);\n forward.applyQuaternion(model.quaternion);\n return forward.normalize();\n}\n\n/**\n * Check if a character model is facing forward (toward camera at origin).\n * Uses head/eye bone positions to determine facing direction.\n *\n * @param model - The character model\n * @param eyeBoneNames - Names of eye bones to search for\n * @returns 'forward' if facing camera, 'backward' if facing away, 'unknown' if can't determine\n */\nexport function detectFacingDirection(\n model: THREE.Object3D,\n eyeBoneNames: { left: string[]; right: string[] } = {\n left: ['CC_Base_L_Eye', 'LeftEye', 'Eye_L'],\n right: ['CC_Base_R_Eye', 'RightEye', 'Eye_R'],\n }\n): 'forward' | 'backward' | 'unknown' {\n const eyes: { left: THREE.Vector3 | null; right: THREE.Vector3 | null } = {\n left: null,\n right: null,\n };\n\n model.traverse((obj) => {\n const objName = obj.name;\n\n if (!eyes.left) {\n for (const name of eyeBoneNames.left) {\n if (objName.includes(name)) {\n eyes.left = new THREE.Vector3();\n obj.getWorldPosition(eyes.left);\n break;\n }\n }\n }\n\n if (!eyes.right) {\n for (const name of eyeBoneNames.right) {\n if (objName.includes(name)) {\n eyes.right = new THREE.Vector3();\n obj.getWorldPosition(eyes.right);\n break;\n }\n }\n }\n });\n\n if (!eyes.left || !eyes.right) {\n return 'unknown';\n }\n\n // In a forward-facing model, left eye should have smaller X than right eye\n const eyeXDiff = eyes.left.x - eyes.right.x;\n\n if (Math.abs(eyeXDiff) < 0.001) {\n return 'unknown';\n }\n\n return eyeXDiff < 0 ? 'forward' : 'backward';\n}\n","import * as THREE from 'three';\n\nimport type { CharacterConfig, Region } from '../characters/types';\nimport { findFaceCenter } from '../validation/geometryHelpers';\n\nexport interface ResolvedFaceCenter {\n center: THREE.Vector3;\n method: string;\n debugInfo: string[];\n}\n\nexport function resolveBoneName(semanticName: string, config?: CharacterConfig): string {\n if (!config) return semanticName;\n\n const { bonePrefix, boneSuffix, boneNodes } = config;\n\n if (!boneNodes || !boneNodes[semanticName]) {\n return semanticName;\n }\n\n const baseName = boneNodes[semanticName];\n\n // Names that already include separators are treated as full names.\n if (baseName.includes('_') || baseName.includes('.')) {\n return baseName;\n }\n\n const prefix = bonePrefix || '';\n const suffix = boneSuffix || '';\n return prefix + baseName + suffix;\n}\n\nexport function resolveBoneNames(\n names: string[] | undefined,\n config?: CharacterConfig\n): string[] {\n if (!names || names.length === 0) return [];\n return names.map((name) => resolveBoneName(name, config));\n}\n\nexport function fuzzyNameMatch(\n objectName: string,\n targetName: string,\n suffixPattern?: string\n): boolean {\n if (objectName === targetName) return true;\n if (!objectName.startsWith(targetName)) return false;\n const suffix = objectName.slice(targetName.length);\n if (suffix === '') return true;\n const regex = suffixPattern ? new RegExp(suffixPattern) : /^[_\\.]\\d+$/;\n return regex.test(suffix);\n}\n\nexport function resolveFaceCenter(\n model: THREE.Object3D,\n region: Region,\n config?: CharacterConfig\n): ResolvedFaceCenter {\n const resolvedBones = resolveBoneNames(region.bones, config);\n const headBoneNames = resolvedBones.filter((name) => name.toLowerCase().includes('head'));\n\n const result = findFaceCenter(model, {\n headBoneNames: headBoneNames.length > 0 ? headBoneNames : undefined,\n faceMeshNames: region.meshes && region.meshes.length > 0 ? region.meshes : undefined,\n });\n\n return {\n center: result.center,\n method: result.method,\n debugInfo: result.debugInfo,\n };\n}\n","/**\n * HairPhysics - Spring-damper pendulum simulation for hair movement\n *\n * This is a pure physics simulation class with no Three.js dependencies.\n * It outputs normalized morph values (0-1) that can be applied to hair meshes\n * via EngineThree.setMorph() or transitionMorph().\n *\n * Physics model:\n * - Hair is modeled as a damped pendulum affected by:\n * - Gravity (constant downward force based on head orientation)\n * - Head velocity (inertia causes hair to lag behind head movement)\n * - Wind (oscillating force with turbulence)\n * - Spring restoration (hair returns to rest position)\n * - Damping (air resistance)\n */\n\nexport interface HairPhysicsConfig {\n // Spring-damper parameters\n mass: number; // Hair mass (affects inertia), default 1.0\n stiffness: number; // Spring stiffness (restoration force), default 15\n damping: number; // Damping coefficient (air resistance), default 0.8\n\n // Gravity\n gravity: number; // Gravity strength, default 9.8\n\n // Head influence\n headInfluence: number; // How much head movement affects hair (0-1), default 0.5\n\n // Wind simulation\n windEnabled: boolean;\n windStrength: number; // Wind force magnitude, default 0\n windDirectionX: number; // Wind direction X component (-1 to 1), default 1\n windDirectionZ: number; // Wind direction Z component (-1 to 1), default 0\n windTurbulence: number; // Random variation in wind, default 0.2\n windFrequency: number; // Oscillation frequency in Hz, default 0.5\n}\n\nexport interface HairPhysicsState {\n // Current pendulum position (normalized -1 to 1)\n x: number; // Left/right swing\n z: number; // Front/back swing\n\n // Current velocity\n vx: number;\n vz: number;\n}\n\nexport interface HairMorphOutput {\n // Left side morphs (0-1)\n L_Hair_Left: number;\n L_Hair_Right: number;\n L_Hair_Front: number;\n\n // Right side morphs (0-1)\n R_Hair_Left: number;\n R_Hair_Right: number;\n R_Hair_Front: number;\n}\n\nexport interface HeadState {\n // Head rotation in radians\n yaw: number; // Left/right rotation\n pitch: number; // Up/down rotation\n roll: number; // Tilt\n\n // Head angular velocity (radians/sec) - for inertia\n yawVelocity: number;\n pitchVelocity: number;\n}\n\nexport const DEFAULT_HAIR_PHYSICS_CONFIG: HairPhysicsConfig = {\n mass: 1.0,\n stiffness: 15,\n damping: 0.8,\n gravity: 9.8,\n headInfluence: 0.5,\n windEnabled: false,\n windStrength: 0,\n windDirectionX: 1,\n windDirectionZ: 0,\n windTurbulence: 0.2,\n windFrequency: 0.5,\n};\n\nexport class HairPhysics {\n private config: HairPhysicsConfig;\n private state: HairPhysicsState;\n private time: number = 0;\n\n // Previous head state for velocity calculation\n private prevHeadYaw: number = 0;\n private prevHeadPitch: number = 0;\n\n constructor(config: Partial<HairPhysicsConfig> = {}) {\n this.config = { ...DEFAULT_HAIR_PHYSICS_CONFIG, ...config };\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n }\n\n /**\n * Update physics simulation\n * @param dt Delta time in seconds\n * @param headState Current head orientation and velocity\n * @returns Morph values to apply to hair meshes\n */\n update(dt: number, headState: HeadState): HairMorphOutput {\n if (dt <= 0 || dt > 0.1) {\n // Skip bad delta times (prevent explosion on tab switch)\n return this.computeMorphOutput();\n }\n\n this.time += dt;\n\n const { mass, stiffness, damping, gravity, headInfluence, windEnabled } = this.config;\n\n // Calculate head angular velocity if not provided\n const headYawVel = headState.yawVelocity !== 0\n ? headState.yawVelocity\n : (headState.yaw - this.prevHeadYaw) / dt;\n const headPitchVel = headState.pitchVelocity !== 0\n ? headState.pitchVelocity\n : (headState.pitch - this.prevHeadPitch) / dt;\n\n this.prevHeadYaw = headState.yaw;\n this.prevHeadPitch = headState.pitch;\n\n // === Forces ===\n\n // 1. Spring restoration force (pulls hair back to center)\n const springFx = -stiffness * this.state.x;\n const springFz = -stiffness * this.state.z;\n\n // 2. Damping force (air resistance)\n const dampFx = -damping * this.state.vx;\n const dampFz = -damping * this.state.vz;\n\n // 3. Gravity effect based on head pitch\n // When head tilts forward (positive pitch), hair swings forward\n // When head tilts back, hair swings back\n const gravityFz = gravity * Math.sin(headState.pitch) * 0.1;\n\n // 4. Head rotation inertia (hair lags behind head movement)\n // When head turns right (positive yaw velocity), hair swings left relative to head\n const inertiaFx = -headYawVel * headInfluence * mass * 2;\n const inertiaFz = -headPitchVel * headInfluence * mass * 2;\n\n // 5. Wind force\n let windFx = 0;\n let windFz = 0;\n if (windEnabled && this.config.windStrength > 0) {\n const { windStrength, windDirectionX, windDirectionZ, windTurbulence, windFrequency } = this.config;\n\n // Base oscillating wind\n const windPhase = this.time * windFrequency * Math.PI * 2;\n const windOscillation = Math.sin(windPhase);\n\n // Add turbulence (perpendicular to wind direction)\n const turbulencePhase = this.time * windFrequency * 3.7; // Different frequency for variation\n const turbulence = Math.sin(turbulencePhase) * windTurbulence;\n\n windFx = windStrength * windDirectionX * (0.5 + 0.5 * windOscillation) + turbulence * (-windDirectionZ);\n windFz = windStrength * windDirectionZ * (0.5 + 0.5 * windOscillation) + turbulence * windDirectionX;\n }\n\n // === Integration (Semi-implicit Euler) ===\n\n const totalFx = springFx + dampFx + inertiaFx + windFx;\n const totalFz = springFz + dampFz + gravityFz + inertiaFz + windFz;\n\n // Acceleration = Force / Mass\n const ax = totalFx / mass;\n const az = totalFz / mass;\n\n // Update velocity\n this.state.vx += ax * dt;\n this.state.vz += az * dt;\n\n // Clamp velocity to prevent instability\n const maxVel = 10;\n this.state.vx = Math.max(-maxVel, Math.min(maxVel, this.state.vx));\n this.state.vz = Math.max(-maxVel, Math.min(maxVel, this.state.vz));\n\n // Update position\n this.state.x += this.state.vx * dt;\n this.state.z += this.state.vz * dt;\n\n // Clamp position to valid range\n this.state.x = Math.max(-1, Math.min(1, this.state.x));\n this.state.z = Math.max(-1, Math.min(1, this.state.z));\n\n return this.computeMorphOutput();\n }\n\n /**\n * Convert physics state to morph target values\n * Maps pendulum position to left/right/front morphs for both sides\n */\n private computeMorphOutput(): HairMorphOutput {\n const { x, z } = this.state;\n\n // X axis: negative = swing left, positive = swing right\n // Z axis: negative = swing back, positive = swing forward\n\n // Left side of hair\n // When hair swings left (x < 0), L_Hair_Left increases\n // When hair swings right (x > 0), L_Hair_Right increases\n const L_Hair_Left = Math.max(0, -x);\n const L_Hair_Right = Math.max(0, x);\n const L_Hair_Front = Math.max(0, z);\n\n // Right side mirrors left side behavior\n // When hair swings left (x < 0), R_Hair_Left increases\n // When hair swings right (x > 0), R_Hair_Right increases\n const R_Hair_Left = Math.max(0, -x);\n const R_Hair_Right = Math.max(0, x);\n const R_Hair_Front = Math.max(0, z);\n\n return {\n L_Hair_Left,\n L_Hair_Right,\n L_Hair_Front,\n R_Hair_Left,\n R_Hair_Right,\n R_Hair_Front,\n };\n }\n\n /**\n * Get current physics state (for debugging/UI)\n */\n getState(): HairPhysicsState {\n return { ...this.state };\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<HairPhysicsConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HairPhysicsConfig {\n return { ...this.config };\n }\n\n /**\n * Reset physics state to rest position\n */\n reset(): void {\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n this.time = 0;\n this.prevHeadYaw = 0;\n this.prevHeadPitch = 0;\n }\n}\n","/**\n * Loom3 - Mapping Corrections\n *\n * Attempts to generate a corrected mapping configuration using fuzzy matching.\n * This is a best-effort helper that can be layered on top of validation.\n */\n\nimport type { Profile, MorphTargetsBySide, MorphTargetRef } from '../mappings/types';\n\ninterface MorphMesh {\n name: string;\n morphTargetDictionary?: Record<string, number>;\n morphTargetInfluences?: number[];\n}\n\ninterface Skeleton {\n bones: Array<{ name: string }>;\n}\n\nexport interface MappingCorrection {\n type: 'bone' | 'morph' | 'viseme' | 'mesh';\n source: string;\n target: string;\n confidence: number;\n reason: string;\n applied: boolean;\n auId?: number;\n key?: string;\n}\n\nexport interface MappingCorrectionResult {\n correctedConfig: Profile;\n corrections: MappingCorrection[];\n unresolved: MappingCorrection[];\n}\n\nexport interface MappingCorrectionOptions {\n minConfidence?: number;\n /**\n * When true, normalize names to resolved full names and clear prefix/suffix.\n * This is useful when target names don't follow the prefix/suffix pattern.\n */\n useResolvedNames?: boolean;\n}\n\nconst DEFAULT_MIN_CONFIDENCE = 0.6;\n\nfunction levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n const aLen = a.length;\n const bLen = b.length;\n\n for (let i = 0; i <= bLen; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= aLen; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= bLen; i++) {\n for (let j = 1; j <= aLen; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n\n return matrix[bLen][aLen];\n}\n\nfunction stringSimilarity(a: string, b: string): number {\n if (a === b) return 1;\n const maxLen = Math.max(a.length, b.length);\n if (maxLen === 0) return 1;\n const distance = levenshteinDistance(a.toLowerCase(), b.toLowerCase());\n return 1 - distance / maxLen;\n}\n\nfunction scoreCandidate(\n targetBase: string,\n candidate: string,\n fullTarget: string,\n suffixPattern: RegExp | null\n): { score: number; reason: string } {\n if (candidate === fullTarget) {\n return { score: 1, reason: 'exact match' };\n }\n\n if (suffixPattern && candidate.startsWith(fullTarget)) {\n const suffix = candidate.slice(fullTarget.length);\n if (suffix === '' || suffixPattern.test(suffix)) {\n return { score: 0.95, reason: 'suffix match' };\n }\n }\n\n const fullScore = stringSimilarity(candidate, fullTarget);\n const baseScore = stringSimilarity(candidate, targetBase);\n const score = Math.max(fullScore, baseScore);\n const reason = fullScore >= baseScore ? 'similar full name' : 'similar base name';\n return { score, reason };\n}\n\nfunction deriveBaseName(candidate: string, prefix: string, suffix: string): string | null {\n const hasPrefix = prefix && candidate.startsWith(prefix);\n const hasSuffix = suffix && candidate.endsWith(suffix);\n if (hasPrefix && hasSuffix) {\n return candidate.slice(prefix.length, candidate.length - suffix.length);\n }\n if (prefix === '' && suffix === '') {\n return candidate;\n }\n return null;\n}\n\nfunction findBestMatch(\n targetBase: string,\n candidates: Set<string>,\n prefix: string,\n suffix: string,\n suffixPattern: RegExp | null\n): { candidate: string; confidence: number; reason: string } | null {\n const fullTarget = prefix + targetBase + suffix;\n let best: { candidate: string; confidence: number; reason: string } | null = null;\n\n for (const candidate of candidates) {\n const { score, reason } = scoreCandidate(targetBase, candidate, fullTarget, suffixPattern);\n if (!best || score > best.confidence) {\n best = { candidate, confidence: score, reason };\n }\n }\n\n return best;\n}\n\nfunction collectModelAssets(meshes: MorphMesh[], skeleton: Skeleton | null) {\n const modelMorphs = new Set<string>();\n const modelMeshes = new Set<string>();\n for (const mesh of meshes) {\n if (mesh.name) modelMeshes.add(mesh.name);\n if (mesh.morphTargetDictionary) {\n for (const morphName of Object.keys(mesh.morphTargetDictionary)) {\n modelMorphs.add(morphName);\n }\n }\n }\n\n const modelBones = new Set<string>();\n if (skeleton?.bones) {\n for (const bone of skeleton.bones) {\n if (bone.name) modelBones.add(bone.name);\n }\n }\n\n return { modelMorphs, modelMeshes, modelBones };\n}\n\nexport function generateMappingCorrections(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n config: Profile,\n options: MappingCorrectionOptions = {}\n): MappingCorrectionResult {\n const { minConfidence = DEFAULT_MIN_CONFIDENCE, useResolvedNames = false } = options;\n const suffixPattern = config.suffixPattern ? new RegExp(config.suffixPattern) : null;\n const bonePrefix = config.bonePrefix || '';\n const boneSuffix = config.boneSuffix || '';\n const morphPrefix = config.morphPrefix || '';\n const morphSuffix = config.morphSuffix || '';\n\n const { modelMorphs, modelMeshes, modelBones } = collectModelAssets(meshes, skeleton);\n\n const corrections: MappingCorrection[] = [];\n const unresolved: MappingCorrection[] = [];\n\n const correctedConfig: Profile = {\n ...config,\n boneNodes: { ...config.boneNodes },\n auToMorphs: { ...config.auToMorphs },\n morphToMesh: { ...config.morphToMesh },\n visemeKeys: [...config.visemeKeys],\n };\n\n if (useResolvedNames) {\n correctedConfig.bonePrefix = '';\n correctedConfig.boneSuffix = '';\n correctedConfig.morphPrefix = '';\n correctedConfig.morphSuffix = '';\n }\n\n // Bone nodes corrections\n for (const [semanticKey, baseName] of Object.entries(config.boneNodes)) {\n const match = findBestMatch(baseName, modelBones, bonePrefix, boneSuffix, suffixPattern);\n if (!match || match.confidence < minConfidence) {\n unresolved.push({\n type: 'bone',\n source: baseName,\n target: baseName,\n confidence: match?.confidence ?? 0,\n reason: match?.reason ?? 'no match',\n applied: false,\n key: semanticKey,\n });\n continue;\n }\n\n const derivedBase = deriveBaseName(match.candidate, bonePrefix, boneSuffix);\n const resolvedName = useResolvedNames || !derivedBase ? match.candidate : derivedBase;\n const canApply = useResolvedNames || derivedBase !== null;\n\n if (canApply && resolvedName !== baseName) {\n correctedConfig.boneNodes[semanticKey] = resolvedName;\n }\n\n corrections.push({\n type: 'bone',\n source: baseName,\n target: match.candidate,\n confidence: match.confidence,\n reason: match.reason,\n applied: canApply && resolvedName !== baseName,\n key: semanticKey,\n });\n }\n\n // Morph corrections (AU morphs + visemes)\n const updateMorphList = (items: MorphTargetRef[], auId?: number): MorphTargetRef[] => {\n return items.map((morphName) => {\n if (typeof morphName !== 'string') {\n return morphName;\n }\n\n if (modelMorphs.has(morphName)) return morphName;\n\n const match = findBestMatch(morphName, modelMorphs, morphPrefix, morphSuffix, suffixPattern);\n if (!match || match.confidence < minConfidence) {\n unresolved.push({\n type: 'morph',\n source: morphName,\n target: morphName,\n confidence: match?.confidence ?? 0,\n reason: match?.reason ?? 'no match',\n applied: false,\n auId,\n });\n return morphName;\n }\n\n const derivedBase = deriveBaseName(match.candidate, morphPrefix, morphSuffix);\n const resolvedName = useResolvedNames || !derivedBase ? match.candidate : derivedBase;\n const canApply = useResolvedNames || derivedBase !== null;\n\n corrections.push({\n type: 'morph',\n source: morphName,\n target: match.candidate,\n confidence: match.confidence,\n reason: match.reason,\n applied: canApply && resolvedName !== morphName,\n auId,\n });\n\n return canApply ? resolvedName : morphName;\n });\n };\n\n const updateMorphsBySide = (entry: MorphTargetsBySide | undefined, auId?: number): MorphTargetsBySide => ({\n left: entry ? updateMorphList(entry.left, auId) : [],\n right: entry ? updateMorphList(entry.right, auId) : [],\n center: entry ? updateMorphList(entry.center, auId) : [],\n });\n\n for (const [auIdStr, morphs] of Object.entries(config.auToMorphs)) {\n const auId = Number(auIdStr);\n correctedConfig.auToMorphs[auId] = updateMorphsBySide(morphs, auId);\n }\n\n correctedConfig.visemeKeys = updateMorphList(config.visemeKeys).filter(\n (key): key is string => typeof key === 'string'\n );\n\n // morphToMesh corrections\n for (const [category, meshList] of Object.entries(config.morphToMesh || {})) {\n correctedConfig.morphToMesh[category] = meshList.map((meshName) => {\n if (modelMeshes.has(meshName)) return meshName;\n\n const match = findBestMatch(meshName, modelMeshes, '', '', suffixPattern);\n if (!match || match.confidence < minConfidence) {\n unresolved.push({\n type: 'mesh',\n source: meshName,\n target: meshName,\n confidence: match?.confidence ?? 0,\n reason: match?.reason ?? 'no match',\n applied: false,\n key: category,\n });\n return meshName;\n }\n\n corrections.push({\n type: 'mesh',\n source: meshName,\n target: match.candidate,\n confidence: match.confidence,\n reason: match.reason,\n applied: match.candidate !== meshName,\n key: category,\n });\n\n return match.candidate;\n });\n }\n\n return {\n correctedConfig,\n corrections,\n unresolved,\n };\n}\n","/**\n * Loom3 - Mapping Validation\n *\n * Validates that AU mapping presets are compatible with a loaded character model.\n * Checks that bones, morph targets, and meshes referenced in the preset exist in the model.\n */\n\nimport type { Profile, MorphTargetsBySide, MorphTargetRef } from '../mappings/types';\nimport type { MappingCorrection, MappingCorrectionOptions } from './generateMappingCorrections';\nimport { generateMappingCorrections } from './generateMappingCorrections';\n\n/**\n * Result of validating a preset against a model\n */\nexport interface ValidationResult {\n /** Overall validity - true if essential mappings are found */\n valid: boolean;\n\n /** Compatibility score from 0-100 */\n score: number;\n\n /** Morph targets referenced in preset but not found in model */\n missingMorphs: string[];\n\n /** Bones referenced in preset but not found in model */\n missingBones: string[];\n\n /** Morph targets successfully matched */\n foundMorphs: string[];\n\n /** Bones successfully matched */\n foundBones: string[];\n\n /** Morph targets in model not used by preset */\n unmappedMorphs: string[];\n\n /** Bones in model not used by preset */\n unmappedBones: string[];\n\n /** Meshes referenced by morphToMesh but not found in model */\n missingMeshes: string[];\n\n /** Meshes referenced by morphToMesh and found in model */\n foundMeshes: string[];\n\n /** Meshes in model not referenced by morphToMesh */\n unmappedMeshes: string[];\n\n /** Non-fatal warnings and suggestions */\n warnings: string[];\n\n /** Optional: corrected config when suggestions are requested */\n suggestedConfig?: Profile;\n\n /** Optional: corrections applied or suggested */\n corrections?: MappingCorrection[];\n\n /** Optional: unresolved mappings that could not be corrected */\n unresolved?: MappingCorrection[];\n}\n\nexport type IssueSeverity = 'error' | 'warning';\n\nexport interface MappingIssue {\n code: string;\n severity: IssueSeverity;\n message: string;\n data?: Record<string, unknown>;\n}\n\nexport interface MappingConsistencyResult {\n valid: boolean;\n errors: MappingIssue[];\n warnings: MappingIssue[];\n issues: MappingIssue[];\n}\n\nexport interface ValidateMappingOptions extends MappingCorrectionOptions {\n suggestCorrections?: boolean;\n}\n\n/**\n * Interface for mesh with morph targets (compatible with Three.js Mesh)\n */\ninterface MorphMesh {\n name: string;\n morphTargetDictionary?: Record<string, number>;\n morphTargetInfluences?: number[];\n}\n\n/**\n * Interface for skeleton (compatible with Three.js Skeleton)\n */\ninterface Skeleton {\n bones: Array<{ name: string }>;\n}\n\n/**\n * Check if a target name matches using fuzzy matching with suffix pattern\n */\nfunction fuzzyMatch(\n targetName: string,\n candidateName: string,\n prefix: string,\n suffix: string,\n suffixPattern: RegExp | null\n): boolean {\n const fullTarget = prefix + targetName + suffix;\n\n // Exact match\n if (candidateName === fullTarget) {\n return true;\n }\n\n // Fuzzy match with suffix\n if (suffixPattern && candidateName.startsWith(fullTarget)) {\n const suffix = candidateName.slice(fullTarget.length);\n return suffix === '' || suffixPattern.test(suffix);\n }\n\n return false;\n}\n\n/**\n * Find all matching names in a set using fuzzy matching\n */\nfunction findMatches(\n targetNames: string[],\n candidateNames: Set<string>,\n prefix: string,\n suffix: string,\n suffixPattern: RegExp | null\n): { found: string[]; missing: string[] } {\n const found: string[] = [];\n const missing: string[] = [];\n\n for (const target of targetNames) {\n let matched = false;\n for (const candidate of candidateNames) {\n if (fuzzyMatch(target, candidate, prefix, suffix, suffixPattern)) {\n found.push(target);\n matched = true;\n break;\n }\n }\n if (!matched) {\n missing.push(target);\n }\n }\n\n return { found, missing };\n}\n\nfunction collectAxisConfigs(axisConfigs: Array<{ axis: 'pitch' | 'yaw' | 'roll'; config: any }>) {\n return axisConfigs.filter((entry) => entry.config);\n}\n\nfunction isEyeNodeKey(nodeKey: string) {\n return nodeKey === 'EYE_L' || nodeKey === 'EYE_R';\n}\n\n/**\n * Validate that the mapping dictionaries are internally consistent.\n */\nexport function validateMappingConfig(config: Profile): MappingConsistencyResult {\n const errors: MappingIssue[] = [];\n const warnings: MappingIssue[] = [];\n\n const push = (severity: IssueSeverity, code: string, message: string, data?: Record<string, unknown>) => {\n const issue = { severity, code, message, data };\n if (severity === 'error') {\n errors.push(issue);\n } else {\n warnings.push(issue);\n }\n };\n\n const boneNodeKeys = new Set(Object.keys(config.boneNodes || {}));\n const hasEyeMeshNodes = !!config.eyeMeshNodes;\n\n const isNodeResolvable = (nodeKey: string) => {\n if (boneNodeKeys.has(nodeKey)) return true;\n if (isEyeNodeKey(nodeKey) && hasEyeMeshNodes) return true;\n return false;\n };\n\n // Validate bone bindings reference known nodes\n for (const [auIdStr, bindings] of Object.entries(config.auToBones || {})) {\n for (const binding of bindings) {\n if (!isNodeResolvable(binding.node)) {\n push(\n 'error',\n 'BONE_NODE_MISSING',\n `AU ${auIdStr} references bone node \"${binding.node}\" not present in boneNodes`,\n { auId: Number(auIdStr), node: binding.node }\n );\n }\n }\n }\n\n // Validate composite rotations\n const composites = config.compositeRotations || [];\n const compositeNodes = new Set<string>();\n\n for (const composite of composites) {\n if (compositeNodes.has(composite.node)) {\n push(\n 'warning',\n 'COMPOSITE_NODE_DUPLICATE',\n `Composite rotation node \"${composite.node}\" is defined more than once`,\n { node: composite.node }\n );\n }\n compositeNodes.add(composite.node);\n\n if (!isNodeResolvable(composite.node)) {\n push(\n 'error',\n 'COMPOSITE_NODE_MISSING',\n `Composite rotation node \"${composite.node}\" is not present in boneNodes`,\n { node: composite.node }\n );\n }\n\n const axisEntries = collectAxisConfigs([\n { axis: 'pitch', config: composite.pitch },\n { axis: 'yaw', config: composite.yaw },\n { axis: 'roll', config: composite.roll },\n ]);\n\n for (const { config: axisConfig } of axisEntries) {\n if (!axisConfig.aus || axisConfig.aus.length === 0) {\n push(\n 'error',\n 'COMPOSITE_AUS_EMPTY',\n `Composite axis for \"${composite.node}\" has no AU list`,\n { node: composite.node }\n );\n continue;\n }\n\n if (axisConfig.negative !== undefined && !axisConfig.aus.includes(axisConfig.negative)) {\n push(\n 'error',\n 'COMPOSITE_AU_MISSING',\n `Composite axis for \"${composite.node}\" is missing negative AU ${axisConfig.negative} in aus list`,\n { node: composite.node, auId: axisConfig.negative }\n );\n }\n\n if (axisConfig.positive !== undefined && !axisConfig.aus.includes(axisConfig.positive)) {\n push(\n 'error',\n 'COMPOSITE_AU_MISSING',\n `Composite axis for \"${composite.node}\" is missing positive AU ${axisConfig.positive} in aus list`,\n { node: composite.node, auId: axisConfig.positive }\n );\n }\n\n if (\n axisConfig.negative !== undefined &&\n axisConfig.positive !== undefined &&\n axisConfig.negative === axisConfig.positive\n ) {\n push(\n 'error',\n 'COMPOSITE_AU_DUPLICATE',\n `Composite axis for \"${composite.node}\" has identical negative/positive AU ${axisConfig.negative}`,\n { node: composite.node, auId: axisConfig.negative }\n );\n }\n }\n }\n\n // Validate continuum pairs\n const continuumPairs = config.continuumPairs || {};\n for (const [auIdStr, info] of Object.entries(continuumPairs)) {\n const auId = Number(auIdStr);\n if (info.pairId === auId) {\n push(\n 'error',\n 'CONTINUUM_PAIR_INVALID',\n `Continuum AU ${auId} pairs with itself`,\n { auId }\n );\n continue;\n }\n\n const reciprocal = continuumPairs[info.pairId];\n if (!reciprocal) {\n push(\n 'error',\n 'CONTINUUM_PAIR_MISSING',\n `Continuum AU ${auId} is missing reciprocal pair ${info.pairId}`,\n { auId, pairId: info.pairId }\n );\n continue;\n }\n\n if (reciprocal.pairId !== auId) {\n push(\n 'error',\n 'CONTINUUM_PAIR_MISMATCH',\n `Continuum AU ${auId} pair ${info.pairId} does not point back`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (reciprocal.isNegative === info.isNegative) {\n push(\n 'error',\n 'CONTINUUM_SIGN_MISMATCH',\n `Continuum AU ${auId} and ${info.pairId} share the same isNegative flag`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (reciprocal.axis !== info.axis) {\n push(\n 'error',\n 'CONTINUUM_AXIS_MISMATCH',\n `Continuum AU ${auId} and ${info.pairId} disagree on axis`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (reciprocal.node !== info.node) {\n push(\n 'error',\n 'CONTINUUM_NODE_MISMATCH',\n `Continuum AU ${auId} and ${info.pairId} disagree on node`,\n { auId, pairId: info.pairId }\n );\n }\n\n if (!isNodeResolvable(info.node)) {\n push(\n 'error',\n 'CONTINUUM_NODE_MISSING',\n `Continuum AU ${auId} references node \"${info.node}\" not present in boneNodes`,\n { auId, node: info.node }\n );\n }\n }\n\n // Cross-check continuum pairs against composite rotations (if present)\n if (composites.length > 0) {\n for (const [auIdStr, info] of Object.entries(continuumPairs)) {\n const composite = composites.find((c) => c.node === info.node);\n if (!composite) {\n push(\n 'warning',\n 'CONTINUUM_COMPOSITE_MISSING',\n `Continuum AU ${auIdStr} references node \"${info.node}\" without a composite rotation`,\n { auId: Number(auIdStr), node: info.node }\n );\n continue;\n }\n\n const axisConfig = composite[info.axis];\n if (!axisConfig || axisConfig.negative === undefined || axisConfig.positive === undefined) {\n push(\n 'warning',\n 'CONTINUUM_COMPOSITE_MISMATCH',\n `Continuum AU ${auIdStr} axis ${info.axis} is not configured as a negative/positive pair in composites`,\n { auId: Number(auIdStr), node: info.node }\n );\n continue;\n }\n\n const expectedNeg = axisConfig.negative;\n const expectedPos = axisConfig.positive;\n const negId = info.isNegative ? Number(auIdStr) : info.pairId;\n const posId = info.isNegative ? info.pairId : Number(auIdStr);\n if (negId !== expectedNeg || posId !== expectedPos) {\n push(\n 'warning',\n 'CONTINUUM_COMPOSITE_MISMATCH',\n `Continuum AU ${auIdStr} does not match composite negative/positive mapping for ${info.node}`,\n { auId: Number(auIdStr), node: info.node }\n );\n }\n }\n }\n\n // Validate AU info coverage\n if (config.auInfo) {\n const referencedAUs = new Set<number>();\n Object.keys(config.auToBones || {}).forEach((key) => referencedAUs.add(Number(key)));\n Object.keys(config.auToMorphs || {}).forEach((key) => referencedAUs.add(Number(key)));\n Object.keys(continuumPairs).forEach((key) => referencedAUs.add(Number(key)));\n composites.forEach((composite) => {\n [composite.pitch, composite.yaw, composite.roll].forEach((axis) => {\n if (!axis) return;\n axis.aus.forEach((auId) => referencedAUs.add(auId));\n });\n });\n\n for (const auId of referencedAUs) {\n if (!config.auInfo[String(auId)]) {\n push(\n 'warning',\n 'AU_INFO_MISSING',\n `AU ${auId} is referenced but missing from auInfo`,\n { auId }\n );\n }\n }\n }\n\n // Validate viseme keys (duplicates or blanks)\n const visemeSeen = new Set<string>();\n for (const key of config.visemeKeys || []) {\n if (typeof key !== 'string') continue;\n if (!key) {\n push('warning', 'VISEME_EMPTY', 'Viseme key is empty');\n continue;\n }\n if (visemeSeen.has(key)) {\n push('warning', 'VISEME_DUPLICATE', `Viseme key \"${key}\" is duplicated`, { key });\n }\n visemeSeen.add(key);\n }\n\n // Validate auMixDefaults\n if (config.auMixDefaults) {\n for (const key of Object.keys(config.auMixDefaults)) {\n const auId = Number(key);\n if (\n Number.isNaN(auId) ||\n (!config.auToBones?.[auId] && !collectMorphs(config.auToMorphs?.[auId]).length && !continuumPairs[auId])\n ) {\n push(\n 'warning',\n 'AU_MIX_DEFAULT_UNUSED',\n `auMixDefaults includes AU ${key} not present in auToBones/auToMorphs`,\n { auId: key }\n );\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n issues: [...errors, ...warnings],\n };\n}\n\n/**\n * Validate that a preset's mappings exist on the loaded model.\n *\n * @param meshes - Array of meshes with morph targets from the model\n * @param skeleton - Model skeleton (or null if no skeleton)\n * @param config - AU mapping preset to validate against\n * @returns ValidationResult with detailed compatibility info\n */\nconst isStringMorph = (key: MorphTargetRef): key is string => typeof key === 'string';\n\nconst collectMorphs = (entry?: MorphTargetsBySide) =>\n [\n ...(entry?.left ?? []),\n ...(entry?.right ?? []),\n ...(entry?.center ?? []),\n ].filter(isStringMorph);\n\nexport function validateMappings(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n config: Profile,\n options: ValidateMappingOptions = {}\n): ValidationResult {\n const warnings: string[] = [];\n\n // Build suffix regex if pattern provided\n const suffixPattern = config.suffixPattern\n ? new RegExp(config.suffixPattern)\n : null;\n\n const bonePrefix = config.bonePrefix || '';\n const boneSuffix = config.boneSuffix || '';\n const morphPrefix = config.morphPrefix || '';\n const morphSuffix = config.morphSuffix || '';\n\n // Collect all morph target names from meshes\n const modelMorphs = new Set<string>();\n const modelMeshes = new Set<string>();\n for (const mesh of meshes) {\n if (mesh.name) {\n modelMeshes.add(mesh.name);\n }\n if (mesh.morphTargetDictionary) {\n for (const morphName of Object.keys(mesh.morphTargetDictionary)) {\n modelMorphs.add(morphName);\n }\n }\n }\n\n // Collect all bone names from skeleton\n const modelBones = new Set<string>();\n if (skeleton?.bones) {\n for (const bone of skeleton.bones) {\n if (bone.name) {\n modelBones.add(bone.name);\n }\n }\n }\n\n // Get all unique morph targets referenced in preset\n const presetMorphs = new Set<string>();\n for (const entry of Object.values(config.auToMorphs)) {\n for (const morph of collectMorphs(entry)) {\n presetMorphs.add(morph);\n }\n }\n for (const viseme of config.visemeKeys) {\n if (typeof viseme === 'string') {\n presetMorphs.add(viseme);\n }\n }\n\n // Get all unique bone names referenced in preset\n const presetBones = new Set<string>(Object.values(config.boneNodes));\n\n // Validate morphs\n const morphResult = findMatches(\n Array.from(presetMorphs),\n modelMorphs,\n morphPrefix,\n morphSuffix,\n suffixPattern\n );\n\n // Validate bones\n const boneResult = findMatches(\n Array.from(presetBones),\n modelBones,\n bonePrefix,\n boneSuffix,\n suffixPattern\n );\n\n // Find unmapped model assets\n const unmappedMorphs: string[] = [];\n for (const morph of modelMorphs) {\n let isUsed = false;\n for (const target of presetMorphs) {\n if (fuzzyMatch(target, morph, morphPrefix, morphSuffix, suffixPattern)) {\n isUsed = true;\n break;\n }\n }\n if (!isUsed) {\n unmappedMorphs.push(morph);\n }\n }\n\n const unmappedBones: string[] = [];\n for (const bone of modelBones) {\n let isUsed = false;\n for (const target of presetBones) {\n if (fuzzyMatch(target, bone, bonePrefix, boneSuffix, suffixPattern)) {\n isUsed = true;\n break;\n }\n }\n if (!isUsed) {\n unmappedBones.push(bone);\n }\n }\n\n // Generate warnings\n if (presetMorphs.size > 0 && modelMorphs.size === 0) {\n warnings.push('Model has no morph targets - blend shape animations will not work');\n }\n\n if (presetBones.size > 0 && modelBones.size === 0) {\n warnings.push('Model has no skeleton - bone-based animations will not work');\n }\n\n if (morphResult.missing.length > 0 && morphResult.found.length === 0) {\n warnings.push(`No morph targets matched - preset may be incompatible with this model`);\n }\n\n if (boneResult.missing.length > 0 && boneResult.found.length === 0) {\n warnings.push(`No bones matched - preset may be incompatible with this model`);\n }\n\n // Validate morphToMesh references\n const referencedMeshes = new Set<string>();\n for (const meshList of Object.values(config.morphToMesh || {})) {\n for (const meshName of meshList) {\n referencedMeshes.add(meshName);\n }\n }\n\n const missingMeshes: string[] = [];\n const foundMeshes: string[] = [];\n for (const meshName of referencedMeshes) {\n if (modelMeshes.has(meshName)) {\n foundMeshes.push(meshName);\n } else {\n missingMeshes.push(meshName);\n }\n }\n\n const unmappedMeshes: string[] = [];\n for (const meshName of modelMeshes) {\n if (!referencedMeshes.has(meshName)) {\n unmappedMeshes.push(meshName);\n }\n }\n\n if (missingMeshes.length > 0) {\n warnings.push(`Some morphToMesh entries were not found on the model`);\n }\n\n // Validate eye mesh nodes if provided\n if (config.eyeMeshNodes) {\n const left = config.eyeMeshNodes.LEFT;\n const right = config.eyeMeshNodes.RIGHT;\n const leftOk = modelMeshes.has(left) || modelBones.has(left);\n const rightOk = modelMeshes.has(right) || modelBones.has(right);\n if (!leftOk) {\n warnings.push(`Eye mesh node LEFT (\"${left}\") was not found on the model`);\n }\n if (!rightOk) {\n warnings.push(`Eye mesh node RIGHT (\"${right}\") was not found on the model`);\n }\n }\n\n // Calculate compatibility score\n let score = 0;\n\n // Morph score (60% weight if preset uses morphs)\n if (presetMorphs.size > 0) {\n const morphScore = (morphResult.found.length / presetMorphs.size) * 60;\n score += morphScore;\n } else {\n // No morphs in preset - give full morph points\n score += 60;\n }\n\n // Bone score (40% weight if preset uses bones)\n if (presetBones.size > 0) {\n const boneScore = (boneResult.found.length / presetBones.size) * 40;\n score += boneScore;\n } else {\n // No bones in preset - give full bone points\n score += 40;\n }\n\n score = Math.round(score);\n\n // Determine overall validity\n // Valid if at least some essential mappings are found\n const hasMorphSupport = presetMorphs.size === 0 || morphResult.found.length > 0;\n const hasBoneSupport = presetBones.size === 0 || boneResult.found.length > 0;\n const valid = hasMorphSupport || hasBoneSupport;\n\n const result: ValidationResult = {\n valid,\n score,\n missingMorphs: morphResult.missing,\n missingBones: boneResult.missing,\n foundMorphs: morphResult.found,\n foundBones: boneResult.found,\n unmappedMorphs,\n unmappedBones,\n missingMeshes,\n foundMeshes,\n unmappedMeshes,\n warnings,\n };\n\n if (options.suggestCorrections) {\n const correctionResult = generateMappingCorrections(\n meshes,\n skeleton,\n config,\n options\n );\n result.suggestedConfig = correctionResult.correctedConfig;\n result.corrections = correctionResult.corrections;\n result.unresolved = correctionResult.unresolved;\n }\n\n return result;\n}\n\n/**\n * Quick check if a preset is compatible with a model.\n * Returns true if at least 50% of mappings are found.\n */\nexport function isPresetCompatible(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n config: Profile\n): boolean {\n const result = validateMappings(meshes, skeleton, config);\n return result.score >= 50;\n}\n\n/**\n * Suggest the best preset from a list based on validation scores.\n */\nexport function suggestBestPreset<T extends Profile>(\n meshes: MorphMesh[],\n skeleton: Skeleton | null,\n presets: T[]\n): { preset: T; score: number } | null {\n let bestPreset: T | null = null;\n let bestScore = -1;\n\n for (const preset of presets) {\n const result = validateMappings(meshes, skeleton, preset);\n if (result.score > bestScore) {\n bestScore = result.score;\n bestPreset = preset;\n }\n }\n\n return bestPreset ? { preset: bestPreset, score: bestScore } : null;\n}\n","/**\n * Loom3 - Model Data Extraction\n *\n * Extracts bones, morph targets, meshes, and animations from 3D models.\n * Works with both GLTF files and runtime Three.js models.\n */\n\nimport * as THREE from 'three';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\n/**\n * Bone information extracted from skeleton\n */\nexport interface BoneInfo {\n name: string;\n parent: string | null;\n children: string[];\n worldPosition: { x: number; y: number; z: number };\n /** Depth in hierarchy (0 = root) */\n depth: number;\n}\n\n/**\n * Morph target information\n */\nexport interface MorphInfo {\n name: string;\n meshName: string;\n index: number;\n}\n\n/**\n * Model mesh information (from extraction)\n */\nexport interface ModelMeshInfo {\n name: string;\n hasMorphTargets: boolean;\n morphCount: number;\n}\n\n/**\n * Animation track information\n */\nexport interface TrackInfo {\n name: string;\n targetName: string;\n property: string;\n type: 'position' | 'rotation' | 'scale' | 'morph' | 'unknown';\n keyframeCount: number;\n valueRange?: { min: number[]; max: number[] };\n}\n\n/**\n * Animation clip information\n */\nexport interface AnimationInfo {\n name: string;\n duration: number;\n tracks: TrackInfo[];\n animatedBones: string[];\n animatedMorphs: string[];\n}\n\n/**\n * Complete model data extraction result\n */\nexport interface ModelData {\n bones: BoneInfo[];\n morphs: MorphInfo[];\n meshes: ModelMeshInfo[];\n animations: AnimationInfo[];\n /** Quick lookups */\n boneNames: string[];\n morphNames: string[];\n meshNames: string[];\n}\n\n/**\n * Extract bone hierarchy from a Three.js object\n */\nfunction extractBones(root: THREE.Object3D): BoneInfo[] {\n const bones: BoneInfo[] = [];\n const boneDepths = new Map<string, number>();\n\n // First pass: find all bones and calculate depths\n root.traverse((obj) => {\n if (obj instanceof THREE.Bone || obj.type === 'Bone') {\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n\n // Calculate depth by walking up the parent chain\n let depth = 0;\n let parent = obj.parent;\n while (parent) {\n if (parent instanceof THREE.Bone || parent.type === 'Bone') {\n depth++;\n }\n parent = parent.parent;\n }\n boneDepths.set(obj.name, depth);\n\n const parentBone = obj.parent instanceof THREE.Bone || obj.parent?.type === 'Bone'\n ? obj.parent.name\n : null;\n\n bones.push({\n name: obj.name,\n parent: parentBone,\n children: [], // Will be filled in second pass\n worldPosition: { x: worldPos.x, y: worldPos.y, z: worldPos.z },\n depth,\n });\n }\n });\n\n // Second pass: fill in children\n for (const bone of bones) {\n bone.children = bones\n .filter(b => b.parent === bone.name)\n .map(b => b.name);\n }\n\n // Sort by depth, then alphabetically\n bones.sort((a, b) => {\n if (a.depth !== b.depth) return a.depth - b.depth;\n return a.name.localeCompare(b.name);\n });\n\n return bones;\n}\n\n/**\n * Extract morph targets from meshes\n */\nfunction extractMorphs(meshes: THREE.Mesh[]): MorphInfo[] {\n const morphs: MorphInfo[] = [];\n\n for (const mesh of meshes) {\n const geo = mesh.geometry;\n if (!geo.morphAttributes) continue;\n\n // Get morph target dictionary if available\n const dict = (geo as any).morphTargetDictionary as Record<string, number> | undefined;\n\n if (dict) {\n for (const [name, index] of Object.entries(dict)) {\n morphs.push({\n name,\n meshName: mesh.name,\n index,\n });\n }\n } else if (mesh.morphTargetInfluences && mesh.morphTargetInfluences.length > 0) {\n // Fallback: no dictionary, just numbered morphs\n for (let i = 0; i < mesh.morphTargetInfluences.length; i++) {\n morphs.push({\n name: `morph_${i}`,\n meshName: mesh.name,\n index: i,\n });\n }\n }\n }\n\n return morphs;\n}\n\n/**\n * Extract mesh information\n */\nfunction extractMeshes(meshes: THREE.Mesh[]): ModelMeshInfo[] {\n return meshes.map(mesh => ({\n name: mesh.name,\n hasMorphTargets: !!(mesh.morphTargetDictionary && Object.keys(mesh.morphTargetDictionary).length > 0) ||\n !!(mesh.morphTargetInfluences && mesh.morphTargetInfluences.length > 0),\n morphCount: mesh.morphTargetInfluences?.length || 0,\n }));\n}\n\n/**\n * Parse animation track to extract info\n */\nfunction parseTrack(track: THREE.KeyframeTrack): TrackInfo {\n // Track name format: \"objectName.property\" or \"objectName.property[index]\"\n const parts = track.name.split('.');\n const targetName = parts[0];\n const property = parts.slice(1).join('.');\n\n let type: TrackInfo['type'] = 'unknown';\n if (property.includes('position')) type = 'position';\n else if (property.includes('quaternion') || property.includes('rotation')) type = 'rotation';\n else if (property.includes('scale')) type = 'scale';\n else if (property.includes('morphTargetInfluences')) type = 'morph';\n\n // Calculate value ranges\n const values = track.values;\n const valueSize = track.getValueSize();\n let min: number[] = [];\n let max: number[] = [];\n\n if (values.length > 0) {\n min = Array(valueSize).fill(Infinity);\n max = Array(valueSize).fill(-Infinity);\n\n for (let i = 0; i < values.length; i += valueSize) {\n for (let j = 0; j < valueSize; j++) {\n const v = values[i + j];\n if (v < min[j]) min[j] = v;\n if (v > max[j]) max[j] = v;\n }\n }\n }\n\n return {\n name: track.name,\n targetName,\n property,\n type,\n keyframeCount: track.times.length,\n valueRange: min.length > 0 ? { min, max } : undefined,\n };\n}\n\n/**\n * Extract animation information\n */\nfunction extractAnimations(animations: THREE.AnimationClip[]): AnimationInfo[] {\n return animations.map(clip => {\n const tracks = clip.tracks.map(parseTrack);\n\n const animatedBones = new Set<string>();\n const animatedMorphs = new Set<string>();\n\n for (const track of tracks) {\n if (track.type === 'rotation' || track.type === 'position') {\n animatedBones.add(track.targetName);\n } else if (track.type === 'morph') {\n animatedMorphs.add(track.name);\n }\n }\n\n return {\n name: clip.name,\n duration: clip.duration,\n tracks,\n animatedBones: Array.from(animatedBones),\n animatedMorphs: Array.from(animatedMorphs),\n };\n });\n}\n\n/**\n * Collect all meshes from a scene\n */\nfunction collectMeshes(root: THREE.Object3D): THREE.Mesh[] {\n const meshes: THREE.Mesh[] = [];\n root.traverse((obj) => {\n if ((obj as THREE.Mesh).isMesh) {\n meshes.push(obj as THREE.Mesh);\n }\n });\n return meshes;\n}\n\n/**\n * Extract all data from a runtime Three.js model\n *\n * @param model - The root Object3D of the loaded model\n * @param meshes - Array of meshes with morph targets (optional, will be collected if not provided)\n * @param animations - Array of AnimationClips from the GLTF (optional)\n */\nexport function extractModelData(\n model: THREE.Object3D,\n meshes?: THREE.Mesh[],\n animations?: THREE.AnimationClip[]\n): ModelData {\n const actualMeshes = meshes || collectMeshes(model);\n const actualAnimations = animations || [];\n\n const bones = extractBones(model);\n const morphs = extractMorphs(actualMeshes);\n const meshInfos = extractMeshes(actualMeshes);\n const animationInfos = extractAnimations(actualAnimations);\n\n return {\n bones,\n morphs,\n meshes: meshInfos,\n animations: animationInfos,\n boneNames: bones.map(b => b.name),\n morphNames: morphs.map(m => m.name),\n meshNames: meshInfos.map(m => m.name),\n };\n}\n\n/**\n * Extract all data from a GLTF file\n *\n * @param gltf - The loaded GLTF object\n */\nexport function extractFromGLTF(gltf: GLTF): ModelData {\n const meshes = collectMeshes(gltf.scene);\n return extractModelData(gltf.scene, meshes, gltf.animations);\n}\n","/**\n * Loom3 - Unified Model Analysis API\n *\n * Combines model extraction, validation, and correction suggestions\n * into a single comprehensive analysis report.\n */\n\nimport * as THREE from 'three';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport type { Profile } from '../mappings/types';\nimport { extractModelData, extractFromGLTF, type ModelData, type AnimationInfo } from './extractModelData';\nimport { validateMappings, type ValidationResult } from './validateMappings';\n\n/**\n * Animation analysis results\n */\nexport interface AnimationAnalysis {\n count: number;\n hasIdleCandidate: boolean;\n clips: Array<{\n name: string;\n duration: number;\n affectedBones: string[];\n affectedMorphs: string[];\n }>;\n}\n\n/**\n * Complete model analysis report\n */\nexport interface ModelAnalysisReport {\n /** Extracted model data */\n model: ModelData;\n\n /** Validation results (if preset provided) */\n validation?: ValidationResult;\n\n /** Animation analysis */\n animations: AnimationAnalysis;\n\n /** Overall health score (0-100) */\n overallScore: number;\n\n /** Human-readable summary */\n summary: string;\n}\n\n/**\n * Options for model analysis\n */\nexport interface AnalyzeModelOptions {\n /** The model source */\n source:\n | { type: 'gltf'; gltf: GLTF }\n | { type: 'runtime'; model: THREE.Object3D; meshes: THREE.Mesh[]; animations: THREE.AnimationClip[] };\n\n /** Optional preset to validate against */\n preset?: Profile;\n\n /** Request correction suggestions */\n suggestCorrections?: boolean;\n}\n\n/**\n * Analyze animations to detect idle candidates and summarize clips\n */\nfunction analyzeAnimations(animations: AnimationInfo[]): AnimationAnalysis {\n // Detect idle animation candidates\n // Heuristic: short clips (< 5s) with subtle motion are likely idle loops\n const hasIdleCandidate = animations.some(anim =>\n anim.duration < 5 && anim.duration > 0.5 &&\n (anim.name.toLowerCase().includes('idle') ||\n anim.name.toLowerCase().includes('stand') ||\n anim.name.toLowerCase().includes('breath'))\n );\n\n return {\n count: animations.length,\n hasIdleCandidate,\n clips: animations.map(anim => ({\n name: anim.name,\n duration: anim.duration,\n affectedBones: anim.animatedBones,\n affectedMorphs: anim.animatedMorphs,\n })),\n };\n}\n\n/**\n * Calculate overall health score\n */\nfunction calculateOverallScore(\n validation: ValidationResult | undefined,\n animations: AnimationAnalysis\n): number {\n // If no validation (no preset), base score on model completeness\n if (!validation) {\n // Award points for having bones (40), morphs (40), animations (20)\n let score = 0;\n // Assume model is complete if we're analyzing it\n score += 80;\n if (animations.count > 0) score += 20;\n return Math.min(100, score);\n }\n\n // With validation: use validation score as primary (70%), animations as secondary (30%)\n let score = validation.score * 0.7;\n\n // Animation score\n let animScore = 0;\n if (animations.count > 0) animScore += 20;\n if (animations.hasIdleCandidate) animScore += 10;\n score += animScore * 0.3;\n\n return Math.round(score);\n}\n\n/**\n * Generate human-readable summary\n */\nfunction generateSummary(\n model: ModelData,\n validation: ValidationResult | undefined,\n animations: AnimationAnalysis\n): string {\n const parts: string[] = [];\n\n // Model assets\n parts.push(`Model has ${model.bones.length} bones, ${model.morphs.length} morphs, ${animations.count} animations.`);\n\n // Validation summary\n if (validation) {\n if (validation.score >= 70) {\n parts.push(`Preset is compatible (${validation.score}% match).`);\n } else if (validation.score >= 40) {\n parts.push(`Preset is partially compatible (${validation.score}% match).`);\n if (validation.missingBones.length > 0) {\n parts.push(`Missing ${validation.missingBones.length} bones.`);\n }\n if (validation.missingMorphs.length > 0) {\n parts.push(`Missing ${validation.missingMorphs.length} morphs.`);\n }\n } else {\n parts.push(`Preset is incompatible (${validation.score}% match).`);\n }\n\n if (validation.corrections && validation.corrections.length > 0) {\n parts.push(`${validation.corrections.length} corrections suggested.`);\n }\n }\n\n // Animation summary\n if (animations.count === 0) {\n parts.push('No animations found.');\n } else if (animations.hasIdleCandidate) {\n parts.push('Idle animation detected.');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Analyze a 3D model comprehensively\n *\n * Extracts model data, validates against a preset (if provided),\n * analyzes animations, and returns a comprehensive report.\n *\n * @param options - Analysis options\n * @returns Complete analysis report\n */\nexport async function analyzeModel(options: AnalyzeModelOptions): Promise<ModelAnalysisReport> {\n const { source, preset, suggestCorrections = false } = options;\n\n // Step 1: Extract model data\n const modelData =\n source.type === 'gltf'\n ? extractFromGLTF(source.gltf)\n : extractModelData(source.model, source.meshes, source.animations);\n\n // Step 2: Validate against preset (if provided)\n let validation: ValidationResult | undefined;\n if (preset) {\n // Build validation inputs from model data\n const meshes = modelData.meshes.map(meshInfo => {\n // Find actual mesh with morph targets\n const morphsForMesh = modelData.morphs.filter(m => m.meshName === meshInfo.name);\n const morphTargetDictionary = morphsForMesh.length > 0\n ? Object.fromEntries(morphsForMesh.map(m => [m.name, m.index]))\n : undefined;\n\n return {\n name: meshInfo.name,\n morphTargetDictionary,\n };\n });\n\n const skeleton = modelData.bones.length > 0\n ? { bones: modelData.bones.map(b => ({ name: b.name })) }\n : null;\n\n validation = validateMappings(meshes, skeleton, preset, { suggestCorrections });\n }\n\n // Step 3: Analyze animations\n const animationAnalysis = analyzeAnimations(modelData.animations);\n\n // Step 4: Calculate overall score and summary\n const overallScore = calculateOverallScore(validation, animationAnalysis);\n const summary = generateSummary(modelData, validation, animationAnalysis);\n\n return {\n model: modelData,\n validation,\n animations: animationAnalysis,\n overallScore,\n summary,\n };\n}\n"]}
|