Skip to content

Commit 700ba5b

Browse files
committed
feat: added custom wrapper for manual calcuation of movementX and movementY in inputs (#8057)
1 parent dafcc8c commit 700ba5b

File tree

5 files changed

+71
-4
lines changed

5 files changed

+71
-4
lines changed

src/extras/input/sources/dual-gesture-source.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DOUBLE_TAP_THRESHOLD, DOUBLE_TAP_VARIANCE } from '../constants.js';
22
import { InputSource } from '../input.js';
3+
import { movementState } from '../utils.js';
34
import { VirtualJoystick } from './virtual-joystick.js';
45

56
/**
@@ -29,6 +30,12 @@ const endsWith = (str, suffix) => str.indexOf(suffix, str.length - suffix.length
2930
* @augments {InputSource<DualGestureSourceDeltas>}
3031
*/
3132
class DualGestureSource extends InputSource {
33+
/**
34+
* @type {ReturnType<typeof movementState>}
35+
* @private
36+
*/
37+
_movementState = movementState();
38+
3239
/**
3340
* @type {`${'joystick' | 'touch'}-${'joystick' | 'touch'}`}
3441
* @private
@@ -116,6 +123,7 @@ class DualGestureSource extends InputSource {
116123
*/
117124
_onPointerDown(event) {
118125
const { pointerType, pointerId, clientX, clientY } = event;
126+
this._movementState.down(event);
119127

120128
if (pointerType !== 'touch') {
121129
return;
@@ -151,7 +159,8 @@ class DualGestureSource extends InputSource {
151159
* @private
152160
*/
153161
_onPointerMove(event) {
154-
const { pointerType, pointerId, target, clientX, clientY, movementX, movementY } = event;
162+
const { pointerType, pointerId, target, clientX, clientY } = event;
163+
const [movementX, movementY] = this._movementState.move(event);
155164

156165
if (pointerType !== 'touch') {
157166
return;
@@ -188,6 +197,7 @@ class DualGestureSource extends InputSource {
188197
*/
189198
_onPointerUp(event) {
190199
const { pointerType, pointerId } = event;
200+
this._movementState.up(event);
191201

192202
if (pointerType !== 'touch') {
193203
return;

src/extras/input/sources/keyboard-mouse-source.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { InputSource } from '../input.js';
2+
import { movementState } from '../utils.js';
23

34
const PASSIVE = /** @type {AddEventListenerOptions & EventListenerOptions} */ ({ passive: false });
45
const KEY_CODES = /** @type {const} */ ({
@@ -64,6 +65,12 @@ const array = Array(KEY_COUNT).fill(0);
6465
* @augments {InputSource<KeyboardMouseSourceDeltas>}
6566
*/
6667
class KeyboardMouseSource extends InputSource {
68+
/**
69+
* @type {ReturnType<typeof movementState>}
70+
* @private
71+
*/
72+
_movementState = movementState();
73+
6774
/**
6875
* The key codes for the keyboard keys.
6976
*
@@ -170,6 +177,8 @@ class KeyboardMouseSource extends InputSource {
170177
* @private
171178
*/
172179
_onPointerDown(event) {
180+
this._movementState.down(event);
181+
173182
if (event.pointerType !== 'mouse') {
174183
return;
175184
}
@@ -196,6 +205,8 @@ class KeyboardMouseSource extends InputSource {
196205
* @private
197206
*/
198207
_onPointerMove(event) {
208+
const [movementX, movementY] = this._movementState.move(event);
209+
199210
if (event.pointerType !== 'mouse') {
200211
return;
201212
}
@@ -211,14 +222,17 @@ class KeyboardMouseSource extends InputSource {
211222
return;
212223
}
213224
}
214-
this.deltas.mouse.append([event.movementX, event.movementY]);
225+
226+
this.deltas.mouse.append([movementX, movementY]);
215227
}
216228

217229
/**
218230
* @param {PointerEvent} event - The pointer event.
219231
* @private
220232
*/
221233
_onPointerUp(event) {
234+
this._movementState.up(event);
235+
222236
if (event.pointerType !== 'mouse') {
223237
return;
224238
}

src/extras/input/sources/multi-touch-source.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Vec2 } from '../../../core/math/vec2.js';
22
import { InputSource } from '../input.js';
3+
import { movementState } from '../utils.js';
34

45
const tmpVa = new Vec2();
56

@@ -16,6 +17,12 @@ const tmpVa = new Vec2();
1617
* @augments {InputSource<MultiTouchSourceDeltas>}
1718
*/
1819
class MultiTouchSource extends InputSource {
20+
/**
21+
* @type {ReturnType<typeof movementState>}
22+
* @private
23+
*/
24+
_movementState = movementState();
25+
1926
/**
2027
* @type {Map<number, PointerEvent>}
2128
* @private
@@ -53,6 +60,7 @@ class MultiTouchSource extends InputSource {
5360
*/
5461
_onPointerDown(event) {
5562
const { pointerId, pointerType } = event;
63+
this._movementState.down(event);
5664

5765
if (pointerType !== 'touch') {
5866
return;
@@ -76,7 +84,8 @@ class MultiTouchSource extends InputSource {
7684
* @private
7785
*/
7886
_onPointerMove(event) {
79-
const { pointerType, target, pointerId, movementX, movementY } = event;
87+
const { pointerType, target, pointerId } = event;
88+
const [movementX, movementY] = this._movementState.move(event);
8089

8190
if (pointerType !== 'touch') {
8291
return;
@@ -112,6 +121,7 @@ class MultiTouchSource extends InputSource {
112121
*/
113122
_onPointerUp(event) {
114123
const { pointerType, pointerId } = event;
124+
this._movementState.up(event);
115125

116126
if (pointerType !== 'touch') {
117127
return;

src/extras/input/sources/single-gesture-source.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DOUBLE_TAP_THRESHOLD, DOUBLE_TAP_VARIANCE } from '../constants.js';
22
import { InputSource } from '../input.js';
3+
import { movementState } from '../utils.js';
34
import { VirtualJoystick } from './virtual-joystick.js';
45

56
/**
@@ -14,6 +15,12 @@ import { VirtualJoystick } from './virtual-joystick.js';
1415
* @augments {InputSource<SingleGestureSourceDeltas>}
1516
*/
1617
class SingleGestureSource extends InputSource {
18+
/**
19+
* @type {ReturnType<typeof movementState>}
20+
* @private
21+
*/
22+
_movementState = movementState();
23+
1724
/**
1825
* @type {'joystick' | 'touch'}
1926
* @private
@@ -88,6 +95,7 @@ class SingleGestureSource extends InputSource {
8895
*/
8996
_onPointerDown(event) {
9097
const { pointerType, pointerId, clientX, clientY } = event;
98+
this._movementState.down(event);
9199

92100
if (pointerType !== 'touch') {
93101
return;
@@ -118,7 +126,8 @@ class SingleGestureSource extends InputSource {
118126
* @private
119127
*/
120128
_onPointerMove(event) {
121-
const { pointerType, pointerId, target, clientX, clientY, movementX, movementY } = event;
129+
const { pointerType, pointerId, target, clientX, clientY } = event;
130+
const [movementX, movementY] = this._movementState.move(event);
122131

123132
if (pointerType !== 'touch') {
124133
return;
@@ -146,6 +155,7 @@ class SingleGestureSource extends InputSource {
146155
*/
147156
_onPointerUp(event) {
148157
const { pointerType, pointerId } = event;
158+
this._movementState.up(event);
149159

150160
if (pointerType !== 'touch') {
151161
return;

src/extras/input/utils.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX
2+
export const movementState = () => {
3+
const state = new Map();
4+
return {
5+
down: (/** @type {PointerEvent} */ event) => {
6+
state.set(event.pointerId, [event.screenX, event.screenY]);
7+
},
8+
move: (/** @type {PointerEvent} */ event) => {
9+
if (!state.has(event.pointerId)) {
10+
return [0, 0];
11+
}
12+
const prev = state.get(event.pointerId);
13+
const mvX = event.screenX - prev[0];
14+
const mvY = event.screenY - prev[1];
15+
prev[0] = event.screenX;
16+
prev[1] = event.screenY;
17+
return [mvX, mvY];
18+
},
19+
up: (/** @type {PointerEvent} */ event) => {
20+
state.delete(event.pointerId);
21+
}
22+
};
23+
};

0 commit comments

Comments
 (0)