@threlte/xr 0.0.11 → 0.0.12

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 (63) hide show
  1. package/dist/components/Controller.svelte +62 -13
  2. package/dist/components/Controller.svelte.d.ts +4 -0
  3. package/dist/components/Hand.svelte +11 -7
  4. package/dist/components/Headset.svelte +4 -7
  5. package/dist/components/internal/Cursor.svelte +51 -0
  6. package/dist/components/internal/Cursor.svelte.d.ts +19 -0
  7. package/dist/components/internal/PointerCursor.svelte +42 -0
  8. package/dist/components/internal/PointerCursor.svelte.d.ts +18 -0
  9. package/dist/components/internal/ScenePortal.svelte +10 -0
  10. package/dist/components/internal/ScenePortal.svelte.d.ts +16 -0
  11. package/dist/components/internal/ShortRay.svelte +45 -0
  12. package/dist/components/{ShortRay.svelte.d.ts → internal/ShortRay.svelte.d.ts} +4 -2
  13. package/dist/components/internal/TeleportCursor.svelte +47 -0
  14. package/dist/components/internal/TeleportCursor.svelte.d.ts +18 -0
  15. package/dist/components/internal/TeleportRay.svelte +71 -0
  16. package/dist/components/internal/TeleportRay.svelte.d.ts +20 -0
  17. package/dist/hooks/useController.d.ts +0 -4
  18. package/dist/hooks/useController.js +0 -11
  19. package/dist/index.d.ts +10 -3
  20. package/dist/index.js +13 -2
  21. package/dist/internal/headset.js +1 -1
  22. package/dist/internal/stores.d.ts +28 -2
  23. package/dist/internal/stores.js +28 -2
  24. package/dist/internal/useFixed.d.ts +11 -0
  25. package/dist/internal/useFixed.js +17 -0
  26. package/dist/plugins/pointerControls/compute.d.ts +3 -0
  27. package/dist/plugins/pointerControls/compute.js +14 -0
  28. package/dist/plugins/pointerControls/context.d.ts +12 -0
  29. package/dist/plugins/pointerControls/context.js +27 -0
  30. package/dist/plugins/pointerControls/hook.d.ts +5 -0
  31. package/dist/plugins/pointerControls/hook.js +24 -0
  32. package/dist/plugins/pointerControls/index.d.ts +27 -0
  33. package/dist/plugins/pointerControls/index.js +54 -0
  34. package/dist/plugins/pointerControls/plugin.d.ts +1 -0
  35. package/dist/plugins/pointerControls/plugin.js +28 -0
  36. package/dist/plugins/pointerControls/setup.d.ts +2 -0
  37. package/dist/plugins/pointerControls/setup.js +203 -0
  38. package/dist/plugins/pointerControls/types.d.ts +61 -0
  39. package/dist/plugins/pointerControls/types.js +11 -0
  40. package/dist/plugins/pointerControls/useComponentEventHandlers.d.ts +4 -0
  41. package/dist/plugins/pointerControls/useComponentEventHandlers.js +15 -0
  42. package/dist/plugins/teleportControls/compute.d.ts +3 -0
  43. package/dist/plugins/teleportControls/compute.js +14 -0
  44. package/dist/plugins/teleportControls/context.d.ts +20 -0
  45. package/dist/plugins/teleportControls/context.js +18 -0
  46. package/dist/plugins/teleportControls/hook.d.ts +6 -0
  47. package/dist/plugins/teleportControls/hook.js +40 -0
  48. package/dist/plugins/teleportControls/index.d.ts +19 -0
  49. package/dist/plugins/teleportControls/index.js +54 -0
  50. package/dist/plugins/teleportControls/plugin.d.ts +4 -0
  51. package/dist/plugins/teleportControls/plugin.js +54 -0
  52. package/dist/plugins/teleportControls/setup.d.ts +2 -0
  53. package/dist/plugins/teleportControls/setup.js +62 -0
  54. package/package.json +2 -2
  55. package/dist/components/Ray.svelte +0 -23
  56. package/dist/components/Ray.svelte.d.ts +0 -18
  57. package/dist/components/ShortRay.svelte +0 -32
  58. package/dist/components/TeleportControls.svelte +0 -136
  59. package/dist/components/TeleportControls.svelte.d.ts +0 -54
  60. package/dist/hooks/index.d.ts +0 -7
  61. package/dist/hooks/index.js +0 -7
  62. package/dist/plugins/teleportPlugin.d.ts +0 -1
  63. package/dist/plugins/teleportPlugin.js +0 -41
