JSFiddle - React, Tailwind, and code Playground
JavaScript
class MemoryLayout {
constructor(layout) {
this.byteSize = this.calculateLayoutByteSize(layout);
this.buffer = new ArrayBuffer(this.byteSize);
this.view = new Uint8Array(this.buffer);
this.layout = this.createLayout(layout);
}
calculateLayoutByteSize(layout) {
let byteSize = 0;
layout.map(l => byteSize += Object.values(l)[0]);
return byteSize;
}
createLayout(layout) {
let {view, buffer} = this;
let out = {};
let offset = 0;
layout.map(l => {
let entry = Object.entries(l)[0];
let name = entry[0];
let byteLength = entry[1];
out[name] = view.subarray(offset, offset + byteLength);
offset += byteLength;
});
return out;
}
};
class VkGeometryInstance extends MemoryLayout {
constructor() {
super([
{ transform: 12 * Float32Array.BYTES_PER_ELEMENT },
{ instanceId: 3 },
{ mask: 1 },
{ instanceOffset: 3 },
{ flags: 1 },
{ accelerationStructureHandle: 1 * BigUint64Array.BYTES_PER_ELEMENT }
]);
}
};
let geometryInstance = new VkGeometryInstance();
console.log(geometryInstance.layout); // read back results using e.g. DataViews