@threepipe/plugin-gaussian-splatting
Version:
Gaussian Splatting for Threepipe
59 lines (49 loc) • 2.45 kB
text/typescript
import {expose, transfer} from 'comlink'
import type {MainModule} from './ISort'
import workerPromise from './sort'
// import sharedArrayBufferWorkerPromise from './sort'
import {BufferPool} from './BufferPool'
export class WasmSorter {
public module: EmscriptenModule & MainModule
private _viewProjPtr: number
private _globalBufferPtr: number
private _combinedPtr: number
private _bufferPool: BufferPool
constructor(private _vertexCount: number, private _globalBuffer: Uint8Array) {
const combinedLength = this._calculateCombinedLength()
// we're double buffering, so 2 is the magic number here
this._bufferPool = new BufferPool(combinedLength, 2)
}
public async load() {
// const sharedABSupported = typeof SharedArrayBuffer !== 'undefined'
// this.module = await (sharedABSupported ? sharedArrayBufferWorkerPromise() : workerPromise())
this.module = await workerPromise()
this._viewProjPtr = this.module._malloc(16 * Float32Array.BYTES_PER_ELEMENT)
this._globalBufferPtr = this.module._malloc(this._vertexCount * 32)
this._combinedPtr = this.module._malloc(this._calculateCombinedLength())
this.module.HEAPU8.set(this._globalBuffer, this._globalBufferPtr)
}
public runSort(viewProj: Float32Array): ArrayBuffer {
this.module.HEAPF32.set(viewProj, this._viewProjPtr / Float32Array.BYTES_PER_ELEMENT)
this.module.runSort(this._viewProjPtr, this._globalBufferPtr, this._vertexCount, this._combinedPtr)
const byteStart = this._combinedPtr
const byteLength = this._calculateCombinedLength()
const bufferToTransfer = this._bufferPool.getBuffer()
new Uint8Array(bufferToTransfer).set(new Uint8Array(this.module.HEAPU8.buffer, byteStart, byteLength))
return transfer(bufferToTransfer, [bufferToTransfer])
}
public returnBuffer(buffer: ArrayBuffer): void {
this._bufferPool.returnBuffer(buffer)
}
private _calculateCombinedLength(): number {
return 4 * 4 * this._vertexCount + 3 * 4 * this._vertexCount + 3 * 4 * this._vertexCount + 4 * 4 * this._vertexCount * Float32Array.BYTES_PER_ELEMENT
}
public dispose(): void {
if (this.module) {
this.module._free(this._viewProjPtr)
this.module._free(this._globalBufferPtr)
this.module._free(this._combinedPtr)
}
}
}
expose(WasmSorter)