r3-legacy/src/game-lib-api-matrix4.js

134 lines
3.8 KiB
JavaScript
Raw Normal View History

/**
* Api Matrix 4
2016-12-22 17:22:19 +01:00
* @param row0 GameLib.API.Vector4
* @param row1 GameLib.API.Vector4
* @param row2 GameLib.API.Vector4
* @param row3 GameLib.API.Vector4
* @constructor
*/
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4 = function ApiMatrix4(
row0,
row1,
row2,
row3
) {
this.rows = [];
2016-12-15 14:53:39 +01:00
if (GameLib.Utils.UndefinedOrNull(row0)) {
2016-12-22 17:22:19 +01:00
row0 = new GameLib.API.Vector4(1, 0, 0, 0);
}
this.rows[0] = row0;
2016-12-15 14:53:39 +01:00
if (GameLib.Utils.UndefinedOrNull(row1)) {
2016-12-22 17:22:19 +01:00
row1 = new GameLib.API.Vector4(0, 1, 0, 0);
}
this.rows[1] = row1;
2016-12-15 14:53:39 +01:00
if (GameLib.Utils.UndefinedOrNull(row2)) {
2016-12-22 17:22:19 +01:00
row2 = new GameLib.API.Vector4(0, 0, 1, 0);
}
this.rows[2] = row2;
2016-12-15 14:53:39 +01:00
if (GameLib.Utils.UndefinedOrNull(row3)) {
2016-12-22 17:22:19 +01:00
row3 = new GameLib.API.Vector4(0, 0, 0, 1);
}
this.rows[3] = row3;
2016-12-22 17:22:19 +01:00
this.temp = [];
this.temp.push(
new GameLib.API.Vector4()
);
this.temp.push(
new GameLib.API.Vector4()
);
this.temp.push(
new GameLib.API.Vector4()
);
this.temp.push(
new GameLib.API.Vector4()
);
2017-01-02 17:05:40 +01:00
this.forward = new GameLib.API.Vector4();
this.left = new GameLib.API.Vector4();
this.up = new GameLib.API.Vector4();
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.rotationMatrixX = function (radians) {
this.identity();
2016-12-22 17:22:19 +01:00
this.rows[1] = new GameLib.API.Vector4(0, Math.cos(radians), -1 * Math.sin(radians), 0);
this.rows[2] = new GameLib.API.Vector4(0, Math.sin(radians), Math.cos(radians), 0);
return this;
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.rotationMatrixY = function (radians) {
this.identity();
2016-12-22 17:22:19 +01:00
this.rows[0] = new GameLib.API.Vector4(
Math.cos(radians),
0,
Math.sin(radians),
0
);
2016-12-22 17:22:19 +01:00
this.rows[2] = new GameLib.API.Vector4(
-1 * Math.sin(radians),
0,
Math.cos(radians),
0
);
return this;
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.rotationMatrixZ = function (radians) {
this.identity();
2016-12-22 17:22:19 +01:00
this.rows[0] = new GameLib.API.Vector4(Math.cos(radians), -1 * Math.sin(radians), 0, 0);
this.rows[1] = new GameLib.API.Vector4(Math.sin(radians), Math.cos(radians), 0, 0);
return this;
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.rotateX = function (radians, point) {
this.identity();
this.rotationMatrixX(radians);
return this.multiply(point);
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.rotateY = function (radians, point) {
this.identity();
this.rotationMatrixY(radians);
return this.multiply(point);
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.rotateZ = function (radians, point) {
this.identity();
this.rotationMatrixZ(radians);
return this.multiply(point);
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.multiply = function (mvp) {
2016-12-22 17:22:19 +01:00
if (mvp instanceof GameLib.API.Quaternion || mvp instanceof GameLib.API.Vector4) {
2016-12-15 14:53:39 +01:00
return new GameLib.API.Quaternion(
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
);
2016-12-15 14:53:39 +01:00
} else if (mvp instanceof GameLib.API.Vector3) {
return new GameLib.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
);
}
};
2016-12-15 14:53:39 +01:00
GameLib.API.Matrix4.prototype.identity = function () {
this.rows = [
2016-12-22 17:22:19 +01:00
new GameLib.API.Vector4(1, 0, 0, 0),
new GameLib.API.Vector4(0, 1, 0, 0),
new GameLib.API.Vector4(0, 0, 1, 0),
new GameLib.API.Vector4(0, 0, 0, 1)
];
};