rc-js-util
Version:
A collection of TS and C++ utilities to help writing performant and correct applications, achieved through strict typing and (removable) invariant checking.
77 lines • 3.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createSegmentedBufferView = exports.SegmentedBufferDescriptor = void 0;
const _debug_js_1 = require("../debug/_debug.js");
const null_pointer_js_1 = require("../web-assembly/emscripten/null-pointer.js");
const shared_memory_block_js_1 = require("../web-assembly/shared-memory/shared-memory-block.js");
/**
* @public
* Describes a buffer in a fashion similar to an OpenGL attribute.
*/
class SegmentedBufferDescriptor {
constructor(blockSize, stride = blockSize, start = 0, count = -1) {
this.blockSize = blockSize;
this.stride = stride;
this.start = start;
this.count = count;
this.end = start + count;
}
/**
* @returns Malloc'd buffer in the shape of `SegmentedDataViewOptions`.
* @remarks You must manually `free` this.
*/
createRawOptions(wrapper) {
const ptr = wrapper.instance._jsUtilMalloc(3);
if (ptr == null_pointer_js_1.nullPtr) {
return null_pointer_js_1.nullPtr;
}
this.setMemory(wrapper, ptr);
return ptr;
}
createWrapped(wrapper, owner) {
const smb = shared_memory_block_js_1.SharedMemoryBlock.createOne(wrapper, owner, 3);
this.setMemory(wrapper, smb.pointer);
return smb;
}
setMemory(wrapper, ptr) {
const dv = wrapper.getDataView();
dv.setUint8(ptr, this.blockSize);
dv.setUint8(ptr + 1, this.stride);
dv.setUint8(ptr + 2, this.start);
}
}
exports.SegmentedBufferDescriptor = SegmentedBufferDescriptor;
function createSegmentedBufferView(buffer, descriptor, wrapper, owner) {
return new SegmentedBufferView(buffer, descriptor, wrapper !== null && wrapper !== void 0 ? wrapper : null, owner !== null && owner !== void 0 ? owner : null);
}
exports.createSegmentedBufferView = createSegmentedBufferView;
class SegmentedBufferView {
getWrapper() {
return this.wrapper;
}
constructor(buffer, descriptor, wrapper, owner) {
this.buffer = buffer;
this.descriptor = descriptor;
this.wrapper = wrapper;
if (_BUILD.DEBUG) {
_debug_js_1._Debug.assert(descriptor.stride > 0, "invalid stride size");
_debug_js_1._Debug.assert(descriptor.blockSize > 0, "invalid block size");
}
if (descriptor.count === -1) {
const writable = descriptor;
writable.count = ((buffer.getArray().length - descriptor.start) / descriptor.stride) | 0;
writable.end = descriptor.start + descriptor.count * descriptor.stride;
}
if (buffer.getSharedObjectHandle() == null) {
_BUILD.DEBUG && _debug_js_1._Debug.assert(wrapper != null, "received shared object, but it was not bound");
this.resourceHandle = wrapper.lifecycleStrategy.createNode(owner);
}
}
getBuffer() {
return this.buffer;
}
getDescriptor() {
return this.descriptor;
}
}
//# sourceMappingURL=segmented-buffer-view.js.map