David Catuhe 6 роки тому
батько
коміт
97038451c9

Різницю між файлами не показано, бо вона завелика
+ 15500 - 15500
Playground/babylon.d.txt


Різницю між файлами не показано, бо вона завелика
+ 15499 - 15499
dist/preview release/babylon.d.ts


Різницю між файлами не показано, бо вона завелика
+ 1 - 1
dist/preview release/babylon.js


+ 77 - 60
dist/preview release/babylon.max.js

@@ -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;
         };
         /**
@@ -12925,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) {
@@ -13033,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
@@ -51821,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);
                 }

+ 77 - 60
dist/preview release/babylon.no-module.max.js

@@ -7470,16 +7470,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
         /**
@@ -7558,52 +7572,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;
         };
         /**
@@ -12892,7 +12908,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) {
@@ -13000,9 +13016,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
@@ -51788,7 +51805,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);
                 }

Різницю між файлами не показано, бо вона завелика
+ 1 - 1
dist/preview release/babylon.worker.js


+ 77 - 60
dist/preview release/es6.js

@@ -7470,16 +7470,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
         /**
@@ -7558,52 +7572,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;
         };
         /**
@@ -12892,7 +12908,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) {
@@ -13000,9 +13016,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
@@ -51788,7 +51805,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);
                 }

+ 19 - 5
dist/preview release/viewer/babylon.viewer.d.ts

@@ -168,11 +168,11 @@ declare module BabylonViewer {
                 * Mainly used for help and errors
                 * @param subScreen the name of the subScreen. Those can be defined in the configuration object
                 */
-            showOverlayScreen(subScreen: string): Promise<string> | Promise<Template>;
+            showOverlayScreen(subScreen: string): Promise<Template> | Promise<string>;
             /**
                 * Hide the overlay screen.
                 */
-            hideOverlayScreen(): Promise<string> | Promise<Template>;
+            hideOverlayScreen(): Promise<Template> | Promise<string>;
             /**
                 * show the viewer (in case it was hidden)
                 *
@@ -189,11 +189,11 @@ declare module BabylonViewer {
                 * Show the loading screen.
                 * The loading screen can be configured using the configuration object
                 */
-            showLoadingScreen(): Promise<string> | Promise<Template>;
+            showLoadingScreen(): Promise<Template> | Promise<string>;
             /**
                 * Hide the loading screen
                 */
-            hideLoadingScreen(): Promise<string> | Promise<Template>;
+            hideLoadingScreen(): Promise<Template> | Promise<string>;
             dispose(): void;
             protected _onConfigurationLoaded(configuration: ViewerConfiguration): void;
     }
