@relu-interactives/spatial-ecs 0.3.18 → 0.3.19
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/{XRHandPose-B8xxFb9A.d.cts → XRHandPose-CLl4MiHx.d.cts} +12 -2
- package/dist/{XRHandPose-ubMe5Igc.d.ts → XRHandPose-CrzI57JA.d.ts} +12 -2
- package/dist/{chunk-PFE2SDXR.js → chunk-D6KXWNYT.js} +3 -3
- package/dist/{chunk-PFE2SDXR.js.map → chunk-D6KXWNYT.js.map} +1 -1
- package/dist/{chunk-J3EUNW57.js → chunk-H6DQ7JRE.js} +48 -18
- package/dist/chunk-H6DQ7JRE.js.map +1 -0
- package/dist/{chunk-7SSOZWXM.js → chunk-JYKFLQB5.js} +46 -5
- package/dist/chunk-JYKFLQB5.js.map +1 -0
- package/dist/{chunk-KRWBNC6Y.js → chunk-P42OE3RU.js} +4 -4
- package/dist/{chunk-KRWBNC6Y.js.map → chunk-P42OE3RU.js.map} +1 -1
- package/dist/components/index.cjs +33 -10
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.cts +3 -3
- package/dist/components/index.d.ts +3 -3
- package/dist/components/index.js +1 -1
- package/dist/docs/guide/vr-and-hand-poses.md +67 -0
- package/dist/factories/index.cjs +8 -0
- package/dist/factories/index.cjs.map +1 -1
- package/dist/factories/index.d.cts +2 -2
- package/dist/factories/index.d.ts +2 -2
- package/dist/factories/index.js +3 -3
- package/dist/{handPose-dFxqbFFY.d.cts → handPose-DlcTtqgx.d.cts} +26 -1
- package/dist/{handPose-dFxqbFFY.d.ts → handPose-DlcTtqgx.d.ts} +26 -1
- package/dist/{index-7CFf45fo.d.cts → index-3pNbH0iP.d.cts} +1 -1
- package/dist/{index-D7aSZ-e9.d.ts → index-C_589fc4.d.ts} +1 -1
- package/dist/{index-DhWfxUgL.d.ts → index-JRcoel9F.d.ts} +3 -2
- package/dist/{index-CA9fqh4Z.d.cts → index-g777AmFv.d.cts} +3 -2
- package/dist/index.cjs +87 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -8
- package/dist/index.d.ts +11 -8
- package/dist/index.js +8 -8
- package/dist/systems/index.cjs +78 -15
- package/dist/systems/index.cjs.map +1 -1
- package/dist/systems/index.d.cts +2 -2
- package/dist/systems/index.d.ts +2 -2
- package/dist/systems/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-7SSOZWXM.js.map +0 -1
- package/dist/chunk-J3EUNW57.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
2
|
import { C as Component, p as EcsEntityKind, F as EcsEntityEditorKind, r as EntityId } from './System-BhnLw0fZ.cjs';
|
|
3
3
|
import * as RAPIER from '@dimforge/rapier3d-compat';
|
|
4
|
-
import { a as XrFinger, b as XrHandPoseOrientation, X as XrHandPoseDefinition } from './handPose-
|
|
4
|
+
import { a as XrFinger, c as XrHandPoseDirection, b as XrHandPoseOrientation, X as XrHandPoseDefinition } from './handPose-DlcTtqgx.cjs';
|
|
5
5
|
|
|
6
6
|
interface StateMachine {
|
|
7
7
|
name: string;
|
|
@@ -1607,6 +1607,15 @@ type XrHandPoseEntry = {
|
|
|
1607
1607
|
curls: Record<XrFinger, number>;
|
|
1608
1608
|
/** Slack around each curl target. Larger is easier to perform. */
|
|
1609
1609
|
tolerance: number;
|
|
1610
|
+
/**
|
|
1611
|
+
* Directions each finger may point. Empty means the finger may point anywhere.
|
|
1612
|
+
*
|
|
1613
|
+
* Any ONE listed direction satisfies the finger, mirroring fingerpose's
|
|
1614
|
+
* `addDirection` — "thumb up OR diagonally up" is one pose, not two.
|
|
1615
|
+
*/
|
|
1616
|
+
directions: Record<XrFinger, XrHandPoseDirection[]>;
|
|
1617
|
+
/** How far a finger may point from an accepted direction, in degrees. */
|
|
1618
|
+
directionTolerance: number;
|
|
1610
1619
|
/** Which hand may trigger it; null for either. */
|
|
1611
1620
|
hand: "left" | "right" | null;
|
|
1612
1621
|
/** Optional direction requirement. */
|
|
@@ -1620,6 +1629,7 @@ type XRHandPoseOptions = {
|
|
|
1620
1629
|
poses?: XrHandPoseEntry[];
|
|
1621
1630
|
};
|
|
1622
1631
|
declare const DEFAULT_POSE_CURLS: Record<XrFinger, number>;
|
|
1632
|
+
declare const DEFAULT_POSE_DIRECTIONS: Record<XrFinger, XrHandPoseDirection[]>;
|
|
1623
1633
|
/** A pose entry with every field populated, for the editor and AI tools. */
|
|
1624
1634
|
declare function createHandPoseEntry(partial: Partial<XrHandPoseEntry> & {
|
|
1625
1635
|
id: string;
|
|
@@ -1647,4 +1657,4 @@ declare class XRHandPoseComponent extends Component {
|
|
|
1647
1657
|
constructor(options?: XRHandPoseOptions);
|
|
1648
1658
|
}
|
|
1649
1659
|
|
|
1650
|
-
export {
|
|
1660
|
+
export { Selectable as $, AnimationComponent as A, type MaterialValueState as B, CameraComponent as C, DEFAULT_COLLIDER_STATE as D, type EditableMeshObjectKind as E, MeshComponent as F, MeshGeometryComponent as G, type MeshGeometryParameters as H, ImageComponent as I, type MeshGeometryParametersByKind as J, ModelComponent as K, LightComponent as L, MaterialComponent as M, Name as N, Object3DRef as O, PhysicsComponent as P, type PhysicsState as Q, type PlaneMeshParameters as R, type RadiusHeightMeshParameters as S, type RadiusMeshParameters as T, type RigidbodyState as U, type RigidbodyType as V, ScriptComponent as W, type ScriptEntry as X, ScriptObjectComponent as Y, type ScriptObjectComponentInput as Z, type ScriptObjectRuntimeState as _, type AnimationComponentOptions as a, SelectionTransformState as a0, SpriteComponent as a1, type TextureFilteringValue as a2, type TransformModeValue as a3, type TransformSpaceValue as a4, VRTeleportAreaComponent as a5, type VRTeleportAreaOptions as a6, VideoComponent as a7, type VrTeleportShape as a8, XRHandPoseComponent as a9, type AnimationStateCallbacks as aA, AnimationStateMachine as aB, AnimationStateManager as aC, type StateMachine as aD, type XRHandPoseOptions as aa, XRInteractableComponent as ab, type XRInteractableOptions as ac, XRInteractorComponent as ad, type XRInteractorOptions as ae, XRInteractorSideComponent as af, XRRigComponent as ag, type XRRigOptions as ah, type XrAttachPoint as ai, type XrDistanceGrabBehavior as aj, type XrGrabGesture as ak, type XrGrabHands as al, type XrGrabReach as am, type XrHandPoseEntry as an, type XrHandPreset as ao, type XrInteractorSide as ap, type XrInteractorType as aq, type XrLocomotionMode as ar, type XrTrackingOrigin as as, type XrTwoHandRotation as at, createAttachPoint as au, createHandPoseEntry as av, defaultMaterialValue as aw, handPoseDefinitionFor as ax, normalizePhysicsState as ay, setPhysicsLiveRef as az, AudioComponent as b, type CameraComponentOptions as c, type CameraProjection as d, type CameraRuntimeType as e, type ColliderShape as f, type ColliderState as g, type CubeMeshParameters as h, DEFAULT_INSTANCED_MESH_PARAMETERS as i, DEFAULT_INSTANCE_TRANSFORM as j, DEFAULT_MESH_GEOMETRY_PARAMETERS as k, DEFAULT_PHYSICS_STATE as l, DEFAULT_POSE_CURLS as m, DEFAULT_POSE_DIRECTIONS as n, DEFAULT_RIGIDBODY_STATE as o, EntityType as p, ImageTarget as q, ImageTargetAnchor as r, type ImageTargetAnchorOptions as s, type ImageTargetReference as t, InstanceSlotComponent as u, type InstanceTransform as v, InstancedMeshComponent as w, type InstancedMeshKind as x, type LightValueState as y, type MaterialTypeValue as z };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
2
|
import { C as Component, p as EcsEntityKind, F as EcsEntityEditorKind, r as EntityId } from './System-BhnLw0fZ.js';
|
|
3
3
|
import * as RAPIER from '@dimforge/rapier3d-compat';
|
|
4
|
-
import { a as XrFinger, b as XrHandPoseOrientation, X as XrHandPoseDefinition } from './handPose-
|
|
4
|
+
import { a as XrFinger, c as XrHandPoseDirection, b as XrHandPoseOrientation, X as XrHandPoseDefinition } from './handPose-DlcTtqgx.js';
|
|
5
5
|
|
|
6
6
|
interface StateMachine {
|
|
7
7
|
name: string;
|
|
@@ -1607,6 +1607,15 @@ type XrHandPoseEntry = {
|
|
|
1607
1607
|
curls: Record<XrFinger, number>;
|
|
1608
1608
|
/** Slack around each curl target. Larger is easier to perform. */
|
|
1609
1609
|
tolerance: number;
|
|
1610
|
+
/**
|
|
1611
|
+
* Directions each finger may point. Empty means the finger may point anywhere.
|
|
1612
|
+
*
|
|
1613
|
+
* Any ONE listed direction satisfies the finger, mirroring fingerpose's
|
|
1614
|
+
* `addDirection` — "thumb up OR diagonally up" is one pose, not two.
|
|
1615
|
+
*/
|
|
1616
|
+
directions: Record<XrFinger, XrHandPoseDirection[]>;
|
|
1617
|
+
/** How far a finger may point from an accepted direction, in degrees. */
|
|
1618
|
+
directionTolerance: number;
|
|
1610
1619
|
/** Which hand may trigger it; null for either. */
|
|
1611
1620
|
hand: "left" | "right" | null;
|
|
1612
1621
|
/** Optional direction requirement. */
|
|
@@ -1620,6 +1629,7 @@ type XRHandPoseOptions = {
|
|
|
1620
1629
|
poses?: XrHandPoseEntry[];
|
|
1621
1630
|
};
|
|
1622
1631
|
declare const DEFAULT_POSE_CURLS: Record<XrFinger, number>;
|
|
1632
|
+
declare const DEFAULT_POSE_DIRECTIONS: Record<XrFinger, XrHandPoseDirection[]>;
|
|
1623
1633
|
/** A pose entry with every field populated, for the editor and AI tools. */
|
|
1624
1634
|
declare function createHandPoseEntry(partial: Partial<XrHandPoseEntry> & {
|
|
1625
1635
|
id: string;
|
|
@@ -1647,4 +1657,4 @@ declare class XRHandPoseComponent extends Component {
|
|
|
1647
1657
|
constructor(options?: XRHandPoseOptions);
|
|
1648
1658
|
}
|
|
1649
1659
|
|
|
1650
|
-
export {
|
|
1660
|
+
export { Selectable as $, AnimationComponent as A, type MaterialValueState as B, CameraComponent as C, DEFAULT_COLLIDER_STATE as D, type EditableMeshObjectKind as E, MeshComponent as F, MeshGeometryComponent as G, type MeshGeometryParameters as H, ImageComponent as I, type MeshGeometryParametersByKind as J, ModelComponent as K, LightComponent as L, MaterialComponent as M, Name as N, Object3DRef as O, PhysicsComponent as P, type PhysicsState as Q, type PlaneMeshParameters as R, type RadiusHeightMeshParameters as S, type RadiusMeshParameters as T, type RigidbodyState as U, type RigidbodyType as V, ScriptComponent as W, type ScriptEntry as X, ScriptObjectComponent as Y, type ScriptObjectComponentInput as Z, type ScriptObjectRuntimeState as _, type AnimationComponentOptions as a, SelectionTransformState as a0, SpriteComponent as a1, type TextureFilteringValue as a2, type TransformModeValue as a3, type TransformSpaceValue as a4, VRTeleportAreaComponent as a5, type VRTeleportAreaOptions as a6, VideoComponent as a7, type VrTeleportShape as a8, XRHandPoseComponent as a9, type AnimationStateCallbacks as aA, AnimationStateMachine as aB, AnimationStateManager as aC, type StateMachine as aD, type XRHandPoseOptions as aa, XRInteractableComponent as ab, type XRInteractableOptions as ac, XRInteractorComponent as ad, type XRInteractorOptions as ae, XRInteractorSideComponent as af, XRRigComponent as ag, type XRRigOptions as ah, type XrAttachPoint as ai, type XrDistanceGrabBehavior as aj, type XrGrabGesture as ak, type XrGrabHands as al, type XrGrabReach as am, type XrHandPoseEntry as an, type XrHandPreset as ao, type XrInteractorSide as ap, type XrInteractorType as aq, type XrLocomotionMode as ar, type XrTrackingOrigin as as, type XrTwoHandRotation as at, createAttachPoint as au, createHandPoseEntry as av, defaultMaterialValue as aw, handPoseDefinitionFor as ax, normalizePhysicsState as ay, setPhysicsLiveRef as az, AudioComponent as b, type CameraComponentOptions as c, type CameraProjection as d, type CameraRuntimeType as e, type ColliderShape as f, type ColliderState as g, type CubeMeshParameters as h, DEFAULT_INSTANCED_MESH_PARAMETERS as i, DEFAULT_INSTANCE_TRANSFORM as j, DEFAULT_MESH_GEOMETRY_PARAMETERS as k, DEFAULT_PHYSICS_STATE as l, DEFAULT_POSE_CURLS as m, DEFAULT_POSE_DIRECTIONS as n, DEFAULT_RIGIDBODY_STATE as o, EntityType as p, ImageTarget as q, ImageTargetAnchor as r, type ImageTargetAnchorOptions as s, type ImageTargetReference as t, InstanceSlotComponent as u, type InstanceTransform as v, InstancedMeshComponent as w, type InstancedMeshKind as x, type LightValueState as y, type MaterialTypeValue as z };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TransformComponent, Object3DRef, ParentId } from './chunk-
|
|
1
|
+
import { TransformComponent, Object3DRef, ParentId } from './chunk-H6DQ7JRE.js';
|
|
2
2
|
import { __name } from './chunk-OY7ZODZP.js';
|
|
3
3
|
import * as THREE2 from 'three';
|
|
4
4
|
import { clone } from 'three/examples/jsm/utils/SkeletonUtils.js';
|
|
@@ -311,5 +311,5 @@ function resolveDracoDecoderPath() {
|
|
|
311
311
|
__name(resolveDracoDecoderPath, "resolveDracoDecoderPath");
|
|
312
312
|
|
|
313
313
|
export { ObjectManagementSystem, SHARED_MODEL_RESOURCE_FLAG, applyTransform, clearModelCache, cloneModelScene, createTransform, loadSharedGltf, resolveDracoDecoderPath, setDracoDecoderPath };
|
|
314
|
-
//# sourceMappingURL=chunk-
|
|
315
|
-
//# sourceMappingURL=chunk-
|
|
314
|
+
//# sourceMappingURL=chunk-D6KXWNYT.js.map
|
|
315
|
+
//# sourceMappingURL=chunk-D6KXWNYT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../core/utils/modelCache.ts","../core/systems/ObjectManagementSystem.ts","../core/utils/dracoDecoderPath.ts"],"names":["THREE","cloneWithSkeleton"],"mappings":"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","file":"chunk-PFE2SDXR.js","sourcesContent":["import * as THREE from \"three\";\nimport type { GLTF } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { clone as cloneWithSkeleton } from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\n/**\n * userData flag set on geometries/materials that back shared (cached) model\n * scenes. Entity disposal must skip these — other live clones and future\n * spawns reference the same GPU resources.\n */\nexport const SHARED_MODEL_RESOURCE_FLAG = \"spatialEcsSharedModelResource\";\n\nconst modelCache = new Map<string, Promise<GLTF>>();\n\nfunction markSharedResources(root: THREE.Object3D): void {\n root.traverse((child) => {\n if (!(child instanceof THREE.Mesh)) {\n return;\n }\n if (child.geometry) {\n child.geometry.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const material of materials) {\n if (material) {\n material.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n }\n });\n}\n\n/**\n * Load a GLTF once per URL and share the parsed result, so repeated spawns of\n * the same model skip both the fetch and the parse. The cached scene must\n * never be mounted directly (an Object3D has a single parent) — mount a\n * cloneModelScene() of it. Failed loads are evicted so a retry re-fetches.\n */\nexport function loadSharedGltf(\n url: string,\n load: () => Promise<GLTF>,\n): Promise<GLTF> {\n let pending = modelCache.get(url);\n if (!pending) {\n pending = load().then((gltf) => {\n markSharedResources(gltf.scene);\n return gltf;\n });\n pending.catch(() => {\n modelCache.delete(url);\n });\n modelCache.set(url, pending);\n }\n return pending;\n}\n\n/**\n * Skeleton-aware clone of a cached model scene for mounting. Geometries and\n * materials are shared with the cached original (marked via\n * SHARED_MODEL_RESOURCE_FLAG); the object hierarchy — including rebound\n * skeletons for skinned meshes — is fresh per call.\n */\nexport function cloneModelScene(scene: THREE.Object3D): THREE.Object3D {\n return cloneWithSkeleton(scene);\n}\n\n/**\n * Forget cached models (one URL, or everything). Subsequent loads fetch and\n * parse anew. Does not dispose GPU resources — live clones may still use them.\n */\nexport function clearModelCache(url?: string): void {\n if (typeof url === \"string\") {\n modelCache.delete(url);\n return;\n }\n modelCache.clear();\n}\n","import * as THREE from \"three\";\n\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport type { TransformData } from \"../components/Transform\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport type { EntityId, EcsEntityKind } from \"../types\";\n\nexport type CreatePayload = {\n name?: string;\n transform?: TransformData;\n parentId?: EntityId | null;\n path?: string;\n options?: Record<string, unknown>;\n camera?: Record<string, unknown>;\n useWorldCamera?: boolean;\n /**\n * Suppress the default child entities a factory would otherwise create.\n *\n * Set during hydration: the snapshot already contains those children, so\n * letting the factory add its own too duplicates them on every load.\n */\n skipDefaultChildren?: boolean;\n};\n\nexport type CreateContext = {\n world: World;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n payload: CreatePayload;\n isEditor?: boolean;\n};\n\nexport type EntityFactory = (context: CreateContext) => EntityId;\n\nexport type EcsComponentFactoryKind =\n | \"animation\"\n | \"audio\"\n | \"camera\"\n | \"environment\"\n | \"entityType\"\n | \"image\"\n | \"imageTargetAnchor\"\n | \"imageTarget\"\n | \"light\"\n | \"material\"\n | \"mesh\"\n | \"meshGeometry\"\n | \"model\"\n | \"name\"\n | \"object3DRef\"\n | \"parentId\"\n | \"physics\"\n | \"postprocessing\"\n | \"script\"\n | \"scriptObject\"\n | \"selectable\"\n | \"selectionTransformState\"\n | \"sprite\"\n | \"transform\"\n | \"video\"\n | \"instancedMesh\"\n | \"xrRig\"\n | \"vrTeleportArea\"\n | \"xrHandPose\"\n | \"xrInteractable\"\n | \"xrInteractor\"\n | \"xrInteractorSide\";\n\nexport type ComponentFactory = (\n world: World,\n entityId: EntityId,\n ...args: any[]\n) => unknown;\n\ntype CreateRequest = {\n kind: EcsEntityKind;\n payload: CreatePayload;\n onCreated?: (entityId: EntityId) => void;\n};\n\nexport function createTransform(input?: TransformData): TransformComponent {\n return new TransformComponent(input);\n}\n\nexport function applyTransform(\n object: THREE.Object3D,\n transform: TransformComponent,\n): void {\n object.position.set(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n object.rotation.set(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n );\n object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n}\n\nexport class ObjectManagementSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly isEditor: boolean;\n private readonly registry = new Map<EcsEntityKind, EntityFactory>();\n private readonly componentRegistry = new Map<\n EcsComponentFactoryKind,\n ComponentFactory\n >();\n private readonly createQueue: CreateRequest[] = [];\n\n constructor(\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n isEditor = false,\n ) {\n this.scene = scene;\n this.camera = camera;\n this.isEditor = isEditor;\n }\n\n register(kind: EcsEntityKind, factory: EntityFactory): void {\n this.registry.set(kind, factory);\n }\n\n registerComponentFactory(\n kind: EcsComponentFactoryKind,\n factory: ComponentFactory,\n ): void {\n this.componentRegistry.set(kind, factory);\n }\n\n getOrCreateAudioListener(): THREE.AudioListener {\n const existing = this.camera.userData.ecsAudioListener;\n if (existing instanceof THREE.AudioListener) {\n return existing;\n }\n\n const listener = new THREE.AudioListener();\n this.camera.add(listener);\n this.camera.userData.ecsAudioListener = listener;\n return listener;\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n getComponentFactory(kind: EcsComponentFactoryKind): ComponentFactory | null {\n return this.componentRegistry.get(kind) ?? null;\n }\n\n createComponentNow(\n kind: EcsComponentFactoryKind,\n world: World,\n entityId: EntityId,\n ...args: any[]\n ): unknown {\n const factory = this.componentRegistry.get(kind);\n if (!factory) {\n throw new Error(`Unknown component kind: ${kind}`);\n }\n\n return factory(world, entityId, ...args);\n }\n\n requestCreate(\n kind: EcsEntityKind,\n payload: CreatePayload = {},\n onCreated?: (entityId: EntityId) => void,\n ): void {\n this.createQueue.push({ kind, payload, onCreated });\n }\n\n createNow(\n kind: EcsEntityKind,\n world: World,\n payload: CreatePayload = {},\n ): EntityId {\n const factory = this.registry.get(kind);\n if (!factory) {\n throw new Error(`Unknown object kind: ${kind}`);\n }\n\n const entityId = factory({\n world,\n scene: this.scene,\n camera: this.camera,\n payload,\n isEditor: this.isEditor,\n });\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n object.userData.ecsKind = kind;\n }\n\n if (payload.parentId !== undefined) {\n world.addComponent(entityId, new ParentId(payload.parentId));\n }\n\n return entityId;\n }\n\n /**\n * Removes an entity from the ECS world and its associated `Object3D` from the\n * THREE.js scene graph.\n *\n * @param world - The world the entity belongs to.\n * @param entityId - The entity to remove.\n * @param dispose - When `true`, traverses the entity's `Object3D` subtree and\n * calls `.dispose()` on every `BufferGeometry` and `Material` found. Pass\n * `true` when the entity will not be reused and you want to free GPU memory\n * immediately (e.g. dynamically spawned objects). Defaults to `false`.\n * @returns `true` if the entity existed and was removed; `false` if the entity\n * was not found.\n *\n * @example\n * ```ts\n * // Remove from scene, keep GPU resources (safe if geometry is shared)\n * objects.deleteEntity(world, entityId);\n *\n * // Remove from scene and free GPU memory (use for one-off spawned objects)\n * objects.deleteEntity(world, entityId, true);\n * ```\n */\n deleteEntity(world: World, entityId: EntityId, dispose = false): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n const object3d = world.getComponent(entityId, Object3DRef)?.object;\n if (object3d?.parent) {\n object3d.parent.remove(object3d);\n }\n\n if (dispose && object3d) {\n object3d.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n // Resources backing shared (cached) model scenes are skipped —\n // other live clones and future spawns reference the same objects.\n if (!child.geometry?.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n child.geometry?.dispose();\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const mat of materials) {\n if (mat && !mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n mat.dispose();\n }\n }\n }\n });\n }\n\n world.destroyEntity(entityId);\n return true;\n }\n\n setParent(\n world: World,\n entityId: EntityId,\n parentId: EntityId | null,\n options?: {\n preserveWorldTransform?: boolean;\n },\n ): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n if (parentId !== null && !world.hasEntity(parentId)) {\n return false;\n }\n\n if (parentId === entityId) {\n return false;\n }\n\n let ancestor = parentId;\n while (ancestor !== null) {\n if (ancestor === entityId) {\n return false;\n }\n\n ancestor = world.getComponent(ancestor, ParentId)?.value ?? null;\n }\n\n const parentComponent = world.getComponent(entityId, ParentId);\n if (parentComponent) {\n if (parentComponent.value === parentId) {\n return false;\n }\n\n parentComponent.value = parentId;\n } else {\n world.addComponent(entityId, new ParentId(parentId));\n }\n\n const preserveWorldTransform = options?.preserveWorldTransform ?? true;\n if (preserveWorldTransform) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const parentObject =\n parentId !== null\n ? world.getComponent(parentId, Object3DRef)?.object ?? null\n : null;\n\n if (object) {\n // Refresh matrixWorld before attach so world-space preservation is accurate.\n this.scene.updateMatrixWorld(true);\n\n if (parentObject && parentObject !== object) {\n parentObject.attach(object);\n } else {\n this.scene.attach(object);\n }\n\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n }\n\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n private syncTransformComponentFromObject(\n world: World,\n entityId: EntityId,\n object: THREE.Object3D,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) {\n return;\n }\n\n transform.position.x = object.position.x;\n transform.position.y = object.position.y;\n transform.position.z = object.position.z;\n\n transform.rotation.x = object.rotation.x;\n transform.rotation.y = object.rotation.y;\n transform.rotation.z = object.rotation.z;\n\n transform.scale.x = object.scale.x;\n transform.scale.y = object.scale.y;\n transform.scale.z = object.scale.z;\n }\n\n reconcileSceneFromWorld(world: World): void {\n const worldObjects = new Map<EntityId, THREE.Object3D>();\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) {\n continue;\n }\n\n worldObjects.set(entityId, object);\n }\n\n for (const child of [...this.scene.children]) {\n const entityId = child.userData?.entityId;\n if (typeof entityId === \"number\" && !world.hasEntity(entityId)) {\n this.scene.remove(child);\n }\n }\n\n for (const [entityId, object] of worldObjects.entries()) {\n const parentEntityId = world.getComponent(entityId, ParentId)?.value;\n const parentObject =\n typeof parentEntityId === \"number\"\n ? worldObjects.get(parentEntityId)\n : undefined;\n\n if (parentObject && parentObject !== object) {\n if (object.parent !== parentObject) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n parentObject.add(object);\n object.updateMatrixWorld(true);\n }\n continue;\n }\n\n if (object.parent !== this.scene) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n this.scene.add(object);\n object.updateMatrixWorld(true);\n }\n }\n }\n\n update(world: World): void {\n for (const request of this.createQueue.splice(0)) {\n const entityId = this.createNow(request.kind, world, request.payload);\n request.onCreated?.(entityId);\n }\n\n this.reconcileSceneFromWorld(world);\n }\n}\n","const LOCAL_DRACO_DECODER_RELATIVE_PATH = \"./assets/draco/\";\nexport const DRACO_DECODER_CDN_PATH =\n \"https://www.gstatic.com/draco/versioned/decoders/1.5.7/\";\n\nlet dracoDecoderPathOverride: string | null = null;\n\n/**\n * Override where the DRACO decoder files (draco_wasm_wrapper.js,\n * draco_decoder.wasm, draco_decoder.js) are fetched from. Embedding apps\n * whose bundlers relocate this package's chunks — making the default\n * import.meta.url resolution point at a location that is never populated —\n * should call this before any model loads. The path must end with \"/\".\n * Pass null to restore the default resolution.\n */\nexport function setDracoDecoderPath(path: string | null): void {\n dracoDecoderPathOverride = path;\n}\n\nfunction isBlockedBrowserFileUrl(url: string): boolean {\n return url.startsWith(\"file://\");\n}\n\nexport function resolveDracoDecoderPath(): string {\n if (dracoDecoderPathOverride) {\n return dracoDecoderPathOverride;\n }\n\n try {\n // Prefer vendored decoder assets shipped with this package.\n const resolvedPath = new URL(\n LOCAL_DRACO_DECODER_RELATIVE_PATH,\n import.meta.url,\n ).toString();\n\n // Browser loaders cannot fetch file:// resources from package install paths.\n // Fall back to CDN decoders when bundlers emit file URLs for node_modules assets.\n if (isBlockedBrowserFileUrl(resolvedPath)) {\n return DRACO_DECODER_CDN_PATH;\n }\n\n return resolvedPath;\n } catch {\n // Fallback keeps compatibility in runtimes that cannot resolve package-relative URLs.\n return DRACO_DECODER_CDN_PATH;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../core/utils/modelCache.ts","../core/systems/ObjectManagementSystem.ts","../core/utils/dracoDecoderPath.ts"],"names":["THREE","cloneWithSkeleton"],"mappings":"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","file":"chunk-D6KXWNYT.js","sourcesContent":["import * as THREE from \"three\";\nimport type { GLTF } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { clone as cloneWithSkeleton } from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\n/**\n * userData flag set on geometries/materials that back shared (cached) model\n * scenes. Entity disposal must skip these — other live clones and future\n * spawns reference the same GPU resources.\n */\nexport const SHARED_MODEL_RESOURCE_FLAG = \"spatialEcsSharedModelResource\";\n\nconst modelCache = new Map<string, Promise<GLTF>>();\n\nfunction markSharedResources(root: THREE.Object3D): void {\n root.traverse((child) => {\n if (!(child instanceof THREE.Mesh)) {\n return;\n }\n if (child.geometry) {\n child.geometry.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const material of materials) {\n if (material) {\n material.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n }\n });\n}\n\n/**\n * Load a GLTF once per URL and share the parsed result, so repeated spawns of\n * the same model skip both the fetch and the parse. The cached scene must\n * never be mounted directly (an Object3D has a single parent) — mount a\n * cloneModelScene() of it. Failed loads are evicted so a retry re-fetches.\n */\nexport function loadSharedGltf(\n url: string,\n load: () => Promise<GLTF>,\n): Promise<GLTF> {\n let pending = modelCache.get(url);\n if (!pending) {\n pending = load().then((gltf) => {\n markSharedResources(gltf.scene);\n return gltf;\n });\n pending.catch(() => {\n modelCache.delete(url);\n });\n modelCache.set(url, pending);\n }\n return pending;\n}\n\n/**\n * Skeleton-aware clone of a cached model scene for mounting. Geometries and\n * materials are shared with the cached original (marked via\n * SHARED_MODEL_RESOURCE_FLAG); the object hierarchy — including rebound\n * skeletons for skinned meshes — is fresh per call.\n */\nexport function cloneModelScene(scene: THREE.Object3D): THREE.Object3D {\n return cloneWithSkeleton(scene);\n}\n\n/**\n * Forget cached models (one URL, or everything). Subsequent loads fetch and\n * parse anew. Does not dispose GPU resources — live clones may still use them.\n */\nexport function clearModelCache(url?: string): void {\n if (typeof url === \"string\") {\n modelCache.delete(url);\n return;\n }\n modelCache.clear();\n}\n","import * as THREE from \"three\";\n\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport type { TransformData } from \"../components/Transform\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport type { EntityId, EcsEntityKind } from \"../types\";\n\nexport type CreatePayload = {\n name?: string;\n transform?: TransformData;\n parentId?: EntityId | null;\n path?: string;\n options?: Record<string, unknown>;\n camera?: Record<string, unknown>;\n useWorldCamera?: boolean;\n /**\n * Suppress the default child entities a factory would otherwise create.\n *\n * Set during hydration: the snapshot already contains those children, so\n * letting the factory add its own too duplicates them on every load.\n */\n skipDefaultChildren?: boolean;\n};\n\nexport type CreateContext = {\n world: World;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n payload: CreatePayload;\n isEditor?: boolean;\n};\n\nexport type EntityFactory = (context: CreateContext) => EntityId;\n\nexport type EcsComponentFactoryKind =\n | \"animation\"\n | \"audio\"\n | \"camera\"\n | \"environment\"\n | \"entityType\"\n | \"image\"\n | \"imageTargetAnchor\"\n | \"imageTarget\"\n | \"light\"\n | \"material\"\n | \"mesh\"\n | \"meshGeometry\"\n | \"model\"\n | \"name\"\n | \"object3DRef\"\n | \"parentId\"\n | \"physics\"\n | \"postprocessing\"\n | \"script\"\n | \"scriptObject\"\n | \"selectable\"\n | \"selectionTransformState\"\n | \"sprite\"\n | \"transform\"\n | \"video\"\n | \"instancedMesh\"\n | \"xrRig\"\n | \"vrTeleportArea\"\n | \"xrHandPose\"\n | \"xrInteractable\"\n | \"xrInteractor\"\n | \"xrInteractorSide\";\n\nexport type ComponentFactory = (\n world: World,\n entityId: EntityId,\n ...args: any[]\n) => unknown;\n\ntype CreateRequest = {\n kind: EcsEntityKind;\n payload: CreatePayload;\n onCreated?: (entityId: EntityId) => void;\n};\n\nexport function createTransform(input?: TransformData): TransformComponent {\n return new TransformComponent(input);\n}\n\nexport function applyTransform(\n object: THREE.Object3D,\n transform: TransformComponent,\n): void {\n object.position.set(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n object.rotation.set(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n );\n object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n}\n\nexport class ObjectManagementSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly isEditor: boolean;\n private readonly registry = new Map<EcsEntityKind, EntityFactory>();\n private readonly componentRegistry = new Map<\n EcsComponentFactoryKind,\n ComponentFactory\n >();\n private readonly createQueue: CreateRequest[] = [];\n\n constructor(\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n isEditor = false,\n ) {\n this.scene = scene;\n this.camera = camera;\n this.isEditor = isEditor;\n }\n\n register(kind: EcsEntityKind, factory: EntityFactory): void {\n this.registry.set(kind, factory);\n }\n\n registerComponentFactory(\n kind: EcsComponentFactoryKind,\n factory: ComponentFactory,\n ): void {\n this.componentRegistry.set(kind, factory);\n }\n\n getOrCreateAudioListener(): THREE.AudioListener {\n const existing = this.camera.userData.ecsAudioListener;\n if (existing instanceof THREE.AudioListener) {\n return existing;\n }\n\n const listener = new THREE.AudioListener();\n this.camera.add(listener);\n this.camera.userData.ecsAudioListener = listener;\n return listener;\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n getComponentFactory(kind: EcsComponentFactoryKind): ComponentFactory | null {\n return this.componentRegistry.get(kind) ?? null;\n }\n\n createComponentNow(\n kind: EcsComponentFactoryKind,\n world: World,\n entityId: EntityId,\n ...args: any[]\n ): unknown {\n const factory = this.componentRegistry.get(kind);\n if (!factory) {\n throw new Error(`Unknown component kind: ${kind}`);\n }\n\n return factory(world, entityId, ...args);\n }\n\n requestCreate(\n kind: EcsEntityKind,\n payload: CreatePayload = {},\n onCreated?: (entityId: EntityId) => void,\n ): void {\n this.createQueue.push({ kind, payload, onCreated });\n }\n\n createNow(\n kind: EcsEntityKind,\n world: World,\n payload: CreatePayload = {},\n ): EntityId {\n const factory = this.registry.get(kind);\n if (!factory) {\n throw new Error(`Unknown object kind: ${kind}`);\n }\n\n const entityId = factory({\n world,\n scene: this.scene,\n camera: this.camera,\n payload,\n isEditor: this.isEditor,\n });\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n object.userData.ecsKind = kind;\n }\n\n if (payload.parentId !== undefined) {\n world.addComponent(entityId, new ParentId(payload.parentId));\n }\n\n return entityId;\n }\n\n /**\n * Removes an entity from the ECS world and its associated `Object3D` from the\n * THREE.js scene graph.\n *\n * @param world - The world the entity belongs to.\n * @param entityId - The entity to remove.\n * @param dispose - When `true`, traverses the entity's `Object3D` subtree and\n * calls `.dispose()` on every `BufferGeometry` and `Material` found. Pass\n * `true` when the entity will not be reused and you want to free GPU memory\n * immediately (e.g. dynamically spawned objects). Defaults to `false`.\n * @returns `true` if the entity existed and was removed; `false` if the entity\n * was not found.\n *\n * @example\n * ```ts\n * // Remove from scene, keep GPU resources (safe if geometry is shared)\n * objects.deleteEntity(world, entityId);\n *\n * // Remove from scene and free GPU memory (use for one-off spawned objects)\n * objects.deleteEntity(world, entityId, true);\n * ```\n */\n deleteEntity(world: World, entityId: EntityId, dispose = false): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n const object3d = world.getComponent(entityId, Object3DRef)?.object;\n if (object3d?.parent) {\n object3d.parent.remove(object3d);\n }\n\n if (dispose && object3d) {\n object3d.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n // Resources backing shared (cached) model scenes are skipped —\n // other live clones and future spawns reference the same objects.\n if (!child.geometry?.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n child.geometry?.dispose();\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const mat of materials) {\n if (mat && !mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n mat.dispose();\n }\n }\n }\n });\n }\n\n world.destroyEntity(entityId);\n return true;\n }\n\n setParent(\n world: World,\n entityId: EntityId,\n parentId: EntityId | null,\n options?: {\n preserveWorldTransform?: boolean;\n },\n ): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n if (parentId !== null && !world.hasEntity(parentId)) {\n return false;\n }\n\n if (parentId === entityId) {\n return false;\n }\n\n let ancestor = parentId;\n while (ancestor !== null) {\n if (ancestor === entityId) {\n return false;\n }\n\n ancestor = world.getComponent(ancestor, ParentId)?.value ?? null;\n }\n\n const parentComponent = world.getComponent(entityId, ParentId);\n if (parentComponent) {\n if (parentComponent.value === parentId) {\n return false;\n }\n\n parentComponent.value = parentId;\n } else {\n world.addComponent(entityId, new ParentId(parentId));\n }\n\n const preserveWorldTransform = options?.preserveWorldTransform ?? true;\n if (preserveWorldTransform) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const parentObject =\n parentId !== null\n ? world.getComponent(parentId, Object3DRef)?.object ?? null\n : null;\n\n if (object) {\n // Refresh matrixWorld before attach so world-space preservation is accurate.\n this.scene.updateMatrixWorld(true);\n\n if (parentObject && parentObject !== object) {\n parentObject.attach(object);\n } else {\n this.scene.attach(object);\n }\n\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n }\n\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n private syncTransformComponentFromObject(\n world: World,\n entityId: EntityId,\n object: THREE.Object3D,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) {\n return;\n }\n\n transform.position.x = object.position.x;\n transform.position.y = object.position.y;\n transform.position.z = object.position.z;\n\n transform.rotation.x = object.rotation.x;\n transform.rotation.y = object.rotation.y;\n transform.rotation.z = object.rotation.z;\n\n transform.scale.x = object.scale.x;\n transform.scale.y = object.scale.y;\n transform.scale.z = object.scale.z;\n }\n\n reconcileSceneFromWorld(world: World): void {\n const worldObjects = new Map<EntityId, THREE.Object3D>();\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) {\n continue;\n }\n\n worldObjects.set(entityId, object);\n }\n\n for (const child of [...this.scene.children]) {\n const entityId = child.userData?.entityId;\n if (typeof entityId === \"number\" && !world.hasEntity(entityId)) {\n this.scene.remove(child);\n }\n }\n\n for (const [entityId, object] of worldObjects.entries()) {\n const parentEntityId = world.getComponent(entityId, ParentId)?.value;\n const parentObject =\n typeof parentEntityId === \"number\"\n ? worldObjects.get(parentEntityId)\n : undefined;\n\n if (parentObject && parentObject !== object) {\n if (object.parent !== parentObject) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n parentObject.add(object);\n object.updateMatrixWorld(true);\n }\n continue;\n }\n\n if (object.parent !== this.scene) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n this.scene.add(object);\n object.updateMatrixWorld(true);\n }\n }\n }\n\n update(world: World): void {\n for (const request of this.createQueue.splice(0)) {\n const entityId = this.createNow(request.kind, world, request.payload);\n request.onCreated?.(entityId);\n }\n\n this.reconcileSceneFromWorld(world);\n }\n}\n","const LOCAL_DRACO_DECODER_RELATIVE_PATH = \"./assets/draco/\";\nexport const DRACO_DECODER_CDN_PATH =\n \"https://www.gstatic.com/draco/versioned/decoders/1.5.7/\";\n\nlet dracoDecoderPathOverride: string | null = null;\n\n/**\n * Override where the DRACO decoder files (draco_wasm_wrapper.js,\n * draco_decoder.wasm, draco_decoder.js) are fetched from. Embedding apps\n * whose bundlers relocate this package's chunks — making the default\n * import.meta.url resolution point at a location that is never populated —\n * should call this before any model loads. The path must end with \"/\".\n * Pass null to restore the default resolution.\n */\nexport function setDracoDecoderPath(path: string | null): void {\n dracoDecoderPathOverride = path;\n}\n\nfunction isBlockedBrowserFileUrl(url: string): boolean {\n return url.startsWith(\"file://\");\n}\n\nexport function resolveDracoDecoderPath(): string {\n if (dracoDecoderPathOverride) {\n return dracoDecoderPathOverride;\n }\n\n try {\n // Prefer vendored decoder assets shipped with this package.\n const resolvedPath = new URL(\n LOCAL_DRACO_DECODER_RELATIVE_PATH,\n import.meta.url,\n ).toString();\n\n // Browser loaders cannot fetch file:// resources from package install paths.\n // Fall back to CDN decoders when bundlers emit file URLs for node_modules assets.\n if (isBlockedBrowserFileUrl(resolvedPath)) {\n return DRACO_DECODER_CDN_PATH;\n }\n\n return resolvedPath;\n } catch {\n // Fallback keeps compatibility in runtimes that cannot resolve package-relative URLs.\n return DRACO_DECODER_CDN_PATH;\n }\n}\n"]}
|
|
@@ -15,6 +15,7 @@ __export(components_exports, {
|
|
|
15
15
|
DEFAULT_MESH_GEOMETRY_PARAMETERS: () => DEFAULT_MESH_GEOMETRY_PARAMETERS,
|
|
16
16
|
DEFAULT_PHYSICS_STATE: () => DEFAULT_PHYSICS_STATE,
|
|
17
17
|
DEFAULT_POSE_CURLS: () => DEFAULT_POSE_CURLS,
|
|
18
|
+
DEFAULT_POSE_DIRECTIONS: () => DEFAULT_POSE_DIRECTIONS,
|
|
18
19
|
DEFAULT_POSTPROCESSING_STATE: () => DEFAULT_POSTPROCESSING_STATE,
|
|
19
20
|
DEFAULT_RIGIDBODY_STATE: () => DEFAULT_RIGIDBODY_STATE,
|
|
20
21
|
EntityType: () => EntityType,
|
|
@@ -2143,15 +2144,22 @@ function getHandPosePreset(id) {
|
|
|
2143
2144
|
return cloneHandPose(preset);
|
|
2144
2145
|
}
|
|
2145
2146
|
__name(getHandPosePreset, "getHandPosePreset");
|
|
2147
|
+
function cloneTarget(target) {
|
|
2148
|
+
return {
|
|
2149
|
+
...target,
|
|
2150
|
+
...target.directions ? { directions: [...target.directions] } : {}
|
|
2151
|
+
};
|
|
2152
|
+
}
|
|
2153
|
+
__name(cloneTarget, "cloneTarget");
|
|
2146
2154
|
function cloneHandPose(definition) {
|
|
2147
2155
|
return {
|
|
2148
2156
|
...definition,
|
|
2149
2157
|
fingers: {
|
|
2150
|
-
thumb:
|
|
2151
|
-
index:
|
|
2152
|
-
middle:
|
|
2153
|
-
ring:
|
|
2154
|
-
pinky:
|
|
2158
|
+
thumb: cloneTarget(definition.fingers.thumb),
|
|
2159
|
+
index: cloneTarget(definition.fingers.index),
|
|
2160
|
+
middle: cloneTarget(definition.fingers.middle),
|
|
2161
|
+
ring: cloneTarget(definition.fingers.ring),
|
|
2162
|
+
pinky: cloneTarget(definition.fingers.pinky)
|
|
2155
2163
|
},
|
|
2156
2164
|
pinch: definition.pinch ? { ...definition.pinch } : void 0,
|
|
2157
2165
|
orientation: definition.orientation ? { ...definition.orientation } : void 0
|
|
@@ -2160,22 +2168,27 @@ function cloneHandPose(definition) {
|
|
|
2160
2168
|
__name(cloneHandPose, "cloneHandPose");
|
|
2161
2169
|
function handPoseFromCurls(id, name, curls, options) {
|
|
2162
2170
|
const tolerance = options?.tolerance ?? NARROW;
|
|
2163
|
-
const target = /* @__PURE__ */ __name((curl) =>
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2171
|
+
const target = /* @__PURE__ */ __name((finger, curl) => {
|
|
2172
|
+
const directions = options?.directions?.[finger];
|
|
2173
|
+
return {
|
|
2174
|
+
curl: Math.min(1, Math.max(0, curl)),
|
|
2175
|
+
tolerance,
|
|
2176
|
+
...directions && directions.length > 0 ? { directions } : {}
|
|
2177
|
+
};
|
|
2178
|
+
}, "target");
|
|
2167
2179
|
return {
|
|
2168
2180
|
id,
|
|
2169
2181
|
name,
|
|
2170
2182
|
fingers: {
|
|
2171
|
-
thumb: target(curls.thumb),
|
|
2172
|
-
index: target(curls.index),
|
|
2173
|
-
middle: target(curls.middle),
|
|
2174
|
-
ring: target(curls.ring),
|
|
2175
|
-
pinky: target(curls.pinky)
|
|
2183
|
+
thumb: target("thumb", curls.thumb),
|
|
2184
|
+
index: target("index", curls.index),
|
|
2185
|
+
middle: target("middle", curls.middle),
|
|
2186
|
+
ring: target("ring", curls.ring),
|
|
2187
|
+
pinky: target("pinky", curls.pinky)
|
|
2176
2188
|
},
|
|
2177
2189
|
pinch: options?.pinch,
|
|
2178
2190
|
orientation: options?.orientation,
|
|
2191
|
+
directionToleranceDegrees: options?.directionToleranceDegrees,
|
|
2179
2192
|
hand: options?.hand
|
|
2180
2193
|
};
|
|
2181
2194
|
}
|
|
@@ -2189,6 +2202,13 @@ var DEFAULT_POSE_CURLS = {
|
|
|
2189
2202
|
ring: 0,
|
|
2190
2203
|
pinky: 0
|
|
2191
2204
|
};
|
|
2205
|
+
var DEFAULT_POSE_DIRECTIONS = {
|
|
2206
|
+
thumb: [],
|
|
2207
|
+
index: [],
|
|
2208
|
+
middle: [],
|
|
2209
|
+
ring: [],
|
|
2210
|
+
pinky: []
|
|
2211
|
+
};
|
|
2192
2212
|
function createHandPoseEntry(partial) {
|
|
2193
2213
|
return {
|
|
2194
2214
|
id: partial.id,
|
|
@@ -2196,6 +2216,14 @@ function createHandPoseEntry(partial) {
|
|
|
2196
2216
|
preset: partial.preset ?? null,
|
|
2197
2217
|
curls: { ...DEFAULT_POSE_CURLS, ...partial.curls },
|
|
2198
2218
|
tolerance: partial.tolerance ?? 0.25,
|
|
2219
|
+
directions: {
|
|
2220
|
+
thumb: [...partial.directions?.thumb ?? []],
|
|
2221
|
+
index: [...partial.directions?.index ?? []],
|
|
2222
|
+
middle: [...partial.directions?.middle ?? []],
|
|
2223
|
+
ring: [...partial.directions?.ring ?? []],
|
|
2224
|
+
pinky: [...partial.directions?.pinky ?? []]
|
|
2225
|
+
},
|
|
2226
|
+
directionTolerance: partial.directionTolerance ?? 45,
|
|
2199
2227
|
hand: partial.hand ?? null,
|
|
2200
2228
|
orientation: partial.orientation ?? null,
|
|
2201
2229
|
minHoldSeconds: partial.minHoldSeconds ?? 0.15,
|
|
@@ -2218,7 +2246,9 @@ function handPoseDefinitionFor(entry, resolvePreset) {
|
|
|
2218
2246
|
return handPoseFromCurls(entry.id, entry.name, entry.curls, {
|
|
2219
2247
|
tolerance: entry.tolerance,
|
|
2220
2248
|
orientation: entry.orientation ?? void 0,
|
|
2221
|
-
hand: entry.hand ?? void 0
|
|
2249
|
+
hand: entry.hand ?? void 0,
|
|
2250
|
+
directions: entry.directions,
|
|
2251
|
+
directionToleranceDegrees: entry.directionTolerance
|
|
2222
2252
|
});
|
|
2223
2253
|
}
|
|
2224
2254
|
__name(handPoseDefinitionFor, "handPoseDefinitionFor");
|
|
@@ -2232,6 +2262,6 @@ var _XRHandPoseComponent = class _XRHandPoseComponent extends Component {
|
|
|
2232
2262
|
__name(_XRHandPoseComponent, "XRHandPoseComponent");
|
|
2233
2263
|
var XRHandPoseComponent = _XRHandPoseComponent;
|
|
2234
2264
|
|
|
2235
|
-
export { AnimationComponent, AnimationStateMachine, AnimationStateManager, AudioComponent, CameraComponent, DEFAULT_COLLIDER_STATE, DEFAULT_ENVIRONMENT_STATE, DEFAULT_INSTANCED_MESH_PARAMETERS, DEFAULT_INSTANCE_TRANSFORM, DEFAULT_MESH_GEOMETRY_PARAMETERS, DEFAULT_PHYSICS_STATE, DEFAULT_POSE_CURLS, DEFAULT_POSTPROCESSING_STATE, DEFAULT_RIGIDBODY_STATE, EntityType, Environment, HAND_POSE_PRESETS, HAND_POSE_PRESET_IDS, ImageComponent, ImageTarget, ImageTargetAnchor, InstanceSlotComponent, InstancedMeshComponent, LightComponent, MaterialComponent, MeshComponent, MeshGeometryComponent, ModelComponent, Name, Object3DRef, ParentId, PhysicsComponent, Postprocessing, PrefabInstance, PrefabNode, ScriptComponent, ScriptObjectComponent, Selectable, SelectionTransformState, SpriteComponent, TransformComponent, VRTeleportAreaComponent, VideoComponent, XRHandPoseComponent, XRInteractableComponent, XRInteractorComponent, XRInteractorSideComponent, XRRigComponent, cloneHandPose, components_exports, createAttachPoint, createHandPoseEntry, defaultMaterialValue, getHandPosePreset, handPoseDefinitionFor, handPoseFromCurls, normalizePhysicsState, setPhysicsLiveRef };
|
|
2236
|
-
//# sourceMappingURL=chunk-
|
|
2237
|
-
//# sourceMappingURL=chunk-
|
|
2265
|
+
export { AnimationComponent, AnimationStateMachine, AnimationStateManager, AudioComponent, CameraComponent, DEFAULT_COLLIDER_STATE, DEFAULT_ENVIRONMENT_STATE, DEFAULT_INSTANCED_MESH_PARAMETERS, DEFAULT_INSTANCE_TRANSFORM, DEFAULT_MESH_GEOMETRY_PARAMETERS, DEFAULT_PHYSICS_STATE, DEFAULT_POSE_CURLS, DEFAULT_POSE_DIRECTIONS, DEFAULT_POSTPROCESSING_STATE, DEFAULT_RIGIDBODY_STATE, EntityType, Environment, HAND_POSE_PRESETS, HAND_POSE_PRESET_IDS, ImageComponent, ImageTarget, ImageTargetAnchor, InstanceSlotComponent, InstancedMeshComponent, LightComponent, MaterialComponent, MeshComponent, MeshGeometryComponent, ModelComponent, Name, Object3DRef, ParentId, PhysicsComponent, Postprocessing, PrefabInstance, PrefabNode, ScriptComponent, ScriptObjectComponent, Selectable, SelectionTransformState, SpriteComponent, TransformComponent, VRTeleportAreaComponent, VideoComponent, XRHandPoseComponent, XRInteractableComponent, XRInteractorComponent, XRInteractorSideComponent, XRRigComponent, cloneHandPose, components_exports, createAttachPoint, createHandPoseEntry, defaultMaterialValue, getHandPosePreset, handPoseDefinitionFor, handPoseFromCurls, normalizePhysicsState, setPhysicsLiveRef };
|
|
2266
|
+
//# sourceMappingURL=chunk-H6DQ7JRE.js.map
|
|
2267
|
+
//# sourceMappingURL=chunk-H6DQ7JRE.js.map
|