/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/ // Constructor function function Vector() {} Vector.create = function(elements) { var rtn; if (elements) rtn = elements.slice( 0 ); else rtn = []; return rtn; }; Vector.dup = function(srcPt) { return srcPt.slice(0); } function Matrix() {} Matrix.create = function( rowArray ) { var mat = Matrix.I(4); var index = 0; for(var j=0; j<4; j++) { for (var i=0; i<4; i++) { mat[index] = rowArray[i][j]; index++; } } return mat; } Matrix.I = function(dimen) { var mat = []; for (var i=0; i 4 || this.elements[0].length > 4) return null; for (var i = 0; i < this.elements.length; i++) { for (var j = this.elements[i].length; j < 4; j++) { if (i == j) this.elements[i].push(1); else this.elements[i].push(0); } } for (var i = this.elements.length; i < 4; i++) { if (i == 0) this.elements.push([1, 0, 0, 0]); else if (i == 1) this.elements.push([0, 1, 0, 0]); else if (i == 2) this.elements.push([0, 0, 1, 0]); else if (i == 3) this.elements.push([0, 0, 0, 1]); } return this; }; Matrix.prototype.make3x3 = function() { if (this.elements.length != 4 || this.elements[0].length != 4) return null; return Matrix.create([[this.elements[0][0], this.elements[0][1], this.elements[0][2]], [this.elements[1][0], this.elements[1][1], this.elements[1][2]], [this.elements[2][0], this.elements[2][1], this.elements[2][2]]]); }; */ /* ///////////////////////////////////////////////////////////////////////////////////////////// // SMatrix SMatrix.Translation = function (vec) { var mat = SMatrix.I(4); mat.elements[0][3] = vec[0]; mat.elements[1][3] = vec[1]; mat.elements[2][3] = vec[2]; return mat; } SMatrix.RotationX = function( angle ) { var mat = SMatrix.I(4); mat.rotateX(angle); return mat; } SMatrix.RotationY = function( angle ) { var mat = SMatrix.I(4); mat.rotateX(angle); return mat; } SMatrix.RotationZ = function( angle ) { var mat = SMatrix.I(4); mat.rotateZ(angle); return mat; } SMatrix.MatrixtoSMatrix = function( mat ) { var smat = SMatrix.I(4); var index = 0; for (var j=0; j<4; j++) { for (var i=0; i<4; i++) { smat.elements[i][j] = mat[index]; index++; } } return smat; } SMatrix.MatEqSMat = function( mat, sMat ) { var index = 0; for (var j=0; j<4; j++) { for (var i=0; i<4; i++) { var m = mat[index]; var s = smat.elements[i][j]; if ( MathUtils.fpCmp(m,s) != 0) throw new Error( "mat != smat" ); index++; } } } // Matrix ///////////////////////////////////////////////////////////////////////////////////////////// */ Vector.prototype.flatten = function () { return this.elements; }; function mht(m) { var s = ""; if (m.length == 16) { for (var i = 0; i < 4; i++) { s += "[" + m[i*4+0].toFixed(4) + "," + m[i*4+1].toFixed(4) + "," + m[i*4+2].toFixed(4) + "," + m[i*4+3].toFixed(4) + "]
"; } } else if (m.length == 9) { for (var i = 0; i < 3; i++) { s += "[" + m[i*3+0].toFixed(4) + "," + m[i*3+1].toFixed(4) + "," + m[i*3+2].toFixed(4) + "]
"; } } else { return m.toString(); } return s; } // // gluLookAt // function makeLookAt(ex, ey, ez, cx, cy, cz, ux, uy, uz) { var eye = $V([ex, ey, ez]); var center = $V([cx, cy, cz]); var up = $V([ux, uy, uz]); var mag; var z = eye.subtract(center).toUnitVector(); var x = up.cross(z).toUnitVector(); var y = z.cross(x).toUnitVector(); var m = $M([[x.e(1), x.e(2), x.e(3), 0], [y.e(1), y.e(2), y.e(3), 0], [z.e(1), z.e(2), z.e(3), 0], [0, 0, 0, 1]]); var t = $M([[1, 0, 0, -ex], [0, 1, 0, -ey], [0, 0, 1, -ez], [0, 0, 0, 1]]); return m.x(t); } // // gluPerspective // function makePerspective(fovy, aspect, znear, zfar) { var ymax = znear * Math.tan(fovy * Math.PI / 360.0); var ymin = -ymax; var xmin = ymin * aspect; var xmax = ymax * aspect; return makeFrustum(xmin, xmax, ymin, ymax, znear, zfar); } // // glFrustum // function makeFrustum(left, right, bottom, top, znear, zfar) { var X = 2*znear/(right-left); var Y = 2*znear/(top-bottom); var A = (right+left)/(right-left); var B = (top+bottom)/(top-bottom); var C = -(zfar+znear)/(zfar-znear); var D = -2*zfar*znear/(zfar-znear); return Matrix.create([[X, 0, A, 0], [0, Y, B, 0], [0, 0, C, D], [0, 0, -1, 0]]); } // // glOrtho // function makeOrtho(left, right, bottom, top, znear, zfar) { var tx = - (right + left) / (right - left); var ty = - (top + bottom) / (top - bottom); var tz = - (zfar + znear) / (zfar - znear); return $M([[2 / (right - left), 0, 0, tx], [0, 2 / (top - bottom), 0, ty], [0, 0, -2 / (zfar - znear), tz], [0, 0, 0, 1]]); }