@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
134 lines • 11.3 kB
JavaScript
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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