From efefdacd67590b632e20f9541b922726f0e93706 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 27 Apr 2026 19:33:58 +0200 Subject: [PATCH] Reset input and navigation state across runtime host and third-person controller upon pointer lock loss --- src/runtime-three/runtime-host.ts | 4 ++++ src/runtime-three/third-person-navigation-controller.ts | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/runtime-three/runtime-host.ts b/src/runtime-three/runtime-host.ts index 2108b924..25cfba85 100644 --- a/src/runtime-three/runtime-host.ts +++ b/src/runtime-three/runtime-host.ts @@ -977,6 +977,10 @@ export class RuntimeHost { if (previousPointerLocked && !nextPointerLocked) { this.lastPointerLockReleaseAt = performance.now(); + this.pressedKeys.clear(); + this.previousInteractInputActive = false; + this.previousClearTargetInputActive = false; + this.previousPauseInputActive = false; } this.currentPlayerControllerTelemetry = telemetry; diff --git a/src/runtime-three/third-person-navigation-controller.ts b/src/runtime-three/third-person-navigation-controller.ts index 2b4a3780..953dc766 100644 --- a/src/runtime-three/third-person-navigation-controller.ts +++ b/src/runtime-three/third-person-navigation-controller.ts @@ -786,8 +786,17 @@ export class ThirdPersonNavigationController implements NavigationController { return; } + const wasPointerLocked = this.pointerLocked; const pointerLocked = document.pointerLockElement === this.context.domElement; + + if (wasPointerLocked && !pointerLocked) { + this.pressedKeys.clear(); + this.jumpPressed = false; + this.jumpHoldRemainingMs = 0; + this.pointerLookInputPending = false; + } + this.pointerLocked = pointerLocked; this.dragging = false; this.context.setRuntimeMessage(