@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
220 lines • 13.4 kB
JavaScript
import { padColOfNumbers } from "./../debug/index.js";
import { TgdVec3 } from "./vec3.js";
import { TgdVec4 } from "./vec4.js";
import { TgdMat4 } from "./mat4.js";
import { mat3 } from "gl-matrix";
/**
* Column-first 3x3 matrix.
*
* - `m12` means row 2 and column 3 (__A__).
* - `m20` means row 3 and column 1 (__B__).
*
* ```
* +-+-+-+
* | | | |
* +-+-+-+
* | | |A|
* +-+-+-+
* |B| | |
* +-+-+-+
* ```
*
* This is how mathematicians use matrices.
*
* But, internally, for WebGL compliance, we store the data like this:
*
* ```
* +-+-+-+
* |0|3|6|
* +-+-+-+
* |1|4|7|
* +-+-+-+
* |2|5|8|
* +-+-+-+
* ```
*
* That's why is better to access members through the accessor `m00`, `m01`, etc.
*/
export class TgdMat3 extends Float32Array {
constructor(m00 = 1, m10 = 0, m20 = 0, m01 = 0, m11 = 1, m21 = 0, m02 = 0, m12 = 0, m22 = 1) {
if (typeof m00 === "number" &&
typeof m10 === "number" &&
typeof m20 === "number") {
super([m00, m10, m20, m01, m11, m21, m02, m12, m22]);
}
else if ((m00 instanceof TgdVec3 || m00 instanceof TgdVec4) &&
(m10 instanceof TgdVec3 || m10 instanceof TgdVec4) &&
(m20 instanceof TgdVec3 || m20 instanceof TgdVec4)) {
const col1 = m00;
const col2 = m10;
const col3 = m20;
// prettier-ignore
super([
col1.x, col1.y, col1.z,
col2.x, col2.y, col2.z,
col3.x, col3.y, col3.z
]);
}
else if (m00 instanceof TgdMat3) {
const mat3 = m00;
super([
mat3.m00,
mat3.m10,
mat3.m20,
mat3.m01,
mat3.m11,
mat3.m21,
mat3.m02,
mat3.m12,
mat3.m22,
]);
}
else if (m00 instanceof TgdMat4) {
const mat4 = m00;
super([
mat4.m00,
mat4.m10,
mat4.m20,
mat4.m01,
mat4.m11,
mat4.m21,
mat4.m02,
mat4.m12,
mat4.m22,
]);
}
else {
// eslint-disable-next-line prefer-rest-params
console.error("[TgdMat3]", arguments);
throw new Error(`Invalid TgdMat3 initialization!`);
}
}
multiply(mat) {
mat3.multiply(this, this, mat);
return this;
}
transpose() {
let temporary = this.m10;
this.m10 = this.m01;
this.m01 = temporary;
temporary = this.m20;
this.m20 = this.m02;
this.m02 = temporary;
temporary = this.m21;
this.m21 = this.m12;
this.m12 = temporary;
return this;
}
fromQuat({ x, y, z, w }) {
mat3.fromQuat(this, [x, y, z, w]);
return this;
}
toAxes(axisX, axisY, axisZ) {
this.toAxisX(axisX);
this.toAxisY(axisY);
return this.toAxisZ(axisZ);
}
toAxisX(axisX) {
axisX.x = this.m00;
axisX.y = this.m01;
axisX.z = this.m02;
return this;
}
toAxisY(axisY) {
axisY.x = this.m10;
axisY.y = this.m11;
axisY.z = this.m12;
return this;
}
toAxisZ(axisZ) {
axisZ.x = this.m20;
axisZ.y = this.m21;
axisZ.z = this.m22;
return this;
}
scale(factor) {
this[0] *= factor;
this[1] *= factor;
this[2] *= factor;
this[3] *= factor;
this[4] *= factor;
this[5] *= factor;
this[6] *= factor;
this[7] *= factor;
this[8] *= factor;
return this;
}
get m00() {
return this[IDX_m00];
}
set m00(v) {
this[IDX_m00] = v;
}
get m10() {
return this[IDX_m10];
}
set m10(v) {
this[IDX_m10] = v;
}
get m20() {
return this[IDX_m20];
}
set m20(v) {
this[IDX_m20] = v;
}
get m01() {
return this[IDX_m01];
}
set m01(v) {
this[IDX_m01] = v;
}
get m11() {
return this[IDX_m11];
}
set m11(v) {
this[IDX_m11] = v;
}
get m21() {
return this[IDX_m21];
}
set m21(v) {
this[IDX_m21] = v;
}
get m02() {
return this[IDX_m02];
}
set m02(v) {
this[IDX_m02] = v;
}
get m12() {
return this[IDX_m12];
}
set m12(v) {
this[IDX_m12] = v;
}
get m22() {
return this[IDX_m22];
}
set m22(v) {
this[IDX_m22] = v;
}
debug(caption = "Mat3") {
const row0 = padColOfNumbers([this.m00, this.m01, this.m02]);
const row1 = padColOfNumbers([this.m10, this.m11, this.m12]);
const row2 = padColOfNumbers([this.m20, this.m21, this.m22]);
console.log(caption, this.slice());
console.log(" ", row0.join(" | "));
console.log(" ", row1.join(" | "));
console.log(" ", row2.join(" | "));
}
}
const IDX_m00 = 0;
const IDX_m10 = 1;
const IDX_m20 = 2;
const IDX_m01 = 3;
const IDX_m11 = 4;
const IDX_m21 = 5;
const IDX_m02 = 6;
const IDX_m12 = 7;
const IDX_m22 = 8;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0My5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRoL21hdDMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUU1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsTUFBTSxPQUFPLE9BQVEsU0FBUSxZQUFZO0lBbUJyQyxZQUNJLE1BQXNELENBQUMsRUFDdkQsTUFBa0MsQ0FBQyxFQUNuQyxNQUFrQyxDQUFDLEVBQ25DLE1BQWMsQ0FBQyxFQUNmLE1BQWMsQ0FBQyxFQUNmLE1BQWMsQ0FBQyxFQUNmLE1BQWMsQ0FBQyxFQUNmLE1BQWMsQ0FBQyxFQUNmLE1BQWMsQ0FBQztRQUVmLElBQ0ksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUN2QixPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQ3ZCLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFDekIsQ0FBQztZQUNDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN4RCxDQUFDO2FBQU0sSUFDSCxDQUFDLEdBQUcsWUFBWSxPQUFPLElBQUksR0FBRyxZQUFZLE9BQU8sQ0FBQztZQUNsRCxDQUFDLEdBQUcsWUFBWSxPQUFPLElBQUksR0FBRyxZQUFZLE9BQU8sQ0FBQztZQUNsRCxDQUFDLEdBQUcsWUFBWSxPQUFPLElBQUksR0FBRyxZQUFZ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