UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

104 lines 9.49 kB
export class TgdTable { static computeByteLength(cols, rows, dimensions, bytesPerElement) { let bytesPerRow = cols * dimensions * bytesPerElement; while ((bytesPerRow & 3) !== 0) { bytesPerRow++; } return rows * bytesPerRow; } constructor(buffer, cols, rows, dimensions, bytesPerElement) { this.buffer = buffer; this.cols = cols; this.rows = rows; this.dimensions = dimensions; this.bytesPerElement = bytesPerElement; const expectedByteLength = TgdTable.computeByteLength(cols, rows, dimensions, bytesPerElement); if (buffer.byteLength < expectedByteLength) { throw new Error(`Your data is ${buffer.byteLength} bytes long. But for a ${cols}x${rows} table we need at least ${expectedByteLength} bytes! Please use TgdTable.computeByteLength() to get the correct length (with all needed paddings).`); } const bytesPerVector = dimensions * bytesPerElement; this.bytesPerVector = bytesPerVector; let bytesPerRow = cols * bytesPerVector; let bytePadding = 0; while ((bytesPerRow & 3) !== 0) { bytePadding++; bytesPerRow++; } this.bytePadding = bytePadding; this.bytesPerRow = bytesPerRow; this.bytesPerElement = bytesPerElement; this.view = new DataView(buffer); } offset(col, row, dimension = 0) { const byteOffset = row * this.bytesPerRow + col * this.bytesPerVector + this.bytesPerElement * dimension; return byteOffset; } setFloat32(value, col, row, dimension) { const byteOffset = this.offset(col, row, dimension); this.view.setFloat32(byteOffset, value); } getFloat32(col, row, dimension) { const byteOffset = this.offset(col, row, dimension); return this.view.getFloat32(byteOffset); } setUint8(value, col, row, dimension) { const byteOffset = this.offset(col, row, dimension); this.view.setUint8(byteOffset, value); } getUint8(col, row, dimension) { const byteOffset = this.offset(col, row, dimension); return this.view.getUint8(byteOffset); } } export class TgdTableUint8 { constructor(cols, rows, dimensions) { this.cols = cols; this.rows = rows; this.dimensions = dimensions; const byteLength = TgdTable.computeByteLength(cols, rows, dimensions, Uint8Array.BYTES_PER_ELEMENT); const buffer = new ArrayBuffer(byteLength); this.table = new TgdTable(buffer, cols, rows, dimensions, Uint8Array.BYTES_PER_ELEMENT); } get buffer() { return this.table.buffer; } set(value, col, row, dimension) { this.table.setUint8(value, col, row, dimension); } setVec(values, col, row) { for (const [dimension, value] of values.entries()) { this.table.setUint8(value, col, row, dimension); } } get(col, row, dimension) { return this.table.getUint8(col, row, dimension); } } export class TgdTableFloat32 { constructor(cols, rows, dimensions) { this.cols = cols; this.rows = rows; this.dimensions = dimensions; const byteLength = TgdTable.computeByteLength(cols, rows, dimensions, Float32Array.BYTES_PER_ELEMENT); const buffer = new ArrayBuffer(byteLength); this.table = new TgdTable(buffer, cols, rows, dimensions, Float32Array.BYTES_PER_ELEMENT); } get buffer() { return this.table.buffer; } set(value, col, row, dimension) { this.table.setFloat32(value, col, row, dimension); } setVec(values, col, row) { for (const [dimension, value] of values.entries()) this.table.setFloat32(value, col, row, dimension); } get(col, row, dimension) { return this.table.getFloat32(col, row, dimension); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFibGUvdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFFBQVE7SUFDVixNQUFNLENBQUMsaUJBQWlCLENBQzNCLElBQVksRUFDWixJQUFZLEVBQ1osVUFBa0IsRUFDbEIsZUFBdUI7UUFFdkIsSUFBSSxXQUFXLEdBQUcsSUFBSSxHQUFHLFVBQVUsR0FBRyxlQUFlLENBQUE7UUFDckQsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixXQUFXLEVBQUUsQ0FBQTtRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLEdBQUcsV0FBVyxDQUFBO0lBQzdCLENBQUM7SUFRRCxZQUNvQixNQUFtQixFQUNuQixJQUFZLEVBQ1osSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLGVBQXVCO1FBSnZCLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLG9CQUFlLEdBQWYsZUFBZSxDQUFRO1FBRXZDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUNqRCxJQUFJLEVBQ0osSUFBSSxFQUNKLFVBQVUsRUFDVixlQUFlLENBQ2xCLENBQUE7UUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixNQUFNLENBQUMsVUFBVTtZQUNqRCxJQUFJLElBQUksSUFBSSwyQkFBMkIsa0JBQWtCOzhGQUN5QixDQUFDLENBQUE7UUFDdkYsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLFVBQVUsR0FBRyxlQUFlLENBQUE7UUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFB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