@threlte/xr 0.1.0 → 0.1.2

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.
@@ -1,4 +1,3 @@
1
- /// <reference types="bun-types" />
2
1
  /// <reference types="webxr" />
3
2
  import { SvelteComponent } from "svelte";
4
3
  declare const __propDef: {
@@ -11,16 +10,16 @@ declare const __propDef: {
11
10
  formnovalidate?: boolean | null | undefined;
12
11
  formtarget?: string | null | undefined;
13
12
  name?: string | null | undefined;
14
- type?: "submit" | "reset" | "button" | null | undefined;
13
+ type?: "button" | "reset" | "submit" | null | undefined;
15
14
  value?: string | number | string[] | null | undefined;
16
15
  accesskey?: string | null | undefined;
17
16
  autofocus?: boolean | null | undefined;
18
17
  class?: string | null | undefined;
19
- contenteditable?: import("svelte/elements").Booleanish | "inherit" | null | undefined;
18
+ contenteditable?: "inherit" | import("svelte/elements").Booleanish | null | undefined;
20
19
  contextmenu?: string | null | undefined;
21
20
  dir?: string | null | undefined;
22
21
  draggable?: import("svelte/elements").Booleanish | null | undefined;
23
- enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | null | undefined;
22
+ enterkeyhint?: "search" | "next" | "done" | "enter" | "go" | "previous" | "send" | null | undefined;
24
23
  hidden?: boolean | null | undefined;
25
24
  id?: string | null | undefined;
26
25
  lang?: string | null | undefined;
@@ -54,13 +53,13 @@ declare const __propDef: {
54
53
  itemref?: string | null | undefined;
55
54
  results?: number | null | undefined;
56
55
  security?: string | null | undefined;
57
- unselectable?: "on" | "off" | null | undefined;
58
- inputmode?: "url" | "search" | "none" | "text" | "tel" | "email" | "numeric" | "decimal" | null | undefined;
56
+ unselectable?: "off" | "on" | null | undefined;
57
+ inputmode?: "search" | "numeric" | "none" | "url" | "text" | "email" | "tel" | "decimal" | null | undefined;
59
58
  is?: string | null | undefined;
60
59
  'bind:innerHTML'?: string | null | undefined;
61
60
  'bind:textContent'?: string | null | undefined;
62
61
  'bind:innerText'?: string | null | undefined;
63
- 'bind:contentRect'?: any;
62
+ 'bind:contentRect'?: DOMRectReadOnly | null | undefined;
64
63
  'bind:contentBoxSize'?: ResizeObserverSize[] | null | undefined;
65
64
  'bind:borderBoxSize'?: ResizeObserverSize[] | null | undefined;
66
65
  'bind:devicePixelContentBoxSize'?: ResizeObserverSize[] | null | undefined;
@@ -72,23 +71,23 @@ declare const __propDef: {
72
71
  'data-sveltekit-replacestate'?: true | "" | "off" | null | undefined;
73
72
  'aria-activedescendant'?: string | null | undefined;
74
73
  'aria-atomic'?: import("svelte/elements").Booleanish | null | undefined;
75
- 'aria-autocomplete'?: "inline" | "list" | "none" | "both" | null | undefined;
74
+ 'aria-autocomplete'?: "inline" | "both" | "none" | "list" | null | undefined;
76
75
  'aria-busy'?: import("svelte/elements").Booleanish | null | undefined;
77
- 'aria-checked'?: boolean | "true" | "false" | "mixed" | null | undefined;
76
+ 'aria-checked'?: boolean | "false" | "true" | "mixed" | null | undefined;
78
77
  'aria-colcount'?: number | null | undefined;
79
78
  'aria-colindex'?: number | null | undefined;
80
79
  'aria-colspan'?: number | null | undefined;
81
80
  'aria-controls'?: string | null | undefined;
82
- 'aria-current'?: import("svelte/elements").Booleanish | "page" | "step" | "location" | "date" | "time" | null | undefined;
81
+ 'aria-current'?: "time" | "location" | "page" | import("svelte/elements").Booleanish | "step" | "date" | null | undefined;
83
82
  'aria-describedby'?: string | null | undefined;
84
83
  'aria-details'?: string | null | undefined;
85
84
  'aria-disabled'?: import("svelte/elements").Booleanish | null | undefined;
86
- 'aria-dropeffect'?: "link" | "none" | "copy" | "execute" | "move" | "popup" | null | undefined;
85
+ 'aria-dropeffect'?: "link" | "none" | "copy" | "move" | "execute" | "popup" | null | undefined;
87
86
  'aria-errormessage'?: string | null | undefined;
88
87
  'aria-expanded'?: import("svelte/elements").Booleanish | null | undefined;
89
88
  'aria-flowto'?: string | null | undefined;
90
89
  'aria-grabbed'?: import("svelte/elements").Booleanish | null | undefined;
91
- 'aria-haspopup'?: import("svelte/elements").Booleanish | "dialog" | "grid" | "listbox" | "menu" | "tree" | null | undefined;
90
+ 'aria-haspopup'?: "grid" | "dialog" | "menu" | import("svelte/elements").Booleanish | "listbox" | "tree" | null | undefined;
92
91
  'aria-hidden'?: import("svelte/elements").Booleanish | null | undefined;
93
92
  'aria-invalid'?: import("svelte/elements").Booleanish | "grammar" | "spelling" | null | undefined;
94
93
  'aria-keyshortcuts'?: string | null | undefined;
@@ -103,9 +102,9 @@ declare const __propDef: {
103
102
  'aria-owns'?: string | null | undefined;
104
103
  'aria-placeholder'?: string | null | undefined;
105
104
  'aria-posinset'?: number | null | undefined;
106
- 'aria-pressed'?: boolean | "true" | "false" | "mixed" | null | undefined;
105
+ 'aria-pressed'?: boolean | "false" | "true" | "mixed" | null | undefined;
107
106
  'aria-readonly'?: import("svelte/elements").Booleanish | null | undefined;
108
- 'aria-relevant'?: "text" | "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | null | undefined;
107
+ 'aria-relevant'?: "all" | "text" | "additions" | "additions removals" | "additions text" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | null | undefined;
109
108
  'aria-required'?: import("svelte/elements").Booleanish | null | undefined;
110
109
  'aria-roledescription'?: string | null | undefined;
111
110
  'aria-rowcount'?: number | null | undefined;
@@ -113,7 +112,7 @@ declare const __propDef: {
113
112
  'aria-rowspan'?: number | null | undefined;
114
113
  'aria-selected'?: import("svelte/elements").Booleanish | null | undefined;
115
114
  'aria-setsize'?: number | null | undefined;
116
- 'aria-sort'?: "none" | "ascending" | "descending" | "other" | null | undefined;
115
+ 'aria-sort'?: "none" | "other" | "ascending" | "descending" | null | undefined;
117
116
  'aria-valuemax'?: number | null | undefined;
118
117
  'aria-valuemin'?: number | null | undefined;
119
118
  'aria-valuenow'?: number | null | undefined;
@@ -133,37 +132,37 @@ declare const __propDef: {
133
132
  'on:input'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
134
133
  'on:reset'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
135
134
  'on:submit'?: import("svelte/elements").EventHandler<SubmitEvent, HTMLButtonElement> | null | undefined;
136
- 'on:invalid'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
135
+ 'on:invalid'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
137
136
  'on:formdata'?: import("svelte/elements").EventHandler<FormDataEvent, HTMLButtonElement> | null | undefined;
138
- 'on:load'?: import("svelte/elements").EventHandler<Event<EventTarget>, Element> | null | undefined;
139
- 'on:error'?: import("svelte/elements").EventHandler<Event<EventTarget>, Element> | null | undefined;
140
- 'on:toggle'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
137
+ 'on:load'?: import("svelte/elements").EventHandler<Event, Element> | null | undefined;
138
+ 'on:error'?: import("svelte/elements").EventHandler<Event, Element> | null | undefined;
139
+ 'on:toggle'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
141
140
  'on:keydown'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
142
141
  'on:keypress'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
143
142
  'on:keyup'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
144
- 'on:abort'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
145
- 'on:canplay'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
146
- 'on:canplaythrough'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
147
- 'on:cuechange'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
148
- 'on:durationchange'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
149
- 'on:emptied'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
150
- 'on:encrypted'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
151
- 'on:ended'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
152
- 'on:loadeddata'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
153
- 'on:loadedmetadata'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
154
- 'on:loadstart'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
155
- 'on:pause'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
156
- 'on:play'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
157
- 'on:playing'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
158
- 'on:progress'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
159
- 'on:ratechange'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
160
- 'on:seeked'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
161
- 'on:seeking'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
162
- 'on:stalled'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
163
- 'on:suspend'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
164
- 'on:timeupdate'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
165
- 'on:volumechange'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
166
- 'on:waiting'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
143
+ 'on:abort'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
144
+ 'on:canplay'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
145
+ 'on:canplaythrough'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
146
+ 'on:cuechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
147
+ 'on:durationchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
148
+ 'on:emptied'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
149
+ 'on:encrypted'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
150
+ 'on:ended'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
151
+ 'on:loadeddata'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
152
+ 'on:loadedmetadata'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
153
+ 'on:loadstart'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
154
+ 'on:pause'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
155
+ 'on:play'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
156
+ 'on:playing'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
157
+ 'on:progress'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
158
+ 'on:ratechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
159
+ 'on:seeked'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
160
+ 'on:seeking'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
161
+ 'on:stalled'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
162
+ 'on:suspend'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
163
+ 'on:timeupdate'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
164
+ 'on:volumechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
165
+ 'on:waiting'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
167
166
  'on:auxclick'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
168
167
  'on:click'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
169
168
  'on:contextmenu'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
@@ -183,9 +182,9 @@ declare const __propDef: {
183
182
  'on:mouseout'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
184
183
  'on:mouseover'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
185
184
  'on:mouseup'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
186
- 'on:select'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
187
- 'on:selectionchange'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
188
- 'on:selectstart'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
185
+ 'on:select'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
186
+ 'on:selectionchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
187
+ 'on:selectstart'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
189
188
  'on:touchcancel'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
190
189
  'on:touchend'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
191
190
  'on:touchmove'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
@@ -216,19 +215,19 @@ declare const __propDef: {
216
215
  'on:introend'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
217
216
  'on:message'?: import("svelte/elements").MessageEventHandler<HTMLButtonElement> | null | undefined;
218
217
  'on:messageerror'?: import("svelte/elements").MessageEventHandler<HTMLButtonElement> | null | undefined;
219
- 'on:visibilitychange'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
220
- 'on:cancel'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
221
- 'on:close'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
222
- 'on:fullscreenchange'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
223
- 'on:fullscreenerror'?: import("svelte/elements").EventHandler<Event<EventTarget>, HTMLButtonElement> | null | undefined;
218
+ 'on:visibilitychange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
219
+ 'on:cancel'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
220
+ 'on:close'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
221
+ 'on:fullscreenchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
222
+ 'on:fullscreenerror'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
224
223
  mode: XRSessionMode;
225
- sessionInit?: XRSessionInit & {
224
+ sessionInit?: (XRSessionInit & {
226
225
  domOverlay?: {
227
226
  root: HTMLElement;
228
227
  } | undefined;
229
- };
230
- force?: 'enter' | 'exit';
231
- styled?: boolean;
228
+ }) | undefined;
229
+ force?: "enter" | "exit" | undefined;
230
+ styled?: boolean | undefined;
232
231
  };
233
232
  events: {
234
233
  click: CustomEvent<{
@@ -1,11 +1,10 @@
1
- /// <reference types="bun-types" />
2
1
  import { SvelteComponent } from "svelte";
3
2
  import { type ColorRepresentation } from 'three';
4
3
  declare const __propDef: {
5
4
  props: {
6
- color?: ColorRepresentation;
7
- size?: number;
8
- thickness?: number;
5
+ color?: ColorRepresentation | undefined;
6
+ size?: number | undefined;
7
+ thickness?: number | undefined;
9
8
  };
10
9
  events: {
11
10
  [evt: string]: CustomEvent<any>;
@@ -1,5 +1,5 @@
1
1
  <script>import { Group, Vector3, Matrix3 } from "three";
2
- import { T, useFrame } from "@threlte/core";
2
+ import { T, useTask } from "@threlte/core";
3
3
  import { pointerIntersection, pointerState } from "../../internal/stores";
4
4
  import Cursor from "./Cursor.svelte";
5
5
  export let handedness;
@@ -11,7 +11,7 @@ $:
11
11
  hovering = $pointerState[handedness].hovering;
12
12
  $:
13
13
  intersection = pointerIntersection[handedness];
14
- const { start, stop } = useFrame(
14
+ const { start, stop } = useTask(
15
15
  () => {
16
16
  if (intersection.current === void 0)
17
17
  return;
@@ -24,7 +24,7 @@ const { start, stop } = useFrame(
24
24
  }
25
25
  },
26
26
  {
27
- autostart: false
27
+ autoStart: false
28
28
  }
29
29
  );
30
30
  $:
@@ -1,4 +1,3 @@
1
- /// <reference types="bun-types" />
2
1
  import { SvelteComponent } from "svelte";
3
2
  declare const __propDef: {
4
3
  props: {
@@ -1,4 +1,3 @@
1
- /// <reference types="bun-types" />
2
1
  import { SvelteComponent } from "svelte";
3
2
  declare const __propDef: {
4
3
  props: Record<string, never>;
@@ -1,4 +1,3 @@
1
- /// <reference types="bun-types" />
2
1
  import { SvelteComponent } from "svelte";
3
2
  declare const __propDef: {
4
3
  props: {
@@ -1,6 +1,6 @@
1
1
  <script>import { spring } from "svelte/motion";
2
2
  import { Group, Matrix3, Vector3 } from "three";
3
- import { T, useFrame } from "@threlte/core";
3
+ import { T, useTask } from "@threlte/core";
4
4
  import { teleportIntersection } from "../../internal/stores";
5
5
  import Cursor from "./Cursor.svelte";
6
6
  export let handedness;
@@ -10,7 +10,7 @@ const normalMatrix = new Matrix3();
10
10
  const worldNormal = new Vector3();
11
11
  $:
12
12
  intersection = teleportIntersection[handedness];
13
- const { start, stop } = useFrame(
13
+ const { start, stop } = useTask(
14
14
  () => {
15
15
  if (intersection.current === void 0)
16
16
  return;
@@ -23,7 +23,7 @@ const { start, stop } = useFrame(
23
23
  }
24
24
  },
25
25
  {
26
- autostart: false
26
+ autoStart: false
27
27
  }
28
28
  );
29
29
  const size = spring(0.1, { stiffness: 0.2 });
@@ -1,4 +1,3 @@
1
- /// <reference types="bun-types" />
2
1
  import { SvelteComponent } from "svelte";
3
2
  declare const __propDef: {
4
3
  props: {
@@ -2,7 +2,7 @@
2
2
  import { Line2 } from "three/examples/jsm/lines/Line2";
3
3
  import { LineGeometry } from "three/examples/jsm/lines/LineGeometry";
4
4
  import { LineMaterial } from "three/examples/jsm/lines/LineMaterial";
5
- import { T, useFrame } from "@threlte/core";
5
+ import { T, useTask } from "@threlte/core";
6
6
  import { teleportIntersection } from "../../internal/stores";
7
7
  export let handedness;
8
8
  export let targetRay;
@@ -41,11 +41,11 @@ const setCurvePoints = (alpha = 0.3) => {
41
41
  }
42
42
  lineGeometry.setPositions(positions);
43
43
  };
44
- const { start, stop } = useFrame(
44
+ const { start, stop } = useTask(
45
45
  () => {
46
46
  setCurvePoints();
47
47
  },
48
- { autostart: false }
48
+ { autoStart: false }
49
49
  );
50
50
  $:
51
51
  if ($intersection === void 0) {
@@ -1,4 +1,3 @@
1
- /// <reference types="bun-types" />
2
1
  import { SvelteComponent } from "svelte";
3
2
  import { type XRTargetRaySpace } from 'three';
4
3
  declare const __propDef: {
@@ -1,12 +1,13 @@
1
- import { currentWritable, useFrame } from '@threlte/core';
1
+ import { currentWritable, useTask, useThrelte } from '@threlte/core';
2
2
  import { useHand } from './useHand';
3
3
  /**
4
4
  * Provides a reference to a requested hand joint, once available.
5
5
  */
6
6
  export const useHandJoint = (handedness, joint) => {
7
+ const { invalidate } = useThrelte();
7
8
  const jointSpaceStore = currentWritable(undefined);
8
9
  const xrhand = useHand(handedness);
9
- const { stop } = useFrame(({ invalidate }) => {
10
+ const { stop } = useTask(() => {
10
11
  const jointSpace = xrhand.current?.hand.joints[joint];
11
12
  // The joint radius is a good indicator that the joint is ready
12
13
  if (jointSpace?.jointRadius !== undefined) {
@@ -14,6 +15,6 @@ export const useHandJoint = (handedness, joint) => {
14
15
  invalidate();
15
16
  stop();
16
17
  }
17
- }, { invalidate: false });
18
+ }, { autoInvalidate: false });
18
19
  return jointSpaceStore;
19
20
  };
@@ -1,5 +1,5 @@
1
1
  import { Matrix4 } from 'three';
2
- import { useThrelte, useFrame, watch, currentWritable } from '@threlte/core';
2
+ import { useThrelte, useTask, watch, currentWritable } from '@threlte/core';
3
3
  import { useXR } from './useXR';
4
4
  import { useController } from './useController';
5
5
  /**
@@ -18,7 +18,7 @@ export const useHitTest = (hitTestCallback, options = {}) => {
18
18
  const { xr } = useThrelte().renderer;
19
19
  const xrState = useXR();
20
20
  const hitMatrix = new Matrix4();
21
- let hitTestSource = currentWritable(undefined);
21
+ const hitTestSource = currentWritable(undefined);
22
22
  if (source === 'viewer') {
23
23
  watch(xrState.session, async (session) => {
24
24
  if (session === undefined) {
@@ -49,7 +49,7 @@ export const useHitTest = (hitTestCallback, options = {}) => {
49
49
  hitTestSource.set(await session.requestHitTestSource?.({ space }));
50
50
  });
51
51
  }
52
- const { start, stop } = useFrame(() => {
52
+ const { start, stop } = useTask(() => {
53
53
  const referenceSpace = xr.getReferenceSpace();
54
54
  if (referenceSpace === null || hitTestSource.current === undefined) {
55
55
  return hitTestCallback(hitMatrix, undefined);
@@ -61,7 +61,7 @@ export const useHitTest = (hitTestCallback, options = {}) => {
61
61
  }
62
62
  hitMatrix.fromArray(pose.transform.matrix);
63
63
  hitTestCallback(hitMatrix, hit);
64
- }, { autostart: false });
64
+ }, { autoStart: false });
65
65
  watch([xrState.isPresenting, hitTestSource], ([isPresenting, testSource]) => {
66
66
  if (!isPresenting) {
67
67
  stop();
package/dist/index.d.ts CHANGED
@@ -17,4 +17,4 @@ export { useHeadset } from './hooks/useHeadset';
17
17
  export { useHitTest } from './hooks/useHitTest';
18
18
  export { useTeleport } from './hooks/useTeleport';
19
19
  export { useXR } from './hooks/useXR';
20
- export type { XRSessionEventType, XRControllerEventType, XRHandEventType, XRSessionEvent, XRControllerEvent, XRController, XRHand, XRHandEvent, } from './types';
20
+ export type { XRSessionEventType, XRControllerEventType, XRHandEventType, XRSessionEvent, XRControllerEvent, XRController, XRHand, XRHandEvent } from './types';
@@ -23,7 +23,7 @@ export const setupHands = () => {
23
23
  if (!hasHands())
24
24
  return;
25
25
  const handEvent = event;
26
- const handedness = ('handedness' in handEvent) ? handEvent.handedness : handEvent.data.handedness;
26
+ const handedness = 'handedness' in handEvent ? handEvent.handedness : handEvent.data.handedness;
27
27
  handDispatchers[handedness]?.current?.(event.type, event);
28
28
  };
29
29
  function handleConnected(event) {
@@ -1,11 +1,11 @@
1
1
  import { Group } from 'three';
2
- import { useThrelte, useFrame, watch } from '@threlte/core';
2
+ import { useThrelte, useTask, watch } from '@threlte/core';
3
3
  import { useXR } from '../hooks/useXR';
4
4
  export const headset = new Group();
5
5
  export const setupHeadset = () => {
6
6
  const { renderer, camera } = useThrelte();
7
7
  const { xr } = renderer;
8
- const immersiveFrame = useFrame(() => {
8
+ const immersiveFrame = useTask(() => {
9
9
  const space = xr.getReferenceSpace();
10
10
  if (space === null)
11
11
  return;
@@ -17,11 +17,11 @@ export const setupHeadset = () => {
17
17
  const { position, orientation } = pose.transform;
18
18
  headset.position.set(position.x, position.y, position.z);
19
19
  headset.quaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);
20
- }, { autostart: false, invalidate: false });
21
- const nonImmersiveFrame = useFrame(() => {
20
+ }, { autoStart: false, autoInvalidate: false });
21
+ const nonImmersiveFrame = useTask(() => {
22
22
  headset.position.copy(camera.current.position);
23
23
  headset.quaternion.copy(camera.current.quaternion);
24
- }, { autostart: false, invalidate: false });
24
+ }, { autoStart: false, autoInvalidate: false });
25
25
  watch(useXR().isPresenting, (isPresenting) => {
26
26
  if (isPresenting) {
27
27
  immersiveFrame.start();
@@ -1,11 +1,11 @@
1
- import { type ThrelteUseFrameOptions, type ThrelteContext } from '@threlte/core';
2
- type UseFixedOptions = ThrelteUseFrameOptions & {
1
+ import { type ThrelteUseTaskOptions } from '@threlte/core';
2
+ type UseFixedOptions = ThrelteUseTaskOptions & {
3
3
  fixedStep?: number;
4
4
  };
5
5
  /**
6
- * A fixed useFrame, based on https://github.com/threlte/threlte/pull/654
6
+ * A fixed useTask, based on https://github.com/threlte/threlte/pull/654
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/legacy/useFrame").ThrelteUseFrame;
10
+ export declare const useFixed: (fn: (delta: number) => void, options: UseFixedOptions) => import("@threlte/core").ThrelteUseTask;
11
11
  export {};
@@ -1,17 +1,17 @@
1
- import { useFrame } from '@threlte/core';
1
+ import { useTask } from '@threlte/core';
2
2
  /**
3
- * A fixed useFrame, based on https://github.com/threlte/threlte/pull/654
3
+ * A fixed useTask, based on https://github.com/threlte/threlte/pull/654
4
4
  *
5
5
  * @Todo Can be removed if this or a similar feature is merged.
6
6
  */
7
7
  export const useFixed = (fn, options) => {
8
8
  let fixedStepTimeAccumulator = 0;
9
9
  let fixedStep = options.fixedStep ?? 1 / 60;
10
- return useFrame((ctx, delta) => {
10
+ return useTask((delta) => {
11
11
  fixedStepTimeAccumulator += delta;
12
12
  while (fixedStepTimeAccumulator >= fixedStep) {
13
13
  fixedStepTimeAccumulator -= fixedStep;
14
- fn(ctx, fixedStep);
14
+ fn(fixedStep);
15
15
  }
16
16
  }, options);
17
17
  };
@@ -14,7 +14,7 @@ export const pointerControls = (handedness, options) => {
14
14
  interactiveObjects: [],
15
15
  raycaster: new Raycaster(),
16
16
  compute: options?.compute ?? defaultComputeFunction,
17
- filter: options?.filter,
17
+ filter: options?.filter
18
18
  });
19
19
  }
20
20
  const context = getControlsContext();
@@ -28,14 +28,14 @@ export const pointerControls = (handedness, options) => {
28
28
  lastEvent: undefined,
29
29
  initialClick: [0, 0, 0],
30
30
  initialHits: [],
31
- hovered: new Map(),
31
+ hovered: new Map()
32
32
  };
33
33
  setHandContext(handedness, ctx);
34
34
  setupPointerControls(context, ctx, options?.fixedStep);
35
35
  }
36
36
  const handContext = getHandContext(handedness);
37
37
  watch(handContext.enabled, (enabled) => {
38
- controlsCounter += (enabled ? 1 : -1);
38
+ controlsCounter += enabled ? 1 : -1;
39
39
  pointerState.update((value) => {
40
40
  value[handedness].enabled = controlsCounter > 0;
41
41
  return value;
@@ -49,6 +49,6 @@ export const pointerControls = (handedness, options) => {
49
49
  });
50
50
  return {
51
51
  enabled: handContext.enabled,
52
- hovered: handContext.hovered,
52
+ hovered: handContext.hovered
53
53
  };
54
54
  };
@@ -0,0 +1,62 @@
1
+ import type { Intersection as ThreeIntersection, Object3D, Vector3, Ray, Raycaster, Event } from 'three';
2
+ import type { CurrentWritable } from '@threlte/core';
3
+ import type { ComputeFunction } from './compute';
4
+ export type Properties<T> = Pick<T, {
5
+ [K in keyof T]: T[K] extends (_: any) => any ? never : K;
6
+ }[keyof T]>;
7
+ export interface Intersection extends ThreeIntersection {
8
+ /** The event source (the object which registered the handler) */
9
+ eventObject: Object3D;
10
+ }
11
+ export interface IntersectionEvent extends Intersection {
12
+ /** The event source (the object which registered the handler) */
13
+ eventObject: Object3D;
14
+ /** An array of intersections */
15
+ intersections: Intersection[];
16
+ /** Normalized event coordinates */
17
+ pointer: Vector3;
18
+ /** Delta between first click and this event */
19
+ delta: number;
20
+ /** The ray that pierced it */
21
+ ray: Ray;
22
+ /** stopPropagation will stop underlying handlers from firing */
23
+ stopPropagation: () => void;
24
+ /** The original host event */
25
+ nativeEvent: Event | undefined;
26
+ /** If the event was stopped by calling stopPropagation */
27
+ stopped: boolean;
28
+ }
29
+ export type FilterFunction = (items: Intersection[], state: ControlsContext, handState: HandContext) => Intersection[];
30
+ export type ControlsContext = {
31
+ interactiveObjects: Object3D[];
32
+ raycaster: Raycaster;
33
+ compute: ComputeFunction;
34
+ filter?: FilterFunction | undefined;
35
+ };
36
+ export type HandContext = {
37
+ hand: 'left' | 'right';
38
+ enabled: CurrentWritable<boolean>;
39
+ pointer: CurrentWritable<Vector3>;
40
+ pointerOverTarget: CurrentWritable<boolean>;
41
+ lastEvent: Event | undefined;
42
+ initialClick: [x: number, y: number, z: number];
43
+ initialHits: Object3D[];
44
+ hovered: Map<string, IntersectionEvent>;
45
+ };
46
+ export interface PointerCaptureTarget {
47
+ intersection: Intersection;
48
+ target: Element;
49
+ }
50
+ export type ThrelteXREvents = {
51
+ click: IntersectionEvent;
52
+ contextmenu: IntersectionEvent;
53
+ pointerup: IntersectionEvent;
54
+ pointerdown: IntersectionEvent;
55
+ pointerover: IntersectionEvent;
56
+ pointerout: IntersectionEvent;
57
+ pointerenter: IntersectionEvent;
58
+ pointerleave: IntersectionEvent;
59
+ pointermove: IntersectionEvent;
60
+ pointermissed: IntersectionEvent;
61
+ };
62
+ export declare const events: (keyof ThrelteXREvents)[];
package/package.json CHANGED
@@ -1,24 +1,28 @@
1
1
  {
2
2
  "name": "@threlte/xr",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
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
- "@sveltejs/kit": "^1.22.3",
9
- "@sveltejs/package": "^2.2.0",
8
+ "@sveltejs/kit": "^1.26.0",
9
+ "@sveltejs/package": "^2.2.2",
10
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
11
+ "@typescript-eslint/parser": "^6.8.0",
12
+ "eslint": "^8.51.0",
13
+ "eslint-plugin-svelte": "^2.34.0",
14
+ "svelte-check": "^3.5.2",
15
+ "typescript": "^5.2.2",
10
16
  "@types/three": "^0.158.3",
11
17
  "autoprefixer": "^10.4.14",
12
18
  "postcss": "^8.4.27",
13
19
  "publint": "^0.1.16",
14
20
  "svelte": "^4.1.1",
15
- "svelte-check": "^3.4.6",
16
21
  "three": "^0.158.0",
17
22
  "tslib": "^2.6.0",
18
- "typescript": "^5.1.6",
19
23
  "vite": "^4.4.6",
20
24
  "vite-plugin-mkcert": "^1.16.0",
21
- "@threlte/core": "7.0.0"
25
+ "@threlte/core": "7.0.4"
22
26
  },
23
27
  "peerDependencies": {
24
28
  "svelte": ">=4",