|
@@ -7503,16 +7503,30 @@ var BABYLON;
|
|
|
return 1;
|
|
|
}
|
|
|
var m = this._m;
|
|
|
- var temp1 = m[10] * m[15] - m[11] * m[14];
|
|
|
- var temp2 = m[9] * m[15] - m[11] * m[13];
|
|
|
- var temp3 = m[9] * m[14] - m[10] * m[13];
|
|
|
- var temp4 = m[8] * m[15] - m[11] * m[12];
|
|
|
- var temp5 = m[8] * m[14] - m[10] * m[12];
|
|
|
- var temp6 = m[8] * m[13] - m[9] * m[12];
|
|
|
- return (m[0] * (m[5] * temp1 - m[6] * temp2 + m[7] * temp3) -
|
|
|
- m[1] * (m[4] * temp1 - m[6] * temp4 + m[7] * temp5) +
|
|
|
- m[2] * (m[4] * temp2 - m[5] * temp4 + m[7] * temp6) -
|
|
|
- m[3] * (m[4] * temp3 - m[5] * temp5 + m[6] * temp6));
|
|
|
+ var m00 = m[0], m01 = m[1], m02 = m[2], m03 = m[3];
|
|
|
+ var m10 = m[4], m11 = m[5], m12 = m[6], m13 = m[7];
|
|
|
+ var m20 = m[8], m21 = m[9], m22 = m[10], m23 = m[11];
|
|
|
+ var m30 = m[12], m31 = m[13], m32 = m[14], m33 = m[15];
|
|
|
+ // https://en.wikipedia.org/wiki/Laplace_expansion
|
|
|
+ // to compute the deterrminant of a 4x4 Matrix we compute the cofactors of any row or column,
|
|
|
+ // then we multiply each Cofactor by its corresponding matrix value and sum them all to get the determinant
|
|
|
+ // Cofactor(i, j) = sign(i,j) * det(Minor(i, j))
|
|
|
+ // where
|
|
|
+ // - sign(i,j) = (i+j) % 2 === 0 ? 1 : -1
|
|
|
+ // - Minor(i, j) is the 3x3 matrix we get by removing row i and column j from current Matrix
|
|
|
+ //
|
|
|
+ // Here we do that for the 1st row.
|
|
|
+ var det_22_33 = m22 * m33 - m32 * m23;
|
|
|
+ var det_21_33 = m21 * m33 - m31 * m23;
|
|
|
+ var det_21_32 = m21 * m32 - m31 * m22;
|
|
|
+ var det_20_33 = m20 * m33 - m30 * m23;
|
|
|
+ var det_20_32 = m20 * m32 - m22 * m30;
|
|
|
+ var det_20_31 = m20 * m31 - m30 * m21;
|
|
|
+ var cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);
|
|
|
+ var cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);
|
|
|
+ var cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);
|
|
|
+ var cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);
|
|
|
+ return m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;
|
|
|
};
|
|
|
// Methods
|
|
|
/**
|
|
@@ -7591,52 +7605,54 @@ var BABYLON;
|
|
|
Matrix.IdentityToRef(other);
|
|
|
return this;
|
|
|
}
|
|
|
+ // the inverse of a Matrix is the transpose of cofactor matrix divided by the determinant
|
|
|
var m = this._m;
|
|
|
- var l1 = m[0], l2 = m[1], l3 = m[2], l4 = m[3];
|
|
|
- var l5 = m[4], l6 = m[5], l7 = m[6], l8 = m[7];
|
|
|
- var l9 = m[8], l10 = m[9], l11 = m[10], l12 = m[11];
|
|
|
- var l13 = m[12], l14 = m[13], l15 = m[14], l16 = m[15];
|
|
|
- var l17 = l11 * l16 - l12 * l15;
|
|
|
- var l18 = l10 * l16 - l12 * l14;
|
|
|
- var l19 = l10 * l15 - l11 * l14;
|
|
|
- var l20 = l9 * l16 - l12 * l13;
|
|
|
- var l21 = l9 * l15 - l11 * l13;
|
|
|
- var l22 = l9 * l14 - l10 * l13;
|
|
|
- var l23 = l6 * l17 - l7 * l18 + l8 * l19;
|
|
|
- var l24 = -(l5 * l17 - l7 * l20 + l8 * l21);
|
|
|
- var l25 = l5 * l18 - l6 * l20 + l8 * l22;
|
|
|
- var l26 = -(l5 * l19 - l6 * l21 + l7 * l22);
|
|
|
- var l27 = 1 / (l1 * l23 + l2 * l24 + l3 * l25 + l4 * l26);
|
|
|
- var l28 = l7 * l16 - l8 * l15;
|
|
|
- var l29 = l6 * l16 - l8 * l14;
|
|
|
- var l30 = l6 * l15 - l7 * l14;
|
|
|
- var l31 = l5 * l16 - l8 * l13;
|
|
|
- var l32 = l5 * l15 - l7 * l13;
|
|
|
- var l33 = l5 * l14 - l6 * l13;
|
|
|
- var l34 = l7 * l12 - l8 * l11;
|
|
|
- var l35 = l6 * l12 - l8 * l10;
|
|
|
- var l36 = l6 * l11 - l7 * l10;
|
|
|
- var l37 = l5 * l12 - l8 * l9;
|
|
|
- var l38 = l5 * l11 - l7 * l9;
|
|
|
- var l39 = l5 * l10 - l6 * l9;
|
|
|
- var otherM = other._m;
|
|
|
- otherM[0] = l23 * l27;
|
|
|
- otherM[4] = l24 * l27;
|
|
|
- otherM[8] = l25 * l27;
|
|
|
- otherM[12] = l26 * l27;
|
|
|
- otherM[1] = -(l2 * l17 - l3 * l18 + l4 * l19) * l27;
|
|
|
- otherM[5] = (l1 * l17 - l3 * l20 + l4 * l21) * l27;
|
|
|
- otherM[9] = -(l1 * l18 - l2 * l20 + l4 * l22) * l27;
|
|
|
- otherM[13] = (l1 * l19 - l2 * l21 + l3 * l22) * l27;
|
|
|
- otherM[2] = (l2 * l28 - l3 * l29 + l4 * l30) * l27;
|
|
|
- otherM[6] = -(l1 * l28 - l3 * l31 + l4 * l32) * l27;
|
|
|
- otherM[10] = (l1 * l29 - l2 * l31 + l4 * l33) * l27;
|
|
|
- otherM[14] = -(l1 * l30 - l2 * l32 + l3 * l33) * l27;
|
|
|
- otherM[3] = -(l2 * l34 - l3 * l35 + l4 * l36) * l27;
|
|
|
- otherM[7] = (l1 * l34 - l3 * l37 + l4 * l38) * l27;
|
|
|
- otherM[11] = -(l1 * l35 - l2 * l37 + l4 * l39) * l27;
|
|
|
- otherM[15] = (l1 * l36 - l2 * l38 + l3 * l39) * l27;
|
|
|
- other._markAsUpdated();
|
|
|
+ var m00 = m[0], m01 = m[1], m02 = m[2], m03 = m[3];
|
|
|
+ var m10 = m[4], m11 = m[5], m12 = m[6], m13 = m[7];
|
|
|
+ var m20 = m[8], m21 = m[9], m22 = m[10], m23 = m[11];
|
|
|
+ var m30 = m[12], m31 = m[13], m32 = m[14], m33 = m[15];
|
|
|
+ var det_22_33 = m22 * m33 - m32 * m23;
|
|
|
+ var det_21_33 = m21 * m33 - m31 * m23;
|
|
|
+ var det_21_32 = m21 * m32 - m31 * m22;
|
|
|
+ var det_20_33 = m20 * m33 - m30 * m23;
|
|
|
+ var det_20_32 = m20 * m32 - m22 * m30;
|
|
|
+ var det_20_31 = m20 * m31 - m30 * m21;
|
|
|
+ var cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);
|
|
|
+ var cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);
|
|
|
+ var cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);
|
|
|
+ var cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);
|
|
|
+ var det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;
|
|
|
+ if (det === 0) {
|
|
|
+ // not invertible
|
|
|
+ other.copyFrom(this);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+ var detInv = 1 / det;
|
|
|
+ var det_12_33 = m12 * m33 - m32 * m13;
|
|
|
+ var det_11_33 = m11 * m33 - m31 * m13;
|
|
|
+ var det_11_32 = m11 * m32 - m31 * m12;
|
|
|
+ var det_10_33 = m10 * m33 - m30 * m13;
|
|
|
+ var det_10_32 = m10 * m32 - m30 * m12;
|
|
|
+ var det_10_31 = m10 * m31 - m30 * m11;
|
|
|
+ var det_12_23 = m12 * m23 - m22 * m13;
|
|
|
+ var det_11_23 = m11 * m23 - m21 * m13;
|
|
|
+ var det_11_22 = m11 * m22 - m21 * m12;
|
|
|
+ var det_10_23 = m10 * m23 - m20 * m13;
|
|
|
+ var det_10_22 = m10 * m22 - m20 * m12;
|
|
|
+ var det_10_21 = m10 * m21 - m20 * m11;
|
|
|
+ var cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32);
|
|
|
+ var cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32);
|
|
|
+ var cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31);
|
|
|
+ var cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31);
|
|
|
+ var cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32);
|
|
|
+ var cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32);
|
|
|
+ var cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31);
|
|
|
+ var cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31);
|
|
|
+ var cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22);
|
|
|
+ var cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22);
|
|
|
+ var cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21);
|
|
|
+ var cofact_33 = +(m00 * det_11_22 - m01 * det_10_22 + m02 * det_10_21);
|
|
|
+ Matrix.FromValuesToRef(cofact_00 * detInv, cofact_10 * detInv, cofact_20 * detInv, cofact_30 * detInv, cofact_01 * detInv, cofact_11 * detInv, cofact_21 * detInv, cofact_31 * detInv, cofact_02 * detInv, cofact_12 * detInv, cofact_22 * detInv, cofact_32 * detInv, cofact_03 * detInv, cofact_13 * detInv, cofact_23 * detInv, cofact_33 * detInv, other);
|
|
|
return this;
|
|
|
};
|
|
|
/**
|
|
@@ -8335,6 +8351,9 @@ var BABYLON;
|
|
|
m[9] = (axis.z * axis.y) * c1 + (axis.x * s);
|
|
|
m[10] = (axis.z * axis.z) * c1 + c;
|
|
|
m[11] = 0.0;
|
|
|
+ m[12] = 0.0;
|
|
|
+ m[13] = 0.0;
|
|
|
+ m[14] = 0.0;
|
|
|
m[15] = 1.0;
|
|
|
result._markAsUpdated();
|
|
|
};
|
|
@@ -12684,7 +12703,7 @@ var BABYLON;
|
|
|
* Returns the current version of the framework
|
|
|
*/
|
|
|
get: function () {
|
|
|
- return "4.0.0-alpha.2";
|
|
|
+ return "4.0.0-alpha.4";
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
@@ -12922,7 +12941,7 @@ var BABYLON;
|
|
|
this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0;
|
|
|
this._caps.uintIndices = this._webGLVersion > 1 || this._gl.getExtension('OES_element_index_uint') !== null;
|
|
|
this._caps.fragmentDepthSupported = this._webGLVersion > 1 || this._gl.getExtension('EXT_frag_depth') !== null;
|
|
|
- this._caps.highPrecisionShaderSupported = true;
|
|
|
+ this._caps.highPrecisionShaderSupported = false;
|
|
|
this._caps.timerQuery = this._gl.getExtension('EXT_disjoint_timer_query_webgl2') || this._gl.getExtension("EXT_disjoint_timer_query");
|
|
|
if (this._caps.timerQuery) {
|
|
|
if (this._webGLVersion === 1) {
|
|
@@ -13030,9 +13049,10 @@ var BABYLON;
|
|
|
this.texturesSupported.push('-etc1.ktx');
|
|
|
}
|
|
|
if (this._gl.getShaderPrecisionFormat) {
|
|
|
- var highp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);
|
|
|
- if (highp) {
|
|
|
- this._caps.highPrecisionShaderSupported = highp.precision !== 0;
|
|
|
+ var vertex_highp = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT);
|
|
|
+ var fragment_highp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);
|
|
|
+ if (vertex_highp && fragment_highp) {
|
|
|
+ this._caps.highPrecisionShaderSupported = vertex_highp.precision !== 0 && fragment_highp.precision !== 0;
|
|
|
}
|
|
|
}
|
|
|
// Depth buffer
|
|
@@ -51818,7 +51838,7 @@ var BABYLON;
|
|
|
};
|
|
|
ArcRotateCamera.prototype._getTargetPosition = function () {
|
|
|
if (this._targetHost && this._targetHost.getAbsolutePosition) {
|
|
|
- var pos = this._targetHost.getAbsolutePosition();
|
|
|
+ var pos = this._targetHost.absolutePosition;
|
|
|
if (this._targetBoundingCenter) {
|
|
|
pos.addToRef(this._targetBoundingCenter, this._target);
|
|
|
}
|
|
@@ -105772,10 +105792,6 @@ var BABYLON;
|
|
|
*/
|
|
|
this.alphaCorrection = 1;
|
|
|
/**
|
|
|
- * Defines a correction factor applied on the beta value retrieved from the orientation events.
|
|
|
- */
|
|
|
- this.betaCorrection = 1;
|
|
|
- /**
|
|
|
* Defines a correction factor applied on the gamma value retrieved from the orientation events.
|
|
|
*/
|
|
|
this.gammaCorrection = 1;
|
|
@@ -105796,10 +105812,10 @@ var BABYLON;
|
|
|
/** @hidden */
|
|
|
ArcRotateCameraVRDeviceOrientationInput.prototype._onOrientationEvent = function (evt) {
|
|
|
if (evt.alpha !== null) {
|
|
|
- this._alpha = +evt.alpha | 0;
|
|
|
+ this._alpha = (+evt.alpha | 0) * this.alphaCorrection;
|
|
|
}
|
|
|
if (evt.gamma !== null) {
|
|
|
- this._gamma = +evt.gamma | 0;
|
|
|
+ this._gamma = (+evt.gamma | 0) * this.gammaCorrection;
|
|
|
}
|
|
|
this._dirty = true;
|
|
|
};
|
|
@@ -108589,7 +108605,7 @@ var BABYLON;
|
|
|
this._tmpMatrix = new BABYLON.Matrix();
|
|
|
}
|
|
|
/**
|
|
|
- * Initializes the manager, this must be done with a user action (eg. button click event)
|
|
|
+ * Initializes the manager
|
|
|
* After initialization enterXR can be called to start an XR session
|
|
|
* @returns Promise which resolves after it is initialized
|
|
|
*/
|
|
@@ -108607,7 +108623,7 @@ var BABYLON;
|
|
|
});
|
|
|
};
|
|
|
/**
|
|
|
- * Enters XR with the desired XR session options
|
|
|
+ * Enters XR with the desired XR session options, this must be done with a user action (eg. button click event)
|
|
|
* @param sessionCreationOptions xr options to create the session with
|
|
|
* @param frameOfReferenceType option to configure how the xr pose is expressed
|
|
|
* @returns Promise which resolves after it enters XR
|
|
@@ -108691,6 +108707,18 @@ var BABYLON;
|
|
|
});
|
|
|
};
|
|
|
/**
|
|
|
+ * Checks if a session would be supported for the creation options specified
|
|
|
+ * @param options creation options to check if they are supported
|
|
|
+ * @returns true if supported
|
|
|
+ */
|
|
|
+ WebXRSessionManager.prototype.supportsSession = function (options) {
|
|
|
+ return this._xrDevice.supportsSession(options).then(function () {
|
|
|
+ return true;
|
|
|
+ }).catch(function (e) {
|
|
|
+ return false;
|
|
|
+ });
|
|
|
+ };
|
|
|
+ /**
|
|
|
* @hidden
|
|
|
* Converts the render layer of xrSession to a render target
|
|
|
* @param session session to create render target for
|
|
@@ -108729,17 +108757,21 @@ var BABYLON;
|
|
|
var WebXRState;
|
|
|
(function (WebXRState) {
|
|
|
/**
|
|
|
- * Transitioning to/from being in XR mode
|
|
|
+ * Transitioning to being in XR mode
|
|
|
+ */
|
|
|
+ WebXRState[WebXRState["ENTERING_XR"] = 0] = "ENTERING_XR";
|
|
|
+ /**
|
|
|
+ * Transitioning to non XR mode
|
|
|
*/
|
|
|
- WebXRState[WebXRState["TRANSITION"] = 0] = "TRANSITION";
|
|
|
+ WebXRState[WebXRState["EXITING_XR"] = 1] = "EXITING_XR";
|
|
|
/**
|
|
|
* In XR mode and presenting
|
|
|
*/
|
|
|
- WebXRState[WebXRState["IN_XR"] = 1] = "IN_XR";
|
|
|
+ WebXRState[WebXRState["IN_XR"] = 2] = "IN_XR";
|
|
|
/**
|
|
|
* Not entered XR mode
|
|
|
*/
|
|
|
- WebXRState[WebXRState["NOT_IN_XR"] = 2] = "NOT_IN_XR";
|
|
|
+ WebXRState[WebXRState["NOT_IN_XR"] = 3] = "NOT_IN_XR";
|
|
|
})(WebXRState = BABYLON.WebXRState || (BABYLON.WebXRState = {}));
|
|
|
/**
|
|
|
* Helper class used to enable XR
|
|
@@ -108762,18 +108794,35 @@ var BABYLON;
|
|
|
this.onStateChangedObservable = new BABYLON.Observable();
|
|
|
this._nonVRCamera = null;
|
|
|
this._originalSceneAutoClear = true;
|
|
|
+ this._supported = false;
|
|
|
this.camera = new BABYLON.WebXRCamera("", scene);
|
|
|
this._sessionManager = new BABYLON.WebXRSessionManager(scene);
|
|
|
this.container = new BABYLON.AbstractMesh("", scene);
|
|
|
- this._sessionManager.initialize();
|
|
|
}
|
|
|
+ WebXRExperienceHelper.prototype._setState = function (val) {
|
|
|
+ this.state = val;
|
|
|
+ this.onStateChangedObservable.notifyObservers(this.state);
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * Creates the experience helper
|
|
|
+ * @param scene the scene to attach the experience helper to
|
|
|
+ * @returns a promise for the experience helper
|
|
|
+ */
|
|
|
+ WebXRExperienceHelper.CreateAsync = function (scene) {
|
|
|
+ var helper = new WebXRExperienceHelper(scene);
|
|
|
+ return helper._sessionManager.initialize().then(function () {
|
|
|
+ helper._supported = true;
|
|
|
+ return helper;
|
|
|
+ }).catch(function () {
|
|
|
+ return helper;
|
|
|
+ });
|
|
|
+ };
|
|
|
/**
|
|
|
* Exits XR mode and returns the scene to its original state
|
|
|
* @returns promise that resolves after xr mode has exited
|
|
|
*/
|
|
|
WebXRExperienceHelper.prototype.exitXR = function () {
|
|
|
- this.state = WebXRState.TRANSITION;
|
|
|
- this.onStateChangedObservable.notifyObservers(this.state);
|
|
|
+ this._setState(WebXRState.EXITING_XR);
|
|
|
return this._sessionManager.exitXR();
|
|
|
};
|
|
|
/**
|
|
@@ -108784,12 +108833,7 @@ var BABYLON;
|
|
|
*/
|
|
|
WebXRExperienceHelper.prototype.enterXR = function (sessionCreationOptions, frameOfReference) {
|
|
|
var _this = this;
|
|
|
- this.state = WebXRState.TRANSITION;
|
|
|
- this.onStateChangedObservable.notifyObservers(this.state);
|
|
|
- this._createCanvas();
|
|
|
- if (!sessionCreationOptions.outputContext) {
|
|
|
- sessionCreationOptions.outputContext = this._outputCanvasContext;
|
|
|
- }
|
|
|
+ this._setState(WebXRState.ENTERING_XR);
|
|
|
return this._sessionManager.enterXR(sessionCreationOptions, frameOfReference).then(function () {
|
|
|
// Cache pre xr scene settings
|
|
|
_this._originalSceneAutoClear = _this.scene.autoClear;
|
|
@@ -108809,43 +108853,238 @@ var BABYLON;
|
|
|
_this.scene.autoClear = _this._originalSceneAutoClear;
|
|
|
_this.scene.activeCamera = _this._nonVRCamera;
|
|
|
_this._sessionManager.onXRFrameObservable.clear();
|
|
|
- _this._removeCanvas();
|
|
|
- _this.state = WebXRState.NOT_IN_XR;
|
|
|
- _this.onStateChangedObservable.notifyObservers(_this.state);
|
|
|
+ _this._setState(WebXRState.NOT_IN_XR);
|
|
|
});
|
|
|
- _this.state = WebXRState.IN_XR;
|
|
|
- _this.onStateChangedObservable.notifyObservers(_this.state);
|
|
|
+ _this._setState(WebXRState.IN_XR);
|
|
|
});
|
|
|
};
|
|
|
/**
|
|
|
+ * Checks if the creation options are supported by the xr session
|
|
|
+ * @param options creation options
|
|
|
+ * @returns true if supported
|
|
|
+ */
|
|
|
+ WebXRExperienceHelper.prototype.supportsSession = function (options) {
|
|
|
+ if (!this._supported) {
|
|
|
+ return Promise.resolve(false);
|
|
|
+ }
|
|
|
+ return this._sessionManager.supportsSession(options);
|
|
|
+ };
|
|
|
+ /**
|
|
|
* Disposes of the experience helper
|
|
|
*/
|
|
|
WebXRExperienceHelper.prototype.dispose = function () {
|
|
|
this.camera.dispose();
|
|
|
this.container.dispose();
|
|
|
- this._removeCanvas();
|
|
|
this.onStateChangedObservable.clear();
|
|
|
this._sessionManager.dispose();
|
|
|
};
|
|
|
- // create canvas used to mirror/vr xr content in fullscreen
|
|
|
- WebXRExperienceHelper.prototype._createCanvas = function () {
|
|
|
+ return WebXRExperienceHelper;
|
|
|
+ }());
|
|
|
+ BABYLON.WebXRExperienceHelper = WebXRExperienceHelper;
|
|
|
+})(BABYLON || (BABYLON = {}));
|
|
|
+
|
|
|
+//# sourceMappingURL=babylon.webXRExperienceHelper.js.map
|
|
|
+
|
|
|
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
|
+ return new (P || (P = Promise))(function (resolve, reject) {
|
|
|
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
|
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
|
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
|
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
|
+ });
|
|
|
+};
|
|
|
+var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
|
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
|
+ function verb(n) { return function (v) { return step([n, v]); }; }
|
|
|
+ function step(op) {
|
|
|
+ if (f) throw new TypeError("Generator is already executing.");
|
|
|
+ while (_) try {
|
|
|
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
|
+ if (y = 0, t) op = [op[0] & 2, t.value];
|
|
|
+ switch (op[0]) {
|
|
|
+ case 0: case 1: t = op; break;
|
|
|
+ case 4: _.label++; return { value: op[1], done: false };
|
|
|
+ case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
|
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
|
+ default:
|
|
|
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
|
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
|
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
|
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
|
+ if (t[2]) _.ops.pop();
|
|
|
+ _.trys.pop(); continue;
|
|
|
+ }
|
|
|
+ op = body.call(thisArg, _);
|
|
|
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
|
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
|
+ }
|
|
|
+};
|
|
|
+var BABYLON;
|
|
|
+(function (BABYLON) {
|
|
|
+ /**
|
|
|
+ * Options to create the webXR UI
|
|
|
+ */
|
|
|
+ var WebXREnterExitUIOptions = /** @class */ (function () {
|
|
|
+ function WebXREnterExitUIOptions() {
|
|
|
+ }
|
|
|
+ return WebXREnterExitUIOptions;
|
|
|
+ }());
|
|
|
+ BABYLON.WebXREnterExitUIOptions = WebXREnterExitUIOptions;
|
|
|
+ /**
|
|
|
+ * UI to allow the user to enter/exit XR mode
|
|
|
+ */
|
|
|
+ var WebXREnterExitUI = /** @class */ (function () {
|
|
|
+ function WebXREnterExitUI(scene, options) {
|
|
|
+ var _this = this;
|
|
|
+ this.scene = scene;
|
|
|
+ this._buttons = [];
|
|
|
+ this._overlay = document.createElement("div");
|
|
|
+ this._overlay.style.cssText = "z-index:11;position: absolute; right: 20px;bottom: 50px;";
|
|
|
+ if (options.customButtons) {
|
|
|
+ this._buttons = options.customButtons;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ var hmdBtn = document.createElement("button");
|
|
|
+ hmdBtn.style.cssText = "color: #868686; border-color: #868686; border-style: solid; margin-left: 10px; height: 50px; width: 80px; background-color: rgba(51,51,51,0.7); background-repeat:no-repeat; background-position: center; outline: none;";
|
|
|
+ hmdBtn.innerText = "HMD";
|
|
|
+ this._buttons.push({ element: hmdBtn, initializationOptions: { immersive: true } });
|
|
|
+ var windowBtn = document.createElement("button");
|
|
|
+ windowBtn.style.cssText = hmdBtn.style.cssText;
|
|
|
+ windowBtn.innerText = "Window";
|
|
|
+ this._buttons.push({ element: windowBtn, initializationOptions: { immersive: false, environmentIntegration: true, outputContext: options.outputCanvasContext } });
|
|
|
+ }
|
|
|
+ var renderCanvas = scene.getEngine().getRenderingCanvas();
|
|
|
+ if (renderCanvas && renderCanvas.parentNode) {
|
|
|
+ renderCanvas.parentNode.appendChild(this._overlay);
|
|
|
+ scene.onDisposeObservable.addOnce(function () {
|
|
|
+ _this.dispose();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * Creates UI to allow the user to enter/exit XR mode
|
|
|
+ * @param scene the scene to add the ui to
|
|
|
+ * @param helper the xr experience helper to enter/exit xr with
|
|
|
+ * @param options options to configure the UI
|
|
|
+ * @returns the created ui
|
|
|
+ */
|
|
|
+ WebXREnterExitUI.CreateAsync = function (scene, helper, options) {
|
|
|
+ var _this = this;
|
|
|
+ var ui = new WebXREnterExitUI(scene, options);
|
|
|
+ var supportedPromises = ui._buttons.map(function (btn) {
|
|
|
+ return helper.supportsSession(btn.initializationOptions);
|
|
|
+ });
|
|
|
+ return Promise.all(supportedPromises).then(function (results) {
|
|
|
+ results.forEach(function (supported, i) {
|
|
|
+ if (supported) {
|
|
|
+ ui._overlay.appendChild(ui._buttons[i].element);
|
|
|
+ ui._buttons[i].element.onclick = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
|
+ return __generator(this, function (_a) {
|
|
|
+ switch (_a.label) {
|
|
|
+ case 0:
|
|
|
+ if (!(helper.state == BABYLON.WebXRState.IN_XR)) return [3 /*break*/, 2];
|
|
|
+ return [4 /*yield*/, helper.exitXR()];
|
|
|
+ case 1:
|
|
|
+ _a.sent();
|
|
|
+ return [2 /*return*/];
|
|
|
+ case 2:
|
|
|
+ if (!(helper.state == BABYLON.WebXRState.NOT_IN_XR)) return [3 /*break*/, 4];
|
|
|
+ return [4 /*yield*/, helper.enterXR(ui._buttons[i].initializationOptions, "eye-level")];
|
|
|
+ case 3:
|
|
|
+ _a.sent();
|
|
|
+ _a.label = 4;
|
|
|
+ case 4: return [2 /*return*/];
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }); };
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * Disposes of the object
|
|
|
+ */
|
|
|
+ WebXREnterExitUI.prototype.dispose = function () {
|
|
|
+ var renderCanvas = this.scene.getEngine().getRenderingCanvas();
|
|
|
+ if (renderCanvas && renderCanvas.parentNode && renderCanvas.parentNode.contains(this._overlay)) {
|
|
|
+ renderCanvas.parentNode.removeChild(this._overlay);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return WebXREnterExitUI;
|
|
|
+ }());
|
|
|
+ BABYLON.WebXREnterExitUI = WebXREnterExitUI;
|
|
|
+})(BABYLON || (BABYLON = {}));
|
|
|
+
|
|
|
+//# sourceMappingURL=babylon.webXREnterExitUI.js.map
|
|
|
+
|
|
|
+var BABYLON;
|
|
|
+(function (BABYLON) {
|
|
|
+ /**
|
|
|
+ * Creates a canvas that is added/removed from the webpage when entering/exiting XR
|
|
|
+ */
|
|
|
+ var WebXRManagedOutputCanvas = /** @class */ (function () {
|
|
|
+ /**
|
|
|
+ * Initializes the canvas to be added/removed upon entering/exiting xr
|
|
|
+ * @param helper the xr experience helper used to trigger adding/removing of the canvas
|
|
|
+ * @param canvas The canvas to be added/removed (If not specified a full screen canvas will be created)
|
|
|
+ */
|
|
|
+ function WebXRManagedOutputCanvas(helper, canvas) {
|
|
|
+ var _this = this;
|
|
|
+ this._canvas = null;
|
|
|
+ /**
|
|
|
+ * xrpresent context of the canvas which can be used to display/mirror xr content
|
|
|
+ */
|
|
|
+ this.canvasContext = null;
|
|
|
+ if (!canvas) {
|
|
|
+ canvas = document.createElement('canvas');
|
|
|
+ canvas.style.cssText = "position:absolute; bottom:0px;right:0px;z-index:10;width:100%;height:100%;background-color: #48989e;";
|
|
|
+ }
|
|
|
+ this._setManagedOutputCanvas(canvas);
|
|
|
+ helper.onStateChangedObservable.add(function (stateInfo) {
|
|
|
+ if (stateInfo == BABYLON.WebXRState.ENTERING_XR) {
|
|
|
+ // The canvas is added to the screen before entering XR because currently the xr session must be initialized while the canvas is added render properly
|
|
|
+ _this._addCanvas();
|
|
|
+ }
|
|
|
+ else if (helper.state == BABYLON.WebXRState.NOT_IN_XR) {
|
|
|
+ _this._removeCanvas();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * Disposes of the object
|
|
|
+ */
|
|
|
+ WebXRManagedOutputCanvas.prototype.dispose = function () {
|
|
|
+ this._removeCanvas();
|
|
|
+ this._setManagedOutputCanvas(null);
|
|
|
+ };
|
|
|
+ WebXRManagedOutputCanvas.prototype._setManagedOutputCanvas = function (canvas) {
|
|
|
this._removeCanvas();
|
|
|
- this._outputCanvas = document.createElement('canvas');
|
|
|
- this._outputCanvas.style.cssText = "position:absolute; bottom:0px;right:0px;z-index:10;width:100%;height:100%;background-color: #48989e;";
|
|
|
- document.body.appendChild(this._outputCanvas);
|
|
|
- this._outputCanvasContext = this._outputCanvas.getContext('xrpresent');
|
|
|
+ if (!canvas) {
|
|
|
+ this._canvas = null;
|
|
|
+ this.canvasContext = null;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ this._canvas = canvas;
|
|
|
+ this.canvasContext = this._canvas.getContext('xrpresent');
|
|
|
+ }
|
|
|
};
|
|
|
- WebXRExperienceHelper.prototype._removeCanvas = function () {
|
|
|
- if (this._outputCanvas && document.body.contains(this._outputCanvas)) {
|
|
|
- document.body.removeChild(this._outputCanvas);
|
|
|
+ WebXRManagedOutputCanvas.prototype._addCanvas = function () {
|
|
|
+ if (this._canvas) {
|
|
|
+ document.body.appendChild(this._canvas);
|
|
|
}
|
|
|
};
|
|
|
- return WebXRExperienceHelper;
|
|
|
+ WebXRManagedOutputCanvas.prototype._removeCanvas = function () {
|
|
|
+ if (this._canvas && document.body.contains(this._canvas)) {
|
|
|
+ document.body.removeChild(this._canvas);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return WebXRManagedOutputCanvas;
|
|
|
}());
|
|
|
- BABYLON.WebXRExperienceHelper = WebXRExperienceHelper;
|
|
|
+ BABYLON.WebXRManagedOutputCanvas = WebXRManagedOutputCanvas;
|
|
|
})(BABYLON || (BABYLON = {}));
|
|
|
|
|
|
-//# sourceMappingURL=babylon.webXRExperienceHelper.js.map
|
|
|
+//# sourceMappingURL=babylon.webXRManagedOutputCanvas.js.map
|
|
|
|
|
|
// Mainly based on these 2 articles :
|
|
|
// Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS : http://blogs.msdn.com/b/davrous/archive/2013/02/22/creating-an-universal-virtual-touch-joystick-working-for-all-touch-models-thanks-to-hand-js.aspx
|
|
@@ -119743,6 +119982,15 @@ var BABYLON;
|
|
|
if (webVROptions === void 0) { webVROptions = {}; }
|
|
|
return new BABYLON.VRExperienceHelper(this, webVROptions);
|
|
|
};
|
|
|
+ BABYLON.Scene.prototype.createDefaultXRExperienceAsync = function () {
|
|
|
+ var _this = this;
|
|
|
+ return BABYLON.WebXRExperienceHelper.CreateAsync(this).then(function (helper) {
|
|
|
+ var outputCanvas = new BABYLON.WebXRManagedOutputCanvas(helper);
|
|
|
+ return BABYLON.WebXREnterExitUI.CreateAsync(_this, helper, { outputCanvasContext: outputCanvas.canvasContext }).then(function (ui) {
|
|
|
+ return helper;
|
|
|
+ });
|
|
|
+ });
|
|
|
+ };
|
|
|
})(BABYLON || (BABYLON = {}));
|
|
|
|
|
|
//# sourceMappingURL=babylon.sceneHelpers.js.map
|