@@ -4,13 +4,17 @@
4
4
  <script
5
5
 
6
6
  context="module"
7
- >import { T, createRawEventDispatcher, useThrelte } from "@threlte/core";
7
+ >import { XRControllerModelFactory } from "three/examples/jsm/webxr/XRControllerModelFactory";
8
8
  import { onDestroy } from "svelte";
9
- import { XRControllerModelFactory } from "three/examples/jsm/webxr/XRControllerModelFactory";
10
- import ShortRay from "./ShortRay.svelte";
9
+ import { T, createRawEventDispatcher, useThrelte } from "@threlte/core";
11
10
  import { gaze, left as leftStore, right as rightStore } from "../hooks/useController";
12
- import { activeTeleportController, pendingTeleportDestination, isHandTracking } from "../internal/stores";
11
+ import { isHandTracking, pointerState, teleportState } from "../internal/stores";
13
12
  import { useHandTrackingState } from "../internal/useHandTrackingState";
13
+ import PointerCursor from "./internal/PointerCursor.svelte";
14
+ import ShortRay from "./internal/ShortRay.svelte";
15
+ import ScenePortal from "./internal/ScenePortal.svelte";
16
+ import TeleportCursor from "./internal/TeleportCursor.svelte";
17
+ import TeleportRay from "./internal/TeleportRay.svelte";
14
18
  const factory = new XRControllerModelFactory();
