@lovelace_lol/embody 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2411 -0
  3. package/dist/authoring/boneAuthoring.d.ts +132 -0
  4. package/dist/camera/annotationCameraAngles.d.ts +28 -0
  5. package/dist/camera/cameraRelativeGaze.d.ts +15 -0
  6. package/dist/camera/rustAnnotationCameraCore.d.ts +136 -0
  7. package/dist/cljs.cjs +362 -0
  8. package/dist/cljs.cjs.map +1 -0
  9. package/dist/cljs.d.ts +5 -0
  10. package/dist/cljs.js +359 -0
  11. package/dist/cljs.js.map +1 -0
  12. package/dist/core/TsClipCompiler.d.ts +51 -0
  13. package/dist/core/TsRuntimeCore.d.ts +40 -0
  14. package/dist/core/WasmRuntimeCore.d.ts +55 -0
  15. package/dist/core/compositeAxis.d.ts +4 -0
  16. package/dist/core/contracts/abi.d.ts +70 -0
  17. package/dist/core/contracts/clip.d.ts +44 -0
  18. package/dist/core/contracts/frame.d.ts +27 -0
  19. package/dist/core/contracts/host.d.ts +28 -0
  20. package/dist/core/contracts/ids.d.ts +15 -0
  21. package/dist/core/contracts/index.d.ts +10 -0
  22. package/dist/core/contracts/model.d.ts +31 -0
  23. package/dist/core/contracts/primitives.d.ts +17 -0
  24. package/dist/core/contracts/skeletonFit.d.ts +41 -0
  25. package/dist/core/index.d.ts +8 -0
  26. package/dist/core/types.d.ts +472 -0
  27. package/dist/core.cjs +1065 -0
  28. package/dist/core.cjs.map +1 -0
  29. package/dist/core.js +1040 -0
  30. package/dist/core.js.map +1 -0
  31. package/dist/engines/three/Embody.d.ts +373 -0
  32. package/dist/engines/three/ThreeAnimationRuntime.d.ts +203 -0
  33. package/dist/engines/three/ThreeClipAdapter.d.ts +24 -0
  34. package/dist/engines/three/ThreeFrameApplier.d.ts +68 -0
  35. package/dist/engines/three/ThreeModelInspector.d.ts +54 -0
  36. package/dist/engines/three/bakedClipPartitioning.d.ts +16 -0
  37. package/dist/engines/three/balanceUtils.d.ts +3 -0
  38. package/dist/engines/three/characterHost.d.ts +80 -0
  39. package/dist/engines/three/characterScene.d.ts +98 -0
  40. package/dist/engines/three/hair/HairPhysicsController.d.ts +124 -0
  41. package/dist/engines/three/index.d.ts +20 -0
  42. package/dist/engines/three/modelLoader.d.ts +61 -0
  43. package/dist/engines/three/profileTestScene.d.ts +52 -0
  44. package/dist/engines/three/types.d.ts +20 -0
  45. package/dist/hair/appearance.d.ts +29 -0
  46. package/dist/index.cjs +15431 -0
  47. package/dist/index.cjs.map +1 -0
  48. package/dist/index.d.ts +100 -0
  49. package/dist/index.js +15141 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/interfaces/Animation.d.ts +315 -0
  52. package/dist/interfaces/EmbodyRuntime.d.ts +90 -0
  53. package/dist/interfaces/Hair.d.ts +181 -0
  54. package/dist/interfaces/HairPhysics.d.ts +90 -0
  55. package/dist/interfaces/index.d.ts +11 -0
  56. package/dist/mappings/extendPresetWithProfile.d.ts +17 -0
  57. package/dist/mappings/types.d.ts +309 -0
  58. package/dist/mappings/visemeSystem.d.ts +26 -0
  59. package/dist/physics/HairPhysics.d.ts +86 -0
  60. package/dist/physics/RustHairPhysics.d.ts +18 -0
  61. package/dist/physics/index.d.ts +6 -0
  62. package/dist/preset.cjs +2000 -0
  63. package/dist/preset.cjs.map +1 -0
  64. package/dist/preset.js +1997 -0
  65. package/dist/preset.js.map +1 -0
  66. package/dist/presets/bettaFish.d.ts +328 -0
  67. package/dist/presets/cc4.d.ts +145 -0
  68. package/dist/presets/index.d.ts +27 -0
  69. package/dist/profiles/resolveProfileConfig.d.ts +36 -0
  70. package/dist/profiles/types.d.ts +118 -0
  71. package/dist/regions/normalizeRegionTree.d.ts +6 -0
  72. package/dist/regions/regionMapping.d.ts +17 -0
  73. package/dist/regions/types.d.ts +122 -0
  74. package/dist/skeletonTemplates/humanoidSkeletonTemplates.d.ts +32 -0
  75. package/dist/test/setupWasm.d.ts +1 -0
  76. package/dist/three.cjs +10115 -0
  77. package/dist/three.cjs.map +1 -0
  78. package/dist/three.js +10086 -0
  79. package/dist/three.js.map +1 -0
  80. package/dist/validation/analyzeModel.d.ts +68 -0
  81. package/dist/validation/extractModelData.d.ts +90 -0
  82. package/dist/validation/generateMappingCorrections.d.ts +32 -0
  83. package/dist/validation/geometryHelpers.d.ts +66 -0
  84. package/dist/validation/types.d.ts +10 -0
  85. package/dist/validation/validateMappings.d.ts +77 -0
  86. package/dist/wasm/LICENSE +21 -0
  87. package/dist/wasm/README.md +72 -0
  88. package/dist/wasm/embody_wasm.d.ts +531 -0
  89. package/dist/wasm/embody_wasm.js +1635 -0
  90. package/dist/wasm/embody_wasm_bg.wasm +0 -0
  91. package/dist/wasm/embody_wasm_bg.wasm.d.ts +107 -0
  92. package/dist/wasm.cjs +302 -0
  93. package/dist/wasm.cjs.map +1 -0
  94. package/dist/wasm.d.ts +43 -0
  95. package/dist/wasm.js +268 -0
  96. package/dist/wasm.js.map +1 -0
  97. package/dist/wasmTypes.d.ts +121 -0
  98. package/package.json +99 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Embody - 3D Character Animation Engine
