Update #46 - Fix pointer lock issue (sorta)

This commit is contained in:
lax1dude
2024-12-24 18:13:15 -08:00
parent 346047cf24
commit 3288d05a9a
19 changed files with 102 additions and 27 deletions

View File

@ -80,6 +80,7 @@ async function initPlatformInput(inputImports) {
var pointerLockSupported = false;
var pointerLockFlag = false;
var pointerLockWaiting = false;
var mouseUngrabTimer = 0;
var mouseGrabTimer = 0;
var mouseUngrabTimeout = -1;
@ -116,6 +117,7 @@ async function initPlatformInput(inputImports) {
focus: null,
blur: null,
pointerlock: null,
pointerlockerr: null,
fullscreenChange: null
};
@ -412,6 +414,10 @@ async function initPlatformInput(inputImports) {
}
pointerLockFlag = grab;
}, 60);
pointerLockWaiting = false;
}));
document.addEventListener("pointerlockerror", /** @type {function(Event)} */ (currentEventListeners.pointerlockerr = function(evt) {
pointerLockWaiting = false;
}));
}else {
eagError("Pointer lock is not supported on this browser");
@ -646,6 +652,7 @@ async function initPlatformInput(inputImports) {
const t = performance.now() | 0;
mouseGrabTimer = t;
if(grab) {
pointerLockWaiting = true;
try {
canvasElement.requestPointerLock();
}catch(ex) {
@ -663,9 +670,11 @@ async function initPlatformInput(inputImports) {
}else {
if(mouseUngrabTimeout !== -1) window.clearTimeout(mouseUngrabTimeout);
mouseUngrabTimeout = -1;
try {
document.exitPointerLock();
}catch(ex) {
if(!pointerLockWaiting) {
try {
document.exitPointerLock();
}catch(ex) {
}
}
}
};
@ -690,7 +699,7 @@ async function initPlatformInput(inputImports) {
* @return {boolean}
*/
inputImports["isPointerLocked"] = function() {
return pointerLockSupported && document.pointerLockElement === canvasElement;
return pointerLockSupported && (pointerLockWaiting || document.pointerLockElement === canvasElement);
};
/**
@ -1124,6 +1133,10 @@ async function initPlatformInput(inputImports) {
document.removeEventListener("pointerlockchange", /** @type {function(Event)} */ (currentEventListeners.pointerlock));
currentEventListeners.pointerlock = null;
}
if(currentEventListeners.pointerlockerr) {
document.removeEventListener("pointerlockerror", /** @type {function(Event)} */ (currentEventListeners.pointerlockerr));
currentEventListeners.pointerlockerr = null;
}
if(currentEventListeners.fullscreenChange) {
fullscreenQuery.removeEventListener("change", /** @type {function(Event)} */ (currentEventListeners.fullscreenChange));
currentEventListeners.fullscreenChange = null;