UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

139 lines 12.1 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, 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=