Selaa lähdekoodia

Initial GearVR support. Trigger and trackpad are working, so it is more usable than fallback Generic controller.
- Seems to require long button presses.
- Using Generic model for now.
- Position of pose is always null, so rays are distracting for now.

Brian Zinn 7 vuotta sitten
vanhempi
commit
d839f263f2

+ 49 - 0
src/Gamepad/Controllers/babylon.gearVRController.ts

@@ -0,0 +1,49 @@
+module BABYLON {
+    
+    export class GearVRController extends WebVRController {
+        public static readonly MODEL_BASE_URL:string = 'https://controllers.babylonjs.com/generic/';
+        public static readonly MODEL_FILENAME:string = 'generic.babylon';
+
+        public static readonly GAMEPAD_ID_PREFIX: string = 'Gear VR'; // id is 'Gear VR Controller'
+
+        private readonly _mapping = {
+            // Semantic button names
+            buttons: ['trackpad', 'trigger'],
+
+            // This mapping is used to translate from the controller to Babylon semantics
+            buttonObservableNames: {
+                'trackpad': 'onTrackpadChangedObservable',
+                'trigger': 'onTriggerStateChangedObservable'
+
+            }
+        };
+
+        constructor(vrGamepad: any) {
+            super(vrGamepad);
+            this.controllerType = PoseEnabledControllerType.GEAR_VR;
+        }
+
+        public initControllerMesh(scene: Scene, meshLoaded?: (mesh: AbstractMesh) => void) {
+            SceneLoader.ImportMesh("", GenericController.MODEL_BASE_URL, GenericController.MODEL_FILENAME, scene, (newMeshes) => {
+                this._defaultModel = newMeshes[1];
+                this.attachToMesh(this._defaultModel);
+                if (meshLoaded) {
+                    meshLoaded(this._defaultModel);
+                }
+            });
+        }
+
+        protected handleButtonChange(buttonIdx: number, state: ExtendedGamepadButton, changes: GamepadButtonChanges) {
+
+            if (buttonIdx < this._mapping.buttons.length) {
+                const buttonName : string = this._mapping.buttons[buttonIdx];
+                
+                // Only emit events for buttons that we know how to map from index to name
+                let observable = (<any>this)[(<any>(this._mapping.buttonObservableNames))[buttonName]];
+                if (observable) {
+                    observable.notifyObservers(state);
+                }
+            }
+        }
+    }
+}

+ 6 - 0
src/Gamepad/Controllers/babylon.poseEnabledController.ts

@@ -4,6 +4,7 @@ module BABYLON {
         VIVE,
         OCULUS,
         WINDOWS,
+        GEAR_VR,
         GENERIC
     }
 
@@ -33,8 +34,13 @@ module BABYLON {
             else if (vrGamepad.id.toLowerCase().indexOf('openvr') !== -1) {
                 return new ViveController(vrGamepad);
             }
+            // Samsung/Oculus Gear VR
+            else if (vrGamepad.id.indexOf(GearVRController.GAMEPAD_ID_PREFIX) === 0) {
+                return new GearVRController(vrGamepad);
+            }
             // Generic 
             else {
+                console.log('unknown gamepadId:', vrGamepad)
                 return new GenericController(vrGamepad);
             }
         }