diff options
Diffstat (limited to 'demos/webgl/glge_math.js')
-rw-r--r-- | demos/webgl/glge_math.js | 1158 |
1 files changed, 0 insertions, 1158 deletions
diff --git a/demos/webgl/glge_math.js b/demos/webgl/glge_math.js deleted file mode 100644 index 99df54c8..00000000 --- a/demos/webgl/glge_math.js +++ /dev/null @@ -1,1158 +0,0 @@ -/* -GLGE WebGL Graphics Engine -Copyright (c) 2010, Paul Brunt -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GLGE nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PAUL BRUNT BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/** - * @fileOverview - * @name GLGE_math.js - */ - - if(!window["GLGE"]){ - /** - * @namespace Holds the functionality of the library - */ - window["GLGE"]={}; -} - -(function(GLGE){ - -GLGE.Vec=function(array) { - return array.slice(0); -} - -/** -* The Vec3 Class creates a vector -* @param {Array} array An array of 3 floats -*/ -GLGE.Vec3=function(x,y,z){ - return [x,y,z]; -} - -/** -* The Vec4 Class creates a vector -* @param {Array} array An array of 4 floats -*/ -GLGE.Vec4=function(x,y,z,w){ - return [x,y,z,w]; -} - -/** -* Gets the nth element (1 indexed) from the array -* @param {Array} v A vector with 4 elements -* @param {number} i The index from one -*/ -GLGE.get1basedVec4=function(v,i){ - return v[i-1]; -}; -/** -* Gets the nth element (1 indexed) from the array -* @param {Array} v A vector with 3 elements -* @param {number} i The index from one -*/ -GLGE.get1basedVec3=function(v,i){ - return v[i-1]; -}; - -/** -* Gets the nth element (1 indexed) from the array -* @param {Array} v A vector with 4 elements -* @param {number} i The index from one -*/ -GLGE.getVec4=function(v,i){ - return v[i]; -}; -/** -* Gets the nth element (1 indexed) from the array -* @param {Array} v A vector with 3 elements -* @param {number} i The index from one -*/ -GLGE.getVec3=function(v,i){ - return v[i]; -}; - - - -/** -* Adds a GLGE.Vec4 to this Vec4 -* @param {Array} a The first value to add -* * @param {Array} b The second value to add -*/ -GLGE.addVec4=function(a,b) { - return [a[0]+b[0],a[1]+b[1],a[2]+b[2],a[3]+b[3]]; -} -/** -* Adds a GLGE.Vec3 to this GLGE.Vec3 -* @param {Array} a The first value to add -* @param {Array} b The second value to add -*/ -GLGE.addVec3=function(a,b) { - return [a[0]+b[0],a[1]+b[1],a[2]+b[2]]; -} - - -/** -* Adds a GLGE.Vec4 to this Vec4 -* @param {Array} a The first value -* * @param {Array} b The second value to subtract from the first -*/ -GLGE.subVec4=function(a,b) { - return [a[0]-b[0],a[1]-b[1],a[2]-b[2],a[3]-b[3]]; -} -/** -* Adds a GLGE.Vec3 to this GLGE.Vec3 -* @param {Array} a The first value -* @param {Array} b The second value to subtract from the first -*/ -GLGE.subVec3=function(a,b) { - return [a[0]-b[0],a[1]-b[1],a[2]-b[2]]; -} - - -/** -* Gets the dot product between this and the input vector -* @param {Array} a the first value to dot -* @param {Array} b the second value to dot -*/ -GLGE.dotVec3=function(a,b) { - return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]; -} - - -/** -* Gets the dot product between this and the input vector -* @param {Array} a the first value to dot -* @param {Array} b the second value to dot -*/ -GLGE.dotVec4=function(a,b) { - return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]; -} - -/** -* Gets the dot product between this and the input vector -* @param {Array} a the vector to scale -* @param {Number} b the scalar -*/ -GLGE.scaleVec4=function(a,b) { - return [a[0]*b,a[1]*b,a[2]*b,a[3]*b]; -} - -/** -* Gets the dot product between this and the input vector -* @param {Array} a the vector to scale -* @param {Number} b the scalar -*/ -GLGE.scaleVec3=function(a,b) { - return [a[0]*b,a[1]*b,a[2]*b]; -} - - -/** -* Gets the cross product between this and the input vector -* @param {Array} a the first value to dot -* @param {Array} b the second value to dot -*/ -GLGE.crossVec3=function(a,b) { - return [a[1]*b[2]-a[2]*b[1], - a[2]*b[0]-a[0]*b[2], - a[0]*b[1]-a[1]*b[0]]; -} - -/** -* Returns a unitized version of the input vector3 -* @param {Array} a the vector3 to be unitized -*/ -GLGE.toUnitVec3=function(a) { - var sq=a[0]*a[0]+a[1]*a[1]+a[2]*a[2]; - var f=1.0; - if (sq>0) { - f=Math.pow(sq,0.5); - } - return [a[0]/f,a[1]/f,a[2]/f]; -}; - -/** -* Returns a unitized version of the input vector4 -* @param {Array} a the vector4 to be unitized -*/ -GLGE.toUnitVec4=function(a) { - var sq=a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3]; - var f=1.0; - if (sq>0) { - f=Math.pow(sq,0.5); - } - return [a[0]/f,a[1]/f,a[2]/f,a[3]/f]; -}; - - -/** -* Returns the length of a vector3 -* @param {Array} a the vector to be measured -*/ -GLGE.lengthVec3=function(a) { - return Math.pow(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],0.5); -}; - -/** -* Returns the distance between 2 vector3s -* @param {Array} a the first vector -* @param {Array} b the second vector -*/ -GLGE.distanceVec3=function(a,b){ - return GLGE.lengthVec3(GLGE.subVec3(a,b)); -}; - -/** -* Returns the length of a vector3 -* @param {Array} a the vector to be measured -*/ -GLGE.lengthVec4=function(a,b) { - return Math.pow(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3],0.5); -}; - -/** -* Returns the distance between 2 vector4s -* @param {Array} a the first vector -* @param {Array} b the second vector -*/ -GLGE.distanceVec4=function(a,b){ - return GLGE.lengthVec4(GLGE.subVec4(a,b)); -}; - - -/** -* Returns the angle between 2 vector3s in radians -* @param {Array} a the first vector -* @param {Array} b the second vector -*/ -GLGE.angleVec3=function(a,b){ - a=GLGE.toUnitVec3(a); - b=GLGE.toUnitVec3(b); - d=GLGE.dotVec3(a,b); - if (d<-1) - d=-1; - if (d>1) - d=1; - return Math.acos(d); -}; - -/** -* Returns the angle between 2 vector4s in radians -* @param {Array} a the first vector -* @param {Array} b the second vector -*/ -GLGE.angleVec4=function(a,b){ - a=GLGE.toUnitVec4(a); - b=GLGE.toUnitVec4(b); - d=GLGE.dotVec4(a,b); - if (d<-1) - d=-1; - if (d>1) - d=1; - return Math.acos(d); -}; - -GLGE_math_use_webgl_float=false; - -/** -* The Mat class creates a matrix from an array -* @param {Array} array An array of 9 or 16 floats -*/ -GLGE.Mat3=GLGE_math_use_webgl_float?function(array) { - if (array.length==9) { - return new Float32Array(array); - }else if (array.length==16) { - return new Float32Array([array[0],array[1],array[2],array[4],array[5],array[6],array[8],array[9],array[10]]); - }else { - throw "invalid matrix length"; - } -}:function(array) { - var retval; - if (array.length==9) { - retval=array.slice(0); - }else if (array.length==16) { - retval=[array[0],array[1],array[2],array[4],array[5],array[6],array[8],array[9],array[10]]; - }else { - throw "invalid matrix length"; - } - retval.get=function(i){return this[i];}; - return retval; -}; -GLGE.Mat=GLGE_math_use_webgl_float?function(array) { - return new Float32Array(array); -}:function(array){ - var retval=array.slice(0); - retval.get=function(i){return this[i];}; - return retval; -}; -GLGE.Mat4=function(array) { - var retval; - if (array.length==9) { - retval=[array[0],array[1],array[2],0,array[3],array[4],array[5],0,array[6],array[7],array[8],0,0,0,0,1]; - }else if (array.length==16) { - retval=array.slice(0); - }else { - throw "invalid matrix length"; - } - retval.get=function(i){return this[i];}; - return retval; -}; -/** -* Finds the determinate of the matrix -* @returns {number} the determinate -*/ -GLGE.determinantMat4=function(m) { - return m[12] * m[9] * m[6] * m[3] - m[8] * m[13] * m[6] * m[3] - m[12] * m[5] * m[10] * m[3] + m[4] * m[13] * m[10] * m[3] + m[8] * m[5] * m[14] * m[3] - m[4] * m[9] * m[14] * m[3] - m[12] * m[9] * m[2] * m[7] + m[8] * m[13] * m[2] * m[7] + m[12] * m[1] * m[10] * m[7] - m[0] * m[13] * m[10] * m[7] - m[8] * m[1] * m[14] * m[7] + m[0] * m[9] * m[14] * m[7] + m[12] * m[5] * m[2] * m[11] - m[4] * m[13] * m[2] * m[11] - m[12] * m[1] * m[6] * m[11] + m[0] * m[13] * m[6] * m[11] + m[4] * m[1] * m[14] * m[11] - m[0] * m[5] * m[14] * m[11] - m[8] * m[5] * m[2] * m[15] + m[4] * m[9] * m[2] * m[15] + m[8] * m[1] * m[6] * m[15] - m[0] * m[9] * m[6] * m[15] - m[4] * m[1] * m[10] * m[15] + m[0] * m[5] * m[10] * m[15]; -}; - -/** -* Finds the inverse of the matrix -* @returns {GLGE.Mat} the inverse -*/ -GLGE.inverseMat4=function(mat){ - // Cache the matrix values (makes for huge speed increases!) - var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3]; - var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7]; - var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11]; - var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15]; - - var d = a30*a21*a12*a03 - a20*a31*a12*a03 - a30*a11*a22*a03 + a10*a31*a22*a03 + - a20*a11*a32*a03 - a10*a21*a32*a03 - a30*a21*a02*a13 + a20*a31*a02*a13 + - a30*a01*a22*a13 - a00*a31*a22*a13 - a20*a01*a32*a13 + a00*a21*a32*a13 + - a30*a11*a02*a23 - a10*a31*a02*a23 - a30*a01*a12*a23 + a00*a31*a12*a23 + - a10*a01*a32*a23 - a00*a11*a32*a23 - a20*a11*a02*a33 + a10*a21*a02*a33 + - a20*a01*a12*a33 - a00*a21*a12*a33 - a10*a01*a22*a33 + a00*a11*a22*a33; - - return [ (a21*a32*a13 - a31*a22*a13 + a31*a12*a23 - a11*a32*a23 - a21*a12*a33 + a11*a22*a33)/d, - (a31*a22*a03 - a21*a32*a03 - a31*a02*a23 + a01*a32*a23 + a21*a02*a33 - a01*a22*a33)/d, - (a11*a32*a03 - a31*a12*a03 + a31*a02*a13 - a01*a32*a13 - a11*a02*a33 + a01*a12*a33)/d, - (a21*a12*a03 - a11*a22*a03 - a21*a02*a13 + a01*a22*a13 + a11*a02*a23 - a01*a12*a23)/d, - (a30*a22*a13 - a20*a32*a13 - a30*a12*a23 + a10*a32*a23 + a20*a12*a33 - a10*a22*a33)/d, - (a20*a32*a03 - a30*a22*a03 + a30*a02*a23 - a00*a32*a23 - a20*a02*a33 + a00*a22*a33)/d, - (a30*a12*a03 - a10*a32*a03 - a30*a02*a13 + a00*a32*a13 + a10*a02*a33 - a00*a12*a33)/d, - (a10*a22*a03 - a20*a12*a03 + a20*a02*a13 - a00*a22*a13 - a10*a02*a23 + a00*a12*a23)/d, - (a20*a31*a13 - a30*a21*a13 + a30*a11*a23 - a10*a31*a23 - a20*a11*a33 + a10*a21*a33)/d, - (a30*a21*a03 - a20*a31*a03 - a30*a01*a23 + a00*a31*a23 + a20*a01*a33 - a00*a21*a33)/d, - (a10*a31*a03 - a30*a11*a03 + a30*a01*a13 - a00*a31*a13 - a10*a01*a33 + a00*a11*a33)/d, - (a20*a11*a03 - a10*a21*a03 - a20*a01*a13 + a00*a21*a13 + a10*a01*a23 - a00*a11*a23)/d, - (a30*a21*a12 - a20*a31*a12 - a30*a11*a22 + a10*a31*a22 + a20*a11*a32 - a10*a21*a32)/d, - (a20*a31*a02 - a30*a21*a02 + a30*a01*a22 - a00*a31*a22 - a20*a01*a32 + a00*a21*a32)/d, - (a30*a11*a02 - a10*a31*a02 - a30*a01*a12 + a00*a31*a12 + a10*a01*a32 - a00*a11*a32)/d, - (a10*a21*a02 - a20*a11*a02 + a20*a01*a12 - a00*a21*a12 - a10*a01*a22 + a00*a11*a22)/d] -}; - -/** -* multiplies two mat4's -* @returns {GLGE.Mat} the matrix multiplication of the matrices -*/ -GLGE.mulMat4Vec4=function(mat1,vec2){ - return GLGE.Vec4(mat1[0]*vec2[0]+mat1[1]*vec2[1]+mat1[2]*vec2[2]+mat1[3]*vec2[3], - mat1[4]*vec2[0]+mat1[5]*vec2[1]+mat1[6]*vec2[2]+mat1[7]*vec2[3], - mat1[8]*vec2[0]+mat1[9]*vec2[1]+mat1[10]*vec2[2]+mat1[11]*vec2[3], - mat1[12]*vec2[0]+mat1[13]*vec2[1]+mat1[14]*vec2[2]+mat1[15]*vec2[3]); -}; - -/** -* multiplies a Mat4 by a scalar value -* @returns {GLGE.Mat} the matrix multiplication of the matrices -*/ -GLGE.scaleMat4=function(m,value) { - return GLGE.Mat([m[0]*value,m[1]*value,m[2]*value,m[3]*value, - m[4]*value,m[5]*value,m[6]*value,m[7]*value, - m[8]*value,m[9]*value,m[10]*value,m[11]*value, - m[12]*value,m[13]*value,m[14]*value,m[15]*value]); -}; -/** -* multiplies a Mat4 by a scalar value in place without allocation -* @returns {GLGE.Mat} the input matrix, modified -*/ -GLGE.scaleInPlaceMat4=function(m,value) { - m.set(0,m[0]*value); - m.set(1,m[1]*value); - m.set(2,m[2]*value); - m.set(3,m[3]*value); - m.set(4,m[4]*value); - m.set(5,m[5]*value); - m.set(6,m[6]*value); - m.set(7,m[7]*value); - m.set(8,m[8]*value); - m.set(9,m[9]*value); - m.set(10,m[10]*value); - m.set(11,m[11]*value); - m.set(12,m[12]*value); - m.set(13,m[13]*value); - m.set(14,m[14]*value); - m.set(15,m[15]*value); - return m; -}; - -/** -* adds a Mat4 to another Mat4 in place without allocation -* @returns {GLGE.Mat} the first input matrix, modified to be added -*/ -GLGE.addInPlaceMat4=function(m,value) { - m.set(0,m[0]+value[0]); - m.set(1,m[1]+value[1]); - m.set(2,m[2]+value[2]); - m.set(3,m[3]+value[3]); - m.set(4,m[4]+value[4]); - m.set(5,m[5]+value[5]); - m.set(6,m[6]+value[6]); - m.set(7,m[7]+value[7]); - m.set(8,m[8]+value[8]); - m.set(9,m[9]+value[9]); - m.set(10,m[10]+value[10]); - m.set(11,m[11]+value[11]); - m.set(12,m[12]+value[12]); - m.set(13,m[13]+value[13]); - m.set(14,m[14]+value[14]); - m.set(15,m[15]+value[15]); - return m; -}; - - - -/** -* adds two Mat4 together -* @returns {GLGE.Mat} a new, added Mat4 -*/ -GLGE.addMat4=function(m,value) { -return GLGE.Mat([m[0]+value[0], - m[1]+value[1], - m[2]+value[2], - m[3]+value[3], - m[4]+value[4], - m[5]+value[5], - m[6]+value[6], - m[7]+value[7], - m[8]+value[8], - m[9]+value[9], - m[10]+value[10], - m[11]+value[11], - m[12]+value[12], - m[13]+value[13], - m[14]+value[14], - m[15]+value[15]]); - return m; -}; - - - -/** -* subs a Mat4 from another Mat4 in place without allocation -* @returns {GLGE.Mat} the first input matrix, modified to have the second subtacted -*/ -GLGE.subInPlaceMat4=function(m,value) { - m.set(0,m[0]-value[0]); - m.set(1,m[1]-value[1]); - m.set(2,m[2]-value[2]); - m.set(3,m[3]-value[3]); - m.set(4,m[4]-value[4]); - m.set(5,m[5]-value[5]); - m.set(6,m[6]-value[6]); - m.set(7,m[7]-value[7]); - m.set(8,m[8]-value[8]); - m.set(9,m[9]-value[9]); - m.set(10,m[10]-value[10]); - m.set(11,m[11]-value[11]); - m.set(12,m[12]-value[12]); - m.set(13,m[13]-value[13]); - m.set(14,m[14]-value[14]); - m.set(15,m[15]-value[15]); - return m; -}; - - - -/** -* subtracts the second matrix from the first -* @returns {GLGE.Mat} a new, subed Mat4 -*/ -GLGE.subMat4=function(m,value) { -return GLGE.Mat([m[0]-value[0], - m[1]-value[1], - m[2]-value[2], - m[3]-value[3], - m[4]-value[4], - m[5]-value[5], - m[6]-value[6], - m[7]-value[7], - m[8]-value[8], - m[9]-value[9], - m[10]-value[10], - m[11]-value[11], - m[12]-value[12], - m[13]-value[13], - m[14]-value[14], - m[15]-value[15]]); - return m; -}; - - -/** -* Finds the matrix multiplication with another GLGE.Mat or GLGE.vec or an Array of length 3-4 -* @param {object} value An GLGE.Mat, GLGE.vec or Array -* @returns {GLGE.Mat|GLGE.Vec} -*/ -GLGE.mulMat4=function(mat2,mat1){ - - var a00 = mat1[0], a01 = mat1[1], a02 = mat1[2], a03 = mat1[3]; - var a10 = mat1[4], a11 = mat1[5], a12 = mat1[6], a13 = mat1[7]; - var a20 = mat1[8], a21 = mat1[9], a22 = mat1[10], a23 = mat1[11]; - var a30 = mat1[12], a31 = mat1[13], a32 = mat1[14], a33 = mat1[15]; - - var b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b03 = mat2[3]; - var b10 = mat2[4], b11 = mat2[5], b12 = mat2[6], b13 = mat2[7]; - var b20 = mat2[8], b21 = mat2[9], b22 = mat2[10], b23 = mat2[11]; - var b30 = mat2[12], b31 = mat2[13], b32 = mat2[14], b33 = mat2[15]; - return [b00 * a00 + b01 * a10 + b02 * a20 + b03 * a30, - b00 * a01 + b01 * a11 + b02 * a21 + b03 * a31, - b00 * a02 + b01 * a12 + b02 * a22 + b03 * a32, - b00 * a03 + b01 * a13 + b02 * a23 + b03 * a33, - - b10 * a00 + b11 * a10 + b12 * a20 + b13 * a30, - b10 * a01 + b11 * a11 + b12 * a21 + b13 * a31, - b10 * a02 + b11 * a12 + b12 * a22 + b13 * a32, - b10 * a03 + b11 * a13 + b12 * a23 + b13 * a33, - - b20 * a00 + b21 * a10 + b22 * a20 + b23 * a30, - b20 * a01 + b21 * a11 + b22 * a21 + b23 * a31, - b20 * a02 + b21 * a12 + b22 * a22 + b23 * a32, - b20 * a03 + b21 * a13 + b22 * a23 + b23 * a33, - - b30 * a00 + b31 * a10 + b32 * a20 + b33 * a30, - b30 * a01 + b31 * a11 + b32 * a21 + b33 * a31, - b30 * a02 + b31 * a12 + b32 * a22 + b33 * a32, - b30 * a03 + b31 * a13 + b32 * a23 + b33 * a33]; -}; - -GLGE.transposeInPlaceMat4=function(m) { - var v=m[1]; - m.set(1,m[4]); - m.set(4,v); - - - v=m[8]; - m.set(8,m[2]); - m.set(2,v); - - - v=m[3]; - m.set(3,m[12]); - m.set(12,v); - - v=m[9]; - m.set(9,m[6]); - m.set(6,v); - - v=m[13]; - m.set(13,m[7]); - m.set(7,v); - - v=m[14]; - m.set(14,m[11]); - m.set(11,v); - -}; - -/** -* Builds the transpose of the matrix -* @returns {GLGE.Mat} the transposed matrix -*/ -GLGE.transposeMat4=function(m) { - return GLGE.Mat4([m[0],m[4],m[8],m[12], - m[1],m[5],m[9],m[13], - m[2],m[6],m[10],m[14], - m[3],m[7],m[11],m[15]]); -}; - -/** -* copys a js array into a webglarray -* @param {array} mat the source array -* @param {webglarray} glarray the destination array -*/ -GLGE.mat4gl=function(mat,glarray){ - glarray[0]=mat[0]; - glarray[1]=mat[1]; - glarray[2]=mat[2]; - glarray[3]=mat[3]; - glarray[4]=mat[4]; - glarray[5]=mat[5]; - glarray[6]=mat[6]; - glarray[7]=mat[7]; - glarray[8]=mat[8]; - glarray[9]=mat[9]; - glarray[10]=mat[10]; - glarray[11]=mat[11]; - glarray[12]=mat[12]; - glarray[13]=mat[13]; - glarray[14]=mat[14]; - glarray[15]=mat[15]; -}; - -/** -* Sets the value at the specified index -* @param {number} i the first index 1 offset -* @param {number} j the second index 1 offset -* @param {number} value the value to set -*/ -GLGE.set1basedMat4=function(m,i,j,value){ - m[(i-1)*4+(j-1)]=value; - if(m.glData!==undefined){ - delete m.glData; - } -}; - -/** -* Sets the value at the specified index -* @param {number} i the first index from zero -* @param {number} j the second index from zero -* @param {number} value the value to set -*/ -GLGE.setMat4=function(m,i,j,value){ - m[i*4+j]=value; - if(m.glData!==undefined){ - delete m.glData; - } -}; - -/** -* Gets the value at the specified index -* @param {number} i the first index from one -* @param {number} j the second index from one -* @returns {number} the value at the given index -*/ -GLGE.get1basedMat4=function(m,i,j){ - return m.get((i-1)*4+(j-1)); -}; - -/** -* Gets the value at the specified index -* @param {number} i the first index from zero -* @param {number} j the second index from zero -* @returns {number} the value at the given index -*/ -GLGE.getMat4=function(m,i,j){ - return m[i*4+j]; -}; -/** -* gets the a webgl float array for this Matrix, once generated it will cache it so it doesn't need to recreate everytime -* @returns {Float32Array} the webgl array for this Matrix -* @private -*/ -GLGE.glDataMat4=function(m) { - m.glArray=new Float32Array(m); - return m.glArray; -}; -/** - * Creates an identity matrix - * @returns {GLGE.Mat} the identity matrix - */ -GLGE.identMatrix=function(){ - return GLGE.Mat([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]); -}; -/** - * Creates a translation matrix - * @returns {Array} value an array GLGE.Vec or 3 paramters - * @returns {GLGE.Mat} the translation matrix - */ -GLGE.translateMatrix=function(value){ - var x; - var y; - var z; - if(arguments.length==3){ - x=arguments[0]; - y=arguments[1]; - z=arguments[2]; - } - else if(value.data){ - x=value.data[0]; - y=value.data[1]; - z=value.data[2]; - } - else if(value instanceof Array){ - x=value[0]; - y=value[1]; - z=value[2]; - } - return GLGE.Mat([ - 1,0,0,x, - 0,1,0,y, - 0,0,1,z, - 0,0,0,1 - ]); -}; -/** - * Creates a scale matrix - * @returns {Array} value an array GLGE.Vec or 3 paramters - * @returns {GLGE.Mat} the scale matrix - */ -GLGE.scaleMatrix=function(value){ - var x; - var y; - var z; - if(arguments.length==3){ - x=arguments[0]; - y=arguments[1]; - z=arguments[2]; - } - else if(value.data){ - x=value.data[0]; - y=value.data[1]; - z=value.data[2]; - } - else if(value instanceof Array){ - x=value[0]; - y=value[1]; - z=value[2]; - } - return GLGE.Mat([ - x,0,0,0, - 0,y,0,0, - 0,0,z,0, - 0,0,0,1 - ]); -} -/** -* @constant -* @description Enum for XYZ rotation order -*/ -GLGE.ROT_XYZ=1; -/** -* @constant -* @description Enum for XZY rotation order -*/ -GLGE.ROT_XZY=2; -/** -* @constant -* @description Enum for YXZ rotation order -*/ -GLGE.ROT_YXZ=3; -/** -* @constant -* @description Enum for YZX rotation order -*/ -GLGE.ROT_YZX=4; -/** -* @constant -* @description Enum for ZXY rotation order -*/ -GLGE.ROT_ZXY=5; -/** -* @constant -* @description Enum for ZYX rotation order -*/ -GLGE.ROT_ZYX=6; -/** - * Creates a rotation matrix - * @returns {Array} value an array GLGE.Vec or 3 paramters - * @returns {GLGE.Mat} the rotation matrix - */ -GLGE.rotateMatrix=function(value,type) { - var x; - var y; - var z; - if(arguments.length>2){ - x=arguments[0]; - y=arguments[1]; - z=arguments[2]; - type=arguments[3]; - } - else if(value.data){ - x=value.data[0]; - y=value.data[1]; - z=value.data[2]; - } - else if(value instanceof Array){ - x=value[0]; - y=value[1]; - z=value[2]; - } - if(!type) type=GLGE.ROT_XYZ; - var cosx=Math.cos(x); - var sinx=Math.sin(x); - var cosy=Math.cos(y); - var siny=Math.sin(y); - var cosz=Math.cos(z); - var sinz=Math.sin(z); - var rotx=GLGE.Mat([1,0,0,0,0,cosx,-sinx,0,0,sinx,cosx,0,0,0,0,1]); - var roty=GLGE.Mat([cosy,0,siny,0,0,1,0,0,-siny,0,cosy,0,0,0,0,1]); - var rotz=GLGE.Mat([cosz,-sinz,0,0,sinz,cosz,0,0,0,0,1,0,0,0,0,1]); - switch(type){ - case GLGE.ROT_XYZ: - return GLGE.mulMat4(rotx,GLGE.mulMat4(roty,rotz)); - break; - case GLGE.ROT_XZY: - return GLGE.mulMat4(rotx,GLGE.mulMat4(rotz,roty)); - break; - case GLGE.ROT_YXZ: - return GLGE.mulMat4(roty,GLGE.mulMat4(rotx,rotz)); - break; - case GLGE.ROT_YZX: - return GLGE.mulMat4(roty,GLGE.mulMat4(rotz,rotx)); - break; - case GLGE.ROT_ZXY: - return GLGE.mulMat4(rotz,GLGE.mulMat4(rotx,roty)); - break; - case GLGE.ROT_ZYX: - return GLGE.mulMat4(rotz,GLGE.mulMat4(roty,rotx)); - break; - } -} - - -GLGE.angleAxis=function(angle, axis) { - var xmx,ymy,zmz,xmy,ymz,zmx,xms,yms,zms; - axis=[axis[0],axis[1],axis[2],0]; - - var x = axis[0]; - var y = axis[1]; - var z = axis[2]; - - - var cos = Math.cos(angle); - var cosi = 1.0 - cos; - var sin = Math.sin(angle); - - xms = x * sin;yms = y * sin;zms = z * sin; - xmx = x * x;ymy = y * y;zmz = z * z; - xmy = x * y;ymz = y * z;zmx = z * x; - - var matrix = [(cosi * xmx) + cos,(cosi * xmy) - zms,(cosi * zmx) + yms,0, - (cosi * xmy) + zms,(cosi * ymy) + cos,(cosi * ymz) - xms,0, - (cosi * zmx) - yms,(cosi * ymz) + xms,(cosi * zmz) + cos,0, - 0,0,0,1]; - - return GLGE.Mat(matrix); -}; - -GLGE.quatRotation=function(qx,qy,qz,qw){ - return GLGE.Mat([ - 1 - 2*qy*qy - 2*qz*qz,2*qx*qy - 2*qz*qw,2*qx*qz + 2*qy*qw,0, - 2*qx*qy + 2*qz*qw,1 - 2*qx*qx - 2*qz*qz,2*qy*qz - 2*qx*qw,0, - 2*qx*qz - 2*qy*qw,2*qy*qz + 2*qx*qw,1 - 2*qx*qx - 2*qy*qy,0, - 0,0,0,1 - ]); -}; - -GLGE.makeOrtho=function(left,right,bottom,top,near,far){ - var x = -(right+left)/(right-left); - var y = -(top+bottom)/(top-bottom); - var z = -(far+near)/(far-near); - - return GLGE.Mat([2/(right-left), 0, 0, x, - 0, 2/(top-bottom), 0, y, - 0, 0, -2/(far-near), z, - 0, 0, 0, 1]); -}; - -GLGE.makeFrustum=function(left,right,bottom,top,near,far){ - 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); - return GLGE.Mat([x, 0, a, 0, - 0, y, b, 0, - 0, 0, c, d, - 0, 0, -1, 0]); -}; - -GLGE.makePerspective=function(fovy, aspect, near, far){ - var ymax = near * Math.tan(fovy * 0.00872664625972); - var ymin = -ymax; - var xmin = ymin * aspect; - var xmax = ymax * aspect; - return GLGE.makeFrustum(xmin, xmax, ymin, ymax, near, far); -}; - -GLGE.matrix2Scale=function(m){ - var m1=m[0]; - var m2=m[1]; - var m3=m[2]; - var m4=m[4]; - var m5=m[5]; - var m6=m[6]; - var m7=m[8]; - var m8=m[9]; - var m9=m[10]; - var scaleX=Math.sqrt(m1*m1+m2*m2+m3*m3); - var scaleY=Math.sqrt(m4*m4+m5*m5+m6*m6); - var scaleZ=Math.sqrt(m7*m7+m8*m8+m9*m9); - return [scaleX,scaleY,scaleZ] -} - - -GLGE.rotationMatrix2Quat=function(m){ - var tr = m[0] + m[5] + m[10]+1.0; - var S,x,y,z,w; - - if (tr > 0) { - S = 0.5/Math.sqrt(tr); - w = 0.25 / S; - x = (m[9] - m[6]) * S; - y = (m[2] - m[8]) * S; - z = (m[4] - m[1]) * S; - } else if ((m[0] > m[5])&&(m[0] > m[10])) { - S = Math.sqrt(1.0 + m[0] - m[5] - m[10]) * 2; - w = (m[9] - m[6]) / S; - x = 0.25 / S; - y = (m[1] + m[4]) / S; - z = (m[2] + m[8]) / S; - } else if (m[5] > m[10]) { - S = Math.sqrt(1.0 + m[5] - m[0] - m[10]) * 2; - w = (m[2] - m[8]) / S; - x = (m[1] + m[4]) / S; - y = 0.25 / S; - z = (m[6] + m[9]) / S; - } else { - S = Math.sqrt(1.0 + m[10] - m[0] - m[5]) * 2; - w = (m[4] - m[1]) / S; - x = (m[2] + m[8]) / S; - y = (m[6] + m[9]) / S; - z = 0.25 / S; - } - var N=Math.sqrt(x*x+y*y+z*z+w*w) - - return [x/N,y/N,z/N,w/N]; -} - - - -//returns plane as array [X,Y,Z,D] -GLGE.rayToPlane=function(origin,dir){ - var dirnorm=GLGE.toUnitVec3(dir); - return [dirnorm[0],dirnorm[1],dirnorm[2],GLGE.dotVec3(origin,dirnorm)]; -} - -GLGE.rayIntersectPlane=function(origin,dir,plane){ - var planeN=[plane[0],plane[1],plane[2]]; - var planeD=plane[3]; - var vdir=GLGE.dotVec3(planeN,dir); - if(vdir<=0){ - //ray in wrong direction - return false; - } - var vo=-(GLGE.dotVec3(planeN,origin)+planeD); - var t=vo/vdir; - if(t<=0){ - return false; - } - return GLGE.addVec3(origin,GLGE.scaleVec3(dir,t)); -} -//assumes perspective projection -GLGE.screenToDirection=function(x,y,width,height,proj){ - xcoord = -( ( ( 2 * x ) / width ) - 1 ) / proj[0]; - ycoord =( ( ( 2 * y ) / height ) - 1 ) / proj[5]; - zcoord = 1; - return GLGE.toUnitVec3([xcoord,ycoord,zcoord]); -} - -GLGE.BoundingVolume=function(minX,maxX,minY,maxY,minZ,maxZ){ - var dims=[maxX-minX,maxY-minY,maxZ-minZ]; - this.dims=dims; - this.center=[dims[0]/2+minX,dims[1]/2+minY,dims[2]/2+minZ]; -} - -//returns the center of the bounding area -GLGE.BoundingVolume.prototype.getCenter=function(matrix){ - return GLGE.mulMat4Vec4(matrix,this.center); -} - -//returns box point -GLGE.BoundingVolume.prototype.getBoxPoint=function(matrix,point){ - var coord=[this.dims[0]/2*point[0]+this.center[0],this.dims[1]/2*point[1]+this.center[1],this.dims[2]/2*point[2]+this.center[2]]; - return GLGE.mulMat4Vec4(matrix,coord); -} - -//returns the radius of a bounding sphere -GLGE.BoundingVolume.prototype.getSphereRadius=function(){ - return Math.pow((this.dims[0]*this.dims[0]+this.dims[1]*this.dims[1]+this.dims[2]*this.dims[2])/4,0.5); -} - -//adds an additional bounding volume to resize the current and returns the result -GLGE.BoundingVolume.prototype.addBoundingVolume=function(vol){ - var minX=Math.min(this.center[0]-this.dims[0]/2,vol.center[0]-vol.dims[0]/2); - var maxX=Math.max(this.center[0]+this.dims[0]/2,vol.center[0]+vol.dims[0]/2); - var minY=Math.min(this.center[1]-this.dims[1]/2,vol.center[1]-vol.dims[1]/2); - var maxY=Math.max(this.center[1]+this.dims[1]/2,vol.center[1]+vol.dims[1]/2); - var minZ=Math.min(this.center[2]-this.dims[2]/2,vol.center[2]-vol.dims[2]/2); - var maxZ=Math.max(this.center[2]+this.dims[2]/2,vol.center[2]+vol.dims[2]/2); - var dims=[maxX-minX,maxY-minY,maxZ-minZ]; - this.dims=dims; - this.center=[dims[0]/2+minX,dims[1]/2+minY,dims[2]/2+minZ]; -} - -//scales a volume based on a transform matrix -GLGE.BoundingVolume.prototype.applyMatrixScale=function(matrix){ - var scaleX=GLGE.lengthVec3([matrix[0],matrix[4],matrix[8]]); - var scaleY=GLGE.lengthVec3([matrix[1],matrix[5],matrix[9]]); - var scaleZ=GLGE.lengthVec3([matrix[2],matrix[6],matrix[10]]); - var minX=(this.center[0]-this.dims[0]/2)*scaleX; - var maxX=(this.center[0]+this.dims[0]/2)*scaleX; - var minY=(this.center[1]-this.dims[1]/2)*scaleY; - var maxY=(this.center[1]+this.dims[1]/2)*scaleY; - var minZ=(this.center[2]-this.dims[2]/2)*scaleZ; - var maxZ=(this.center[2]+this.dims[2]/2)*scaleZ; - var dims=[maxX-minX,maxY-minY,maxZ-minZ]; - this.dims=dims; - this.center=[dims[0]/2+minX,dims[1]/2+minY,dims[2]/2+minZ]; -} - -GLGE.BoundingVolume.prototype.clone=function(){ - var minX=this.center[0]-this.dims[0]/2; - var maxX=this.center[0]+this.dims[0]/2; - var minY=this.center[1]-this.dims[1]/2; - var maxY=this.center[1]+this.dims[1]/2; - var minZ=this.center[2]-this.dims[2]/2; - var maxZ=this.center[2]+this.dims[2]/2; - return new GLGE.BoundingVolume(minX,maxX,minY,maxY,minZ,maxZ); -} - -GLGE.BoundingVolume.prototype.toString=function(){ - var minX=this.center[0]-this.dims[0]/2; - var maxX=this.center[0]+this.dims[0]/2; - var minY=this.center[1]-this.dims[1]/2; - var maxY=this.center[1]+this.dims[1]/2; - var minZ=this.center[2]-this.dims[2]/2; - var maxZ=this.center[2]+this.dims[2]/2; - return [minX,maxX,minY,maxY,minZ,maxZ].toString(); -} - - -function GLGE_mathUnitTest() { - var a=GLGE.Vec([1,2,3,4]); - var b=GLGE.Vec4(GLGE.getVec4(a,3), - GLGE.get1basedVec4(a,3), - GLGE.getVec4(a,1), - GLGE.getVec4(a,0)); - var c=GLGE.identMatrix(); - var d=GLGE.mulMat4Vec4(c,b); - if (GLGE.getVec4(d,0)!=4|| - GLGE.getVec4(d,1)!=3|| - GLGE.getVec4(d,2)!=2|| - GLGE.getVec4(d,3)!=1) { - throw "Unit Test 1 failed MatVecMul "+d; - } - var m=GLGE.Mat4([3,4,5,0,.5,.75,0,0,.75,.5,0,0,.25,.25,1,1]); - var m1=GLGE.Mat4([2,1,8,2,1,4,3,2,1,.5,6.5,2,8,3,1,.25]); - var mm1=GLGE.mulMat4(m,m1); - var am1=GLGE.Mat4([15,21.5,68.5,24, - 1.75,3.5,6.25,2.5, - 2,2.75,7.5,2.5, - 9.75,4.75,10.25,3.25]); - for (var i=0;i<4;++i) { - for (var j=0;j<4;++j) { - var diff=GLGE.getMat4(mm1,i,j)-GLGE.getMat4(am1,i,j); - if (diff<.000001&&diff>-.000001) { - - }else { - throw "Unit Test 1 failed Multiplication "+GLGE.getMat4(mm1,i,j)+" != "+GLGE.getMat4(am1,i,j); - } - } - } - var inv = GLGE.inverseMat4(m); - var k = GLGE.mulMat4(m,inv); - var l = GLGE.mulMat4(inv,m); - for (var i=0;i<4;++i) { - for (var j=0;j<4;++j) { - var diff=GLGE.getMat4(k,i,j)-GLGE.getMat4(c,i,j); - if (diff<.0001&&diff>-.0001) { - }else { - throw "Unit Test 1 failed Inverse "+GLGE.getMat4(k,i,j)+" != "+GLGE.getMat4(c,i,j); - } - } - } -} -GLGE_mathUnitTest() ; - - -//Closure Export -GLGE["Vec3"]=GLGE.Vec3; -GLGE["Vec4"]=GLGE.Vec4; -GLGE["get1basedVec4"]=GLGE.get1basedVec4; -GLGE["get1basedVec3"]=GLGE.get1basedVec3; -GLGE["getVec4"]=GLGE.getVec4; -GLGE["getVec3"]=GLGE.getVec3; -GLGE["addVec4"]=GLGE.addVec4; -GLGE["addVec3"]=GLGE.addVec3; -GLGE["subVec4"]=GLGE.subVec4; -GLGE["subVec3"]=GLGE.subVec3; -GLGE["dotVec3"]=GLGE.dotVec3; -GLGE["dotVec4"]=GLGE.dotVec4; -GLGE["scaleVec4"]=GLGE.scaleVec4; -GLGE["scaleVec3"]=GLGE.scaleVec3; -GLGE["crossVec3"]=GLGE.crossVec3; -GLGE["toUnitVec3"]=GLGE.toUnitVec3; -GLGE["toUnitVec4"]=GLGE.toUnitVec4; -GLGE["lengthVec3"]=GLGE.lengthVec3; -GLGE["distanceVec3"]=GLGE.distanceVec3; -GLGE["lengthVec4"]=GLGE.lengthVec4; -GLGE["distanceVec4"]=GLGE.distanceVec4; -GLGE["angleVec3"]=GLGE.angleVec3; -GLGE["angleVec4"]=GLGE.angleVec4; -GLGE["Mat3"]=GLGE.Mat3; -GLGE["Mat"]=GLGE.Mat; -GLGE["Mat4"]=GLGE.Mat4; -GLGE["determinantMat4"]=GLGE.determinantMat4; -GLGE["inverseMat4"]=GLGE.inverseMat4; -GLGE["mulMat4Vec4"]=GLGE.mulMat4Vec4; -GLGE["scaleMat4"]=GLGE.scaleMat4; -GLGE["scaleInPlaceMat4"]=GLGE.scaleInPlaceMat4; -GLGE["addInPlaceMat4"]=GLGE.addInPlaceMat4; -GLGE["addMat4"]=GLGE.addMat4; -GLGE["subInPlaceMat4"]=GLGE.subInPlaceMat4; -GLGE["subMat4"]=GLGE.subMat4; -GLGE["mulMat4"]=GLGE.mulMat4; -GLGE["transposeInPlaceMat4"]=GLGE.transposeInPlaceMat4; -GLGE["transposeMat4"]=GLGE.transposeMat4; -GLGE["set1basedMat4"]=GLGE.set1basedMat4; -GLGE["setMat4"]=GLGE.setMat4; -GLGE["get1basedMat4"]=GLGE.get1basedMat4; -GLGE["getMat4"]=GLGE.getMat4; -GLGE["glDataMat4"]=GLGE.glDataMat4; -GLGE["identMatrix"]=GLGE.identMatrix; -GLGE["translateMatrix"]=GLGE.translateMatrix; -GLGE["scaleMatrix"]=GLGE.scaleMatrix; -GLGE["ROT_XYZ"]=GLGE.ROT_XYZ; -GLGE["ROT_XZY"]=GLGE.ROT_XZY; -GLGE["ROT_YXZ"]=GLGE.ROT_YXZ; -GLGE["ROT_YZX"]=GLGE.ROT_YZX; -GLGE["ROT_ZXY"]=GLGE.ROT_ZXY; -GLGE["ROT_ZYX"]=GLGE.ROT_ZYX; -GLGE["rotateMatrix"]=GLGE.rotateMatrix; -GLGE["angleAxis"]=GLGE.angleAxis; -GLGE[ |