UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

133 lines 11.4 kB
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==