1 |
- {"ast":null,"code":"import _asyncToGenerator from \"F:/workspace/202226701027/huinongbao-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { Logger } from \"../Misc/logger.js\";\nimport { Observable } from \"../Misc/observable.js\";\nimport { WebXRManagedOutputCanvas, WebXRManagedOutputCanvasOptions } from \"./webXRManagedOutputCanvas.js\";\nimport { NativeXRLayerWrapper, NativeXRRenderTarget } from \"./native/nativeXRRenderTarget.js\";\nimport { WebXRWebGLLayerWrapper } from \"./webXRWebGLLayer.js\";\n/**\n * Manages an XRSession to work with Babylon's engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRSessionManagers\n */\nexport class WebXRSessionManager {\n /**\n * Scale factor to apply to all XR-related elements (camera, controllers)\n */\n get worldScalingFactor() {\n return this._worldScalingFactor;\n }\n set worldScalingFactor(value) {\n const oldValue = this._worldScalingFactor;\n this._worldScalingFactor = value;\n this.onWorldScaleFactorChangedObservable.notifyObservers({\n previousScaleFactor: oldValue,\n newScaleFactor: value\n });\n }\n /**\n * Constructs a WebXRSessionManager, this must be initialized within a user action before usage\n * @param scene The scene which the session should be created for\n */\n constructor( /** The scene which the session should be created for */\n scene) {\n this.scene = scene;\n /** WebXR timestamp updated every frame */\n this.currentTimestamp = -1;\n /**\n * Used just in case of a failure to initialize an immersive session.\n * The viewer reference space is compensated using this height, creating a kind of \"viewer-floor\" reference space\n */\n this.defaultHeightCompensation = 1.7;\n /**\n * Fires every time a new xrFrame arrives which can be used to update the camera\n */\n this.onXRFrameObservable = new Observable();\n /**\n * Fires when the reference space changed\n */\n this.onXRReferenceSpaceChanged = new Observable();\n /**\n * Fires when the xr session is ended either by the device or manually done\n */\n this.onXRSessionEnded = new Observable();\n /**\n * Fires when the xr session is initialized: right after requestSession was called and returned with a successful result\n */\n this.onXRSessionInit = new Observable();\n /**\n * Fires when the xr reference space has been initialized\n */\n this.onXRReferenceSpaceInitialized = new Observable();\n /**\n * Fires when the session manager is rendering the first frame\n */\n this.onXRReady = new Observable();\n /**\n * Are we currently in the XR loop?\n */\n this.inXRFrameLoop = false;\n /**\n * Are we in an XR session?\n */\n this.inXRSession = false;\n this._worldScalingFactor = 1;\n /**\n * Observable raised when the world scale has changed\n */\n this.onWorldScaleFactorChangedObservable = new Observable(undefined, true);\n this._engine = scene.getEngine();\n this._onEngineDisposedObserver = this._engine.onDisposeObservable.addOnce(() => {\n this._engine = null;\n });\n scene.onDisposeObservable.addOnce(() => {\n this.dispose();\n });\n }\n /**\n * The current reference space used in this session. This reference space can constantly change!\n * It is mainly used to offset the camera's position.\n */\n get referenceSpace() {\n return this._referenceSpace;\n }\n /**\n * Set a new reference space and triggers the observable\n */\n set referenceSpace(newReferenceSpace) {\n this._referenceSpace = newReferenceSpace;\n this.onXRReferenceSpaceChanged.notifyObservers(this._referenceSpace);\n }\n /**\n * The mode for the managed XR session\n */\n get sessionMode() {\n return this._sessionMode;\n }\n /**\n * Disposes of the session manager\n * This should be called explicitly by the dev, if required.\n */\n dispose() {\n var _this$_engine;\n // disposing without leaving XR? Exit XR first\n if (this.inXRSession) {\n this.exitXRAsync();\n }\n this.onXRReady.clear();\n this.onXRFrameObservable.clear();\n this.onXRSessionEnded.clear();\n this.onXRReferenceSpaceChanged.clear();\n this.onXRSessionInit.clear();\n this.onWorldScaleFactorChangedObservable.clear();\n (_this$_engine = this._engine) === null || _this$_engine === void 0 || _this$_engine.onDisposeObservable.remove(this._onEngineDisposedObserver);\n this._engine = null;\n }\n /**\n * Stops the xrSession and restores the render loop\n * @returns Promise which resolves after it exits XR\n */\n exitXRAsync() {\n var _this = this;\n return _asyncToGenerator(function* () {\n if (_this.session && _this.inXRSession) {\n _this.inXRSession = false;\n try {\n return yield _this.session.end();\n } catch {\n Logger.Warn(\"Could not end XR session.\");\n }\n }\n return Promise.resolve();\n })();\n }\n /**\n * Attempts to set the framebuffer-size-normalized viewport to be rendered this frame for this view.\n * In the event of a failure, the supplied viewport is not updated.\n * @param viewport the viewport to which the view will be rendered\n * @param view the view for which to set the viewport\n * @returns whether the operation was successful\n */\n trySetViewportForView(viewport, view) {\n var _this$_baseLayerRTTPr;\n return ((_this$_baseLayerRTTPr = this._baseLayerRTTProvider) === null || _this$_baseLayerRTTPr === void 0 ? void 0 : _this$_baseLayerRTTPr.trySetViewportForView(viewport, view)) || false;\n }\n /**\n * Gets the correct render target texture to be rendered this frame for this eye\n * @param eye the eye for which to get the render target\n * @returns the render target for the specified eye or null if not available\n */\n getRenderTargetTextureForEye(eye) {\n var _this$_baseLayerRTTPr2;\n return ((_this$_baseLayerRTTPr2 = this._baseLayerRTTProvider) === null || _this$_baseLayerRTTPr2 === void 0 ? void 0 : _this$_baseLayerRTTPr2.getRenderTargetTextureForEye(eye)) || null;\n }\n /**\n * Gets the correct render target texture to be rendered this frame for this view\n * @param view the view for which to get the render target\n * @returns the render target for the specified view or null if not available\n */\n getRenderTargetTextureForView(view) {\n var _this$_baseLayerRTTPr3;\n return ((_this$_baseLayerRTTPr3 = this._baseLayerRTTProvider) === null || _this$_baseLayerRTTPr3 === void 0 ? void 0 : _this$_baseLayerRTTPr3.getRenderTargetTextureForView(view)) || null;\n }\n /**\n * Creates a WebXRRenderTarget object for the XR session\n * @param options optional options to provide when creating a new render target\n * @returns a WebXR render target to which the session can render\n */\n getWebXRRenderTarget(options) {\n const engine = this.scene.getEngine();\n if (this._xrNavigator.xr.native) {\n return new NativeXRRenderTarget(this);\n } else {\n options = options || WebXRManagedOutputCanvasOptions.GetDefaults(engine);\n options.canvasElement = options.canvasElement || engine.getRenderingCanvas() || undefined;\n return new WebXRManagedOutputCanvas(this, options);\n }\n }\n /**\n * Initializes the manager\n * After initialization enterXR can be called to start an XR session\n * @returns Promise which resolves after it is initialized\n */\n initializeAsync() {\n // Check if the browser supports webXR\n this._xrNavigator = navigator;\n if (!this._xrNavigator.xr) {\n return Promise.reject(\"WebXR not available\");\n }\n return Promise.resolve();\n }\n /**\n * Initializes an xr session\n * @param xrSessionMode mode to initialize\n * @param xrSessionInit defines optional and required values to pass to the session builder\n * @returns a promise which will resolve once the session has been initialized\n */\n initializeSessionAsync(xrSessionMode = \"immersive-vr\", xrSessionInit = {}) {\n return this._xrNavigator.xr.requestSession(xrSessionMode, xrSessionInit).then(session => {\n this.session = session;\n this._sessionMode = xrSessionMode;\n this.inXRSession = true;\n this.onXRSessionInit.notifyObservers(session);\n // handle when the session is ended (By calling session.end or device ends its own session eg. pressing home button on phone)\n this.session.addEventListener(\"end\", () => {\n this.inXRSession = false;\n // Notify frame observers\n this.onXRSessionEnded.notifyObservers(null);\n if (this._engine) {\n // make sure dimensions object is restored\n this._engine.framebufferDimensionsObject = null;\n // Restore frame buffer to avoid clear on xr framebuffer after session end\n this._engine.restoreDefaultFramebuffer();\n // Need to restart render loop as after the session is ended the last request for new frame will never call callback\n this._engine.customAnimationFrameRequester = null;\n this._engine._renderLoop();\n }\n // Dispose render target textures.\n // Only dispose on native because we can't destroy opaque textures on browser.\n if (this.isNative) {\n var _this$_baseLayerRTTPr4;\n (_this$_baseLayerRTTPr4 = this._baseLayerRTTProvider) === null || _this$_baseLayerRTTPr4 === void 0 || _this$_baseLayerRTTPr4.dispose();\n }\n this._baseLayerRTTProvider = null;\n this._baseLayerWrapper = null;\n }, {\n once: true\n });\n return this.session;\n });\n }\n /**\n * Checks if a session would be supported for the creation options specified\n * @param sessionMode session mode to check if supported eg. immersive-vr\n * @returns A Promise that resolves to true if supported and false if not\n */\n isSessionSupportedAsync(sessionMode) {\n return WebXRSessionManager.IsSessionSupportedAsync(sessionMode);\n }\n /**\n * Resets the reference space to the one started the session\n */\n resetReferenceSpace() {\n this.referenceSpace = this.baseReferenceSpace;\n }\n /**\n * Starts rendering to the xr layer\n */\n runXRRenderLoop() {\n var _this$_baseLayerRTTPr6;\n if (!this.inXRSession || !this._engine) {\n return;\n }\n // Tell the engine's render loop to be driven by the xr session's refresh rate and provide xr pose information\n this._engine.customAnimationFrameRequester = {\n requestAnimationFrame: callback => this.session.requestAnimationFrame(callback),\n renderFunction: (timestamp, xrFrame) => {\n if (!this.inXRSession || !this._engine) {\n return;\n }\n // Store the XR frame and timestamp in the session manager\n this.currentFrame = xrFrame;\n this.currentTimestamp = timestamp;\n if (xrFrame) {\n var _this$_baseLayerRTTPr5;\n this.inXRFrameLoop = true;\n const framebufferDimensionsObject = ((_this$_baseLayerRTTPr5 = this._baseLayerRTTProvider) === null || _this$_baseLayerRTTPr5 === void 0 ? void 0 : _this$_baseLayerRTTPr5.getFramebufferDimensions()) || null;\n // equality can be tested as it should be the same object\n if (this._engine.framebufferDimensionsObject !== framebufferDimensionsObject) {\n this._engine.framebufferDimensionsObject = framebufferDimensionsObject;\n }\n this.onXRFrameObservable.notifyObservers(xrFrame);\n this._engine._renderLoop();\n this._engine.framebufferDimensionsObject = null;\n this.inXRFrameLoop = false;\n }\n }\n };\n this._engine.framebufferDimensionsObject = ((_this$_baseLayerRTTPr6 = this._baseLayerRTTProvider) === null || _this$_baseLayerRTTPr6 === void 0 ? void 0 : _this$_baseLayerRTTPr6.getFramebufferDimensions()) || null;\n this.onXRFrameObservable.addOnce(() => {\n this.onXRReady.notifyObservers(this);\n });\n // Stop window's animation frame and trigger sessions animation frame\n if (typeof window !== \"undefined\" && window.cancelAnimationFrame) {\n window.cancelAnimationFrame(this._engine._frameHandler);\n }\n this._engine._renderLoop();\n }\n /**\n * Sets the reference space on the xr session\n * @param referenceSpaceType space to set\n * @returns a promise that will resolve once the reference space has been set\n */\n setReferenceSpaceTypeAsync(referenceSpaceType = \"local-floor\") {\n return this.session.requestReferenceSpace(referenceSpaceType).then(referenceSpace => {\n return referenceSpace;\n }, rejectionReason => {\n Logger.Error(\"XR.requestReferenceSpace failed for the following reason: \");\n Logger.Error(rejectionReason);\n Logger.Log('Defaulting to universally-supported \"viewer\" reference space type.');\n return this.session.requestReferenceSpace(\"viewer\").then(referenceSpace => {\n const heightCompensation = new XRRigidTransform({\n x: 0,\n y: -this.defaultHeightCompensation,\n z: 0\n });\n return referenceSpace.getOffsetReferenceSpace(heightCompensation);\n }, rejectionReason => {\n Logger.Error(rejectionReason);\n // eslint-disable-next-line no-throw-literal\n throw 'XR initialization failed: required \"viewer\" reference space type not supported.';\n });\n }).then(referenceSpace => {\n // create viewer reference space before setting the first reference space\n return this.session.requestReferenceSpace(\"viewer\").then(viewerReferenceSpace => {\n this.viewerReferenceSpace = viewerReferenceSpace;\n return referenceSpace;\n });\n }).then(referenceSpace => {\n // initialize the base and offset (currently the same)\n this.referenceSpace = this.baseReferenceSpace = referenceSpace;\n this.onXRReferenceSpaceInitialized.notifyObservers(referenceSpace);\n return this.referenceSpace;\n });\n }\n /**\n * Updates the render state of the session.\n * Note that this is deprecated in favor of WebXRSessionManager.updateRenderState().\n * @param state state to set\n * @returns a promise that resolves once the render state has been updated\n * @deprecated Use updateRenderState() instead.\n */\n updateRenderStateAsync(state) {\n return Promise.resolve(this.session.updateRenderState(state));\n }\n /**\n * @internal\n */\n _setBaseLayerWrapper(baseLayerWrapper) {\n var _this$_baseLayerWrapp;\n if (this.isNative) {\n var _this$_baseLayerRTTPr7;\n (_this$_baseLayerRTTPr7 = this._baseLayerRTTProvider) === null || _this$_baseLayerRTTPr7 === void 0 || _this$_baseLayerRTTPr7.dispose();\n }\n this._baseLayerWrapper = baseLayerWrapper;\n this._baseLayerRTTProvider = ((_this$_baseLayerWrapp = this._baseLayerWrapper) === null || _this$_baseLayerWrapp === void 0 ? void 0 : _this$_baseLayerWrapp.createRenderTargetTextureProvider(this)) || null;\n }\n /**\n * @internal\n */\n _getBaseLayerWrapper() {\n return this._baseLayerWrapper;\n }\n /**\n * Updates the render state of the session\n * @param state state to set\n */\n updateRenderState(state) {\n if (state.baseLayer) {\n this._setBaseLayerWrapper(this.isNative ? new NativeXRLayerWrapper(state.baseLayer) : new WebXRWebGLLayerWrapper(state.baseLayer));\n }\n this.session.updateRenderState(state);\n }\n /**\n * Returns a promise that resolves with a boolean indicating if the provided session mode is supported by this browser\n * @param sessionMode defines the session to test\n * @returns a promise with boolean as final value\n */\n static IsSessionSupportedAsync(sessionMode) {\n if (!navigator.xr) {\n return Promise.resolve(false);\n }\n // When the specs are final, remove supportsSession!\n const functionToUse = navigator.xr.isSessionSupported || navigator.xr.supportsSession;\n if (!functionToUse) {\n return Promise.resolve(false);\n } else {\n return functionToUse.call(navigator.xr, sessionMode).then(result => {\n const returnValue = typeof result === \"undefined\" ? true : result;\n return Promise.resolve(returnValue);\n }).catch(e => {\n Logger.Warn(e);\n return Promise.resolve(false);\n });\n }\n }\n /**\n * Returns true if Babylon.js is using the BabylonNative backend, otherwise false\n */\n get isNative() {\n var _this$_xrNavigator$xr;\n return (_this$_xrNavigator$xr = this._xrNavigator.xr.native) !== null && _this$_xrNavigator$xr !== void 0 ? _this$_xrNavigator$xr : false;\n }\n /**\n * The current frame rate as reported by the device\n */\n get currentFrameRate() {\n var _this$session;\n return (_this$session = this.session) === null || _this$session === void 0 ? void 0 : _this$session.frameRate;\n }\n /**\n * A list of supported frame rates (only available in-session!\n */\n get supportedFrameRates() {\n var _this$session2;\n return (_this$session2 = this.session) === null || _this$session2 === void 0 ? void 0 : _this$session2.supportedFrameRates;\n }\n /**\n * Set the framerate of the session.\n * @param rate the new framerate. This value needs to be in the supportedFrameRates array\n * @returns a promise that resolves once the framerate has been set\n */\n updateTargetFrameRate(rate) {\n return this.session.updateTargetFrameRate(rate);\n }\n /**\n * Run a callback in the xr render loop\n * @param callback the callback to call when in XR Frame\n * @param ignoreIfNotInSession if no session is currently running, run it first thing on the next session\n */\n runInXRFrame(callback, ignoreIfNotInSession = true) {\n if (this.inXRFrameLoop) {\n callback();\n } else if (this.inXRSession || !ignoreIfNotInSession) {\n this.onXRFrameObservable.addOnce(callback);\n }\n }\n /**\n * Check if fixed foveation is supported on this device\n */\n get isFixedFoveationSupported() {\n var _this$_baseLayerWrapp2;\n return ((_this$_baseLayerWrapp2 = this._baseLayerWrapper) === null || _this$_baseLayerWrapp2 === void 0 ? void 0 : _this$_baseLayerWrapp2.isFixedFoveationSupported) || false;\n }\n /**\n * Get the fixed foveation currently set, as specified by the webxr specs\n * If this returns null, then fixed foveation is not supported\n */\n get fixedFoveation() {\n var _this$_baseLayerWrapp3;\n return ((_this$_baseLayerWrapp3 = this._baseLayerWrapper) === null || _this$_baseLayerWrapp3 === void 0 ? void 0 : _this$_baseLayerWrapp3.fixedFoveation) || null;\n }\n /**\n * Set the fixed foveation to the specified value, as specified by the webxr specs\n * This value will be normalized to be between 0 and 1, 1 being max foveation, 0 being no foveation\n */\n set fixedFoveation(value) {\n const val = Math.max(0, Math.min(1, value || 0));\n if (this._baseLayerWrapper) {\n this._baseLayerWrapper.fixedFoveation = val;\n }\n }\n /**\n * Get the features enabled on the current session\n * This is only available in-session!\n * @see https://www.w3.org/TR/webxr/#dom-xrsession-enabledfeatures\n */\n get enabledFeatures() {\n var _this$session$enabled, _this$session3;\n return (_this$session$enabled = (_this$session3 = this.session) === null || _this$session3 === void 0 ? void 0 : _this$session3.enabledFeatures) !== null && _this$session$enabled !== void 0 ? _this$session$enabled : null;\n }\n}","map":{"version":3,"names":["Logger","Observable","WebXRManagedOutputCanvas","WebXRManagedOutputCanvasOptions","NativeXRLayerWrapper","NativeXRRenderTarget","WebXRWebGLLayerWrapper","WebXRSessionManager","worldScalingFactor","_worldScalingFactor","value","oldValue","onWorldScaleFactorChangedObservable","notifyObservers","previousScaleFactor","newScaleFactor","constructor","scene","currentTimestamp","defaultHeightCompensation","onXRFrameObservable","onXRReferenceSpaceChanged","onXRSessionEnded","onXRSessionInit","onXRReferenceSpaceInitialized","onXRReady","inXRFrameLoop","inXRSession","undefined","_engine","getEngine","_onEngineDisposedObserver","onDisposeObservable","addOnce","dispose","referenceSpace","_referenceSpace","newReferenceSpace","sessionMode","_sessionMode","_this$_engine","exitXRAsync","clear","remove","_this","_asyncToGenerator","session","end","Warn","Promise","resolve","trySetViewportForView","viewport","view","_this$_baseLayerRTTPr","_baseLayerRTTProvider","getRenderTargetTextureForEye","eye","_this$_baseLayerRTTPr2","getRenderTargetTextureForView","_this$_baseLayerRTTPr3","getWebXRRenderTarget","options","engine","_xrNavigator","xr","native","GetDefaults","canvasElement","getRenderingCanvas","initializeAsync","navigator","reject","initializeSessionAsync","xrSessionMode","xrSessionInit","requestSession","then","addEventListener","framebufferDimensionsObject","restoreDefaultFramebuffer","customAnimationFrameRequester","_renderLoop","isNative","_this$_baseLayerRTTPr4","_baseLayerWrapper","once","isSessionSupportedAsync","IsSessionSupportedAsync","resetReferenceSpace","baseReferenceSpace","runXRRenderLoop","_this$_baseLayerRTTPr6","requestAnimationFrame","callback","renderFunction","timestamp","xrFrame","currentFrame","_this$_baseLayerRTTPr5","getFramebufferDimensions","window","cancelAnimationFrame","_frameHandler","setReferenceSpaceTypeAsync","referenceSpaceType","requestReferenceSpace","rejectionReason","Error","Log","heightCompensation","XRRigidTransform","x","y","z","getOffsetReferenceSpace","viewerReferenceSpace","updateRenderStateAsync","state","updateRenderState","_setBaseLayerWrapper","baseLayerWrapper","_this$_baseLayerWrapp","_this$_baseLayerRTTPr7","createRenderTargetTextureProvider","_getBaseLayerWrapper","baseLayer","functionToUse","isSessionSupported","supportsSession","call","result","returnValue","catch","e","_this$_xrNavigator$xr","currentFrameRate","_this$session","frameRate","supportedFrameRates","_this$session2","updateTargetFrameRate","rate","runInXRFrame","ignoreIfNotInSession","isFixedFoveationSupported","_this$_baseLayerWrapp2","fixedFoveation","_this$_baseLayerWrapp3","val","Math","max","min","enabledFeatures","_this$session$enabled","_this$session3"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/XR/webXRSessionManager.js"],"sourcesContent":["import { Logger } from \"../Misc/logger.js\";\nimport { Observable } from \"../Misc/observable.js\";\nimport { WebXRManagedOutputCanvas, WebXRManagedOutputCanvasOptions } from \"./webXRManagedOutputCanvas.js\";\nimport { NativeXRLayerWrapper, NativeXRRenderTarget } from \"./native/nativeXRRenderTarget.js\";\nimport { WebXRWebGLLayerWrapper } from \"./webXRWebGLLayer.js\";\n/**\n * Manages an XRSession to work with Babylon's engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRSessionManagers\n */\nexport class WebXRSessionManager {\n /**\n * Scale factor to apply to all XR-related elements (camera, controllers)\n */\n get worldScalingFactor() {\n return this._worldScalingFactor;\n }\n set worldScalingFactor(value) {\n const oldValue = this._worldScalingFactor;\n this._worldScalingFactor = value;\n this.onWorldScaleFactorChangedObservable.notifyObservers({\n previousScaleFactor: oldValue,\n newScaleFactor: value,\n });\n }\n /**\n * Constructs a WebXRSessionManager, this must be initialized within a user action before usage\n * @param scene The scene which the session should be created for\n */\n constructor(\n /** The scene which the session should be created for */\n scene) {\n this.scene = scene;\n /** WebXR timestamp updated every frame */\n this.currentTimestamp = -1;\n /**\n * Used just in case of a failure to initialize an immersive session.\n * The viewer reference space is compensated using this height, creating a kind of \"viewer-floor\" reference space\n */\n this.defaultHeightCompensation = 1.7;\n /**\n * Fires every time a new xrFrame arrives which can be used to update the camera\n */\n this.onXRFrameObservable = new Observable();\n /**\n * Fires when the reference space changed\n */\n this.onXRReferenceSpaceChanged = new Observable();\n /**\n * Fires when the xr session is ended either by the device or manually done\n */\n this.onXRSessionEnded = new Observable();\n /**\n * Fires when the xr session is initialized: right after requestSession was called and returned with a successful result\n */\n this.onXRSessionInit = new Observable();\n /**\n * Fires when the xr reference space has been initialized\n */\n this.onXRReferenceSpaceInitialized = new Observable();\n /**\n * Fires when the session manager is rendering the first frame\n */\n this.onXRReady = new Observable();\n /**\n * Are we currently in the XR loop?\n */\n this.inXRFrameLoop = false;\n /**\n * Are we in an XR session?\n */\n this.inXRSession = false;\n this._worldScalingFactor = 1;\n /**\n * Observable raised when the world scale has changed\n */\n this.onWorldScaleFactorChangedObservable = new Observable(undefined, true);\n this._engine = scene.getEngine();\n this._onEngineDisposedObserver = this._engine.onDisposeObservable.addOnce(() => {\n this._engine = null;\n });\n scene.onDisposeObservable.addOnce(() => {\n this.dispose();\n });\n }\n /**\n * The current reference space used in this session. This reference space can constantly change!\n * It is mainly used to offset the camera's position.\n */\n get referenceSpace() {\n return this._referenceSpace;\n }\n /**\n * Set a new reference space and triggers the observable\n */\n set referenceSpace(newReferenceSpace) {\n this._referenceSpace = newReferenceSpace;\n this.onXRReferenceSpaceChanged.notifyObservers(this._referenceSpace);\n }\n /**\n * The mode for the managed XR session\n */\n get sessionMode() {\n return this._sessionMode;\n }\n /**\n * Disposes of the session manager\n * This should be called explicitly by the dev, if required.\n */\n dispose() {\n // disposing without leaving XR? Exit XR first\n if (this.inXRSession) {\n this.exitXRAsync();\n }\n this.onXRReady.clear();\n this.onXRFrameObservable.clear();\n this.onXRSessionEnded.clear();\n this.onXRReferenceSpaceChanged.clear();\n this.onXRSessionInit.clear();\n this.onWorldScaleFactorChangedObservable.clear();\n this._engine?.onDisposeObservable.remove(this._onEngineDisposedObserver);\n this._engine = null;\n }\n /**\n * Stops the xrSession and restores the render loop\n * @returns Promise which resolves after it exits XR\n */\n async exitXRAsync() {\n if (this.session && this.inXRSession) {\n this.inXRSession = false;\n try {\n return await this.session.end();\n }\n catch {\n Logger.Warn(\"Could not end XR session.\");\n }\n }\n return Promise.resolve();\n }\n /**\n * Attempts to set the framebuffer-size-normalized viewport to be rendered this frame for this view.\n * In the event of a failure, the supplied viewport is not updated.\n * @param viewport the viewport to which the view will be rendered\n * @param view the view for which to set the viewport\n * @returns whether the operation was successful\n */\n trySetViewportForView(viewport, view) {\n return this._baseLayerRTTProvider?.trySetViewportForView(viewport, view) || false;\n }\n /**\n * Gets the correct render target texture to be rendered this frame for this eye\n * @param eye the eye for which to get the render target\n * @returns the render target for the specified eye or null if not available\n */\n getRenderTargetTextureForEye(eye) {\n return this._baseLayerRTTProvider?.getRenderTargetTextureForEye(eye) || null;\n }\n /**\n * Gets the correct render target texture to be rendered this frame for this view\n * @param view the view for which to get the render target\n * @returns the render target for the specified view or null if not available\n */\n getRenderTargetTextureForView(view) {\n return this._baseLayerRTTProvider?.getRenderTargetTextureForView(view) || null;\n }\n /**\n * Creates a WebXRRenderTarget object for the XR session\n * @param options optional options to provide when creating a new render target\n * @returns a WebXR render target to which the session can render\n */\n getWebXRRenderTarget(options) {\n const engine = this.scene.getEngine();\n if (this._xrNavigator.xr.native) {\n return new NativeXRRenderTarget(this);\n }\n else {\n options = options || WebXRManagedOutputCanvasOptions.GetDefaults(engine);\n options.canvasElement = options.canvasElement || engine.getRenderingCanvas() || undefined;\n return new WebXRManagedOutputCanvas(this, options);\n }\n }\n /**\n * Initializes the manager\n * After initialization enterXR can be called to start an XR session\n * @returns Promise which resolves after it is initialized\n */\n initializeAsync() {\n // Check if the browser supports webXR\n this._xrNavigator = navigator;\n if (!this._xrNavigator.xr) {\n return Promise.reject(\"WebXR not available\");\n }\n return Promise.resolve();\n }\n /**\n * Initializes an xr session\n * @param xrSessionMode mode to initialize\n * @param xrSessionInit defines optional and required values to pass to the session builder\n * @returns a promise which will resolve once the session has been initialized\n */\n initializeSessionAsync(xrSessionMode = \"immersive-vr\", xrSessionInit = {}) {\n return this._xrNavigator.xr.requestSession(xrSessionMode, xrSessionInit).then((session) => {\n this.session = session;\n this._sessionMode = xrSessionMode;\n this.inXRSession = true;\n this.onXRSessionInit.notifyObservers(session);\n // handle when the session is ended (By calling session.end or device ends its own session eg. pressing home button on phone)\n this.session.addEventListener(\"end\", () => {\n this.inXRSession = false;\n // Notify frame observers\n this.onXRSessionEnded.notifyObservers(null);\n if (this._engine) {\n // make sure dimensions object is restored\n this._engine.framebufferDimensionsObject = null;\n // Restore frame buffer to avoid clear on xr framebuffer after session end\n this._engine.restoreDefaultFramebuffer();\n // Need to restart render loop as after the session is ended the last request for new frame will never call callback\n this._engine.customAnimationFrameRequester = null;\n this._engine._renderLoop();\n }\n // Dispose render target textures.\n // Only dispose on native because we can't destroy opaque textures on browser.\n if (this.isNative) {\n this._baseLayerRTTProvider?.dispose();\n }\n this._baseLayerRTTProvider = null;\n this._baseLayerWrapper = null;\n }, { once: true });\n return this.session;\n });\n }\n /**\n * Checks if a session would be supported for the creation options specified\n * @param sessionMode session mode to check if supported eg. immersive-vr\n * @returns A Promise that resolves to true if supported and false if not\n */\n isSessionSupportedAsync(sessionMode) {\n return WebXRSessionManager.IsSessionSupportedAsync(sessionMode);\n }\n /**\n * Resets the reference space to the one started the session\n */\n resetReferenceSpace() {\n this.referenceSpace = this.baseReferenceSpace;\n }\n /**\n * Starts rendering to the xr layer\n */\n runXRRenderLoop() {\n if (!this.inXRSession || !this._engine) {\n return;\n }\n // Tell the engine's render loop to be driven by the xr session's refresh rate and provide xr pose information\n this._engine.customAnimationFrameRequester = {\n requestAnimationFrame: (callback) => this.session.requestAnimationFrame(callback),\n renderFunction: (timestamp, xrFrame) => {\n if (!this.inXRSession || !this._engine) {\n return;\n }\n // Store the XR frame and timestamp in the session manager\n this.currentFrame = xrFrame;\n this.currentTimestamp = timestamp;\n if (xrFrame) {\n this.inXRFrameLoop = true;\n const framebufferDimensionsObject = this._baseLayerRTTProvider?.getFramebufferDimensions() || null;\n // equality can be tested as it should be the same object\n if (this._engine.framebufferDimensionsObject !== framebufferDimensionsObject) {\n this._engine.framebufferDimensionsObject = framebufferDimensionsObject;\n }\n this.onXRFrameObservable.notifyObservers(xrFrame);\n this._engine._renderLoop();\n this._engine.framebufferDimensionsObject = null;\n this.inXRFrameLoop = false;\n }\n },\n };\n this._engine.framebufferDimensionsObject = this._baseLayerRTTProvider?.getFramebufferDimensions() || null;\n this.onXRFrameObservable.addOnce(() => {\n this.onXRReady.notifyObservers(this);\n });\n // Stop window's animation frame and trigger sessions animation frame\n if (typeof window !== \"undefined\" && window.cancelAnimationFrame) {\n window.cancelAnimationFrame(this._engine._frameHandler);\n }\n this._engine._renderLoop();\n }\n /**\n * Sets the reference space on the xr session\n * @param referenceSpaceType space to set\n * @returns a promise that will resolve once the reference space has been set\n */\n setReferenceSpaceTypeAsync(referenceSpaceType = \"local-floor\") {\n return this.session\n .requestReferenceSpace(referenceSpaceType)\n .then((referenceSpace) => {\n return referenceSpace;\n }, (rejectionReason) => {\n Logger.Error(\"XR.requestReferenceSpace failed for the following reason: \");\n Logger.Error(rejectionReason);\n Logger.Log('Defaulting to universally-supported \"viewer\" reference space type.');\n return this.session.requestReferenceSpace(\"viewer\").then((referenceSpace) => {\n const heightCompensation = new XRRigidTransform({ x: 0, y: -this.defaultHeightCompensation, z: 0 });\n return referenceSpace.getOffsetReferenceSpace(heightCompensation);\n }, (rejectionReason) => {\n Logger.Error(rejectionReason);\n // eslint-disable-next-line no-throw-literal\n throw 'XR initialization failed: required \"viewer\" reference space type not supported.';\n });\n })\n .then((referenceSpace) => {\n // create viewer reference space before setting the first reference space\n return this.session.requestReferenceSpace(\"viewer\").then((viewerReferenceSpace) => {\n this.viewerReferenceSpace = viewerReferenceSpace;\n return referenceSpace;\n });\n })\n .then((referenceSpace) => {\n // initialize the base and offset (currently the same)\n this.referenceSpace = this.baseReferenceSpace = referenceSpace;\n this.onXRReferenceSpaceInitialized.notifyObservers(referenceSpace);\n return this.referenceSpace;\n });\n }\n /**\n * Updates the render state of the session.\n * Note that this is deprecated in favor of WebXRSessionManager.updateRenderState().\n * @param state state to set\n * @returns a promise that resolves once the render state has been updated\n * @deprecated Use updateRenderState() instead.\n */\n updateRenderStateAsync(state) {\n return Promise.resolve(this.session.updateRenderState(state));\n }\n /**\n * @internal\n */\n _setBaseLayerWrapper(baseLayerWrapper) {\n if (this.isNative) {\n this._baseLayerRTTProvider?.dispose();\n }\n this._baseLayerWrapper = baseLayerWrapper;\n this._baseLayerRTTProvider = this._baseLayerWrapper?.createRenderTargetTextureProvider(this) || null;\n }\n /**\n * @internal\n */\n _getBaseLayerWrapper() {\n return this._baseLayerWrapper;\n }\n /**\n * Updates the render state of the session\n * @param state state to set\n */\n updateRenderState(state) {\n if (state.baseLayer) {\n this._setBaseLayerWrapper(this.isNative ? new NativeXRLayerWrapper(state.baseLayer) : new WebXRWebGLLayerWrapper(state.baseLayer));\n }\n this.session.updateRenderState(state);\n }\n /**\n * Returns a promise that resolves with a boolean indicating if the provided session mode is supported by this browser\n * @param sessionMode defines the session to test\n * @returns a promise with boolean as final value\n */\n static IsSessionSupportedAsync(sessionMode) {\n if (!navigator.xr) {\n return Promise.resolve(false);\n }\n // When the specs are final, remove supportsSession!\n const functionToUse = navigator.xr.isSessionSupported || navigator.xr.supportsSession;\n if (!functionToUse) {\n return Promise.resolve(false);\n }\n else {\n return functionToUse\n .call(navigator.xr, sessionMode)\n .then((result) => {\n const returnValue = typeof result === \"undefined\" ? true : result;\n return Promise.resolve(returnValue);\n })\n .catch((e) => {\n Logger.Warn(e);\n return Promise.resolve(false);\n });\n }\n }\n /**\n * Returns true if Babylon.js is using the BabylonNative backend, otherwise false\n */\n get isNative() {\n return this._xrNavigator.xr.native ?? false;\n }\n /**\n * The current frame rate as reported by the device\n */\n get currentFrameRate() {\n return this.session?.frameRate;\n }\n /**\n * A list of supported frame rates (only available in-session!\n */\n get supportedFrameRates() {\n return this.session?.supportedFrameRates;\n }\n /**\n * Set the framerate of the session.\n * @param rate the new framerate. This value needs to be in the supportedFrameRates array\n * @returns a promise that resolves once the framerate has been set\n */\n updateTargetFrameRate(rate) {\n return this.session.updateTargetFrameRate(rate);\n }\n /**\n * Run a callback in the xr render loop\n * @param callback the callback to call when in XR Frame\n * @param ignoreIfNotInSession if no session is currently running, run it first thing on the next session\n */\n runInXRFrame(callback, ignoreIfNotInSession = true) {\n if (this.inXRFrameLoop) {\n callback();\n }\n else if (this.inXRSession || !ignoreIfNotInSession) {\n this.onXRFrameObservable.addOnce(callback);\n }\n }\n /**\n * Check if fixed foveation is supported on this device\n */\n get isFixedFoveationSupported() {\n return this._baseLayerWrapper?.isFixedFoveationSupported || false;\n }\n /**\n * Get the fixed foveation currently set, as specified by the webxr specs\n * If this returns null, then fixed foveation is not supported\n */\n get fixedFoveation() {\n return this._baseLayerWrapper?.fixedFoveation || null;\n }\n /**\n * Set the fixed foveation to the specified value, as specified by the webxr specs\n * This value will be normalized to be between 0 and 1, 1 being max foveation, 0 being no foveation\n */\n set fixedFoveation(value) {\n const val = Math.max(0, Math.min(1, value || 0));\n if (this._baseLayerWrapper) {\n this._baseLayerWrapper.fixedFoveation = val;\n }\n }\n /**\n * Get the features enabled on the current session\n * This is only available in-session!\n * @see https://www.w3.org/TR/webxr/#dom-xrsession-enabledfeatures\n */\n get enabledFeatures() {\n return this.session?.enabledFeatures ?? null;\n }\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|