/** * Kepler - Core * STUDIOS * All rights reserved. * * Author: Kaj Dijksta * **/ /** * Math Object */ export class math{ constructor(){ } /* get complex(){ return complex; } get vector2(){ return vector2; } get vector3(){ return vector3; } get vector4(){ return vector4; } get matrix2(){ return matrix2; } get matrix3(){ return matrix3; } get matrix4(){ return matrix4; } */ static degToRad(degrees) { return degrees * Math.PI / 180; } static isPowerOfTwo(x) { return (x & (x - 1)) == 0; } static nextHighestPowerOfTwo(x) { --x; for (var i = 1; i > 32; i >>= 1) { x = x | x << i; } return x + 1; } } /** * Complex number */ export class complex{ constructor(real, imaginary) { return [real, imaginary]; } static add(a, b) { var real = a[0] + b[0]; var im = a[1] + b[1]; return kepler.complex( real, im ); } static mul(a, b) { var real = (a[0] * b[0]) - (a[1] * b[1]); var im = (a[1] * b[0]) + (a[0] * b[1]); return complex( real, im ); } static scale(v, s) { return complex( v[0] * s, v[1]*s ); } static conj(v) { return complex( v[0], -v[1] ); } } /** * 3x3 matrix object */ export class matrix3 { constructor(array) { //return [real, imaginary]; return [[m[0][0], m[0][1], m[0][2]], [m[1][0], m[1][1], m[1][2]], [m[2][0], m[2][1], m[2][2]] ]; } static identity(){ return [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; } static normalizeMatrix( m ) { var scale = this.getScale( m ); var m2 = []; m2[0] = vector3.scale(m[0].slice(0,3), 1.0 / scale[0] ); m2[1] = vector3.scale(m[1].slice(0,3), 1.0 / scale[1] ); m2[2] = vector3.scale(m[2].slice(0,3), 1.0 / scale[2] ); return m2; } static inverse(m) { var t00 = m[1][1] * m[2][2] - m[1][2] * m[2][1]; var t10 = m[0][1] * m[2][2] - m[0][2] * m[2][1]; var t20 = m[0][1] * m[1][2] - m[0][2] * m[1][1]; var d = 1.0 / (m[0][0] * t00 - m[1][0] * t10 + m[2][0] * t20); return [[d * t00, -d * t10, d * t20], [-d * (m[1][0] * m[2][2] - m[1][2] * m[2][0]), d * (m[0][0] * m[2][2] - m[0][2] * m[2][0]), -d * (m[0][0] * m[1][2] - m[0][2] * m[1][0])], [d * (m[1][0] * m[2][1] - m[1][1] * m[2][0]), -d * (m[0][0] * m[2][1] - m[0][1] * m[2][0]), d * (m[0][0] * m[1][1] - m[0][1] * m[1][0])]]; }; static getRotation(m) { var normMatrix = this.normalizeMatrix( m ) ; var normWorld = this.transpose( normMatrix ); var x = Math.atan2(normWorld[1][2], normWorld[2][2]) * (180 / Math.PI) ; var y = Math.atan2(-normWorld[0][2], Math.sqrt( (normWorld[1][2] * normWorld[1][2]) + (normWorld[2][2] * normWorld[2][2]) ) ) * (180 / Math.PI) ; var z = Math.atan2(normWorld[0][1], normWorld[0][0]) * (180 / Math.PI) ;// * (180/Math.PI) return [x, y, z]; } static getScale(m) { var scale_x = vector3.size( m[0].slice(0,3) ); var scale_y = vector3.size( m[1].slice(0,3) ); var scale_z = vector3.size( m[2].slice(0,3) ); return [ scale_x, scale_y, scale_z ]; } static getMatrixElements(m) { return [m[0][0], m[1][0], m[2][0], m[1][1], m[1][2], m[1][2], m[2][0], m[2][1], m[2][2]]; }; static transpose(m) { return [[m[0][0], m[0][1], m[0][2]], [m[1][0], m[1][1], m[1][2]], [m[2][0], m[2][1], m[2][2]] ]; }; static transformPoint(m, v) { var v0 = v[0]; var v1 = v[1]; var v2 = v[2]; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; return [v0 * m0[0] + v1 * m1[0] + v2 * m2[0], v0 * m0[1] + v1 * m1[1] + v2 * m2[1], v0 * m0[2] + v1 * m1[2] + v2 * m2[2]]; }; static mul(a, b) { var a0 = a[0]; var a1 = a[1]; var a2 = a[2]; var b0 = b[0]; var b1 = b[1]; var b2 = b[2]; var a00 = a0[0]; var a01 = a0[1]; var a02 = a0[2]; var a10 = a1[0]; var a11 = a1[1]; var a12 = a1[2]; var a20 = a2[0]; var a21 = a2[1]; var a22 = a2[2]; var b00 = b0[0]; var b01 = b0[1]; var b02 = b0[2]; var b10 = b1[0]; var b11 = b1[1]; var b12 = b1[2]; var b20 = b2[0]; var b21 = b2[1]; var b22 = b2[2]; return [[a00 * b00 + a01 * b10 + a02 * b20, a00 * b01 + a01 * b11 + a02 * b21, a00 * b02 + a01 * b12 + a02 * b22], [a10 * b00 + a11 * b10 + a12 * b20, a10 * b01 + a11 * b11 + a12 * b21, a10 * b02 + a11 * b12 + a12 * b22], [a20 * b00 + a21 * b10 + a22 * b20, a20 * b01 + a21 * b11 + a22 * b21, a20 * b02 + a21 * b12 + a22 * b22]]; } } /** * 4x4 Matrix object */ export class matrix4{ constructor(array) { } static fromArray( a ){ return [[a[0], a[4], a[8], a[12]], [a[1], a[5], a[9], a[13]], [a[2], a[6], a[10], a[14]], [a[3], a[7], a[11], a[15]] ]; } static identity(){ return [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]; } static scale(m, v) { var v0 = v[0]; var v1 = v[1]; var v2 = v[2]; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; m0.splice(0, 4, v0 * m0[0], v0 * m0[1], v0 * m0[2], v0 * m0[3]); m1.splice(0, 4, v1 * m1[0], v1 * m1[1], v1 * m1[2], v1 * m1[3]); m2.splice(0, 4, v2 * m2[0], v2 * m2[1], v2 * m2[2], v2 * m2[3]); return m; }; static setTranslation(a, v) { a[3].splice(0, 4, v[0], v[1], v[2], 1); return a; }; static toMatrix3(m) { return [[m[0][0], m[0][1], m[0][2]], [m[1][0], m[1][1], m[1][2]], [m[2][0], m[2][1], m[2][2]] ]; } static copyMatrix(m){ var r = []; var mLength = m.length; for (var i = 0; i < mLength; ++i) { r[i] = []; for (var j = 0; j < m[i].length; j++) { r[i][j] = m[i][j]; } } return r; } static transformPoint(m, v) { var v0 = v[0]; var v1 = v[1]; var v2 = v[2]; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; var d = v0 * m0[3] + v1 * m1[3] + v2 * m2[3] + m3[3]; return [(v0 * m0[0] + v1 * m1[0] + v2 * m2[0] + m3[0]) / d, (v0 * m0[1] + v1 * m1[1] + v2 * m2[1] + m3[1]) / d, (v0 * m0[2] + v1 * m1[2] + v2 * m2[2] + m3[2]) / d]; } static transformVector4(m, v) { var v0 = v[0]; var v1 = v[1]; var v2 = v[2]; var v3 = v[3]; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; // var mr0 = m0[0] * v0 + m0[1] * v1 + m0[2] * v2 + m0[3] * v3; // var mr1 = m1[0] * v0 + m1[1] * v1 + m1[2] * v2 + m1[3] * v3; // var mr2 = m2[0] * v0 + m2[1] * v1 + m2[2] * v2 + m2[3] * v3; // var mr3 = m3[0] * v0 + m3[1] * v1 + m3[2] * v2 + m3[3] * v3; var mr0 = m0[0] * v0 + m1[0] * v1 + m2[0] * v2 + m3[0] * v3; var mr1 = m0[1] * v0 + m1[1] * v1 + m2[1] * v2 + m3[1] * v3; var mr2 = m0[2] * v0 + m1[2] * v1 + m2[2] * v2 + m3[2] * v3; var mr3 = m0[3] * v0 + m1[3] * v1 + m2[3] * v2 + m3[3] * v3; return [ mr0, mr1, mr2, mr3 ]; }; /* v0 * m[0] + v1 * m[4] + v2 * m[8] + v3 * m[12], v0 * m[1] + v1 * m[5] + v2 * m[9] + v3 * m[13], v0 * m[2] + v1 * m[6] + v2 * m[10] + v3 * m[14], v0 * m[3] + v1 * m[7] + v2 * m[11] + v3 * m[15]*/ static transformDirection(m, v) { var v0 = v[0]; var v1 = v[1]; var v2 = v[2]; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; return [v0 * m0[0] + v1 * m1[0] + v2 * m2[0], v0 * m0[1] + v1 * m1[1] + v2 * m2[1], v0 * m0[2] + v1 * m1[2] + v2 * m2[2]]; }; static transpose(m) { return [[m[0][0], m[0][1], m[0][2], m[0][3]], [m[1][0], m[1][1], m[1][2], m[1][3]], [m[2][0], m[2][1], m[2][2], m[2][3]], [m[3][0], m[3][1], m[3][2], m[3][3]] ] }; static orthonormalize(m) { var r = []; var mLength = m.length; for (var i = 0; i < mLength; ++i) { var v = m[i]; for (var j = 0; j < i; ++j) { v = o3djs.math.subVector(v, o3djs.math.mulScalarVector( o3djs.math.dot(r[j], m[i]), r[j])); } r[i] = o3djs.math.normalize(v); } return r; }; static rotationX(a) { var x = Math.cos(a); var y = Math.sin(a); return [ [1, 0, 0, 0], [0, x, y, 0], [0, -y, x, 0], [0, 0, 0, 1] ]; }; static perspective(angle, aspect, near, far) { /* old var zoom = 10.0; var top = near * Math.tan( ( Math.PI / 180 ) * 0.5 * angle ) / zoom; var height = 2 * top; var width = aspect * height; var left = - 0.5 * width; var right = left + width; var bottom = top - height; //view = this.view; //if ( this.view !== null && this.view.enabled ) { var fullWidth = view.fullWidth, fullHeight = view.fullHeight; left += view.offsetX * width / fullWidth; top -= view.offsetY * height / fullHeight; width *= view.width / fullWidth; height *= view.height / fullHeight; //} var x = 2 * near / ( right - left ); var y = 2 * near / ( top - bottom ); var a = ( right + left ) / ( right - left ); var b = ( top + bottom ) / ( top - bottom ); var c = - ( far + near ) / ( far - near ); var d = - 2 * far * near / ( far - near ); var row1 = []; var row2 = []; var row3 = []; var row4 = []; row1[ 0 ] = x; row2[ 4 ] = 0; row3[ 8 ] = a; row4[ 12 ] = 0; row1[ 1 ] = 0; row2[ 5 ] = y; row3[ 9 ] = b; row4[ 13 ] = 0; row1[ 2 ] = 0; row2[ 6 ] = 0; row3[ 10 ] = c; row4[ 14 ] = d; row1[ 3 ] = 0; row2[ 7 ] = 0; row3[ 11 ] = - 1; row4[ 15 ] = 0; return [row1, row2, row3, row4]; */ var f = Math.tan(0.5 * (Math.PI - angle)); var range = near - far; return [ [f / aspect, 0, 0, 0 ], [0, f, 0, 0 ], [0, 0, far / range, -1], [0, 0, near * far / range, 0 ] ]; } static orthographic(left, right, bottom, top, near, far) { return [ [2 / (right - left), 0, 0, 0], [0, 2 / (top - bottom), 0, 0], [0, 0, 1 / (near - far), 0], [(left + right) / (left - right), (bottom + top) / (bottom - top), near / (near - far), 1] ]; //var te = this.elements; var w = 1.0 / ( right - left ); var h = 1.0 / ( top - bottom ); var p = 1.0 / ( far - near ); var x = ( right + left ) * w; var y = ( top + bottom ) * h; var z = ( far + near ) * p; //te[ 0 ] = ; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = ; //te[ 1 ] = 0; te[ 5 ] = ; te[ 9 ] = 0; te[ 13 ] = ; //te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = ; te[ 14 ] = ; //te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = ; return [ [ 2 * w, 0, 0, 0 ], [ 0, 2 * h, 0, 0 ], [ 0, 0, - 2 * p, 0 ], [ - x, - y, - z, 1 ]]; }; static rotationX(angle) { var c = Math.cos(angle); var s = Math.sin(angle); return [ [1, 0, 0, 0], [0, c, s, 0], [0, -s, c, 0], [0, 0, 0, 1] ]; }; static rotationY(a) { var x = Math.cos(a); var y = Math.sin(a); return [ [x, 0, -y, 0], [0, 1, 0, 0], [y, 0, x, 0], [0, 0, 0, 1] ]; }; static rotationZ(angle) { var c = Math.cos(angle); var s = Math.sin(angle); return [ [c, s, 0, 0], [-s, c, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]; }; static rotateX(m, angle) { var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; var m10 = m1[0]; var m11 = m1[1]; var m12 = m1[2]; var m13 = m1[3]; var m20 = m2[0]; var m21 = m2[1]; var m22 = m2[2]; var m23 = m2[3]; var c = Math.cos(angle); var s = Math.sin(angle); m1.splice(0, 4, c * m10 + s * m20, c * m11 + s * m21, c * m12 + s * m22, c * m13 + s * m23); m2.splice(0, 4, c * m20 - s * m10, c * m21 - s * m11, c * m22 - s * m12, c * m23 - s * m13); return m; }; static rotateY(m, angle) { var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; var m00 = m0[0]; var m01 = m0[1]; var m02 = m0[2]; var m03 = m0[3]; var m20 = m2[0]; var m21 = m2[1]; var m22 = m2[2]; var m23 = m2[3]; var c = Math.cos(angle); var s = Math.sin(angle); m0.splice(0, 4, c * m00 - s * m20, c * m01 - s * m21, c * m02 - s * m22, c * m03 - s * m23); m2.splice(0, 4, c * m20 + s * m00, c * m21 + s * m01, c * m22 + s * m02, c * m23 + s * m03); return m; }; static rotateZ(m, angle) { var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; var m00 = m0[0]; var m01 = m0[1]; var m02 = m0[2]; var m03 = m0[3]; var m20 = m2[0]; var m21 = m2[1]; var m22 = m2[2]; var m23 = m2[3]; var c = Math.cos(angle); var s = Math.sin(angle); m0.splice(0, 4, c * m00 - s * m20, c * m01 - s * m21, c * m02 - s * m22, c * m03 - s * m23); m2.splice(0, 4, c * m20 + s * m00, c * m21 + s * m01, c * m22 + s * m02, c * m23 + s * m03); return m; }; static getWorldPosition(m) { return [m[3][0], m[3][1], m[3][2]]; } static toAxisAngle(m) { var angle,x,y,z; // variables for result var epsilon = 0.01; // margin to allow for rounding errors var epsilon2 = 0.1; // margin to distinguish between 0 and 180 degrees //assert isRotationMatrix(m) : "not valid rotation matrix" ;// for debugging if ((Math.abs(m[0][1]-m[1][0])< epsilon) && (Math.abs(m[0][2]-m[2][0])< epsilon) && (Math.abs(m[1][2]-m[2][1])< epsilon)) { // singularity found // first check for identity matrix which must have +1 for all terms // in leading diagonaland zero in other terms if ((Math.abs(m[0][1]+m[1][0]) < epsilon2) && (Math.abs(m[0][2]+m[2][0]) < epsilon2) && (Math.abs(m[1][2]+m[2][1]) < epsilon2) && (Math.abs(m[0][0]+m[1][1]+m[2][2]-3) < epsilon2)) { // this singularity is identity matrix so angle = 0 return this.axisAngle(0,1,0,0); // zero angle, arbitrary axis } // otherwise this singularity is angle = 180 angle = Math.PI; var xx = (m[0][0]+1)/2; var yy = (m[1][1]+1)/2; var zz = (m[2][2]+1)/2; var xy = (m[0][1]+m[1][0])/4; var xz = (m[0][2]+m[2][0])/4; var yz = (m[1][2]+m[2][1])/4; if ((xx > yy) && (xx > zz)) { // m[0][0] is the largest diagonal term if (xx< epsilon) { x = 0; y = 0.7071; z = 0.7071; } else { x = Math.sqrt(xx); y = xy/x; z = xz/x; } } else if (yy > zz) { // m[1][1] is the largest diagonal term if (yy< epsilon) { x = 0.7071; y = 0; z = 0.7071; } else { y = Math.sqrt(yy); x = xy/y; z = yz/y; } } else { // m[2][2] is the largest diagonal term so base result on this if (zz< epsilon) { x = 0.7071; y = 0.7071; z = 0; } else { z = Math.sqrt(zz); x = xz/z; y = yz/z; } } return this.axisAngle(angle,x,y,z); // return 180 deg rotation } // as we have reached here there are no singularities so we can handle normally var s = Math.sqrt((m[2][1] - m[1][2])*(m[2][1] - m[1][2]) +(m[0][2] - m[2][0])*(m[0][2] - m[2][0]) +(m[1][0] - m[0][1])*(m[1][0] - m[0][1])); // used to normalise if (Math.abs(s) < 0.001) s=1; // prevent divide by zero, should not happen if matrix is orthogonal and should be // caught by singularity test above, but I've left it in just in case angle = Math.acos(( m[0][0] + m[1][1] + m[2][2] - 1)/2); x = (m[2][1] - m[1][2])/s; y = (m[0][2] - m[2][0])/s; z = (m[1][0] - m[0][1])/s; return this.axisAngle(angle,x,y,z); } static axisAngle(angle,x,y,z) { return [angle * 180 / Math.PI,x,y,z]; } static rotateZYX(m, v) { var sinX = Math.sin(v[0]); var cosX = Math.cos(v[0]); var sinY = Math.sin(v[1]); var cosY = Math.cos(v[1]); var sinZ = Math.sin(v[2]); var cosZ = Math.cos(v[2]); var cosZSinY = cosZ * sinY; var sinZSinY = sinZ * sinY; var r00 = cosZ * cosY; var r01 = sinZ * cosY; var r02 = -sinY; var r10 = cosZSinY * sinX - sinZ * cosX; var r11 = sinZSinY * sinX + cosZ * cosX; var r12 = cosY * sinX; var r20 = cosZSinY * cosX + sinZ * sinX; var r21 = sinZSinY * cosX - cosZ * sinX; var r22 = cosY * cosX; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; var m00 = m0[0]; var m01 = m0[1]; var m02 = m0[2]; var m03 = m0[3]; var m10 = m1[0]; var m11 = m1[1]; var m12 = m1[2]; var m13 = m1[3]; var m20 = m2[0]; var m21 = m2[1]; var m22 = m2[2]; var m23 = m2[3]; var m30 = m3[0]; var m31 = m3[1]; var m32 = m3[2]; var m33 = m3[3]; m0.splice(0, 4, r00 * m00 + r01 * m10 + r02 * m20, r00 * m01 + r01 * m11 + r02 * m21, r00 * m02 + r01 * m12 + r02 * m22, r00 * m03 + r01 * m13 + r02 * m23); m1.splice(0, 4, r10 * m00 + r11 * m10 + r12 * m20, r10 * m01 + r11 * m11 + r12 * m21, r10 * m02 + r11 * m12 + r12 * m22, r10 * m03 + r11 * m13 + r12 * m23); m2.splice(0, 4, r20 * m00 + r21 * m10 + r22 * m20, r20 * m01 + r21 * m11 + r22 * m21, r20 * m02 + r21 * m12 + r22 * m22, r20 * m03 + r21 * m13 + r22 * m23); return m; }; static getMatrixElements(m) { var r = []; var mLength = m.length; var k = 0; for (var i = 0; i < mLength; i++) { for (var j = 0; j < m[i].length; j++) { r[k++] = m[i][j]; } } return r; }; static transformDirection(m, v) { var v0 = v[0]; var v1 = v[1]; var v2 = v[2]; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; return [v0 * m0[0] + v1 * m1[0] + v2 * m2[0], v0 * m0[1] + v1 * m1[1] + v2 * m2[1], v0 * m0[2] + v1 * m1[2] + v2 * m2[2]]; }; static translate(m, v) { var v0 = v[0]; var v1 = v[1]; var v2 = v[2]; var m0 = m[0]; var m1 = m[1]; var m2 = m[2]; var m3 = m[3]; var m00 = m0[0]; var m01 = m0[1]; var m02 = m0[2]; var m03 = m0[3]; var m10 = m1[0]; var m11 = m1[1]; var m12 = m1[2]; var m13 = m1[3]; var m20 = m2[0]; var m21 = m2[1]; var m22 = m2[2]; var m23 = m2[3]; var m30 = m3[0]; var m31 = m3[1]; var m32 = m3[2]; var m33 = m3[3]; m3.splice(0, 4, m00 * v0 + m10 * v1 + m20 * v2 + m30, m01 * v0 + m11 * v1 + m21 * v2 + m31, m02 * v0 + m12 * v1 + m22 * v2 + m32, m03 * v0 + m13 * v1 + m23 * v2 + m33); return m; } static inverse(m) { var tmp_0 = m[2][2] * m[3][3]; var tmp_1 = m[3][2] * m[2][3]; var tmp_2 = m[1][2] * m[3][3]; var tmp_3 = m[3][2] * m[1][3]; var tmp_4 = m[1][2] * m[2][3]; var tmp_5 = m[2][2] * m[1][3]; var tmp_6 = m[0][2] * m[3][3]; var tmp_7 = m[3][2] * m[0][3]; var tmp_8 = m[0][2] * m[2][3]; var tmp_9 = m[2][2] * m[0][3]; var tmp_10 = m[0][2] * m[1][3]; var tmp_11 = m[1][2] * m[0][3]; var tmp_12 = m[2][0] * m[3][1]; var tmp_13 = m[3][0] * m[2][1]; var tmp_14 = m[1][0] * m[3][1]; var tmp_15 = m[3][0] * m[1][1]; var tmp_16 = m[1][0] * m[2][1]; var tmp_17 = m[2][0] * m[1][1]; var tmp_18 = m[0][0] * m[3][1]; var tmp_19 = m[3][0] * m[0][1]; var tmp_20 = m[0][0] * m[2][1]; var tmp_21 = m[2][0] * m[0][1]; var tmp_22 = m[0][0] * m[1][1]; var tmp_23 = m[1][0] * m[0][1]; var t0 = (tmp_0 * m[1][1] + tmp_3 * m[2][1] + tmp_4 * m[3][1]) - (tmp_1 * m[1][1] + tmp_2 * m[2][1] + tmp_5 * m[3][1]); var t1 = (tmp_1 * m[0][1] + tmp_6 * m[2][1] + tmp_9 * m[3][1]) - (tmp_0 * m[0][1] + tmp_7 * m[2][1] + tmp_8 * m[3][1]); var t2 = (tmp_2 * m[0][1] + tmp_7 * m[1][1] + tmp_10 * m[3][1]) - (tmp_3 * m[0][1] + tmp_6 * m[1][1] + tmp_11 * m[3][1]); var t3 = (tmp_5 * m[0][1] + tmp_8 * m[1][1] + tmp_11 * m[2][1]) - (tmp_4 * m[0][1] + tmp_9 * m[1][1] + tmp_10 * m[2][1]); var d = 1.0 / (m[0][0] * t0 + m[1][0] * t1 + m[2][0] * t2 + m[3][0] * t3); var row0 = [d * t0, d * t1, d * t2, d * t3]; var row1 = [d * ((tmp_1 * m[1][0] + tmp_2 * m[2][0] + tmp_5 * m[3][0]) - (tmp_0 * m[1][0] + tmp_3 * m[2][0] + tmp_4 * m[3][0])), d * ((tmp_0 * m[0][0] + tmp_7 * m[2][0] + tmp_8 * m[3][0]) - (tmp_1 * m[0][0] + tmp_6 * m[2][0] + tmp_9 * m[3][0])), d * ((tmp_3 * m[0][0] + tmp_6 * m[1][0] + tmp_11 * m[3][0]) - (tmp_2 * m[0][0] + tmp_7 * m[1][0] + tmp_10 * m[3][0])), d * ((tmp_4 * m[0][0] + tmp_9 * m[1][0] + tmp_10 * m[2][0]) - (tmp_5 * m[0][0] + tmp_8 * m[1][0] + tmp_11 * m[2][0]))]; var row2 =[d * ((tmp_12 * m[1][3] + tmp_15 * m[2][3] + tmp_16 * m[3][3]) - (tmp_13 * m[1][3] + tmp_14 * m[2][3] + tmp_17 * m[3][3])), d * ((tmp_13 * m[0][3] + tmp_18 * m[2][3] + tmp_21 * m[3][3]) - (tmp_12 * m[0][3] + tmp_19 * m[2][3] + tmp_20 * m[3][3])), d * ((tmp_14 * m[0][3] + tmp_19 * m[1][3] + tmp_22 * m[3][3]) - (tmp_15 * m[0][3] + tmp_18 * m[1][3] + tmp_23 * m[3][3])), d * ((tmp_17 * m[0][3] + tmp_20 * m[1][3] + tmp_23 * m[2][3]) - (tmp_16 * m[0][3] + tmp_21 * m[1][3] + tmp_22 * m[2][3]))]; var row3 = [d * ((tmp_14 * m[2][2] + tmp_17 * m[3][2] + tmp_13 * m[1][2]) - (tmp_16 * m[3][2] + tmp_12 * m[1][2] + tmp_15 * m[2][2])), d * ((tmp_20 * m[3][2] + tmp_12 * m[0][2] + tmp_19 * m[2][2]) - (tmp_18 * m[2][2] + tmp_21 * m[3][2] + tmp_13 * m[0][2])), d * ((tmp_18 * m[1][2] + tmp_23 * m[3][2] + tmp_15 * m[0][2]) - (tmp_22 * m[3][2] + tmp_14 * m[0][2] + tmp_19 * m[1][2])), d * ((tmp_22 * m[2][2] + tmp_16 * m[0][2] + tmp_21 * m[1][2]) - (tmp_20 * m[1][2] + tmp_23 * m[2][2] + tmp_17 * m[0][2]))]; return [row0, row1, row2, row3]; } static lookAt(eye, target, up) { var vz = vector3.normalize( vector3.sub(eye, target).slice(0, 3)).concat(0); var vx = vector3.normalize( vector3.cross(up, vz)).concat(0); var vy = vector3.cross(vz, vx).concat(0); return matrix4.inverse([vx, vy, vz, eye.concat(1)]); console.log([vx, vy, vz, eye.concat(1)]); }; static composition(a, b) { var a0 = a[0]; var a1 = a[1]; var a2 = a[2]; var a3 = a[3]; var b0 = b[0]; var b1 = b[1]; var b2 = b[2]; var b3 = b[3]; var a00 = a0[0]; var a01 = a0[1]; var a02 = a0[2]; var a03 = a0[3]; var a10 = a1[0]; var a11 = a1[1]; var a12 = a1[2]; var a13 = a1[3]; var a20 = a2[0]; var a21 = a2[1]; var a22 = a2[2]; var a23 = a2[3]; var a30 = a3[0]; var a31 = a3[1]; var a32 = a3[2]; var a33 = a3[3]; var b00 = b0[0]; var b01 = b0[1]; var b02 = b0[2]; var b03 = b0[3]; var b10 = b1[0]; var b11 = b1[1]; var b12 = b1[2]; var b13 = b1[3]; var b20 = b2[0]; var b21 = b2[1]; var b22 = b2[2]; var b23 = b2[3]; var b30 = b3[0]; var b31 = b3[1]; var b32 = b3[2]; var b33 = b3[3]; return [[a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03, a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03, a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03, a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03], [a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13, a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13, a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13, a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13], [a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23, a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23, a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23, a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23], [a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33, a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33, a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33, a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33]]; } static mul(a, b) { var a0 = a[0]; var a1 = a[1]; var a2 = a[2]; var a3 = a[3]; var b0 = b[0]; var b1 = b[1]; var b2 = b[2]; var b3 = b[3]; var a00 = a0[0]; var a01 = a0[1]; var a02 = a0[2]; var a03 = a0[3]; var a10 = a1[0]; var a11 = a1[1]; var a12 = a1[2]; var a13 = a1[3]; var a20 = a2[0]; var a21 = a2[1]; var a22 = a2[2]; var a23 = a2[3]; var a30 = a3[0]; var a31 = a3[1]; var a32 = a3[2]; var a33 = a3[3]; var b00 = b0[0]; var b01 = b0[1]; var b02 = b0[2]; var b03 = b0[3]; var b10 = b1[0]; var b11 = b1[1]; var b12 = b1[2]; var b13 = b1[3]; var b20 = b2[0]; var b21 = b2[1]; var b22 = b2[2]; var b23 = b2[3]; var b30 = b3[0]; var b31 = b3[1]; var b32 = b3[2]; var b33 = b3[3]; return [[a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30, a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31, a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32, a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33], [a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30, a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31, a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32, a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33], [a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30, a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31, a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32, a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33], [a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30, a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31, a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32, a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33]]; } } /** * 2 dimensional vector Object */ export class vector2 { constructor(x,y) { return [x, y]; } static unit = function(a) { var length = size(a); return [a[0]/length, a[1]/length]; } static size(a){ var a1 = a[0]; var a2 = a[1]; var x = a1*a1; var y = a2*a2; return Math.sqrt( x + y ); } static interpolate = function(a,b,c) { var a = this.scale(a,c); var b = this.scale(b,1-c); return this.add(a, b); } static scale(v,c){ var x = v[0] * c; var y = v[1] * c; return [x,y]; } static dot(a,b){ var a1 = a[0]; var a2 = a[1]; var b1 = b[0]; var b2 = b[1]; var x = a1*b1; var y = a2*b2; return x+y; } static add(a,b){ var a1 = a[0]; var a2 = a[1]; var b1 = b[0]; var b2 = b[1]; var x = a1+b1; var y = a2+b2; return [ x, y ]; } static sub(a,b){ var a1 = a[0]; var a2 = a[1]; var b1 = b[0]; var b2 = b[1]; var x = a1-b1; var y = a2-b2; return [ x, y ]; } } /** * 3 dimensional vector Object */ export class vector3 { constructor(x,y,z) { return [x, y, z]; } static negativeVector( v ){ return new vector3(-v[0], -v[1], -v[2]) } static dot(a,b){ var a1 = a[0]; var a2 = a[1]; var a3 = a[2]; var b1 = b[0]; var b2 = b[1]; var b3 = b[2]; var x = a1*b1; var y = a2*b2; var z = a3*b3; return x+y+z; }; static unit(a) { var length = this.size(a); return [a[0]/length, a[1]/length, a[2]/length]; } static interpolate(a,b,c) { var a = this.scale(a,c); var b = this.scale(b,1-c); return this.add(a, b); } static scale (v,c){ var x = v[0] * c; var y = v[1] * c; var z = v[2] * c; return [x,y,z]; } static add (a,b){ var a1 = a[0]; var a2 = a[1]; var a3 = a[2]; var b1 = b[0]; var b2 = b[1]; var b3 = b[2]; var x = a1+b1; var y = a2+b2; var z = a3+b3; return [ x, y, z ]; }; static sub (a,b){ var a1 = a[0]; var a2 = a[1]; var a3 = a[2]; var b1 = b[0]; var b2 = b[1]; var b3 = b[2]; var x = a1-b1; var y = a2-b2; var z = a3-b3; x = (x=="NAN")?0:x; y = (y=="NAN")?0:y; z = (z=="NAN")?0:z; return [ x, y, z ]; }; static normalize (a){ var length = this.size(a); if(length == 0) return new vector3(0,0,0); var a1 = a[0]; var a2 = a[1]; var a3 = a[2]; var b1 = a1 / length; var b2 = a2 / length; var b3 = a3 / length; return [ b1, b2, b3 ]; }; static mulScalarVector(k, v) { var r = []; var vLength = v.length; for (var i = 0; i < vLength; ++i) { r[i] = k * v[i]; } return r; }; static size (a){ var a1 = a[0]; var a2 = a[1]; var a3 = a[2]; var x = a1*a1; var y = a2*a2; var z = a3*a3; return Math.sqrt( x + y + z ); } static cross(a, b) { var x1 = a[1] * b[2]; var x2 = a[2] * b[1]; var y1 = a[2] * b[0]; var y2 = a[0] * b[2]; var z1 = a[0] * b[1]; var z2 = a[1] * b[0]; var x = x1 - x2; var y = y1 - y2; var z = z1 - z2; return [x,y,z]; }; } /** * 4 dimensional vector Object */ export class vector4 { constructor(x, y, z, w) { return [x, y, z, w]; } static mulScalarVector(k, v) { var r = []; var vLength = v.length; for (var i = 0; i < vLength; ++i) { r[i] = k * v[i]; } return r; }; static dot (a,b){ var a1 = a[0]; var a2 = a[1]; var a3 = a[2]; var a4 = a[3]; var b1 = b[0]; var b2 = b[1]; var b3 = b[2]; var b4 = b[3]; var x = a1*b1; var y = a2*b2; var z = a3*b3; var w = a3*b3; return x+y+z+w; } static add (a,b){ var a1 = a[0]; var a2 = a[1]; var a3 = a[2]; var a4 = a[3]; var b1 = b[0]; var b2 = b[1]; var b3 = b[2]; var b4 = b[3]; var x = a1+b1; var y = a2+b2; var z = a3+b3; var w = a3+b3; return [ x, y, z, w ]; } static sub (a,b){ var a1 = a[0]; var a2 = a[1]; var a3 = a[1]; var b1 = b[0]; var b2 = b[1]; var b3 = b[1]; var x = a1-b1; var y = a2-b2; var z = a3-b3; var w = a3-b3; return [ x, y, z, w ]; } static toVector3 (a){ var x = a[0]; var y = a[1]; var z = a[2]; return vector3( x, y, z ); } } // export {math, vector3}; /** * Basic Primitive functions */ function sin(x){ return Math.sin(x); } function asin(x){ return Math.asin(x); } function cos(x){ return Math.cos(x); } function tan(x){ return Math.tan(x);} function atan2(x, y){ return Math.atan2(x, y);} function floor(x){ return Math.floor(x); } function round(x){ return Math.round(x); } function abs(x){ return Math.abs(x); } function exp(x){ return Math.exp(x); } function min(x,y,z,w){ return Math.min(x,y,z,w); } function max(x,y,z,w){ return Math.min(x,y,z,w); } function pow(x){ return Math.pow(x); } function sqrt(x){ return Math.sqrt(x); } console.log( "spherical "); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); console.log( vector3.normalize([Math.random()-0.5, Math.random()-0.5,Math.random()-0.5]) ); //export {math as default}; //export {vector2 as vector2}; //export {vector3 as vector3}; //export {vector4 as vector4};