From bd9b321b723bc2aebe56a3dc620dbdd99f1275c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Mata?= Date: Tue, 21 Jan 2025 22:34:39 -0600 Subject: [PATCH 1/3] Restore original camera FOV after XR presentation ends --- src/renderers/WebGLRenderer.js | 10 ++++++++++ src/renderers/webxr/WebXRManager.js | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 99f00248376f53..957ccb30bb2cf8 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1151,6 +1151,16 @@ class WebGLRenderer { if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld(); + // Restore original camera fov + + if ( xr.enabled === true && xr.isPresenting === false && camera.userData.previousFov !== undefined ) { + + camera.fov = camera.userData.previousFov; + delete camera.userData.previousFov; + camera.updateProjectionMatrix(); + + } + // update camera matrices and frustum if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index 064b2384b04923..b386d4b3cb3086 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -633,6 +633,12 @@ class WebXRManager extends EventDispatcher { if ( camera.isPerspectiveCamera ) { + if ( camera.userData.previousFov === undefined ) { + + camera.userData.previousFov = camera.fov; + + } + camera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] ); camera.zoom = 1; From bc7c13bf3865ace0ada4bcd8e53c718567de2f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Mata?= Date: Thu, 23 Jan 2025 09:44:09 -0600 Subject: [PATCH 2/3] Adds new logic to restore camera fov and zoom in WebXRManager WebGLRender has been restored, now it is not involved at all. --- src/renderers/WebGLRenderer.js | 10 ---------- src/renderers/webxr/WebXRManager.js | 23 +++++++++++++++++++++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 957ccb30bb2cf8..99f00248376f53 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1151,16 +1151,6 @@ class WebGLRenderer { if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld(); - // Restore original camera fov - - if ( xr.enabled === true && xr.isPresenting === false && camera.userData.previousFov !== undefined ) { - - camera.fov = camera.userData.previousFov; - delete camera.userData.previousFov; - camera.updateProjectionMatrix(); - - } - // update camera matrices and frustum if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index b386d4b3cb3086..2130374fa84a1a 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -65,6 +65,8 @@ class WebXRManager extends EventDispatcher { // + let updatedCameraProperties = null; + this.cameraAutoUpdate = true; this.enabled = false; @@ -182,6 +184,17 @@ class WebXRManager extends EventDispatcher { scope.isPresenting = false; + if ( updatedCameraProperties !== null ) { + + const camera = updatedCameraProperties.camera; + camera.fov = updatedCameraProperties.fov; + camera.zoom = updatedCameraProperties.zoom; + camera.updateProjectionMatrix(); + + updatedCameraProperties = null; + + } + renderer.setPixelRatio( currentPixelRatio ); renderer.setSize( currentSize.width, currentSize.height, false ); @@ -363,6 +376,8 @@ class WebXRManager extends EventDispatcher { scope.isPresenting = true; + updatedCameraProperties = null; + scope.dispatchEvent( { type: 'sessionstart' } ); } @@ -633,9 +648,13 @@ class WebXRManager extends EventDispatcher { if ( camera.isPerspectiveCamera ) { - if ( camera.userData.previousFov === undefined ) { + if ( updatedCameraProperties === null ) { - camera.userData.previousFov = camera.fov; + updatedCameraProperties = { + camera: camera, + fov: camera.fov, + zoom: camera.zoom, + }; } From e55b2b941bdfb898aff896736e9fdf27e9f5471f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Mata?= Date: Mon, 3 Feb 2025 10:02:43 -0600 Subject: [PATCH 3/3] Updates code to use a weak map --- src/renderers/webxr/WebXRManager.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index 2130374fa84a1a..e17518d30ce89c 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -65,7 +65,7 @@ class WebXRManager extends EventDispatcher { // - let updatedCameraProperties = null; + const updatedCameraProperties = new WeakMap(); this.cameraAutoUpdate = true; this.enabled = false; @@ -184,14 +184,16 @@ class WebXRManager extends EventDispatcher { scope.isPresenting = false; - if ( updatedCameraProperties !== null ) { + if ( updatedCameraProperties.has( scope.getCamera() ) ) { - const camera = updatedCameraProperties.camera; - camera.fov = updatedCameraProperties.fov; - camera.zoom = updatedCameraProperties.zoom; - camera.updateProjectionMatrix(); + const cameraAndProperties = updatedCameraProperties.get( scope.getCamera() ); - updatedCameraProperties = null; + const userCamera = cameraAndProperties.userCamera; + userCamera.fov = cameraAndProperties.fov; + userCamera.zoom = cameraAndProperties.zoom; + userCamera.updateProjectionMatrix(); + + updatedCameraProperties.delete( scope.getCamera() ); } @@ -376,7 +378,7 @@ class WebXRManager extends EventDispatcher { scope.isPresenting = true; - updatedCameraProperties = null; + updatedCameraProperties.delete( scope.getCamera() ); scope.dispatchEvent( { type: 'sessionstart' } ); @@ -648,13 +650,13 @@ class WebXRManager extends EventDispatcher { if ( camera.isPerspectiveCamera ) { - if ( updatedCameraProperties === null ) { + if ( ! updatedCameraProperties.has( scope.getCamera() ) ) { - updatedCameraProperties = { - camera: camera, + updatedCameraProperties.set( scope.getCamera(), { + userCamera: camera, fov: camera.fov, zoom: camera.zoom, - }; + } ); }