@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
139 lines • 12.1 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,
center: [(maxX + minX) / 2, (maxY + minY) / 2, (maxZ + minZ) / 2],
});
return geometry;
}
constructor({ sizeX = 1, sizeY = 1, sizeZ = 1, uvs = "sameOnEachFace", center = [0, 0, 0], } = {}) {
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", center, x, y, z),
...coords("+y+z+x", center, x, y, z),
...coords("+z+x+y", center, x, y, z),
...coords("-x+z+y", center, x, y, z),
...coords("-y+x+z", center, x, y, z),
...coords("-z+y+x", center, 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, center, ...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 + center[indexC];
row[indexI] = sizes[indexI] * sgnI * index_ + center[indexI];
row[indexJ] = sizes[indexJ] * sgnJ * index + center[indexJ];
out.push(...row);
}
return out;
}
// prettier-ignore
const FACE_UV = [
1, 1,
1, 0,
0, 1,
0, 0,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlb21ldHJ5L2JveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBR3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFVeEMsTUFBTSxPQUFPLGNBQWUsU0FBUSxXQUFXO0lBQzNDLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBaUIsRUFBRSxHQUFpQjtRQUN2RCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDOUIsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFBO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDO1lBQ2hDLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BFLENBQUMsQ0FBQTtRQUNGLE9BQU8sUUFBUSxDQUFBO0lBQ25CLENBQUM7SUFFRCxZQUFZLEVBQ1IsS0FBSyxHQUFHLENBQUMsRUFDVCxLQUFLLEdBQUcsQ0FBQyxFQUNULEtBQUssR0FBRyxDQUFDLEVBQ1QsR0FBRyxHQUFHLGdCQUFnQixFQUN0QixNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMs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QUUsQ0FBQyxDQUFDO2dCQUNoQixHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2hCLENBQUE7SUFDQSxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDdEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDckIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ3RELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDdEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDckIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ3RELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDdEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDckIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBIn0=