@relu-interactives/spatial-ecs 0.5.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{System-V_mv07le.d.cts → System-8D-XBDKZ.d.cts} +734 -8
- package/dist/{System-V_mv07le.d.ts → System-DPMAW30g.d.ts} +734 -8
- package/dist/{XRHandPose-CU3vNFuS.d.ts → XRHandPose-CWSrsnYN.d.ts} +236 -3
- package/dist/{XRHandPose-CQTLGxFC.d.cts → XRHandPose-Dn2yiALk.d.cts} +236 -3
- package/dist/animation/index.cjs +252 -0
- package/dist/animation/index.cjs.map +1 -0
- package/dist/animation/index.d.cts +100 -0
- package/dist/animation/index.d.ts +100 -0
- package/dist/animation/index.js +4 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/chunk-CKTHDXPS.js +11 -0
- package/dist/chunk-CKTHDXPS.js.map +1 -0
- package/dist/chunk-GSWC6LLD.js +241 -0
- package/dist/chunk-GSWC6LLD.js.map +1 -0
- package/dist/chunk-JEPUCLZX.js +1237 -0
- package/dist/chunk-JEPUCLZX.js.map +1 -0
- package/dist/{chunk-BUEKOSR5.js → chunk-JNYPJB55.js} +435 -14
- package/dist/chunk-JNYPJB55.js.map +1 -0
- package/dist/{chunk-RXBLOO5B.js → chunk-NXASMBDS.js} +105 -715
- package/dist/chunk-NXASMBDS.js.map +1 -0
- package/dist/chunk-OHCNPPMX.js +334 -0
- package/dist/chunk-OHCNPPMX.js.map +1 -0
- package/dist/{chunk-DF5SSRN6.js → chunk-VYIWOXAY.js} +2574 -3381
- package/dist/chunk-VYIWOXAY.js.map +1 -0
- package/dist/chunk-WWP46AEF.js +2878 -0
- package/dist/chunk-WWP46AEF.js.map +1 -0
- package/dist/{chunk-OY7ZODZP.js → chunk-XE4OXN2W.js} +3 -9
- package/dist/chunk-XE4OXN2W.js.map +1 -0
- package/dist/{chunk-OWQSESTO.js → chunk-XU2DVWCP.js} +4 -3
- package/dist/chunk-XU2DVWCP.js.map +1 -0
- package/dist/components/index.cjs +334 -10
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.cts +5 -3
- package/dist/components/index.d.ts +5 -3
- package/dist/components/index.js +3 -2
- package/dist/docs/api/Behaviour/classes/Behaviour.md +366 -79
- package/dist/docs/api/Behaviour/index.md +7 -3
- package/dist/docs/api/Behaviour/type-aliases/UiInteractionEvent.md +35 -0
- package/dist/docs/api/Component/classes/Component.md +14 -1
- package/dist/docs/api/components/classes/AnimationComponent.md +26 -26
- package/dist/docs/api/components/classes/AudioComponent.md +19 -19
- package/dist/docs/api/components/classes/CameraComponent.md +14 -14
- package/dist/docs/api/components/classes/EntityType.md +4 -4
- package/dist/docs/api/components/classes/Environment.md +5 -4
- package/dist/docs/api/components/classes/ImageComponent.md +7 -7
- package/dist/docs/api/components/classes/ImageTarget.md +8 -8
- package/dist/docs/api/components/classes/ImageTargetAnchor.md +4 -4
- package/dist/docs/api/components/classes/InstanceSlotComponent.md +4 -4
- package/dist/docs/api/components/classes/InstancedMeshComponent.md +10 -10
- package/dist/docs/api/components/classes/LightComponent.md +6 -6
- package/dist/docs/api/components/classes/MaterialComponent.md +16 -16
- package/dist/docs/api/components/classes/MeshComponent.md +3 -3
- package/dist/docs/api/components/classes/MeshGeometryComponent.md +9 -9
- package/dist/docs/api/components/classes/ModelComponent.md +8 -5
- package/dist/docs/api/components/classes/Name.md +3 -3
- package/dist/docs/api/components/classes/Object3DRef.md +4 -4
- package/dist/docs/api/components/classes/ParentId.md +3 -3
- package/dist/docs/api/components/classes/PhysicsComponent.md +7 -6
- package/dist/docs/api/components/classes/Postprocessing.md +3 -3
- package/dist/docs/api/components/classes/PrefabInstance.md +5 -5
- package/dist/docs/api/components/classes/PrefabNode.md +3 -3
- package/dist/docs/api/components/classes/ScriptComponent.md +5 -5
- package/dist/docs/api/components/classes/ScriptObjectComponent.md +9 -9
- package/dist/docs/api/components/classes/Selectable.md +3 -3
- package/dist/docs/api/components/classes/SelectionTransformState.md +5 -5
- package/dist/docs/api/components/classes/SpriteComponent.md +7 -7
- package/dist/docs/api/components/classes/TransformComponent.md +12 -12
- package/dist/docs/api/components/classes/UIButtonComponent.md +63 -0
- package/dist/docs/api/components/classes/UIPanelComponent.md +62 -0
- package/dist/docs/api/components/classes/UISliderComponent.md +59 -0
- package/dist/docs/api/components/classes/UITextComponent.md +59 -0
- package/dist/docs/api/components/classes/UIToggleComponent.md +56 -0
- package/dist/docs/api/components/classes/VRTeleportAreaComponent.md +53 -0
- package/dist/docs/api/components/classes/VideoComponent.md +28 -28
- package/dist/docs/api/components/classes/XRAnchorComponent.md +64 -0
- package/dist/docs/api/components/classes/XREnvironmentComponent.md +64 -0
- package/dist/docs/api/components/classes/XRHandPoseComponent.md +50 -0
- package/dist/docs/api/components/classes/XRInteractableComponent.md +74 -0
- package/dist/docs/api/components/classes/XRInteractorComponent.md +57 -0
- package/dist/docs/api/components/classes/XRInteractorSideComponent.md +50 -0
- package/dist/docs/api/components/classes/XRRigComponent.md +68 -0
- package/dist/docs/api/components/functions/createAttachPoint.md +25 -0
- package/dist/docs/api/components/functions/createHandPoseEntry.md +25 -0
- package/dist/docs/api/components/functions/defaultMaterialValue.md +1 -1
- package/dist/docs/api/components/functions/handPoseDefinitionFor.md +33 -0
- package/dist/docs/api/components/functions/normalizeEnvironmentLighting.md +30 -0
- package/dist/docs/api/components/functions/normalizePhysicsState.md +1 -1
- package/dist/docs/api/components/functions/setModelLoadState.md +33 -0
- package/dist/docs/api/components/functions/setPhysicsLiveRef.md +3 -9
- package/dist/docs/api/components/index.md +61 -4
- package/dist/docs/api/components/type-aliases/AnimationComponentOptions.md +9 -9
- package/dist/docs/api/components/type-aliases/CameraComponentOptions.md +13 -13
- package/dist/docs/api/components/type-aliases/CameraProjection.md +1 -1
- package/dist/docs/api/components/type-aliases/CameraRuntimeType.md +5 -3
- package/dist/docs/api/components/type-aliases/ColliderShape.md +1 -1
- package/dist/docs/api/components/type-aliases/ColliderState.md +20 -20
- package/dist/docs/api/components/type-aliases/CubeMeshParameters.md +4 -4
- package/dist/docs/api/components/type-aliases/EditableMeshObjectKind.md +1 -1
- package/dist/docs/api/components/type-aliases/EnvironmentFogState.md +8 -8
- package/dist/docs/api/components/type-aliases/EnvironmentFogType.md +1 -1
- package/dist/docs/api/components/type-aliases/EnvironmentGradientEffect.md +1 -1
- package/dist/docs/api/components/type-aliases/EnvironmentLightingState.md +40 -0
- package/dist/docs/api/components/type-aliases/EnvironmentSkyboxImageProjection.md +22 -0
- package/dist/docs/api/components/type-aliases/EnvironmentSkyboxState.md +9 -7
- package/dist/docs/api/components/type-aliases/EnvironmentSkyboxType.md +1 -1
- package/dist/docs/api/components/type-aliases/EnvironmentState.md +7 -5
- package/dist/docs/api/components/type-aliases/EnvironmentToneMapping.md +16 -0
- package/dist/docs/api/components/type-aliases/ImageTargetAnchorOptions.md +3 -3
- package/dist/docs/api/components/type-aliases/ImageTargetReference.md +7 -7
- package/dist/docs/api/components/type-aliases/InstanceTransform.md +13 -13
- package/dist/docs/api/components/type-aliases/InstancedMeshKind.md +1 -1
- package/dist/docs/api/components/type-aliases/LightShadowState.md +37 -0
- package/dist/docs/api/components/type-aliases/LightValueState.md +13 -11
- package/dist/docs/api/components/type-aliases/MaterialTypeValue.md +1 -1
- package/dist/docs/api/components/type-aliases/MaterialValueState.md +28 -28
- package/dist/docs/api/components/type-aliases/MeshGeometryParameters.md +1 -1
- package/dist/docs/api/components/type-aliases/MeshGeometryParametersByKind.md +7 -7
- package/dist/docs/api/components/type-aliases/ModelLoadState.md +15 -0
- package/dist/docs/api/components/type-aliases/PhysicsState.md +3 -3
- package/dist/docs/api/components/type-aliases/PlaneMeshParameters.md +3 -3
- package/dist/docs/api/components/type-aliases/PostprocessingState.md +62 -62
- package/dist/docs/api/components/type-aliases/RadiusHeightMeshParameters.md +3 -3
- package/dist/docs/api/components/type-aliases/RadiusMeshParameters.md +2 -2
- package/dist/docs/api/components/type-aliases/RigidbodyState.md +17 -17
- package/dist/docs/api/components/type-aliases/RigidbodyType.md +1 -1
- package/dist/docs/api/components/type-aliases/ScriptEntry.md +8 -8
- package/dist/docs/api/components/type-aliases/ScriptObjectComponentInput.md +1 -1
- package/dist/docs/api/components/type-aliases/ScriptObjectRuntimeState.md +1 -1
- package/dist/docs/api/components/type-aliases/TextureFilteringValue.md +1 -1
- package/dist/docs/api/components/type-aliases/TransformData.md +4 -4
- package/dist/docs/api/components/type-aliases/TransformModeValue.md +1 -1
- package/dist/docs/api/components/type-aliases/TransformSpaceValue.md +1 -1
- package/dist/docs/api/components/type-aliases/UIButtonOptions.md +45 -0
- package/dist/docs/api/components/type-aliases/UIPanelOptions.md +39 -0
- package/dist/docs/api/components/type-aliases/UISliderOptions.md +39 -0
- package/dist/docs/api/components/type-aliases/UITextOptions.md +41 -0
- package/dist/docs/api/components/type-aliases/UIToggleOptions.md +35 -0
- package/dist/docs/api/components/type-aliases/UiFollowMode.md +15 -0
- package/dist/docs/api/components/type-aliases/UiTextAlign.md +13 -0
- package/dist/docs/api/components/type-aliases/UiTextVAlign.md +13 -0
- package/dist/docs/api/components/type-aliases/VRTeleportAreaOptions.md +29 -0
- package/dist/docs/api/components/type-aliases/Vec3.md +4 -4
- package/dist/docs/api/components/type-aliases/VrTeleportShape.md +15 -0
- package/dist/docs/api/components/type-aliases/XRAnchorOptions.md +23 -0
- package/dist/docs/api/components/type-aliases/XRHandPoseOptions.md +23 -0
- package/dist/docs/api/components/type-aliases/XRInteractableOptions.md +75 -0
- package/dist/docs/api/components/type-aliases/XRInteractorOptions.md +37 -0
- package/dist/docs/api/components/type-aliases/XRRigOptions.md +51 -0
- package/dist/docs/api/components/type-aliases/XrAttachPoint.md +53 -0
- package/dist/docs/api/components/type-aliases/XrDistanceGrabBehavior.md +19 -0
- package/dist/docs/api/components/type-aliases/XrEnvironmentKind.md +15 -0
- package/dist/docs/api/components/type-aliases/XrEnvironmentOrientation.md +15 -0
- package/dist/docs/api/components/type-aliases/XrEnvironmentPhysics.md +25 -0
- package/dist/docs/api/components/type-aliases/XrGrabGesture.md +19 -0
- package/dist/docs/api/components/type-aliases/XrGrabHands.md +20 -0
- package/dist/docs/api/components/type-aliases/XrGrabReach.md +20 -0
- package/dist/docs/api/components/type-aliases/XrHandPoseEntry.md +49 -0
- package/dist/docs/api/components/type-aliases/XrHandPreset.md +19 -0
- package/dist/docs/api/components/type-aliases/XrInteractorSide.md +15 -0
- package/dist/docs/api/components/type-aliases/XrInteractorType.md +13 -0
- package/dist/docs/api/components/type-aliases/XrLocomotionMode.md +15 -0
- package/dist/docs/api/components/type-aliases/XrTrackingOrigin.md +24 -0
- package/dist/docs/api/components/type-aliases/XrTwoHandRotation.md +15 -0
- package/dist/docs/api/components/variables/DEFAULT_COLLIDER_STATE.md +1 -1
- package/dist/docs/api/components/variables/DEFAULT_ENVIRONMENT_LIGHTING.md +15 -0
- package/dist/docs/api/components/variables/DEFAULT_ENVIRONMENT_STATE.md +1 -1
- package/dist/docs/api/components/variables/DEFAULT_INSTANCED_MESH_PARAMETERS.md +1 -1
- package/dist/docs/api/components/variables/DEFAULT_INSTANCE_TRANSFORM.md +1 -1
- package/dist/docs/api/components/variables/DEFAULT_MESH_GEOMETRY_PARAMETERS.md +1 -1
- package/dist/docs/api/components/variables/DEFAULT_PHYSICS_STATE.md +1 -1
- package/dist/docs/api/components/variables/DEFAULT_POSE_CURLS.md +13 -0
- package/dist/docs/api/components/variables/DEFAULT_POSE_DIRECTIONS.md +13 -0
- package/dist/docs/api/components/variables/DEFAULT_POSTPROCESSING_STATE.md +1 -1
- package/dist/docs/api/components/variables/DEFAULT_RIGIDBODY_STATE.md +1 -1
- package/dist/docs/api/components/variables/MODEL_NO_PATH_MESSAGE.md +15 -0
- package/dist/docs/api/index/classes/AnimationStateMachine.md +16 -16
- package/dist/docs/api/index/classes/AnimationStateManager.md +13 -13
- package/dist/docs/api/index/classes/AnimationSystem.md +3 -3
- package/dist/docs/api/index/classes/AudioSystem.md +4 -4
- package/dist/docs/api/index/classes/CameraSyncSystem.md +2 -2
- package/dist/docs/api/index/classes/EnvironmentSyncSystem.md +19 -4
- package/dist/docs/api/index/classes/HandPoseTracker.md +114 -0
- package/dist/docs/api/index/classes/InputSystem.md +33 -33
- package/dist/docs/api/index/classes/InstancedMeshSystem.md +2 -2
- package/dist/docs/api/index/classes/LightSyncSystem.md +2 -2
- package/dist/docs/api/index/classes/MaterialSyncSystem.md +3 -3
- package/dist/docs/api/index/classes/MeshGeometrySystem.md +2 -2
- package/dist/docs/api/index/classes/ObjectManagementSystem.md +14 -14
- package/dist/docs/api/index/classes/ObjectVisibilitySystem.md +2 -2
- package/dist/docs/api/index/classes/PhysicsSyncSystem.md +4 -4
- package/dist/docs/api/index/classes/PostprocessingSyncSystem.md +34 -10
- package/dist/docs/api/index/classes/RenderSystem.md +13 -4
- package/dist/docs/api/index/classes/ScriptBehaviourSystem.md +9 -5
- package/dist/docs/api/index/classes/ScriptObject.md +10 -10
- package/dist/docs/api/index/classes/ScriptObjectSystem.md +6 -6
- package/dist/docs/api/index/classes/TeleportAimGate.md +114 -0
- package/dist/docs/api/index/classes/ThrowVelocityTracker.md +89 -0
- package/dist/docs/api/index/classes/TransformSyncSystem.md +2 -2
- package/dist/docs/api/index/classes/UIInteractionSystem.md +60 -0
- package/dist/docs/api/index/classes/UIPanelSystem.md +79 -0
- package/dist/docs/api/index/classes/VRTeleportAreaSystem.md +49 -0
- package/dist/docs/api/index/classes/VideoSystem.md +8 -6
- package/dist/docs/api/index/classes/World.md +282 -100
- package/dist/docs/api/index/classes/XRAnchorSystem.md +90 -0
- package/dist/docs/api/index/classes/XRControllerVisualSystem.md +77 -0
- package/dist/docs/api/index/classes/XREnvironmentSystem.md +137 -0
- package/dist/docs/api/index/classes/XRHandPoseSystem.md +107 -0
- package/dist/docs/api/index/classes/XRHitTestSystem.md +93 -0
- package/dist/docs/api/index/classes/XRHoverVisualSystem.md +76 -0
- package/dist/docs/api/index/classes/XRInputSystem.md +189 -0
- package/dist/docs/api/index/classes/XRInteractionSystem.md +323 -0
- package/dist/docs/api/index/classes/XRLocomotionSystem.md +128 -0
- package/dist/docs/api/index/classes/XRSessionSystem.md +116 -0
- package/dist/docs/api/index/classes/XRTeleportVisualSystem.md +75 -0
- package/dist/docs/api/index/functions/angularVelocityFrom.md +33 -0
- package/dist/docs/api/index/functions/applyHandMaterial.md +26 -0
- package/dist/docs/api/index/functions/applyPrefabToSnapshotInstances.md +1 -1
- package/dist/docs/api/index/functions/arcGroundCrossing.md +30 -0
- package/dist/docs/api/index/functions/buildComponentValueMaps.md +1 -1
- package/dist/docs/api/index/functions/buildNodeKeyMapsFromSnapshot.md +1 -1
- package/dist/docs/api/index/functions/buildNodeMapsFromSnapshot.md +1 -1
- package/dist/docs/api/index/functions/canonicalizeComponentValue.md +1 -1
- package/dist/docs/api/index/functions/clearModelCache.md +1 -1
- package/dist/docs/api/index/functions/clearPrefabCache.md +1 -1
- package/dist/docs/api/index/functions/cloneHandPose.md +23 -0
- package/dist/docs/api/index/functions/collectDiffPaths.md +1 -1
- package/dist/docs/api/index/functions/collectDirectPrefabDependencies.md +1 -1
- package/dist/docs/api/index/functions/collectEntitySubtree.md +1 -1
- package/dist/docs/api/index/functions/collectSnapshotSubtreeIds.md +1 -1
- package/dist/docs/api/index/functions/computeFingerCurl.md +29 -0
- package/dist/docs/api/index/functions/computeHandShape.md +29 -0
- package/dist/docs/api/index/functions/computeInstanceOverrides.md +1 -1
- package/dist/docs/api/index/functions/computePalmPose.md +30 -0
- package/dist/docs/api/index/functions/computePalmWidth.md +25 -0
- package/dist/docs/api/index/functions/computePinch.md +29 -0
- package/dist/docs/api/index/functions/computeSpread.md +33 -0
- package/dist/docs/api/index/functions/createAnimationComponent.md +1 -1
- package/dist/docs/api/index/functions/createAudioComponent.md +1 -1
- package/dist/docs/api/index/functions/createCameraComponent.md +1 -1
- package/dist/docs/api/index/functions/createEntityTypeComponent.md +2 -2
- package/dist/docs/api/index/functions/createEnvironmentComponent.md +1 -1
- package/dist/docs/api/index/functions/createHandMaterial.md +30 -0
- package/dist/docs/api/index/functions/createImageComponent.md +1 -1
- package/dist/docs/api/index/functions/createImageTargetAnchorComponent.md +1 -1
- package/dist/docs/api/index/functions/createImageTargetComponent.md +2 -2
- package/dist/docs/api/index/functions/createInstanceSlotComponent.md +1 -1
- package/dist/docs/api/index/functions/createInstancedMeshComponent.md +1 -1
- package/dist/docs/api/index/functions/createLightComponent.md +2 -2
- package/dist/docs/api/index/functions/createMaterialComponent.md +2 -2
- package/dist/docs/api/index/functions/createMeshComponent.md +1 -1
- package/dist/docs/api/index/functions/createMeshGeometryComponent.md +1 -1
- package/dist/docs/api/index/functions/createModelComponent.md +1 -1
- package/dist/docs/api/index/functions/createNameComponent.md +1 -1
- package/dist/docs/api/index/functions/createObject3DRefComponent.md +1 -1
- package/dist/docs/api/index/functions/createParentIdComponent.md +1 -1
- package/dist/docs/api/index/functions/createPhysicsComponent.md +1 -1
- package/dist/docs/api/index/functions/createPostprocessingComponent.md +1 -1
- package/dist/docs/api/index/functions/createScriptComponent.md +1 -1
- package/dist/docs/api/index/functions/createScriptObjectComponent.md +1 -1
- package/dist/docs/api/index/functions/createSelectableComponent.md +1 -1
- package/dist/docs/api/index/functions/createSelectionTransformStateComponent.md +1 -1
- package/dist/docs/api/index/functions/createSpriteComponent.md +1 -1
- package/dist/docs/api/index/functions/createTransformComponent.md +1 -1
- package/dist/docs/api/index/functions/createUIButtonComponent.md +28 -0
- package/dist/docs/api/index/functions/createUIPanelComponent.md +28 -0
- package/dist/docs/api/index/functions/createUISliderComponent.md +28 -0
- package/dist/docs/api/index/functions/createUITextComponent.md +28 -0
- package/dist/docs/api/index/functions/createUIToggleComponent.md +28 -0
- package/dist/docs/api/index/functions/createVRTeleportAreaComponent.md +28 -0
- package/dist/docs/api/index/functions/createVideoComponent.md +1 -1
- package/dist/docs/api/index/functions/createXRAnchorComponent.md +28 -0
- package/dist/docs/api/index/functions/createXRHandPoseComponent.md +28 -0
- package/dist/docs/api/index/functions/createXRInteractableComponent.md +28 -0
- package/dist/docs/api/index/functions/createXRInteractorComponent.md +28 -0
- package/dist/docs/api/index/functions/createXRInteractorSideComponent.md +28 -0
- package/dist/docs/api/index/functions/createXRRigComponent.md +28 -0
- package/dist/docs/api/index/functions/decanonicalizeComponentValue.md +1 -1
- package/dist/docs/api/index/functions/despawnPrefab.md +1 -1
- package/dist/docs/api/index/functions/encodeOverride.md +1 -1
- package/dist/docs/api/index/functions/estimateHandScale.md +28 -0
- package/dist/docs/api/index/functions/findSnapshotRootEntityIds.md +1 -1
- package/dist/docs/api/index/functions/findTopLevelNestedRegions.md +1 -1
- package/dist/docs/api/index/functions/getHandPosePreset.md +31 -0
- package/dist/docs/api/index/functions/groupOverridePaths.md +1 -1
- package/dist/docs/api/index/functions/handPoseFromCurls.md +42 -0
- package/dist/docs/api/index/functions/hydrateWorldFromSnapshot.md +1 -1
- package/dist/docs/api/index/functions/hydrateWorldFromSnapshotDetailed.md +1 -1
- package/dist/docs/api/index/functions/indexSnapshotByEntity.md +1 -1
- package/dist/docs/api/index/functions/instantiateSubtree.md +1 -1
- package/dist/docs/api/index/functions/loadPrefab.md +1 -1
- package/dist/docs/api/index/functions/loadSharedGltf.md +1 -1
- package/dist/docs/api/index/functions/matchHandPose.md +34 -0
- package/dist/docs/api/index/functions/mergeComponentValue.md +1 -1
- package/dist/docs/api/index/functions/parseOverride.md +1 -1
- package/dist/docs/api/index/functions/parsePrefabAsset.md +1 -1
- package/dist/docs/api/index/functions/prefabFileVersionFor.md +1 -1
- package/dist/docs/api/index/functions/readXrCapabilities.md +30 -0
- package/dist/docs/api/index/functions/registerDefaultComponentFactories.md +1 -1
- package/dist/docs/api/index/functions/registerDefaultFactories.md +1 -1
- package/dist/docs/api/index/functions/remapSnapshotEntityIds.md +3 -3
- package/dist/docs/api/index/functions/resolveDracoDecoderPath.md +1 -1
- package/dist/docs/api/index/functions/restoreComponentState.md +1 -1
- package/dist/docs/api/index/functions/restorePostCreateComponents.md +1 -1
- package/dist/docs/api/index/functions/sampleTeleportArc.md +40 -0
- package/dist/docs/api/index/functions/serializeEntitySubtree.md +1 -1
- package/dist/docs/api/index/functions/setDracoDecoderPath.md +1 -1
- package/dist/docs/api/index/functions/setPrefabAssetUrlResolver.md +1 -1
- package/dist/docs/api/index/functions/spawnPrefab.md +1 -1
- package/dist/docs/api/index/index.md +116 -4
- package/dist/docs/api/index/interfaces/ChromaKeyOptions.md +20 -0
- package/dist/docs/api/index/interfaces/EcsSystem.md +3 -3
- package/dist/docs/api/index/interfaces/PostprocessingBuildContext.md +21 -0
- package/dist/docs/api/index/interfaces/PostprocessingPipeline.md +84 -0
- package/dist/docs/api/index/interfaces/RenderBackend.md +168 -0
- package/dist/docs/api/index/interfaces/StateMachine.md +13 -13
- package/dist/docs/api/index/type-aliases/AnimationStateCallbacks.md +4 -4
- package/dist/docs/api/index/type-aliases/ApplyPrefabToSnapshotResult.md +3 -3
- package/dist/docs/api/index/type-aliases/ComponentFactory.md +1 -1
- package/dist/docs/api/index/type-aliases/ComponentValueMaps.md +50 -26
- package/dist/docs/api/index/type-aliases/EcsComponentFactoryKind.md +14 -2
- package/dist/docs/api/index/type-aliases/EcsRenderer.md +17 -0
- package/dist/docs/api/index/type-aliases/EcsWorldComponentSnapshot.md +3 -3
- package/dist/docs/api/index/type-aliases/EcsWorldStateSnapshotLike.md +4 -4
- package/dist/docs/api/index/type-aliases/ExternalRefWarning.md +5 -5
- package/dist/docs/api/index/type-aliases/HandMaterialOptions.md +32 -0
- package/dist/docs/api/index/type-aliases/HandPoseTrackerOptions.md +27 -0
- package/dist/docs/api/index/type-aliases/HydrateOptions.md +3 -3
- package/dist/docs/api/index/type-aliases/HydrateWorldFromSnapshotResult.md +4 -4
- package/dist/docs/api/index/type-aliases/InstantiateSubtreeResult.md +3 -3
- package/dist/docs/api/index/type-aliases/KeyboardKey.md +1 -1
- package/dist/docs/api/index/type-aliases/ModuleLoader.md +1 -1
- package/dist/docs/api/index/type-aliases/MouseButton.md +1 -1
- package/dist/docs/api/index/type-aliases/NestedRegion.md +5 -5
- package/dist/docs/api/index/type-aliases/NodeKeyMaps.md +5 -5
- package/dist/docs/api/index/type-aliases/NodeMaps.md +4 -4
- package/dist/docs/api/index/type-aliases/PrefabAsset.md +5 -5
- package/dist/docs/api/index/type-aliases/RemapSnapshotOptions.md +2 -2
- package/dist/docs/api/index/type-aliases/RendererKind.md +15 -0
- package/dist/docs/api/index/type-aliases/ScriptBehaviourSystemOptions.md +23 -0
- package/dist/docs/api/index/type-aliases/ScriptErrorEvent.md +39 -0
- package/dist/docs/api/index/type-aliases/ScriptErrorListener.md +25 -0
- package/dist/docs/api/index/type-aliases/ScriptErrorPhase.md +28 -0
- package/dist/docs/api/index/type-aliases/ScriptErrorReport.md +31 -0
- package/dist/docs/api/index/type-aliases/ScriptErrorSource.md +15 -0
- package/dist/docs/api/index/type-aliases/SelectionContext.md +4 -4
- package/dist/docs/api/index/type-aliases/SerializeEntitySubtreeResult.md +4 -4
- package/dist/docs/api/index/type-aliases/SpawnPrefabOptions.md +5 -5
- package/dist/docs/api/index/type-aliases/SpawnPrefabSource.md +1 -1
- package/dist/docs/api/index/type-aliases/SubtreeSnapshot.md +3 -3
- package/dist/docs/api/index/type-aliases/UiCanvasLike.md +46 -0
- package/dist/docs/api/index/type-aliases/VelocitySample.md +23 -0
- package/dist/docs/api/index/type-aliases/XrCapabilities.md +41 -0
- package/dist/docs/api/index/type-aliases/XrFinger.md +13 -0
- package/dist/docs/api/index/type-aliases/XrFingerCurl.md +27 -0
- package/dist/docs/api/index/type-aliases/XrFingerTarget.md +31 -0
- package/dist/docs/api/index/type-aliases/XrHandJointName.md +40 -0
- package/dist/docs/api/index/type-aliases/XrHandJoints.md +18 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseAxis.md +15 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseContext.md +23 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseDefinition.md +47 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseDirection.md +21 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseEvent.md +13 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseEventDetail.md +27 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseMatch.md +25 -0
- package/dist/docs/api/index/type-aliases/XrHandPoseOrientation.md +25 -0
- package/dist/docs/api/index/type-aliases/XrHandShape.md +46 -0
- package/dist/docs/api/index/type-aliases/XrHandedness.md +15 -0
- package/dist/docs/api/index/type-aliases/XrHitResult.md +25 -0
- package/dist/docs/api/index/type-aliases/XrInputKind.md +19 -0
- package/dist/docs/api/index/type-aliases/XrInputState.md +60 -0
- package/dist/docs/api/index/type-aliases/XrPalmPose.md +31 -0
- package/dist/docs/api/index/variables/ADDED_NODE_MARKER_COMPONENT.md +2 -2
- package/dist/docs/api/index/variables/ARC_GRAVITY.md +15 -0
- package/dist/docs/api/index/variables/ARC_MAX_TIME.md +15 -0
- package/dist/docs/api/index/variables/ARC_SPEED.md +15 -0
- package/dist/docs/api/index/variables/ARC_STEPS.md +15 -0
- package/dist/docs/api/index/variables/CURLED_COS.md +13 -0
- package/dist/docs/api/index/variables/DEFAULT_DIRECTION_TOLERANCE.md +15 -0
- package/dist/docs/api/index/variables/DEFAULT_ENTER_CONFIDENCE.md +13 -0
- package/dist/docs/api/index/variables/DEFAULT_EXIT_CONFIDENCE.md +13 -0
- package/dist/docs/api/index/variables/DEFAULT_LOST_GRACE_SECONDS.md +13 -0
- package/dist/docs/api/index/variables/DEFAULT_MIN_HOLD_SECONDS.md +13 -0
- package/dist/docs/api/index/variables/DEFAULT_SCRIPT_ERROR_RETRY_DELAY.md +17 -0
- package/dist/docs/api/index/variables/FALLBACK_HAND_SCALE.md +15 -0
- package/dist/docs/api/index/variables/HAND_POSE_PRESETS.md +19 -0
- package/dist/docs/api/index/variables/HAND_POSE_PRESET_IDS.md +15 -0
- package/dist/docs/api/index/variables/HYDRATABLE_ENTITY_KINDS.md +1 -1
- package/dist/docs/api/index/variables/KeyboardKeys.md +89 -89
- package/dist/docs/api/index/variables/MATCH_FALLOFF.md +15 -0
- package/dist/docs/api/index/variables/MAX_PLAUSIBLE_SPEED.md +25 -0
- package/dist/docs/api/index/variables/MAX_SAMPLE_AGE_SECONDS.md +18 -0
- package/dist/docs/api/index/variables/NODE_KEY_SEPARATOR.md +1 -1
- package/dist/docs/api/index/variables/NO_XR_CAPABILITIES.md +15 -0
- package/dist/docs/api/index/variables/OVERRIDE_DIFF_EXCLUDED_COMPONENTS.md +1 -1
- package/dist/docs/api/index/variables/OVERRIDE_ROOT_EXCLUDED_COMPONENTS.md +1 -1
- package/dist/docs/api/index/variables/PINCH_FINGERS.md +15 -0
- package/dist/docs/api/index/variables/PREFAB_FILE_VERSION.md +1 -1
- package/dist/docs/api/index/variables/PREFAB_FILE_VERSION_NESTED.md +1 -1
- package/dist/docs/api/index/variables/SCRIPT_OBJECT_ROOT_FLAG.md +1 -1
- package/dist/docs/api/index/variables/SHARED_MODEL_RESOURCE_FLAG.md +1 -1
- package/dist/docs/api/index/variables/STRAIGHT_COS.md +19 -0
- package/dist/docs/api/index/variables/VELOCITY_SAMPLES.md +15 -0
- package/dist/docs/api/index/variables/XR_FINGERS.md +13 -0
- package/dist/docs/api/index/variables/XR_HOVER_SHELL_FLAG.md +15 -0
- package/dist/docs/api/index/variables/webglBackend.md +16 -0
- package/dist/docs/api/typedoc-sidebar.json +1 -1
- package/dist/docs/api/types/type-aliases/AssetInput.md +3 -3
- package/dist/docs/api/types/type-aliases/CheckboxInput.md +3 -3
- package/dist/docs/api/types/type-aliases/ColorInput.md +1 -1
- package/dist/docs/api/types/type-aliases/ComponentInput.md +4 -4
- package/dist/docs/api/types/type-aliases/ComponentKind.md +1 -1
- package/dist/docs/api/types/type-aliases/DropdownInput.md +3 -3
- package/dist/docs/api/types/type-aliases/DropdownOption.md +3 -3
- package/dist/docs/api/types/type-aliases/EcsEntityEditorKind.md +1 -1
- package/dist/docs/api/types/type-aliases/EcsEntityKind.md +10 -2
- package/dist/docs/api/types/type-aliases/EntityId.md +1 -1
- package/dist/docs/api/types/type-aliases/EntityInput.md +3 -3
- package/dist/docs/api/types/type-aliases/FloatInput.md +1 -1
- package/dist/docs/api/types/type-aliases/IntersectionResult.md +3 -3
- package/dist/docs/api/types/type-aliases/ParentLookup.md +3 -3
- package/dist/docs/api/types/type-aliases/SelectionListener.md +1 -1
- package/dist/docs/api/types/type-aliases/SliderInput.md +5 -5
- package/dist/docs/api/types/type-aliases/TextInput.md +1 -1
- package/dist/docs/api/types/type-aliases/ToggleInput.md +1 -1
- package/dist/docs/api/types/type-aliases/Vec3.md +1 -1
- package/dist/docs/api/types/type-aliases/Vector2Input.md +3 -3
- package/dist/docs/api/types/type-aliases/Vector3Input.md +4 -4
- package/dist/docs/api/types/type-aliases/WorldEntityView.md +1 -1
- package/dist/docs/guide/audio-mixing-and-sound-banks.md +71 -0
- package/dist/docs/guide/authoring-a-behaviour.md +3 -3
- package/dist/docs/guide/authoring-a-script-object.md +12 -9
- package/dist/docs/guide/behaviour-data-binding/index.md +11 -11
- package/dist/docs/guide/behaviour-lifecycle.md +9 -0
- package/dist/docs/guide/bone-attachments-and-ik.md +128 -0
- package/dist/docs/guide/component-catalog.md +10 -2
- package/dist/docs/guide/components/light.md +42 -0
- package/dist/docs/guide/components/model.md +32 -3
- package/dist/docs/guide/concepts.md +2 -2
- package/dist/docs/guide/getting-started/creating-objects.md +2 -2
- package/dist/docs/guide/getting-started/editing-objects.md +2 -2
- package/dist/docs/guide/getting-started/editor/ai-agent.md +227 -0
- package/dist/docs/guide/getting-started/editor/hierarchy.md +2 -2
- package/dist/docs/guide/getting-started/editor/index.md +3 -2
- package/dist/docs/guide/getting-started/editor/inspector.md +2 -2
- package/dist/docs/guide/getting-started/editor/scene-inspector.md +3 -3
- package/dist/docs/guide/getting-started/editor/toolbar.md +11 -11
- package/dist/docs/guide/getting-started/editor/viewport.md +17 -9
- package/dist/docs/guide/getting-started/index.md +1 -1
- package/dist/docs/guide/getting-started/installation.md +1 -1
- package/dist/docs/guide/getting-started/preview-and-test.md +7 -7
- package/dist/docs/guide/getting-started/project-types/image-tracking.md +23 -11
- package/dist/docs/guide/getting-started/project-types/index.md +4 -4
- package/dist/docs/guide/getting-started/project-types/vr.md +270 -2
- package/dist/docs/guide/getting-started/projects.md +4 -5
- package/dist/docs/guide/getting-started/shortcuts.md +5 -4
- package/dist/docs/guide/multiplayer.md +92 -0
- package/dist/docs/guide/scene/environment.md +101 -4
- package/dist/docs/guide/scene/index.md +4 -4
- package/dist/docs/guide/scene/postprocessing.md +67 -5
- package/dist/docs/guide/spatial-ui.md +83 -7
- package/dist/docs/guide/spawning/area-light.md +2 -0
- package/dist/docs/guide/systems/environment-sync-system.md +11 -6
- package/dist/docs/guide/systems/light-sync-system.md +5 -3
- package/dist/docs/guide/systems/postprocessing-sync-system.md +16 -6
- package/dist/docs/guide/systems/render-system.md +7 -6
- package/dist/docs/guide/systems/script-behaviour-system.md +7 -5
- package/dist/docs/guide/systems/script-object-system.md +3 -1
- package/dist/docs/guide/systems/video-system.md +1 -1
- package/dist/docs/guide/webgpu-and-tsl.md +415 -0
- package/dist/docs/guide/world-api.md +52 -2
- package/dist/factories/index.cjs +921 -283
- package/dist/factories/index.cjs.map +1 -1
- package/dist/factories/index.d.cts +14 -3
- package/dist/factories/index.d.ts +14 -3
- package/dist/factories/index.js +7 -4
- package/dist/{index-C3ik3sA1.d.ts → index-CAZHrh0q.d.cts} +28 -3
- package/dist/{index-Dlr-7-4m.d.cts → index-CLtSMf2M.d.ts} +28 -3
- package/dist/{index-D2Jt_JzH.d.ts → index-D5MmJNyj.d.ts} +161 -43
- package/dist/{index-DaG03vyN.d.cts → index-DiIjV2lm.d.cts} +161 -43
- package/dist/index.cjs +4959 -1414
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +113 -11
- package/dist/index.d.ts +113 -11
- package/dist/index.js +187 -12
- package/dist/index.js.map +1 -1
- package/dist/network/index.cjs +5069 -0
- package/dist/network/index.cjs.map +1 -0
- package/dist/network/index.d.cts +98 -0
- package/dist/network/index.d.ts +98 -0
- package/dist/network/index.js +493 -0
- package/dist/network/index.js.map +1 -0
- package/dist/systems/index.cjs +5319 -1957
- package/dist/systems/index.cjs.map +1 -1
- package/dist/systems/index.d.cts +4 -2
- package/dist/systems/index.d.ts +4 -2
- package/dist/systems/index.js +8 -4
- package/dist/types.d.cts +3 -1
- package/dist/types.d.ts +3 -1
- package/dist/webgpu/index.d.ts +113 -0
- package/dist/webgpu/index.js +302 -0
- package/dist/webgpu/index.js.map +1 -0
- package/dist/worldSnapshotUtils.d.cts +3 -1
- package/dist/worldSnapshotUtils.d.ts +3 -1
- package/dist/worldSnapshotUtils.js +3 -2
- package/package.json +19 -3
- package/dist/chunk-BUEKOSR5.js.map +0 -1
- package/dist/chunk-DF5SSRN6.js.map +0 -1
- package/dist/chunk-OWQSESTO.js.map +0 -1
- package/dist/chunk-OY7ZODZP.js.map +0 -1
- package/dist/chunk-RXBLOO5B.js.map +0 -1
- package/dist/chunk-WJD2VKEH.js +0 -315
- package/dist/chunk-WJD2VKEH.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/animation/humanoid.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * One vocabulary for humanoid skeletons.\n *\n * Every source names its bones differently: Mixamo `mixamorig:LeftForeArm`,\n * Meshy `LeftForeArm` with its spine numbered top-down (`Spine02` is the\n * LOWEST), Unreal / Quaternius UAL `lowerarm_l` with `spine_01` lowest,\n * Blender rigify `forearm.L`, VRM `leftLowerArm`. Retargeting, the animation\n * editor and bone sockets all need \"the left forearm\" regardless, so a\n * skeleton is mapped once onto VRM's humanoid bone names (the closest thing\n * to a standard) and everything downstream speaks those.\n *\n * Pure data + math, no three.js: the editor's Node tools (gltf-transform\n * documents) and the runtime (THREE.Bone trees) both build a `SkeletonNode`\n * tree and call `detectRig`.\n */\n\nexport type HumanoidBone =\n | \"hips\"\n | \"spine\"\n | \"chest\"\n | \"upperChest\"\n | \"neck\"\n | \"head\"\n | \"leftShoulder\"\n | \"leftUpperArm\"\n | \"leftLowerArm\"\n | \"leftHand\"\n | \"rightShoulder\"\n | \"rightUpperArm\"\n | \"rightLowerArm\"\n | \"rightHand\"\n | \"leftUpperLeg\"\n | \"leftLowerLeg\"\n | \"leftFoot\"\n | \"leftToes\"\n | \"rightUpperLeg\"\n | \"rightLowerLeg\"\n | \"rightFoot\"\n | \"rightToes\"\n | `${\"left\" | \"right\"}${Finger}${FingerJoint}`;\n\ntype Finger = \"Thumb\" | \"Index\" | \"Middle\" | \"Ring\" | \"Little\";\ntype FingerJoint = \"Metacarpal\" | \"Proximal\" | \"Intermediate\" | \"Distal\";\n\n/** The bones a humanoid must have to retarget a full-body clip. */\nexport const REQUIRED_HUMANOID_BONES: readonly HumanoidBone[] = [\n \"hips\",\n \"spine\",\n \"head\",\n \"leftUpperArm\",\n \"leftLowerArm\",\n \"leftHand\",\n \"rightUpperArm\",\n \"rightLowerArm\",\n \"rightHand\",\n \"leftUpperLeg\",\n \"leftLowerLeg\",\n \"leftFoot\",\n \"rightUpperLeg\",\n \"rightLowerLeg\",\n \"rightFoot\",\n];\n\n/** Vector [x, y, z] and quaternion [x, y, z, w]. */\nexport type Vec3 = [number, number, number];\nexport type Quat = [number, number, number, number];\n\n/** A bone (or any node) with its LOCAL rest transform. */\nexport interface SkeletonNode {\n name: string;\n translation: Vec3;\n rotation: Quat;\n scale?: Vec3;\n children: SkeletonNode[];\n}\n\nexport type RigProfile =\n | \"mixamo\"\n | \"meshy\"\n | \"unreal\"\n | \"rigify\"\n | \"vrm\"\n | \"generic\";\n\nexport interface RigDetection {\n profile: RigProfile;\n /** Humanoid bone → the rig's own bone name. */\n bones: Partial<Record<HumanoidBone, string>>;\n /** Rig bone name → humanoid bone. */\n byName: Map<string, HumanoidBone>;\n /** Arms level (T), angled down (A), or neither. */\n restPose: \"T\" | \"A\" | \"unknown\";\n /** Degrees the left upper arm points below horizontal at rest. */\n armDrop: number | null;\n /** Required bones the rig lacks (empty = can retarget). */\n missing: HumanoidBone[];\n}\n\n// ── quaternion helpers ───────────────────────────────────────────────────────\n\nexport const qmul = (a: Quat, b: Quat): Quat => [\n a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n];\nexport const qinv = (q: Quat): Quat => [-q[0], -q[1], -q[2], q[3]];\nexport const qrot = (q: Quat, v: Vec3): Vec3 => {\n const r = qmul(qmul(q, [v[0], v[1], v[2], 0]), qinv(q));\n return [r[0], r[1], r[2]];\n};\n\n/** World (rig-space) rest position of every node, by name. */\nexport function restPositions(root: SkeletonNode): Map<string, Vec3> {\n const out = new Map<string, Vec3>();\n const walk = (n: SkeletonNode, pq: Quat, pp: Vec3, ps: number) => {\n const t = qrot(pq, [n.translation[0] * ps, n.translation[1] * ps, n.translation[2] * ps]);\n const p: Vec3 = [pp[0] + t[0], pp[1] + t[1], pp[2] + t[2]];\n out.set(n.name, p);\n const q = qmul(pq, n.rotation);\n const s = ps * (n.scale?.[0] ?? 1);\n for (const c of n.children) walk(c, q, p, s);\n };\n walk(root, [0, 0, 0, 1], [0, 0, 0], 1);\n return out;\n}\n\n// ── names ────────────────────────────────────────────────────────────────────\n\n/**\n * `mixamorig1:LeftForeArm` → { side: \"left\", base: \"forearm\" };\n * `upperarm_l` → { side: \"left\", base: \"upperarm\" }; `forearm.L` → left.\n */\nexport function splitBoneName(raw: string): { side: \"left\" | \"right\" | null; base: string } {\n let n = raw\n .replace(/^.*[:|]/, \"\") // mixamorig:, Armature|, rig:\n .replace(/^(mixamorig\\d*|def[-_]|org[-_]|mch[-_]|bip\\d*[ _]|b[-_])/i, \"\")\n .trim();\n let side: \"left\" | \"right\" | null = null;\n const sided = [\n [/^left[\\s_.-]*/i, \"left\"],\n [/^right[\\s_.-]*/i, \"right\"],\n [/^l[\\s_.-]+/i, \"left\"],\n [/^r[\\s_.-]+/i, \"right\"],\n [/[\\s_.-]+l$/i, \"left\"],\n [/[\\s_.-]+r$/i, \"right\"],\n [/[\\s_.-]*left$/i, \"left\"],\n [/[\\s_.-]*right$/i, \"right\"],\n ] as const;\n for (const [re, s] of sided) {\n if (re.test(n)) {\n side = s;\n n = n.replace(re, \"\");\n break;\n }\n }\n return { side, base: n.toLowerCase().replace(/[^a-z0-9]/g, \"\") };\n}\n\n/** Bases for sided limb bones. Order matters: first match wins. */\nconst LIMB_BASES: Array<[RegExp, string]> = [\n [/^(shoulder|clavicle|collar(bone)?)$/, \"Shoulder\"],\n [/^(upperarm|uparm|arm)$/, \"UpperArm\"],\n [/^(forearm|lowerarm|elbow|loarm)$/, \"LowerArm\"],\n [/^(hand|wrist)$/, \"Hand\"],\n [/^(upleg|upperleg|thigh|hipjoint)$/, \"UpperLeg\"],\n [/^(leg|lowerleg|calf|shin|knee)$/, \"LowerLeg\"],\n [/^(foot|ankle)$/, \"Foot\"],\n [/^(toebase|toe|toes|ball)$/, \"Toes\"],\n];\n\nconst FINGERS: Array<[RegExp, Finger]> = [\n [/^thumb/, \"Thumb\"],\n [/^(index|pointer)/, \"Index\"],\n [/^(middle|fingers)/, \"Middle\"],\n [/^ring/, \"Ring\"],\n [/^(pinky|little|small)/, \"Little\"],\n];\n\nfunction fingerJoint(finger: Finger, digits: string): FingerJoint | null {\n // Mixamo/UE number 1-3 (4 = tip); a bare \"Thumb\"/\"Fingers\" (Meshy after\n // fix-rig) is the first joint.\n const n = digits === \"\" ? 1 : Number(digits);\n const joints: FingerJoint[] =\n finger === \"Thumb\"\n ? [\"Metacarpal\", \"Proximal\", \"Distal\"]\n : [\"Proximal\", \"Intermediate\", \"Distal\"];\n return joints[n - 1] ?? null;\n}\n\n/** A sided bone from its name alone, or null. */\nfunction sidedBone(base: string, side: \"left\" | \"right\"): HumanoidBone | null {\n for (const [re, part] of LIMB_BASES) {\n if (re.test(base)) return `${side}${part}` as HumanoidBone;\n }\n // Mixamo writes fingers as LeftHandIndex1.\n const f = base.replace(/^hand(?=(thumb|index|middle|ring|pinky|little))/, \"\");\n for (const [re, finger] of FINGERS) {\n if (!re.test(f)) continue;\n const digits = /(\\d+)$/.exec(f)?.[1] ?? \"\";\n const joint = fingerJoint(finger, digits.replace(/^0+/, \"\"));\n return joint ? (`${side}${finger}${joint}` as HumanoidBone) : null;\n }\n return null;\n}\n\n// VRM names, recognised directly (leftUpperArm → lowercase \"leftupperarm\").\nconst VRM_LOWER = new Map<string, HumanoidBone>();\n\nconst VRM_FINGER = /^(left|right)(Thumb|Index|Middle|Ring|Little)(Metacarpal|Proximal|Intermediate|Distal)$/;\n\nfunction vrmBone(raw: string): HumanoidBone | null {\n const name = raw.replace(/^.*[:|]/, \"\");\n if (VRM_FINGER.test(name)) return name as HumanoidBone;\n if (VRM_LOWER.size === 0) {\n const sides = [\"left\", \"right\"] as const;\n const parts = [\"Shoulder\", \"UpperArm\", \"LowerArm\", \"Hand\", \"UpperLeg\", \"LowerLeg\", \"Foot\", \"Toes\"];\n for (const s of sides) for (const p of parts) VRM_LOWER.set(`${s}${p}`.toLowerCase(), `${s}${p}` as HumanoidBone);\n for (const b of [\"hips\", \"spine\", \"chest\", \"upperChest\", \"neck\", \"head\"] as const)\n VRM_LOWER.set(b.toLowerCase(), b);\n }\n return VRM_LOWER.get(name.toLowerCase()) ?? null;\n}\n\nfunction profileOf(names: string[]): RigProfile {\n if (names.some((n) => /^mixamorig/i.test(n))) return \"mixamo\";\n if (names.some((n) => /^(upperarm|lowerarm|thigh|calf)_[lr]$/i.test(n))) return \"unreal\";\n if (names.some((n) => /\\.[LR]$/.test(n))) return \"rigify\";\n if (names.some((n) => /^leftUpperArm$/.test(n))) return \"vrm\";\n if (names.some((n) => /^Spine0[12]$/.test(n))) return \"meshy\";\n return \"generic\";\n}\n\nfunction findHips(root: SkeletonNode): SkeletonNode | null {\n let found: SkeletonNode | null = null;\n const walk = (n: SkeletonNode) => {\n if (found) return;\n const { base } = splitBoneName(n.name);\n if (/^(hips|hip|pelvis)$/.test(base)) {\n found = n;\n return;\n }\n for (const c of n.children) walk(c);\n };\n walk(root);\n return found;\n}\n\nconst isSpineLike = (base: string) => /^(spine|chest|upperchest|torso|back)\\d*$/.test(base);\n\n/**\n * Map a skeleton onto humanoid bones. Pass the scene root (the armature's\n * own transform included): the rest-pose check measures \"down\" in that space,\n * and a Mixamo armature is Z-up under a 90° turn.\n *\n * Limbs and fingers come from their names (any of the conventions above, side\n * from prefixes/suffixes, or from which side of the body they sit when the\n * name has none). The spine comes from the CHAIN between the hips and the\n * neck, not from names, because conventions number it in opposite\n * directions: its first bone is `spine`, the second `chest`, a third\n * `upperChest`.\n */\nexport function detectRig(root: SkeletonNode): RigDetection {\n const all: SkeletonNode[] = [];\n const collect = (n: SkeletonNode) => {\n all.push(n);\n for (const c of n.children) collect(c);\n };\n collect(root);\n const profile = profileOf(all.map((n) => n.name));\n const bones: Partial<Record<HumanoidBone, string>> = {};\n const set = (b: HumanoidBone, name: string) => {\n if (!bones[b]) bones[b] = name;\n };\n\n const hips = findHips(root);\n const positions = restPositions(root);\n if (hips) {\n set(\"hips\", hips.name);\n // The spine chain: follow spine-like children upward from the hips.\n const chain: SkeletonNode[] = [];\n let cur: SkeletonNode | undefined = hips;\n while (cur) {\n const next: SkeletonNode | undefined = cur.children.find((c) => isSpineLike(splitBoneName(c.name).base));\n if (!next) break;\n chain.push(next);\n cur = next;\n }\n if (chain[0]) set(\"spine\", chain[0].name);\n if (chain[1]) set(\"chest\", chain[1].name);\n if (chain[2]) set(\"upperChest\", chain[chain.length - 1].name);\n }\n\n for (const n of all) {\n const vrm = vrmBone(n.name);\n if (vrm) {\n set(vrm, n.name);\n continue;\n }\n const { side, base } = splitBoneName(n.name);\n if (/^neck\\d*$/.test(base)) {\n set(\"neck\", n.name);\n continue;\n }\n if (/^head$/.test(base)) {\n set(\"head\", n.name);\n continue;\n }\n if (base === \"hips\" || base === \"pelvis\" || isSpineLike(base)) continue;\n // No side in the name: decide by which side of the hips it sits (glTF\n // humanoids face +Z, so their left is +X).\n const s =\n side ??\n (() => {\n const p = positions.get(n.name);\n const h = hips ? positions.get(hips.name) : undefined;\n if (!p || !h || Math.abs(p[0] - h[0]) < 1e-4) return null;\n return p[0] > h[0] ? \"left\" : \"right\";\n })();\n if (!s) continue;\n const b = sidedBone(base, s);\n if (b) set(b, n.name);\n }\n\n const byName = new Map<string, HumanoidBone>();\n for (const [b, name] of Object.entries(bones)) byName.set(name as string, b as HumanoidBone);\n\n // Rest pose from the left upper arm's direction.\n let armDrop: number | null = null;\n const ua = bones.leftUpperArm && positions.get(bones.leftUpperArm);\n const la = bones.leftLowerArm && positions.get(bones.leftLowerArm);\n if (ua && la) {\n const d: Vec3 = [la[0] - ua[0], la[1] - ua[1], la[2] - ua[2]];\n const len = Math.hypot(d[0], d[1], d[2]) || 1;\n armDrop = (Math.asin(Math.max(-1, Math.min(1, -d[1] / len))) * 180) / Math.PI;\n }\n const restPose = armDrop === null ? \"unknown\" : armDrop < 15 ? \"T\" : armDrop <= 65 ? \"A\" : \"unknown\";\n\n return {\n profile,\n bones,\n byName,\n restPose,\n armDrop,\n missing: REQUIRED_HUMANOID_BONES.filter((b) => !bones[b]),\n };\n}\n\n/** The same bone on the other side (`leftHand` ↔ `rightHand`). */\nexport function mirrorHumanoidBone(b: HumanoidBone): HumanoidBone {\n if (b.startsWith(\"left\")) return `right${b.slice(4)}` as HumanoidBone;\n if (b.startsWith(\"right\")) return `left${b.slice(5)}` as HumanoidBone;\n return b;\n}\n\n/**\n * Duck-typed adapter for a three.js Object3D/Bone tree (position: Vector3,\n * quaternion: Quaternion), so the runtime can call `detectRig` without this\n * module importing three.\n */\nexport function skeletonFromObject3D(object: {\n name: string;\n position: { x: number; y: number; z: number };\n quaternion: { x: number; y: number; z: number; w: number };\n scale?: { x: number; y: number; z: number };\n children: unknown[];\n}): SkeletonNode {\n const o = object;\n return {\n name: o.name,\n translation: [o.position.x, o.position.y, o.position.z],\n rotation: [o.quaternion.x, o.quaternion.y, o.quaternion.z, o.quaternion.w],\n scale: o.scale ? [o.scale.x, o.scale.y, o.scale.z] : undefined,\n children: (o.children as (typeof object)[]).map(skeletonFromObject3D),\n };\n}\n"]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One vocabulary for humanoid skeletons.
|
|
3
|
+
*
|
|
4
|
+
* Every source names its bones differently: Mixamo `mixamorig:LeftForeArm`,
|
|
5
|
+
* Meshy `LeftForeArm` with its spine numbered top-down (`Spine02` is the
|
|
6
|
+
* LOWEST), Unreal / Quaternius UAL `lowerarm_l` with `spine_01` lowest,
|
|
7
|
+
* Blender rigify `forearm.L`, VRM `leftLowerArm`. Retargeting, the animation
|
|
8
|
+
* editor and bone sockets all need "the left forearm" regardless, so a
|
|
9
|
+
* skeleton is mapped once onto VRM's humanoid bone names (the closest thing
|
|
10
|
+
* to a standard) and everything downstream speaks those.
|
|
11
|
+
*
|
|
12
|
+
* Pure data + math, no three.js: the editor's Node tools (gltf-transform
|
|
13
|
+
* documents) and the runtime (THREE.Bone trees) both build a `SkeletonNode`
|
|
14
|
+
* tree and call `detectRig`.
|
|
15
|
+
*/
|
|
16
|
+
type HumanoidBone = "hips" | "spine" | "chest" | "upperChest" | "neck" | "head" | "leftShoulder" | "leftUpperArm" | "leftLowerArm" | "leftHand" | "rightShoulder" | "rightUpperArm" | "rightLowerArm" | "rightHand" | "leftUpperLeg" | "leftLowerLeg" | "leftFoot" | "leftToes" | "rightUpperLeg" | "rightLowerLeg" | "rightFoot" | "rightToes" | `${"left" | "right"}${Finger}${FingerJoint}`;
|
|
17
|
+
type Finger = "Thumb" | "Index" | "Middle" | "Ring" | "Little";
|
|
18
|
+
type FingerJoint = "Metacarpal" | "Proximal" | "Intermediate" | "Distal";
|
|
19
|
+
/** The bones a humanoid must have to retarget a full-body clip. */
|
|
20
|
+
declare const REQUIRED_HUMANOID_BONES: readonly HumanoidBone[];
|
|
21
|
+
/** Vector [x, y, z] and quaternion [x, y, z, w]. */
|
|
22
|
+
type Vec3 = [number, number, number];
|
|
23
|
+
type Quat = [number, number, number, number];
|
|
24
|
+
/** A bone (or any node) with its LOCAL rest transform. */
|
|
25
|
+
interface SkeletonNode {
|
|
26
|
+
name: string;
|
|
27
|
+
translation: Vec3;
|
|
28
|
+
rotation: Quat;
|
|
29
|
+
scale?: Vec3;
|
|
30
|
+
children: SkeletonNode[];
|
|
31
|
+
}
|
|
32
|
+
type RigProfile = "mixamo" | "meshy" | "unreal" | "rigify" | "vrm" | "generic";
|
|
33
|
+
interface RigDetection {
|
|
34
|
+
profile: RigProfile;
|
|
35
|
+
/** Humanoid bone → the rig's own bone name. */
|
|
36
|
+
bones: Partial<Record<HumanoidBone, string>>;
|
|
37
|
+
/** Rig bone name → humanoid bone. */
|
|
38
|
+
byName: Map<string, HumanoidBone>;
|
|
39
|
+
/** Arms level (T), angled down (A), or neither. */
|
|
40
|
+
restPose: "T" | "A" | "unknown";
|
|
41
|
+
/** Degrees the left upper arm points below horizontal at rest. */
|
|
42
|
+
armDrop: number | null;
|
|
43
|
+
/** Required bones the rig lacks (empty = can retarget). */
|
|
44
|
+
missing: HumanoidBone[];
|
|
45
|
+
}
|
|
46
|
+
declare const qmul: (a: Quat, b: Quat) => Quat;
|
|
47
|
+
declare const qinv: (q: Quat) => Quat;
|
|
48
|
+
declare const qrot: (q: Quat, v: Vec3) => Vec3;
|
|
49
|
+
/** World (rig-space) rest position of every node, by name. */
|
|
50
|
+
declare function restPositions(root: SkeletonNode): Map<string, Vec3>;
|
|
51
|
+
/**
|
|
52
|
+
* `mixamorig1:LeftForeArm` → { side: "left", base: "forearm" };
|
|
53
|
+
* `upperarm_l` → { side: "left", base: "upperarm" }; `forearm.L` → left.
|
|
54
|
+
*/
|
|
55
|
+
declare function splitBoneName(raw: string): {
|
|
56
|
+
side: "left" | "right" | null;
|
|
57
|
+
base: string;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Map a skeleton onto humanoid bones. Pass the scene root (the armature's
|
|
61
|
+
* own transform included): the rest-pose check measures "down" in that space,
|
|
62
|
+
* and a Mixamo armature is Z-up under a 90° turn.
|
|
63
|
+
*
|
|
64
|
+
* Limbs and fingers come from their names (any of the conventions above, side
|
|
65
|
+
* from prefixes/suffixes, or from which side of the body they sit when the
|
|
66
|
+
* name has none). The spine comes from the CHAIN between the hips and the
|
|
67
|
+
* neck, not from names, because conventions number it in opposite
|
|
68
|
+
* directions: its first bone is `spine`, the second `chest`, a third
|
|
69
|
+
* `upperChest`.
|
|
70
|
+
*/
|
|
71
|
+
declare function detectRig(root: SkeletonNode): RigDetection;
|
|
72
|
+
/** The same bone on the other side (`leftHand` ↔ `rightHand`). */
|
|
73
|
+
declare function mirrorHumanoidBone(b: HumanoidBone): HumanoidBone;
|
|
74
|
+
/**
|
|
75
|
+
* Duck-typed adapter for a three.js Object3D/Bone tree (position: Vector3,
|
|
76
|
+
* quaternion: Quaternion), so the runtime can call `detectRig` without this
|
|
77
|
+
* module importing three.
|
|
78
|
+
*/
|
|
79
|
+
declare function skeletonFromObject3D(object: {
|
|
80
|
+
name: string;
|
|
81
|
+
position: {
|
|
82
|
+
x: number;
|
|
83
|
+
y: number;
|
|
84
|
+
z: number;
|
|
85
|
+
};
|
|
86
|
+
quaternion: {
|
|
87
|
+
x: number;
|
|
88
|
+
y: number;
|
|
89
|
+
z: number;
|
|
90
|
+
w: number;
|
|
91
|
+
};
|
|
92
|
+
scale?: {
|
|
93
|
+
x: number;
|
|
94
|
+
y: number;
|
|
95
|
+
z: number;
|
|
96
|
+
};
|
|
97
|
+
children: unknown[];
|
|
98
|
+
}): SkeletonNode;
|
|
99
|
+
|
|
100
|
+
export { type HumanoidBone, type Quat, REQUIRED_HUMANOID_BONES, type RigDetection, type RigProfile, type SkeletonNode, type Vec3, detectRig, mirrorHumanoidBone, qinv, qmul, qrot, restPositions, skeletonFromObject3D, splitBoneName };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One vocabulary for humanoid skeletons.
|
|
3
|
+
*
|
|
4
|
+
* Every source names its bones differently: Mixamo `mixamorig:LeftForeArm`,
|
|
5
|
+
* Meshy `LeftForeArm` with its spine numbered top-down (`Spine02` is the
|
|
6
|
+
* LOWEST), Unreal / Quaternius UAL `lowerarm_l` with `spine_01` lowest,
|
|
7
|
+
* Blender rigify `forearm.L`, VRM `leftLowerArm`. Retargeting, the animation
|
|
8
|
+
* editor and bone sockets all need "the left forearm" regardless, so a
|
|
9
|
+
* skeleton is mapped once onto VRM's humanoid bone names (the closest thing
|
|
10
|
+
* to a standard) and everything downstream speaks those.
|
|
11
|
+
*
|
|
12
|
+
* Pure data + math, no three.js: the editor's Node tools (gltf-transform
|
|
13
|
+
* documents) and the runtime (THREE.Bone trees) both build a `SkeletonNode`
|
|
14
|
+
* tree and call `detectRig`.
|
|
15
|
+
*/
|
|
16
|
+
type HumanoidBone = "hips" | "spine" | "chest" | "upperChest" | "neck" | "head" | "leftShoulder" | "leftUpperArm" | "leftLowerArm" | "leftHand" | "rightShoulder" | "rightUpperArm" | "rightLowerArm" | "rightHand" | "leftUpperLeg" | "leftLowerLeg" | "leftFoot" | "leftToes" | "rightUpperLeg" | "rightLowerLeg" | "rightFoot" | "rightToes" | `${"left" | "right"}${Finger}${FingerJoint}`;
|
|
17
|
+
type Finger = "Thumb" | "Index" | "Middle" | "Ring" | "Little";
|
|
18
|
+
type FingerJoint = "Metacarpal" | "Proximal" | "Intermediate" | "Distal";
|
|
19
|
+
/** The bones a humanoid must have to retarget a full-body clip. */
|
|
20
|
+
declare const REQUIRED_HUMANOID_BONES: readonly HumanoidBone[];
|
|
21
|
+
/** Vector [x, y, z] and quaternion [x, y, z, w]. */
|
|
22
|
+
type Vec3 = [number, number, number];
|
|
23
|
+
type Quat = [number, number, number, number];
|
|
24
|
+
/** A bone (or any node) with its LOCAL rest transform. */
|
|
25
|
+
interface SkeletonNode {
|
|
26
|
+
name: string;
|
|
27
|
+
translation: Vec3;
|
|
28
|
+
rotation: Quat;
|
|
29
|
+
scale?: Vec3;
|
|
30
|
+
children: SkeletonNode[];
|
|
31
|
+
}
|
|
32
|
+
type RigProfile = "mixamo" | "meshy" | "unreal" | "rigify" | "vrm" | "generic";
|
|
33
|
+
interface RigDetection {
|
|
34
|
+
profile: RigProfile;
|
|
35
|
+
/** Humanoid bone → the rig's own bone name. */
|
|
36
|
+
bones: Partial<Record<HumanoidBone, string>>;
|
|
37
|
+
/** Rig bone name → humanoid bone. */
|
|
38
|
+
byName: Map<string, HumanoidBone>;
|
|
39
|
+
/** Arms level (T), angled down (A), or neither. */
|
|
40
|
+
restPose: "T" | "A" | "unknown";
|
|
41
|
+
/** Degrees the left upper arm points below horizontal at rest. */
|
|
42
|
+
armDrop: number | null;
|
|
43
|
+
/** Required bones the rig lacks (empty = can retarget). */
|
|
44
|
+
missing: HumanoidBone[];
|
|
45
|
+
}
|
|
46
|
+
declare const qmul: (a: Quat, b: Quat) => Quat;
|
|
47
|
+
declare const qinv: (q: Quat) => Quat;
|
|
48
|
+
declare const qrot: (q: Quat, v: Vec3) => Vec3;
|
|
49
|
+
/** World (rig-space) rest position of every node, by name. */
|
|
50
|
+
declare function restPositions(root: SkeletonNode): Map<string, Vec3>;
|
|
51
|
+
/**
|
|
52
|
+
* `mixamorig1:LeftForeArm` → { side: "left", base: "forearm" };
|
|
53
|
+
* `upperarm_l` → { side: "left", base: "upperarm" }; `forearm.L` → left.
|
|
54
|
+
*/
|
|
55
|
+
declare function splitBoneName(raw: string): {
|
|
56
|
+
side: "left" | "right" | null;
|
|
57
|
+
base: string;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Map a skeleton onto humanoid bones. Pass the scene root (the armature's
|
|
61
|
+
* own transform included): the rest-pose check measures "down" in that space,
|
|
62
|
+
* and a Mixamo armature is Z-up under a 90° turn.
|
|
63
|
+
*
|
|
64
|
+
* Limbs and fingers come from their names (any of the conventions above, side
|
|
65
|
+
* from prefixes/suffixes, or from which side of the body they sit when the
|
|
66
|
+
* name has none). The spine comes from the CHAIN between the hips and the
|
|
67
|
+
* neck, not from names, because conventions number it in opposite
|
|
68
|
+
* directions: its first bone is `spine`, the second `chest`, a third
|
|
69
|
+
* `upperChest`.
|
|
70
|
+
*/
|
|
71
|
+
declare function detectRig(root: SkeletonNode): RigDetection;
|
|
72
|
+
/** The same bone on the other side (`leftHand` ↔ `rightHand`). */
|
|
73
|
+
declare function mirrorHumanoidBone(b: HumanoidBone): HumanoidBone;
|
|
74
|
+
/**
|
|
75
|
+
* Duck-typed adapter for a three.js Object3D/Bone tree (position: Vector3,
|
|
76
|
+
* quaternion: Quaternion), so the runtime can call `detectRig` without this
|
|
77
|
+
* module importing three.
|
|
78
|
+
*/
|
|
79
|
+
declare function skeletonFromObject3D(object: {
|
|
80
|
+
name: string;
|
|
81
|
+
position: {
|
|
82
|
+
x: number;
|
|
83
|
+
y: number;
|
|
84
|
+
z: number;
|
|
85
|
+
};
|
|
86
|
+
quaternion: {
|
|
87
|
+
x: number;
|
|
88
|
+
y: number;
|
|
89
|
+
z: number;
|
|
90
|
+
w: number;
|
|
91
|
+
};
|
|
92
|
+
scale?: {
|
|
93
|
+
x: number;
|
|
94
|
+
y: number;
|
|
95
|
+
z: number;
|
|
96
|
+
};
|
|
97
|
+
children: unknown[];
|
|
98
|
+
}): SkeletonNode;
|
|
99
|
+
|
|
100
|
+
export { type HumanoidBone, type Quat, REQUIRED_HUMANOID_BONES, type RigDetection, type RigProfile, type SkeletonNode, type Vec3, detectRig, mirrorHumanoidBone, qinv, qmul, qrot, restPositions, skeletonFromObject3D, splitBoneName };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { __name } from './chunk-XE4OXN2W.js';
|
|
2
|
+
|
|
3
|
+
// core/Component.ts
|
|
4
|
+
var _Component = class _Component {
|
|
5
|
+
};
|
|
6
|
+
__name(_Component, "Component");
|
|
7
|
+
var Component = _Component;
|
|
8
|
+
|
|
9
|
+
export { Component };
|
|
10
|
+
//# sourceMappingURL=chunk-CKTHDXPS.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-CKTHDXPS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../core/Component.ts"],"names":[],"mappings":";;;AAWO,IAAM,UAAA,GAAN,MAAM,UAAA,CAAU;AAAC,CAAA;AAAD,MAAA,CAAA,UAAA,EAAA,WAAA,CAAA;AAAhB,IAAM,SAAA,GAAN","file":"chunk-CKTHDXPS.js","sourcesContent":["/**\n * Marker base class for every ECS component. Subclass `Component` to declare\n * a typed data container that systems can query.\n *\n * @remarks\n * Components own state only — runtime behaviour belongs in {@link Behaviour}\n * subclasses for user scripts. Keep fields plain (numbers, strings, vectors,\n * asset URLs).\n *\n * @category Components\n */\nexport class Component {}\n\n"]}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { __name } from './chunk-XE4OXN2W.js';
|
|
2
|
+
|
|
3
|
+
// core/animation/humanoid.ts
|
|
4
|
+
var REQUIRED_HUMANOID_BONES = [
|
|
5
|
+
"hips",
|
|
6
|
+
"spine",
|
|
7
|
+
"head",
|
|
8
|
+
"leftUpperArm",
|
|
9
|
+
"leftLowerArm",
|
|
10
|
+
"leftHand",
|
|
11
|
+
"rightUpperArm",
|
|
12
|
+
"rightLowerArm",
|
|
13
|
+
"rightHand",
|
|
14
|
+
"leftUpperLeg",
|
|
15
|
+
"leftLowerLeg",
|
|
16
|
+
"leftFoot",
|
|
17
|
+
"rightUpperLeg",
|
|
18
|
+
"rightLowerLeg",
|
|
19
|
+
"rightFoot"
|
|
20
|
+
];
|
|
21
|
+
var qmul = /* @__PURE__ */ __name((a, b) => [
|
|
22
|
+
a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],
|
|
23
|
+
a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],
|
|
24
|
+
a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],
|
|
25
|
+
a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2]
|
|
26
|
+
], "qmul");
|
|
27
|
+
var qinv = /* @__PURE__ */ __name((q) => [-q[0], -q[1], -q[2], q[3]], "qinv");
|
|
28
|
+
var qrot = /* @__PURE__ */ __name((q, v) => {
|
|
29
|
+
const r = qmul(qmul(q, [v[0], v[1], v[2], 0]), qinv(q));
|
|
30
|
+
return [r[0], r[1], r[2]];
|
|
31
|
+
}, "qrot");
|
|
32
|
+
function restPositions(root) {
|
|
33
|
+
const out = /* @__PURE__ */ new Map();
|
|
34
|
+
const walk = /* @__PURE__ */ __name((n, pq, pp, ps) => {
|
|
35
|
+
const t = qrot(pq, [n.translation[0] * ps, n.translation[1] * ps, n.translation[2] * ps]);
|
|
36
|
+
const p = [pp[0] + t[0], pp[1] + t[1], pp[2] + t[2]];
|
|
37
|
+
out.set(n.name, p);
|
|
38
|
+
const q = qmul(pq, n.rotation);
|
|
39
|
+
const s = ps * (n.scale?.[0] ?? 1);
|
|
40
|
+
for (const c of n.children) walk(c, q, p, s);
|
|
41
|
+
}, "walk");
|
|
42
|
+
walk(root, [0, 0, 0, 1], [0, 0, 0], 1);
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
__name(restPositions, "restPositions");
|
|
46
|
+
function splitBoneName(raw) {
|
|
47
|
+
let n = raw.replace(/^.*[:|]/, "").replace(/^(mixamorig\d*|def[-_]|org[-_]|mch[-_]|bip\d*[ _]|b[-_])/i, "").trim();
|
|
48
|
+
let side = null;
|
|
49
|
+
const sided = [
|
|
50
|
+
[/^left[\s_.-]*/i, "left"],
|
|
51
|
+
[/^right[\s_.-]*/i, "right"],
|
|
52
|
+
[/^l[\s_.-]+/i, "left"],
|
|
53
|
+
[/^r[\s_.-]+/i, "right"],
|
|
54
|
+
[/[\s_.-]+l$/i, "left"],
|
|
55
|
+
[/[\s_.-]+r$/i, "right"],
|
|
56
|
+
[/[\s_.-]*left$/i, "left"],
|
|
57
|
+
[/[\s_.-]*right$/i, "right"]
|
|
58
|
+
];
|
|
59
|
+
for (const [re, s] of sided) {
|
|
60
|
+
if (re.test(n)) {
|
|
61
|
+
side = s;
|
|
62
|
+
n = n.replace(re, "");
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { side, base: n.toLowerCase().replace(/[^a-z0-9]/g, "") };
|
|
67
|
+
}
|
|
68
|
+
__name(splitBoneName, "splitBoneName");
|
|
69
|
+
var LIMB_BASES = [
|
|
70
|
+
[/^(shoulder|clavicle|collar(bone)?)$/, "Shoulder"],
|
|
71
|
+
[/^(upperarm|uparm|arm)$/, "UpperArm"],
|
|
72
|
+
[/^(forearm|lowerarm|elbow|loarm)$/, "LowerArm"],
|
|
73
|
+
[/^(hand|wrist)$/, "Hand"],
|
|
74
|
+
[/^(upleg|upperleg|thigh|hipjoint)$/, "UpperLeg"],
|
|
75
|
+
[/^(leg|lowerleg|calf|shin|knee)$/, "LowerLeg"],
|
|
76
|
+
[/^(foot|ankle)$/, "Foot"],
|
|
77
|
+
[/^(toebase|toe|toes|ball)$/, "Toes"]
|
|
78
|
+
];
|
|
79
|
+
var FINGERS = [
|
|
80
|
+
[/^thumb/, "Thumb"],
|
|
81
|
+
[/^(index|pointer)/, "Index"],
|
|
82
|
+
[/^(middle|fingers)/, "Middle"],
|
|
83
|
+
[/^ring/, "Ring"],
|
|
84
|
+
[/^(pinky|little|small)/, "Little"]
|
|
85
|
+
];
|
|
86
|
+
function fingerJoint(finger, digits) {
|
|
87
|
+
const n = digits === "" ? 1 : Number(digits);
|
|
88
|
+
const joints = finger === "Thumb" ? ["Metacarpal", "Proximal", "Distal"] : ["Proximal", "Intermediate", "Distal"];
|
|
89
|
+
return joints[n - 1] ?? null;
|
|
90
|
+
}
|
|
91
|
+
__name(fingerJoint, "fingerJoint");
|
|
92
|
+
function sidedBone(base, side) {
|
|
93
|
+
for (const [re, part] of LIMB_BASES) {
|
|
94
|
+
if (re.test(base)) return `${side}${part}`;
|
|
95
|
+
}
|
|
96
|
+
const f = base.replace(/^hand(?=(thumb|index|middle|ring|pinky|little))/, "");
|
|
97
|
+
for (const [re, finger] of FINGERS) {
|
|
98
|
+
if (!re.test(f)) continue;
|
|
99
|
+
const digits = /(\d+)$/.exec(f)?.[1] ?? "";
|
|
100
|
+
const joint = fingerJoint(finger, digits.replace(/^0+/, ""));
|
|
101
|
+
return joint ? `${side}${finger}${joint}` : null;
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
__name(sidedBone, "sidedBone");
|
|
106
|
+
var VRM_LOWER = /* @__PURE__ */ new Map();
|
|
107
|
+
var VRM_FINGER = /^(left|right)(Thumb|Index|Middle|Ring|Little)(Metacarpal|Proximal|Intermediate|Distal)$/;
|
|
108
|
+
function vrmBone(raw) {
|
|
109
|
+
const name = raw.replace(/^.*[:|]/, "");
|
|
110
|
+
if (VRM_FINGER.test(name)) return name;
|
|
111
|
+
if (VRM_LOWER.size === 0) {
|
|
112
|
+
const sides = ["left", "right"];
|
|
113
|
+
const parts = ["Shoulder", "UpperArm", "LowerArm", "Hand", "UpperLeg", "LowerLeg", "Foot", "Toes"];
|
|
114
|
+
for (const s of sides) for (const p of parts) VRM_LOWER.set(`${s}${p}`.toLowerCase(), `${s}${p}`);
|
|
115
|
+
for (const b of ["hips", "spine", "chest", "upperChest", "neck", "head"])
|
|
116
|
+
VRM_LOWER.set(b.toLowerCase(), b);
|
|
117
|
+
}
|
|
118
|
+
return VRM_LOWER.get(name.toLowerCase()) ?? null;
|
|
119
|
+
}
|
|
120
|
+
__name(vrmBone, "vrmBone");
|
|
121
|
+
function profileOf(names) {
|
|
122
|
+
if (names.some((n) => /^mixamorig/i.test(n))) return "mixamo";
|
|
123
|
+
if (names.some((n) => /^(upperarm|lowerarm|thigh|calf)_[lr]$/i.test(n))) return "unreal";
|
|
124
|
+
if (names.some((n) => /\.[LR]$/.test(n))) return "rigify";
|
|
125
|
+
if (names.some((n) => /^leftUpperArm$/.test(n))) return "vrm";
|
|
126
|
+
if (names.some((n) => /^Spine0[12]$/.test(n))) return "meshy";
|
|
127
|
+
return "generic";
|
|
128
|
+
}
|
|
129
|
+
__name(profileOf, "profileOf");
|
|
130
|
+
function findHips(root) {
|
|
131
|
+
let found = null;
|
|
132
|
+
const walk = /* @__PURE__ */ __name((n) => {
|
|
133
|
+
if (found) return;
|
|
134
|
+
const { base } = splitBoneName(n.name);
|
|
135
|
+
if (/^(hips|hip|pelvis)$/.test(base)) {
|
|
136
|
+
found = n;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
for (const c of n.children) walk(c);
|
|
140
|
+
}, "walk");
|
|
141
|
+
walk(root);
|
|
142
|
+
return found;
|
|
143
|
+
}
|
|
144
|
+
__name(findHips, "findHips");
|
|
145
|
+
var isSpineLike = /* @__PURE__ */ __name((base) => /^(spine|chest|upperchest|torso|back)\d*$/.test(base), "isSpineLike");
|
|
146
|
+
function detectRig(root) {
|
|
147
|
+
const all = [];
|
|
148
|
+
const collect = /* @__PURE__ */ __name((n) => {
|
|
149
|
+
all.push(n);
|
|
150
|
+
for (const c of n.children) collect(c);
|
|
151
|
+
}, "collect");
|
|
152
|
+
collect(root);
|
|
153
|
+
const profile = profileOf(all.map((n) => n.name));
|
|
154
|
+
const bones = {};
|
|
155
|
+
const set = /* @__PURE__ */ __name((b, name) => {
|
|
156
|
+
if (!bones[b]) bones[b] = name;
|
|
157
|
+
}, "set");
|
|
158
|
+
const hips = findHips(root);
|
|
159
|
+
const positions = restPositions(root);
|
|
160
|
+
if (hips) {
|
|
161
|
+
set("hips", hips.name);
|
|
162
|
+
const chain = [];
|
|
163
|
+
let cur = hips;
|
|
164
|
+
while (cur) {
|
|
165
|
+
const next = cur.children.find((c) => isSpineLike(splitBoneName(c.name).base));
|
|
166
|
+
if (!next) break;
|
|
167
|
+
chain.push(next);
|
|
168
|
+
cur = next;
|
|
169
|
+
}
|
|
170
|
+
if (chain[0]) set("spine", chain[0].name);
|
|
171
|
+
if (chain[1]) set("chest", chain[1].name);
|
|
172
|
+
if (chain[2]) set("upperChest", chain[chain.length - 1].name);
|
|
173
|
+
}
|
|
174
|
+
for (const n of all) {
|
|
175
|
+
const vrm = vrmBone(n.name);
|
|
176
|
+
if (vrm) {
|
|
177
|
+
set(vrm, n.name);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const { side, base } = splitBoneName(n.name);
|
|
181
|
+
if (/^neck\d*$/.test(base)) {
|
|
182
|
+
set("neck", n.name);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (/^head$/.test(base)) {
|
|
186
|
+
set("head", n.name);
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (base === "hips" || base === "pelvis" || isSpineLike(base)) continue;
|
|
190
|
+
const s = side ?? (() => {
|
|
191
|
+
const p = positions.get(n.name);
|
|
192
|
+
const h = hips ? positions.get(hips.name) : void 0;
|
|
193
|
+
if (!p || !h || Math.abs(p[0] - h[0]) < 1e-4) return null;
|
|
194
|
+
return p[0] > h[0] ? "left" : "right";
|
|
195
|
+
})();
|
|
196
|
+
if (!s) continue;
|
|
197
|
+
const b = sidedBone(base, s);
|
|
198
|
+
if (b) set(b, n.name);
|
|
199
|
+
}
|
|
200
|
+
const byName = /* @__PURE__ */ new Map();
|
|
201
|
+
for (const [b, name] of Object.entries(bones)) byName.set(name, b);
|
|
202
|
+
let armDrop = null;
|
|
203
|
+
const ua = bones.leftUpperArm && positions.get(bones.leftUpperArm);
|
|
204
|
+
const la = bones.leftLowerArm && positions.get(bones.leftLowerArm);
|
|
205
|
+
if (ua && la) {
|
|
206
|
+
const d = [la[0] - ua[0], la[1] - ua[1], la[2] - ua[2]];
|
|
207
|
+
const len = Math.hypot(d[0], d[1], d[2]) || 1;
|
|
208
|
+
armDrop = Math.asin(Math.max(-1, Math.min(1, -d[1] / len))) * 180 / Math.PI;
|
|
209
|
+
}
|
|
210
|
+
const restPose = armDrop === null ? "unknown" : armDrop < 15 ? "T" : armDrop <= 65 ? "A" : "unknown";
|
|
211
|
+
return {
|
|
212
|
+
profile,
|
|
213
|
+
bones,
|
|
214
|
+
byName,
|
|
215
|
+
restPose,
|
|
216
|
+
armDrop,
|
|
217
|
+
missing: REQUIRED_HUMANOID_BONES.filter((b) => !bones[b])
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
__name(detectRig, "detectRig");
|
|
221
|
+
function mirrorHumanoidBone(b) {
|
|
222
|
+
if (b.startsWith("left")) return `right${b.slice(4)}`;
|
|
223
|
+
if (b.startsWith("right")) return `left${b.slice(5)}`;
|
|
224
|
+
return b;
|
|
225
|
+
}
|
|
226
|
+
__name(mirrorHumanoidBone, "mirrorHumanoidBone");
|
|
227
|
+
function skeletonFromObject3D(object) {
|
|
228
|
+
const o = object;
|
|
229
|
+
return {
|
|
230
|
+
name: o.name,
|
|
231
|
+
translation: [o.position.x, o.position.y, o.position.z],
|
|
232
|
+
rotation: [o.quaternion.x, o.quaternion.y, o.quaternion.z, o.quaternion.w],
|
|
233
|
+
scale: o.scale ? [o.scale.x, o.scale.y, o.scale.z] : void 0,
|
|
234
|
+
children: o.children.map(skeletonFromObject3D)
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
__name(skeletonFromObject3D, "skeletonFromObject3D");
|
|
238
|
+
|
|
239
|
+
export { REQUIRED_HUMANOID_BONES, detectRig, mirrorHumanoidBone, qinv, qmul, qrot, restPositions, skeletonFromObject3D, splitBoneName };
|
|
240
|
+
//# sourceMappingURL=chunk-GSWC6LLD.js.map
|
|
241
|
+
//# sourceMappingURL=chunk-GSWC6LLD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../core/animation/humanoid.ts"],"names":[],"mappings":"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","file":"chunk-GSWC6LLD.js","sourcesContent":["/**\n * One vocabulary for humanoid skeletons.\n *\n * Every source names its bones differently: Mixamo `mixamorig:LeftForeArm`,\n * Meshy `LeftForeArm` with its spine numbered top-down (`Spine02` is the\n * LOWEST), Unreal / Quaternius UAL `lowerarm_l` with `spine_01` lowest,\n * Blender rigify `forearm.L`, VRM `leftLowerArm`. Retargeting, the animation\n * editor and bone sockets all need \"the left forearm\" regardless, so a\n * skeleton is mapped once onto VRM's humanoid bone names (the closest thing\n * to a standard) and everything downstream speaks those.\n *\n * Pure data + math, no three.js: the editor's Node tools (gltf-transform\n * documents) and the runtime (THREE.Bone trees) both build a `SkeletonNode`\n * tree and call `detectRig`.\n */\n\nexport type HumanoidBone =\n | \"hips\"\n | \"spine\"\n | \"chest\"\n | \"upperChest\"\n | \"neck\"\n | \"head\"\n | \"leftShoulder\"\n | \"leftUpperArm\"\n | \"leftLowerArm\"\n | \"leftHand\"\n | \"rightShoulder\"\n | \"rightUpperArm\"\n | \"rightLowerArm\"\n | \"rightHand\"\n | \"leftUpperLeg\"\n | \"leftLowerLeg\"\n | \"leftFoot\"\n | \"leftToes\"\n | \"rightUpperLeg\"\n | \"rightLowerLeg\"\n | \"rightFoot\"\n | \"rightToes\"\n | `${\"left\" | \"right\"}${Finger}${FingerJoint}`;\n\ntype Finger = \"Thumb\" | \"Index\" | \"Middle\" | \"Ring\" | \"Little\";\ntype FingerJoint = \"Metacarpal\" | \"Proximal\" | \"Intermediate\" | \"Distal\";\n\n/** The bones a humanoid must have to retarget a full-body clip. */\nexport const REQUIRED_HUMANOID_BONES: readonly HumanoidBone[] = [\n \"hips\",\n \"spine\",\n \"head\",\n \"leftUpperArm\",\n \"leftLowerArm\",\n \"leftHand\",\n \"rightUpperArm\",\n \"rightLowerArm\",\n \"rightHand\",\n \"leftUpperLeg\",\n \"leftLowerLeg\",\n \"leftFoot\",\n \"rightUpperLeg\",\n \"rightLowerLeg\",\n \"rightFoot\",\n];\n\n/** Vector [x, y, z] and quaternion [x, y, z, w]. */\nexport type Vec3 = [number, number, number];\nexport type Quat = [number, number, number, number];\n\n/** A bone (or any node) with its LOCAL rest transform. */\nexport interface SkeletonNode {\n name: string;\n translation: Vec3;\n rotation: Quat;\n scale?: Vec3;\n children: SkeletonNode[];\n}\n\nexport type RigProfile =\n | \"mixamo\"\n | \"meshy\"\n | \"unreal\"\n | \"rigify\"\n | \"vrm\"\n | \"generic\";\n\nexport interface RigDetection {\n profile: RigProfile;\n /** Humanoid bone → the rig's own bone name. */\n bones: Partial<Record<HumanoidBone, string>>;\n /** Rig bone name → humanoid bone. */\n byName: Map<string, HumanoidBone>;\n /** Arms level (T), angled down (A), or neither. */\n restPose: \"T\" | \"A\" | \"unknown\";\n /** Degrees the left upper arm points below horizontal at rest. */\n armDrop: number | null;\n /** Required bones the rig lacks (empty = can retarget). */\n missing: HumanoidBone[];\n}\n\n// ── quaternion helpers ───────────────────────────────────────────────────────\n\nexport const qmul = (a: Quat, b: Quat): Quat => [\n a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n];\nexport const qinv = (q: Quat): Quat => [-q[0], -q[1], -q[2], q[3]];\nexport const qrot = (q: Quat, v: Vec3): Vec3 => {\n const r = qmul(qmul(q, [v[0], v[1], v[2], 0]), qinv(q));\n return [r[0], r[1], r[2]];\n};\n\n/** World (rig-space) rest position of every node, by name. */\nexport function restPositions(root: SkeletonNode): Map<string, Vec3> {\n const out = new Map<string, Vec3>();\n const walk = (n: SkeletonNode, pq: Quat, pp: Vec3, ps: number) => {\n const t = qrot(pq, [n.translation[0] * ps, n.translation[1] * ps, n.translation[2] * ps]);\n const p: Vec3 = [pp[0] + t[0], pp[1] + t[1], pp[2] + t[2]];\n out.set(n.name, p);\n const q = qmul(pq, n.rotation);\n const s = ps * (n.scale?.[0] ?? 1);\n for (const c of n.children) walk(c, q, p, s);\n };\n walk(root, [0, 0, 0, 1], [0, 0, 0], 1);\n return out;\n}\n\n// ── names ────────────────────────────────────────────────────────────────────\n\n/**\n * `mixamorig1:LeftForeArm` → { side: \"left\", base: \"forearm\" };\n * `upperarm_l` → { side: \"left\", base: \"upperarm\" }; `forearm.L` → left.\n */\nexport function splitBoneName(raw: string): { side: \"left\" | \"right\" | null; base: string } {\n let n = raw\n .replace(/^.*[:|]/, \"\") // mixamorig:, Armature|, rig:\n .replace(/^(mixamorig\\d*|def[-_]|org[-_]|mch[-_]|bip\\d*[ _]|b[-_])/i, \"\")\n .trim();\n let side: \"left\" | \"right\" | null = null;\n const sided = [\n [/^left[\\s_.-]*/i, \"left\"],\n [/^right[\\s_.-]*/i, \"right\"],\n [/^l[\\s_.-]+/i, \"left\"],\n [/^r[\\s_.-]+/i, \"right\"],\n [/[\\s_.-]+l$/i, \"left\"],\n [/[\\s_.-]+r$/i, \"right\"],\n [/[\\s_.-]*left$/i, \"left\"],\n [/[\\s_.-]*right$/i, \"right\"],\n ] as const;\n for (const [re, s] of sided) {\n if (re.test(n)) {\n side = s;\n n = n.replace(re, \"\");\n break;\n }\n }\n return { side, base: n.toLowerCase().replace(/[^a-z0-9]/g, \"\") };\n}\n\n/** Bases for sided limb bones. Order matters: first match wins. */\nconst LIMB_BASES: Array<[RegExp, string]> = [\n [/^(shoulder|clavicle|collar(bone)?)$/, \"Shoulder\"],\n [/^(upperarm|uparm|arm)$/, \"UpperArm\"],\n [/^(forearm|lowerarm|elbow|loarm)$/, \"LowerArm\"],\n [/^(hand|wrist)$/, \"Hand\"],\n [/^(upleg|upperleg|thigh|hipjoint)$/, \"UpperLeg\"],\n [/^(leg|lowerleg|calf|shin|knee)$/, \"LowerLeg\"],\n [/^(foot|ankle)$/, \"Foot\"],\n [/^(toebase|toe|toes|ball)$/, \"Toes\"],\n];\n\nconst FINGERS: Array<[RegExp, Finger]> = [\n [/^thumb/, \"Thumb\"],\n [/^(index|pointer)/, \"Index\"],\n [/^(middle|fingers)/, \"Middle\"],\n [/^ring/, \"Ring\"],\n [/^(pinky|little|small)/, \"Little\"],\n];\n\nfunction fingerJoint(finger: Finger, digits: string): FingerJoint | null {\n // Mixamo/UE number 1-3 (4 = tip); a bare \"Thumb\"/\"Fingers\" (Meshy after\n // fix-rig) is the first joint.\n const n = digits === \"\" ? 1 : Number(digits);\n const joints: FingerJoint[] =\n finger === \"Thumb\"\n ? [\"Metacarpal\", \"Proximal\", \"Distal\"]\n : [\"Proximal\", \"Intermediate\", \"Distal\"];\n return joints[n - 1] ?? null;\n}\n\n/** A sided bone from its name alone, or null. */\nfunction sidedBone(base: string, side: \"left\" | \"right\"): HumanoidBone | null {\n for (const [re, part] of LIMB_BASES) {\n if (re.test(base)) return `${side}${part}` as HumanoidBone;\n }\n // Mixamo writes fingers as LeftHandIndex1.\n const f = base.replace(/^hand(?=(thumb|index|middle|ring|pinky|little))/, \"\");\n for (const [re, finger] of FINGERS) {\n if (!re.test(f)) continue;\n const digits = /(\\d+)$/.exec(f)?.[1] ?? \"\";\n const joint = fingerJoint(finger, digits.replace(/^0+/, \"\"));\n return joint ? (`${side}${finger}${joint}` as HumanoidBone) : null;\n }\n return null;\n}\n\n// VRM names, recognised directly (leftUpperArm → lowercase \"leftupperarm\").\nconst VRM_LOWER = new Map<string, HumanoidBone>();\n\nconst VRM_FINGER = /^(left|right)(Thumb|Index|Middle|Ring|Little)(Metacarpal|Proximal|Intermediate|Distal)$/;\n\nfunction vrmBone(raw: string): HumanoidBone | null {\n const name = raw.replace(/^.*[:|]/, \"\");\n if (VRM_FINGER.test(name)) return name as HumanoidBone;\n if (VRM_LOWER.size === 0) {\n const sides = [\"left\", \"right\"] as const;\n const parts = [\"Shoulder\", \"UpperArm\", \"LowerArm\", \"Hand\", \"UpperLeg\", \"LowerLeg\", \"Foot\", \"Toes\"];\n for (const s of sides) for (const p of parts) VRM_LOWER.set(`${s}${p}`.toLowerCase(), `${s}${p}` as HumanoidBone);\n for (const b of [\"hips\", \"spine\", \"chest\", \"upperChest\", \"neck\", \"head\"] as const)\n VRM_LOWER.set(b.toLowerCase(), b);\n }\n return VRM_LOWER.get(name.toLowerCase()) ?? null;\n}\n\nfunction profileOf(names: string[]): RigProfile {\n if (names.some((n) => /^mixamorig/i.test(n))) return \"mixamo\";\n if (names.some((n) => /^(upperarm|lowerarm|thigh|calf)_[lr]$/i.test(n))) return \"unreal\";\n if (names.some((n) => /\\.[LR]$/.test(n))) return \"rigify\";\n if (names.some((n) => /^leftUpperArm$/.test(n))) return \"vrm\";\n if (names.some((n) => /^Spine0[12]$/.test(n))) return \"meshy\";\n return \"generic\";\n}\n\nfunction findHips(root: SkeletonNode): SkeletonNode | null {\n let found: SkeletonNode | null = null;\n const walk = (n: SkeletonNode) => {\n if (found) return;\n const { base } = splitBoneName(n.name);\n if (/^(hips|hip|pelvis)$/.test(base)) {\n found = n;\n return;\n }\n for (const c of n.children) walk(c);\n };\n walk(root);\n return found;\n}\n\nconst isSpineLike = (base: string) => /^(spine|chest|upperchest|torso|back)\\d*$/.test(base);\n\n/**\n * Map a skeleton onto humanoid bones. Pass the scene root (the armature's\n * own transform included): the rest-pose check measures \"down\" in that space,\n * and a Mixamo armature is Z-up under a 90° turn.\n *\n * Limbs and fingers come from their names (any of the conventions above, side\n * from prefixes/suffixes, or from which side of the body they sit when the\n * name has none). The spine comes from the CHAIN between the hips and the\n * neck, not from names, because conventions number it in opposite\n * directions: its first bone is `spine`, the second `chest`, a third\n * `upperChest`.\n */\nexport function detectRig(root: SkeletonNode): RigDetection {\n const all: SkeletonNode[] = [];\n const collect = (n: SkeletonNode) => {\n all.push(n);\n for (const c of n.children) collect(c);\n };\n collect(root);\n const profile = profileOf(all.map((n) => n.name));\n const bones: Partial<Record<HumanoidBone, string>> = {};\n const set = (b: HumanoidBone, name: string) => {\n if (!bones[b]) bones[b] = name;\n };\n\n const hips = findHips(root);\n const positions = restPositions(root);\n if (hips) {\n set(\"hips\", hips.name);\n // The spine chain: follow spine-like children upward from the hips.\n const chain: SkeletonNode[] = [];\n let cur: SkeletonNode | undefined = hips;\n while (cur) {\n const next: SkeletonNode | undefined = cur.children.find((c) => isSpineLike(splitBoneName(c.name).base));\n if (!next) break;\n chain.push(next);\n cur = next;\n }\n if (chain[0]) set(\"spine\", chain[0].name);\n if (chain[1]) set(\"chest\", chain[1].name);\n if (chain[2]) set(\"upperChest\", chain[chain.length - 1].name);\n }\n\n for (const n of all) {\n const vrm = vrmBone(n.name);\n if (vrm) {\n set(vrm, n.name);\n continue;\n }\n const { side, base } = splitBoneName(n.name);\n if (/^neck\\d*$/.test(base)) {\n set(\"neck\", n.name);\n continue;\n }\n if (/^head$/.test(base)) {\n set(\"head\", n.name);\n continue;\n }\n if (base === \"hips\" || base === \"pelvis\" || isSpineLike(base)) continue;\n // No side in the name: decide by which side of the hips it sits (glTF\n // humanoids face +Z, so their left is +X).\n const s =\n side ??\n (() => {\n const p = positions.get(n.name);\n const h = hips ? positions.get(hips.name) : undefined;\n if (!p || !h || Math.abs(p[0] - h[0]) < 1e-4) return null;\n return p[0] > h[0] ? \"left\" : \"right\";\n })();\n if (!s) continue;\n const b = sidedBone(base, s);\n if (b) set(b, n.name);\n }\n\n const byName = new Map<string, HumanoidBone>();\n for (const [b, name] of Object.entries(bones)) byName.set(name as string, b as HumanoidBone);\n\n // Rest pose from the left upper arm's direction.\n let armDrop: number | null = null;\n const ua = bones.leftUpperArm && positions.get(bones.leftUpperArm);\n const la = bones.leftLowerArm && positions.get(bones.leftLowerArm);\n if (ua && la) {\n const d: Vec3 = [la[0] - ua[0], la[1] - ua[1], la[2] - ua[2]];\n const len = Math.hypot(d[0], d[1], d[2]) || 1;\n armDrop = (Math.asin(Math.max(-1, Math.min(1, -d[1] / len))) * 180) / Math.PI;\n }\n const restPose = armDrop === null ? \"unknown\" : armDrop < 15 ? \"T\" : armDrop <= 65 ? \"A\" : \"unknown\";\n\n return {\n profile,\n bones,\n byName,\n restPose,\n armDrop,\n missing: REQUIRED_HUMANOID_BONES.filter((b) => !bones[b]),\n };\n}\n\n/** The same bone on the other side (`leftHand` ↔ `rightHand`). */\nexport function mirrorHumanoidBone(b: HumanoidBone): HumanoidBone {\n if (b.startsWith(\"left\")) return `right${b.slice(4)}` as HumanoidBone;\n if (b.startsWith(\"right\")) return `left${b.slice(5)}` as HumanoidBone;\n return b;\n}\n\n/**\n * Duck-typed adapter for a three.js Object3D/Bone tree (position: Vector3,\n * quaternion: Quaternion), so the runtime can call `detectRig` without this\n * module importing three.\n */\nexport function skeletonFromObject3D(object: {\n name: string;\n position: { x: number; y: number; z: number };\n quaternion: { x: number; y: number; z: number; w: number };\n scale?: { x: number; y: number; z: number };\n children: unknown[];\n}): SkeletonNode {\n const o = object;\n return {\n name: o.name,\n translation: [o.position.x, o.position.y, o.position.z],\n rotation: [o.quaternion.x, o.quaternion.y, o.quaternion.z, o.quaternion.w],\n scale: o.scale ? [o.scale.x, o.scale.y, o.scale.z] : undefined,\n children: (o.children as (typeof object)[]).map(skeletonFromObject3D),\n };\n}\n"]}
|