@@ -924,7 +924,7 @@ declare module BabylonViewer {
       * @param name the name of the custom optimizer configuration
       * @param upgrade set to true if you want to upgrade optimizer and false if you want to degrade
       */
-    export function getCustomOptimizerByName(name: string, upgrade?: boolean): (sceneManager: SceneManager) => boolean;
+    export function getCustomOptimizerByName(name: string, upgrade?: boolean): typeof extendedUpgrade;
     export function registerCustomOptimizer(name: string, optimizer: (sceneManager: SceneManager) => boolean): void;
 }
 declare module BabylonViewer {
@@ -1558,6 +1558,20 @@ declare module BabylonViewer {
     export function addLoaderPlugin(name: string, plugin: ILoaderPlugin): void;
 }
 declare module BabylonViewer {
+    /**
+        * A custom upgrade-oriented function configuration for the scene optimizer.
+        *
+        * @param viewer the viewer to optimize
+        */
+    export function extendedUpgrade(sceneManager: SceneManager): boolean;
+    /**
+        * A custom degrade-oriented function configuration for the scene optimizer.
+        *
+        * @param viewer the viewer to optimize
+        */
+    export function extendedDegrade(sceneManager: SceneManager): boolean;
+}
+declare module BabylonViewer {
 }
 declare module BabylonViewer {
     export interface IEnvironmentMapConfiguration {

Різницю між файлами не показано, бо вона завелика
+ 1 - 1
dist/preview release/viewer/babylon.viewer.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 1
dist/preview release/viewer/babylon.viewer.max.js


+ 22 - 5
dist/preview release/viewer/babylon.viewer.module.d.ts

@@ -200,11 +200,11 @@ declare module 'babylonjs-viewer/viewer/defaultViewer' {
                 * Mainly used for help and errors
                 * @param subScreen the name of the subScreen. Those can be defined in the configuration object
                 */
-            showOverlayScreen(subScreen: string): Promise<string> | Promise<Template>;
+            showOverlayScreen(subScreen: string): Promise<Template> | Promise<string>;
             /**
                 * Hide the overlay screen.
                 */
-            hideOverlayScreen(): Promise<string> | Promise<Template>;
+            hideOverlayScreen(): Promise<Template> | Promise<string>;
             /**
                 * show the viewer (in case it was hidden)
                 *
@@ -221,11 +221,11 @@ declare module 'babylonjs-viewer/viewer/defaultViewer' {
                 * Show the loading screen.
                 * The loading screen can be configured using the configuration object
                 */
-            showLoadingScreen(): Promise<string> | Promise<Template>;
+            showLoadingScreen(): Promise<Template> | Promise<string>;
             /**
                 * Hide the loading screen
                 */
-            hideLoadingScreen(): Promise<string> | Promise<Template>;
+            hideLoadingScreen(): Promise<Template> | Promise<string>;
             dispose(): void;
             protected _onConfigurationLoaded(configuration: ViewerConfiguration): void;
     }
@@ -985,13 +985,14 @@ declare module 'babylonjs-viewer/templating/viewerTemplatePlugin' {
 }
 
 declare module 'babylonjs-viewer/optimizer/custom' {
+    import { extendedUpgrade } from "babylonjs-viewer/optimizer/custom/extended";
     import { SceneManager } from "babylonjs-viewer/managers/sceneManager";
     /**
       *
       * @param name the name of the custom optimizer configuration
       * @param upgrade set to true if you want to upgrade optimizer and false if you want to degrade
       */
-    export function getCustomOptimizerByName(name: string, upgrade?: boolean): (sceneManager: SceneManager) => boolean;
+    export function getCustomOptimizerByName(name: string, upgrade?: boolean): typeof extendedUpgrade;
     export function registerCustomOptimizer(name: string, optimizer: (sceneManager: SceneManager) => boolean): void;
 }
 
@@ -1662,6 +1663,22 @@ declare module 'babylonjs-viewer/loader/plugins' {
     export function addLoaderPlugin(name: string, plugin: ILoaderPlugin): void;
 }
 
+declare module 'babylonjs-viewer/optimizer/custom/extended' {
+    import { SceneManager } from 'babylonjs-viewer/managers/sceneManager';
+    /**
+        * A custom upgrade-oriented function configuration for the scene optimizer.
+        *
+        * @param viewer the viewer to optimize
+        */
+    export function extendedUpgrade(sceneManager: SceneManager): boolean;
+    /**
+        * A custom degrade-oriented function configuration for the scene optimizer.
+        *
+        * @param viewer the viewer to optimize
+        */
+    export function extendedDegrade(sceneManager: SceneManager): boolean;
+}
+
 declare module 'babylonjs-viewer/configuration/interfaces' {
     export * from 'babylonjs-viewer/configuration/interfaces/cameraConfiguration';
     export * from 'babylonjs-viewer/configuration/interfaces/colorGradingConfiguration';

+ 1 - 0
dist/preview release/what's new.md

@@ -21,6 +21,7 @@
 
 ### Core Engine
 
+- Improved shader precision detection ([Deltakosh](https://github.com/deltakosh))
 - Added support for bone matrix texture. Now skeletons will use a texture instead of uniforms when possible ([Deltakosh](https://github.com/deltakosh))
 - Refactored of the SolidParticleSystem code for performance and code quality improvement ([barroij](https://github.com/barroij))
 - Added utility function `Tools.BuildArray` for array initialisation ([barroij](https://github.com/barroij))

+ 1 - 1
src/Cameras/babylon.arcRotateCamera.ts

@@ -598,7 +598,7 @@ module BABYLON {
 
         protected _getTargetPosition(): Vector3 {
             if (this._targetHost && this._targetHost.getAbsolutePosition) {
-                var pos: Vector3 = this._targetHost.getAbsolutePosition();
+                var pos: Vector3 = this._targetHost.absolutePosition;
                 if (this._targetBoundingCenter) {
                     pos.addToRef(this._targetBoundingCenter, this._target);
                 } else {

+ 5 - 4
src/Engine/babylon.engine.ts

@@ -1354,7 +1354,7 @@ module 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) {
@@ -1461,10 +1461,11 @@ module BABYLON {
             if (this._caps.etc1) { this.texturesSupported.push('-etc1.ktx'); }
 
             if (this._gl.getShaderPrecisionFormat) {
-                var highp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);
+                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 (highp) {
-                    this._caps.highPrecisionShaderSupported = highp.precision !== 0;
+                if (vertex_highp && fragment_highp) {
+                    this._caps.highPrecisionShaderSupported = vertex_highp.precision !== 0 && fragment_highp.precision !== 0;
                 }
             }
 

+ 88 - 61
src/Math/babylon.math.ts

@@ -4300,19 +4300,31 @@ module BABYLON {
             }
 
             const m = this._m;
-            const temp1 = m[10] * m[15] - m[11] * m[14];
-            const temp2 = m[9] * m[15] - m[11] * m[13];
-            const temp3 = m[9] * m[14] - m[10] * m[13];
-            const temp4 = m[8] * m[15] - m[11] * m[12];
-            const temp5 = m[8] * m[14] - m[10] * m[12];
-            const 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)
-            );
+            const m00 = m[0], m01 = m[1], m02 = m[2], m03 = m[3];
+            const m10 = m[4], m11 = m[5], m12 = m[6], m13 = m[7];
+            const m20 = m[8], m21 = m[9], m22 = m[10], m23 = m[11];
+            const 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.
+
+            const det_22_33 = m22 * m33 - m32 * m23;
+            const det_21_33 = m21 * m33 - m31 * m23;
+            const det_21_32 = m21 * m32 - m31 * m22;
+            const det_20_33 = m20 * m33 - m30 * m23;
+            const det_20_32 = m20 * m32 - m22 * m30;
+            const det_20_31 = m20 * m31 - m30 * m21;
+            const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);
+            const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);
+            const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);
+            const 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
@@ -4405,55 +4417,70 @@ module BABYLON {
                 return this;
             }
 
+            // the inverse of a Matrix is the transpose of cofactor matrix divided by the determinant
             const m = this._m;
-            const l1 = m[0], l2 = m[1], l3 = m[2], l4 = m[3];
-            const l5 = m[4], l6 = m[5], l7 = m[6], l8 = m[7];
-            const l9 = m[8], l10 = m[9], l11 = m[10], l12 = m[11];
-            const l13 = m[12], l14 = m[13], l15 = m[14], l16 = m[15];
-
-            const l17 = l11 * l16 - l12 * l15;
-            const l18 = l10 * l16 - l12 * l14;
-            const l19 = l10 * l15 - l11 * l14;
-            const l20 = l9 * l16 - l12 * l13;
-            const l21 = l9 * l15 - l11 * l13;
-            const l22 = l9 * l14 - l10 * l13;
-            const l23 = l6 * l17 - l7 * l18 + l8 * l19;
-            const l24 = -(l5 * l17 - l7 * l20 + l8 * l21);
-            const l25 = l5 * l18 - l6 * l20 + l8 * l22;
-            const l26 = -(l5 * l19 - l6 * l21 + l7 * l22);
-            const l27 = 1 / (l1 * l23 + l2 * l24 + l3 * l25 + l4 * l26);
-            const l28 = l7 * l16 - l8 * l15;
-            const l29 = l6 * l16 - l8 * l14;
-            const l30 = l6 * l15 - l7 * l14;
-            const l31 = l5 * l16 - l8 * l13;
-            const l32 = l5 * l15 - l7 * l13;
-            const l33 = l5 * l14 - l6 * l13;
-            const l34 = l7 * l12 - l8 * l11;
-            const l35 = l6 * l12 - l8 * l10;
-            const l36 = l6 * l11 - l7 * l10;
-            const l37 = l5 * l12 - l8 * l9;
-            const l38 = l5 * l11 - l7 * l9;
-            const l39 = l5 * l10 - l6 * l9;
-
-            const 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();
+            const m00 = m[0], m01 = m[1], m02 = m[2], m03 = m[3];
+            const m10 = m[4], m11 = m[5], m12 = m[6], m13 = m[7];
+            const m20 = m[8], m21 = m[9], m22 = m[10], m23 = m[11];
+            const m30 = m[12], m31 = m[13], m32 = m[14], m33 = m[15];
+
+            const det_22_33 = m22 * m33 - m32 * m23;
+            const det_21_33 = m21 * m33 - m31 * m23;
+            const det_21_32 = m21 * m32 - m31 * m22;
+            const det_20_33 = m20 * m33 - m30 * m23;
+            const det_20_32 = m20 * m32 - m22 * m30;
+            const det_20_31 = m20 * m31 - m30 * m21;
+
+            const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);
+            const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);
+            const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);
+            const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);
+
+            const det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;
+
+            if (det === 0) {
+                // not invertible
+                other.copyFrom(this);
+                return this;
+            }
+
+            const detInv = 1 / det;
+            const det_12_33 = m12 * m33 - m32 * m13;
+            const det_11_33 = m11 * m33 - m31 * m13;
+            const det_11_32 = m11 * m32 - m31 * m12;
+            const det_10_33 = m10 * m33 - m30 * m13;
+            const det_10_32 = m10 * m32 - m30 * m12;
+            const det_10_31 = m10 * m31 - m30 * m11;
+            const det_12_23 = m12 * m23 - m22 * m13;
+            const det_11_23 = m11 * m23 - m21 * m13;
+            const det_11_22 = m11 * m22 - m21 * m12;
+            const det_10_23 = m10 * m23 - m20 * m13;
+            const det_10_22 = m10 * m22 - m20 * m12;
+            const det_10_21 = m10 * m21 - m20 * m11;
+
+            const cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32);
+            const cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32);
+            const cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31);
+            const cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31);
+
+            const cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32);
+            const cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32);
+            const cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31);
+            const cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31);
+
+            const cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22);
+            const cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22);
+            const cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21);
+            const 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;
         }