Skip to content

Commit b811d2d

Browse files
committed
chore(engine): improve wheel event delta
1 parent 559aeb1 commit b811d2d

File tree

2 files changed

+45
-8
lines changed

2 files changed

+45
-8
lines changed

packages/editors/model/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta charset="UTF-8">
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
77
<title>Model Editor</title>
8-
<link rel="stylesheet" href="./public/main.css">
8+
<link rel="stylesheet" href="./main.css">
99
</head>
1010

1111
<canvas tabindex="-1"></canvas>

packages/engine/src/controls/devices/Mouse.class.ts

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,37 @@ export interface MouseOptions {
5454
export class Mouse extends EventEmitter<
5555
MouseEvents
5656
> implements InputControl {
57+
/**
58+
* @see https://github.com/w3c/uievents/issues/181
59+
*/
60+
static getWheelDelta(
61+
event: WheelEvent
62+
): [number, number] {
63+
const isApple = /^Mac|iPhone|iPod|iPad/i.test(navigator.platform);
64+
65+
if (isApple) {
66+
// Note that deltaMode MUST be accessed BEFORE delta* in order to get
67+
// non-pixel values in Firefox.
68+
// See https://github.com/w3c/uievents/issues/181
69+
70+
switch (event.deltaMode) {
71+
case event.DOM_DELTA_LINE:
72+
case event.DOM_DELTA_PAGE:
73+
// Discard the delta value, just take the sign
74+
return [Math.sign(event.deltaX), Math.sign(-event.deltaY)];
75+
case event.DOM_DELTA_PIXEL:
76+
default:
77+
return [event.deltaX / 120, -event.deltaY / 120];
78+
}
79+
}
80+
else {
81+
return [
82+
-(event as any).wheelDeltaX / 120,
83+
(event as any).wheelDeltaY / 120
84+
];
85+
}
86+
}
87+
5788
#canvas: CanvasAdapter;
5889
#documentAdapter: DocumentAdapter;
5990

@@ -65,7 +96,7 @@ export class Mouse extends EventEmitter<
6596

6697
#delta = { x: 0, y: 0 };
6798
newDelta = { x: 0, y: 0 };
68-
#newScrollDelta: number;
99+
#scrollDelta = { x: 0, y: 0 };
69100

70101
#wasActive = false;
71102
#wantsPointerLock = false;
@@ -110,7 +141,8 @@ export class Mouse extends EventEmitter<
110141
}
111142

112143
reset() {
113-
this.#newScrollDelta = 0;
144+
this.#scrollDelta.x = 0;
145+
this.#scrollDelta.y = 0;
114146
for (let i = 0; i <= 6; i++) {
115147
this.buttons[i] = {
116148
isDown: false,
@@ -193,16 +225,19 @@ export class Mouse extends EventEmitter<
193225
update() {
194226
this.#wasActive = false;
195227

196-
const isScrollUp = this.#newScrollDelta > 0;
197-
const isScrollDown = this.#newScrollDelta < 0;
228+
const isScrollUp = this.#scrollDelta.y > 0;
229+
const isScrollDown = this.#scrollDelta.y < 0;
198230
this.buttonsDown[MouseEventButton.scrollUp] = isScrollUp;
199231
this.buttonsDown[MouseEventButton.scrollDown] = isScrollDown;
200232
if (isScrollDown || isScrollUp) {
201233
this.#wasActive = true;
202234
}
203235

204-
if (this.#newScrollDelta !== 0) {
205-
this.#newScrollDelta = 0;
236+
if (this.#scrollDelta.x !== 0) {
237+
this.#scrollDelta.x = 0;
238+
}
239+
if (this.#scrollDelta.y !== 0) {
240+
this.#scrollDelta.y = 0;
206241
}
207242

208243
if (this.#wantsPointerLock && this.#wasPointerLocked) {
@@ -296,7 +331,9 @@ export class Mouse extends EventEmitter<
296331

297332
private onMouseWheel = (event: WheelEvent) => {
298333
event.preventDefault();
299-
this.#newScrollDelta = ((event as any).wheelDelta > 0 || event.detail < 0) ? 1 : -1;
334+
const [deltaX, deltaY] = Mouse.getWheelDelta(event);
335+
336+
this.#scrollDelta = { x: deltaX, y: deltaY };
300337
this.emit("wheel", event);
301338

302339
return false;

0 commit comments

Comments
 (0)