@relu-interactives/spatial-ecs 0.5.3 → 0.8.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-G0Dl-F0w.d.ts} +93 -3
- package/dist/{XRHandPose-CQTLGxFC.d.cts → XRHandPose-VQMT1WXj.d.cts} +93 -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-G4XJ53LS.js +1237 -0
- package/dist/chunk-G4XJ53LS.js.map +1 -0
- package/dist/chunk-GSWC6LLD.js +241 -0
- package/dist/chunk-GSWC6LLD.js.map +1 -0
- package/dist/{chunk-DF5SSRN6.js → chunk-JIJQFW6P.js} +1216 -2920
- package/dist/chunk-JIJQFW6P.js.map +1 -0
- package/dist/{chunk-BUEKOSR5.js → chunk-NNDUOQ7O.js} +188 -14
- package/dist/chunk-NNDUOQ7O.js.map +1 -0
- package/dist/chunk-OHCNPPMX.js +334 -0
- package/dist/chunk-OHCNPPMX.js.map +1 -0
- package/dist/{chunk-RXBLOO5B.js → chunk-SGF73YTF.js} +105 -715
- package/dist/chunk-SGF73YTF.js.map +1 -0
- package/dist/chunk-U727NTWQ.js +2856 -0
- package/dist/chunk-U727NTWQ.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 +183 -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/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 +770 -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-D2Jt_JzH.d.ts → index-C61n65PE.d.ts} +135 -42
- package/dist/{index-DaG03vyN.d.cts → index-C70N4BYG.d.cts} +135 -42
- package/dist/{index-C3ik3sA1.d.ts → index-D9DjrUn3.d.cts} +25 -3
- package/dist/{index-Dlr-7-4m.d.cts → index-DppafVu4.d.ts} +25 -3
- package/dist/index.cjs +3642 -1263
- 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 +4896 -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 +3958 -1762
- 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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
|
-
import {
|
|
2
|
+
import { d as Component, a3 as AudioBus, $ as EcsEntityKind, ae as EcsEntityEditorKind, M as EntityId } from './System-DPMAW30g.js';
|
|
3
3
|
import * as RAPIER from '@dimforge/rapier3d-compat';
|
|
4
4
|
import { a as XrFinger, c as XrHandPoseDirection, b as XrHandPoseOrientation, X as XrHandPoseDefinition } from './handPose-DlcTtqgx.js';
|
|
5
5
|
|
|
@@ -256,6 +256,7 @@ declare const DEFAULT_AUDIO_OPTIONS: {
|
|
|
256
256
|
refDistance: number;
|
|
257
257
|
distanceModel: string;
|
|
258
258
|
rolloffFactor: number;
|
|
259
|
+
bus: AudioBus;
|
|
259
260
|
};
|
|
260
261
|
/**
|
|
261
262
|
* Plays an audio clip from `path`. Supports both global stereo (`positional:
|
|
@@ -281,6 +282,7 @@ declare class AudioComponent extends Component {
|
|
|
281
282
|
* | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |
|
|
282
283
|
* | `distanceModel` | `"inverse"` | WebAudio distance model (`linear`, `inverse`, `exponential`). |
|
|
283
284
|
* | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. |
|
|
285
|
+
* | `bus` | `"sfx"` | The mixer group it plays through: `sfx`, `voice` or `music`. Music dips while a voice plays. |
|
|
284
286
|
*/
|
|
285
287
|
options: typeof DEFAULT_AUDIO_OPTIONS;
|
|
286
288
|
/** Live three.js object hosting the audio (a parented `Audio`/`PositionalAudio`). `null` until built. */
|
|
@@ -761,6 +763,32 @@ declare class ImageTargetAnchor extends Component {
|
|
|
761
763
|
constructor(options?: ImageTargetAnchorOptions);
|
|
762
764
|
}
|
|
763
765
|
|
|
766
|
+
/**
|
|
767
|
+
* Optional shadow tuning for a shadow-casting light (directional, spot,
|
|
768
|
+
* point). Only the fields present are applied; a missing field keeps three's
|
|
769
|
+
* default, and a light without a `shadow` block is never touched.
|
|
770
|
+
*/
|
|
771
|
+
type LightShadowState = {
|
|
772
|
+
/** Shadow map resolution in texels (square). three's default is `512`. Clamped to `[16, 8192]`. */
|
|
773
|
+
mapSize?: number;
|
|
774
|
+
/** Depth bias to fight shadow acne. Small negatives such as `-0.0005` are typical. */
|
|
775
|
+
bias?: number;
|
|
776
|
+
/** Bias along the surface normal; `0.02`-`0.05` removes acne on large flat surfaces. */
|
|
777
|
+
normalBias?: number;
|
|
778
|
+
/** Blur radius of the shadow edge (PCF shadow maps). */
|
|
779
|
+
radius?: number;
|
|
780
|
+
/**
|
|
781
|
+
* Half-extent, in world units, of a DIRECTIONAL light's orthographic shadow
|
|
782
|
+
* camera (`left = bottom = -cameraSize`, `right = top = cameraSize`).
|
|
783
|
+
* three's default is `5`, which only covers a 10 m square. Ignored for spot
|
|
784
|
+
* and point lights.
|
|
785
|
+
*/
|
|
786
|
+
cameraSize?: number;
|
|
787
|
+
/** Near plane of the shadow camera. */
|
|
788
|
+
near?: number;
|
|
789
|
+
/** Far plane of the shadow camera. Spot lights with a `distance` use that instead. */
|
|
790
|
+
far?: number;
|
|
791
|
+
};
|
|
764
792
|
/** Authoring state for {@link LightComponent}. Common fields apply to every light kind; the optional fields are only meaningful for specific kinds. */
|
|
765
793
|
type LightValueState = {
|
|
766
794
|
/** Light color as `#rrggbb` hex string. */
|
|
@@ -783,6 +811,8 @@ type LightValueState = {
|
|
|
783
811
|
width?: number;
|
|
784
812
|
/** Rectangle height in world units. (RectAreaLight) */
|
|
785
813
|
height?: number;
|
|
814
|
+
/** Optional shadow tuning. Absent = three's shadow defaults. (DirectionalLight, SpotLight, PointLight) */
|
|
815
|
+
shadow?: LightShadowState;
|
|
786
816
|
};
|
|
787
817
|
/**
|
|
788
818
|
* Light source attached to an entity. `type` selects the underlying three.js
|
|
@@ -922,11 +952,23 @@ declare class MeshComponent extends Component {
|
|
|
922
952
|
constructor(mesh: THREE.Object3D);
|
|
923
953
|
}
|
|
924
954
|
|
|
955
|
+
/** Load progress of a {@link ModelComponent}'s asset. */
|
|
956
|
+
type ModelLoadState = "loading" | "loaded" | "error";
|
|
957
|
+
/** Message used when a model entity has no asset path to load. */
|
|
958
|
+
declare const MODEL_NO_PATH_MESSAGE = "No model path set.";
|
|
959
|
+
/**
|
|
960
|
+
* Write a model's load state as NON-ENUMERABLE own properties, so it never
|
|
961
|
+
* enters snapshots, undo history or saved projects. Always via defineProperty
|
|
962
|
+
* (the pattern `setPhysicsLiveRef` uses): plain assignment on a
|
|
963
|
+
* history-restored clone would create an ENUMERABLE property instead.
|
|
964
|
+
*/
|
|
965
|
+
declare function setModelLoadState(component: ModelComponent, state: ModelLoadState, error?: string): void;
|
|
925
966
|
/**
|
|
926
967
|
* References a GLTF/GLB asset loaded from `path`. The model loading system
|
|
927
968
|
* resolves the asset asynchronously and populates {@link ModelComponent.object}
|
|
928
969
|
* once available; loading is deferred-tolerant so the entity exists before
|
|
929
|
-
* the model finishes loading.
|
|
970
|
+
* the model finishes loading. {@link ModelComponent.loadState} reports
|
|
971
|
+
* progress (`"loading"` → `"loaded"` or `"error"`).
|
|
930
972
|
*
|
|
931
973
|
* @category Components
|
|
932
974
|
*/
|
|
@@ -935,6 +977,15 @@ declare class ModelComponent extends Component {
|
|
|
935
977
|
path: string;
|
|
936
978
|
/** Loaded model object, populated asynchronously by the model loader. `null` until loaded. */
|
|
937
979
|
object: THREE.Object3D | null;
|
|
980
|
+
/**
|
|
981
|
+
* `"loading"` while the asset is being fetched and parsed, `"loaded"` once
|
|
982
|
+
* it is attached to the entity, `"error"` when it failed (see
|
|
983
|
+
* {@link loadError}). A model with an empty `path` reports `"error"`.
|
|
984
|
+
* Runtime-only: never saved.
|
|
985
|
+
*/
|
|
986
|
+
loadState: ModelLoadState;
|
|
987
|
+
/** Why the load failed, when {@link loadState} is `"error"`. Runtime-only. */
|
|
988
|
+
loadError?: string;
|
|
938
989
|
constructor(path: string);
|
|
939
990
|
}
|
|
940
991
|
|
|
@@ -1573,6 +1624,45 @@ declare class XRAnchorComponent extends Component {
|
|
|
1573
1624
|
constructor(options?: XRAnchorOptions);
|
|
1574
1625
|
}
|
|
1575
1626
|
|
|
1627
|
+
/** Optional initializer for {@link BoneAttachmentComponent}. */
|
|
1628
|
+
type BoneAttachmentOptions = {
|
|
1629
|
+
/** The bone's node name in the parent's model (as three.js names it). */
|
|
1630
|
+
bone?: string;
|
|
1631
|
+
/** The bone's humanoid name (`rightHand`, `head` …), used when the node name isn't found (another rig). */
|
|
1632
|
+
humanoid?: string | null;
|
|
1633
|
+
/** Cancel the bone's world scale so offsets are in metres on any rig. Defaults to `true`. */
|
|
1634
|
+
compensateScale?: boolean;
|
|
1635
|
+
/** Turn the attachment off without removing it. Defaults to `true`. */
|
|
1636
|
+
enabled?: boolean;
|
|
1637
|
+
};
|
|
1638
|
+
/**
|
|
1639
|
+
* Fixes an entity to a bone of its PARENT's model — a sword in a hand, a hat
|
|
1640
|
+
* on a head, a backpack on the chest — so it moves with every animation.
|
|
1641
|
+
*
|
|
1642
|
+
* The entity's `ParentId` stays the character; this names the bone. The
|
|
1643
|
+
* `ObjectManagementSystem` then parents the entity's object under that bone
|
|
1644
|
+
* (through a small socket that cancels the rig's scale), and the entity's
|
|
1645
|
+
* Transform becomes its offset FROM the bone: position in metres, rotation
|
|
1646
|
+
* relative to the bone. Until the model has loaded, or when the bone isn't
|
|
1647
|
+
* found, the entity sits under the character as an ordinary child.
|
|
1648
|
+
*
|
|
1649
|
+
* Attach and detach with `ObjectManagementSystem.attachToBone` /
|
|
1650
|
+
* `detachFromBone`, which can keep the entity where it is in the world.
|
|
1651
|
+
*
|
|
1652
|
+
* @category Components
|
|
1653
|
+
*/
|
|
1654
|
+
declare class BoneAttachmentComponent extends Component {
|
|
1655
|
+
/** The bone's node name in the parent's model. */
|
|
1656
|
+
bone: string;
|
|
1657
|
+
/** The bone's humanoid name, the fallback when the node name isn't found. */
|
|
1658
|
+
humanoid: string | null;
|
|
1659
|
+
/** Cancel the bone's world scale (offsets in metres on a centimetre rig). */
|
|
1660
|
+
compensateScale: boolean;
|
|
1661
|
+
/** Whether the entity follows the bone. Off: an ordinary child of the character. */
|
|
1662
|
+
enabled: boolean;
|
|
1663
|
+
constructor(options?: BoneAttachmentOptions);
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1576
1666
|
/** How a panel orients itself while the experience runs. */
|
|
1577
1667
|
type UiFollowMode = "world" | "billboard";
|
|
1578
1668
|
/** Optional initializer for {@link UIPanelComponent}. */
|
|
@@ -1953,4 +2043,4 @@ declare class XRHandPoseComponent extends Component {
|
|
|
1953
2043
|
constructor(options?: XRHandPoseOptions);
|
|
1954
2044
|
}
|
|
1955
2045
|
|
|
1956
|
-
export {
|
|
2046
|
+
export { ScriptComponent as $, AnimationComponent as A, BoneAttachmentComponent as B, CameraComponent as C, DEFAULT_COLLIDER_STATE as D, type EditableMeshObjectKind as E, type LightValueState as F, MaterialComponent as G, type MaterialTypeValue as H, ImageComponent as I, type MaterialValueState as J, MeshComponent as K, LightComponent as L, MODEL_NO_PATH_MESSAGE as M, MeshGeometryComponent as N, type MeshGeometryParameters as O, type MeshGeometryParametersByKind as P, ModelComponent as Q, type ModelLoadState as R, Name as S, Object3DRef as T, PhysicsComponent as U, type PhysicsState as V, type PlaneMeshParameters as W, type RadiusHeightMeshParameters as X, type RadiusMeshParameters as Y, type RigidbodyState as Z, type RigidbodyType as _, type AnimationComponentOptions as a, type ScriptEntry as a0, ScriptObjectComponent as a1, type ScriptObjectComponentInput as a2, type ScriptObjectRuntimeState as a3, Selectable as a4, SelectionTransformState as a5, SpriteComponent as a6, type TextureFilteringValue as a7, type TransformModeValue as a8, type TransformSpaceValue as a9, XRRigComponent as aA, type XRRigOptions as aB, type XrAttachPoint as aC, type XrDistanceGrabBehavior as aD, type XrEnvironmentPhysics as aE, type XrGrabGesture as aF, type XrGrabHands as aG, type XrGrabReach as aH, type XrHandPoseEntry as aI, type XrHandPreset as aJ, type XrInteractorSide as aK, type XrInteractorType as aL, type XrLocomotionMode as aM, type XrTrackingOrigin as aN, type XrTwoHandRotation as aO, createAttachPoint as aP, createHandPoseEntry as aQ, defaultMaterialValue as aR, handPoseDefinitionFor as aS, normalizePhysicsState as aT, setModelLoadState as aU, setPhysicsLiveRef as aV, type AnimationStateCallbacks as aW, AnimationStateMachine as aX, AnimationStateManager as aY, type StateMachine as aZ, UIButtonComponent as aa, type UIButtonOptions as ab, UIPanelComponent as ac, type UIPanelOptions as ad, UISliderComponent as ae, type UISliderOptions as af, UITextComponent as ag, type UITextOptions as ah, UIToggleComponent as ai, type UIToggleOptions as aj, type UiFollowMode as ak, type UiTextAlign as al, type UiTextVAlign as am, VRTeleportAreaComponent as an, type VRTeleportAreaOptions as ao, VideoComponent as ap, type VrTeleportShape as aq, XRAnchorComponent as ar, type XRAnchorOptions as as, XRHandPoseComponent as at, type XRHandPoseOptions as au, XRInteractableComponent as av, type XRInteractableOptions as aw, XRInteractorComponent as ax, type XRInteractorOptions as ay, XRInteractorSideComponent as az, AudioComponent as b, type BoneAttachmentOptions as c, type CameraComponentOptions as d, type CameraProjection as e, type CameraRuntimeType as f, type ColliderShape as g, type ColliderState as h, type CubeMeshParameters as i, DEFAULT_INSTANCED_MESH_PARAMETERS as j, DEFAULT_INSTANCE_TRANSFORM as k, DEFAULT_MESH_GEOMETRY_PARAMETERS as l, DEFAULT_PHYSICS_STATE as m, DEFAULT_POSE_CURLS as n, DEFAULT_POSE_DIRECTIONS as o, DEFAULT_RIGIDBODY_STATE as p, EntityType as q, ImageTarget as r, ImageTargetAnchor as s, type ImageTargetAnchorOptions as t, type ImageTargetReference as u, InstanceSlotComponent as v, type InstanceTransform as w, InstancedMeshComponent as x, type InstancedMeshKind as y, type LightShadowState as z };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
|
-
import { C as Component,
|
|
2
|
+
import { C as Component, _ as AudioBus, U as EcsEntityKind, aa as EcsEntityEditorKind, G as EntityId } from './System-8D-XBDKZ.cjs';
|
|
3
3
|
import * as RAPIER from '@dimforge/rapier3d-compat';
|
|
4
4
|
import { a as XrFinger, c as XrHandPoseDirection, b as XrHandPoseOrientation, X as XrHandPoseDefinition } from './handPose-DlcTtqgx.cjs';
|
|
5
5
|
|
|
@@ -256,6 +256,7 @@ declare const DEFAULT_AUDIO_OPTIONS: {
|
|
|
256
256
|
refDistance: number;
|
|
257
257
|
distanceModel: string;
|
|
258
258
|
rolloffFactor: number;
|
|
259
|
+
bus: AudioBus;
|
|
259
260
|
};
|
|
260
261
|
/**
|
|
261
262
|
* Plays an audio clip from `path`. Supports both global stereo (`positional:
|
|
@@ -281,6 +282,7 @@ declare class AudioComponent extends Component {
|
|
|
281
282
|
* | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |
|
|
282
283
|
* | `distanceModel` | `"inverse"` | WebAudio distance model (`linear`, `inverse`, `exponential`). |
|
|
283
284
|
* | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. |
|
|
285
|
+
* | `bus` | `"sfx"` | The mixer group it plays through: `sfx`, `voice` or `music`. Music dips while a voice plays. |
|
|
284
286
|
*/
|
|
285
287
|
options: typeof DEFAULT_AUDIO_OPTIONS;
|
|
286
288
|
/** Live three.js object hosting the audio (a parented `Audio`/`PositionalAudio`). `null` until built. */
|
|
@@ -761,6 +763,32 @@ declare class ImageTargetAnchor extends Component {
|
|
|
761
763
|
constructor(options?: ImageTargetAnchorOptions);
|
|
762
764
|
}
|
|
763
765
|
|
|
766
|
+
/**
|
|
767
|
+
* Optional shadow tuning for a shadow-casting light (directional, spot,
|
|
768
|
+
* point). Only the fields present are applied; a missing field keeps three's
|
|
769
|
+
* default, and a light without a `shadow` block is never touched.
|
|
770
|
+
*/
|
|
771
|
+
type LightShadowState = {
|
|
772
|
+
/** Shadow map resolution in texels (square). three's default is `512`. Clamped to `[16, 8192]`. */
|
|
773
|
+
mapSize?: number;
|
|
774
|
+
/** Depth bias to fight shadow acne. Small negatives such as `-0.0005` are typical. */
|
|
775
|
+
bias?: number;
|
|
776
|
+
/** Bias along the surface normal; `0.02`-`0.05` removes acne on large flat surfaces. */
|
|
777
|
+
normalBias?: number;
|
|
778
|
+
/** Blur radius of the shadow edge (PCF shadow maps). */
|
|
779
|
+
radius?: number;
|
|
780
|
+
/**
|
|
781
|
+
* Half-extent, in world units, of a DIRECTIONAL light's orthographic shadow
|
|
782
|
+
* camera (`left = bottom = -cameraSize`, `right = top = cameraSize`).
|
|
783
|
+
* three's default is `5`, which only covers a 10 m square. Ignored for spot
|
|
784
|
+
* and point lights.
|
|
785
|
+
*/
|
|
786
|
+
cameraSize?: number;
|
|
787
|
+
/** Near plane of the shadow camera. */
|
|
788
|
+
near?: number;
|
|
789
|
+
/** Far plane of the shadow camera. Spot lights with a `distance` use that instead. */
|
|
790
|
+
far?: number;
|
|
791
|
+
};
|
|
764
792
|
/** Authoring state for {@link LightComponent}. Common fields apply to every light kind; the optional fields are only meaningful for specific kinds. */
|
|
765
793
|
type LightValueState = {
|
|
766
794
|
/** Light color as `#rrggbb` hex string. */
|
|
@@ -783,6 +811,8 @@ type LightValueState = {
|
|
|
783
811
|
width?: number;
|
|
784
812
|
/** Rectangle height in world units. (RectAreaLight) */
|
|
785
813
|
height?: number;
|
|
814
|
+
/** Optional shadow tuning. Absent = three's shadow defaults. (DirectionalLight, SpotLight, PointLight) */
|
|
815
|
+
shadow?: LightShadowState;
|
|
786
816
|
};
|
|
787
817
|
/**
|
|
788
818
|
* Light source attached to an entity. `type` selects the underlying three.js
|
|
@@ -922,11 +952,23 @@ declare class MeshComponent extends Component {
|
|
|
922
952
|
constructor(mesh: THREE.Object3D);
|
|
923
953
|
}
|
|
924
954
|
|
|
955
|
+
/** Load progress of a {@link ModelComponent}'s asset. */
|
|
956
|
+
type ModelLoadState = "loading" | "loaded" | "error";
|
|
957
|
+
/** Message used when a model entity has no asset path to load. */
|
|
958
|
+
declare const MODEL_NO_PATH_MESSAGE = "No model path set.";
|
|
959
|
+
/**
|
|
960
|
+
* Write a model's load state as NON-ENUMERABLE own properties, so it never
|
|
961
|
+
* enters snapshots, undo history or saved projects. Always via defineProperty
|
|
962
|
+
* (the pattern `setPhysicsLiveRef` uses): plain assignment on a
|
|
963
|
+
* history-restored clone would create an ENUMERABLE property instead.
|
|
964
|
+
*/
|
|
965
|
+
declare function setModelLoadState(component: ModelComponent, state: ModelLoadState, error?: string): void;
|
|
925
966
|
/**
|
|
926
967
|
* References a GLTF/GLB asset loaded from `path`. The model loading system
|
|
927
968
|
* resolves the asset asynchronously and populates {@link ModelComponent.object}
|
|
928
969
|
* once available; loading is deferred-tolerant so the entity exists before
|
|
929
|
-
* the model finishes loading.
|
|
970
|
+
* the model finishes loading. {@link ModelComponent.loadState} reports
|
|
971
|
+
* progress (`"loading"` → `"loaded"` or `"error"`).
|
|
930
972
|
*
|
|
931
973
|
* @category Components
|
|
932
974
|
*/
|
|
@@ -935,6 +977,15 @@ declare class ModelComponent extends Component {
|
|
|
935
977
|
path: string;
|
|
936
978
|
/** Loaded model object, populated asynchronously by the model loader. `null` until loaded. */
|
|
937
979
|
object: THREE.Object3D | null;
|
|
980
|
+
/**
|
|
981
|
+
* `"loading"` while the asset is being fetched and parsed, `"loaded"` once
|
|
982
|
+
* it is attached to the entity, `"error"` when it failed (see
|
|
983
|
+
* {@link loadError}). A model with an empty `path` reports `"error"`.
|
|
984
|
+
* Runtime-only: never saved.
|
|
985
|
+
*/
|
|
986
|
+
loadState: ModelLoadState;
|
|
987
|
+
/** Why the load failed, when {@link loadState} is `"error"`. Runtime-only. */
|
|
988
|
+
loadError?: string;
|
|
938
989
|
constructor(path: string);
|
|
939
990
|
}
|
|
940
991
|
|
|
@@ -1573,6 +1624,45 @@ declare class XRAnchorComponent extends Component {
|
|
|
1573
1624
|
constructor(options?: XRAnchorOptions);
|
|
1574
1625
|
}
|
|
1575
1626
|
|
|
1627
|
+
/** Optional initializer for {@link BoneAttachmentComponent}. */
|
|
1628
|
+
type BoneAttachmentOptions = {
|
|
1629
|
+
/** The bone's node name in the parent's model (as three.js names it). */
|
|
1630
|
+
bone?: string;
|
|
1631
|
+
/** The bone's humanoid name (`rightHand`, `head` …), used when the node name isn't found (another rig). */
|
|
1632
|
+
humanoid?: string | null;
|
|
1633
|
+
/** Cancel the bone's world scale so offsets are in metres on any rig. Defaults to `true`. */
|
|
1634
|
+
compensateScale?: boolean;
|
|
1635
|
+
/** Turn the attachment off without removing it. Defaults to `true`. */
|
|
1636
|
+
enabled?: boolean;
|
|
1637
|
+
};
|
|
1638
|
+
/**
|
|
1639
|
+
* Fixes an entity to a bone of its PARENT's model — a sword in a hand, a hat
|
|
1640
|
+
* on a head, a backpack on the chest — so it moves with every animation.
|
|
1641
|
+
*
|
|
1642
|
+
* The entity's `ParentId` stays the character; this names the bone. The
|
|
1643
|
+
* `ObjectManagementSystem` then parents the entity's object under that bone
|
|
1644
|
+
* (through a small socket that cancels the rig's scale), and the entity's
|
|
1645
|
+
* Transform becomes its offset FROM the bone: position in metres, rotation
|
|
1646
|
+
* relative to the bone. Until the model has loaded, or when the bone isn't
|
|
1647
|
+
* found, the entity sits under the character as an ordinary child.
|
|
1648
|
+
*
|
|
1649
|
+
* Attach and detach with `ObjectManagementSystem.attachToBone` /
|
|
1650
|
+
* `detachFromBone`, which can keep the entity where it is in the world.
|
|
1651
|
+
*
|
|
1652
|
+
* @category Components
|
|
1653
|
+
*/
|
|
1654
|
+
declare class BoneAttachmentComponent extends Component {
|
|
1655
|
+
/** The bone's node name in the parent's model. */
|
|
1656
|
+
bone: string;
|
|
1657
|
+
/** The bone's humanoid name, the fallback when the node name isn't found. */
|
|
1658
|
+
humanoid: string | null;
|
|
1659
|
+
/** Cancel the bone's world scale (offsets in metres on a centimetre rig). */
|
|
1660
|
+
compensateScale: boolean;
|
|
1661
|
+
/** Whether the entity follows the bone. Off: an ordinary child of the character. */
|
|
1662
|
+
enabled: boolean;
|
|
1663
|
+
constructor(options?: BoneAttachmentOptions);
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1576
1666
|
/** How a panel orients itself while the experience runs. */
|
|
1577
1667
|
type UiFollowMode = "world" | "billboard";
|
|
1578
1668
|
/** Optional initializer for {@link UIPanelComponent}. */
|
|
@@ -1953,4 +2043,4 @@ declare class XRHandPoseComponent extends Component {
|
|
|
1953
2043
|
constructor(options?: XRHandPoseOptions);
|
|
1954
2044
|
}
|
|
1955
2045
|
|
|
1956
|
-
export {
|
|
2046
|
+
export { ScriptComponent as $, AnimationComponent as A, BoneAttachmentComponent as B, CameraComponent as C, DEFAULT_COLLIDER_STATE as D, type EditableMeshObjectKind as E, type LightValueState as F, MaterialComponent as G, type MaterialTypeValue as H, ImageComponent as I, type MaterialValueState as J, MeshComponent as K, LightComponent as L, MODEL_NO_PATH_MESSAGE as M, MeshGeometryComponent as N, type MeshGeometryParameters as O, type MeshGeometryParametersByKind as P, ModelComponent as Q, type ModelLoadState as R, Name as S, Object3DRef as T, PhysicsComponent as U, type PhysicsState as V, type PlaneMeshParameters as W, type RadiusHeightMeshParameters as X, type RadiusMeshParameters as Y, type RigidbodyState as Z, type RigidbodyType as _, type AnimationComponentOptions as a, type ScriptEntry as a0, ScriptObjectComponent as a1, type ScriptObjectComponentInput as a2, type ScriptObjectRuntimeState as a3, Selectable as a4, SelectionTransformState as a5, SpriteComponent as a6, type TextureFilteringValue as a7, type TransformModeValue as a8, type TransformSpaceValue as a9, XRRigComponent as aA, type XRRigOptions as aB, type XrAttachPoint as aC, type XrDistanceGrabBehavior as aD, type XrEnvironmentPhysics as aE, type XrGrabGesture as aF, type XrGrabHands as aG, type XrGrabReach as aH, type XrHandPoseEntry as aI, type XrHandPreset as aJ, type XrInteractorSide as aK, type XrInteractorType as aL, type XrLocomotionMode as aM, type XrTrackingOrigin as aN, type XrTwoHandRotation as aO, createAttachPoint as aP, createHandPoseEntry as aQ, defaultMaterialValue as aR, handPoseDefinitionFor as aS, normalizePhysicsState as aT, setModelLoadState as aU, setPhysicsLiveRef as aV, type AnimationStateCallbacks as aW, AnimationStateMachine as aX, AnimationStateManager as aY, type StateMachine as aZ, UIButtonComponent as aa, type UIButtonOptions as ab, UIPanelComponent as ac, type UIPanelOptions as ad, UISliderComponent as ae, type UISliderOptions as af, UITextComponent as ag, type UITextOptions as ah, UIToggleComponent as ai, type UIToggleOptions as aj, type UiFollowMode as ak, type UiTextAlign as al, type UiTextVAlign as am, VRTeleportAreaComponent as an, type VRTeleportAreaOptions as ao, VideoComponent as ap, type VrTeleportShape as aq, XRAnchorComponent as ar, type XRAnchorOptions as as, XRHandPoseComponent as at, type XRHandPoseOptions as au, XRInteractableComponent as av, type XRInteractableOptions as aw, XRInteractorComponent as ax, type XRInteractorOptions as ay, XRInteractorSideComponent as az, AudioComponent as b, type BoneAttachmentOptions as c, type CameraComponentOptions as d, type CameraProjection as e, type CameraRuntimeType as f, type ColliderShape as g, type ColliderState as h, type CubeMeshParameters as i, DEFAULT_INSTANCED_MESH_PARAMETERS as j, DEFAULT_INSTANCE_TRANSFORM as k, DEFAULT_MESH_GEOMETRY_PARAMETERS as l, DEFAULT_PHYSICS_STATE as m, DEFAULT_POSE_CURLS as n, DEFAULT_POSE_DIRECTIONS as o, DEFAULT_RIGIDBODY_STATE as p, EntityType as q, ImageTarget as r, ImageTargetAnchor as s, type ImageTargetAnchorOptions as t, type ImageTargetReference as u, InstanceSlotComponent as v, type InstanceTransform as w, InstancedMeshComponent as x, type InstancedMeshKind as y, type LightShadowState as z };
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
|
|
6
|
+
// core/animation/humanoid.ts
|
|
7
|
+
var REQUIRED_HUMANOID_BONES = [
|
|
8
|
+
"hips",
|
|
9
|
+
"spine",
|
|
10
|
+
"head",
|
|
11
|
+
"leftUpperArm",
|
|
12
|
+
"leftLowerArm",
|
|
13
|
+
"leftHand",
|
|
14
|
+
"rightUpperArm",
|
|
15
|
+
"rightLowerArm",
|
|
16
|
+
"rightHand",
|
|
17
|
+
"leftUpperLeg",
|
|
18
|
+
"leftLowerLeg",
|
|
19
|
+
"leftFoot",
|
|
20
|
+
"rightUpperLeg",
|
|
21
|
+
"rightLowerLeg",
|
|
22
|
+
"rightFoot"
|
|
23
|
+
];
|
|
24
|
+
var qmul = /* @__PURE__ */ __name((a, b) => [
|
|
25
|
+
a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],
|
|
26
|
+
a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],
|
|
27
|
+
a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],
|
|
28
|
+
a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2]
|
|
29
|
+
], "qmul");
|
|
30
|
+
var qinv = /* @__PURE__ */ __name((q) => [-q[0], -q[1], -q[2], q[3]], "qinv");
|
|
31
|
+
var qrot = /* @__PURE__ */ __name((q, v) => {
|
|
32
|
+
const r = qmul(qmul(q, [v[0], v[1], v[2], 0]), qinv(q));
|
|
33
|
+
return [r[0], r[1], r[2]];
|
|
34
|
+
}, "qrot");
|
|
35
|
+
function restPositions(root) {
|
|
36
|
+
const out = /* @__PURE__ */ new Map();
|
|
37
|
+
const walk = /* @__PURE__ */ __name((n, pq, pp, ps) => {
|
|
38
|
+
const t = qrot(pq, [n.translation[0] * ps, n.translation[1] * ps, n.translation[2] * ps]);
|
|
39
|
+
const p = [pp[0] + t[0], pp[1] + t[1], pp[2] + t[2]];
|
|
40
|
+
out.set(n.name, p);
|
|
41
|
+
const q = qmul(pq, n.rotation);
|
|
42
|
+
const s = ps * (n.scale?.[0] ?? 1);
|
|
43
|
+
for (const c of n.children) walk(c, q, p, s);
|
|
44
|
+
}, "walk");
|
|
45
|
+
walk(root, [0, 0, 0, 1], [0, 0, 0], 1);
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
__name(restPositions, "restPositions");
|
|
49
|
+
function splitBoneName(raw) {
|
|
50
|
+
let n = raw.replace(/^.*[:|]/, "").replace(/^(mixamorig\d*|def[-_]|org[-_]|mch[-_]|bip\d*[ _]|b[-_])/i, "").trim();
|
|
51
|
+
let side = null;
|
|
52
|
+
const sided = [
|
|
53
|
+
[/^left[\s_.-]*/i, "left"],
|
|
54
|
+
[/^right[\s_.-]*/i, "right"],
|
|
55
|
+
[/^l[\s_.-]+/i, "left"],
|
|
56
|
+
[/^r[\s_.-]+/i, "right"],
|
|
57
|
+
[/[\s_.-]+l$/i, "left"],
|
|
58
|
+
[/[\s_.-]+r$/i, "right"],
|
|
59
|
+
[/[\s_.-]*left$/i, "left"],
|
|
60
|
+
[/[\s_.-]*right$/i, "right"]
|
|
61
|
+
];
|
|
62
|
+
for (const [re, s] of sided) {
|
|
63
|
+
if (re.test(n)) {
|
|
64
|
+
side = s;
|
|
65
|
+
n = n.replace(re, "");
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { side, base: n.toLowerCase().replace(/[^a-z0-9]/g, "") };
|
|
70
|
+
}
|
|
71
|
+
__name(splitBoneName, "splitBoneName");
|
|
72
|
+
var LIMB_BASES = [
|
|
73
|
+
[/^(shoulder|clavicle|collar(bone)?)$/, "Shoulder"],
|
|
74
|
+
[/^(upperarm|uparm|arm)$/, "UpperArm"],
|
|
75
|
+
[/^(forearm|lowerarm|elbow|loarm)$/, "LowerArm"],
|
|
76
|
+
[/^(hand|wrist)$/, "Hand"],
|
|
77
|
+
[/^(upleg|upperleg|thigh|hipjoint)$/, "UpperLeg"],
|
|
78
|
+
[/^(leg|lowerleg|calf|shin|knee)$/, "LowerLeg"],
|
|
79
|
+
[/^(foot|ankle)$/, "Foot"],
|
|
80
|
+
[/^(toebase|toe|toes|ball)$/, "Toes"]
|
|
81
|
+
];
|
|
82
|
+
var FINGERS = [
|
|
83
|
+
[/^thumb/, "Thumb"],
|
|
84
|
+
[/^(index|pointer)/, "Index"],
|
|
85
|
+
[/^(middle|fingers)/, "Middle"],
|
|
86
|
+
[/^ring/, "Ring"],
|
|
87
|
+
[/^(pinky|little|small)/, "Little"]
|
|
88
|
+
];
|
|
89
|
+
function fingerJoint(finger, digits) {
|
|
90
|
+
const n = digits === "" ? 1 : Number(digits);
|
|
91
|
+
const joints = finger === "Thumb" ? ["Metacarpal", "Proximal", "Distal"] : ["Proximal", "Intermediate", "Distal"];
|
|
92
|
+
return joints[n - 1] ?? null;
|
|
93
|
+
}
|
|
94
|
+
__name(fingerJoint, "fingerJoint");
|
|
95
|
+
function sidedBone(base, side) {
|
|
96
|
+
for (const [re, part] of LIMB_BASES) {
|
|
97
|
+
if (re.test(base)) return `${side}${part}`;
|
|
98
|
+
}
|
|
99
|
+
const f = base.replace(/^hand(?=(thumb|index|middle|ring|pinky|little))/, "");
|
|
100
|
+
for (const [re, finger] of FINGERS) {
|
|
101
|
+
if (!re.test(f)) continue;
|
|
102
|
+
const digits = /(\d+)$/.exec(f)?.[1] ?? "";
|
|
103
|
+
const joint = fingerJoint(finger, digits.replace(/^0+/, ""));
|
|
104
|
+
return joint ? `${side}${finger}${joint}` : null;
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
__name(sidedBone, "sidedBone");
|
|
109
|
+
var VRM_LOWER = /* @__PURE__ */ new Map();
|
|
110
|
+
var VRM_FINGER = /^(left|right)(Thumb|Index|Middle|Ring|Little)(Metacarpal|Proximal|Intermediate|Distal)$/;
|
|
111
|
+
function vrmBone(raw) {
|
|
112
|
+
const name = raw.replace(/^.*[:|]/, "");
|
|
113
|
+
if (VRM_FINGER.test(name)) return name;
|
|
114
|
+
if (VRM_LOWER.size === 0) {
|
|
115
|
+
const sides = ["left", "right"];
|
|
116
|
+
const parts = ["Shoulder", "UpperArm", "LowerArm", "Hand", "UpperLeg", "LowerLeg", "Foot", "Toes"];
|
|
117
|
+
for (const s of sides) for (const p of parts) VRM_LOWER.set(`${s}${p}`.toLowerCase(), `${s}${p}`);
|
|
118
|
+
for (const b of ["hips", "spine", "chest", "upperChest", "neck", "head"])
|
|
119
|
+
VRM_LOWER.set(b.toLowerCase(), b);
|
|
120
|
+
}
|
|
121
|
+
return VRM_LOWER.get(name.toLowerCase()) ?? null;
|
|
122
|
+
}
|
|
123
|
+
__name(vrmBone, "vrmBone");
|
|
124
|
+
function profileOf(names) {
|
|
125
|
+
if (names.some((n) => /^mixamorig/i.test(n))) return "mixamo";
|
|
126
|
+
if (names.some((n) => /^(upperarm|lowerarm|thigh|calf)_[lr]$/i.test(n))) return "unreal";
|
|
127
|
+
if (names.some((n) => /\.[LR]$/.test(n))) return "rigify";
|
|
128
|
+
if (names.some((n) => /^leftUpperArm$/.test(n))) return "vrm";
|
|
129
|
+
if (names.some((n) => /^Spine0[12]$/.test(n))) return "meshy";
|
|
130
|
+
return "generic";
|
|
131
|
+
}
|
|
132
|
+
__name(profileOf, "profileOf");
|
|
133
|
+
function findHips(root) {
|
|
134
|
+
let found = null;
|
|
135
|
+
const walk = /* @__PURE__ */ __name((n) => {
|
|
136
|
+
if (found) return;
|
|
137
|
+
const { base } = splitBoneName(n.name);
|
|
138
|
+
if (/^(hips|hip|pelvis)$/.test(base)) {
|
|
139
|
+
found = n;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
for (const c of n.children) walk(c);
|
|
143
|
+
}, "walk");
|
|
144
|
+
walk(root);
|
|
145
|
+
return found;
|
|
146
|
+
}
|
|
147
|
+
__name(findHips, "findHips");
|
|
148
|
+
var isSpineLike = /* @__PURE__ */ __name((base) => /^(spine|chest|upperchest|torso|back)\d*$/.test(base), "isSpineLike");
|
|
149
|
+
function detectRig(root) {
|
|
150
|
+
const all = [];
|
|
151
|
+
const collect = /* @__PURE__ */ __name((n) => {
|
|
152
|
+
all.push(n);
|
|
153
|
+
for (const c of n.children) collect(c);
|
|
154
|
+
}, "collect");
|
|
155
|
+
collect(root);
|
|
156
|
+
const profile = profileOf(all.map((n) => n.name));
|
|
157
|
+
const bones = {};
|
|
158
|
+
const set = /* @__PURE__ */ __name((b, name) => {
|
|
159
|
+
if (!bones[b]) bones[b] = name;
|
|
160
|
+
}, "set");
|
|
161
|
+
const hips = findHips(root);
|
|
162
|
+
const positions = restPositions(root);
|
|
163
|
+
if (hips) {
|
|
164
|
+
set("hips", hips.name);
|
|
165
|
+
const chain = [];
|
|
166
|
+
let cur = hips;
|
|
167
|
+
while (cur) {
|
|
168
|
+
const next = cur.children.find((c) => isSpineLike(splitBoneName(c.name).base));
|
|
169
|
+
if (!next) break;
|
|
170
|
+
chain.push(next);
|
|
171
|
+
cur = next;
|
|
172
|
+
}
|
|
173
|
+
if (chain[0]) set("spine", chain[0].name);
|
|
174
|
+
if (chain[1]) set("chest", chain[1].name);
|
|
175
|
+
if (chain[2]) set("upperChest", chain[chain.length - 1].name);
|
|
176
|
+
}
|
|
177
|
+
for (const n of all) {
|
|
178
|
+
const vrm = vrmBone(n.name);
|
|
179
|
+
if (vrm) {
|
|
180
|
+
set(vrm, n.name);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const { side, base } = splitBoneName(n.name);
|
|
184
|
+
if (/^neck\d*$/.test(base)) {
|
|
185
|
+
set("neck", n.name);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (/^head$/.test(base)) {
|
|
189
|
+
set("head", n.name);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (base === "hips" || base === "pelvis" || isSpineLike(base)) continue;
|
|
193
|
+
const s = side ?? (() => {
|
|
194
|
+
const p = positions.get(n.name);
|
|
195
|
+
const h = hips ? positions.get(hips.name) : void 0;
|
|
196
|
+
if (!p || !h || Math.abs(p[0] - h[0]) < 1e-4) return null;
|
|
197
|
+
return p[0] > h[0] ? "left" : "right";
|
|
198
|
+
})();
|
|
199
|
+
if (!s) continue;
|
|
200
|
+
const b = sidedBone(base, s);
|
|
201
|
+
if (b) set(b, n.name);
|
|
202
|
+
}
|
|
203
|
+
const byName = /* @__PURE__ */ new Map();
|
|
204
|
+
for (const [b, name] of Object.entries(bones)) byName.set(name, b);
|
|
205
|
+
let armDrop = null;
|
|
206
|
+
const ua = bones.leftUpperArm && positions.get(bones.leftUpperArm);
|
|
207
|
+
const la = bones.leftLowerArm && positions.get(bones.leftLowerArm);
|
|
208
|
+
if (ua && la) {
|
|
209
|
+
const d = [la[0] - ua[0], la[1] - ua[1], la[2] - ua[2]];
|
|
210
|
+
const len = Math.hypot(d[0], d[1], d[2]) || 1;
|
|
211
|
+
armDrop = Math.asin(Math.max(-1, Math.min(1, -d[1] / len))) * 180 / Math.PI;
|
|
212
|
+
}
|
|
213
|
+
const restPose = armDrop === null ? "unknown" : armDrop < 15 ? "T" : armDrop <= 65 ? "A" : "unknown";
|
|
214
|
+
return {
|
|
215
|
+
profile,
|
|
216
|
+
bones,
|
|
217
|
+
byName,
|
|
218
|
+
restPose,
|
|
219
|
+
armDrop,
|
|
220
|
+
missing: REQUIRED_HUMANOID_BONES.filter((b) => !bones[b])
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
__name(detectRig, "detectRig");
|
|
224
|
+
function mirrorHumanoidBone(b) {
|
|
225
|
+
if (b.startsWith("left")) return `right${b.slice(4)}`;
|
|
226
|
+
if (b.startsWith("right")) return `left${b.slice(5)}`;
|
|
227
|
+
return b;
|
|
228
|
+
}
|
|
229
|
+
__name(mirrorHumanoidBone, "mirrorHumanoidBone");
|
|
230
|
+
function skeletonFromObject3D(object) {
|
|
231
|
+
const o = object;
|
|
232
|
+
return {
|
|
233
|
+
name: o.name,
|
|
234
|
+
translation: [o.position.x, o.position.y, o.position.z],
|
|
235
|
+
rotation: [o.quaternion.x, o.quaternion.y, o.quaternion.z, o.quaternion.w],
|
|
236
|
+
scale: o.scale ? [o.scale.x, o.scale.y, o.scale.z] : void 0,
|
|
237
|
+
children: o.children.map(skeletonFromObject3D)
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
__name(skeletonFromObject3D, "skeletonFromObject3D");
|
|
241
|
+
|
|
242
|
+
exports.REQUIRED_HUMANOID_BONES = REQUIRED_HUMANOID_BONES;
|
|
243
|
+
exports.detectRig = detectRig;
|
|
244
|
+
exports.mirrorHumanoidBone = mirrorHumanoidBone;
|
|
245
|
+
exports.qinv = qinv;
|
|
246
|
+
exports.qmul = qmul;
|
|
247
|
+
exports.qrot = qrot;
|
|
248
|
+
exports.restPositions = restPositions;
|
|
249
|
+
exports.skeletonFromObject3D = skeletonFromObject3D;
|
|
250
|
+
exports.splitBoneName = splitBoneName;
|
|
251
|
+
//# sourceMappingURL=index.cjs.map
|
|
252
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -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"]}
|