UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

220 lines 13.4 kB
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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