UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

84 lines 6.85 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); } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Zhby92YW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUt2QyxNQUFNLE9BQU8sY0FBYztJQU12QixZQUNvQixFQUEwQixFQUN6QixPQUFvQixFQUNwQixRQUFpQyxFQUNqQyxRQUFrQztRQUhuQyxPQUFFLEdBQUYsRUFBRSxDQUF3QjtRQUN6QixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQXlCO1FBQ2pDLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBUHRDLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQTtRQUM3QixlQUFVLEdBQXFCLElBQUksQ0FBQTtRQVFoRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNsQyxJQUFJLENBQUMsR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtRQUVoRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUVqQyxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2IsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxP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