|
@@ -160,24 +160,37 @@ module BABYLON {
|
|
this._scene = scene;
|
|
this._scene = scene;
|
|
this._canvas = scene.getEngine().getRenderingCanvas();
|
|
this._canvas = scene.getEngine().getRenderingCanvas();
|
|
|
|
|
|
- this._defaultHeight = webVROptions.defaultHeight || 1.7;
|
|
|
|
-
|
|
|
|
|
|
+ // Parse options
|
|
if (webVROptions.createFallbackVRDeviceOrientationFreeCamera === undefined) {
|
|
if (webVROptions.createFallbackVRDeviceOrientationFreeCamera === undefined) {
|
|
webVROptions.createFallbackVRDeviceOrientationFreeCamera = true;
|
|
webVROptions.createFallbackVRDeviceOrientationFreeCamera = true;
|
|
}
|
|
}
|
|
-
|
|
|
|
if (webVROptions.createDeviceOrientationCamera === undefined) {
|
|
if (webVROptions.createDeviceOrientationCamera === undefined) {
|
|
webVROptions.createDeviceOrientationCamera = true;
|
|
webVROptions.createDeviceOrientationCamera = true;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (!this._scene.activeCamera || webVROptions.createDeviceOrientationCamera) {
|
|
|
|
- if (!this._scene.activeCamera || isNaN(this._scene.activeCamera.position.x)) {
|
|
|
|
- this._position = new BABYLON.Vector3(0, this._defaultHeight, 0);
|
|
|
|
- this._deviceOrientationCamera = new BABYLON.DeviceOrientationCamera("deviceOrientationVRHelper", this._position.clone(), scene);
|
|
|
|
|
|
+ if (webVROptions.useCustomVRButton) {
|
|
|
|
+ this._useCustomVRButton = true;
|
|
|
|
+ if (webVROptions.customVRButton) {
|
|
|
|
+ this._btnVR = webVROptions.customVRButton;
|
|
}
|
|
}
|
|
- else {
|
|
|
|
- this._position = this._scene.activeCamera.position.clone();
|
|
|
|
- this._deviceOrientationCamera = new BABYLON.DeviceOrientationCamera("deviceOrientationVRHelper", this._position.clone(), scene);
|
|
|
|
|
|
+ }
|
|
|
|
+ if (webVROptions.rayLength) {
|
|
|
|
+ this._rayLength = webVROptions.rayLength
|
|
|
|
+ }
|
|
|
|
+ this._defaultHeight = webVROptions.defaultHeight || 1.7;
|
|
|
|
+
|
|
|
|
+ // Set position
|
|
|
|
+ if(this._scene.activeCamera){
|
|
|
|
+ this._position = this._scene.activeCamera.position.clone();
|
|
|
|
+ }else{
|
|
|
|
+ this._position = new BABYLON.Vector3(0, this._defaultHeight, 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Set non-vr camera
|
|
|
|
+ if(webVROptions.createDeviceOrientationCamera || !this._scene.activeCamera){
|
|
|
|
+ this._deviceOrientationCamera = new BABYLON.DeviceOrientationCamera("deviceOrientationVRHelper", this._position.clone(), scene);
|
|
|
|
+
|
|
|
|
+ // Copy data from existing camera
|
|
|
|
+ if(this._scene.activeCamera){
|
|
this._deviceOrientationCamera.minZ = this._scene.activeCamera.minZ;
|
|
this._deviceOrientationCamera.minZ = this._scene.activeCamera.minZ;
|
|
this._deviceOrientationCamera.maxZ = this._scene.activeCamera.maxZ;
|
|
this._deviceOrientationCamera.maxZ = this._scene.activeCamera.maxZ;
|
|
// Set rotation from previous camera
|
|
// Set rotation from previous camera
|
|
@@ -191,29 +204,22 @@ module BABYLON {
|
|
this._deviceOrientationCamera.rotation = targetCamera.rotation.clone();
|
|
this._deviceOrientationCamera.rotation = targetCamera.rotation.clone();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
this._scene.activeCamera = this._deviceOrientationCamera;
|
|
this._scene.activeCamera = this._deviceOrientationCamera;
|
|
if (this._canvas) {
|
|
if (this._canvas) {
|
|
this._scene.activeCamera.attachControl(this._canvas);
|
|
this._scene.activeCamera.attachControl(this._canvas);
|
|
}
|
|
}
|
|
- }
|
|
|
|
- else {
|
|
|
|
|
|
+ }else{
|
|
this._existingCamera = this._scene.activeCamera;
|
|
this._existingCamera = this._scene.activeCamera;
|
|
- this._position = this._scene.activeCamera.position.clone();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- if (webVROptions) {
|
|
|
|
- if (webVROptions.useCustomVRButton) {
|
|
|
|
- this._useCustomVRButton = true;
|
|
|
|
- if (webVROptions.customVRButton) {
|
|
|
|
- this._btnVR = webVROptions.customVRButton;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (webVROptions.rayLength) {
|
|
|
|
- this._rayLength = webVROptions.rayLength
|
|
|
|
- }
|
|
|
|
|
|
+ // Create VR cameras
|
|
|
|
+ if (webVROptions.createFallbackVRDeviceOrientationFreeCamera) {
|
|
|
|
+ this._vrDeviceOrientationCamera = new BABYLON.VRDeviceOrientationFreeCamera("VRDeviceOrientationVRHelper", this._position, this._scene);
|
|
}
|
|
}
|
|
|
|
+ this._webVRCamera = new BABYLON.WebVRFreeCamera("WebVRHelper", this._position, this._scene, webVROptions);
|
|
|
|
|
|
|
|
+ // Create default button
|
|
if (!this._useCustomVRButton) {
|
|
if (!this._useCustomVRButton) {
|
|
this._btnVR = <HTMLButtonElement>document.createElement("BUTTON");
|
|
this._btnVR = <HTMLButtonElement>document.createElement("BUTTON");
|
|
this._btnVR.className = "babylonVRicon";
|
|
this._btnVR.className = "babylonVRicon";
|
|
@@ -229,50 +235,42 @@ module BABYLON {
|
|
var style = document.createElement('style');
|
|
var style = document.createElement('style');
|
|
style.appendChild(document.createTextNode(css));
|
|
style.appendChild(document.createTextNode(css));
|
|
document.getElementsByTagName('head')[0].appendChild(style);
|
|
document.getElementsByTagName('head')[0].appendChild(style);
|
|
- }
|
|
|
|
-
|
|
|
|
- if (this._canvas) {
|
|
|
|
- if (!this._useCustomVRButton) {
|
|
|
|
- this._btnVR.style.top = this._canvas.offsetTop + this._canvas.offsetHeight - 70 + "px";
|
|
|
|
- this._btnVR.style.left = this._canvas.offsetLeft + this._canvas.offsetWidth - 100 + "px";
|
|
|
|
- }
|
|
|
|
- if (this._btnVR) {
|
|
|
|
- this._btnVR.addEventListener("click", () => {
|
|
|
|
- if (!this.isInVRMode) {
|
|
|
|
- this.enterVR();
|
|
|
|
- } else {
|
|
|
|
- this.exitVR();
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
|
|
|
|
- window.addEventListener("resize", () => {
|
|
|
|
- if (this._canvas && !this._useCustomVRButton) {
|
|
|
|
- this._btnVR.style.top = this._canvas.offsetTop + this._canvas.offsetHeight - 70 + "px";
|
|
|
|
- this._btnVR.style.left = this._canvas.offsetLeft + this._canvas.offsetWidth - 100 + "px";
|
|
|
|
- }
|
|
|
|
|
|
+ this.moveButtonToBottomRight();
|
|
|
|
+ }
|
|
|
|
|
|
- if (this._fullscreenVRpresenting && this._webVRready) {
|
|
|
|
|
|
+ // VR button click event
|
|
|
|
+ if (this._btnVR) {
|
|
|
|
+ this._btnVR.addEventListener("click", () => {
|
|
|
|
+ if (!this.isInVRMode) {
|
|
|
|
+ this.enterVR();
|
|
|
|
+ } else {
|
|
this.exitVR();
|
|
this.exitVR();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // Window events
|
|
|
|
+ window.addEventListener("resize", () => {
|
|
|
|
+ this.moveButtonToBottomRight();
|
|
|
|
+ if (this._fullscreenVRpresenting && this._webVRready) {
|
|
|
|
+ this.exitVR();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
document.addEventListener("fullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
document.addEventListener("fullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
document.addEventListener("mozfullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
document.addEventListener("mozfullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
document.addEventListener("webkitfullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
document.addEventListener("webkitfullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
document.addEventListener("msfullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
document.addEventListener("msfullscreenchange", () => { this._onFullscreenChange() }, false);
|
|
|
|
|
|
- this._scene.getEngine().onVRDisplayChangedObservable.add((e) => {
|
|
|
|
- if (!this._useCustomVRButton && !this._btnVRDisplayed && e.vrDisplay) {
|
|
|
|
- document.body.appendChild(this._btnVR);
|
|
|
|
- this._btnVRDisplayed = true;
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- if (!this._useCustomVRButton && !this._btnVRDisplayed && webVROptions.createFallbackVRDeviceOrientationFreeCamera) {
|
|
|
|
- document.body.appendChild(this._btnVR);
|
|
|
|
- this._btnVRDisplayed = true;
|
|
|
|
|
|
+ // Display vr button when headset is connected
|
|
|
|
+ if (webVROptions.createFallbackVRDeviceOrientationFreeCamera) {
|
|
|
|
+ this.displayVRButton();
|
|
|
|
+ }else{
|
|
|
|
+ this._scene.getEngine().onVRDisplayChangedObservable.add((e) => {
|
|
|
|
+ if (e.vrDisplay) {
|
|
|
|
+ this.displayVRButton();
|
|
|
|
+ }
|
|
|
|
+ })
|
|
}
|
|
}
|
|
|
|
|
|
// Exiting VR mode using 'ESC' key on desktop
|
|
// Exiting VR mode using 'ESC' key on desktop
|
|
@@ -304,17 +302,12 @@ module BABYLON {
|
|
this._webVRrequesting = false;
|
|
this._webVRrequesting = false;
|
|
this.updateButtonVisibility();
|
|
this.updateButtonVisibility();
|
|
};
|
|
};
|
|
-
|
|
|
|
scene.getEngine().onVRDisplayChangedObservable.add(this._onVRDisplayChanged);
|
|
scene.getEngine().onVRDisplayChangedObservable.add(this._onVRDisplayChanged);
|
|
scene.getEngine().onVRRequestPresentStart.add(this._onVRRequestPresentStart);
|
|
scene.getEngine().onVRRequestPresentStart.add(this._onVRRequestPresentStart);
|
|
scene.getEngine().onVRRequestPresentComplete.add(this._onVRRequestPresentComplete);
|
|
scene.getEngine().onVRRequestPresentComplete.add(this._onVRRequestPresentComplete);
|
|
window.addEventListener('vrdisplaypresentchange', this._onVrDisplayPresentChange);
|
|
window.addEventListener('vrdisplaypresentchange', this._onVrDisplayPresentChange);
|
|
|
|
|
|
- // Create the cameras
|
|
|
|
- if (webVROptions.createFallbackVRDeviceOrientationFreeCamera) {
|
|
|
|
- this._vrDeviceOrientationCamera = new BABYLON.VRDeviceOrientationFreeCamera("VRDeviceOrientationVRHelper", this._position, this._scene);
|
|
|
|
- }
|
|
|
|
- this._webVRCamera = new BABYLON.WebVRFreeCamera("WebVRHelper", this._position, this._scene, webVROptions);
|
|
|
|
|
|
+ // Gamepad connection events
|
|
this._webVRCamera.onControllerMeshLoadedObservable.add((webVRController) => this._onDefaultMeshLoaded(webVRController));
|
|
this._webVRCamera.onControllerMeshLoadedObservable.add((webVRController) => this._onDefaultMeshLoaded(webVRController));
|
|
this._scene.gamepadManager.onGamepadConnectedObservable.add((pad) => this._onNewGamepadConnected(pad));
|
|
this._scene.gamepadManager.onGamepadConnectedObservable.add((pad) => this._onNewGamepadConnected(pad));
|
|
this._scene.gamepadManager.onGamepadDisconnectedObservable.add((pad) => this._onNewGamepadDisconnected(pad));
|
|
this._scene.gamepadManager.onGamepadDisconnectedObservable.add((pad) => this._onNewGamepadDisconnected(pad));
|
|
@@ -405,6 +398,20 @@ module BABYLON {
|
|
this.updateButtonVisibility();
|
|
this.updateButtonVisibility();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private moveButtonToBottomRight(){
|
|
|
|
+ if (this._canvas && !this._useCustomVRButton) {
|
|
|
|
+ this._btnVR.style.top = this._canvas.offsetTop + this._canvas.offsetHeight - 70 + "px";
|
|
|
|
+ this._btnVR.style.left = this._canvas.offsetLeft + this._canvas.offsetWidth - 100 + "px";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private displayVRButton(){
|
|
|
|
+ if (!this._useCustomVRButton && !this._btnVRDisplayed) {
|
|
|
|
+ document.body.appendChild(this._btnVR);
|
|
|
|
+ this._btnVRDisplayed = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private updateButtonVisibility() {
|
|
private updateButtonVisibility() {
|
|
if (!this._btnVR || this._useCustomVRButton) {
|
|
if (!this._btnVR || this._useCustomVRButton) {
|
|
return;
|
|
return;
|