@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
135 lines • 10.5 kB
JavaScript
import { TgdBuffer } from "./../buffer/index.js";
export class TgdVertexArray {
constructor(gl, program, datasets, elements) {
this.gl = gl;
this.program = program;
this.datasets = datasets;
this.elements = elements;
this.drawBuffers = [];
this.elemBuffer = null;
const vao = gl.createVertexArray();
if (!vao)
throw new Error("Unable to create VertexArrayObject!");
this.vao = vao;
if (!program || !datasets)
return;
gl.bindVertexArray(vao);
this.drawBuffers = datasets.map(dataset => {
const buffer = new TgdBuffer(gl, {
data: dataset.data,
target: dataset.target,
usage: dataset.usage,
});
buffer.bind();
dataset.defineAttributes(gl, program);
return buffer;
});
if (elements) {
const buffer = new TgdBuffer(gl, {
data: elements,
target: "ELEMENT_ARRAY_BUFFER",
});
buffer.bind();
this.elemBuffer = buffer;
}
gl.bindVertexArray(null);
}
/**
* When you change the data of a dataset,
* you must call this function to update the VAO.
* Because datasets do not own any buffer.
*/
updateDataset(dataset) {
const { datasets } = this;
if (!datasets) {
console.error("You cannot update any dataset because no dataset has been attached to this VAO yet!");
return false;
}
const index = datasets.indexOf(dataset);
if (index === -1) {
console.error("This dataset is not bound to this VAO!");
dataset.debug();
this.debug();
return false;
}
const buffer = this.getBuffer(index);
if (!buffer) {
console.error(`There is no buffer with index #${index} in this VAO!`);
this.debug();
return false;
}
buffer.bufferData({
data: dataset.data,
});
return true;
}
updateElements(elements) {
if (!this.elements) {
throw new Error("This VAO has no elements data!");
}
if (!this.elemBuffer) {
throw new Error("This VAO has no elements buffer!");
}
switch (this.elements.BYTES_PER_ELEMENT) {
case 1:
this.elements = new Uint8Array(elements);
break;
case 2:
this.elements = new Uint16Array(elements);
break;
case 4:
this.elements = new Uint32Array(elements);
break;
default:
throw new Error(`Don't know how to deal with ${this.elements.BYTES_PER_ELEMENT} bytes per element!`);
}
this.elemBuffer.bufferData({ data: this.elements });
}
getBuffer(index) {
return this.drawBuffers[index];
}
toCode({ indent = "" } = {}) {
var _a;
const lines = [
"function createVAO(",
` gl: WebGL2RenderingContext,`,
` prg: WebGLProgram${(_a = this.datasets) === null || _a === void 0 ? void 0 : _a.map((_ds, index) => `, data${index}: ArrayBuffer`).join("")}`,
") {",
" const vao = gl.createVertexArray()",
" gl.bindVertexArray(vao)",
];
if (this.datasets)
for (const [index, dataset] of this.datasets.entries()) {
lines.push(` const buff${index} = gl.createBuffer()`, ` gl.bindBuffer(gl.${dataset.target}, buff${index})`, ` gl.bufferData(gl.${dataset.target}, data${index}, gl.${dataset.usage})`, dataset.toCode({ indent: `${indent} ` }));
}
lines.push(" return vao", "}");
return lines.map(line => `${indent}${line}`).join("\n");
}
debug(caption = "TgdVertexArray") {
console.log(caption);
if (this.program)
this.program.debug();
if (this.datasets) {
for (const [index, dataset] of this.datasets.entries()) {
dataset.debug(` Dataset #${index}`);
}
}
if (this.elements)
console.log("Elements:", this.elements);
}
bind() {
this.gl.bindVertexArray(this.vao);
}
unbind() {
this.gl.bindVertexArray(null);
}
delete() {
const { gl, vao, drawBuffers, elemBuffer } = this;
gl.deleteVertexArray(vao);
for (const buff of drawBuffers)
buff.delete();
if (elemBuffer)
elemBuffer.delete();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Zhby92YW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUt2QyxNQUFNLE9BQU8sY0FBYztJQU12QixZQUNvQixFQUEwQixFQUN6QixPQUFvQixFQUNwQixRQUFpQyxFQUMxQyxRQUFrQztRQUgxQixPQUFFLEdBQUYsRUFBRSxDQUF3QjtRQUN6QixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQXlCO1FBQzFDLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBUDdCLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQTtRQUM3QixlQUFVLEdBQXFCLElBQUksQ0FBQTtRQVFoRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNsQyxJQUFJLENBQUMsR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtRQUVoRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUVqQyxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2IsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNyQyxPQUFPLE1BQU0sQ0FBQTtRQUNqQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksUUFBUSxFQUFFLENBQUM7WUFDWCxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksRUFBRSxRQUFRO2dCQUNkLE1BQU0sRUFBRSxzQkFBc0I7YUFDakMsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUE7UUFDNUIsQ0FBQztRQUNELEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsT0FBbUI7UUFDN0IsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUN6QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixPQUFPLENBQUMsS0FBSyxDQUNULHFGQUFxRixDQUN4RixDQUFBO1lBQ0QsT0FBTyxLQUFLLENBQUE7UUFDaEIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdkMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtZQUN2RCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDZixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDWixPQUFPLEtBQUssQ0FBQTtRQUNoQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsS0FBSyxDQUNULGtDQUFrQyxLQUFLLGVBQWUsQ0FDekQsQ0FBQTtZQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUNaLE9BQU8sS0FBSyxDQUFBO1FBQ2hCLENBQUM7UUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1NBQ3JCLENBQUMsQ0FBQTtRQUNGLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELGNBQWMsQ0FBQyxRQUFrQjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtRQUNyRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7UUFDdkQsQ0FBQztRQUNELFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RDLEtBQUssQ0FBQztnQkFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUN4QyxNQUFLO1lBQ1QsS0FBSyxDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3pDLE1BQUs7WUFDVCxLQUFLLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDekMsTUFBSztZQUNUO2dCQUNJLE1BQU0sSUFBSSxLQUFLLENBQ1gsK0JBQStCLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLHFCQUFxQixDQUN0RixDQUFBO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLEtBQWtDLEVBQUU7O1FBQ3BELE1BQU0sS0FBSyxHQUFhO1lBQ3BCLHFCQUFxQjtZQUNyQiwrQkFBK0I7WUFDL0Isc0JBQXNCLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQ2xELElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNmLEtBQUs7WUFDTCxzQ0FBc0M7WUFDdEMsMkJBQTJCO1NBQzlCLENBQUE7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQ2IsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDckQsS0FBSyxDQUFDLElBQUksQ0FDTixlQUFlLEtBQUssc0JBQXNCLEVBQzFDLHNCQUFzQixPQUFPLENBQUMsTUFBTSxTQUFTLEtBQUssR0FBRyxFQUNyRCxzQkFBc0IsT0FBTyxDQUFDLE1BQU0sU0FBUyxLQUFLLFFBQVEsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUMxRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUM1QyxDQUFBO1lBQ0wsQ0FBQztRQUNMLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQy9CLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNELENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxHQUFHLGdCQUFnQjtRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BCLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3RDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBQ3pDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsSUFBSTtRQUNBLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRCxNQUFNO1FBQ0YsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUNqRCxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXO1lBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQzdDLElBQUksVUFBVTtZQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUN2QyxDQUFDO0NBQ0oifQ==