@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
102 lines • 9.45 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFibGUvdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFFBQVE7SUFDVixNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxVQUFrQixFQUFFLGVBQXVCO1FBQ25HLElBQUksV0FBVyxHQUFHLElBQUksR0FBRyxVQUFVLEdBQUcsZUFBZSxDQUFBO1FBQ3JELE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsV0FBVyxFQUFFLENBQUE7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxHQUFHLFdBQVcsQ0FBQTtJQUM3QixDQUFDO0lBUUQsWUFDb0IsTUFBbUIsRUFDbkIsSUFBWSxFQUNaLElBQVksRUFDWixVQUFrQixFQUNsQixlQUF1QjtRQUp2QixXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixvQkFBZSxHQUFmLGVBQWUsQ0FBUTtRQUV2QyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUU5RixJQUFJLE1BQU0sQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixNQUFNLENBQUMsVUFBVTtZQUNqRCxJQUFJLElBQUksSUFBSSwyQkFBMkIsa0JBQWtCOzhGQUN5QixDQUFDLENBQUE7UUFDdkYsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLFVBQVUsR0FBRyxlQUFlLENBQUE7UUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFBSSxX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