@threlte/xr 1.0.7 → 1.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.
Files changed (71) hide show
  1. package/dist/components/ARButton.svelte.d.ts +11 -24
  2. package/dist/components/Controller.svelte +51 -52
  3. package/dist/components/Controller.svelte.d.ts +7 -5
  4. package/dist/components/Hand.svelte +35 -41
  5. package/dist/components/Hand.svelte.d.ts +6 -4
  6. package/dist/components/Headset.svelte +16 -7
  7. package/dist/components/Headset.svelte.d.ts +8 -18
  8. package/dist/components/VRButton.svelte.d.ts +5 -18
  9. package/dist/components/XR.svelte +50 -50
  10. package/dist/components/XR.svelte.d.ts +24 -22
  11. package/dist/components/XRButton.svelte +6 -6
  12. package/dist/components/XRButton.svelte.d.ts +26 -23
  13. package/dist/components/internal/Cursor.svelte +2 -1
  14. package/dist/components/internal/Cursor.svelte.d.ts +4 -2
  15. package/dist/components/internal/PointerCursor.svelte +32 -18
  16. package/dist/components/internal/PointerCursor.svelte.d.ts +5 -3
  17. package/dist/components/internal/ShortRay.svelte +6 -6
  18. package/dist/components/internal/ShortRay.svelte.d.ts +5 -3
  19. package/dist/components/internal/TeleportCursor.svelte +28 -17
  20. package/dist/components/internal/TeleportCursor.svelte.d.ts +5 -3
  21. package/dist/components/internal/TeleportRay.svelte +26 -20
  22. package/dist/components/internal/TeleportRay.svelte.d.ts +5 -3
  23. package/dist/hooks/currentReadable.svelte.d.ts +5 -0
  24. package/dist/hooks/currentReadable.svelte.js +11 -0
  25. package/dist/hooks/useController.svelte.d.ts +13 -0
  26. package/dist/hooks/useController.svelte.js +22 -0
  27. package/dist/hooks/useHand.svelte.d.ts +12 -0
  28. package/dist/hooks/{useHand.js → useHand.svelte.js} +8 -5
  29. package/dist/hooks/{useHandJoint.d.ts → useHandJoint.svelte.d.ts} +1 -1
  30. package/dist/hooks/useHandJoint.svelte.js +21 -0
  31. package/dist/hooks/useHeadset.js +1 -1
  32. package/dist/hooks/useHitTest.svelte.js +67 -0
  33. package/dist/hooks/useTeleport.js +1 -2
  34. package/dist/hooks/useXR.d.ts +6 -7
  35. package/dist/hooks/useXR.js +10 -12
  36. package/dist/index.d.ts +4 -4
  37. package/dist/index.js +4 -4
  38. package/dist/internal/raf.d.ts +1 -0
  39. package/dist/internal/raf.js +2 -0
  40. package/dist/internal/setupControllers.js +13 -14
  41. package/dist/internal/setupHands.js +8 -9
  42. package/dist/internal/{setupHeadset.js → setupHeadset.svelte.js} +6 -6
  43. package/dist/internal/setupRaf.svelte.js +17 -0
  44. package/dist/internal/state.svelte.d.ts +51 -0
  45. package/dist/internal/state.svelte.js +40 -0
  46. package/dist/internal/useHandTrackingState.js +10 -7
  47. package/dist/lib/getXRSessionOptions.d.ts +1 -1
  48. package/dist/lib/toggleXRSession.d.ts +3 -3
  49. package/dist/lib/toggleXRSession.js +3 -3
  50. package/dist/plugins/pointerControls/compute.js +2 -6
  51. package/dist/plugins/pointerControls/index.js +4 -10
  52. package/dist/plugins/pointerControls/{setup.js → setup.svelte.js} +21 -22
  53. package/dist/plugins/teleportControls/compute.js +2 -6
  54. package/dist/plugins/teleportControls/index.js +4 -10
  55. package/dist/plugins/teleportControls/{setup.js → setup.svelte.js} +9 -10
  56. package/package.json +8 -8
  57. package/dist/components/internal/ScenePortal.svelte +0 -23
  58. package/dist/components/internal/ScenePortal.svelte.d.ts +0 -20
  59. package/dist/hooks/useController.d.ts +0 -9
  60. package/dist/hooks/useController.js +0 -19
  61. package/dist/hooks/useHand.d.ts +0 -8
  62. package/dist/hooks/useHandJoint.js +0 -20
  63. package/dist/hooks/useHitTest.js +0 -79
  64. package/dist/internal/setupRaf.js +0 -16
  65. package/dist/internal/stores.d.ts +0 -43
  66. package/dist/internal/stores.js +0 -42
  67. /package/dist/hooks/{useHitTest.d.ts → useHitTest.svelte.d.ts} +0 -0
  68. /package/dist/internal/{setupHeadset.d.ts → setupHeadset.svelte.d.ts} +0 -0
  69. /package/dist/internal/{setupRaf.d.ts → setupRaf.svelte.d.ts} +0 -0
  70. /package/dist/plugins/pointerControls/{setup.d.ts → setup.svelte.d.ts} +0 -0
  71. /package/dist/plugins/teleportControls/{setup.d.ts → setup.svelte.d.ts} +0 -0
