UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

134 lines 11.3 kB
import { TgdGeometry } from "../geometry.js"; import { TgdDataset } from "./../../dataset/index.js"; export function tgdGeometryJoin(geometries, options = {}) { if (geometries.length < 2) { throw new Error("You must provide at least two geometries to join!"); } let totalCount = 0; let datDrawMode = undefined; let hasElements = false; let hasPosition = false; let hasNormal = false; let hasUV = false; const setPosition = new Set(); const setNormal = new Set(); const setUV = new Set(); const datPosition = []; const datNormal = []; const datUV = []; const datElements = []; for (const geometry of geometries) { const { attPosition, attNormal, attUV, drawMode, dataset, elements } = geometry; if (elements) hasElements = true; if (dataset.hasAttribute(attPosition)) { hasPosition = true; setPosition.add(dataset.getType(attPosition)); } if (dataset.hasAttribute(attNormal)) { hasNormal = true; setNormal.add(dataset.getType(attNormal)); } if (dataset.hasAttribute(attUV)) { hasUV = true; setUV.add(dataset.getType(attUV)); } if (!areDrawModeEqual(drawMode, datDrawMode)) { throw new Error("Geometries must have the same draw mode!"); } datDrawMode = drawMode; } if (setPosition.size > 1) { throw new Error(`Different types fo attribute "POSITION": ${setPosition.values().toArray().join(", ")}.`); } if (setNormal.size > 1) { throw new Error(`Different types fo attribute "NORMAL": ${setNormal.values().toArray().join(", ")}.`); } if (setUV.size > 1) { throw new Error(`Different types fo attribute "TEX_COORD0": ${setUV.values().toArray().join(", ")}.`); } for (const geometry of geometries) { const { dataset, attPosition, attNormal, attUV, elements } = geometry; if (dataset.hasAttribute(attPosition)) dataset.get(attPosition, datPosition); if (dataset.hasAttribute(attNormal)) dataset.get(attNormal, datNormal); if (dataset.hasAttribute(attUV)) dataset.get(attUV, datUV); const { count } = dataset; concatElements(datElements, elements ?? count, totalCount); totalCount += count; } const { name, attPosition = "POSITION", attNormal = "NORMAL", attUV = "TEX_COORD0" } = options; const record = {}; if (hasPosition) record[attPosition] = resolveType(setPosition); if (hasNormal) record[attNormal] = resolveType(setNormal); if (hasUV) record[attUV] = resolveType(setUV); const dataset = new TgdDataset(record, { name, }); if (hasPosition) dataset.set(attPosition, new Float32Array(datPosition)); if (hasNormal) dataset.set(attNormal, new Float32Array(datNormal)); if (hasUV) dataset.set(attUV, new Float32Array(datUV)); const geometry = new TgdGeometry({ dataset, count: hasElements ? datElements.length : totalCount, attPosition: hasPosition ? attPosition : undefined, attNormal: hasNormal ? attNormal : undefined, attUV: hasUV ? attUV : undefined, drawMode: datDrawMode ?? "TRIANGLES", elements: hasElements ? TgdGeometry.fitElementsInTypeArray(datElements) : undefined, }); return geometry; } function concatElements(datElements, elements, base) { if (typeof elements === "number") { for (let i = 0; i < elements; i++) { datElements.push(i + base); } } else { for (let i = 0; i < elements.length; i++) { datElements.push(elements[i] + base); } } } function areDrawModeEqual(drawMode1, drawMode2) { if (drawMode1 === undefined || drawMode2 === undefined) return true; return resolveDrawMode(drawMode1) === resolveDrawMode(drawMode2); } function resolveDrawMode(drawMode) { if (typeof drawMode === "number") return drawMode; switch (drawMode) { case "LINES": return 0; case "LINE_LOOP": return 0; case "LINE_STRIP": return 0; case "POINTS": return 0; case "TRIANGLES": return 0; case "TRIANGLE_FAN": return 0; case "TRIANGLE_STRIP": return 0; default: throw new Error(`Unknown draw mode: "${drawMode}"!`); } } function resolveType(set) { for (const type of set) return type; throw new Error(`No type defined for this attribute!`); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZW9tZXRyeS90b29scy9qb2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBd0MsTUFBTSxjQUFjLENBQUE7QUFFL0UsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsVUFBeUIsRUFDekIsVUFLSSxFQUFFO0lBRU4sSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFBO0lBQ2xCLElBQUksV0FBVyxHQUF1QyxTQUFTLENBQUE7SUFDL0QsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFBO0lBQ3ZCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQTtJQUN2QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDckIsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ2pCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUE7SUFDckMsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtJQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO0lBQy9CLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQTtJQUNoQyxNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUE7SUFDOUIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQTtJQUNoQyxLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxH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