|
@@ -15,47 +15,62 @@ export class WebXRControllerModelLoader {
|
|
*/
|
|
*/
|
|
constructor(input: WebXRInput) {
|
|
constructor(input: WebXRInput) {
|
|
input.onControllerAddedObservable.add((c) => {
|
|
input.onControllerAddedObservable.add((c) => {
|
|
|
|
+ if (!c.inputSource.gamepad) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
let controllerModel: WebVRController;
|
|
let controllerModel: WebVRController;
|
|
- if (c.inputSource.gamepad && c.inputSource.gamepad.id === "htc-vive") {
|
|
|
|
- controllerModel = new ViveController(c.inputSource.gamepad);
|
|
|
|
- controllerModel.hand = c.inputSource.handedness;
|
|
|
|
- controllerModel.isXR = true;
|
|
|
|
- controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
|
|
- m.isPickable = false;
|
|
|
|
- m.getChildMeshes(false).forEach((m) => {
|
|
|
|
|
|
+
|
|
|
|
+ switch (c.inputSource.gamepad.id) {
|
|
|
|
+ case "htc-vive": {
|
|
|
|
+ controllerModel = new ViveController(c.inputSource.gamepad);
|
|
|
|
+ controllerModel.hand = c.inputSource.handedness;
|
|
|
|
+ controllerModel.isXR = true;
|
|
|
|
+ controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
m.isPickable = false;
|
|
m.isPickable = false;
|
|
|
|
+ m.getChildMeshes(false).forEach((m) => {
|
|
|
|
+ m.isPickable = false;
|
|
|
|
+ });
|
|
|
|
+ controllerModel.mesh!.parent = c.grip!;
|
|
|
|
+ controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
|
|
|
|
+ });
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case "oculus-touch": {
|
|
|
|
+ controllerModel = new OculusTouchController(c.inputSource.gamepad);
|
|
|
|
+ controllerModel.hand = c.inputSource.handedness;
|
|
|
|
+ controllerModel.isXR = true;
|
|
|
|
+ controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
|
|
+ controllerModel.mesh!.parent = c.grip!;
|
|
|
|
+ controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
|
|
|
|
+ controllerModel.mesh!.position.y = 0.034;
|
|
|
|
+ controllerModel.mesh!.position.z = 0.052;
|
|
});
|
|
});
|
|
- controllerModel.mesh!.parent = c.grip!;
|
|
|
|
- controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
|
|
|
|
- });
|
|
|
|
- } else if (c.inputSource.gamepad && c.inputSource.gamepad.id === "oculus-touch") {
|
|
|
|
- controllerModel = new OculusTouchController(c.inputSource.gamepad);
|
|
|
|
- controllerModel.hand = c.inputSource.handedness;
|
|
|
|
- controllerModel.isXR = true;
|
|
|
|
- controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
|
|
- controllerModel.mesh!.parent = c.grip!;
|
|
|
|
- controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
|
|
|
|
- controllerModel.mesh!.position.y = 0.034;
|
|
|
|
- controllerModel.mesh!.position.z = 0.052;
|
|
|
|
- });
|
|
|
|
- } else if (c.inputSource.gamepad && c.inputSource.gamepad.id === "oculus-quest") {
|
|
|
|
- OculusTouchController._IsQuest = true;
|
|
|
|
- controllerModel = new OculusTouchController(c.inputSource.gamepad);
|
|
|
|
- controllerModel.hand = c.inputSource.handedness;
|
|
|
|
- controllerModel.isXR = true;
|
|
|
|
- controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
|
|
- controllerModel.mesh!.parent = c.grip!;
|
|
|
|
- controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(Math.PI / -4, Math.PI, 0);
|
|
|
|
- });
|
|
|
|
- } else {
|
|
|
|
- controllerModel = new WindowsMotionController(c.inputSource.gamepad);
|
|
|
|
- controllerModel.hand = c.inputSource.handedness;
|
|
|
|
- controllerModel.isXR = true;
|
|
|
|
- controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
|
|
- controllerModel.mesh!.parent = c.grip!;
|
|
|
|
- controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
|
|
|
|
- });
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case "oculus-quest": {
|
|
|
|
+ OculusTouchController._IsQuest = true;
|
|
|
|
+ controllerModel = new OculusTouchController(c.inputSource.gamepad);
|
|
|
|
+ controllerModel.hand = c.inputSource.handedness;
|
|
|
|
+ controllerModel.isXR = true;
|
|
|
|
+ controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
|
|
+ controllerModel.mesh!.parent = c.grip!;
|
|
|
|
+ controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(Math.PI / -4, Math.PI, 0);
|
|
|
|
+ });
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ default: {
|
|
|
|
+ controllerModel = new WindowsMotionController(c.inputSource.gamepad);
|
|
|
|
+ controllerModel.hand = c.inputSource.handedness;
|
|
|
|
+ controllerModel.isXR = true;
|
|
|
|
+ controllerModel.initControllerMesh(c.getScene(), (m) => {
|
|
|
|
+ controllerModel.mesh!.parent = c.grip!;
|
|
|
|
+ controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
|
|
|
|
+ });
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
c.gamepadController = controllerModel;
|
|
c.gamepadController = controllerModel;
|
|
});
|
|
});
|
|
}
|
|
}
|