From eb7b27e05ba60e7981c8a1fee75d39c5229b802f Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 27 Apr 2026 18:21:18 +0200 Subject: [PATCH] Refactor pointer capture logic and remove third-person pointer lock target clearing --- src/app/App.tsx | 6 ++-- src/runtime-three/runtime-host.ts | 14 --------- tests/unit/runtime-host.test.ts | 52 ------------------------------- 3 files changed, 4 insertions(+), 68 deletions(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index f5c9712d..d6def651 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -4899,7 +4899,9 @@ export function App({ store, initialStatusMessage }: AppProps) { return; } - const pointerCaptured = firstPersonTelemetry?.pointerLocked === true; + const pointerCaptured = + activeNavigationMode === "firstPerson" && + firstPersonTelemetry?.pointerLocked === true; if (pointerCaptured) { return; @@ -4914,7 +4916,7 @@ export function App({ store, initialStatusMessage }: AppProps) { return () => { window.removeEventListener("keydown", handleWindowKeyDown); }; - }, [editorState.toolMode, firstPersonTelemetry]); + }, [activeNavigationMode, 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 f788ae62..6872891f 100644 --- a/src/runtime-three/runtime-host.ts +++ b/src/runtime-three/runtime-host.ts @@ -969,22 +969,8 @@ 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); } }; diff --git a/tests/unit/runtime-host.test.ts b/tests/unit/runtime-host.test.ts index 137712f0..8b9749bf 100644 --- a/tests/unit/runtime-host.test.ts +++ b/tests/unit/runtime-host.test.ts @@ -3889,58 +3889,6 @@ describe("RuntimeHost", () => { host.dispose(); }); - it("clears the active target when third-person pointer lock drops on Escape", () => { - const host = new RuntimeHost({ - enableRendering: false - }); - const hostInternals = host as unknown as { - runtimeScene: unknown; - activeController: unknown; - thirdPersonController: unknown; - activeRuntimeTargetReference: { - kind: "npc" | "interactable"; - entityId: string; - } | null; - controllerContext: { - setPlayerControllerTelemetry(telemetry: unknown): void; - }; - }; - - hostInternals.runtimeScene = { - playerInputBindings: { - keyboard: { - clearTarget: "Escape" - } - }, - entities: { - cameraRigs: [], - interactables: [], - npcs: [] - } - } as never; - hostInternals.activeController = hostInternals.thirdPersonController; - hostInternals.activeRuntimeTargetReference = { - kind: "npc", - entityId: "npc-active" - }; - - hostInternals.controllerContext.setPlayerControllerTelemetry({ - pointerLocked: true, - hooks: { - audio: null - } - }); - hostInternals.controllerContext.setPlayerControllerTelemetry({ - pointerLocked: false, - hooks: { - audio: null - } - }); - - expect(hostInternals.activeRuntimeTargetReference).toBeNull(); - host.dispose(); - }); - it("switches an active target once from directional screen-space look input", () => { const host = new RuntimeHost({ enableRendering: false