@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
104 lines • 9.49 kB
JavaScript
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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