From b89a7ee8b956c96a1dcee995ea840feddc5d4b27 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Thu, 22 Dec 2011 07:25:50 -0800 Subject: First commit of Ninja to ninja-internal Signed-off-by: Valerio Virgillito --- js/helper-classes/3D/glUtils.js | 319 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 js/helper-classes/3D/glUtils.js (limited to 'js/helper-classes/3D/glUtils.js') diff --git a/js/helper-classes/3D/glUtils.js b/js/helper-classes/3D/glUtils.js new file mode 100644 index 00000000..f6d075f8 --- /dev/null +++ b/js/helper-classes/3D/glUtils.js @@ -0,0 +1,319 @@ +/* +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]]); +} -- cgit v1.2.3