@@ -1,18 +1,17 @@
1
1
  import { Vector3 } from 'three';
2
- import { watch } from '@threlte/core';
2
+ import { observe, watch } from '@threlte/core';
3
3
  import { getInternalContext } from './context';
4
- import { useController } from '../../hooks/useController';
5
- import { useHand } from '../../hooks/useHand';
6
- import { useXR } from '../../hooks/useXR';
4
+ import { controllers } from '../../hooks/useController.svelte';
5
+ import { useHand } from '../../hooks/useHand.svelte';
7
6
  import { useFixed } from '../../internal/useFixed';
8
- import { pointerIntersection } from '../../internal/stores';
7
+ import { isPresenting, pointerIntersection } from '../../internal/state.svelte';
9
8
  const getIntersectionId = (intersection) => {
10
9
  return `${(intersection.eventObject || intersection.object).uuid}/${intersection.index}${intersection.instanceId ?? ''}`;
11
10
  };
12
11
  const EPSILON = 0.0001;
13
12
  export const setupPointerControls = (context, handContext, fixedStep = 1 / 40) => {
14
13
  const handedness = handContext.hand;
15
- const controller = useController(handedness);
14
+ const controller = $derived(controllers[handedness]);
16
15
  const hand = useHand(handedness);
17
16
  const { dispatchers } = getInternalContext();
18
17
  let hits = [];
@@ -64,7 +63,7 @@ export const setupPointerControls = (context, handContext, fixedStep = 1 / 40) =
64
63
  const intersections = [];
65
64
  const hits = context.raycaster.intersectObjects(context.interactiveObjects, true);
66
65
  const filtered = context.filter === undefined ? hits : context.filter(hits, context, handContext);
67
- pointerIntersection[handedness].set(filtered[0]);
66
+ pointerIntersection[handedness] = filtered[0];
68
67
  // Bubble up the events, find the event source (eventObject)
69
68
  for (const hit of filtered) {
70
69
  let eventObject = hit.object;
@@ -96,6 +95,9 @@ export const setupPointerControls = (context, handContext, fixedStep = 1 / 40) =
96
95
  let stopped = false;
97
96
  // loop through all hits and dispatch events
98
97
  dispatchEvents: for (const hit of hits) {
98
+ const events = dispatchers.get(hit.eventObject);
99
+ if (events === undefined)
100
+ continue;
99
101
  const intersectionEvent = {
100
102
  stopped,
101
103
  ...hit,
@@ -115,9 +117,6 @@ export const setupPointerControls = (context, handContext, fixedStep = 1 / 40) =
115
117
  pointer: handContext.pointer.current,
116
118
  ray: context.raycaster.ray
117
119
  };
118
- const events = dispatchers.get(hit.eventObject);
119
- if (events === undefined)
120
- return;
121
120
  if (isPointerMove) {
122
121
  // Move event ...
123
122
  handContext.pointer.update((value) => value.copy(intersectionEvent.point));
@@ -158,7 +157,7 @@ export const setupPointerControls = (context, handContext, fixedStep = 1 / 40) =
158
157
  };
159
158
  const { start, stop } = useFixed(() => {
160
159
  hits = processHits();
161
- const targetRay = controller.current?.targetRay;
160
+ const targetRay = controller?.targetRay;
162
161
  if (targetRay === undefined)
163
162
  return;
164
163
  if (targetRay.position.distanceTo(lastPosition) > EPSILON) {
@@ -169,18 +168,18 @@ export const setupPointerControls = (context, handContext, fixedStep = 1 / 40) =
169
168
  fixedStep,
170
169
  autoStart: false
171
170
  });
172
- watch([controller, handContext.enabled], ([input, enabled]) => {
173
- if (input === undefined)
171
+ observe.pre(() => [controller, handContext.enabled], ([controller, $enabled]) => {
172
+ if (controller === undefined)
174
173
  return;
175
174
  const removeHandlers = () => {
176
- input.targetRay.removeEventListener('selectstart', handlePointerDown);
177
- input.targetRay.removeEventListener('selectend', handlePointerUp);
178
- input.targetRay.removeEventListener('select', handleClick);
175
+ controller.targetRay.removeEventListener('selectstart', handlePointerDown);
176
+ controller.targetRay.removeEventListener('selectend', handlePointerUp);
177
+ controller.targetRay.removeEventListener('select', handleClick);
179
178
  };
180
- if (enabled) {
181
- input.targetRay.addEventListener('selectstart', handlePointerDown);
182
- input.targetRay.addEventListener('selectend', handlePointerUp);
183
- input.targetRay.addEventListener('select', handleClick);
179
+ if ($enabled) {
180
+ controller.targetRay.addEventListener('selectstart', handlePointerDown);
181
+ controller.targetRay.addEventListener('selectend', handlePointerUp);
182
+ controller.targetRay.addEventListener('select', handleClick);
184
183
  return removeHandlers;
185
184
  }
186
185
  else {
@@ -207,8 +206,8 @@ export const setupPointerControls = (context, handContext, fixedStep = 1 / 40) =
207
206
  return;
208
207
  }
209
208
  });
210
- watch([useXR().isPresenting, handContext.enabled], ([isPresenting, enabled]) => {
211
- if (isPresenting && enabled) {
209
+ observe.pre(() => [isPresenting.current, handContext.enabled], ([isPresenting, $enabled]) => {
210
+ if (isPresenting && $enabled) {
212
211
  start();
213
212
  }
214
213
  else {
@@ -1,12 +1,8 @@
1
1
  import { Vector3 } from 'three';
2
- import { useController } from '../../hooks/useController';
3
- const controllers = {
4
- left: useController('left'),
5
- right: useController('right')
6
- };
2
+ import { controllers } from '../../hooks/useController.svelte';
7
3
  const forward = new Vector3();
8
4
  export const defaultComputeFunction = (context, handContext) => {
9
- const targetRay = controllers[handContext.hand].current?.targetRay;
5
+ const targetRay = controllers[handContext.hand]?.targetRay;
10
6
  if (targetRay === undefined)
11
7
  return;
12
8
  forward.set(0, 0, -1).applyQuaternion(targetRay.quaternion);
@@ -2,8 +2,8 @@ import { currentWritable, watch } from '@threlte/core';
2
2
  import { createTeleportContext, useTeleportControls, getHandContext } from './context';
3
3
  import { injectTeleportControlsPlugin } from './plugin.svelte';
4
4
  import { setHandContext } from './context';
5
- import { setupTeleportControls } from './setup';
6
- import { teleportState } from '../../internal/stores';
5
+ import { setupTeleportControls } from './setup.svelte';
6
+ import { teleportState } from '../../internal/state.svelte';
7
7
  let controlsCounter = 0;
8
8
  export const teleportControls = (handedness, options) => {
9
9
  if (useTeleportControls() === undefined) {
@@ -26,16 +26,10 @@ export const teleportControls = (handedness, options) => {
26
26
  const handContext = getHandContext(handedness);
27
27
  watch(handContext.enabled, (enabled) => {
28
28
  controlsCounter += enabled ? 1 : -1;
29
- teleportState.update((value) => {
30
- value[handedness].enabled = controlsCounter > 0;
31
- return value;
32
- });
29
+ teleportState[handedness].enabled = controlsCounter > 0;
33
30
  });
34
31
  watch(handContext.active, (hovering) => {
35
- teleportState.update((value) => {
36
- value[handedness].hovering = hovering;
37
- return value;
38
- });
32
+ teleportState[handedness].hovering = hovering;
39
33
  });
40
34
  return {
41
35
  enabled: handContext.enabled,
@@ -1,19 +1,18 @@
1
- import { watch } from '@threlte/core';
2
- import { useXR } from '../../hooks/useXR';
3
- import { useController } from '../../hooks/useController';
1
+ import { observe } from '@threlte/core';
2
+ import { controllers } from '../../hooks/useController.svelte';
4
3
  import { useTeleport } from '../../hooks/useTeleport';
5
4
  import { useFixed } from '../../internal/useFixed';
6
- import { teleportIntersection } from '../../internal/stores';
5
+ import { isPresenting, teleportIntersection } from '../../internal/state.svelte';
7
6
  export const setupTeleportControls = (context, handContext, fixedStep = 1 / 40) => {
8
7
  const handedness = handContext.hand;
9
- const controller = useController(handedness);
8
+ const controller = $derived(controllers[handedness]);
10
9
  const teleport = useTeleport();
11
10
  const handleHoverEnd = () => {
12
11
  handContext.hovered.set(undefined);
13
- teleportIntersection[handedness].set(undefined);
12
+ teleportIntersection[handedness] = undefined;
14
13
  };
15
14
  const { start, stop } = useFixed(() => {
16
- const gamepad = controller.current?.inputSource.gamepad;
15
+ const gamepad = controller?.inputSource.gamepad;
17
16
  if (gamepad === undefined) {
18
17
  return;
19
18
  }
@@ -45,14 +44,14 @@ export const setupTeleportControls = (context, handContext, fixedStep = 1 / 40)
45
44
  }
46
45
  return;
47
46
  }
48
- teleportIntersection[handedness].set(intersect);
47
+ teleportIntersection[handedness] = intersect;
49
48
  handContext.hovered.set(intersect);
50
49
  }, {
51
50
  fixedStep,
52
51
  autoStart: false
53
52
  });
54
- watch([useXR().isPresenting, handContext.enabled], ([isPresenting, enabled]) => {
55
- if (isPresenting && enabled) {
53
+ observe.pre(() => [isPresenting.current, handContext.enabled], ([isPresenting, $enabled]) => {
54
+ if (isPresenting && $enabled) {
56
55
  start();
57
56
  }
58
57
  else {
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@threlte/xr",
3
- "version": "1.0.7",
3
+ "version": "1.1.0",
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": "^3.3.1",
10
- "@sveltejs/kit": "^2.7.7",
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": "^4.0.0",
12
+ "@sveltejs/vite-plugin-svelte": "^6.1.4",
13
13
  "@types/three": "^0.175.0",
14
14
  "@types/webxr": "^0.5.22",
15
15
  "autoprefixer": "^10.4.19",
@@ -18,15 +18,15 @@
18
18
  "globals": "^16.1.0",
19
19
  "postcss": "^8.4.38",
20
20
  "publint": "^0.2.7",
21
- "svelte": "^5.26.2",
22
- "svelte-check": "^4.1.7",
21
+ "svelte": "5.26.2",
22
+ "svelte-check": "^4.3.1",
23
23
  "three": "^0.175.0",
24
24
  "tslib": "^2.6.2",
25
25
  "typescript": "^5.6.3",
26
26
  "typescript-eslint": "^8.32.0",
27
- "vite": "^5.2.8",
27
+ "vite": "^7.1.4",
28
28
  "vite-plugin-mkcert": "^1.17.5",
29
- "@threlte/core": "8.0.5"
29
+ "@threlte/core": "8.1.5"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "svelte": ">=5",
@@ -1,23 +0,0 @@
1
- <script lang="ts">
2
- import { T, useThrelte } from '@threlte/core'
3
- import { Object3D } from 'three'
4
-
5
- const { scene } = useThrelte()
6
-
7
- const proxy = new Object3D()
8
- proxy.add = (child) => {
9
- scene.add(child)
10
- return child
11
- }
12
- proxy.remove = (child) => {
13
- scene.remove(child)
14
- return child
15
- }
16
- </script>
17
-
18
- <T
19
- is={proxy}
20
- attach={false}
21
- >
22
- <slot />
23
- </T>
@@ -1,20 +0,0 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const ScenePortal: $$__sveltets_2_IsomorphicComponent<any, {
15
- [evt: string]: CustomEvent<any>;
16
- }, {
17
- default: {};
18
- }, {}, string>;
19
- type ScenePortal = InstanceType<typeof ScenePortal>;
20
- export default ScenePortal;
@@ -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
- };
@@ -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
- };
@@ -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
- };
@@ -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
- };