فهرست منبع

Merge pull request #3512 from brianzinn/master

Basic GearVR support
David Catuhe 7 سال پیش
والد
کامیت
7a04d2b55b

+ 2 - 1
Tools/Gulp/config.json

@@ -676,7 +676,8 @@
                 "../../src/Gamepad/Controllers/babylon.oculusTouchController.js",
                 "../../src/Gamepad/Controllers/babylon.viveController.js",
                 "../../src/Gamepad/Controllers/babylon.genericController.js",
-                "../../src/Gamepad/Controllers/babylon.windowsMotionController.js"
+                "../../src/Gamepad/Controllers/babylon.windowsMotionController.js",
+                "../../src/Gamepad/Controllers/babylon.gearVRController.js"
             ],
             "dependUpon": [
                 "core"

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

@@ -0,0 +1,41 @@
+module BABYLON {
+    
+    export class GearVRController extends WebVRController {
+        public static MODEL_BASE_URL:string = 'https://controllers.babylonjs.com/generic/';
+        public static MODEL_FILENAME:string = 'generic.babylon';
+
+        public static readonly GAMEPAD_ID_PREFIX: string = 'Gear VR'; // id is 'Gear VR Controller'
+
+        private readonly _buttonIndexToObservableNameMap = [
+            'onTrackpadChangedObservable', // Trackpad
+            'onTriggerStateChangedObservable' // Trigger
+        ]
+
+        constructor(vrGamepad: any) {
+            super(vrGamepad);
+            this.controllerType = PoseEnabledControllerType.GEAR_VR;
+        }
+
+        public initControllerMesh(scene: Scene, meshLoaded?: (mesh: AbstractMesh) => void) {
+            SceneLoader.ImportMesh("", GearVRController.MODEL_BASE_URL, GearVRController.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._buttonIndexToObservableNameMap.length) {
+                const observableName : string = this._buttonIndexToObservableNameMap[buttonIdx];
+                
+                // Only emit events for buttons that we know how to map from index to observable
+                let observable = (<any>this)[observableName];
+                if (observable) {
+                    observable.notifyObservers(state);
+                }
+            }
+        }
+    }
+}

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

@@ -4,6 +4,7 @@ module BABYLON {
         VIVE,
         OCULUS,
         WINDOWS,
+        GEAR_VR,
         GENERIC
     }
 
@@ -33,6 +34,10 @@ 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 {
                 return new GenericController(vrGamepad);