Selaa lähdekoodia

entering/exiting xr

Trevor Baron 6 vuotta sitten
vanhempi
commit
4db8f43b2b

+ 9 - 2
src/Cameras/XR/webXRExperienceHelper.ts

@@ -91,6 +91,10 @@ export class WebXRExperienceHelper implements IDisposable {
         this.sessionManager = new WebXRSessionManager(scene);
         this.container = new AbstractMesh("WebXR Container", scene);
         this.camera.parent = this.container;
+
+        scene.onDisposeObservable.add(() => {
+            this.exitXRAsync();
+        });
     }
 
     /**
@@ -144,11 +148,14 @@ export class WebXRExperienceHelper implements IDisposable {
                 // Restore scene settings
                 this.scene.autoClear = this._originalSceneAutoClear;
                 this.scene.activeCamera = this._nonVRCamera;
-                this.sessionManager.onXRFrameObservable.clear();
 
                 this._setState(WebXRState.NOT_IN_XR);
             });
-            this._setState(WebXRState.IN_XR);
+
+            // Wait until the first frame arrives before setting state to in xr
+            this.sessionManager.onXRFrameObservable.addOnce(()=>{
+                this._setState(WebXRState.IN_XR);
+            })
         }).catch((e: any) => {
             console.log(e);
             console.log(e.message);

+ 10 - 1
src/Cameras/XR/webXRInput.ts

@@ -1,7 +1,7 @@
 import { Nullable } from "../../types";
 import { Observer, Observable } from "../../Misc/observable";
 import { IDisposable } from "../../scene";
-import { WebXRExperienceHelper } from "./webXRExperienceHelper";
+import { WebXRExperienceHelper, WebXRState } from "./webXRExperienceHelper";
 import { WebXRController } from './webXRController';
 
 /**
@@ -13,6 +13,7 @@ export class WebXRInput implements IDisposable {
      */
     public controllers: Array<WebXRController> = [];
     private _frameObserver: Nullable<Observer<any>>;
+    private _stateObserver: Nullable<Observer<any>>;
     /**
      * Event when a controller has been connected/added
      */
@@ -27,6 +28,13 @@ export class WebXRInput implements IDisposable {
      * @param xrExperienceHelper experience helper which the input should be created for
      */
     public constructor(public xrExperienceHelper: WebXRExperienceHelper) {
+        // Remove controllers when exiting XR
+        this._stateObserver = xrExperienceHelper.onStateChangedObservable.add((s)=>{
+            if(s === WebXRState.NOT_IN_XR){
+                this._addAndRemoveControllers([], this.controllers.map((c)=>{return c.inputSource}));
+            }
+        })
+        
         this._frameObserver = xrExperienceHelper.sessionManager.onXRFrameObservable.add(() => {
             if (!xrExperienceHelper.sessionManager.currentFrame) {
                 return;
@@ -87,5 +95,6 @@ export class WebXRInput implements IDisposable {
             c.dispose();
         });
         this.xrExperienceHelper.sessionManager.onXRFrameObservable.remove(this._frameObserver);
+        this.xrExperienceHelper.onStateChangedObservable.remove(this._stateObserver);
     }
 }

+ 4 - 1
src/Cameras/XR/webXRSessionManager.ts

@@ -138,7 +138,10 @@ export class WebXRSessionManager implements IDisposable {
      * @returns Promise which resolves after it exits XR
      */
     public exitXRAsync() {
-        return this.session.end();
+        if(this.session){
+            this.session.end();
+        }
+        return new Promise(()=>{});
     }
 
     /**