@solidrt/3d 0.0.66 → 0.0.67

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidrt/3d",
3
- "version": "0.0.66",
3
+ "version": "0.0.67",
4
4
  "license": "MIT",
5
5
  "funding": "https://github.com/sponsors/wellawaretech",
6
6
  "author": "Antoine van Wel",
@@ -20,10 +20,10 @@
20
20
  "AGENTS.md"
21
21
  ],
22
22
  "devDependencies": {
23
- "@solidrt/test": "0.0.66"
23
+ "@solidrt/test": "0.0.67"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "@solidjs/signals": "2.0.0-rc.13",
27
- "@solidrt/core": "0.0.66"
27
+ "@solidrt/core": "0.0.67"
28
28
  }
29
29
  }
@@ -50,6 +50,9 @@ export type BubblingPointerEventProps = {
50
50
  onPointerDown?: (event: NodePointerEvent) => void
51
51
  onPointerMove?: (event: NodePointerEvent) => void
52
52
  onPointerUp?: (event: NodePointerEvent) => void
53
+ /** The pointer's other end: the system took it away (see core's
54
+ * onPointerCancel); bubbles like up, and the press it ends never taps. */
55
+ onPointerCancel?: (event: NodePointerEvent) => void
53
56
  /** The wheel over the node: `deltaX`/`deltaY`. */
54
57
  onWheel?: (event: NodeWheelEvent) => void
55
58
  /** A press released on the node within the slop, alone for its whole
@@ -73,18 +76,20 @@ export function syncNode(node: SceneNode, props: TransformProps & PointerEventPr
73
76
  props.onPointerDown,
74
77
  props.onPointerMove,
75
78
  props.onPointerUp,
79
+ props.onPointerCancel,
76
80
  props.onPointerEnter,
77
81
  props.onPointerLeave,
78
82
  props.onWheel,
79
83
  props.onTap,
80
84
  props.onTransitionEnd,
81
85
  ] as const,
82
- ([position, rotation, quaternion, scale, visible, down, move, up, enter, leave, wheel, tap, end]) => {
86
+ ([position, rotation, quaternion, scale, visible, down, move, up, cancel, enter, leave, wheel, tap, end]) => {
83
87
  setTransform(node, { position, rotation, quaternion, scale })
84
88
  setVisible(node, visible !== false)
85
89
  node.onPointerDown = down
86
90
  node.onPointerMove = move
87
91
  node.onPointerUp = up
92
+ node.onPointerCancel = cancel
88
93
  node.onPointerEnter = enter
89
94
  node.onPointerLeave = leave
90
95
  node.onWheel = wheel
@@ -18,6 +18,7 @@ export type ScenePointerProps = {
18
18
  onPointerDown?: (event: ScenePointerEvent) => void
19
19
  onPointerMove?: (event: ScenePointerEvent) => void
20
20
  onPointerUp?: (event: ScenePointerEvent) => void
21
+ onPointerCancel?: (event: ScenePointerEvent) => void
21
22
  onWheel?: (event: SceneWheelEvent) => void
22
23
  onTap?: (event: SceneTapEvent) => void
23
24
  }
@@ -268,6 +269,7 @@ export let Scene: ParentComponent<SceneProps> = props => {
268
269
  onPointerDown: e => props.onPointerDown?.(e),
269
270
  onPointerMove: e => props.onPointerMove?.(e),
270
271
  onPointerUp: e => props.onPointerUp?.(e),
272
+ onPointerCancel: e => props.onPointerCancel?.(e),
271
273
  onWheel: e => props.onWheel?.(e),
272
274
  onTap: e => props.onTap?.(e),
273
275
  }),
@@ -331,6 +333,7 @@ export let Scene: ParentComponent<SceneProps> = props => {
331
333
  onPointerDown={events ? sceneHandlers.onPointerDown : undefined}
332
334
  onPointerMove={events ? sceneHandlers.onPointerMove : undefined}
333
335
  onPointerUp={events ? sceneHandlers.onPointerUp : undefined}
336
+ onPointerCancel={events ? sceneHandlers.onPointerCancel : undefined}
334
337
  onPointerLeave={events ? sceneHandlers.onPointerLeave : undefined}
335
338
  onWheel={events ? sceneHandlers.onWheel : undefined}
336
339
  />
@@ -129,6 +129,7 @@ export let View3d: ParentComponent<View3dProps> = props => {
129
129
  onPointerDown: e => props.onPointerDown?.(e),
130
130
  onPointerMove: e => props.onPointerMove?.(e),
131
131
  onPointerUp: e => props.onPointerUp?.(e),
132
+ onPointerCancel: e => props.onPointerCancel?.(e),
132
133
  onWheel: e => props.onWheel?.(e),
133
134
  onTap: e => props.onTap?.(e),
134
135
  }),
@@ -159,6 +160,7 @@ export let View3d: ParentComponent<View3dProps> = props => {
159
160
  onPointerDown={events ? view.handlers.onPointerDown : undefined}
160
161
  onPointerMove={events ? view.handlers.onPointerMove : undefined}
161
162
  onPointerUp={events ? view.handlers.onPointerUp : undefined}
163
+ onPointerCancel={events ? view.handlers.onPointerCancel : undefined}
162
164
  onPointerLeave={events ? view.handlers.onPointerLeave : undefined}
163
165
  onWheel={events ? view.handlers.onWheel : undefined}
164
166
  />
package/src/node.ts CHANGED
@@ -203,6 +203,7 @@ export type SceneNode = {
203
203
  onPointerDown?: (event: NodePointerEvent) => void
204
204
  onPointerMove?: (event: NodePointerEvent) => void
205
205
  onPointerUp?: (event: NodePointerEvent) => void
206
+ onPointerCancel?: (event: NodePointerEvent) => void
206
207
  onPointerEnter?: (event: NodePointerEvent) => void
207
208
  onPointerLeave?: (event: NodePointerEvent) => void
208
209
  /** The wheel over the node (NodeWheelEvent: `deltaX`/`deltaY`), bubbling
@@ -352,6 +353,7 @@ export type ScenePointerListener = {
352
353
  onPointerDown?: (event: ScenePointerEvent) => void
353
354
  onPointerMove?: (event: ScenePointerEvent) => void
354
355
  onPointerUp?: (event: ScenePointerEvent) => void
356
+ onPointerCancel?: (event: ScenePointerEvent) => void
355
357
  onWheel?: (event: SceneWheelEvent) => void
356
358
  onTap?: (event: SceneTapEvent) => void
357
359
  }
@@ -41,7 +41,7 @@ const TAP_INTERVAL_MS = 300
41
41
  // neighbouring meshes.
42
42
  const TAP_REPEAT_SLOP = 20
43
43
 
44
- type HandlerName = "onPointerDown" | "onPointerMove" | "onPointerUp" | "onWheel" | "onTap"
44
+ type HandlerName = "onPointerDown" | "onPointerMove" | "onPointerUp" | "onPointerCancel" | "onWheel" | "onTap"
45
45
 
46
46
  // What a press captures, a hover tracks and a tap compares: the struck
47
47
  // mesh, and the instance when the mesh is instanced.
@@ -254,6 +254,18 @@ export function makePointerInput(deps: PointerInputDeps): PointerInput {
254
254
  tap.tapCount = count
255
255
  walk("onTap", tap, !press.claimed)
256
256
  },
257
+ onPointerCancel(e) {
258
+ let [x, y] = toScene(e)
259
+ let press = presses.get(e.pointerId)
260
+ if (!press) {
261
+ let hit = nearest(x, y)
262
+ walk("onPointerCancel", makeEvent(e, hit === null ? null : targetOf(hit), x, y, hit), true)
263
+ return
264
+ }
265
+ // The press ends where it was: the walk it captured, never a tap.
266
+ presses.delete(e.pointerId)
267
+ walk("onPointerCancel", makeEvent(e, press.target, x, y, hitOn(press.target, x, y)), !press.claimed)
268
+ },
257
269
  onWheel(e) {
258
270
  let [x, y] = toScene(e)
259
271
  let hit = nearest(x, y)
@@ -290,6 +302,7 @@ export function feedPointer(root: { listen(listener: ScenePointerListener): () =
290
302
  onPointerDown: e => feed.handlers.onPointerDown(e.native),
291
303
  onPointerMove: e => feed.handlers.onPointerMove(e.native),
292
304
  onPointerUp: e => feed.handlers.onPointerUp(e.native),
305
+ onPointerCancel: e => feed.handlers.onPointerCancel(e.native),
293
306
  onWheel: e => feed.handlers.onWheel(e.native),
294
307
  })
295
308
  }
package/src/scene.ts CHANGED
@@ -227,6 +227,7 @@ export type SceneHandlers = {
227
227
  onPointerDown(event: ElementPointerEvent): void
228
228
  onPointerMove(event: ElementPointerEvent): void
229
229
  onPointerUp(event: ElementPointerEvent): void
230
+ onPointerCancel(event: ElementPointerEvent): void
230
231
  onPointerLeave(event: ElementPointerEvent): void
231
232
  onWheel(event: ElementWheelEvent): void
232
233
  }