@lovelace_lol/embody 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/contracts/abi.ts","../src/core/contracts/skeletonFit.ts","../src/core/TsClipCompiler.ts","../src/core/compositeAxis.ts","../src/mappings/visemeSystem.ts","../src/core/TsRuntimeCore.ts","../src/core/WasmRuntimeCore.ts"],"names":["target","resolveMorphTargetByName"],"mappings":"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","file":"core.cjs","sourcesContent":["import type { NumericArray } from './primitives';\n\nexport const EMBODY_CORE_ABI_VERSION = 1;\n\nexport const PACKED_MORPH_FRAME_DELTA_STRIDE = 4;\nexport const PACKED_MORPH_FRAME_DELTA_FIELDS = [\n 'meshId',\n 'morphTargetId',\n 'value',\n 'mode',\n] as const;\n\nexport const PACKED_BONE_FRAME_DELTA_STRIDE = 9;\nexport const PACKED_BONE_FRAME_DELTA_FIELDS = [\n 'boneId',\n 'positionX',\n 'positionY',\n 'positionZ',\n 'rotationX',\n 'rotationY',\n 'rotationZ',\n 'rotationW',\n 'flags',\n] as const;\n\n/** Packed bone FrameDelta flags: bit 0 = has position, bit 1 = has rotation. */\nexport const PACKED_BONE_FLAG_HAS_POSITION = 1;\nexport const PACKED_BONE_FLAG_HAS_ROTATION = 2;\n\nexport const HAIR_CONFIG_STRIDE = 11;\nexport const HAIR_STATE_STRIDE = 4;\nexport const HAIR_HEAD_STATE_STRIDE = 5;\nexport const HAIR_MORPH_OUTPUT_STRIDE = 6;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;\nexport const MESH_PROPORTIONS_STRIDE = 16;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;\nexport const ANNOTATION_CAMERA_FRAMING_STRIDE = 7;\nexport const CAMERA_FLIGHT_SAMPLE_STRIDE = 7;\nexport const MARKER_VISIBILITY_FACTORS_STRIDE = 3;\nexport const MARKER_ENDPOINT_STRIDE = 3;\n\nexport const HAIR_CONFIG_FIELDS = [\n 'mass',\n 'stiffness',\n 'damping',\n 'gravity',\n 'headInfluence',\n 'windEnabled',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n] as const;\n\nexport const HAIR_STATE_FIELDS = ['x', 'z', 'vx', 'vz'] as const;\nexport const HAIR_HEAD_STATE_FIELDS = ['yaw', 'pitch', 'roll', 'yawVelocity', 'pitchVelocity'] as const;\nexport const HAIR_MORPH_OUTPUT_FIELDS = [\n 'L_Hair_Left',\n 'L_Hair_Right',\n 'L_Hair_Front',\n 'R_Hair_Left',\n 'R_Hair_Right',\n 'R_Hair_Front',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n] as const;\nexport const MESH_PROPORTIONS_FIELDS = [\n 'minX',\n 'minY',\n 'minZ',\n 'maxX',\n 'maxY',\n 'maxZ',\n 'centerX',\n 'centerY',\n 'centerZ',\n 'spanX',\n 'spanY',\n 'spanZ',\n 'verticalHeight',\n 'crossAxisWideSpan',\n 'crossAxisNarrowSpan',\n 'humanoidLikelihood',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n 'confidence',\n 'meshHeight',\n 'templateHeight',\n 'meshCrossAxisWideSpan',\n 'templateCrossAxisWideSpan',\n 'status',\n] as const;\nexport const ANNOTATION_CAMERA_FRAMING_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'distance',\n] as const;\nexport const CAMERA_FLIGHT_SAMPLE_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'done',\n] as const;\nexport const MARKER_VISIBILITY_FACTORS_FIELDS = [\n 'itemOpacityFactor',\n 'labelScaleFactor',\n 'lineOpacityFactor',\n] as const;\nexport const MARKER_ENDPOINT_FIELDS = ['x', 'y', 'z'] as const;\n\nexport type PackedMorphFrameDeltaField = (typeof PACKED_MORPH_FRAME_DELTA_FIELDS)[number];\nexport type HairConfigField = (typeof HAIR_CONFIG_FIELDS)[number];\nexport type HairStateField = (typeof HAIR_STATE_FIELDS)[number];\nexport type HairHeadStateField = (typeof HAIR_HEAD_STATE_FIELDS)[number];\nexport type HairMorphOutputField = (typeof HAIR_MORPH_OUTPUT_FIELDS)[number];\nexport type TemplateSkeletonFitTransformField = (typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS)[number];\nexport type MeshProportionsField = (typeof MESH_PROPORTIONS_FIELDS)[number];\nexport type TemplateSkeletonFitSolutionField = (typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS)[number];\n\nexport interface PackedMorphFrameDelta {\n readonly abiVersion: typeof EMBODY_CORE_ABI_VERSION;\n readonly stride: typeof PACKED_MORPH_FRAME_DELTA_STRIDE;\n readonly fields: typeof PACKED_MORPH_FRAME_DELTA_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairPhysicsState {\n readonly stride: typeof HAIR_STATE_STRIDE;\n readonly fields: typeof HAIR_STATE_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairMorphOutput {\n readonly stride: typeof HAIR_MORPH_OUTPUT_STRIDE;\n readonly fields: typeof HAIR_MORPH_OUTPUT_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitTransform {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedMeshProportions {\n readonly stride: typeof MESH_PROPORTIONS_STRIDE;\n readonly fields: typeof MESH_PROPORTIONS_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitSolution {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;\n readonly values: NumericArray;\n}\n","import type { Vec3 } from './primitives';\n\nexport const TEMPLATE_SKELETON_FIT_METADATA_KIND = 'template-skeleton-fit';\nexport const TEMPLATE_SKELETON_FIT_METADATA_VERSION = 1;\n\nexport const TEMPLATE_SKELETON_FIT_STATUSES = [\n 'unfitted',\n 'estimated',\n 'manual-adjusted',\n 'invalid',\n] as const;\n\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_AXES = ['x', 'y', 'z'] as const;\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS = ['min', 'center', 'max'] as const;\n\nexport type TemplateSkeletonFitStatus = (typeof TEMPLATE_SKELETON_FIT_STATUSES)[number];\nexport type TemplateSkeletonFitVerticalAxis = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_AXES)[number];\nexport type TemplateSkeletonFitVerticalAnchor = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS)[number];\n\nexport interface TemplateSkeletonFitTransform {\n readonly scale: number;\n readonly translation: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetrics extends TemplateSkeletonFitTransform {\n readonly confidence: number;\n readonly meshHeight: number;\n readonly templateHeight: number;\n readonly crossAxisSpans: Vec3;\n readonly status: TemplateSkeletonFitStatus;\n}\n\nexport interface TemplateSkeletonFitManualAdjustment {\n readonly scale?: number;\n readonly translation?: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetadata {\n readonly kind: typeof TEMPLATE_SKELETON_FIT_METADATA_KIND;\n readonly version: typeof TEMPLATE_SKELETON_FIT_METADATA_VERSION;\n readonly templateId: string;\n readonly sourceCharacterId: string;\n readonly verticalAxis: TemplateSkeletonFitVerticalAxis;\n readonly verticalAnchor: TemplateSkeletonFitVerticalAnchor;\n readonly fit: TemplateSkeletonFitMetrics;\n readonly manualAdjustment?: TemplateSkeletonFitManualAdjustment;\n}\n\nexport interface TemplateSkeletonFitValidationResult {\n readonly valid: boolean;\n readonly errors: readonly string[];\n}\n\nexport function isTemplateSkeletonFitStatus(value: unknown): value is TemplateSkeletonFitStatus {\n return typeof value === 'string' && TEMPLATE_SKELETON_FIT_STATUSES.includes(value as TemplateSkeletonFitStatus);\n}\n\nexport function composeTemplateSkeletonFitTransform(\n fit: TemplateSkeletonFitTransform,\n manualAdjustment: TemplateSkeletonFitManualAdjustment = {},\n): TemplateSkeletonFitTransform {\n return {\n scale: positiveFiniteOr(fit.scale, 1) * positiveFiniteOr(manualAdjustment.scale ?? 1, 1),\n translation: {\n x: finiteOr(fit.translation.x, 0) + finiteOr(manualAdjustment.translation?.x ?? 0, 0),\n y: finiteOr(fit.translation.y, 0) + finiteOr(manualAdjustment.translation?.y ?? 0, 0),\n z: finiteOr(fit.translation.z, 0) + finiteOr(manualAdjustment.translation?.z ?? 0, 0),\n },\n };\n}\n\nexport function validateTemplateSkeletonFitMetadata(metadata: unknown): TemplateSkeletonFitValidationResult {\n const errors: string[] = [];\n\n if (!isRecord(metadata)) {\n return { valid: false, errors: ['metadata must be an object'] };\n }\n\n if (metadata.kind !== TEMPLATE_SKELETON_FIT_METADATA_KIND) {\n errors.push(`kind must be \"${TEMPLATE_SKELETON_FIT_METADATA_KIND}\"`);\n }\n if (metadata.version !== TEMPLATE_SKELETON_FIT_METADATA_VERSION) {\n errors.push(`version must be ${TEMPLATE_SKELETON_FIT_METADATA_VERSION}`);\n }\n if (!isNonEmptyString(metadata.templateId)) {\n errors.push('templateId must be a non-empty string');\n }\n if (!isNonEmptyString(metadata.sourceCharacterId)) {\n errors.push('sourceCharacterId must be a non-empty string');\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_AXES.includes(metadata.verticalAxis as TemplateSkeletonFitVerticalAxis)) {\n errors.push(`verticalAxis must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_AXES.join(', ')}`);\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.includes(metadata.verticalAnchor as TemplateSkeletonFitVerticalAnchor)) {\n errors.push(`verticalAnchor must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.join(', ')}`);\n }\n\n validateFitMetrics(metadata.fit, errors);\n validateManualAdjustment(metadata.manualAdjustment, errors);\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFitMetrics(value: unknown, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push('fit must be an object');\n return;\n }\n\n if (!isPositiveFiniteNumber(value.scale)) {\n errors.push('fit.scale must be a positive finite number');\n }\n validateVec3(value.translation, 'fit.translation', errors);\n if (!isFiniteNumber(value.confidence) || value.confidence < 0 || value.confidence > 1) {\n errors.push('fit.confidence must be a finite number between 0 and 1');\n }\n if (!isPositiveFiniteNumber(value.meshHeight)) {\n errors.push('fit.meshHeight must be a positive finite number');\n }\n if (!isPositiveFiniteNumber(value.templateHeight)) {\n errors.push('fit.templateHeight must be a positive finite number');\n }\n validateVec3(value.crossAxisSpans, 'fit.crossAxisSpans', errors, { min: 0 });\n if (!isTemplateSkeletonFitStatus(value.status)) {\n errors.push(`fit.status must be one of: ${TEMPLATE_SKELETON_FIT_STATUSES.join(', ')}`);\n }\n}\n\nfunction validateManualAdjustment(value: unknown, errors: string[]): void {\n if (value == null) {\n return;\n }\n if (!isRecord(value)) {\n errors.push('manualAdjustment must be an object');\n return;\n }\n if (value.scale != null && !isPositiveFiniteNumber(value.scale)) {\n errors.push('manualAdjustment.scale must be a positive finite number');\n }\n if (value.translation != null) {\n validateVec3(value.translation, 'manualAdjustment.translation', errors);\n }\n}\n\nfunction validateVec3(\n value: unknown,\n field: string,\n errors: string[],\n options: { min?: number } = {},\n): void {\n if (!isRecord(value)) {\n errors.push(`${field} must be an object with finite x, y, and z values`);\n return;\n }\n\n for (const axis of ['x', 'y', 'z'] as const) {\n const axisValue = value[axis];\n if (!isFiniteNumber(axisValue)) {\n errors.push(`${field}.${axis} must be a finite number`);\n } else if (options.min != null && axisValue < options.min) {\n errors.push(`${field}.${axis} must be a finite number >= ${options.min}`);\n }\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isPositiveFiniteNumber(value: unknown): value is number {\n return isFiniteNumber(value) && value > 0;\n}\n\nfunction finiteOr(value: number, fallback: number): number {\n return Number.isFinite(value) ? value : fallback;\n}\n\nfunction positiveFiniteOr(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n","import type {\n ChannelId,\n ClipChannelIR,\n ClipIR,\n ClipInterpolation,\n ClipTrackTarget,\n ClipTrackValueType,\n NumericArray,\n TrackId,\n} from './contracts';\nimport type { CurvePoint } from './types';\nimport type { EmbodyCoreWasmModule } from '../wasmTypes';\n\nexport interface TsClipCompilerKeyframe {\n readonly time: number;\n readonly value: number | readonly number[];\n}\n\nexport interface TsClipCompilerTrackInput {\n readonly id?: TrackId;\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType: ClipTrackValueType;\n readonly keyframes: readonly TsClipCompilerKeyframe[];\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCompilerInput {\n readonly id?: string;\n readonly name: string;\n readonly durationSeconds?: number;\n readonly channels?: readonly ClipChannelIR[];\n readonly tracks: readonly TsClipCompilerTrackInput[];\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport interface TsClipCurveTarget {\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType?: Extract<ClipTrackValueType, 'scalar'>;\n readonly scale?: number;\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCurvesInput {\n readonly id?: string;\n readonly name: string;\n readonly curves: Record<string, readonly CurvePoint[]>;\n readonly targets: Record<string, TsClipCurveTarget | readonly TsClipCurveTarget[]>;\n readonly channels?: readonly ClipChannelIR[];\n readonly durationSeconds?: number;\n readonly intensityScale?: number;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Thin host facade over the Rust clip compiler (`compile_clip` /\n * `compile_clip_curves`). Callers pass the Wasm module from `initEmbodyCore()`.\n */\nexport class TsClipCompiler {\n constructor(private readonly core: EmbodyCoreWasmModule) {}\n\n compile(input: TsClipCompilerInput): ClipIR {\n return JSON.parse(this.core.compile_clip(JSON.stringify(input))) as ClipIR;\n }\n\n compileCurves(input: TsClipCurvesInput): ClipIR {\n return JSON.parse(this.core.compile_clip_curves(JSON.stringify(input))) as ClipIR;\n }\n}\n\nexport function numericArrayToNumbers(values: NumericArray): number[] {\n return Array.from(values);\n}\n","import type { AUSelector, BoneBinding, RotationAxis } from './types';\n\nexport function toAUList(value?: AUSelector): number[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction findBoneBindingForNode(\n auToBones: Record<number, BoneBinding[]>,\n auId: number,\n nodeKey: string\n): BoneBinding | null {\n return auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n}\n\nexport function getCompositeAxisValue(\n axisConfig: RotationAxis | null | undefined,\n getValue: (auId: number) => number\n): number {\n if (!axisConfig) return 0;\n\n const negativeAUs = toAUList(axisConfig.negative);\n const positiveAUs = toAUList(axisConfig.positive);\n\n if (negativeAUs.length > 0 && positiveAUs.length > 0) {\n const negativeValue = Math.max(...negativeAUs.map(getValue), 0);\n const positiveValue = Math.max(...positiveAUs.map(getValue), 0);\n return positiveValue - negativeValue;\n }\n\n if (axisConfig.aus.length > 1) {\n return Math.max(...axisConfig.aus.map(getValue), 0);\n }\n\n return getValue(axisConfig.aus[0]);\n}\n\nexport function getCompositeAxisBinding(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined,\n direction: number,\n getValue: (auId: number) => number,\n auToBones: Record<number, BoneBinding[]>\n): BoneBinding | null {\n if (!axisConfig) return null;\n\n const directionalAUs = direction < 0 ? toAUList(axisConfig.negative) : toAUList(axisConfig.positive);\n const candidates = directionalAUs.length > 0 ? directionalAUs : axisConfig.aus;\n const ranked = [...candidates].sort((a, b) => getValue(b) - getValue(a));\n\n for (const auId of ranked) {\n const binding = findBoneBindingForNode(auToBones, auId, nodeKey);\n if (binding) return binding;\n }\n\n return null;\n}\n","import type {\n MappingEditorModel,\n MappingEditorSection,\n MorphCandidate,\n MorphCandidateMatch,\n MorphTargetRef,\n Profile,\n VisemeBinding,\n VisemeSlot,\n} from './types';\n\nfunction hasOwn<T extends object>(value: T | undefined, key: string): boolean {\n return Boolean(value && Object.prototype.hasOwnProperty.call(value, key));\n}\n\nfunction toSlotId(label: string, index: number): string {\n const normalized = label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return normalized || `viseme-${index}`;\n}\n\nfunction bindingTargets(binding: VisemeBinding | undefined): MorphTargetRef[] {\n if (!binding) return [];\n const targets = binding.targets?.map((target) => target.morph).filter((morph) => morph !== '');\n if (targets && targets.length > 0) return targets;\n return binding.morph !== undefined && binding.morph !== '' ? [binding.morph] : [];\n}\n\nexport interface ResolvedVisemeBindingTarget {\n morph: MorphTargetRef;\n weight: number;\n}\n\nfunction normalizeBindingWeight(weight: number | undefined): number {\n return Number.isFinite(weight) ? Math.max(0, weight ?? 1) : 1;\n}\n\nexport function getProfileVisemeSlots(profile: Profile): VisemeSlot[] {\n if (profile.visemeSlots && profile.visemeSlots.length > 0) {\n return [...profile.visemeSlots].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n\n return (profile.visemeKeys || []).map((key, index) => {\n const label = typeof key === 'string' && key ? key : `Viseme ${index}`;\n return {\n id: toSlotId(label, index),\n label,\n order: index,\n defaultJawAmount: profile.visemeJawAmounts?.[index],\n };\n });\n}\n\nexport function getVisemeSlotIndex(profile: Profile, slotId: string): number {\n return getProfileVisemeSlots(profile).findIndex((slot) => slot.id === slotId);\n}\n\nexport function compileVisemeKeys(profile: Profile): MorphTargetRef[] {\n const slots = getProfileVisemeSlots(profile);\n if (!profile.visemeBindings) return [...(profile.visemeKeys || [])];\n\n return slots.map((slot, index) => {\n const target = bindingTargets(profile.visemeBindings?.[slot.id])[0];\n return target ?? profile.visemeKeys?.[index] ?? '';\n });\n}\n\nexport function getVisemeBindingTargets(profile: Profile, visemeIndex: number): ResolvedVisemeBindingTarget[] {\n const slots = getProfileVisemeSlots(profile);\n const slot = slots[visemeIndex];\n const binding = slot ? profile.visemeBindings?.[slot.id] : undefined;\n\n const boundTargets = binding?.targets\n ?.filter((target) => target.morph !== undefined && target.morph !== '')\n .map((target) => ({\n morph: target.morph,\n weight: normalizeBindingWeight(target.weight),\n }));\n\n if (boundTargets && boundTargets.length > 0) {\n return boundTargets;\n }\n\n if (binding?.morph !== undefined && binding.morph !== '') {\n return [{ morph: binding.morph, weight: 1 }];\n }\n\n const legacyTarget = profile.visemeKeys?.[visemeIndex];\n return legacyTarget !== undefined && legacyTarget !== ''\n ? [{ morph: legacyTarget, weight: 1 }]\n : [];\n}\n\nexport function getVisemeJawAmounts(profile: Profile): number[] | undefined {\n const slots = getProfileVisemeSlots(profile);\n if (slots.length === 0) return profile.visemeJawAmounts ? [...profile.visemeJawAmounts] : undefined;\n return slots.map((slot, index) => slot.defaultJawAmount ?? profile.visemeJawAmounts?.[index] ?? 0);\n}\n\nexport function resolveVisemeMeshCategory(profile: Profile): string {\n const morphToMesh = profile.morphToMesh || {};\n if (profile.visemeMeshCategory) return profile.visemeMeshCategory;\n if (hasOwn(morphToMesh, 'viseme')) return 'viseme';\n return 'face';\n}\n\nexport function getMeshNamesForVisemeProfile(profile: Profile): string[] {\n const morphToMesh: Record<string, string[]> = profile.morphToMesh || {};\n const category = resolveVisemeMeshCategory(profile);\n if (hasOwn(morphToMesh, category)) {\n return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n }\n return profile.visemeMeshCategory ? [] : [...(morphToMesh.face || [])];\n}\n\nexport function getMeshNamesForAUProfile(profile: Profile, auId: number): string[] {\n const morphToMesh = profile.morphToMesh || {};\n const facePart = profile.auInfo?.[String(auId)]?.facePart;\n const category = facePart ? profile.auFacePartToMeshCategory?.[facePart] : undefined;\n if (category) return Array.isArray(morphToMesh[category]) ? [...morphToMesh[category]] : [];\n return [...(morphToMesh.face || [])];\n}\n\nfunction compileMatcher(pattern: string): RegExp | null {\n try {\n return new RegExp(pattern, 'i');\n } catch {\n return null;\n }\n}\n\nfunction classifyVisemeMorph(morphName: string, profile: Profile): MorphCandidateMatch[] {\n const slots = getProfileVisemeSlots(profile);\n const matches: MorphCandidateMatch[] = [];\n\n for (const slot of slots) {\n const explicitTargets = bindingTargets(profile.visemeBindings?.[slot.id]);\n if (explicitTargets.some((target) => String(target).toLowerCase() === morphName.toLowerCase())) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 1,\n reason: 'explicit',\n });\n continue;\n }\n\n for (const pattern of slot.matchers || []) {\n const matcher = compileMatcher(pattern);\n if (matcher?.test(morphName)) {\n matches.push({\n slotId: slot.id,\n label: slot.label,\n confidence: 0.75,\n reason: 'regex',\n pattern,\n });\n }\n }\n }\n\n return matches;\n}\n\nexport function buildMappingEditorModel(profile: Profile, morphNames: string[] = []): MappingEditorModel {\n const sections = new Map<string, MappingEditorSection>();\n const configuredSections = profile.mappingSections || [];\n const configuredById = new Map(configuredSections.map((section) => [section.id, section]));\n let nextOrder = configuredSections.length;\n\n for (const section of configuredSections) {\n sections.set(section.id, { ...section });\n }\n\n const getOrder = (id: string, fallback?: number): number => {\n const configured = configuredById.get(id);\n if (configured) return configured.order;\n if (fallback !== undefined) return fallback;\n const order = nextOrder;\n nextOrder += 1;\n return order;\n };\n\n const auSectionOrders = new Map<string, number>();\n for (const [auId, info] of Object.entries(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n auSectionOrders.set(label, Math.min(auSectionOrders.get(label) ?? Number.MAX_SAFE_INTEGER, Number(auId)));\n }\n if (configuredSections.length === 0 && auSectionOrders.size > 0) {\n nextOrder = Math.max(...auSectionOrders.values()) + 1;\n }\n\n for (const info of Object.values(profile.auInfo || {})) {\n const label = info.facePart || 'Unmapped';\n const configured = configuredById.get(label);\n const meshCategory = profile.auFacePartToMeshCategory?.[label] || 'face';\n sections.set(label, {\n ...configured,\n id: label,\n label: configured?.label || label,\n kind: 'au',\n order: getOrder(label, auSectionOrders.get(label)),\n meshCategory: configured?.meshCategory || meshCategory,\n facePart: label,\n });\n }\n\n const configuredVisemes = configuredById.get('Visemes');\n sections.set('Visemes', {\n ...configuredVisemes,\n id: 'Visemes',\n label: configuredVisemes?.label || 'Visemes',\n kind: 'viseme',\n order: getOrder('Visemes'),\n meshCategory: configuredVisemes?.meshCategory || resolveVisemeMeshCategory(profile),\n });\n\n if (hasOwn(profile.morphToMesh, 'hair')) {\n const configuredHair = configuredById.get('Hair');\n sections.set('Hair', {\n ...configuredHair,\n id: 'Hair',\n label: configuredHair?.label || 'Hair',\n kind: 'hair',\n order: getOrder('Hair'),\n meshCategory: configuredHair?.meshCategory || 'hair',\n });\n }\n\n const configuredUnmapped = configuredById.get('Unmapped');\n sections.set('Unmapped', {\n ...configuredUnmapped,\n id: 'Unmapped',\n label: configuredUnmapped?.label || 'Unmapped',\n kind: 'unmapped',\n order: getOrder('Unmapped'),\n meshCategory: configuredUnmapped?.meshCategory || 'face',\n });\n\n const candidates: MorphCandidate[] = morphNames.map((morph) => {\n const matches = classifyVisemeMorph(morph, profile);\n if (matches.length === 0) {\n return { morph, sectionId: 'Unmapped', kind: 'unmapped', matches };\n }\n const explicit = matches.filter((match) => match.reason === 'explicit');\n if (explicit.length > 0) {\n return { morph, sectionId: 'Visemes', kind: 'explicit', matches: explicit };\n }\n return {\n morph,\n sectionId: 'Visemes',\n kind: matches.length > 1 ? 'conflict' : 'candidate',\n matches,\n };\n });\n\n return {\n sections: Array.from(sections.values()).sort((a, b) => a.order - b.order || a.label.localeCompare(b.label)),\n candidates,\n };\n}\n\nexport interface ProviderVisemeEvent {\n provider: string;\n id?: string | number;\n phoneme?: string;\n}\n\nexport interface ProviderVisemeMatch {\n slotId: string;\n index: number;\n confidence: number;\n reason: 'provider' | 'phoneme' | 'rest' | 'none';\n}\n\nexport function mapProviderVisemeToSlot(profile: Profile, event: ProviderVisemeEvent): ProviderVisemeMatch | null {\n const slots = getProfileVisemeSlots(profile);\n const provider = event.provider.toLowerCase();\n\n if (event.id !== undefined) {\n const id = String(event.id);\n const index = slots.findIndex((slot) =>\n (slot.providerIds?.[provider] || []).some((candidate) => String(candidate) === id)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 1, reason: 'provider' };\n }\n }\n\n if (event.phoneme) {\n const phoneme = event.phoneme.toLowerCase();\n const index = slots.findIndex((slot) =>\n (slot.phonemes || []).some((candidate) => candidate.toLowerCase() === phoneme)\n );\n if (index >= 0) {\n return { slotId: slots[index].id, index, confidence: 0.8, reason: 'phoneme' };\n }\n }\n\n const restIndex = slots.findIndex((slot) => slot.id === 'rest' || slot.features?.lipClosed === 1);\n if (restIndex >= 0) {\n return { slotId: slots[restIndex].id, index: restIndex, confidence: 0.25, reason: 'rest' };\n }\n\n return null;\n}\n","import type {\n BoneFrameDelta,\n BoneDescriptor,\n BoneId,\n FrameDelta,\n MeshDescriptor,\n ModelDescriptor,\n MorphTargetDescriptor,\n MorphTargetId,\n Quat,\n Transform,\n Vec3,\n} from './contracts';\nimport type { BoneBinding, BoneKey, CompositeRotation, RotationAxis } from './types';\nimport { getCompositeAxisBinding, getCompositeAxisValue } from './compositeAxis';\nimport type { MorphTargetRef, Profile } from '../mappings/types';\nimport {\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getProfileVisemeSlots,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n getVisemeSlotIndex,\n} from '../mappings/visemeSystem';\n\nexport interface TsRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n}\n\ntype MorphTargetLookup = {\n readonly mesh: MeshDescriptor;\n readonly morphTarget: MorphTargetDescriptor;\n};\n\ntype RotationState = Record<string, { pitch: number; yaw: number; roll: number }>;\n\nconst identityQuat: Quat = { x: 0, y: 0, z: 0, w: 1 };\n\nfunction isRotationBoneBinding(binding: BoneBinding | undefined): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } {\n return binding?.channel === 'rx' || binding?.channel === 'ry' || binding?.channel === 'rz';\n}\n\nexport class TsRuntimeCore {\n private profile: Profile;\n private model: ModelDescriptor;\n private auValues: Record<number, number> = {};\n private auBalances: Record<number, number> = {};\n private visemeValues: number[];\n private visemeJawScales: number[];\n private mixWeights: Record<number, number>;\n\n constructor(options: TsRuntimeCoreOptions) {\n this.profile = options.profile;\n this.model = options.model;\n this.visemeValues = new Array(getProfileVisemeSlots(this.profile).length).fill(0);\n this.visemeJawScales = new Array(this.visemeValues.length).fill(1);\n this.mixWeights = { ...this.profile.auMixDefaults };\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.visemeValues = new Array(getProfileVisemeSlots(this.profile).length).fill(0);\n this.visemeJawScales = new Array(this.visemeValues.length).fill(1);\n this.mixWeights = { ...this.profile.auMixDefaults };\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n }\n\n setAU(id: number, value: number, balance?: number): void {\n if (value < 0 && this.profile.continuumPairs) {\n const pairInfo = this.profile.continuumPairs[id];\n if (pairInfo) {\n const negAU = pairInfo.isNegative ? id : pairInfo.pairId;\n const posAU = pairInfo.isNegative ? pairInfo.pairId : id;\n this.setContinuum(negAU, posAU, pairInfo.isNegative ? -value : value, balance);\n return;\n }\n }\n\n this.auValues[id] = clamp01(value);\n if (balance !== undefined) {\n this.auBalances[id] = clampBalance(balance);\n }\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n setContinuum(negAU: number, posAU: number, continuumValue: number, balance?: number): void {\n const value = Math.max(-1, Math.min(1, continuumValue));\n if (value < 0) {\n this.setAU(posAU, 0, balance);\n this.setAU(negAU, Math.abs(value), balance);\n return;\n }\n if (value > 0) {\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, value, balance);\n return;\n }\n this.setAU(negAU, 0, balance);\n this.setAU(posAU, 0, balance);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale = 1): void {\n if (visemeIndex < 0 || visemeIndex >= this.visemeValues.length) return;\n this.visemeValues[visemeIndex] = clamp01(value);\n this.visemeJawScales[visemeIndex] = jawScale;\n }\n\n setVisemeById(slotId: string, value: number, jawScale = 1): void {\n const index = getVisemeSlotIndex(this.profile, slotId);\n if (index < 0) return;\n this.setViseme(index, value, jawScale);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n const morphWrites = new Map<string, NonNullable<FrameDelta['morphTargets']>[number]>();\n this.collectAUWrites(morphWrites);\n this.collectVisemeWrites(morphWrites);\n\n return {\n deltaSeconds,\n morphTargets: Array.from(morphWrites.values()),\n bones: this.collectBoneWrites(),\n };\n }\n\n private collectAUWrites(morphWrites: Map<string, NonNullable<FrameDelta['morphTargets']>[number]>): void {\n for (const [auIdText, entry] of Object.entries(this.profile.auToMorphs || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId) || !entry) continue;\n\n const mixWeight = this.isMixedAU(auId) ? this.getAUMixWeight(auId) : 1;\n const base = clamp01(this.auValues[auId] ?? 0) * mixWeight;\n const { left, right } = computeSideValues(base, this.auBalances[auId]);\n const meshNames = getMeshNamesForAUProfile(this.profile, auId);\n\n for (const morph of entry.left || []) {\n this.addMorphWrites(morphWrites, morph, meshNames, left);\n }\n for (const morph of entry.right || []) {\n this.addMorphWrites(morphWrites, morph, meshNames, right);\n }\n for (const morph of entry.center || []) {\n this.addMorphWrites(morphWrites, morph, meshNames, base);\n }\n }\n }\n\n private collectVisemeWrites(morphWrites: Map<string, NonNullable<FrameDelta['morphTargets']>[number]>): void {\n const meshNames = getMeshNamesForVisemeProfile(this.profile);\n const localMax = new Map<string, NonNullable<FrameDelta['morphTargets']>[number]>();\n\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n for (const bindingTarget of getVisemeBindingTargets(this.profile, index)) {\n const weighted = clamp01(value * bindingTarget.weight);\n for (const resolved of this.resolveMorphTargets(bindingTarget.morph, meshNames)) {\n const key = morphWriteKey(resolved.mesh.id, resolved.morphTarget.id);\n const existing = localMax.get(key);\n if (!existing || weighted > existing.value) {\n localMax.set(key, {\n meshId: resolved.mesh.id,\n morphTargetId: resolved.morphTarget.id,\n value: weighted,\n mode: 'absolute',\n });\n }\n }\n }\n }\n\n for (const [key, write] of localMax) {\n const existing = morphWrites.get(key);\n if (!existing || write.value > existing.value) {\n morphWrites.set(key, write);\n }\n }\n }\n\n private collectBoneWrites(): BoneFrameDelta[] {\n const writes: BoneFrameDelta[] = [];\n const rotations = this.computeRotationState();\n\n for (const composite of this.profile.compositeRotations || []) {\n const bone = this.findBoneDescriptor(composite.node);\n if (!bone) continue;\n const transform = this.evaluateCompositeTransform(bone, composite, rotations[composite.node]);\n if (transform) {\n writes.push({\n boneId: bone.id,\n transform,\n mode: 'absolute',\n space: 'local',\n });\n }\n }\n\n for (const [nodeKey, translation] of Object.entries(this.computeTranslations())) {\n const bone = this.findBoneDescriptor(nodeKey);\n if (!bone) continue;\n const position = addVec3(bone.restTransform?.position, translation);\n upsertBoneWrite(writes, bone.id, { position });\n }\n\n const jawAmount = this.getActiveVisemeJawAmount();\n const jawBinding = this.findAutoVisemeJawBinding();\n const jawBone = jawBinding ? this.findBoneDescriptor(jawBinding.node) : undefined;\n if (jawBone && jawBinding?.maxDegrees && jawBinding.channel) {\n const current = writes.find((write) => write.boneId === jawBone.id);\n if (jawAmount > 1e-6 || !current?.transform.rotation) {\n const rest = jawBone.restTransform?.rotation ?? identityQuat;\n const rotation = jawAmount > 1e-6\n ? multiplyQuat(\n rest,\n quatFromChannel(jawBinding.channel, deg2rad(jawBinding.maxDegrees) * jawAmount * jawBinding.scale)\n )\n : rest;\n upsertBoneWrite(writes, jawBone.id, { rotation });\n }\n }\n\n return writes;\n }\n\n private computeRotationState(): RotationState {\n const rotations: RotationState = {};\n for (const composite of this.profile.compositeRotations || []) {\n rotations[composite.node] = {\n pitch: this.getCompositeAxisValueForNode(composite.node, composite.pitch),\n yaw: this.getCompositeAxisValueForNode(composite.node, composite.yaw),\n roll: this.getCompositeAxisValueForNode(composite.node, composite.roll),\n };\n }\n return rotations;\n }\n\n private evaluateCompositeTransform(\n bone: BoneDescriptor,\n composite: CompositeRotation,\n state: { pitch: number; yaw: number; roll: number } | undefined\n ): Transform | null {\n if (!state) return null;\n let rotation = bone.restTransform?.rotation ?? identityQuat;\n\n const applyAxis = (axisConfig: RotationAxis | null, direction: number) => {\n if (!axisConfig || Math.abs(direction) <= 1e-6) return;\n const binding = getCompositeAxisBinding(\n composite.node as BoneKey,\n axisConfig,\n direction,\n (auId) => this.getEffectiveBoneAUValue(auId, composite.node),\n this.profile.auToBones\n );\n if (!binding?.maxDegrees || !binding.channel) return;\n rotation = multiplyQuat(\n rotation,\n quatFromChannel(binding.channel, deg2rad(binding.maxDegrees) * Math.abs(direction) * binding.scale)\n );\n };\n\n applyAxis(composite.yaw, state.yaw);\n applyAxis(composite.pitch, state.pitch);\n applyAxis(composite.roll, state.roll);\n return { rotation };\n }\n\n private computeTranslations(): Record<string, Vec3> {\n const translations: Record<string, Vec3> = {};\n for (const [auIdText, bindings] of Object.entries(this.profile.auToBones || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n const value = clamp01(this.auValues[auId] ?? 0);\n for (const binding of bindings || []) {\n if (binding.channel !== 'tx' && binding.channel !== 'ty' && binding.channel !== 'tz') continue;\n if (binding.maxUnits === undefined) continue;\n const current = translations[binding.node] ?? { x: 0, y: 0, z: 0 };\n translations[binding.node] = current;\n if (value <= 1e-6) continue;\n const offset = clampSigned(value * binding.scale) * binding.maxUnits;\n translations[binding.node] = {\n x: binding.channel === 'tx' ? offset : current.x,\n y: binding.channel === 'ty' ? offset : current.y,\n z: binding.channel === 'tz' ? offset : current.z,\n };\n }\n }\n return translations;\n }\n\n private addMorphWrites(\n morphWrites: Map<string, NonNullable<FrameDelta['morphTargets']>[number]>,\n morph: MorphTargetRef,\n meshNames: string[],\n value: number\n ): void {\n for (const resolved of this.resolveMorphTargets(morph, meshNames)) {\n const key = morphWriteKey(resolved.mesh.id, resolved.morphTarget.id);\n const existing = morphWrites.get(key);\n // Max-combine: several AUs can bind the same morph target; an inactive\n // AU must not clobber an active one in full-state evaluation.\n if (existing && existing.value >= value) continue;\n morphWrites.set(key, {\n meshId: resolved.mesh.id,\n morphTargetId: resolved.morphTarget.id,\n value,\n mode: 'absolute',\n });\n }\n }\n\n private resolveMorphTargets(morph: MorphTargetRef, meshNames: string[]): MorphTargetLookup[] {\n const result: MorphTargetLookup[] = [];\n for (const meshName of meshNames) {\n const mesh = this.model.meshes.find((candidate) => candidate.name === meshName);\n if (!mesh) continue;\n const morphTargets = mesh.morphTargetIds\n .map((id) => this.model.morphTargets.find((candidate) => candidate.id === id))\n .filter((target): target is MorphTargetDescriptor => !!target);\n\n const target = typeof morph === 'number'\n ? morphTargets.find((candidate) => candidate.hostIndex === morph)\n : resolveMorphTargetByName(morphTargets, morph, this.profile);\n if (target) {\n result.push({ mesh, morphTarget: target });\n }\n }\n return result;\n }\n\n private findBoneDescriptor(nodeKey: string): BoneDescriptor | undefined {\n const configuredName = this.profile.boneNodes[nodeKey] || nodeKey;\n const prefix = this.profile.bonePrefix ?? '';\n const suffix = this.profile.boneSuffix ?? '';\n const prefixedName = prefix && !configuredName.startsWith(prefix)\n ? `${prefix}${configuredName}`\n : configuredName;\n const fullName = suffix && !prefixedName.endsWith(suffix)\n ? `${prefixedName}${suffix}`\n : prefixedName;\n const candidates = new Set([nodeKey, configuredName, fullName]);\n return this.model.bones.find((bone) => candidates.has(bone.name));\n }\n\n private findAutoVisemeJawBinding(): (BoneBinding & { channel: 'rx' | 'ry' | 'rz' }) | null {\n const candidates = [\n this.profile.auToBones[103]?.find(isRotationBoneBinding),\n this.profile.auToBones[26]?.find(isRotationBoneBinding),\n ].filter((binding): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } => !!binding);\n return candidates.find((binding) => !!this.findBoneDescriptor(binding.node))\n ?? candidates[0]\n ?? null;\n }\n\n private getActiveVisemeJawAmount(): number {\n const jawAmounts = getVisemeJawAmounts(this.profile) ?? [];\n let jawAmount = 0;\n for (let index = 0; index < this.visemeValues.length; index += 1) {\n const value = clamp01(this.visemeValues[index] ?? 0);\n if (value <= 1e-6) continue;\n const jawScale = this.visemeJawScales[index] ?? 1;\n if (Math.abs(jawScale) <= 1e-6) continue;\n jawAmount = Math.max(jawAmount, (jawAmounts[index] ?? 0) * value * jawScale);\n }\n return jawAmount;\n }\n\n private getCompositeAxisValueForNode(\n nodeKey: string,\n axisConfig: RotationAxis | null | undefined\n ): number {\n return getCompositeAxisValue(axisConfig, (auId) => this.getEffectiveBoneAUValue(auId, nodeKey));\n }\n\n private getEffectiveBoneAUValue(auId: number, nodeKey: string): number {\n const rawValue = clamp01(this.auValues[auId] ?? 0);\n if (rawValue <= 1e-6) return 0;\n const binding = this.profile.auToBones[auId]?.find((candidate) => candidate.node === nodeKey) ?? null;\n if (!binding?.side) return rawValue;\n return rawValue * getSideScale(this.auBalances[auId] ?? 0, binding.side);\n }\n\n private getAUMixWeight(auId: number): number {\n return this.mixWeights[auId] ?? this.profile.auMixDefaults?.[auId] ?? 1;\n }\n\n private isMixedAU(auId: number): boolean {\n const morphs = this.profile.auToMorphs[auId];\n const hasMorphs = !!(morphs?.left?.length || morphs?.right?.length || morphs?.center?.length);\n return !!(hasMorphs && this.profile.auToBones[auId]?.length);\n }\n}\n\nfunction resolveMorphTargetByName(\n targets: readonly MorphTargetDescriptor[],\n key: string,\n profile: Profile\n): MorphTargetDescriptor | undefined {\n const prefix = profile.morphPrefix || '';\n const suffix = profile.morphSuffix || '';\n const fullName = prefix + key + suffix;\n const exact = targets.find((target) => target.name === fullName);\n if (exact) return exact;\n\n const suffixRegex = profile.suffixPattern ? new RegExp(profile.suffixPattern) : null;\n if (!suffixRegex) return undefined;\n\n return targets.find((target) => {\n if (!target.name.startsWith(fullName)) return false;\n const candidateSuffix = target.name.slice(fullName.length);\n return candidateSuffix === '' || suffixRegex.test(candidateSuffix);\n });\n}\n\nfunction computeSideValues(base: number, balance?: number): { left: number; right: number } {\n const b = clampBalance(balance ?? 0);\n if (b === 0) return { left: base, right: base };\n if (b < 0) return { left: base, right: base * (1 + b) };\n return { left: base * (1 - b), right: base };\n}\n\nfunction getSideScale(balance: number, side?: BoneBinding['side']): number {\n if (side !== 'left' && side !== 'right') return 1;\n const b = clampBalance(balance);\n if (side === 'left') return b > 0 ? 1 - b : 1;\n return b < 0 ? 1 + b : 1;\n}\n\nfunction addVec3(base: Vec3 | undefined, offset: Vec3): Vec3 {\n return {\n x: (base?.x ?? 0) + offset.x,\n y: (base?.y ?? 0) + offset.y,\n z: (base?.z ?? 0) + offset.z,\n };\n}\n\nfunction upsertBoneWrite(\n writes: BoneFrameDelta[],\n boneId: BoneId,\n transform: Transform\n): void {\n const existingIndex = writes.findIndex((write) => write.boneId === boneId);\n if (existingIndex >= 0) {\n const existing = writes[existingIndex];\n writes[existingIndex] = {\n ...existing,\n transform: {\n ...existing.transform,\n ...transform,\n },\n };\n return;\n }\n\n writes.push({\n boneId,\n transform,\n mode: 'absolute',\n space: 'local',\n });\n}\n\nfunction quatFromChannel(channel: BoneBinding['channel'], radians: number): Quat {\n if (channel === 'rx') return quatFromAxis({ x: 1, y: 0, z: 0 }, radians);\n if (channel === 'ry') return quatFromAxis({ x: 0, y: 1, z: 0 }, radians);\n return quatFromAxis({ x: 0, y: 0, z: 1 }, radians);\n}\n\nfunction quatFromAxis(axis: Vec3, radians: number): Quat {\n const half = radians / 2;\n const s = Math.sin(half);\n return normalizeQuat({\n x: axis.x * s,\n y: axis.y * s,\n z: axis.z * s,\n w: Math.cos(half),\n });\n}\n\nfunction multiplyQuat(a: Quat, b: Quat): Quat {\n return normalizeQuat({\n x: a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,\n y: a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,\n z: a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,\n w: a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,\n });\n}\n\nfunction normalizeQuat(q: Quat): Quat {\n const len = Math.hypot(q.x, q.y, q.z, q.w);\n if (len <= 1e-12) return identityQuat;\n return {\n x: q.x / len,\n y: q.y / len,\n z: q.z / len,\n w: q.w / len,\n };\n}\n\nfunction deg2rad(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return value < 0 ? 0 : value > 1 ? 1 : value;\n}\n\nfunction clampSigned(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return value < -1 ? -1 : value > 1 ? 1 : value;\n}\n\nfunction clampBalance(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(-1, Math.min(1, value));\n}\n\nfunction morphWriteKey(meshId: MeshDescriptor['id'], morphTargetId: MorphTargetId): string {\n return `${meshId}:${morphTargetId}`;\n}\n","import type {\n BoneDescriptor,\n BoneFrameDelta,\n BoneId,\n FrameDelta,\n MeshId,\n ModelDescriptor,\n MorphTargetDescriptor,\n MorphTargetFrameDelta,\n MorphTargetId,\n} from './contracts';\nimport {\n PACKED_BONE_FLAG_HAS_POSITION,\n PACKED_BONE_FLAG_HAS_ROTATION,\n PACKED_BONE_FRAME_DELTA_STRIDE,\n PACKED_MORPH_FRAME_DELTA_STRIDE,\n} from './contracts';\nimport type { BoneBinding, RotationAxis } from './types';\nimport { toAUList } from './compositeAxis';\nimport type { MorphTargetRef, Profile } from '../mappings/types';\nimport {\n getMeshNamesForAUProfile,\n getMeshNamesForVisemeProfile,\n getProfileVisemeSlots,\n getVisemeBindingTargets,\n getVisemeJawAmounts,\n} from '../mappings/visemeSystem';\nimport type { EmbodyCoreWasmModule, WasmRuntimeCoreHandle } from '../wasmTypes';\n\nexport const AU_MORPH_BINDING_STRIDE = 5;\nexport const VISEME_MORPH_BINDING_STRIDE = 4;\n\nexport type MorphBindingSide = 0 | 1 | 2;\n\nconst AXIS_GROUP_NEGATIVE = 0;\nconst AXIS_GROUP_POSITIVE = 1;\nconst AXIS_GROUP_PLAIN = 2;\n\nconst BONE_SIDE_NONE = 0;\nconst BONE_SIDE_LEFT = 1;\nconst BONE_SIDE_RIGHT = 2;\n\nconst ROTATION_CHANNELS = { rx: 0, ry: 1, rz: 2 } as const;\nconst TRANSLATION_CHANNELS = { tx: 0, ty: 1, tz: 2 } as const;\n\nexport interface WasmRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n readonly wasm: EmbodyCoreWasmModule;\n}\n\n/**\n * TypeScript facade over the Rust Wasm RuntimeCore for live morph FrameDelta\n * evaluation. Bones/composites remain on TsRuntimeCore until a later slice.\n */\nexport class WasmRuntimeCore {\n private readonly wasm: EmbodyCoreWasmModule;\n private readonly core: WasmRuntimeCoreHandle;\n private profile: Profile;\n private model: ModelDescriptor;\n\n constructor(options: WasmRuntimeCoreOptions) {\n this.wasm = options.wasm;\n this.profile = options.profile;\n this.model = options.model;\n const RuntimeCtor = options.wasm.RuntimeCore;\n if (!RuntimeCtor) {\n throw new Error('Embody Wasm module does not export RuntimeCore');\n }\n this.core = new RuntimeCtor(0);\n this.reloadBindings();\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.reloadBindings();\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n this.reloadBindings();\n }\n\n setAU(id: number, value: number, balance = 0): void {\n this.core.set_au(id >>> 0, value, balance);\n }\n\n getAU(id: number): number {\n return this.core.get_au(id >>> 0);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.core.set_au_mix_weight(id >>> 0, weight);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale?: number): void {\n this.core.set_viseme(visemeIndex >>> 0, value);\n if (jawScale !== undefined) {\n this.core.set_viseme_jaw_scale(visemeIndex >>> 0, jawScale);\n }\n }\n\n clear(): void {\n this.core.clear();\n }\n\n evaluatePackedMorphFrameDelta(): Float32Array {\n return this.core.evaluate_morph_frame_delta();\n }\n\n evaluatePackedBoneFrameDelta(): Float32Array {\n return this.core.evaluate_bone_frame_delta();\n }\n\n evaluateMorphFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n };\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n bones: unpackBoneFrameDelta(this.evaluatePackedBoneFrameDelta()),\n };\n }\n\n private reloadBindings(): void {\n this.core.configure_with_profile(JSON.stringify(this.profile), JSON.stringify(this.model));\n }\n}\n\nexport function compileMorphBindings(\n profile: Profile,\n model: ModelDescriptor\n): {\n auBindings: Float32Array;\n visemeBindings: Float32Array;\n mixedAus: Uint32Array;\n} {\n const auRows: number[] = [];\n const mixed: number[] = [];\n\n for (const [auIdText, entry] of Object.entries(profile.auToMorphs || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId) || !entry) continue;\n\n const meshNames = getMeshNamesForAUProfile(profile, auId);\n const hasMorphs = !!(entry.left?.length || entry.right?.length || entry.center?.length);\n if (hasMorphs && profile.auToBones?.[auId]?.length) {\n mixed.push(auId);\n }\n\n pushAuSide(auRows, auId, 0, entry.left || [], meshNames, model, profile);\n pushAuSide(auRows, auId, 1, entry.right || [], meshNames, model, profile);\n pushAuSide(auRows, auId, 2, entry.center || [], meshNames, model, profile);\n }\n\n const visemeRows: number[] = [];\n const visemeMeshNames = getMeshNamesForVisemeProfile(profile);\n const slotCount = getProfileVisemeSlots(profile).length;\n for (let index = 0; index < slotCount; index += 1) {\n for (const bindingTarget of getVisemeBindingTargets(profile, index)) {\n for (const resolved of resolveMorphTargets(model, profile, bindingTarget.morph, visemeMeshNames)) {\n visemeRows.push(\n index,\n Number(resolved.mesh.id),\n Number(resolved.morphTarget.id),\n bindingTarget.weight\n );\n }\n }\n }\n\n return {\n auBindings: Float32Array.from(auRows),\n visemeBindings: Float32Array.from(visemeRows),\n mixedAus: Uint32Array.from(mixed),\n };\n}\n\nexport interface CompiledBoneBindings {\n restTransforms: Float32Array;\n compositeAxes: Float32Array;\n translations: Float32Array;\n jawBinding: Float32Array;\n visemeJawAmounts: Float32Array;\n}\n\n/**\n * Compile profile bone mappings into the packed tables the Rust RuntimeCore\n * consumes: rest transforms, composite rotation axes (in yaw/pitch/roll\n * application order), AU translations, and the auto viseme jaw binding.\n * Mirrors the mapping resolution in TsRuntimeCore.collectBoneWrites.\n */\nexport function compileBoneBindings(profile: Profile, model: ModelDescriptor): CompiledBoneBindings {\n const referencedBones = new Map<BoneId, BoneDescriptor>();\n const findBone = (nodeKey: string): BoneDescriptor | undefined => {\n const bone = findBoneDescriptor(profile, model, nodeKey);\n if (bone) referencedBones.set(bone.id, bone);\n return bone;\n };\n\n const boneSideForAU = (auId: number, nodeKey: string): number => {\n const side = profile.auToBones?.[auId]?.find((candidate) => candidate.node === nodeKey)?.side;\n if (side === 'left') return BONE_SIDE_LEFT;\n if (side === 'right') return BONE_SIDE_RIGHT;\n return BONE_SIDE_NONE;\n };\n\n const compositeRows: number[] = [];\n for (const composite of profile.compositeRotations || []) {\n const bone = findBone(composite.node);\n if (!bone) continue;\n\n // Application order must match TsRuntimeCore: yaw, pitch, roll.\n const axes: Array<{ axis: number; config: RotationAxis | null }> = [\n { axis: 1, config: composite.yaw },\n { axis: 0, config: composite.pitch },\n { axis: 2, config: composite.roll },\n ];\n\n for (const { axis, config } of axes) {\n if (!config) continue;\n\n const negativeAUs = toAUList(config.negative);\n const positiveAUs = toAUList(config.positive);\n const hasDirectional = negativeAUs.length > 0 && positiveAUs.length > 0;\n\n const valueRows: number[][] = [];\n if (hasDirectional) {\n for (const auId of negativeAUs) {\n valueRows.push([auId, AXIS_GROUP_NEGATIVE, boneSideForAU(auId, composite.node)]);\n }\n for (const auId of positiveAUs) {\n valueRows.push([auId, AXIS_GROUP_POSITIVE, boneSideForAU(auId, composite.node)]);\n }\n } else {\n for (const auId of config.aus) {\n valueRows.push([auId, AXIS_GROUP_PLAIN, boneSideForAU(auId, composite.node)]);\n }\n }\n\n const bindingRows: number[][] = [];\n const pushBindingRows = (auIds: number[], group: number) => {\n for (const auId of auIds) {\n const binding = profile.auToBones?.[auId]?.find(\n (candidate) => candidate.node === composite.node\n );\n if (!binding?.maxDegrees) continue;\n const channel = ROTATION_CHANNELS[binding.channel as keyof typeof ROTATION_CHANNELS];\n if (channel === undefined) continue;\n bindingRows.push([\n auId,\n group,\n boneSideForAU(auId, composite.node),\n channel,\n binding.scale,\n binding.maxDegrees,\n ]);\n }\n };\n pushBindingRows(negativeAUs, AXIS_GROUP_NEGATIVE);\n pushBindingRows(positiveAUs, AXIS_GROUP_POSITIVE);\n pushBindingRows(config.aus, AXIS_GROUP_PLAIN);\n\n compositeRows.push(\n Number(bone.id),\n axis,\n hasDirectional ? 1 : 0,\n valueRows.length,\n bindingRows.length,\n 0,\n 0,\n 0\n );\n for (const row of valueRows) compositeRows.push(...row);\n for (const row of bindingRows) compositeRows.push(...row);\n }\n }\n\n const translationRows: number[] = [];\n for (const [auIdText, bindings] of Object.entries(profile.auToBones || {})) {\n const auId = Number(auIdText);\n if (Number.isNaN(auId)) continue;\n for (const binding of bindings || []) {\n const channel = TRANSLATION_CHANNELS[binding.channel as keyof typeof TRANSLATION_CHANNELS];\n if (channel === undefined || binding.maxUnits === undefined) continue;\n const bone = findBone(binding.node);\n if (!bone) continue;\n translationRows.push(auId, Number(bone.id), channel, binding.scale, binding.maxUnits);\n }\n }\n\n const jawRow: number[] = [];\n const jawBinding = findAutoVisemeJawBinding(profile, model);\n if (jawBinding?.maxDegrees) {\n const bone = findBone(jawBinding.node);\n const channel = ROTATION_CHANNELS[jawBinding.channel as keyof typeof ROTATION_CHANNELS];\n if (bone && channel !== undefined) {\n jawRow.push(Number(bone.id), channel, jawBinding.scale, jawBinding.maxDegrees);\n }\n }\n\n const restRows: number[] = [];\n for (const bone of referencedBones.values()) {\n const position = bone.restTransform?.position;\n const rotation = bone.restTransform?.rotation;\n restRows.push(\n Number(bone.id),\n position?.x ?? 0,\n position?.y ?? 0,\n position?.z ?? 0,\n rotation?.x ?? 0,\n rotation?.y ?? 0,\n rotation?.z ?? 0,\n rotation?.w ?? 1\n );\n }\n\n return {\n restTransforms: Float32Array.from(restRows),\n compositeAxes: Float32Array.from(compositeRows),\n translations: Float32Array.from(translationRows),\n jawBinding: Float32Array.from(jawRow),\n visemeJawAmounts: Float32Array.from(getVisemeJawAmounts(profile) ?? []),\n };\n}\n\nfunction findBoneDescriptor(\n profile: Profile,\n model: ModelDescriptor,\n nodeKey: string\n): BoneDescriptor | undefined {\n const configuredName = profile.boneNodes?.[nodeKey] || nodeKey;\n const prefix = profile.bonePrefix ?? '';\n const suffix = profile.boneSuffix ?? '';\n const prefixedName = prefix && !configuredName.startsWith(prefix)\n ? `${prefix}${configuredName}`\n : configuredName;\n const fullName = suffix && !prefixedName.endsWith(suffix)\n ? `${prefixedName}${suffix}`\n : prefixedName;\n const candidates = new Set([nodeKey, configuredName, fullName]);\n return model.bones.find((bone) => candidates.has(bone.name));\n}\n\nfunction findAutoVisemeJawBinding(\n profile: Profile,\n model: ModelDescriptor\n): (BoneBinding & { channel: 'rx' | 'ry' | 'rz' }) | null {\n const isRotation = (\n binding: BoneBinding | undefined\n ): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } =>\n binding?.channel === 'rx' || binding?.channel === 'ry' || binding?.channel === 'rz';\n\n const candidates = [\n profile.auToBones?.[103]?.find(isRotation),\n profile.auToBones?.[26]?.find(isRotation),\n ].filter((binding): binding is BoneBinding & { channel: 'rx' | 'ry' | 'rz' } => !!binding);\n\n return candidates.find((binding) => !!findBoneDescriptor(profile, model, binding.node))\n ?? candidates[0]\n ?? null;\n}\n\nexport function unpackBoneFrameDelta(values: ArrayLike<number>): BoneFrameDelta[] {\n const stride = PACKED_BONE_FRAME_DELTA_STRIDE;\n const writes: BoneFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n const flags = values[index + 8] ?? 0;\n const hasPosition = (flags & PACKED_BONE_FLAG_HAS_POSITION) !== 0;\n const hasRotation = (flags & PACKED_BONE_FLAG_HAS_ROTATION) !== 0;\n if (!hasPosition && !hasRotation) continue;\n writes.push({\n boneId: values[index] as BoneId,\n transform: {\n ...(hasPosition\n ? { position: { x: values[index + 1], y: values[index + 2], z: values[index + 3] } }\n : {}),\n ...(hasRotation\n ? {\n rotation: {\n x: values[index + 4],\n y: values[index + 5],\n z: values[index + 6],\n w: values[index + 7],\n },\n }\n : {}),\n },\n mode: 'absolute',\n space: 'local',\n });\n }\n return writes;\n}\n\nexport function unpackMorphFrameDelta(values: ArrayLike<number>): MorphTargetFrameDelta[] {\n const stride = PACKED_MORPH_FRAME_DELTA_STRIDE;\n const writes: MorphTargetFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n writes.push({\n meshId: values[index] as MeshId,\n morphTargetId: values[index + 1] as MorphTargetId,\n value: values[index + 2] ?? 0,\n mode: (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute',\n });\n }\n return writes;\n}\n\nfunction pushAuSide(\n rows: number[],\n auId: number,\n side: MorphBindingSide,\n morphs: readonly MorphTargetRef[],\n meshNames: string[],\n model: ModelDescriptor,\n profile: Profile\n): void {\n for (const morph of morphs) {\n for (const resolved of resolveMorphTargets(model, profile, morph, meshNames)) {\n rows.push(\n auId,\n side,\n Number(resolved.mesh.id),\n Number(resolved.morphTarget.id),\n 1\n );\n }\n }\n}\n\nfunction resolveMorphTargets(\n model: ModelDescriptor,\n profile: Profile,\n morph: MorphTargetRef,\n meshNames: string[]\n): Array<{ mesh: ModelDescriptor['meshes'][number]; morphTarget: MorphTargetDescriptor }> {\n const result: Array<{ mesh: ModelDescriptor['meshes'][number]; morphTarget: MorphTargetDescriptor }> = [];\n for (const meshName of meshNames) {\n const mesh = model.meshes.find((candidate) => candidate.name === meshName);\n if (!mesh) continue;\n const morphTargets = mesh.morphTargetIds\n .map((id) => model.morphTargets.find((candidate) => candidate.id === id))\n .filter((target): target is MorphTargetDescriptor => !!target);\n\n const target = typeof morph === 'number'\n ? morphTargets.find((candidate) => candidate.hostIndex === morph)\n : resolveMorphTargetByName(morphTargets, morph, profile);\n if (target) {\n result.push({ mesh, morphTarget: target });\n }\n }\n return result;\n}\n\nfunction resolveMorphTargetByName(\n targets: readonly MorphTargetDescriptor[],\n key: string,\n profile: Profile\n): MorphTargetDescriptor | undefined {\n const prefix = profile.morphPrefix || '';\n const suffix = profile.morphSuffix || '';\n const fullName = prefix + key + suffix;\n const exact = targets.find((target) => target.name === fullName);\n if (exact) return exact;\n\n const suffixRegex = profile.suffixPattern ? new RegExp(profile.suffixPattern) : null;\n if (!suffixRegex) return undefined;\n\n return targets.find((target) => {\n if (!target.name.startsWith(fullName)) return false;\n const candidateSuffix = target.name.slice(fullName.length);\n return candidateSuffix === '' || suffixRegex.test(candidateSuffix);\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/core/contracts/abi.ts","../src/core/contracts/skeletonFit.ts","../src/core/TsClipCompiler.ts","../src/core/WasmRuntimeCore.ts"],"names":[],"mappings":"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","file":"core.cjs","sourcesContent":["import type { NumericArray } from './primitives';\n\nexport const EMBODY_CORE_ABI_VERSION = 1;\n\nexport const PACKED_MORPH_FRAME_DELTA_STRIDE = 4;\nexport const PACKED_MORPH_FRAME_DELTA_FIELDS = [\n 'meshId',\n 'morphTargetId',\n 'value',\n 'mode',\n] as const;\n\nexport const PACKED_BONE_FRAME_DELTA_STRIDE = 9;\nexport const PACKED_BONE_FRAME_DELTA_FIELDS = [\n 'boneId',\n 'positionX',\n 'positionY',\n 'positionZ',\n 'rotationX',\n 'rotationY',\n 'rotationZ',\n 'rotationW',\n 'flags',\n] as const;\n\n/** Packed bone FrameDelta flags: bit 0 = has position, bit 1 = has rotation. */\nexport const PACKED_BONE_FLAG_HAS_POSITION = 1;\nexport const PACKED_BONE_FLAG_HAS_ROTATION = 2;\n\nexport const HAIR_CONFIG_STRIDE = 11;\nexport const HAIR_STATE_STRIDE = 4;\nexport const HAIR_HEAD_STATE_STRIDE = 5;\nexport const HAIR_MORPH_OUTPUT_STRIDE = 6;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;\nexport const MESH_PROPORTIONS_STRIDE = 16;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;\nexport const ANNOTATION_CAMERA_FRAMING_STRIDE = 7;\nexport const CAMERA_FLIGHT_SAMPLE_STRIDE = 7;\nexport const MARKER_VISIBILITY_FACTORS_STRIDE = 3;\nexport const MARKER_ENDPOINT_STRIDE = 3;\n\nexport const HAIR_CONFIG_FIELDS = [\n 'mass',\n 'stiffness',\n 'damping',\n 'gravity',\n 'headInfluence',\n 'windEnabled',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n] as const;\n\nexport const HAIR_STATE_FIELDS = ['x', 'z', 'vx', 'vz'] as const;\nexport const HAIR_HEAD_STATE_FIELDS = ['yaw', 'pitch', 'roll', 'yawVelocity', 'pitchVelocity'] as const;\nexport const HAIR_MORPH_OUTPUT_FIELDS = [\n 'L_Hair_Left',\n 'L_Hair_Right',\n 'L_Hair_Front',\n 'R_Hair_Left',\n 'R_Hair_Right',\n 'R_Hair_Front',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n] as const;\nexport const MESH_PROPORTIONS_FIELDS = [\n 'minX',\n 'minY',\n 'minZ',\n 'maxX',\n 'maxY',\n 'maxZ',\n 'centerX',\n 'centerY',\n 'centerZ',\n 'spanX',\n 'spanY',\n 'spanZ',\n 'verticalHeight',\n 'crossAxisWideSpan',\n 'crossAxisNarrowSpan',\n 'humanoidLikelihood',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n 'confidence',\n 'meshHeight',\n 'templateHeight',\n 'meshCrossAxisWideSpan',\n 'templateCrossAxisWideSpan',\n 'status',\n] as const;\nexport const ANNOTATION_CAMERA_FRAMING_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'distance',\n] as const;\nexport const CAMERA_FLIGHT_SAMPLE_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'done',\n] as const;\nexport const MARKER_VISIBILITY_FACTORS_FIELDS = [\n 'itemOpacityFactor',\n 'labelScaleFactor',\n 'lineOpacityFactor',\n] as const;\nexport const MARKER_ENDPOINT_FIELDS = ['x', 'y', 'z'] as const;\n\nexport type PackedMorphFrameDeltaField = (typeof PACKED_MORPH_FRAME_DELTA_FIELDS)[number];\nexport type HairConfigField = (typeof HAIR_CONFIG_FIELDS)[number];\nexport type HairStateField = (typeof HAIR_STATE_FIELDS)[number];\nexport type HairHeadStateField = (typeof HAIR_HEAD_STATE_FIELDS)[number];\nexport type HairMorphOutputField = (typeof HAIR_MORPH_OUTPUT_FIELDS)[number];\nexport type TemplateSkeletonFitTransformField = (typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS)[number];\nexport type MeshProportionsField = (typeof MESH_PROPORTIONS_FIELDS)[number];\nexport type TemplateSkeletonFitSolutionField = (typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS)[number];\n\nexport interface PackedMorphFrameDelta {\n readonly abiVersion: typeof EMBODY_CORE_ABI_VERSION;\n readonly stride: typeof PACKED_MORPH_FRAME_DELTA_STRIDE;\n readonly fields: typeof PACKED_MORPH_FRAME_DELTA_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairPhysicsState {\n readonly stride: typeof HAIR_STATE_STRIDE;\n readonly fields: typeof HAIR_STATE_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairMorphOutput {\n readonly stride: typeof HAIR_MORPH_OUTPUT_STRIDE;\n readonly fields: typeof HAIR_MORPH_OUTPUT_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitTransform {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedMeshProportions {\n readonly stride: typeof MESH_PROPORTIONS_STRIDE;\n readonly fields: typeof MESH_PROPORTIONS_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitSolution {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;\n readonly values: NumericArray;\n}\n","import type { Vec3 } from './primitives';\n\nexport const TEMPLATE_SKELETON_FIT_METADATA_KIND = 'template-skeleton-fit';\nexport const TEMPLATE_SKELETON_FIT_METADATA_VERSION = 1;\n\nexport const TEMPLATE_SKELETON_FIT_STATUSES = [\n 'unfitted',\n 'estimated',\n 'manual-adjusted',\n 'invalid',\n] as const;\n\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_AXES = ['x', 'y', 'z'] as const;\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS = ['min', 'center', 'max'] as const;\n\nexport type TemplateSkeletonFitStatus = (typeof TEMPLATE_SKELETON_FIT_STATUSES)[number];\nexport type TemplateSkeletonFitVerticalAxis = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_AXES)[number];\nexport type TemplateSkeletonFitVerticalAnchor = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS)[number];\n\nexport interface TemplateSkeletonFitTransform {\n readonly scale: number;\n readonly translation: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetrics extends TemplateSkeletonFitTransform {\n readonly confidence: number;\n readonly meshHeight: number;\n readonly templateHeight: number;\n readonly crossAxisSpans: Vec3;\n readonly status: TemplateSkeletonFitStatus;\n}\n\nexport interface TemplateSkeletonFitManualAdjustment {\n readonly scale?: number;\n readonly translation?: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetadata {\n readonly kind: typeof TEMPLATE_SKELETON_FIT_METADATA_KIND;\n readonly version: typeof TEMPLATE_SKELETON_FIT_METADATA_VERSION;\n readonly templateId: string;\n readonly sourceCharacterId: string;\n readonly verticalAxis: TemplateSkeletonFitVerticalAxis;\n readonly verticalAnchor: TemplateSkeletonFitVerticalAnchor;\n readonly fit: TemplateSkeletonFitMetrics;\n readonly manualAdjustment?: TemplateSkeletonFitManualAdjustment;\n}\n\nexport interface TemplateSkeletonFitValidationResult {\n readonly valid: boolean;\n readonly errors: readonly string[];\n}\n\nexport function isTemplateSkeletonFitStatus(value: unknown): value is TemplateSkeletonFitStatus {\n return typeof value === 'string' && TEMPLATE_SKELETON_FIT_STATUSES.includes(value as TemplateSkeletonFitStatus);\n}\n\nexport function composeTemplateSkeletonFitTransform(\n fit: TemplateSkeletonFitTransform,\n manualAdjustment: TemplateSkeletonFitManualAdjustment = {},\n): TemplateSkeletonFitTransform {\n return {\n scale: positiveFiniteOr(fit.scale, 1) * positiveFiniteOr(manualAdjustment.scale ?? 1, 1),\n translation: {\n x: finiteOr(fit.translation.x, 0) + finiteOr(manualAdjustment.translation?.x ?? 0, 0),\n y: finiteOr(fit.translation.y, 0) + finiteOr(manualAdjustment.translation?.y ?? 0, 0),\n z: finiteOr(fit.translation.z, 0) + finiteOr(manualAdjustment.translation?.z ?? 0, 0),\n },\n };\n}\n\nexport function validateTemplateSkeletonFitMetadata(metadata: unknown): TemplateSkeletonFitValidationResult {\n const errors: string[] = [];\n\n if (!isRecord(metadata)) {\n return { valid: false, errors: ['metadata must be an object'] };\n }\n\n if (metadata.kind !== TEMPLATE_SKELETON_FIT_METADATA_KIND) {\n errors.push(`kind must be \"${TEMPLATE_SKELETON_FIT_METADATA_KIND}\"`);\n }\n if (metadata.version !== TEMPLATE_SKELETON_FIT_METADATA_VERSION) {\n errors.push(`version must be ${TEMPLATE_SKELETON_FIT_METADATA_VERSION}`);\n }\n if (!isNonEmptyString(metadata.templateId)) {\n errors.push('templateId must be a non-empty string');\n }\n if (!isNonEmptyString(metadata.sourceCharacterId)) {\n errors.push('sourceCharacterId must be a non-empty string');\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_AXES.includes(metadata.verticalAxis as TemplateSkeletonFitVerticalAxis)) {\n errors.push(`verticalAxis must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_AXES.join(', ')}`);\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.includes(metadata.verticalAnchor as TemplateSkeletonFitVerticalAnchor)) {\n errors.push(`verticalAnchor must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.join(', ')}`);\n }\n\n validateFitMetrics(metadata.fit, errors);\n validateManualAdjustment(metadata.manualAdjustment, errors);\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFitMetrics(value: unknown, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push('fit must be an object');\n return;\n }\n\n if (!isPositiveFiniteNumber(value.scale)) {\n errors.push('fit.scale must be a positive finite number');\n }\n validateVec3(value.translation, 'fit.translation', errors);\n if (!isFiniteNumber(value.confidence) || value.confidence < 0 || value.confidence > 1) {\n errors.push('fit.confidence must be a finite number between 0 and 1');\n }\n if (!isPositiveFiniteNumber(value.meshHeight)) {\n errors.push('fit.meshHeight must be a positive finite number');\n }\n if (!isPositiveFiniteNumber(value.templateHeight)) {\n errors.push('fit.templateHeight must be a positive finite number');\n }\n validateVec3(value.crossAxisSpans, 'fit.crossAxisSpans', errors, { min: 0 });\n if (!isTemplateSkeletonFitStatus(value.status)) {\n errors.push(`fit.status must be one of: ${TEMPLATE_SKELETON_FIT_STATUSES.join(', ')}`);\n }\n}\n\nfunction validateManualAdjustment(value: unknown, errors: string[]): void {\n if (value == null) {\n return;\n }\n if (!isRecord(value)) {\n errors.push('manualAdjustment must be an object');\n return;\n }\n if (value.scale != null && !isPositiveFiniteNumber(value.scale)) {\n errors.push('manualAdjustment.scale must be a positive finite number');\n }\n if (value.translation != null) {\n validateVec3(value.translation, 'manualAdjustment.translation', errors);\n }\n}\n\nfunction validateVec3(\n value: unknown,\n field: string,\n errors: string[],\n options: { min?: number } = {},\n): void {\n if (!isRecord(value)) {\n errors.push(`${field} must be an object with finite x, y, and z values`);\n return;\n }\n\n for (const axis of ['x', 'y', 'z'] as const) {\n const axisValue = value[axis];\n if (!isFiniteNumber(axisValue)) {\n errors.push(`${field}.${axis} must be a finite number`);\n } else if (options.min != null && axisValue < options.min) {\n errors.push(`${field}.${axis} must be a finite number >= ${options.min}`);\n }\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isPositiveFiniteNumber(value: unknown): value is number {\n return isFiniteNumber(value) && value > 0;\n}\n\nfunction finiteOr(value: number, fallback: number): number {\n return Number.isFinite(value) ? value : fallback;\n}\n\nfunction positiveFiniteOr(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n","import type {\n ChannelId,\n ClipChannelIR,\n ClipIR,\n ClipInterpolation,\n ClipTrackTarget,\n ClipTrackValueType,\n NumericArray,\n TrackId,\n} from './contracts';\nimport type { CurvePoint } from './types';\nimport type { EmbodyCoreWasmModule } from '../wasmTypes';\n\nexport interface TsClipCompilerKeyframe {\n readonly time: number;\n readonly value: number | readonly number[];\n}\n\nexport interface TsClipCompilerTrackInput {\n readonly id?: TrackId;\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType: ClipTrackValueType;\n readonly keyframes: readonly TsClipCompilerKeyframe[];\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCompilerInput {\n readonly id?: string;\n readonly name: string;\n readonly durationSeconds?: number;\n readonly channels?: readonly ClipChannelIR[];\n readonly tracks: readonly TsClipCompilerTrackInput[];\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport interface TsClipCurveTarget {\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType?: Extract<ClipTrackValueType, 'scalar'>;\n readonly scale?: number;\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCurvesInput {\n readonly id?: string;\n readonly name: string;\n readonly curves: Record<string, readonly CurvePoint[]>;\n readonly targets: Record<string, TsClipCurveTarget | readonly TsClipCurveTarget[]>;\n readonly channels?: readonly ClipChannelIR[];\n readonly durationSeconds?: number;\n readonly intensityScale?: number;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Thin host facade over the Rust clip compiler (`compile_clip` /\n * `compile_clip_curves`). Callers pass the Wasm module from `initEmbodyCore()`.\n */\nexport class TsClipCompiler {\n constructor(private readonly core: EmbodyCoreWasmModule) {}\n\n compile(input: TsClipCompilerInput): ClipIR {\n return JSON.parse(this.core.compile_clip(JSON.stringify(input))) as ClipIR;\n }\n\n compileCurves(input: TsClipCurvesInput): ClipIR {\n return JSON.parse(this.core.compile_clip_curves(JSON.stringify(input))) as ClipIR;\n }\n}\n\nexport function numericArrayToNumbers(values: NumericArray): number[] {\n return Array.from(values);\n}\n","import type {\n BoneFrameDelta,\n BoneId,\n FrameDelta,\n MeshId,\n ModelDescriptor,\n MorphTargetFrameDelta,\n MorphTargetId,\n} from './contracts';\nimport {\n PACKED_BONE_FLAG_HAS_POSITION,\n PACKED_BONE_FLAG_HAS_ROTATION,\n PACKED_BONE_FRAME_DELTA_STRIDE,\n PACKED_MORPH_FRAME_DELTA_STRIDE,\n} from './contracts';\nimport type { Profile } from '../mappings/types';\nimport type { EmbodyCoreWasmModule, WasmRuntimeCoreHandle } from '../wasmTypes';\n\nexport interface WasmRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n readonly wasm: EmbodyCoreWasmModule;\n readonly allowEmptyBindings?: boolean;\n}\n\n/**\n * TypeScript facade over the host-neutral Rust Wasm RuntimeCore.\n * JavaScript only owns JSON handoff and packed FrameDelta unpacking here.\n */\nexport class WasmRuntimeCore {\n private readonly wasm: EmbodyCoreWasmModule;\n private readonly core: WasmRuntimeCoreHandle;\n private readonly allowEmptyBindings: boolean;\n private profile: Profile;\n private model: ModelDescriptor;\n\n constructor(options: WasmRuntimeCoreOptions) {\n this.wasm = options.wasm;\n this.profile = options.profile;\n this.model = options.model;\n this.allowEmptyBindings = options.allowEmptyBindings ?? false;\n const RuntimeCtor = options.wasm.RuntimeCore;\n if (!RuntimeCtor) {\n throw new Error('Embody Wasm module does not export RuntimeCore');\n }\n this.core = new RuntimeCtor(0);\n this.reloadBindings();\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.reloadBindings();\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n this.reloadBindings();\n }\n\n setAU(id: number, value: number, balance = 0): void {\n this.core.set_au(id >>> 0, value, balance);\n }\n\n setContinuum(negativeAU: number, positiveAU: number, value: number, balance = 0): void {\n this.core.set_continuum(negativeAU >>> 0, positiveAU >>> 0, value, balance);\n }\n\n transitionAU(id: number, to: number, durationMs: number, balance = Number.NaN): void {\n this.core.transition_au(id >>> 0, to, durationMs, balance);\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs: number, jawScale = 1): void {\n this.core.transition_viseme(visemeIndex >>> 0, to, durationMs, jawScale);\n }\n\n update(deltaSeconds: number): number {\n return this.core.update(deltaSeconds);\n }\n\n activeTransitionCount(): number {\n return this.core.active_transition_count();\n }\n\n clearTransitions(): void {\n this.core.clear_transitions();\n }\n\n getAU(id: number): number {\n return this.core.get_au(id >>> 0);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.core.set_au_mix_weight(id >>> 0, weight);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale?: number): void {\n this.core.set_viseme(visemeIndex >>> 0, value);\n if (jawScale !== undefined) {\n this.core.set_viseme_jaw_scale(visemeIndex >>> 0, jawScale);\n }\n }\n\n clear(): void {\n this.core.clear();\n }\n\n evaluatePackedMorphFrameDelta(): Float32Array {\n return this.core.evaluate_morph_frame_delta();\n }\n\n evaluatePackedBoneFrameDelta(): Float32Array {\n return this.core.evaluate_bone_frame_delta();\n }\n\n evaluateMorphFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n };\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n bones: unpackBoneFrameDelta(this.evaluatePackedBoneFrameDelta()),\n };\n }\n\n private reloadBindings(): void {\n const profileJson = JSON.stringify(this.profile);\n const modelJson = JSON.stringify(this.model);\n if (this.allowEmptyBindings) {\n this.core.configure(profileJson, modelJson);\n } else {\n this.core.configure_with_profile(profileJson, modelJson);\n }\n }\n}\n\nexport function unpackBoneFrameDelta(values: ArrayLike<number>): BoneFrameDelta[] {\n const stride = PACKED_BONE_FRAME_DELTA_STRIDE;\n const writes: BoneFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n const flags = values[index + 8] ?? 0;\n const hasPosition = (flags & PACKED_BONE_FLAG_HAS_POSITION) !== 0;\n const hasRotation = (flags & PACKED_BONE_FLAG_HAS_ROTATION) !== 0;\n if (!hasPosition && !hasRotation) continue;\n writes.push({\n boneId: values[index] as BoneId,\n transform: {\n ...(hasPosition\n ? { position: { x: values[index + 1], y: values[index + 2], z: values[index + 3] } }\n : {}),\n ...(hasRotation\n ? {\n rotation: {\n x: values[index + 4],\n y: values[index + 5],\n z: values[index + 6],\n w: values[index + 7],\n },\n }\n : {}),\n },\n mode: 'absolute',\n space: 'local',\n });\n }\n return writes;\n}\n\nexport function unpackMorphFrameDelta(values: ArrayLike<number>): MorphTargetFrameDelta[] {\n const stride = PACKED_MORPH_FRAME_DELTA_STRIDE;\n const writes: MorphTargetFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n writes.push({\n meshId: values[index] as MeshId,\n morphTargetId: values[index + 1] as MorphTargetId,\n value: values[index + 2] ?? 0,\n mode: (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute',\n });\n }\n return writes;\n}\n"]}