UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

102 lines 9.45 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFibGUvdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFFBQVE7SUFDVixNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxVQUFrQixFQUFFLGVBQXVCO1FBQ25HLElBQUksV0FBVyxHQUFHLElBQUksR0FBRyxVQUFVLEdBQUcsZUFBZSxDQUFBO1FBQ3JELE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsV0FBVyxFQUFFLENBQUE7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxHQUFHLFdBQVcsQ0FBQTtJQUM3QixDQUFDO0lBUUQsWUFDb0IsTUFBbUIsRUFDbkIsSUFBWSxFQUNaLElBQVksRUFDWixVQUFrQixFQUNsQixlQUF1QjtRQUp2QixXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixvQkFBZSxHQUFmLGVBQWUsQ0FBUTtRQUV2QyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUU5RixJQUFJLE1BQU0sQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixNQUFNLENBQUMsVUFBVTtZQUNqRCxJQUFJLElBQUksSUFBSSwyQkFBMkIsa0JBQWtCOzhGQUN5QixDQUFDLENBQUE7UUFDdkYsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLFVBQVUsR0FBRyxlQUFlLENBQUE7UUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxHQUFHLGNBQWMsQ0FBQTtRQUN2QyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUE7UUFDbkIsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixXQUFXLEVBQUUsQ0FBQTtZQUNiLFdBQVcsRUFBRSxDQUFBO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQTtRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFFTyxNQUFNLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxTQUFTLEdBQUcsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtRQUN4RyxPQUFPLFVBQVUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLFNBQWlCO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLFNBQWlCO1FBQ2xELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNuRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsU0FBaUI7UUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsU0FBaUI7UUFDaEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ25ELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDekMsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFHdEIsWUFDb0IsSUFBWSxFQUNaLElBQVksRUFDWixVQUFrQjtRQUZsQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVBQVUsR0FBVixVQUFVLENBQVE7UUFFbEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ25HLE1BQU0sTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQzNGLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFBO0lBQzVCLENBQUM7SUFFRCxHQUFHLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsU0FBaUI7UUFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFnQixFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQzdDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNuRCxDQUFDO0lBQ0wsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLFNBQWlCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sZUFBZTtJQUd4QixZQUNvQixJQUFZLEVBQ1osSUFBWSxFQUNaLFVBQWtCO1FBRmxCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUVsQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDckcsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDNUIsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxTQUFpQjtRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQWdCLEVBQUUsR0FBVyxFQUFFLEdBQVc7UUFDN0MsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUN4RyxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsU0FBaUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3JELENBQUM7Q0FDSiJ9