/** * Runtime Matrix4 * @param graphics * @param parentObject * @param matrix4 * @param grain * @constructor */ GameLib.D3.Matrix4 = function( graphics, parentObject, matrix4, grain ) { for (var property in matrix4) { if (matrix4.hasOwnProperty(property)) { this[property] = matrix4[property]; } } GameLib.D3.Utils.Extend(GameLib.D3.Matrix4, GameLib.D3.API.Matrix4); this.graphics = graphics; this.graphics.isNotThreeThrow(); this.parentObject = parentObject; if (GameLib.D3.Utils.UndefinedOrNull(grain)) { grain = 0.001; } this.grain = grain; this.rows[0] = new GameLib.D3.Vector4( this.graphics, this, this.rows[0], grain ); this.rows[1] = new GameLib.D3.Vector4( this.graphics, this, this.rows[1], grain ); this.rows[2] = new GameLib.D3.Vector4( this.graphics, this, this.rows[2], grain ); this.rows[3] = new GameLib.D3.Vector4( this.graphics, this, this.rows[3], grain ); this.instance = this.createInstance(); }; /** * Creates a matrix 4 instance (currently from graphics lib) * @param update */ GameLib.D3.Matrix4.prototype.createInstance = function(update) { var instance = null; if (update) { instance = this.instance; } if (!instance) { instance = new THREE.Matrix4(); } instance.set( this.rows[0].x, this.rows[0].y, this.rows[0].z, this.rows[0].w, this.rows[1].x, this.rows[1].y, this.rows[1].z, this.rows[1].w, this.rows[2].x, this.rows[2].y, this.rows[2].z, this.rows[2].w, this.rows[3].x, this.rows[3].y, this.rows[3].z, this.rows[3].w ); return instance; }; /** * Updates this instance */ GameLib.D3.Matrix4.prototype.updateInstance = function() { this.createInstance(true); }; GameLib.D3.Matrix4.prototype.rotationMatrixX = function (radians) { this.identity(); this.rows[1] = new GameLib.D3.API.Vector4(0, Math.cos(radians), -1 * Math.sin(radians), 0); this.rows[2] = new GameLib.D3.API.Vector4(0, Math.sin(radians), Math.cos(radians), 0); return this; }; GameLib.D3.Matrix4.prototype.rotationMatrixY = function (radians) { this.identity(); this.rows[0] = new GameLib.D3.API.Vector4( Math.cos(radians), 0, Math.sin(radians), 0 ); this.rows[2] = new GameLib.D3.API.Vector4( -1 * Math.sin(radians), 0, Math.cos(radians), 0 ); return this; }; GameLib.D3.Matrix4.prototype.rotationMatrixZ = function (radians) { this.identity(); this.rows[0] = new GameLib.D3.API.Vector4(Math.cos(radians), -1 * Math.sin(radians), 0, 0); this.rows[1] = new GameLib.D3.API.Vector4(Math.sin(radians), Math.cos(radians), 0, 0); return this; }; GameLib.D3.Matrix4.prototype.rotateX = function (radians, point) { this.identity(); this.rotationMatrixX(radians); return this.multiply(point); }; GameLib.D3.Matrix4.prototype.rotateY = function (radians, point) { this.identity(); this.rotationMatrixY(radians); return this.multiply(point); }; GameLib.D3.Matrix4.prototype.rotateZ = function (radians, point) { this.identity(); this.rotationMatrixZ(radians); return this.multiply(point); }; GameLib.D3.Matrix4.prototype.multiply = function (mvp) { if (mvp instanceof GameLib.D3.API.Vector4) { return new GameLib.D3.API.Vector4( this.rows[0].x * mvp.x + this.rows[0].y * mvp.y + this.rows[0].z * mvp.z + this.rows[0].w * mvp.w, this.rows[1].x * mvp.x + this.rows[1].y * mvp.y + this.rows[1].z * mvp.z + this.rows[1].w * mvp.w, this.rows[2].x * mvp.x + this.rows[2].y * mvp.y + this.rows[2].z * mvp.z + this.rows[2].w * mvp.w, this.rows[3].x * mvp.x + this.rows[3].y * mvp.y + this.rows[3].z * mvp.z + this.rows[3].w * mvp.w ); } else if (mvp instanceof GameLib.D3.API.Vector3) { return new GameLib.D3.API.Vector3( this.rows[0].x * mvp.x + this.rows[0].y * mvp.y + this.rows[0].z * mvp.z, this.rows[1].x * mvp.x + this.rows[1].y * mvp.y + this.rows[1].z * mvp.z, this.rows[2].x * mvp.x + this.rows[2].y * mvp.y + this.rows[2].z * mvp.z ); } }; GameLib.D3.Matrix4.prototype.identity = function () { this.rows = [ new GameLib.D3.API.Vector4(1, 0, 0, 0), new GameLib.D3.API.Vector4(0, 1, 0, 0), new GameLib.D3.API.Vector4(0, 0, 1, 0), new GameLib.D3.API.Vector4(0, 0, 0, 1) ]; }; GameLib.D3.Matrix4.prototype.lookAt = function (position, target, up) { this.instance.lookAt(position.instance, target.instance, up.instance); this.rows[0].x = this.instance.elements[0]; this.rows[0].y = this.instance.elements[1]; this.rows[0].z = this.instance.elements[2]; this.rows[0].w = this.instance.elements[3]; this.rows[1].x = this.instance.elements[4]; this.rows[1].y = this.instance.elements[5]; this.rows[1].z = this.instance.elements[6]; this.rows[1].w = this.instance.elements[7]; this.rows[2].x = this.instance.elements[8]; this.rows[2].y = this.instance.elements[9]; this.rows[2].z = this.instance.elements[10]; this.rows[2].w = this.instance.elements[11]; this.rows[3].x = this.instance.elements[12]; this.rows[3].y = this.instance.elements[13]; this.rows[3].z = this.instance.elements[14]; this.rows[3].w = this.instance.elements[15]; // var pv = new GameLib.D3.API.Vector3(position.x, position.y, position.z); // // var z = pv.subtract(target).normalize(); // // if (z.squared() === 0) { // z.z = 1; // } // // var x = up.cross(z).normalize(); // // if (x.squared() === 0) { // z.x += 0.0001; // x = up.cross(z).normalize(); // } // // var y = z.cross(x); // // this.rows[0].x = x.x; // this.rows[0].y = x.y; // this.rows[0].z = x.z; // // this.rows[1].x = y.x; // this.rows[1].y = y.y; // this.rows[1].z = y.z; // // this.rows[2].x = z.x; // this.rows[2].y = z.y; // this.rows[2].z = z.z; // // return this; };