소스 검색

renaming and adding observables

Raanan Weber 5 년 전
부모
커밋
cb6fb1ebb8

+ 3 - 3
src/XR/features/WebXRControllerPhysics.ts

@@ -31,7 +31,7 @@ export class IWebXRControllerPhysicsOptions {
          */
         impostorType?: number;
         /**
-         * the size of the impostor
+         * the size of the impostor. Defaults to 10cm
          */
         impostorSize?: number | { width: number, height: number, depth: number };
         /**
@@ -184,7 +184,7 @@ export class WebXRControllerPhysics extends WebXRAbstractFeature {
             Logger.Warn("physics engine not enabled, skipped. Please add this controller manually.");
         }
         if (this._options.physicsProperties!.useControllerMesh) {
-            xrController.onMotionControllerProfileLoaded.addOnce((motionController) => {
+            xrController.onMotionControllerInitObservable.addOnce((motionController) => {
                 motionController.onModelLoadedObservable.addOnce(() => {
                     const impostor = new PhysicsImpostor(motionController.rootMesh!, PhysicsImpostor.MeshImpostor, {
                         mass: 0,
@@ -201,7 +201,7 @@ export class WebXRControllerPhysics extends WebXRAbstractFeature {
             });
         } else {
             const impostorType: number = this._options.physicsProperties!.impostorType || PhysicsImpostor.SphereImpostor;
-            const impostorSize: number | { width: number, height: number, depth: number } = this._options.physicsProperties!.impostorSize || 0.08;
+            const impostorSize: number | { width: number, height: number, depth: number } = this._options.physicsProperties!.impostorSize || 0.1;
             const impostorMesh = SphereBuilder.CreateSphere('impostor-mesh-' + xrController.uniqueId, {
                 diameterX: typeof impostorSize === 'number' ? impostorSize : impostorSize.width,
                 diameterY: typeof impostorSize === 'number' ? impostorSize : impostorSize.height,

+ 1 - 1
src/XR/features/WebXRControllerPointerSelection.ts

@@ -357,7 +357,7 @@ export class WebXRControllerPointerSelection extends WebXRAbstractFeature {
     }
 
     private _attachTrackedPointerRayMode(xrController: WebXRController) {
-        xrController.onMotionControllerProfileLoaded.add((motionController) => {
+        xrController.onMotionControllerInitObservable.add((motionController) => {
             if (this._options.forceGazeMode) {
                 return this._attachGazeMode(xrController);
             }

+ 1 - 1
src/XR/features/WebXRControllerTeleportation.ts

@@ -326,7 +326,7 @@ export class WebXRMotionControllerTeleportation extends WebXRAbstractFeature {
         };
         const controllerData = this._controllers[xrController.uniqueId];
         // motion controller support
-        xrController.onMotionControllerProfileLoaded.addOnce(() => {
+        xrController.onMotionControllerInitObservable.addOnce(() => {
             if (xrController.motionController) {
                 const movementController = xrController.motionController.getComponentOfType(WebXRControllerComponent.THUMBSTICK) || xrController.motionController.getComponentOfType(WebXRControllerComponent.TOUCHPAD);
                 if (!movementController || this._options.useMainComponentOnly) {

+ 19 - 7
src/XR/webXRController.ts

@@ -52,12 +52,21 @@ export class WebXRController {
     /**
      * Observers registered here will trigger when a motion controller profile was assigned to this xr controller
      */
-    public onMotionControllerProfileLoaded = new Observable<WebXRAbstractMotionController>();
+    public onMotionControllerInitObservable = new Observable<WebXRAbstractMotionController>();
 
     /**
-     * Event that fires when the controller is removed/disposed
+     * Will be triggered when the mesh associated with the motion controller is done loading.
+     * It is also possible that this will never trigger (!) if no mesh was loaded, or if the developer decides to load a different mesh
+     * A shortened version of controller -> motion controller -> on mesh loaded.
      */
-    public onDisposeObservable = new Observable<{}>();
+    public onMeshLoadedObservable = new Observable<AbstractMesh>();
+
+    /**
+     * Event that fires when the controller is removed/disposed.
+     * The object provided as event data is this controller, after associated assets were disposed.
+     * uniqueId is still available.
+     */
+    public onDisposeObservable = new Observable<WebXRController>();
 
     private _tmpQuaternion = new Quaternion();
     private _tmpVector = new Vector3();
@@ -85,15 +94,16 @@ export class WebXRController {
             this.grip.rotationQuaternion = new Quaternion();
         }
 
-        // for now only load motion controllers if gamepad available
+        // for now only load motion controllers if gamepad object available
         if (this.inputSource.gamepad) {
             WebXRMotionControllerManager.GetMotionControllerWithXRInput(inputSource, _scene, this._options.forceControllerProfile).then((motionController) => {
                 this.motionController = motionController;
-                this.onMotionControllerProfileLoaded.notifyObservers(motionController);
+                this.onMotionControllerInitObservable.notifyObservers(motionController);
                 // should the model be loaded?
                 if (!this._options.doNotLoadControllerMesh) {
                     this.motionController.loadModel().then((success) => {
                         if (success) {
+                            this.onMeshLoadedObservable.notifyObservers(this.motionController!.rootMesh!);
                             this.motionController!.rootMesh!.parent = this.grip || this.pointer;
                             this.motionController!.disableAnimation = !!this._options.disableMotionControllerAnimation;
                         }
@@ -172,8 +182,10 @@ export class WebXRController {
         if (this.motionController) {
             this.motionController.dispose();
         }
-        this.onMotionControllerProfileLoaded.clear();
         this.pointer.dispose();
-        this.onDisposeObservable.notifyObservers({});
+        this.onMotionControllerInitObservable.clear();
+        this.onMeshLoadedObservable.clear();
+        this.onDisposeObservable.notifyObservers(this);
+        this.onDisposeObservable.clear();
     }
 }