@threlte/xr 0.0.12 → 0.1.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/components/ARButton.svelte +1 -1
- package/dist/components/ARButton.svelte.d.ts +38 -37
- package/dist/components/Controller.svelte +24 -83
- package/dist/components/Hand.svelte +27 -64
- package/dist/components/Hand.svelte.d.ts +1 -0
- package/dist/components/Headset.svelte.d.ts +1 -0
- package/dist/components/VRButton.svelte.d.ts +38 -37
- package/dist/components/XR.svelte +47 -53
- package/dist/components/XRButton.svelte +2 -2
- package/dist/components/XRButton.svelte.d.ts +38 -37
- package/dist/components/internal/Cursor.svelte.d.ts +1 -0
- package/dist/components/internal/PointerCursor.svelte +7 -3
- package/dist/components/internal/PointerCursor.svelte.d.ts +1 -0
- package/dist/components/internal/ScenePortal.svelte.d.ts +1 -0
- package/dist/components/internal/ShortRay.svelte.d.ts +1 -0
- package/dist/components/internal/TeleportCursor.svelte +7 -3
- package/dist/components/internal/TeleportCursor.svelte.d.ts +1 -0
- package/dist/components/internal/TeleportRay.svelte.d.ts +1 -0
- package/dist/hooks/useController.js +2 -4
- package/dist/hooks/useHand.js +2 -0
- package/dist/hooks/useHandJoint.d.ts +2 -2
- package/dist/hooks/useHeadset.d.ts +2 -1
- package/dist/hooks/useHeadset.js +1 -1
- package/dist/hooks/useHitTest.d.ts +2 -2
- package/dist/hooks/useHitTest.js +16 -6
- package/dist/hooks/useTeleport.d.ts +2 -2
- package/dist/hooks/useTeleport.js +2 -2
- package/dist/internal/setupControllers.d.ts +1 -0
- package/dist/internal/setupControllers.js +69 -0
- package/dist/internal/setupHands.d.ts +1 -0
- package/dist/internal/setupHands.js +63 -0
- package/dist/internal/setupHeadset.d.ts +3 -0
- package/dist/internal/{headset.js → setupHeadset.js} +2 -3
- package/dist/internal/setupRaf.d.ts +1 -0
- package/dist/internal/{updateRaf.js → setupRaf.js} +2 -2
- package/dist/internal/stores.d.ts +22 -7
- package/dist/internal/stores.js +15 -9
- package/dist/internal/useFixed.d.ts +1 -1
- package/dist/internal/useHandTrackingState.js +1 -1
- package/dist/lib/toggleXRSession.js +3 -3
- package/dist/plugins/teleportControls/context.d.ts +7 -6
- package/dist/plugins/teleportControls/hook.d.ts +5 -4
- package/dist/plugins/teleportControls/index.d.ts +1 -1
- package/dist/types.d.ts +10 -8
- package/package.json +4 -4
- package/dist/internal/headset.d.ts +0 -3
- package/dist/internal/updateRaf.d.ts +0 -1
- package/dist/plugins/pointerControls/types.d.ts +0 -61
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { XRHandModelFactory } from 'three/examples/jsm/webxr/XRHandModelFactory';
|
|
2
|
+
import { useThrelte } from '@threlte/core';
|
|
3
|
+
import { onMount } from 'svelte';
|
|
4
|
+
import { left, right } from '../hooks/useHand';
|
|
5
|
+
import { useHandTrackingState } from './useHandTrackingState';
|
|
6
|
+
import { handDispatchers } from './stores';
|
|
7
|
+
export const setupHands = () => {
|
|
8
|
+
const factory = new XRHandModelFactory();
|
|
9
|
+
const stores = { left, right };
|
|
10
|
+
const { xr } = useThrelte().renderer;
|
|
11
|
+
const hasHands = useHandTrackingState();
|
|
12
|
+
const handSpaces = [xr.getHand(0), xr.getHand(1)];
|
|
13
|
+
const map = new Map();
|
|
14
|
+
handSpaces.forEach((handSpace, index) => {
|
|
15
|
+
map.set(handSpace, {
|
|
16
|
+
hand: handSpace,
|
|
17
|
+
targetRay: xr.getController(index),
|
|
18
|
+
model: factory.createHandModel(handSpace, 'mesh')
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
onMount(() => {
|
|
22
|
+
const dispatch = (event) => {
|
|
23
|
+
if (!hasHands())
|
|
24
|
+
return;
|
|
25
|
+
const handEvent = event;
|
|
26
|
+
const handedness = ('handedness' in handEvent) ? handEvent.handedness : handEvent.data.handedness;
|
|
27
|
+
handDispatchers[handedness]?.current?.(event.type, event);
|
|
28
|
+
};
|
|
29
|
+
function handleConnected(event) {
|
|
30
|
+
const hand = this;
|
|
31
|
+
const { model, targetRay } = map.get(this);
|
|
32
|
+
const { data } = event;
|
|
33
|
+
const { handedness, hand: inputSource } = data;
|
|
34
|
+
stores[handedness].set({
|
|
35
|
+
hand,
|
|
36
|
+
model,
|
|
37
|
+
inputSource,
|
|
38
|
+
targetRay
|
|
39
|
+
});
|
|
40
|
+
dispatch(event);
|
|
41
|
+
}
|
|
42
|
+
const handleDisconnected = (event) => {
|
|
43
|
+
dispatch(event);
|
|
44
|
+
stores[event.data.handedness].set(undefined);
|
|
45
|
+
};
|
|
46
|
+
for (const handSpace of handSpaces) {
|
|
47
|
+
handSpace.addEventListener('connected', handleConnected);
|
|
48
|
+
handSpace.addEventListener('disconnected', handleDisconnected);
|
|
49
|
+
handSpace.addEventListener('pinchstart', dispatch);
|
|
50
|
+
handSpace.addEventListener('pinchend', dispatch);
|
|
51
|
+
}
|
|
52
|
+
return () => {
|
|
53
|
+
for (const handSpace of handSpaces) {
|
|
54
|
+
handSpace.removeEventListener('connected', handleConnected);
|
|
55
|
+
handSpace.removeEventListener('disconnected', handleDisconnected);
|
|
56
|
+
handSpace.removeEventListener('pinchstart', dispatch);
|
|
57
|
+
handSpace.removeEventListener('pinchend', dispatch);
|
|
58
|
+
}
|
|
59
|
+
stores.left.set(undefined);
|
|
60
|
+
stores.right.set(undefined);
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
};
|
|
@@ -2,9 +2,8 @@ import { Group } from 'three';
|
|
|
2
2
|
import { useThrelte, useFrame, watch } from '@threlte/core';
|
|
3
3
|
import { useXR } from '../hooks/useXR';
|
|
4
4
|
export const headset = new Group();
|
|
5
|
-
export const
|
|
5
|
+
export const setupHeadset = () => {
|
|
6
6
|
const { renderer, camera } = useThrelte();
|
|
7
|
-
const xrState = useXR();
|
|
8
7
|
const { xr } = renderer;
|
|
9
8
|
const immersiveFrame = useFrame(() => {
|
|
10
9
|
const space = xr.getReferenceSpace();
|
|
@@ -23,7 +22,7 @@ export const useUpdateHeadset = () => {
|
|
|
23
22
|
headset.position.copy(camera.current.position);
|
|
24
23
|
headset.quaternion.copy(camera.current.quaternion);
|
|
25
24
|
}, { autostart: false, invalidate: false });
|
|
26
|
-
watch(
|
|
25
|
+
watch(useXR().isPresenting, (isPresenting) => {
|
|
27
26
|
if (isPresenting) {
|
|
28
27
|
immersiveFrame.start();
|
|
29
28
|
nonImmersiveFrame.stop();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const setupRaf: () => void;
|
|
@@ -3,7 +3,7 @@ import { set_raf } from 'svelte/internal';
|
|
|
3
3
|
import { onDestroy } from 'svelte';
|
|
4
4
|
import { watch } from '@threlte/core';
|
|
5
5
|
import { session } from './stores';
|
|
6
|
-
export const
|
|
6
|
+
export const setupRaf = () => {
|
|
7
7
|
if (typeof window === 'undefined')
|
|
8
8
|
return;
|
|
9
9
|
const browserRaf = (fn) => requestAnimationFrame(fn);
|
|
@@ -11,7 +11,7 @@ export const updateRaf = () => {
|
|
|
11
11
|
set_raf((fn) => currentRaf.fn(fn));
|
|
12
12
|
watch(session, (session) => {
|
|
13
13
|
if (session) {
|
|
14
|
-
currentRaf.fn = (fn) =>
|
|
14
|
+
currentRaf.fn = (fn) => session.requestAnimationFrame(fn);
|
|
15
15
|
}
|
|
16
16
|
else {
|
|
17
17
|
currentRaf.fn = browserRaf;
|
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
/// <reference types="webxr" />
|
|
2
|
-
|
|
3
|
-
export declare const initialized: import("svelte/store").Writable<boolean>;
|
|
2
|
+
import type { WebXRManager, Intersection } from 'three';
|
|
4
3
|
export declare const isPresenting: import("@threlte/core").CurrentWritable<boolean>;
|
|
5
4
|
export declare const isHandTracking: import("@threlte/core").CurrentWritable<boolean>;
|
|
6
5
|
export declare const session: import("@threlte/core").CurrentWritable<XRSession | undefined>;
|
|
7
6
|
export declare const referenceSpaceType: import("@threlte/core").CurrentWritable<XRReferenceSpaceType | undefined>;
|
|
8
|
-
export declare const xr: import("@threlte/core").CurrentWritable<
|
|
7
|
+
export declare const xr: import("@threlte/core").CurrentWritable<WebXRManager | undefined>;
|
|
8
|
+
export declare const controllerDispatchers: {
|
|
9
|
+
left: import("@threlte/core").CurrentWritable<((<Type extends string>(type: Type, payload?: unknown) => void) & {
|
|
10
|
+
hasEventListener: <Type_1 extends string>(type: Type_1) => boolean;
|
|
11
|
+
}) | undefined>;
|
|
12
|
+
right: import("@threlte/core").CurrentWritable<((<Type extends string>(type: Type, payload?: unknown) => void) & {
|
|
13
|
+
hasEventListener: <Type_1 extends string>(type: Type_1) => boolean;
|
|
14
|
+
}) | undefined>;
|
|
15
|
+
};
|
|
16
|
+
export declare const handDispatchers: {
|
|
17
|
+
left: import("@threlte/core").CurrentWritable<((<Type extends string>(type: Type, payload?: unknown) => void) & {
|
|
18
|
+
hasEventListener: <Type_1 extends string>(type: Type_1) => boolean;
|
|
19
|
+
}) | undefined>;
|
|
20
|
+
right: import("@threlte/core").CurrentWritable<((<Type extends string>(type: Type, payload?: unknown) => void) & {
|
|
21
|
+
hasEventListener: <Type_1 extends string>(type: Type_1) => boolean;
|
|
22
|
+
}) | undefined>;
|
|
23
|
+
};
|
|
9
24
|
export declare const teleportState: import("@threlte/core").CurrentWritable<{
|
|
10
25
|
left: {
|
|
11
26
|
enabled: boolean;
|
|
@@ -17,8 +32,8 @@ export declare const teleportState: import("@threlte/core").CurrentWritable<{
|
|
|
17
32
|
};
|
|
18
33
|
}>;
|
|
19
34
|
export declare const teleportIntersection: {
|
|
20
|
-
left: import("@threlte/core").CurrentWritable<
|
|
21
|
-
right: import("@threlte/core").CurrentWritable<
|
|
35
|
+
left: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
36
|
+
right: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
22
37
|
};
|
|
23
38
|
export declare const pointerState: import("@threlte/core").CurrentWritable<{
|
|
24
39
|
left: {
|
|
@@ -31,6 +46,6 @@ export declare const pointerState: import("@threlte/core").CurrentWritable<{
|
|
|
31
46
|
};
|
|
32
47
|
}>;
|
|
33
48
|
export declare const pointerIntersection: {
|
|
34
|
-
left: import("@threlte/core").CurrentWritable<
|
|
35
|
-
right: import("@threlte/core").CurrentWritable<
|
|
49
|
+
left: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
50
|
+
right: import("@threlte/core").CurrentWritable<Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
36
51
|
};
|
package/dist/internal/stores.js
CHANGED
|
@@ -1,36 +1,42 @@
|
|
|
1
|
-
import { writable } from 'svelte/store';
|
|
2
1
|
import { currentWritable } from '@threlte/core';
|
|
3
|
-
export const initialized = writable(false);
|
|
4
2
|
export const isPresenting = currentWritable(false);
|
|
5
3
|
export const isHandTracking = currentWritable(false);
|
|
6
4
|
export const session = currentWritable(undefined);
|
|
7
5
|
export const referenceSpaceType = currentWritable(undefined);
|
|
8
6
|
export const xr = currentWritable(undefined);
|
|
7
|
+
export const controllerDispatchers = {
|
|
8
|
+
left: currentWritable(undefined),
|
|
9
|
+
right: currentWritable(undefined)
|
|
10
|
+
};
|
|
11
|
+
export const handDispatchers = {
|
|
12
|
+
left: currentWritable(undefined),
|
|
13
|
+
right: currentWritable(undefined)
|
|
14
|
+
};
|
|
9
15
|
export const teleportState = currentWritable({
|
|
10
16
|
left: {
|
|
11
17
|
enabled: false,
|
|
12
|
-
hovering: false
|
|
18
|
+
hovering: false
|
|
13
19
|
},
|
|
14
20
|
right: {
|
|
15
21
|
enabled: false,
|
|
16
|
-
hovering: false
|
|
17
|
-
}
|
|
22
|
+
hovering: false
|
|
23
|
+
}
|
|
18
24
|
});
|
|
19
25
|
export const teleportIntersection = {
|
|
20
26
|
left: currentWritable(undefined),
|
|
21
|
-
right: currentWritable(undefined)
|
|
27
|
+
right: currentWritable(undefined)
|
|
22
28
|
};
|
|
23
29
|
export const pointerState = currentWritable({
|
|
24
30
|
left: {
|
|
25
31
|
enabled: false,
|
|
26
|
-
hovering: false
|
|
32
|
+
hovering: false
|
|
27
33
|
},
|
|
28
34
|
right: {
|
|
29
35
|
enabled: false,
|
|
30
|
-
hovering: false
|
|
36
|
+
hovering: false
|
|
31
37
|
}
|
|
32
38
|
});
|
|
33
39
|
export const pointerIntersection = {
|
|
34
40
|
left: currentWritable(undefined),
|
|
35
|
-
right: currentWritable(undefined)
|
|
41
|
+
right: currentWritable(undefined)
|
|
36
42
|
};
|
|
@@ -7,5 +7,5 @@ type UseFixedOptions = ThrelteUseFrameOptions & {
|
|
|
7
7
|
*
|
|
8
8
|
* @Todo Can be removed if this or a similar feature is merged.
|
|
9
9
|
*/
|
|
10
|
-
export declare const useFixed: (fn: (ctx: ThrelteContext, delta: number) => void, options: UseFixedOptions) => import("@threlte/core/dist/hooks/useFrame").ThrelteUseFrame;
|
|
10
|
+
export declare const useFixed: (fn: (ctx: ThrelteContext, delta: number) => void, options: UseFixedOptions) => import("@threlte/core/dist/hooks/legacy/useFrame").ThrelteUseFrame;
|
|
11
11
|
export {};
|
|
@@ -7,7 +7,7 @@ export const useHandTrackingState = () => {
|
|
|
7
7
|
const { xr } = useThrelte().renderer;
|
|
8
8
|
return () => {
|
|
9
9
|
let handTracking = false;
|
|
10
|
-
xr.getSession()?.inputSources
|
|
10
|
+
xr.getSession()?.inputSources?.forEach((value) => {
|
|
11
11
|
if (value.hand) {
|
|
12
12
|
handTracking = true;
|
|
13
13
|
}
|
|
@@ -21,12 +21,12 @@ export const toggleXRSession = async (sessionMode, sessionInit, force) => {
|
|
|
21
21
|
session.set(undefined);
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
-
// Otherwise enter a session
|
|
25
|
-
const options = getXRSessionOptions(referenceSpaceType.current, sessionInit);
|
|
26
|
-
const nextSession = await navigator.xr.requestSession(sessionMode, options);
|
|
27
24
|
if (xr.current === undefined) {
|
|
28
25
|
throw new Error('An <XR> component was not created when attempting to toggle a session.');
|
|
29
26
|
}
|
|
27
|
+
// Otherwise enter a session
|
|
28
|
+
const options = getXRSessionOptions(referenceSpaceType.current, sessionInit);
|
|
29
|
+
const nextSession = await navigator.xr.requestSession(sessionMode, options);
|
|
30
30
|
await xr.current.setSession(nextSession);
|
|
31
31
|
session.set(nextSession);
|
|
32
32
|
return nextSession;
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
+
import type { Mesh, Raycaster, Intersection } from 'three';
|
|
1
2
|
import type { CurrentWritable, createRawEventDispatcher } from '@threlte/core';
|
|
2
3
|
export type ComputeFunction = (context: Context, handContext: HandContext) => void;
|
|
3
4
|
export interface Context {
|
|
4
|
-
interactiveObjects:
|
|
5
|
-
surfaces: Map<string,
|
|
6
|
-
blockers: Map<string,
|
|
7
|
-
dispatchers: WeakMap<
|
|
8
|
-
raycaster:
|
|
5
|
+
interactiveObjects: Mesh[];
|
|
6
|
+
surfaces: Map<string, Mesh>;
|
|
7
|
+
blockers: Map<string, Mesh>;
|
|
8
|
+
dispatchers: WeakMap<Mesh, ReturnType<typeof createRawEventDispatcher>>;
|
|
9
|
+
raycaster: Raycaster;
|
|
9
10
|
compute: ComputeFunction;
|
|
10
11
|
}
|
|
11
12
|
export interface HandContext {
|
|
12
13
|
hand: 'left' | 'right';
|
|
13
14
|
enabled: CurrentWritable<boolean>;
|
|
14
15
|
active: CurrentWritable<boolean>;
|
|
15
|
-
hovered: CurrentWritable<
|
|
16
|
+
hovered: CurrentWritable<Intersection | undefined>;
|
|
16
17
|
}
|
|
17
18
|
export declare const getHandContext: (hand: 'left' | 'right') => HandContext;
|
|
18
19
|
export declare const setHandContext: (hand: 'left' | 'right', context: HandContext) => void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Mesh } from 'three';
|
|
1
2
|
export declare const useTeleportControls: () => {
|
|
2
|
-
addSurface: (mesh:
|
|
3
|
-
removeSurface: (mesh:
|
|
4
|
-
addBlocker: (mesh:
|
|
5
|
-
removeBlocker: (mesh:
|
|
3
|
+
addSurface: (mesh: Mesh) => void;
|
|
4
|
+
removeSurface: (mesh: Mesh) => void;
|
|
5
|
+
addBlocker: (mesh: Mesh) => void;
|
|
6
|
+
removeBlocker: (mesh: Mesh) => void;
|
|
6
7
|
};
|
|
@@ -14,6 +14,6 @@ export interface TeleportControlsOptions {
|
|
|
14
14
|
}
|
|
15
15
|
export declare const teleportControls: (handedness: 'left' | 'right', options?: TeleportControlsOptions) => {
|
|
16
16
|
enabled: import("@threlte/core").CurrentWritable<boolean>;
|
|
17
|
-
hovered: import("@threlte/core").CurrentWritable<import("three").Intersection<import("three").Object3D<import("three").
|
|
17
|
+
hovered: import("@threlte/core").CurrentWritable<import("three").Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
|
|
18
18
|
active: import("@threlte/core").CurrentWritable<boolean>;
|
|
19
19
|
};
|
package/dist/types.d.ts
CHANGED
|
@@ -1,32 +1,34 @@
|
|
|
1
1
|
/// <reference types="webxr" />
|
|
2
|
+
import type { Event, Group, XRTargetRaySpace, XRGripSpace, XRHandSpace } from 'three';
|
|
2
3
|
import type { XRControllerModel } from 'three/examples/jsm/webxr/XRControllerModelFactory';
|
|
3
4
|
import type { XRHandModel } from 'three/examples/jsm/webxr/XRHandModelFactory';
|
|
4
5
|
export type XRSessionEventType = 'sessionstart' | 'sessionend' | 'visibilitychange' | 'frameratechange';
|
|
5
6
|
export type XRControllerEventType = 'select' | 'selectstart' | 'selectend' | 'squeeze' | 'squeezeend' | 'squeezestart' | 'disconnected' | 'connected';
|
|
6
7
|
export type XRHandEventType = 'pinchstart' | 'pinchend' | 'connected' | 'disconnected';
|
|
7
|
-
export type XRSessionEvent<Type = XRSessionEventType> =
|
|
8
|
+
export type XRSessionEvent<Type = XRSessionEventType> = Event & {
|
|
8
9
|
type: Type;
|
|
9
10
|
target: XRSession;
|
|
10
11
|
};
|
|
11
|
-
export type XRControllerEvent<Type = XRControllerEventType> =
|
|
12
|
+
export type XRControllerEvent<Type = XRControllerEventType> = Event & {
|
|
12
13
|
type: Type;
|
|
13
|
-
target:
|
|
14
|
+
target: Group;
|
|
14
15
|
data: XRInputSource;
|
|
15
16
|
};
|
|
16
17
|
export type XRController = {
|
|
17
|
-
targetRay:
|
|
18
|
-
grip:
|
|
19
|
-
model?: XRControllerModel;
|
|
18
|
+
targetRay: XRTargetRaySpace;
|
|
19
|
+
grip: XRGripSpace;
|
|
20
|
+
model?: XRControllerModel | undefined;
|
|
20
21
|
inputSource: XRInputSource;
|
|
21
22
|
};
|
|
22
23
|
export type XRHand = {
|
|
23
|
-
|
|
24
|
+
targetRay: XRTargetRaySpace;
|
|
25
|
+
hand: XRHandSpace;
|
|
24
26
|
model?: XRHandModel;
|
|
25
27
|
inputSource: globalThis.XRHand;
|
|
26
28
|
};
|
|
27
29
|
export type XRHandEvent<Type = XRHandEventType> = Type extends 'connected' | 'disconnected' ? {
|
|
28
30
|
type: Type;
|
|
29
|
-
target:
|
|
31
|
+
target: XRHandSpace;
|
|
30
32
|
data: XRInputSource;
|
|
31
33
|
} : Type extends 'pinchstart' | 'pinchend' ? {
|
|
32
34
|
type: Type;
|
package/package.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@threlte/xr",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"author": "Micheal Parks <michealparks1989@gmail.com> (https://parks.lol)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"devDependencies": {
|
|
7
7
|
"@sveltejs/adapter-auto": "^2.1.0",
|
|
8
8
|
"@sveltejs/kit": "^1.22.3",
|
|
9
9
|
"@sveltejs/package": "^2.2.0",
|
|
10
|
-
"@types/three": "^0.
|
|
10
|
+
"@types/three": "^0.158.3",
|
|
11
11
|
"autoprefixer": "^10.4.14",
|
|
12
12
|
"postcss": "^8.4.27",
|
|
13
13
|
"publint": "^0.1.16",
|
|
14
14
|
"svelte": "^4.1.1",
|
|
15
15
|
"svelte-check": "^3.4.6",
|
|
16
|
-
"three": "^0.
|
|
16
|
+
"three": "^0.158.0",
|
|
17
17
|
"tslib": "^2.6.0",
|
|
18
18
|
"typescript": "^5.1.6",
|
|
19
19
|
"vite": "^4.4.6",
|
|
20
20
|
"vite-plugin-mkcert": "^1.16.0",
|
|
21
|
-
"@threlte/core": "
|
|
21
|
+
"@threlte/core": "7.0.0"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
24
|
"svelte": ">=4",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const updateRaf: () => void;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import type { CurrentWritable } from '@threlte/core';
|
|
2
|
-
import type { ComputeFunction } from './compute';
|
|
3
|
-
export type Properties<T> = Pick<T, {
|
|
4
|
-
[K in keyof T]: T[K] extends (_: any) => any ? never : K;
|
|
5
|
-
}[keyof T]>;
|
|
6
|
-
export interface Intersection extends THREE.Intersection {
|
|
7
|
-
/** The event source (the object which registered the handler) */
|
|
8
|
-
eventObject: THREE.Object3D;
|
|
9
|
-
}
|
|
10
|
-
export interface IntersectionEvent extends Intersection {
|
|
11
|
-
/** The event source (the object which registered the handler) */
|
|
12
|
-
eventObject: THREE.Object3D;
|
|
13
|
-
/** An array of intersections */
|
|
14
|
-
intersections: Intersection[];
|
|
15
|
-
/** Normalized event coordinates */
|
|
16
|
-
pointer: THREE.Vector3;
|
|
17
|
-
/** Delta between first click and this event */
|
|
18
|
-
delta: number;
|
|
19
|
-
/** The ray that pierced it */
|
|
20
|
-
ray: THREE.Ray;
|
|
21
|
-
/** stopPropagation will stop underlying handlers from firing */
|
|
22
|
-
stopPropagation: () => void;
|
|
23
|
-
/** The original host event */
|
|
24
|
-
nativeEvent: THREE.Event | undefined;
|
|
25
|
-
/** If the event was stopped by calling stopPropagation */
|
|
26
|
-
stopped: boolean;
|
|
27
|
-
}
|
|
28
|
-
export type FilterFunction = (items: THREE.Intersection[], state: ControlsContext, handState: HandContext) => THREE.Intersection[];
|
|
29
|
-
export type ControlsContext = {
|
|
30
|
-
interactiveObjects: THREE.Object3D[];
|
|
31
|
-
raycaster: THREE.Raycaster;
|
|
32
|
-
compute: ComputeFunction;
|
|
33
|
-
filter?: FilterFunction | undefined;
|
|
34
|
-
};
|
|
35
|
-
export type HandContext = {
|
|
36
|
-
hand: 'left' | 'right';
|
|
37
|
-
enabled: CurrentWritable<boolean>;
|
|
38
|
-
pointer: CurrentWritable<THREE.Vector3>;
|
|
39
|
-
pointerOverTarget: CurrentWritable<boolean>;
|
|
40
|
-
lastEvent: THREE.Event | undefined;
|
|
41
|
-
initialClick: [x: number, y: number, z: number];
|
|
42
|
-
initialHits: THREE.Object3D[];
|
|
43
|
-
hovered: Map<string, IntersectionEvent>;
|
|
44
|
-
};
|
|
45
|
-
export interface PointerCaptureTarget {
|
|
46
|
-
intersection: Intersection;
|
|
47
|
-
target: Element;
|
|
48
|
-
}
|
|
49
|
-
export type ThrelteXREvents = {
|
|
50
|
-
click: IntersectionEvent;
|
|
51
|
-
contextmenu: IntersectionEvent;
|
|
52
|
-
pointerup: IntersectionEvent;
|
|
53
|
-
pointerdown: IntersectionEvent;
|
|
54
|
-
pointerover: IntersectionEvent;
|
|
55
|
-
pointerout: IntersectionEvent;
|
|
56
|
-
pointerenter: IntersectionEvent;
|
|
57
|
-
pointerleave: IntersectionEvent;
|
|
58
|
-
pointermove: IntersectionEvent;
|
|
59
|
-
pointermissed: IntersectionEvent;
|
|
60
|
-
};
|
|
61
|
-
export declare const events: (keyof ThrelteXREvents)[];
|