UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

135 lines 10.5 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Zhby92YW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUt2QyxNQUFNLE9BQU8sY0FBYztJQU12QixZQUNvQixFQUEwQixFQUN6QixPQUFvQixFQUNwQixRQUFpQyxFQUMxQyxRQUFrQztRQUgxQixPQUFFLEdBQUYsRUFBRSxDQUF3QjtRQUN6QixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQXlCO1FBQzFDLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBUDdCLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQTtRQUM3QixlQUFVLEdBQXFCLElBQUksQ0FBQTtRQVFoRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNsQyxJQUFJLENBQUMsR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtRQUVoRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUVqQyxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2IsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxP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