@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
131 lines • 11.9 kB
JavaScript
import { TgdDataset } from "./../dataset/index.js";
import { TgdVec3 } from "./../math/index.js";
import { webglElementTypeFromTypedArray } from "./../utils/index.js";
/**
* Geometry is used to define a mesh.
* It must hold at least one vec3 attributes
* for the vertices.
*/
export class TgdGeometry {
static make(options) {
var _a, _b, _c;
const definition = {};
const { count, drawMode, elements, attPosition, attNormal, attUV } = options;
definition[attPosition.name] = (_a = attPosition.type) !== null && _a !== void 0 ? _a : "vec3";
if (attNormal)
definition[attNormal.name] = (_b = attNormal.type) !== null && _b !== void 0 ? _b : "vec3";
if (attUV)
definition[attUV.name] = (_c = attUV.type) !== null && _c !== void 0 ? _c : "vec2";
const dataset = new TgdDataset(definition);
dataset.set(attPosition.name, attPosition.data);
if (attNormal)
dataset.set(attNormal.name, attNormal.data);
if (attUV)
dataset.set(attUV.name, attUV.data);
return new TgdGeometry({
dataset,
count,
drawMode,
elements,
});
}
constructor(options) {
var _a;
const { dataset, drawMode = "TRIANGLES", attPosition = "POSITION", attNormal = "NORMAL", attUV = "TEXCOORD_0", } = options;
this._dataset = dataset;
this.drawMode = drawMode;
const { elements } = options;
this.elements = elements;
this._elementsType = elements
? webglElementTypeFromTypedArray(elements)
: 0;
this.attPosition = attPosition;
this.attNormal = attNormal;
this.attUV = attUV;
this.count = (_a = elements === null || elements === void 0 ? void 0 : elements.length) !== null && _a !== void 0 ? _a : dataset.count;
if (options.computeNormalsIfMissing)
this.computeNormals();
}
get dataset() {
return this._dataset;
}
get elementsType() {
return this._elementsType;
}
getElement(index) {
var _a, _b;
return (_b = (_a = this.elements) === null || _a === void 0 ? void 0 : _a[index]) !== null && _b !== void 0 ? _b : -1;
}
computeNormals() {
let normals = [];
if (this.drawMode === WebGL2RenderingContext.TRIANGLES ||
this.drawMode === "TRIANGLES") {
normals = this.computeNormalsForTrianglesDrawMode();
}
else {
console.error("We don't know how to compute normals for this draw mode:", this.drawMode);
return;
}
const attNormalName = this.attNormal;
this.dataset.addAttributes({
[attNormalName]: "vec3",
});
const values = [];
for (const [nx, ny, nz] of normals) {
values.push(nx, ny, nz);
}
this.dataset.set(attNormalName, new Float32Array(values));
}
computeNormalsForTrianglesDrawMode() {
const ds = this.dataset;
const normalsAccumulator = new Map();
const addNormal = (index, A, B, C) => {
const norm = computeNormal(A, B, C);
const item = normalsAccumulator.get(index);
if (item) {
item.add(norm);
}
else {
normalsAccumulator.set(index, new TgdVec3(norm.x, norm.y, norm.z));
}
};
const { get } = ds.getAttribAccessor(this.attPosition);
const indexes = new Set();
let indexMax = 0;
for (let element = 0; element < this.count; element += 3) {
const index0 = this.getElement(element + 0);
indexes.add(index0);
indexMax = Math.max(indexMax, index0);
const index1 = this.getElement(element + 1);
indexes.add(index1);
indexMax = Math.max(indexMax, index1);
const index2 = this.getElement(element + 2);
indexes.add(index2);
indexMax = Math.max(indexMax, index2);
const A = new TgdVec3(get(index0, 0), get(index0, 1), get(index0, 2));
const B = new TgdVec3(get(index1, 0), get(index1, 1), get(index1, 2));
const C = new TgdVec3(get(index2, 0), get(index2, 1), get(index2, 2));
addNormal(index0, A, B, C);
addNormal(index1, B, C, A);
addNormal(index2, C, A, B);
}
const normals = [];
for (let index = 0; index <= indexMax; index++) {
const item = normalsAccumulator.get(index);
if (item) {
item.normalize();
normals.push(item);
}
else {
normals.push(new TgdVec3());
}
}
return normals;
}
}
function computeNormal(A, B, C) {
const AB = new TgdVec3(B).subtract(A);
const AC = new TgdVec3(C).subtract(A);
return AB.cross(AC).normalize();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VvbWV0cnkvZ2VvbWV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBd0MsTUFBTSxjQUFjLENBQUE7QUFFL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUF1QzNEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQWNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBNEI7O1FBQzNDLE1BQU0sVUFBVSxHQUF5QixFQUFFLENBQUE7UUFDM0MsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQzlELE9BQU8sQ0FBQTtRQUNYLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBQSxXQUFXLENBQUMsSUFBSSxtQ0FBSSxNQUFNLENBQUE7UUFDekQsSUFBSSxTQUFTO1lBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFBLFNBQVMsQ0FBQyxJQUFJLG1DQUFJLE1BQU0sQ0FBQTtRQUNwRSxJQUFJLEtBQUs7WUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQUEsS0FBSyxDQUFDLElBQUksbUNBQUksTUFBTSxDQUFBO1FBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDL0MsSUFBSSxTQUFTO1lBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FB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R0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FDakIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDZCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUNkLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQ2pCLENBQUE7WUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FDakIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDZCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUNkLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQ2pCLENBQUE7WUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FDakIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDZCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUNkLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQ2pCLENBQUE7WUFDRCxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDMUIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQzFCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUM5QixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQWMsRUFBRSxDQUFBO1FBQzdCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssSUFBSSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDUCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7Z0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQy9CLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUE7SUFDbEIsQ0FBQztDQUNKO0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBVSxFQUFFLENBQVUsRUFBRSxDQUFVO0lBQ3JELE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFBO0FBQ25DLENBQUMifQ==