From 2252a1dc4f995e026c094fd3ca65c3a59a51a60a Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 27 Apr 2026 18:20:14 +0200 Subject: [PATCH] Improve pointer lock release handling in runtime host and simplify pointer capture logic --- src/app/App.tsx | 6 ++---- src/runtime-three/runtime-host.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index d6def651..f5c9712d 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -4899,9 +4899,7 @@ export function App({ store, initialStatusMessage }: AppProps) { return; } - const pointerCaptured = - activeNavigationMode === "firstPerson" && - firstPersonTelemetry?.pointerLocked === true; + const pointerCaptured = firstPersonTelemetry?.pointerLocked === true; if (pointerCaptured) { return; @@ -4916,7 +4914,7 @@ export function App({ store, initialStatusMessage }: AppProps) { return () => { window.removeEventListener("keydown", handleWindowKeyDown); }; - }, [activeNavigationMode, editorState.toolMode, firstPersonTelemetry]); + }, [editorState.toolMode, firstPersonTelemetry]); const applyProjectName = () => { const normalizedName = projectNameDraft.trim() || DEFAULT_PROJECT_NAME; diff --git a/src/runtime-three/runtime-host.ts b/src/runtime-three/runtime-host.ts index 6872891f..f788ae62 100644 --- a/src/runtime-three/runtime-host.ts +++ b/src/runtime-three/runtime-host.ts @@ -969,8 +969,22 @@ export class RuntimeHost { this.runtimeMessageHandler?.(message); }, setPlayerControllerTelemetry: (telemetry) => { + const pointerLockReleasedFromThirdPerson = + this.currentPlayerControllerTelemetry?.pointerLocked === true && + telemetry !== null && + telemetry.pointerLocked === false && + this.activeController === this.thirdPersonController && + this.activeRuntimeTargetReference !== null && + this.resolveRuntimePlayerInputBindings().keyboard.clearTarget === + "Escape"; + this.currentPlayerControllerTelemetry = telemetry; this.currentPlayerAudioHooks = telemetry?.hooks.audio ?? null; + + if (pointerLockReleasedFromThirdPerson) { + this.clearActiveRuntimeTarget(); + } + this.playerControllerTelemetryHandler?.(telemetry); } };