@@ -54,6 +54,37 @@ export interface MouseOptions {
5454export 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 = / ^ M a c | i P h o n e | i P o d | i P a d / 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