3
+ *
4
+ * A lightweight, framework-agnostic library for animating 3D character models
5
+ * using Action Units (AUs), visemes, and bone transformations.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { Embody, collectMorphMeshes, CC4_PRESET } from '@lovelace_lol/embody';
10
+ * import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
11
+ *
12
+ * const loom = new Embody({ presetType: 'cc4' });
13
+ *
14
+ * const loader = new GLTFLoader();
15
+ * loader.load('/character.glb', (gltf) => {
16
+ * const meshes = collectMorphMeshes(gltf.scene);
17
+ * loom.onReady({ meshes, model: gltf.scene });
18
+ *
19
+ * // Control the face
20
+ * loom.setAU(12, 0.8); // Smile
21
+ * loom.transitionAU(12, 0.8, 200); // Animate over 200ms
22
+ * loom.setViseme(3, 0.7); // Lip-sync
23
+ * });
24
+ *
25
+ * // In animation loop
26
+ * loom.update(deltaTime);
27
+ * ```
28
+ */
29
+ export { Embody, buildFrameApplierBindings, collectMorphMeshes, } from './engines/three/Embody';
30
+ export { ThreeAnimationRuntime, ThreeAnimationSystem, AnimationController, BakedAnimationController, } from './engines/three/ThreeAnimationRuntime';
31
+ export type { ThreeAnimationSystemHost, ThreeAnimationSystemOptions, AnimationControllerHost, BakedAnimationHost, } from './engines/three/ThreeAnimationRuntime';
32
+ export { ThreeModelInspector } from './engines/three/ThreeModelInspector';
33
+ export type { ThreeAnimationClipDescriptor, ThreeAnimationTrackDescriptor, ThreeModelInspection, ThreeModelInspectionOptions, } from './engines/three/ThreeModelInspector';
34
+ export { THREE_BLENDING_MODES, ThreeFrameApplier } from './engines/three/ThreeFrameApplier';
35
+ export { ThreeClipAdapter } from './engines/three/ThreeClipAdapter';
36
+ export type { ThreeFrameApplierBindings, ThreeMaterialConfig, ThreeMorphTargetBinding, ThreeResolvedMaterialConfig, } from './engines/three/ThreeFrameApplier';
37
+ export type { ThreeClipAdapterBindings, ThreeClipMeshBinding, ThreeClipMorphTargetBinding, } from './engines/three/ThreeClipAdapter';
38
+ export { HairPhysicsController } from './engines/three/hair/HairPhysicsController';
39
+ export type { HairPhysicsHost } from './engines/three/hair/HairPhysicsController';
40
+ export { createCharacterHost, } from './engines/three/characterHost';
41
+ export type { CharacterHost, CharacterHostCharacterOptions, CharacterHostExternalScene, CharacterHostOptions, } from './engines/three/characterHost';
42
+ export { CHARACTER_SCENE_TYPE_IDS, CHARACTER_SCENE_TYPES, createDefaultCharacterLighting, createDefaultCharacterScene, createShadowPlane, DEFAULT_CHARACTER_LIGHTING_PRESET_ID, DEFAULT_CHARACTER_LIGHTING_PRESET_IDS, DEFAULT_CHARACTER_LIGHTING_PRESETS, DEFAULT_CHARACTER_LIGHTING_SETTINGS, DEFAULT_CHARACTER_SCENE_TYPE_ID, normalizeDefaultCharacterLightingSettings, } from './engines/three/characterScene';
43
+ export type { CharacterSceneTypeDefinition, CharacterSceneTypeId, DefaultCharacterLightingController, DefaultCharacterLightingPresetId, DefaultCharacterLightingSettings, DefaultCharacterScene, DefaultCharacterSceneOptions, } from './engines/three/characterScene';
44
+ export { applyCharacterModelTransform, disposeCharacterModel, loadCharacterModel, parseCharacterModel, } from './engines/three/modelLoader';
45
+ export type { CharacterModelLoadOptions, CharacterModelLoadResult, CharacterModelTransform, } from './engines/three/modelLoader';
46
+ export { TsClipCompiler, numericArrayToNumbers, } from './core/TsClipCompiler';
47
+ export { TsRuntimeCore } from './core/TsRuntimeCore';
48
+ export { AU_MORPH_BINDING_STRIDE, VISEME_MORPH_BINDING_STRIDE, WasmRuntimeCore, compileMorphBindings, compileBoneBindings, unpackMorphFrameDelta, unpackBoneFrameDelta, } from './core/WasmRuntimeCore';
49
+ export { EMBODY_CORE_ABI_VERSION, HAIR_CONFIG_FIELDS, HAIR_CONFIG_STRIDE, HAIR_HEAD_STATE_FIELDS, HAIR_HEAD_STATE_STRIDE, HAIR_MORPH_OUTPUT_FIELDS, HAIR_MORPH_OUTPUT_STRIDE, HAIR_STATE_FIELDS, HAIR_STATE_STRIDE, MESH_PROPORTIONS_FIELDS, MESH_PROPORTIONS_STRIDE, PACKED_MORPH_FRAME_DELTA_FIELDS, PACKED_MORPH_FRAME_DELTA_STRIDE, PACKED_BONE_FRAME_DELTA_FIELDS, PACKED_BONE_FRAME_DELTA_STRIDE, TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS, TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE, TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS, TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE, getEmbodyCore, requireInitializedEmbodyCore, initEmbodyCore, resetEmbodyCoreForTests, } from './wasm';
50
+ export type { TsClipCompilerInput, TsClipCompilerKeyframe, TsClipCompilerTrackInput, TsClipCurveTarget, TsClipCurvesInput, } from './core/TsClipCompiler';
51
+ export type { TsRuntimeCoreOptions } from './core/TsRuntimeCore';
52
+ export type { CompiledBoneBindings, MorphBindingSide, WasmRuntimeCoreOptions, } from './core/WasmRuntimeCore';
53
+ export type { EmbodyCoreWasmModule, WasmHairPhysicsSolver, WasmHairPhysicsSolverConstructor, } from './wasmTypes';
54
+ export type { HairConfigField, HairHeadStateField, HairMorphOutputField, HairStateField, PackedHairMorphOutput, PackedHairPhysicsState, PackedMorphFrameDelta, PackedMorphFrameDeltaField, PackedTemplateSkeletonFitTransform, TemplateSkeletonFitTransformField, } from './core/contracts';
55
+ export type { EmbodyRuntime, ReadyPayload, EmbodyConfig, } from './interfaces/EmbodyRuntime';
56
+ export type { Animation, MixerLoopMode } from './interfaces/Animation';
57
+ export type { HairPhysics as HairPhysicsInterface, HairPhysicsConfig, HairStrand, HairState, HeadState, HairMorphOutput, } from './interfaces/HairPhysics';
58
+ export type { Hair, HairPhysicsRuntimeConfig, HairPhysicsRuntimeConfigUpdate, HairPhysicsDirectionConfig, HairMorphTargetsConfig, HairObjectRef, HairObjectState, HairColorAppearance, HairAppearanceState, } from './interfaces/Hair';
59
+ export { HAIR_COLOR_PRESETS, DEFAULT_HAIR_COLOR_APPEARANCE, normalizeHairColorAppearance, } from './hair/appearance';
60
+ export type { TransitionHandle, AUSelector, BoneKey, BoneBinding, AUInfo, RotationAxis, CompositeRotation, CompositeRotationState, RotationsState, AnimationSource, AnimationBlendMode, AnimationEasing, AnimationPlayOptions, AnimationClipInfo, AnimationState, AnimationActionHandle, CurvePoint, CurvesMap, SnippetChannelTarget, SnippetChannel, TypedSnippet, ClipOptions, ClipEvent, ClipEventListener, ClipHandle, Snippet, MorphTargetAttributeData, MorphTargetDelta, AddMorphTargetOptions, } from './core/types';
61
+ export type { BoneDescriptor, BoneFrameDelta, BoneId, BoneTransformTrackTarget, ChannelId, ClipChannelIR, ClipChannelKind, ClipIR, ClipInterpolation, ClipTrackIR, ClipTrackTarget, ClipTrackTargetKind, ClipTrackTransformProperty, ClipTrackValueType, FrameDelta, FrameValueMode, HostAnimationHandle, HostAnimationPlayOptions, HostAnimationSystem, HostFrameApplier, HostModelInspector, HostTargetId, MeshDescriptor, MeshFrameDelta, MeshId, MeshVisibilityTrackTarget, ModelDescriptor, MorphTargetDescriptor, MorphTargetFrameDelta, MorphTargetId, MorphTargetTrackTarget, NumericArray, PackedMeshProportions, PackedTemplateSkeletonFitSolution, Quat, MeshProportionsField, TemplateSkeletonFitSolutionField, TemplateSkeletonFitManualAdjustment, TemplateSkeletonFitMetadata, TemplateSkeletonFitMetrics, TemplateSkeletonFitStatus, TemplateSkeletonFitTransform, TemplateSkeletonFitValidationResult, TemplateSkeletonFitVerticalAnchor, TemplateSkeletonFitVerticalAxis, TrackId, Transform, TransformSpace, Vec3, } from './core/contracts';
62
+ export { TEMPLATE_SKELETON_FIT_METADATA_KIND, TEMPLATE_SKELETON_FIT_METADATA_VERSION, TEMPLATE_SKELETON_FIT_STATUSES, TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS, TEMPLATE_SKELETON_FIT_VERTICAL_AXES, composeTemplateSkeletonFitTransform, isTemplateSkeletonFitStatus, validateTemplateSkeletonFitMetadata, } from './core/contracts';
63
+ export type { Profile, MorphTargetsBySide, MorphTargetRef, HairPhysicsProfileConfig, HairMorphTargetMapping, HairMorphTargetValueMapping, HairMorphAxis, VisemeSlot, VisemeSlotFeatures, VisemeBinding, VisemeBindingTarget, MappingEditorSection, MappingEditorModel, MorphCandidate, MorphCandidateMatch, MorphCandidateReason, MorphCategory, MeshCategory, BlendingMode, MeshMaterialSettings, MeshInfo, } from './mappings/types';
64
+ export { BLENDING_MODES } from './mappings/types';
65
+ export { buildMappingEditorModel, compileVisemeKeys, getMeshNamesForAUProfile, getMeshNamesForVisemeProfile, getProfileVisemeSlots, getVisemeBindingTargets, getVisemeJawAmounts, getVisemeSlotIndex, mapProviderVisemeToSlot, resolveVisemeMeshCategory, } from './mappings/visemeSystem';
66
+ export type { ProviderVisemeEvent, ProviderVisemeMatch, ResolvedVisemeBindingTarget, } from './mappings/visemeSystem';
67
+ export { applyAUBoneBindingUpdate, applyBilateralAxisBindingUpdate, applyBoneAxisBindingUpdate, buildBoneAuOptions, classifyAuAsJointControl, createBilateralBoneAxisAu, createBoneAxisAu, DEFAULT_AXIS_TO_CHANNEL, DEFAULT_BONE_MAX_DEGREES, ensureBilateralBoneNodeKeys, ensureBoneNodeKey, findNodeKeyForBone, formatAxisDirectionLabel, formatAxisLabel, getAUBoneBindingState, getAxisFromChannel, getBilateralAxisBindingState, getBoneAxisBindingState, inferChiralBoneNamePair, inferEyeControlFamily, inferEyeControlScope, isJointControlAuInfo, isMaxDegreesOnlyAxisBindingUpdate, JOINT_CONTROL_SECTION, resolveBoneAxisChannel, resolveBoneNameForNodeKey, resolveContinuumDisplayLabel, stripConfiguredBoneAffixes, } from './authoring/boneAuthoring';
68
+ export type { AUBoneBindingState, BilateralAxisBindingState, BilateralAxisDirectionScaleState, BilateralAxisScopeBindingState, BilateralBoneAxisScope, BoneAxisBindingState, BoneAxisBindingUpdate, BoneAxisDirection, BoneAxisDirectionScale, BoneAxisKey, BoneControlFamily, BoneControlScope, ChiralBoneNamePair, CreatedBoneAxisAu, RotationChannel, } from './authoring/boneAuthoring';
69
+ export type { ProfileOverrides, ProfilePresetId, ProfileRuntimeConfig, ResolvedProfileRuntimeConfig, PresetBackedProfileRuntimeConfig, CustomProfileRuntimeConfig, CharacterProfile, ProfileRegistry, CharacterConfig, CharacterRegistry, } from './profiles/types';
70
+ export { extendProfileConfigWithPreset, extractLegacyCharacterProfileOverrides, getProfilePresetId, mergeProfileRegionsByName, resolveProfileFromPreset, applyCharacterProfileToPreset, extendCharacterConfigWithPreset, extractProfileOverrides, mergeRegionsByName as mergeCharacterRegionsByName, } from './profiles/resolveProfileConfig';
71
+ export type { LineStyle, LineCurve, NamedDirection, LineConfig, MarkerStyleOverrides, ExpandAnimation, ExpandedRegionState, FallbackConfig, MarkerGroup, AnnotationRegion, Region, MarkerStyle, } from './regions/types';
72
+ export type { CameraRelativeGazeOffset, CameraRelativeGazeOptions, } from './camera/cameraRelativeGaze';
73
+ export { computeCameraRelativeGazeOffset } from './camera/cameraRelativeGaze';
74
+ export type { AnnotationLaterality, } from './camera/annotationCameraAngles';
75
+ export { detectAnnotationLaterality, getDefaultAnnotationLaterality, getModelLocalOrbitAngle, getRegionSemanticSide, getSemanticHorizontalSign, getSemanticHorizontalSignForSide, getWorldDirectionForCameraAngle, normalizeCameraAngle, passesMarkerCameraAngleGate, resolveRegionCameraAngle, resolveRegionVisibilityCameraAngle, toModelLocalDirection, toWorldDirection, } from './camera/annotationCameraAngles';
76
+ export type { BoundsLike, CameraFramingResult, CameraPoseSample, FocusFramingOptions, FullBodyFramingOptions, MarkerEndpointSeparationOptions, MarkerSoloState, MarkerVisibilityAnimationFactors, QuatLike, Vec3Like, } from './camera/rustAnnotationCameraCore';
77
+ export { RustAnnotationCameraCore, RustCameraFlight, RustCameraOrbit, createRustAnnotationCameraCore, } from './camera/rustAnnotationCameraCore';
78
+ export { fuzzyNameMatch, resolveBoneName, resolveBoneNames, resolveFaceCenter, } from './regions/regionMapping';
79
+ export type { BoneResolutionProfile, ResolvedFaceCenter, } from './regions/regionMapping';
80
+ export { CC4_PRESET } from './presets/cc4';
81
+ export { extendPresetWithProfile, mergePresetWithProfile, } from './mappings/extendPresetWithProfile';
82
+ export { AU_TO_MORPHS, BONE_AU_TO_BINDINGS, LIP_SYNC_CONTROL_TO_BINDINGS, CC4_PROFILE_BONE_BINDINGS, AU_MIX_DEFAULTS, CC4_BONES, CC4_BONE_NODES, CC4_BONE_PREFIX, CC4_SUFFIX_PATTERN, CC4_EYE_MESH_NODES, CC4_MESHES, VISEME_KEYS, CC4_VISEME_SYSTEM_ID, CC4_VISEME_SLOTS, CC4_MAPPING_SECTIONS, VISEME_JAW_AMOUNTS, MORPH_TO_MESH, AU_INFO, COMPOSITE_ROTATIONS, CONTINUUM_PAIRS_MAP, CONTINUUM_LABELS, isMixedAU, hasLeftRightMorphs, } from './presets/cc4';
83
+ export { BETTA_FISH_PRESET, AU_MAPPING_CONFIG, FISH_AU_MAPPING_CONFIG } from './presets/bettaFish';
84
+ export { getPreset, getPresetWithProfile, resolvePreset, resolvePresetWithOverrides, } from './presets';
85
+ export type { PresetType } from './presets';
86
+ export { HairPhysics, DEFAULT_HAIR_PHYSICS_CONFIG, } from './physics/HairPhysics';
87
+ export { RustHairPhysics, createRustHairPhysics, packHairConfig, packHeadState, unpackHairConfig, unpackHairMorphOutput, unpackHairState, } from './physics/RustHairPhysics';
88
+ export type { HairPhysicsState, HairMorphOutput as HairPhysicsMorphOutput } from './physics/HairPhysics';
89
+ export { validateMappings, validateMappingConfig, isPresetCompatible, suggestBestPreset, } from './validation/validateMappings';
90
+ export type { ValidationResult, MappingConsistencyResult, MappingIssue, ValidateMappingOptions, } from './validation/validateMappings';
91
+ export { generateMappingCorrections, } from './validation/generateMappingCorrections';
92
+ export type { MappingCorrection, MappingCorrectionOptions, MappingCorrectionResult, } from './validation/generateMappingCorrections';
93
+ export { extractModelData, extractFromGLTF, } from './validation/extractModelData';
94
+ export type { ModelData, BoneInfo, MorphInfo, ModelMeshInfo, AnimationInfo, TrackInfo, } from './validation/extractModelData';
95
+ export { analyzeModel, } from './validation/analyzeModel';
96
+ export type { ModelAnalysisReport, AnalyzeModelOptions, AnimationAnalysis, } from './validation/analyzeModel';
97
+ export { computeHumanoidSkeletonTemplateRestBounds, createValidationSkeletonFromHumanoidTemplate, extractHumanoidSkeletonTemplateFromModel, getHumanoidSkeletonTemplate, getHumanoidSkeletonTemplateBoneNames, HUMANOID_SKELETON_TEMPLATES, JONATHAN_HUMANOID_SKELETON_TEMPLATE, } from './skeletonTemplates/humanoidSkeletonTemplates';
98
+ export type { ExtractHumanoidSkeletonTemplateOptions, HumanoidSkeletonTemplate, HumanoidSkeletonTemplateBone, HumanoidSkeletonTemplateBounds, HumanoidSkeletonTemplateVec3, } from './skeletonTemplates/humanoidSkeletonTemplates';
99
+ export { findFaceCenter, getModelForwardDirection, detectFacingDirection, } from './validation/geometryHelpers';
100
+ export type { FaceCenterResult, FindFaceCenterOptions, } from './validation/geometryHelpers';