15
19
  const stores = {
16
20
  left: leftStore,
@@ -61,12 +65,12 @@ const handleDisconnected = (event) => {
61
65
  events.forEach((name) => event.target.removeEventListener(name, handleEvent));
62
66
  };
63
67
  for (const index of [0, 1]) {
64
- const controller = xr.getController(index);
68
+ const targetRay2 = xr.getController(index);
65
69
  const grip2 = xr.getControllerGrip(index);
66
70
  const model2 = factory.createControllerModel(grip2);
67
- eventMap.set(controller, { targetRay: controller, model: model2, grip: grip2 });
68
- controller.addEventListener("connected", handleConnected);
69
- controller.addEventListener("disconnected", handleDisconnected);
71
+ eventMap.set(targetRay2, { targetRay: targetRay2, model: model2, grip: grip2 });
72
+ targetRay2.addEventListener("connected", handleConnected);
73
+ targetRay2.addEventListener("disconnected", handleDisconnected);
70
74
  }
71
75
  $:
72
76
  store = stores[handedness];
@@ -76,6 +80,10 @@ $:
76
80
  targetRay = $store?.targetRay;
77
81
  $:
78
82
  model = $store?.model;
83
+ $:
84
+ hasPointerControls = $pointerState[handedness].enabled;
85
+ $:
86
+ hasTeleportControls = $teleportState[handedness].enabled;
79
87
  onDestroy(() => {
80
88
  for (const index of [0, 1]) {
81
89
  const controller2 = xr.getController(index);
@@ -106,13 +114,54 @@ onDestroy(() => {
106
114
  <T
107
115
  is={targetRay}
108
116
  name="XR controller {handedness}"
109
- visible={!$isHandTracking}
110
117
  >
111
118
  <slot name="target-ray" />
112
- <ShortRay
113
- visible={$activeTeleportController === targetRay &&
114
- $pendingTeleportDestination === undefined}
115
- />
119
+
120
+ {#if hasPointerControls || hasTeleportControls}
121
+ {#if $$slots['pointer-ray']}
122
+ <ShortRay {handedness}>
123
+ <slot name="pointer-ray" />
124
+ </ShortRay>
125
+ {:else}
126
+ <ShortRay {handedness} />
127
+ {/if}
128
+ {/if}
116
129
  </T>
117
130
  {/if}
118
131
  {/if}
132
+
133
+ <ScenePortal>
134
+ {#if hasPointerControls}
135
+ {#if $$slots['pointer-cursor']}
136
+ <PointerCursor {handedness}>
137
+ <slot name="pointer-cursor" />
138
+ </PointerCursor>
139
+ {:else}
140
+ <PointerCursor {handedness} />
141
+ {/if}
142
+ {/if}
143
+
144
+ {#if hasTeleportControls && targetRay !== undefined}
145
+ {#if $$slots['teleport-ray']}
146
+ <TeleportRay
147
+ {targetRay}
148
+ {handedness}
149
+ >
150
+ <slot name="teleport-ray" />
151
+ </TeleportRay>
152
+ {:else}
153
+ <TeleportRay
154
+ {targetRay}
155
+ {handedness}
156
+ />
157
+ {/if}
158
+
159
+ {#if $$slots['teleport-ray']}
160
+ <TeleportCursor {handedness}>
161
+ <slot name="teleport-cursor" />
162
+ </TeleportCursor>
163
+ {:else}
164
+ <TeleportCursor {handedness} />
165
+ {/if}
166
+ {/if}
167
+ </ScenePortal>
@@ -21,6 +21,10 @@ declare const __propDef: {
21
21
  default: {};
22
22
  grip: {};
23
23
  'target-ray': {};
24
+ 'pointer-ray': {};
25
+ 'pointer-cursor': {};
26
+ 'teleport-ray': {};
27
+ 'teleport-cursor': {};
24
28
  };
25
29
  events: {
26
30
  connected: XRControllerEvent<'connected'>;
@@ -1,9 +1,9 @@
1
- <script context='module'>import { T, useThrelte, createRawEventDispatcher, useFrame } from "@threlte/core";
1
+ <script context='module'>import { onDestroy } from "svelte";
2
2
  import { XRHandModelFactory } from "three/examples/jsm/webxr/XRHandModelFactory";
3
+ import { T, useThrelte, createRawEventDispatcher, useFrame } from "@threlte/core";
3
4
  import { isHandTracking } from "../internal/stores";
4
5
  import { useHandTrackingState } from "../internal/useHandTrackingState";
5
6
  import { left as leftStore, right as rightStore } from "../hooks/useHand";
6
- import { onDestroy } from "svelte";
7
7
  const factory = new XRHandModelFactory();
8
8
  const stores = {
9
9
  left: leftStore,
@@ -12,7 +12,8 @@ const stores = {
12
12
  const eventMap = /* @__PURE__ */ new WeakMap();
13
13
  </script>
14
14
 
15
- <script>export let left = void 0;
15
+ <script>import ScenePortal from "./internal/ScenePortal.svelte";
16
+ export let left = void 0;
16
17
  export let right = void 0;
17
18
  export let hand = void 0;
18
19
  const handTrackingNow = useHandTrackingState();
@@ -97,9 +98,12 @@ onDestroy(() => {
97
98
  {#if $$slots.default === undefined}
98
99
  <T is={model} />
99
100
  {/if}
100
- <T.Group bind:ref={children}>
101
- <slot name='wrist' />
102
- <slot />
103
- </T.Group>
104
101
  </T>
105
102
  {/if}
103
+
104
+ <ScenePortal>
105
+ <T.Group bind:ref={children}>
106
+ <slot name='wrist' />
107
+ <slot />
108
+ </T.Group>
109
+ </ScenePortal>
@@ -1,15 +1,12 @@
1
1
 
2
- <script>import { T, HierarchicalObject, useThrelte } from "@threlte/core";
2
+ <script>import { T } from "@threlte/core";
3
3
  import { useHeadset } from "../hooks/useHeadset";
4
- const { scene } = useThrelte();
4
+ import ScenePortal from "./internal/ScenePortal.svelte";
5
5
  const headset = useHeadset();
6
6
  </script>
7
7
 
8
- <HierarchicalObject
9
- onChildMount={(child) => { scene.add(child) }}
10
- onChildDestroy={(child) => { scene.remove(child) }}
11
- >
8
+ <ScenePortal>
12
9
  <T is={headset}>
13
10
  <slot />
14
11
  </T>
15
- </HierarchicalObject>
12
+ </ScenePortal>
@@ -0,0 +1,51 @@
1
+ <script>import { Color, DoubleSide, RawShaderMaterial } from "three";
2
+ import { T } from "@threlte/core";
3
+ export let color = new Color("white");
4
+ export let size = 0.03;
5
+ export let thickness = 0.035;
6
+ const vertexShader = `
7
+ uniform mat4 projectionMatrix;
8
+ uniform mat4 modelViewMatrix;
9
+ attribute vec2 uv;
10
+ attribute vec3 position;
11
+ varying vec2 vUv;
12
+ void main() {
13
+ vUv = uv;
14
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
15
+ }
16
+ `;
17
+ const fragmentShader = `
18
+ precision mediump float;
19
+ uniform float thickness;
20
+ uniform vec3 color;
21
+ varying vec2 vUv;
22
+ void main() {
23
+ float radius = 0.1;
24
+ float dist = length(vUv - vec2(0.5));
25
+ float alpha = 1.0 - step(thickness, abs(distance(vUv, vec2(0.5)) - 0.25));
26
+ gl_FragColor = vec4(color, alpha);
27
+ }
28
+ `;
29
+ const shaderMaterial = new RawShaderMaterial({
30
+ vertexShader,
31
+ fragmentShader,
32
+ uniforms: {
33
+ thickness: { value: thickness },
34
+ color: { value: color }
35
+ },
36
+ side: DoubleSide,
37
+ transparent: true,
38
+ depthTest: false
39
+ });
40
+ $:
41
+ shaderMaterial.uniforms.thickness.value = thickness;
42
+ $:
43
+ shaderMaterial.uniforms.color.value = color;
44
+ </script>
45
+
46
+ <T.Mesh
47
+ scale={size}
48
+ >
49
+ <T.PlaneGeometry />
50
+ <T is={shaderMaterial} />
51
+ </T.Mesh>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { type ColorRepresentation } from 'three';
3
+ declare const __propDef: {
4
+ props: {
5
+ color?: ColorRepresentation;
6
+ size?: number;
7
+ thickness?: number;
8
+ };
9
+ events: {
10
+ [evt: string]: CustomEvent<any>;
11
+ };
12
+ slots: {};
13
+ };
14
+ export type CursorProps = typeof __propDef.props;
15
+ export type CursorEvents = typeof __propDef.events;
16
+ export type CursorSlots = typeof __propDef.slots;
17
+ export default class Cursor extends SvelteComponent<CursorProps, CursorEvents, CursorSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,42 @@
1
+ <script>import { Group, Vector3 } from "three";
2
+ import { T, useFrame } from "@threlte/core";
3
+ import { pointerIntersection, pointerState } from "../../internal/stores";
4
+ import Cursor from "./Cursor.svelte";
5
+ export let handedness;
6
+ const ref = new Group();
7
+ const vec3 = new Vector3();
8
+ $:
9
+ hovering = $pointerState[handedness].hovering;
10
+ $:
11
+ intersection = pointerIntersection[handedness];
12
+ const { start, stop } = useFrame(
13
+ () => {
14
+ if (intersection.current === void 0)
15
+ return;
16
+ const { point, face } = intersection.current;
17
+ ref.position.lerp(point, 0.4);
18
+ if (face) {
19
+ ref.lookAt(vec3.addVectors(point, face.normal));
20
+ }
21
+ },
22
+ {
23
+ autostart: false
24
+ }
25
+ );
26
+ $:
27
+ if (hovering) {
28
+ ref.position.copy(intersection.current.point);
29
+ start();
30
+ } else {
31
+ stop();
32
+ }
33
+ </script>
34
+
35
+ <T
36
+ is={ref}
37
+ visible={hovering}
38
+ >
39
+ <slot>
40
+ <Cursor />
41
+ </slot>
42
+ </T>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ handedness: 'left' | 'right';
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {
10
+ default: {};
11
+ };
12
+ };
13
+ export type PointerCursorProps = typeof __propDef.props;
14
+ export type PointerCursorEvents = typeof __propDef.events;
15
+ export type PointerCursorSlots = typeof __propDef.slots;
16
+ export default class PointerCursor extends SvelteComponent<PointerCursorProps, PointerCursorEvents, PointerCursorSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,10 @@
1
+ <script>import { useThrelte, HierarchicalObject } from "@threlte/core";
2
+ const { scene } = useThrelte();
3
+ </script>
4
+
5
+ <HierarchicalObject
6
+ onChildMount={(child) => scene.add(child)}
7
+ onChildDestroy={(child) => scene.remove(child)}
8
+ >
9
+ <slot />
10
+ </HierarchicalObject>
@@ -0,0 +1,16 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: Record<string, never>;
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {
8
+ default: {};
9
+ };
10
+ };
11
+ export type ScenePortalProps = typeof __propDef.props;
12
+ export type ScenePortalEvents = typeof __propDef.events;
13
+ export type ScenePortalSlots = typeof __propDef.slots;
14
+ export default class ScenePortal extends SvelteComponent<ScenePortalProps, ScenePortalEvents, ScenePortalSlots> {
15
+ }
16
+ export {};
@@ -0,0 +1,45 @@
1
+ <script>import { T } from "@threlte/core";
2
+ import { pointerState, teleportState, teleportIntersection } from "../../internal/stores";
3
+ export let handedness;
4
+ $:
5
+ hovering = $teleportState[handedness].hovering;
6
+ $:
7
+ intersection = teleportIntersection[handedness];
8
+ $:
9
+ visible = $pointerState[handedness].enabled || hovering && $intersection === void 0;
10
+ </script>
11
+
12
+ <T.Group {visible}>
13
+ <slot>
14
+ <T.Mesh
15
+ rotation.x={-Math.PI / 2}
16
+ position.z={-0.1}
17
+ >
18
+ <T.CylinderGeometry
19
+ args={[0.002, 0.002, 0.2, 16, 1, false]}
20
+ />
21
+ <T.RawShaderMaterial
22
+ transparent
23
+ vertexShader={`
24
+ uniform mat4 modelViewMatrix;
25
+ uniform mat4 projectionMatrix;
26
+ attribute vec2 uv;
27
+ attribute vec3 position;
28
+ varying vec2 vUv;
29
+ void main() {
30
+ vUv = uv;
31
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
32
+ }
33
+ `}
34
+ fragmentShader={`
35
+ precision mediump float;
36
+ varying vec2 vUv;
37
+ void main() {
38
+ gl_FragColor = vec4(1.0, 1.0, 1.0, pow(vUv.y - 1.0, 2.0));
39
+ }
40
+ `}
41
+ />
42
+ </T.Mesh>
43
+ </slot>
44
+ </T.Group>
45
+
@@ -1,12 +1,14 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- [x: string]: any;
4
+ handedness: 'left' | 'right';
5
5
  };
6
6
  events: {
7
7
  [evt: string]: CustomEvent<any>;
8
8
  };
9
- slots: {};
9
+ slots: {
10
+ default: {};
11
+ };
10
12
  };
11
13
  export type ShortRayProps = typeof __propDef.props;
12
14
  export type ShortRayEvents = typeof __propDef.events;
@@ -0,0 +1,47 @@
1
+ <script>import { spring } from "svelte/motion";
2
+ import { Group, Vector3 } from "three";
3
+ import { T, useFrame } from "@threlte/core";
4
+ import { teleportIntersection } from "../../internal/stores";
5
+ import Cursor from "./Cursor.svelte";
6
+ export let handedness;
7
+ const ref = new Group();
8
+ const vec3 = new Vector3();
9
+ $:
10
+ intersection = teleportIntersection[handedness];
11
+ const { start, stop } = useFrame(
12
+ () => {
13
+ if (intersection.current === void 0)
14
+ return;
15
+ const { point, face } = intersection.current;
16
+ ref.position.lerp(point, 0.4);
17
+ if (face) {
18
+ ref.lookAt(vec3.addVectors(point, face.normal));
19
+ }
20
+ },
21
+ {
22
+ autostart: false
23
+ }
24
+ );
25
+ const size = spring(0.1, { stiffness: 0.2 });
26
+ $:
27
+ if ($intersection === void 0) {
28
+ size.set(0.1);
29
+ stop();
30
+ } else {
31
+ size.set(1);
32
+ ref.position.copy($intersection.point);
33
+ start();
34
+ }
35
+ </script>
36
+
37
+ <T
38
+ is={ref}
39
+ visible={$intersection !== undefined}
40
+ >
41
+ <slot>
42
+ <Cursor
43
+ size={$size}
44
+ thickness={0.015}
45
+ />
46
+ </slot>
47
+ </T>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ handedness: 'left' | 'right';
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {
10
+ default: {};
11
+ };
12
+ };
13
+ export type TeleportCursorProps = typeof __propDef.props;
14
+ export type TeleportCursorEvents = typeof __propDef.events;
15
+ export type TeleportCursorSlots = typeof __propDef.slots;
16
+ export default class TeleportCursor extends SvelteComponent<TeleportCursorProps, TeleportCursorEvents, TeleportCursorSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,71 @@
1
+ <script>import { Vector3, QuadraticBezierCurve3, Vector2 } from "three";
2
+ import { Line2 } from "three/examples/jsm/lines/Line2";
3
+ import { LineGeometry } from "three/examples/jsm/lines/LineGeometry";
4
+ import { LineMaterial } from "three/examples/jsm/lines/LineMaterial";
5
+ import { T, useFrame } from "@threlte/core";
6
+ import { teleportIntersection } from "../../internal/stores";
7
+ export let handedness;
8
+ export let targetRay;
9
+ let lineGeometry = new LineGeometry();
10
+ const rayStart = new Vector3();
11
+ const rayMidpoint = new Vector3();
12
+ const curve = new QuadraticBezierCurve3();
13
+ const rayDivisions = 40;
14
+ const positions = new Float32Array(rayDivisions * 3);
15
+ const vec3 = new Vector3();
16
+ const v2_1 = new Vector2();
17
+ const v2_2 = new Vector2();
18
+ $:
19
+ intersection = teleportIntersection[handedness];
20
+ const setCurvePoints = (alpha = 0.3) => {
21
+ if (intersection.current === void 0)
22
+ return;
23
+ const rayEnd = intersection.current.point;
24
+ targetRay.getWorldPosition(rayStart);
25
+ rayMidpoint.x = (rayStart.x + rayEnd.x) / 2;
26
+ rayMidpoint.y = (rayStart.y + rayEnd.y) / 2;
27
+ rayMidpoint.z = (rayStart.z + rayEnd.z) / 2;
28
+ const arc = Math.log1p(
29
+ v2_1.set(rayStart.x, rayStart.z).distanceTo(v2_2.set(rayEnd.x, rayEnd.z))
30
+ );
31
+ rayMidpoint.y += arc;
32
+ curve.v0.lerp(rayStart, alpha);
33
+ curve.v1.lerp(rayMidpoint, alpha);
34
+ curve.v2.lerp(rayEnd, alpha);
35
+ for (let i = 0, j = 0; i < rayDivisions; i += 1, j += 3) {
36
+ const t = i / rayDivisions;
37
+ curve.getPoint(t, vec3);
38
+ positions[j + 0] = vec3.x;
39
+ positions[j + 1] = vec3.y;
40
+ positions[j + 2] = vec3.z;
41
+ }
42
+ lineGeometry.setPositions(positions);
43
+ };
44
+ const { start, stop } = useFrame(
45
+ () => {
46
+ setCurvePoints();
47
+ },
48
+ { autostart: false }
49
+ );
50
+ $:
51
+ if ($intersection === void 0) {
52
+ stop();
53
+ } else {
54
+ setCurvePoints(1);
55
+ start();
56
+ }
57
+ </script>
58
+
59
+ <slot>
60
+ <T
61
+ is={Line2}
62
+ visible={$intersection !== undefined}
63
+ position.z={-0.01}
64
+ >
65
+ <T is={lineGeometry} />
66
+ <T
67
+ is={LineMaterial}
68
+ linewidth={0.004}
69
+ />
70
+ </T>
71
+ </slot>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { type XRTargetRaySpace } from 'three';
3
+ declare const __propDef: {
4
+ props: {
5
+ handedness: 'left' | 'right';
6
+ targetRay: XRTargetRaySpace;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {
12
+ default: {};
13
+ };
14
+ };
15
+ export type TeleportRayProps = typeof __propDef.props;
16
+ export type TeleportRayEvents = typeof __propDef.events;
17
+ export type TeleportRaySlots = typeof __propDef.slots;
18
+ export default class TeleportRay extends SvelteComponent<TeleportRayProps, TeleportRayEvents, TeleportRaySlots> {
19
+ }
20
+ export {};
@@ -8,7 +8,3 @@ export declare const gaze: CurrentWritable<XRController | undefined>;
8
8
  * Provides a reference to a current XRController, filtered by handedness.
9
9
  */
10
10
  export declare const useController: (handedness: XRHandedness) => CurrentWritable<XRController | undefined>;
11
- /**
12
- * Provides a reference to the gamepad attached to a current XRController.
13
- */
14
- export declare const useGamepad: (handedness: 'left' | 'right') => CurrentWritable<Gamepad | undefined>;
@@ -19,14 +19,3 @@ export const useController = (handedness) => {
19
19
  return gaze;
20
20
  }
21
21
  };
22
- /**
23
- * Provides a reference to the gamepad attached to a current XRController.
24
- */
25
- export const useGamepad = (handedness) => {
26
- switch (handedness) {
27
- case 'left':
28
- return gamepadLeft;
29
- case 'right':
30
- return gamepadRight;
31
- }
32
- };
package/dist/index.d.ts CHANGED
@@ -4,10 +4,17 @@ export { default as XRButton } from './components/XRButton.svelte';
4
4
  export { default as Controller } from './components/Controller.svelte';
5
5
  export { default as Hand } from './components/Hand.svelte';
6
6
  export { default as Headset } from './components/Headset.svelte';
7
- export { default as TeleportControls } from './components/TeleportControls.svelte';
8
7
  export { default as XR } from './components/XR.svelte';
9
8
  export { getXRSupportState } from './lib/getXRSupportState';
10
9
  export { toggleXRSession } from './lib/toggleXRSession';
11
10
  export { handJoints } from './lib/handJoints';
12
- export * from './hooks';
13
- export type * from './types';
11
+ export { pointerControls } from './plugins/pointerControls';
12
+ export { teleportControls } from './plugins/teleportControls';
13
+ export { useController } from './hooks/useController';
14
+ export { useHand } from './hooks/useHand';
15
+ export { useHandJoint } from './hooks/useHandJoint';
16
+ export { useHeadset } from './hooks/useHeadset';
17
+ export { useHitTest } from './hooks/useHitTest';
18
+ export { useTeleport } from './hooks/useTeleport';
19
+ export { useXR } from './hooks/useXR';
20
+ export type { XRSessionEventType, XRControllerEventType, XRHandEventType, XRSessionEvent, XRControllerEvent, XRController, XRHand, XRHandEvent, } from './types';
package/dist/index.js CHANGED
@@ -1,12 +1,23 @@
1
+ // Components
1
2
  export { default as ARButton } from './components/ARButton.svelte';
2
3
  export { default as VRButton } from './components/VRButton.svelte';
3
4
  export { default as XRButton } from './components/XRButton.svelte';
4
5
  export { default as Controller } from './components/Controller.svelte';
5
6
  export { default as Hand } from './components/Hand.svelte';
6
7
  export { default as Headset } from './components/Headset.svelte';
7
- export { default as TeleportControls } from './components/TeleportControls.svelte';
8
8
  export { default as XR } from './components/XR.svelte';
9
+ // Utilities
9
10
  export { getXRSupportState } from './lib/getXRSupportState';
10
11
  export { toggleXRSession } from './lib/toggleXRSession';
11
12
  export { handJoints } from './lib/handJoints';
12
- export * from './hooks';
13
+ // Plugins
14
+ export { pointerControls } from './plugins/pointerControls';
15
+ export { teleportControls } from './plugins/teleportControls';
16
+ // Hooks
17
+ export { useController } from './hooks/useController';
18
+ export { useHand } from './hooks/useHand';
19
+ export { useHandJoint } from './hooks/useHandJoint';
20
+ export { useHeadset } from './hooks/useHeadset';
21
+ export { useHitTest } from './hooks/useHitTest';
22
+ export { useTeleport } from './hooks/useTeleport';
23
+ export { useXR } from './hooks/useXR';
@@ -1,6 +1,6 @@
1
1
  import { Group } from 'three';
2
2
  import { useThrelte, useFrame, watch } from '@threlte/core';
3
- import { useXR } from '../hooks';
3
+ import { useXR } from '../hooks/useXR';
4
4
  export const headset = new Group();
5
5
  export const useUpdateHeadset = () => {
6
6
  const { renderer, camera } = useThrelte();