Skip to content

Commit c0b5418

Browse files
committed
Calculate mouse movement delta depending on pointer lock
1 parent e2a6c1e commit c0b5418

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

src/events/mouse.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ import * as constants from '../core/constants';
1919
*
2020
* Note: `movedX` continues updating even when
2121
* <a href="#/p5/requestPointerLock">requestPointerLock()</a> is active.
22+
* But keep in mind that during an active pointer lock, mouseX and pmouseX
23+
* are not locked, so `movedX` is based on
24+
* <a href="https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX">the MouseEvent's movementX</a>
25+
* value. This value may behave different in different browsers when the user
26+
* is zoomed in or out.
2227
*
2328
* @property {Number} movedX
2429
* @readOnly
@@ -810,13 +815,31 @@ p5.prototype._updateNextMouseCoords = function(e) {
810815
e
811816
);
812817

813-
this._setProperty('movedX', e.movementX);
814-
this._setProperty('movedY', e.movementY);
818+
815819
this._setProperty('mouseX', mousePos.x);
816820
this._setProperty('mouseY', mousePos.y);
817821
this._setProperty('winMouseX', mousePos.winX);
818822
this._setProperty('winMouseY', mousePos.winY);
819823

824+
if (document.pointerLockElement === null) {
825+
// https://developer.mozilla.org/en-US/docs/Web/API/Document/pointerLockElement
826+
// "The pointerLockElement ... is null if lock is pending, pointer is unlocked,
827+
// or the target is in another document."
828+
// In this case, we use mouseX/Y and pmousX/Y to calculate the distance,
829+
// which allows movedX/Y to look consistent at different zoom levels acorss
830+
// browsers.
831+
const deltaX = this.mouseX - this.pmouseX;
832+
const deltaY = this.mouseY - this.pmouseY;
833+
this._setProperty('movedX', deltaX);
834+
this._setProperty('movedY', deltaY);
835+
}
836+
else {
837+
// Because mouseX/Y and pmouseX/Y are locked, the elements movementX/Y
838+
// is used for movedX/Y - this maz behave differently on different
839+
// browsers at different zoom levels.
840+
this._setProperty('movedX', e.movementX);
841+
this._setProperty('movedY', e.movementY);
842+
}
820843
}
821844

822845
if (!this._hasMouseInteracted) {

0 commit comments

Comments
 (0)