@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
133 lines • 11.4 kB
JavaScript
import { TgdDataset } from "./../dataset/index.js";
import { TgdGeometry } from "./geometry.js";
export class TgdGeometryBox extends TgdGeometry {
static fromBoundingBox(min, max) {
const [minX, minY, minZ] = min;
const [maxX, maxY, maxZ] = max;
const sizeX = maxX - minX;
const sizeY = maxY - minY;
const sizeZ = maxZ - minZ;
const geometry = new TgdGeometryBox({ sizeX, sizeY, sizeZ });
return geometry;
}
constructor({ sizeX = 1, sizeY = 1, sizeZ = 1, uvs = "sameOnEachFace", } = {}) {
const x = sizeX * 0.5;
const y = sizeY * 0.5;
const z = sizeZ * 0.5;
const dataset = new TgdDataset({
POSITION: "vec3",
NORMAL: "vec3",
TEXCOORD_0: "vec2",
});
// prettier-ignore
dataset.set("POSITION", new Float32Array([
...coords("+x+y+z", x, y, z),
...coords("+y+z+x", x, y, z),
...coords("+z+x+y", x, y, z),
...coords("-x+z+y", x, y, z),
...coords("-y+x+z", x, y, z),
...coords("-z+y+x", x, y, z),
]));
dataset.set("TEXCOORD_0", new Float32Array(getUVs(uvs)));
// prettier-ignore
dataset.set("NORMAL", new Float32Array([...XP6, ...YP6, ...ZP6, ...XN6, ...YN6, ...ZN6]));
super({
dataset,
drawMode: "TRIANGLES",
});
}
}
// prettier-ignore
const FACE_IJ = [
[-1, +1], [+1, +1], [-1, -1],
[+1, -1], [-1, -1], [+1, +1],
];
function coords(definition, ...sizes) {
function index(k) {
const txt = definition.charAt(k);
switch (txt) {
case "x":
return 0;
case "y":
return 1;
case "z":
return 2;
default:
throw new Error(`Invalid coordinate name at pos ${k}: "${txt}"!`);
}
}
function sgn(k) {
const txt = definition.charAt(k);
switch (txt) {
case "+":
return +1;
case "-":
return -1;
default:
throw new Error(`Invalid coordinate sign at pos ${k}: "${txt}"!`);
}
}
const out = [];
const sgnC = sgn(0);
const indexC = index(1);
const sgnI = sgn(2);
const indexI = index(3);
const sgnJ = sgn(4);
const indexJ = index(5);
for (const [index, index_] of FACE_IJ) {
const row = [];
row[indexC] = sizes[indexC] * sgnC;
row[indexI] = sizes[indexI] * sgnI * index;
row[indexJ] = sizes[indexJ] * sgnJ * index_;
out.push(...row);
}
return out;
}
// prettier-ignore
const FACE_UV = [
0, 0, 1, 0, 0, 1,
1, 1, 0, 1, 1, 0
];
const W3x2 = 1 / 3;
const H3x2 = 1 / 2;
function face3x2(col, row) {
const x = W3x2 * col;
const y = H3x2 * row;
return FACE_UV.map((v, index) => index % 2 == 0 ? x + W3x2 * v : y + H3x2 * v);
}
function getUVs(uvs) {
switch (uvs) {
case "sameOnEachFace":
return [
...FACE_UV,
...FACE_UV,
...FACE_UV,
...FACE_UV,
...FACE_UV,
...FACE_UV,
];
default:
// prettier-ignore
return [
...face3x2(0, 0),
...face3x2(1, 0),
...face3x2(2, 0),
...face3x2(0, 1),
...face3x2(1, 1),
...face3x2(2, 1),
];
}
}
const XP = [1, 0, 0];
const XP6 = [...XP, ...XP, ...XP, ...XP, ...XP, ...XP];
const XN = [-1, 0, 0];
const XN6 = [...XN, ...XN, ...XN, ...XN, ...XN, ...XN];
const YP = [0, 1, 0];
const YP6 = [...YP, ...YP, ...YP, ...YP, ...YP, ...YP];
const YN = [0, -1, 0];
const YN6 = [...YN, ...YN, ...YN, ...YN, ...YN, ...YN];
const ZP = [0, 0, 1];
const ZP6 = [...ZP, ...ZP, ...ZP, ...ZP, ...ZP, ...ZP];
const ZN = [0, 0, -1];
const ZN6 = [...ZN, ...ZN, ...ZN, ...ZN, ...ZN, ...ZN];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlb21ldHJ5L2JveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFVeEMsTUFBTSxPQUFPLGNBQWUsU0FBUSxXQUFXO0lBQzNDLE1BQU0sQ0FBQyxlQUFlLENBQ2xCLEdBQWlCLEVBQ2pCLEdBQWlCO1FBRWpCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQTtRQUM5QixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDNUQsT0FBTyxRQUFRLENBQUE7SUFDbkIsQ0FBQztJQUVELFlBQVksRUFDUixLQUFLLEdBQUcsQ0FBQyxFQUNULEtBQUssR0FBRyxDQUFDLEVBQ1QsS0FBSyxHQUFHLENBQUMsRUFDVCxHQUFHLEdBQUcsZ0JBQWdCLE1BQ0MsRUFBRTtRQUN6QixNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFBO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUE7UUFDckIsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQTtRQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQztZQUMzQixRQUFRLEVBQUUs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R0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtBQUN0RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNyQixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDdEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3BCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtBQUN0RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNyQixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDdEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3BCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtBQUN0RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNyQixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUEifQ==