@threlte/xr 1.0.8 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ARButton.svelte.d.ts +11 -24
- package/dist/components/Controller.svelte +31 -27
- package/dist/components/Controller.svelte.d.ts +7 -5
- package/dist/components/Hand.svelte +24 -28
- package/dist/components/Hand.svelte.d.ts +6 -4
- package/dist/components/Headset.svelte.d.ts +4 -2
- package/dist/components/VRButton.svelte.d.ts +5 -18
- package/dist/components/XR.svelte +55 -54
- package/dist/components/XR.svelte.d.ts +29 -27
- package/dist/components/XRButton.svelte +3 -3
- package/dist/components/XRButton.svelte.d.ts +26 -23
- package/dist/components/internal/Cursor.svelte.d.ts +4 -2
- package/dist/components/internal/PointerCursor.svelte +8 -7
- package/dist/components/internal/PointerCursor.svelte.d.ts +5 -3
- package/dist/components/internal/ShortRay.svelte +3 -3
- package/dist/components/internal/ShortRay.svelte.d.ts +5 -3
- package/dist/components/internal/TeleportCursor.svelte +8 -7
- package/dist/components/internal/TeleportCursor.svelte.d.ts +5 -3
- package/dist/components/internal/TeleportRay.svelte +5 -5
- package/dist/components/internal/TeleportRay.svelte.d.ts +5 -3
- package/dist/hooks/currentReadable.svelte.d.ts +5 -0
- package/dist/hooks/currentReadable.svelte.js +11 -0
- package/dist/hooks/useController.svelte.d.ts +13 -0
- package/dist/hooks/useController.svelte.js +22 -0
- package/dist/hooks/useHand.svelte.d.ts +12 -0
- package/dist/hooks/{useHand.js → useHand.svelte.js} +8 -5
- package/dist/hooks/{useHandJoint.d.ts → useHandJoint.svelte.d.ts} +1 -1
- package/dist/hooks/useHandJoint.svelte.js +21 -0
- package/dist/hooks/useHeadset.js +1 -1
- package/dist/hooks/useHitTest.svelte.js +67 -0
- package/dist/hooks/useTeleport.js +1 -2
- package/dist/hooks/useXR.d.ts +6 -7
- package/dist/hooks/useXR.js +10 -12
- package/dist/index.d.ts +5 -5
- package/dist/index.js +4 -4
- package/dist/internal/raf.d.ts +1 -0
- package/dist/internal/raf.js +2 -0
- package/dist/internal/setupControllers.js +13 -14
- package/dist/internal/setupHands.js +11 -9
- package/dist/internal/{setupHeadset.js → setupHeadset.svelte.js} +6 -6
- package/dist/internal/setupRaf.svelte.js +17 -0
- package/dist/internal/state.svelte.d.ts +51 -0
- package/dist/internal/state.svelte.js +40 -0
- package/dist/internal/useHandTrackingState.js +10 -7
- package/dist/lib/getXRSessionOptions.d.ts +1 -1
- package/dist/lib/toggleXRSession.d.ts +3 -3
- package/dist/lib/toggleXRSession.js +3 -3
- package/dist/plugins/pointerControls/compute.js +2 -6
- package/dist/plugins/pointerControls/index.js +4 -10
- package/dist/plugins/pointerControls/{setup.js → setup.svelte.js} +18 -19
- package/dist/plugins/teleportControls/compute.js +2 -6
- package/dist/plugins/teleportControls/index.js +4 -10
- package/dist/plugins/teleportControls/{setup.js → setup.svelte.js} +9 -10
- package/dist/types.d.ts +12 -18
- package/package.json +10 -10
- package/dist/hooks/useController.d.ts +0 -9
- package/dist/hooks/useController.js +0 -19
- package/dist/hooks/useHand.d.ts +0 -8
- package/dist/hooks/useHandJoint.js +0 -20
- package/dist/hooks/useHitTest.js +0 -79
- package/dist/internal/setupRaf.js +0 -16
- package/dist/internal/stores.d.ts +0 -43
- package/dist/internal/stores.js +0 -42
- /package/dist/hooks/{useHitTest.d.ts → useHitTest.svelte.d.ts} +0 -0
- /package/dist/internal/{setupHeadset.d.ts → setupHeadset.svelte.d.ts} +0 -0
- /package/dist/internal/{setupRaf.d.ts → setupRaf.svelte.d.ts} +0 -0
- /package/dist/plugins/pointerControls/{setup.d.ts → setup.svelte.d.ts} +0 -0
- /package/dist/plugins/teleportControls/{setup.d.ts → setup.svelte.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@threlte/xr",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"author": "Micheal Parks <michealparks1989@gmail.com> (https://parks.lol)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Tools to more easily create VR and AR experiences with Threlte",
|
|
7
7
|
"devDependencies": {
|
|
8
8
|
"@eslint/js": "^9.26.0",
|
|
9
|
-
"@sveltejs/adapter-auto": "^
|
|
10
|
-
"@sveltejs/kit": "^2.
|
|
9
|
+
"@sveltejs/adapter-auto": "^6.1.0",
|
|
10
|
+
"@sveltejs/kit": "^2.37.0",
|
|
11
11
|
"@sveltejs/package": "^2.3.7",
|
|
12
|
-
"@sveltejs/vite-plugin-svelte": "^
|
|
12
|
+
"@sveltejs/vite-plugin-svelte": "^6.1.4",
|
|
13
13
|
"@types/three": "^0.175.0",
|
|
14
|
-
"@types/webxr": "
|
|
14
|
+
"@types/webxr": "0.5.23",
|
|
15
15
|
"autoprefixer": "^10.4.19",
|
|
16
16
|
"eslint": "^9.26.0",
|
|
17
17
|
"eslint-plugin-svelte": "^3.5.1",
|
|
18
18
|
"globals": "^16.1.0",
|
|
19
19
|
"postcss": "^8.4.38",
|
|
20
20
|
"publint": "^0.2.7",
|
|
21
|
-
"svelte": "
|
|
22
|
-
"svelte-check": "^4.1
|
|
21
|
+
"svelte": "5.26.2",
|
|
22
|
+
"svelte-check": "^4.3.1",
|
|
23
23
|
"three": "^0.175.0",
|
|
24
24
|
"tslib": "^2.6.2",
|
|
25
|
-
"typescript": "
|
|
25
|
+
"typescript": "5.9.2",
|
|
26
26
|
"typescript-eslint": "^8.32.0",
|
|
27
|
-
"vite": "^
|
|
27
|
+
"vite": "^7.1.4",
|
|
28
28
|
"vite-plugin-mkcert": "^1.17.5",
|
|
29
|
-
"@threlte/core": "8.
|
|
29
|
+
"@threlte/core": "8.1.5"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"svelte": ">=5",
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { type CurrentWritable } from '@threlte/core';
|
|
2
|
-
import type { XRController } from '../types';
|
|
3
|
-
export declare const left: CurrentWritable<XRController | undefined>;
|
|
4
|
-
export declare const right: CurrentWritable<XRController | undefined>;
|
|
5
|
-
export declare const gaze: CurrentWritable<XRController | undefined>;
|
|
6
|
-
/**
|
|
7
|
-
* Provides a reference to a current XRController, filtered by handedness.
|
|
8
|
-
*/
|
|
9
|
-
export declare const useController: (handedness: XRHandedness) => CurrentWritable<XRController | undefined>;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { currentWritable } from '@threlte/core';
|
|
2
|
-
export const left = currentWritable(undefined);
|
|
3
|
-
export const right = currentWritable(undefined);
|
|
4
|
-
export const gaze = currentWritable(undefined);
|
|
5
|
-
/**
|
|
6
|
-
* Provides a reference to a current XRController, filtered by handedness.
|
|
7
|
-
*/
|
|
8
|
-
export const useController = (handedness) => {
|
|
9
|
-
switch (handedness) {
|
|
10
|
-
case 'left':
|
|
11
|
-
return left;
|
|
12
|
-
case 'right':
|
|
13
|
-
return right;
|
|
14
|
-
case 'none':
|
|
15
|
-
return gaze;
|
|
16
|
-
default:
|
|
17
|
-
throw new Error('useController handedness must be left, right, or none.');
|
|
18
|
-
}
|
|
19
|
-
};
|
package/dist/hooks/useHand.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type CurrentWritable } from '@threlte/core';
|
|
2
|
-
import type { XRHand } from '../types';
|
|
3
|
-
export declare const left: CurrentWritable<XRHand | undefined>;
|
|
4
|
-
export declare const right: CurrentWritable<XRHand | undefined>;
|
|
5
|
-
/**
|
|
6
|
-
* Provides a reference to a current XRHand, filtered by handedness.
|
|
7
|
-
*/
|
|
8
|
-
export declare const useHand: (handedness: "left" | "right") => CurrentWritable<undefined | XRHand>;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { currentWritable, useTask, useThrelte } from '@threlte/core';
|
|
2
|
-
import { useHand } from './useHand';
|
|
3
|
-
/**
|
|
4
|
-
* Provides a reference to a requested hand joint, once available.
|
|
5
|
-
*/
|
|
6
|
-
export const useHandJoint = (handedness, joint) => {
|
|
7
|
-
const { invalidate } = useThrelte();
|
|
8
|
-
const jointSpaceStore = currentWritable(undefined);
|
|
9
|
-
const xrhand = useHand(handedness);
|
|
10
|
-
const { stop } = useTask(() => {
|
|
11
|
-
const jointSpace = xrhand.current?.hand.joints[joint];
|
|
12
|
-
// The joint radius is a good indicator that the joint is ready
|
|
13
|
-
if (jointSpace?.jointRadius !== undefined) {
|
|
14
|
-
jointSpaceStore.set(jointSpace);
|
|
15
|
-
invalidate();
|
|
16
|
-
stop();
|
|
17
|
-
}
|
|
18
|
-
}, { autoInvalidate: false });
|
|
19
|
-
return jointSpaceStore;
|
|
20
|
-
};
|
package/dist/hooks/useHitTest.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { Matrix4 } from 'three';
|
|
2
|
-
import { useThrelte, useTask, watch, currentWritable } from '@threlte/core';
|
|
3
|
-
import { useXR } from './useXR';
|
|
4
|
-
import { useController } from './useController';
|
|
5
|
-
/**
|
|
6
|
-
* Use this hook to perform a hit test per frame in an AR environment.
|
|
7
|
-
*
|
|
8
|
-
* ```ts
|
|
9
|
-
* useHitTest((hitMatrix, hit) => {
|
|
10
|
-
* mesh.matrix.copy(hitMatrix)
|
|
11
|
-
* }, {
|
|
12
|
-
* source: 'viewer' | 'leftInput' | 'rightInput' // Default 'viewer'
|
|
13
|
-
* })
|
|
14
|
-
* ```
|
|
15
|
-
*/
|
|
16
|
-
export const useHitTest = (hitTestCallback, options = {}) => {
|
|
17
|
-
const source = options.source ?? 'viewer';
|
|
18
|
-
const { xr } = useThrelte().renderer;
|
|
19
|
-
const xrState = useXR();
|
|
20
|
-
const hitMatrix = new Matrix4();
|
|
21
|
-
const hitTestSource = currentWritable(undefined);
|
|
22
|
-
if (source === 'viewer') {
|
|
23
|
-
watch(xrState.session, async (session) => {
|
|
24
|
-
if (session === undefined) {
|
|
25
|
-
hitTestSource.set(undefined);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const space = await session.requestReferenceSpace('viewer');
|
|
29
|
-
hitTestSource.set(await session.requestHitTestSource?.({ space }));
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
const controller = useController(source === 'leftInput' ? 'left' : 'right');
|
|
34
|
-
const hand = useController(source === 'leftInput' ? 'left' : 'right');
|
|
35
|
-
watch([xrState.session, controller], async ([session, input]) => {
|
|
36
|
-
if (input === undefined || session === undefined) {
|
|
37
|
-
hitTestSource.set(undefined);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const space = input.inputSource.targetRaySpace;
|
|
41
|
-
hitTestSource.set(await session.requestHitTestSource?.({ space }));
|
|
42
|
-
});
|
|
43
|
-
watch([xrState.session, hand], async ([session, input]) => {
|
|
44
|
-
if (input === undefined || session === undefined) {
|
|
45
|
-
hitTestSource.set(undefined);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const space = input.inputSource.targetRaySpace;
|
|
49
|
-
hitTestSource.set(await session.requestHitTestSource?.({ space }));
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
const { start, stop } = useTask(() => {
|
|
53
|
-
const referenceSpace = xr.getReferenceSpace();
|
|
54
|
-
if (referenceSpace === null || hitTestSource.current === undefined) {
|
|
55
|
-
return hitTestCallback(hitMatrix, undefined);
|
|
56
|
-
}
|
|
57
|
-
const [hit] = xr.getFrame().getHitTestResults(hitTestSource.current);
|
|
58
|
-
const pose = hit?.getPose(referenceSpace);
|
|
59
|
-
if (pose === undefined) {
|
|
60
|
-
return hitTestCallback(hitMatrix, undefined);
|
|
61
|
-
}
|
|
62
|
-
hitMatrix.fromArray(pose.transform.matrix);
|
|
63
|
-
hitTestCallback(hitMatrix, hit);
|
|
64
|
-
}, { autoStart: false });
|
|
65
|
-
watch([xrState.isPresenting, hitTestSource], ([isPresenting, testSource]) => {
|
|
66
|
-
if (!isPresenting) {
|
|
67
|
-
stop();
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
if (testSource === undefined) {
|
|
71
|
-
stop();
|
|
72
|
-
// Execute callback one last time to inform consumers of no hits.
|
|
73
|
-
hitTestCallback(hitMatrix, undefined);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
start();
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { onDestroy } from 'svelte';
|
|
2
|
-
import { raf } from 'svelte/internal/client';
|
|
3
|
-
import { watch } from '@threlte/core';
|
|
4
|
-
import { session } from './stores';
|
|
5
|
-
export const setupRaf = () => {
|
|
6
|
-
if (typeof window === 'undefined')
|
|
7
|
-
return;
|
|
8
|
-
const originalTick = raf.tick;
|
|
9
|
-
watch(session, (session) => {
|
|
10
|
-
raf.tick =
|
|
11
|
-
session === undefined
|
|
12
|
-
? originalTick
|
|
13
|
-
: (fn) => session.requestAnimationFrame(fn);
|
|
14
|
-
});
|
|
15
|
-
onDestroy(() => (raf.tick = originalTick));
|
|
16
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { WebXRManager, Intersection } from 'three';
|
|
2
|
-
import type { XRControllerEvents, XRHandEvents } from '../types';
|
|
3
|
-
export declare const isPresenting: import("@threlte/core").CurrentWritable<boolean>;
|
|
4
|
-
export declare const isHandTracking: import("@threlte/core").CurrentWritable<boolean>;
|
|
5
|
-
export declare const session: import("@threlte/core").CurrentWritable<XRSession | undefined>;
|
|
6
|
-
export declare const referenceSpaceType: import("@threlte/core").CurrentWritable<XRReferenceSpaceType | undefined>;
|
|
7
|
-
export declare const xr: import("@threlte/core").CurrentWritable<WebXRManager | undefined>;
|
|
8
|
-
export declare const controllerEvents: {
|
|
9
|
-
left: import("@threlte/core").CurrentWritable<XRControllerEvents | undefined>;
|
|
10
|
-
right: import("@threlte/core").CurrentWritable<XRControllerEvents | undefined>;
|
|
11
|
-
};
|
|
12
|
-
export declare const handEvents: {
|
|
13
|
-
left: import("@threlte/core").CurrentWritable<XRHandEvents | undefined>;
|
|
14
|
-
right: import("@threlte/core").CurrentWritable<XRHandEvents | undefined>;
|
|
15
|
-
};
|
|
16
|
-
export declare const teleportState: import("@threlte/core").CurrentWritable<{
|
|
17
|
-
left: {
|
|
18
|
-
enabled: boolean;
|
|
19
|
-
hovering: boolean;
|
|
20
|
-
};
|
|
21
|
-
right: {
|
|
22
|
-
enabled: boolean;
|
|
23
|
-
hovering: boolean;
|
|
24
|
-
};
|
|
25
|
-
}>;
|
|
26
|
-
export declare const teleportIntersection: {
|
|
27
|
-
left: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
28
|
-
right: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
29
|
-
};
|
|
30
|
-
export declare const pointerState: import("@threlte/core").CurrentWritable<{
|
|
31
|
-
left: {
|
|
32
|
-
enabled: boolean;
|
|
33
|
-
hovering: boolean;
|
|
34
|
-
};
|
|
35
|
-
right: {
|
|
36
|
-
enabled: boolean;
|
|
37
|
-
hovering: boolean;
|
|
38
|
-
};
|
|
39
|
-
}>;
|
|
40
|
-
export declare const pointerIntersection: {
|
|
41
|
-
left: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
42
|
-
right: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
43
|
-
};
|
package/dist/internal/stores.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { currentWritable } from '@threlte/core';
|
|
2
|
-
export const isPresenting = currentWritable(false);
|
|
3
|
-
export const isHandTracking = currentWritable(false);
|
|
4
|
-
export const session = currentWritable(undefined);
|
|
5
|
-
export const referenceSpaceType = currentWritable(undefined);
|
|
6
|
-
export const xr = currentWritable(undefined);
|
|
7
|
-
export const controllerEvents = {
|
|
8
|
-
left: currentWritable(undefined),
|
|
9
|
-
right: currentWritable(undefined)
|
|
10
|
-
};
|
|
11
|
-
export const handEvents = {
|
|
12
|
-
left: currentWritable(undefined),
|
|
13
|
-
right: currentWritable(undefined)
|
|
14
|
-
};
|
|
15
|
-
export const teleportState = currentWritable({
|
|
16
|
-
left: {
|
|
17
|
-
enabled: false,
|
|
18
|
-
hovering: false
|
|
19
|
-
},
|
|
20
|
-
right: {
|
|
21
|
-
enabled: false,
|
|
22
|
-
hovering: false
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
export const teleportIntersection = {
|
|
26
|
-
left: currentWritable(undefined),
|
|
27
|
-
right: currentWritable(undefined)
|
|
28
|
-
};
|
|
29
|
-
export const pointerState = currentWritable({
|
|
30
|
-
left: {
|
|
31
|
-
enabled: false,
|
|
32
|
-
hovering: false
|
|
33
|
-
},
|
|
34
|
-
right: {
|
|
35
|
-
enabled: false,
|
|
36
|
-
hovering: false
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
export const pointerIntersection = {
|
|
40
|
-
left: currentWritable(undefined),
|
|
41
|
-
right: currentWritable(undefined)
|
|
42
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|