@jdultra/threedtiles 14.0.9 → 14.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/assets/{PointsManager.worker-dH1fNyu8.js.map → PointsManager.worker-W7IiSd9R.js.map} +1 -1
- package/dist/splats/SplatsMeshWebGPU.d.ts +63 -0
- package/dist/splats/splats.wgsl.d.ts +3 -0
- package/dist/threedtiles.cjs.js +347 -41
- package/dist/threedtiles.cjs.js.map +1 -1
- package/dist/threedtiles.es.js +16857 -6895
- package/dist/threedtiles.es.js.map +1 -1
- package/dist/threedtiles.umd.js +347 -41
- package/dist/threedtiles.umd.js.map +1 -1
- package/package.json +3 -3
- package/dist/assets/PointsManager.worker-dH1fNyu8.js +0 -208
package/README.md
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
A faster 3DTiles viewer for three.js, now with OGC3DTiles 1.1 support.
|
|
8
8
|
|
|
9
9
|
Oh, also it supports gaussian splats! ( currently via KHR_gaussian_splatting_compression_spz )
|
|
10
|
+
Here's a free app to convert various splat formats to OGC3DTiles directly in your browser : [contextsplat](https://contextsplat.xyz)
|
|
10
11
|
|
|
11
12
|
## sample getting started projects
|
|
12
13
|
Getting started vanilla js:
|
package/dist/assets/{PointsManager.worker-dH1fNyu8.js.map → PointsManager.worker-W7IiSd9R.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointsManager.worker-dH1fNyu8.js","sources":["../src/splats/radix/wasm_sorter.js","../src/splats/PointsManager.js","../src/splats/PointsManager.worker.js"],"sourcesContent":["let wasm;\n\nlet cachedUint32ArrayMemory0 = null;\n\nfunction getUint32ArrayMemory0() {\n if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n }\n return cachedUint32ArrayMemory0;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nfunction passArray32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getUint32ArrayMemory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction getArrayU32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n/**\n * Radix Sort implementation for sorting indices based on distances.\n * Both `indices` and `distances` should have the same length.\n * Returns a new vector of sorted indices in descending order based on distances.\n * @param {Uint32Array} indices\n * @param {Uint32Array} distances\n * @returns {Uint32Array}\n */\nexport function radix_sort_indices(indices, distances) {\n const ptr0 = passArray32ToWasm0(indices, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray32ToWasm0(distances, wasm.__wbindgen_malloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.radix_sort_indices(ptr0, len0, ptr1, len1);\n var v3 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v3;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_export_0;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n ;\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {\n\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedUint32ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n module_or_path = new URL('wasm_sorter_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","import init, { radix_sort_indices } from './radix/wasm_sorter.js';\r\n\r\nconst buffer = new ArrayBuffer(4);\r\nconst floatView = new Float32Array(buffer);\r\nconst uintView = new Uint32Array(buffer);\r\n\r\nclass PointsManager {\r\n constructor(sortCallback) {\r\n this.points = new Float32Array(4096 * 3);\r\n this.distances = new Uint32Array(4096);\r\n this.pointSets = new Map(); // Map<number, object>\r\n this.numUsed = 0;\r\n this.sortOngoing = false;\r\n this.sortCallback = sortCallback;\r\n this.sortPromise = Promise.resolve();\r\n }\r\n\r\n\r\n\r\n hidePoints(insertionIndex) {\r\n //console.log(\"hide\");\r\n const pointSet = this.pointSets.get(insertionIndex);\r\n if (pointSet.used) {\r\n pointSet.used = false;\r\n }\r\n }\r\n removePoints(insertionIndex) {\r\n /* console.log(\"remove\"); */\r\n const pointSet = this.pointSets.get(insertionIndex);\r\n if (pointSet.used) {\r\n pointSet.used = false;\r\n }\r\n\r\n this.pointSets.delete(insertionIndex);\r\n\r\n // Determine newLength based on remaining points\r\n let newLength = 0;\r\n for (const [key, aPointSet] of this.pointSets.entries()) {\r\n if (key + aPointSet.length > newLength) {\r\n newLength = key + aPointSet.length;\r\n }\r\n }\r\n\r\n }\r\n showPoints(insertionIndex) {\r\n /* console.log(\"show\"); */\r\n const pointSet = this.pointSets.get(insertionIndex);\r\n if (!pointSet.used) {\r\n pointSet.used = true;\r\n }\r\n\r\n }\r\n\r\n resizeArrays(newLength) {\r\n\r\n if (isNaN(newLength)) {\r\n console.log(\"hit max splats\")\r\n }\r\n //console.log(newLength)\r\n if (newLength > this.points.length) {\r\n newLength = Math.max(this.points.length * 2, newLength);\r\n // Resize points array\r\n const newPoints = new Float32Array(newLength);\r\n newPoints.set(this.points, 0);\r\n this.points = newPoints;\r\n\r\n // Resize distances array\r\n const newNumPoints = Math.floor(newLength / 3);\r\n const newDistances = new Uint32Array(newNumPoints);\r\n newDistances.set(this.distances, 0);\r\n this.distances = newDistances;\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n addBatchesOffsetStrideCount(positions, insertionIndexes, offset, stride, batchSize) {\r\n\r\n const newLength = Math.max(this.points.length, insertionIndexes[insertionIndexes.length - 1] + batchSize * 3);\r\n\r\n this.resizeArrays(newLength);\r\n for (let batchIndex = 0; batchIndex < insertionIndexes.length; batchIndex++) {\r\n\r\n const insertionIndex = insertionIndexes[batchIndex];\r\n const start = Math.floor(insertionIndex / 3);\r\n const batchPositionStartIndex = batchIndex * batchSize * stride;\r\n const batchNumPoints = Math.min((positions.length - batchPositionStartIndex) / stride, batchSize);\r\n\r\n\r\n for (let i = 0; i < batchNumPoints; i++) {\r\n\r\n this.points[insertionIndex + i * 3] = positions[i * stride + offset + batchPositionStartIndex]\r\n this.points[insertionIndex + i * 3 + 1] = positions[i * stride + offset + batchPositionStartIndex + 1]\r\n this.points[insertionIndex + i * 3 + 2] = positions[i * stride + offset + batchPositionStartIndex + 2]\r\n\r\n }\r\n this.pointSets.set(insertionIndex, { length: batchNumPoints * 3, used: false });\r\n\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n getFrustumPlanes(viewProj, margin = 1.2) { \r\n const p = new Float32Array(24);\r\n let i = 0;\r\n \r\n const emit = (a, b, c, d, useMargin) => {\r\n const invLen = 1 / Math.hypot(a, b, c);\r\n p[i++] = a * invLen; // Nx\r\n p[i++] = b * invLen; // Ny\r\n p[i++] = c * invLen; // Nz\r\n \r\n let d_normalized = d * invLen; // D_orig\r\n \r\n if (useMargin && margin !== 1.0) {\r\n const shift_amount = (1.0-margin);\r\n d_normalized -= shift_amount; // D_new = D_orig - shift_amount\r\n }\r\n p[i++] = d_normalized; // Store the (potentially shifted) D\r\n };\r\n \r\n // a,b,c,d args useMargin\r\n emit(viewProj[3] + viewProj[0], viewProj[7] + viewProj[4], viewProj[11] + viewProj[8], viewProj[15] + viewProj[12], true); // left\r\n emit(viewProj[3] - viewProj[0], viewProj[7] - viewProj[4], viewProj[11] - viewProj[8], viewProj[15] - viewProj[12], true); // right\r\n emit(viewProj[3] + viewProj[1], viewProj[7] + viewProj[5], viewProj[11] + viewProj[9], viewProj[15] + viewProj[13], true); // bottom\r\n emit(viewProj[3] - viewProj[1], viewProj[7] - viewProj[5], viewProj[11] - viewProj[9], viewProj[15] - viewProj[13], true); // top\r\n emit(viewProj[3] + viewProj[2], viewProj[7] + viewProj[6], viewProj[11] + viewProj[10], viewProj[15] + viewProj[14], false); // near\r\n emit(viewProj[3] - viewProj[2], viewProj[7] - viewProj[6], viewProj[11] - viewProj[10], viewProj[15] + viewProj[14], false); // far\r\n \r\n return p;\r\n }\r\n\r\n computeDistances(x, y, z,vpm) {\r\n\r\n this.distances.fill(0);\r\n const keys = Array.from(this.pointSets.keys());\r\n const numKeys = keys.length;\r\n let planes;\r\n if(!!vpm){\r\n planes = this.getFrustumPlanes(vpm);\r\n }\r\n this.numUsed = 0;\r\n for (let i = 0; i < numKeys; i++) {\r\n const key = keys[i];\r\n const pointSet = this.pointSets.get(key);\r\n if (!pointSet.used) continue;\r\n const length = Math.floor(pointSet.length / 3);\r\n this.numUsed += length\r\n }\r\n //console.log(\"num used : \"+this.numUsed);\r\n this.indexes = new Uint32Array(this.numUsed);\r\n this.distances = new Uint32Array(this.numUsed);\r\n let c = 0;\r\n for (let i = 0; i < numKeys; i++) {\r\n const key = keys[i];\r\n const keyBase = Math.floor(key / 3);\r\n const pointSet = this.pointSets.get(key);\r\n if (!pointSet.used) continue;\r\n const length = Math.floor(pointSet.length / 3);\r\n //this.numUsed += length\r\n for (let j = 0; j < length; j++) {\r\n const idx = key + (j * 3);\r\n const vx = this.points[idx];\r\n const vy = this.points[idx + 1];\r\n const vz = this.points[idx + 2];\r\n\r\n // frustum culling //\r\n if(planes){\r\n let visible = true;\r\n for (let p = 0; p < 24; p += 4) {\r\n if (vx * planes[p] +\r\n vy * planes[p + 1] +\r\n vz * planes[p + 2] +\r\n planes[p + 3] < 0) { // outside this plane\r\n visible = false;\r\n break;\r\n }\r\n }\r\n if (!visible) continue;\r\n }\r\n \r\n const dx = x - vx;\r\n const dy = y - vy;\r\n const dz = z - vz;\r\n const d = dx * dx + dy * dy + dz * dz;\r\n floatView[0] = d;\r\n this.distances[c] = uintView[0];\r\n this.indexes[c++] = keyBase + j;\r\n }\r\n }\r\n this.numUsed = c;\r\n \r\n this.indexes = this.indexes.subarray(0, c);\r\n this.distances = this.distances.subarray(0, c);\r\n }\r\n\r\n sort(xyz, vpm, id) {\r\n // Always store the latest sort request\r\n this.pendingSort = { xyz, vpm };\r\n this.pendingID = id;\r\n //console.log(`Received sort request with ID: ${id}`);\r\n\r\n // If no sort is currently ongoing, start processing\r\n if (!this.sortOngoing) {\r\n this.sortOngoing = true;\r\n this.processSortQueue();\r\n }\r\n }\r\n\r\n // Asynchronous loop to process sort requests sequentially\r\n async processSortQueue() {\r\n if (!this.initialized) {\r\n await init();\r\n this.initialized = true;\r\n }\r\n while (this.pendingSort) {\r\n const { xyz, vpm } = this.pendingSort;\r\n const currentID = this.pendingID;\r\n\r\n // Clear the pending sort to capture any new requests during processing\r\n this.pendingSort = null;\r\n this.pendingID = null;\r\n\r\n //console.log(`Starting sort with ID: ${currentID}`);\r\n\r\n \r\n\r\n // Perform the synchronous sort operations\r\n\r\n this.computeDistances(xyz[0], xyz[1], xyz[2], vpm);\r\n //console.log((performance.now() - start)+' ms');\r\n\r\n //console.log(this.indexes.length)\r\n const start = performance.now();\r\n this.indexes = radix_sort_indices(this.indexes, this.distances);\r\n \r\n\r\n const duration = performance.now() - start;\r\n //console.log(`Sort with ID: ${currentID} completed in ${duration.toFixed(2)}ms`);\r\n\r\n // Callback after sorting is done\r\n this.sortCallback(this.indexes, this.numUsed, currentID, duration);\r\n\r\n // Yield control to the event loop to handle new incoming sort requests\r\n await new Promise(resolve => setTimeout(resolve, 0));\r\n }\r\n\r\n // No more pending sorts\r\n this.sortOngoing = false;\r\n //console.log(\"No more pending sorts. SortWorker is idle.\");\r\n }\r\n} export { PointsManager }","import { PointsManager } from \"./PointsManager\";\r\n\r\nconst sortCallback = ((array, numUsed, id, sortPerf)=>{\r\n const copy = new Uint32Array(array)\r\n postMessage({\r\n order: copy.buffer,\r\n count: numUsed,\r\n id: id,\r\n sortPerf: sortPerf\r\n }, [copy.buffer]);\r\n})\r\nlet pointsManager;\r\nself.onmessage = function (e) {\r\n\r\n try {\r\n\r\n switch (e.data.method) {\r\n \r\n case \"addBatches\":\r\n if (!pointsManager) {\r\n pointsManager = new PointsManager(sortCallback);\r\n }\r\n pointsManager.addBatchesOffsetStrideCount(new Float32Array(e.data.positions), e.data.insertionIndexes, e.data.offset, e.data.stride, e.data.batchSize);\r\n break\r\n case \"hide\":\r\n\r\n if (!!pointsManager) {\r\n pointsManager.hidePoints(e.data.insertionIndex);\r\n }\r\n\r\n break\r\n case \"hideBatches\":\r\n\r\n if (!!pointsManager) {\r\n e.data.insertionIndexes.forEach(insertionIndex => {\r\n pointsManager.hidePoints(insertionIndex);\r\n });\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"show\":\r\n if (!!pointsManager) {\r\n pointsManager.showPoints(e.data.insertionIndex);\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break;\r\n case \"showBatches\":\r\n\r\n if (!!pointsManager) {\r\n e.data.insertionIndexes.forEach(insertionIndex => {\r\n pointsManager.showPoints(insertionIndex);\r\n });\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"remove\":\r\n if (!!pointsManager) {\r\n pointsManager.removePoints(e.data.insertionIndex);\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"removeBatches\":\r\n\r\n if (!!pointsManager) {\r\n e.data.insertionIndexes.forEach(insertionIndex => {\r\n pointsManager.removePoints(insertionIndex);\r\n });\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"sort\":\r\n \r\n if (!!pointsManager) {\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n break\r\n default:\r\n throw new Error(`No method with name ${e.data.method}`)\r\n }\r\n } catch (error) {\r\n postMessage({ error: error.message })\r\n }\r\n}"],"names":["wasm","cachedUint32ArrayMemory0","getUint32ArrayMemory0","WASM_VECTOR_LEN","passArray32ToWasm0","arg","malloc","ptr","getArrayU32FromWasm0","len","radix_sort_indices","indices","distances","ptr0","len0","ptr1","len1","ret","v3","__wbg_load","module","imports","e","bytes","instance","__wbg_get_imports","table","offset","__wbg_finalize_init","__wbg_init","module_or_path","buffer","floatView","uintView","PointsManager","sortCallback","insertionIndex","pointSet","newLength","key","aPointSet","newPoints","newNumPoints","newDistances","positions","insertionIndexes","stride","batchSize","batchIndex","batchPositionStartIndex","batchNumPoints","viewProj","margin","p","i","emit","a","b","c","d","useMargin","invLen","d_normalized","shift_amount","x","y","z","vpm","keys","numKeys","planes","length","keyBase","j","idx","vx","vy","vz","visible","dx","dy","dz","xyz","id","init","currentID","start","duration","resolve","array","numUsed","sortPerf","copy","pointsManager","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PointsManager.worker-W7IiSd9R.js","sources":["../src/splats/radix/wasm_sorter.js","../src/splats/PointsManager.js","../src/splats/PointsManager.worker.js"],"sourcesContent":["let wasm;\n\nlet cachedUint32ArrayMemory0 = null;\n\nfunction getUint32ArrayMemory0() {\n if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n }\n return cachedUint32ArrayMemory0;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nfunction passArray32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getUint32ArrayMemory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction getArrayU32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n/**\n * Radix Sort implementation for sorting indices based on distances.\n * Both `indices` and `distances` should have the same length.\n * Returns a new vector of sorted indices in descending order based on distances.\n * @param {Uint32Array} indices\n * @param {Uint32Array} distances\n * @returns {Uint32Array}\n */\nexport function radix_sort_indices(indices, distances) {\n const ptr0 = passArray32ToWasm0(indices, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray32ToWasm0(distances, wasm.__wbindgen_malloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.radix_sort_indices(ptr0, len0, ptr1, len1);\n var v3 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v3;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_export_0;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n ;\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {\n\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedUint32ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n module_or_path = new URL('wasm_sorter_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","import init, { radix_sort_indices } from './radix/wasm_sorter.js';\r\n\r\nconst buffer = new ArrayBuffer(4);\r\nconst floatView = new Float32Array(buffer);\r\nconst uintView = new Uint32Array(buffer);\r\n\r\nclass PointsManager {\r\n constructor(sortCallback) {\r\n this.points = new Float32Array(4096 * 3);\r\n this.distances = new Uint32Array(4096);\r\n this.pointSets = new Map(); // Map<number, object>\r\n this.numUsed = 0;\r\n this.sortOngoing = false;\r\n this.sortCallback = sortCallback;\r\n this.sortPromise = Promise.resolve();\r\n }\r\n\r\n\r\n\r\n hidePoints(insertionIndex) {\r\n //console.log(\"hide\");\r\n const pointSet = this.pointSets.get(insertionIndex);\r\n if (pointSet.used) {\r\n pointSet.used = false;\r\n }\r\n }\r\n removePoints(insertionIndex) {\r\n /* console.log(\"remove\"); */\r\n const pointSet = this.pointSets.get(insertionIndex);\r\n if (pointSet.used) {\r\n pointSet.used = false;\r\n }\r\n\r\n this.pointSets.delete(insertionIndex);\r\n\r\n // Determine newLength based on remaining points\r\n let newLength = 0;\r\n for (const [key, aPointSet] of this.pointSets.entries()) {\r\n if (key + aPointSet.length > newLength) {\r\n newLength = key + aPointSet.length;\r\n }\r\n }\r\n\r\n }\r\n showPoints(insertionIndex) {\r\n /* console.log(\"show\"); */\r\n const pointSet = this.pointSets.get(insertionIndex);\r\n if (!pointSet.used) {\r\n pointSet.used = true;\r\n }\r\n\r\n }\r\n\r\n resizeArrays(newLength) {\r\n\r\n if (isNaN(newLength)) {\r\n console.log(\"hit max splats\")\r\n }\r\n //console.log(newLength)\r\n if (newLength > this.points.length) {\r\n newLength = Math.max(this.points.length * 2, newLength);\r\n // Resize points array\r\n const newPoints = new Float32Array(newLength);\r\n newPoints.set(this.points, 0);\r\n this.points = newPoints;\r\n\r\n // Resize distances array\r\n const newNumPoints = Math.floor(newLength / 3);\r\n const newDistances = new Uint32Array(newNumPoints);\r\n newDistances.set(this.distances, 0);\r\n this.distances = newDistances;\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n addBatchesOffsetStrideCount(positions, insertionIndexes, offset, stride, batchSize) {\r\n\r\n const newLength = Math.max(this.points.length, insertionIndexes[insertionIndexes.length - 1] + batchSize * 3);\r\n\r\n this.resizeArrays(newLength);\r\n for (let batchIndex = 0; batchIndex < insertionIndexes.length; batchIndex++) {\r\n\r\n const insertionIndex = insertionIndexes[batchIndex];\r\n const start = Math.floor(insertionIndex / 3);\r\n const batchPositionStartIndex = batchIndex * batchSize * stride;\r\n const batchNumPoints = Math.min((positions.length - batchPositionStartIndex) / stride, batchSize);\r\n\r\n\r\n for (let i = 0; i < batchNumPoints; i++) {\r\n\r\n this.points[insertionIndex + i * 3] = positions[i * stride + offset + batchPositionStartIndex]\r\n this.points[insertionIndex + i * 3 + 1] = positions[i * stride + offset + batchPositionStartIndex + 1]\r\n this.points[insertionIndex + i * 3 + 2] = positions[i * stride + offset + batchPositionStartIndex + 2]\r\n\r\n }\r\n this.pointSets.set(insertionIndex, { length: batchNumPoints * 3, used: false });\r\n\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n getFrustumPlanes(viewProj, margin = 1.2) { \r\n const p = new Float32Array(24);\r\n let i = 0;\r\n \r\n const emit = (a, b, c, d, useMargin) => {\r\n const invLen = 1 / Math.hypot(a, b, c);\r\n p[i++] = a * invLen; // Nx\r\n p[i++] = b * invLen; // Ny\r\n p[i++] = c * invLen; // Nz\r\n \r\n let d_normalized = d * invLen; // D_orig\r\n \r\n if (useMargin && margin !== 1.0) {\r\n const shift_amount = (1.0-margin);\r\n d_normalized -= shift_amount; // D_new = D_orig - shift_amount\r\n }\r\n p[i++] = d_normalized; // Store the (potentially shifted) D\r\n };\r\n \r\n // a,b,c,d args useMargin\r\n emit(viewProj[3] + viewProj[0], viewProj[7] + viewProj[4], viewProj[11] + viewProj[8], viewProj[15] + viewProj[12], true); // left\r\n emit(viewProj[3] - viewProj[0], viewProj[7] - viewProj[4], viewProj[11] - viewProj[8], viewProj[15] - viewProj[12], true); // right\r\n emit(viewProj[3] + viewProj[1], viewProj[7] + viewProj[5], viewProj[11] + viewProj[9], viewProj[15] + viewProj[13], true); // bottom\r\n emit(viewProj[3] - viewProj[1], viewProj[7] - viewProj[5], viewProj[11] - viewProj[9], viewProj[15] - viewProj[13], true); // top\r\n emit(viewProj[3] + viewProj[2], viewProj[7] + viewProj[6], viewProj[11] + viewProj[10], viewProj[15] + viewProj[14], false); // near\r\n emit(viewProj[3] - viewProj[2], viewProj[7] - viewProj[6], viewProj[11] - viewProj[10], viewProj[15] + viewProj[14], false); // far\r\n \r\n return p;\r\n }\r\n\r\n computeDistances(x, y, z,vpm) {\r\n\r\n this.distances.fill(0);\r\n const keys = Array.from(this.pointSets.keys());\r\n const numKeys = keys.length;\r\n let planes;\r\n if(!!vpm){\r\n planes = this.getFrustumPlanes(vpm);\r\n }\r\n this.numUsed = 0;\r\n for (let i = 0; i < numKeys; i++) {\r\n const key = keys[i];\r\n const pointSet = this.pointSets.get(key);\r\n if (!pointSet.used) continue;\r\n const length = Math.floor(pointSet.length / 3);\r\n this.numUsed += length\r\n }\r\n //console.log(\"num used : \"+this.numUsed);\r\n this.indexes = new Uint32Array(this.numUsed);\r\n this.distances = new Uint32Array(this.numUsed);\r\n let c = 0;\r\n for (let i = 0; i < numKeys; i++) {\r\n const key = keys[i];\r\n const keyBase = Math.floor(key / 3);\r\n const pointSet = this.pointSets.get(key);\r\n if (!pointSet.used) continue;\r\n const length = Math.floor(pointSet.length / 3);\r\n //this.numUsed += length\r\n for (let j = 0; j < length; j++) {\r\n const idx = key + (j * 3);\r\n const vx = this.points[idx];\r\n const vy = this.points[idx + 1];\r\n const vz = this.points[idx + 2];\r\n\r\n // frustum culling //\r\n if(planes){\r\n let visible = true;\r\n for (let p = 0; p < 24; p += 4) {\r\n if (vx * planes[p] +\r\n vy * planes[p + 1] +\r\n vz * planes[p + 2] +\r\n planes[p + 3] < 0) { // outside this plane\r\n visible = false;\r\n break;\r\n }\r\n }\r\n if (!visible) continue;\r\n }\r\n \r\n const dx = x - vx;\r\n const dy = y - vy;\r\n const dz = z - vz;\r\n const d = dx * dx + dy * dy + dz * dz;\r\n floatView[0] = d;\r\n this.distances[c] = uintView[0];\r\n this.indexes[c++] = keyBase + j;\r\n }\r\n }\r\n this.numUsed = c;\r\n \r\n this.indexes = this.indexes.subarray(0, c);\r\n this.distances = this.distances.subarray(0, c);\r\n }\r\n\r\n sort(xyz, vpm, id) {\r\n // Always store the latest sort request\r\n this.pendingSort = { xyz, vpm };\r\n this.pendingID = id;\r\n //console.log(`Received sort request with ID: ${id}`);\r\n\r\n // If no sort is currently ongoing, start processing\r\n if (!this.sortOngoing) {\r\n this.sortOngoing = true;\r\n this.processSortQueue();\r\n }\r\n }\r\n\r\n // Asynchronous loop to process sort requests sequentially\r\n async processSortQueue() {\r\n if (!this.initialized) {\r\n // Prefer an explicit wasm URL provided by the main thread when the worker is inlined.\r\n const wasmUrl = (typeof globalThis !== 'undefined' && globalThis.__WASM_SORTER_URL__) ? globalThis.__WASM_SORTER_URL__ : undefined;\r\n await init(wasmUrl);\r\n this.initialized = true;\r\n }\r\n while (this.pendingSort) {\r\n const { xyz, vpm } = this.pendingSort;\r\n const currentID = this.pendingID;\r\n\r\n // Clear the pending sort to capture any new requests during processing\r\n this.pendingSort = null;\r\n this.pendingID = null;\r\n\r\n //console.log(`Starting sort with ID: ${currentID}`);\r\n\r\n \r\n\r\n // Perform the synchronous sort operations\r\n\r\n this.computeDistances(xyz[0], xyz[1], xyz[2], vpm);\r\n //console.log((performance.now() - start)+' ms');\r\n\r\n //console.log(this.indexes.length)\r\n const start = performance.now();\r\n this.indexes = radix_sort_indices(this.indexes, this.distances);\r\n \r\n\r\n const duration = performance.now() - start;\r\n //console.log(`Sort with ID: ${currentID} completed in ${duration.toFixed(2)}ms`);\r\n\r\n // Callback after sorting is done\r\n this.sortCallback(this.indexes, this.numUsed, currentID, duration);\r\n\r\n // Yield control to the event loop to handle new incoming sort requests\r\n await new Promise(resolve => setTimeout(resolve, 0));\r\n }\r\n\r\n // No more pending sorts\r\n this.sortOngoing = false;\r\n //console.log(\"No more pending sorts. SortWorker is idle.\");\r\n }\r\n} export { PointsManager }","import { PointsManager } from \"./PointsManager\";\r\n\r\nconst sortCallback = ((array, numUsed, id, sortPerf)=>{\r\n const copy = new Uint32Array(array)\r\n postMessage({\r\n order: copy.buffer,\r\n count: numUsed,\r\n id: id,\r\n sortPerf: sortPerf\r\n }, [copy.buffer]);\r\n})\r\nlet pointsManager;\r\nself.onmessage = function (e) {\r\n \r\n // Accept the wasm URL from the main thread (required when worker is inlined).\r\n if (e.data && e.data.type === 'wasmUrl') {\r\n globalThis.__WASM_SORTER_URL__ = e.data.url;\r\n return;\r\n }\r\n \r\n try {\r\n\r\n switch (e.data.method) {\r\n \r\n case \"addBatches\":\r\n if (!pointsManager) {\r\n pointsManager = new PointsManager(sortCallback);\r\n }\r\n pointsManager.addBatchesOffsetStrideCount(new Float32Array(e.data.positions), e.data.insertionIndexes, e.data.offset, e.data.stride, e.data.batchSize);\r\n break\r\n case \"hide\":\r\n\r\n if (!!pointsManager) {\r\n pointsManager.hidePoints(e.data.insertionIndex);\r\n }\r\n\r\n break\r\n case \"hideBatches\":\r\n\r\n if (!!pointsManager) {\r\n e.data.insertionIndexes.forEach(insertionIndex => {\r\n pointsManager.hidePoints(insertionIndex);\r\n });\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"show\":\r\n if (!!pointsManager) {\r\n pointsManager.showPoints(e.data.insertionIndex);\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break;\r\n case \"showBatches\":\r\n\r\n if (!!pointsManager) {\r\n e.data.insertionIndexes.forEach(insertionIndex => {\r\n pointsManager.showPoints(insertionIndex);\r\n });\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"remove\":\r\n if (!!pointsManager) {\r\n pointsManager.removePoints(e.data.insertionIndex);\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"removeBatches\":\r\n\r\n if (!!pointsManager) {\r\n e.data.insertionIndexes.forEach(insertionIndex => {\r\n pointsManager.removePoints(insertionIndex);\r\n });\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n\r\n break\r\n case \"sort\":\r\n \r\n if (!!pointsManager) {\r\n pointsManager.sort(e.data.xyz, e.data.vpm, e.data.id)\r\n }\r\n break\r\n default:\r\n throw new Error(`No method with name ${e.data.method}`)\r\n }\r\n } catch (error) {\r\n postMessage({ error: error.message })\r\n }\r\n}"],"names":["wasm","cachedUint32ArrayMemory0","getUint32ArrayMemory0","WASM_VECTOR_LEN","passArray32ToWasm0","arg","malloc","ptr","getArrayU32FromWasm0","len","radix_sort_indices","indices","distances","ptr0","len0","ptr1","len1","ret","v3","__wbg_load","module","imports","e","bytes","instance","__wbg_get_imports","table","offset","__wbg_finalize_init","__wbg_init","module_or_path","buffer","floatView","uintView","PointsManager","sortCallback","insertionIndex","pointSet","newLength","key","aPointSet","newPoints","newNumPoints","newDistances","positions","insertionIndexes","stride","batchSize","batchIndex","batchPositionStartIndex","batchNumPoints","viewProj","margin","p","i","emit","a","b","c","d","useMargin","invLen","d_normalized","shift_amount","x","y","z","vpm","keys","numKeys","planes","length","keyBase","j","idx","vx","vy","vz","visible","dx","dy","dz","xyz","id","wasmUrl","init","currentID","start","duration","resolve","array","numUsed","sortPerf","copy","pointsManager","error"],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export class SplatsMeshWebGPU extends Mesh<import("three").BufferGeometry<import("three").NormalBufferAttributes, import("three").BufferGeometryEventMap>, import("three").Material | import("three").Material[], import("three").Object3DEventMap> {
|
|
2
|
+
constructor(renderer: any, isStatic: any, fragShader: any);
|
|
3
|
+
_vertexNodeFn: (args: any) => any;
|
|
4
|
+
_fragmentNodeFn: (args: any) => any;
|
|
5
|
+
_depthNodeFn: (args: any) => any;
|
|
6
|
+
numBatches: number;
|
|
7
|
+
numVisibleBatches: number;
|
|
8
|
+
orderAttribute: InstancedBufferAttribute;
|
|
9
|
+
textureSize: number;
|
|
10
|
+
numTextures: number;
|
|
11
|
+
batchSize: number;
|
|
12
|
+
maxSplats: number;
|
|
13
|
+
numSplatsRendered: number;
|
|
14
|
+
positionColorTexture: Data3DTexture;
|
|
15
|
+
covarianceTexture: Data3DTexture;
|
|
16
|
+
renderer: any;
|
|
17
|
+
material: any;
|
|
18
|
+
params: {
|
|
19
|
+
textureSize: any;
|
|
20
|
+
sizeMultiplier: any;
|
|
21
|
+
k: any;
|
|
22
|
+
beta_k: any;
|
|
23
|
+
minSplatPixelSize: any;
|
|
24
|
+
minOpacity: any;
|
|
25
|
+
culling: any;
|
|
26
|
+
antialiasingFactor: any;
|
|
27
|
+
cropRadius: any;
|
|
28
|
+
depthBias: any;
|
|
29
|
+
viewportPixelSize: any;
|
|
30
|
+
zUpToYUpMatrix3x3: any;
|
|
31
|
+
};
|
|
32
|
+
sortID: number;
|
|
33
|
+
freeAddresses: MinPriorityQueue<any, any>;
|
|
34
|
+
worker: any;
|
|
35
|
+
sortListeners: any[];
|
|
36
|
+
cameraPosition: Vector3;
|
|
37
|
+
viewProjModel: Matrix4 | undefined;
|
|
38
|
+
splatsCPUCuling: boolean;
|
|
39
|
+
setQuality(quality: any): void;
|
|
40
|
+
setSplatsCPUCulling(splatsCPUCuling: any): void;
|
|
41
|
+
setSplatsCropRadius(cropRadius: any): void;
|
|
42
|
+
setSplatsSizeMultiplier(sizeMultiplier: any): void;
|
|
43
|
+
setDepthBias(depthBias: any): void;
|
|
44
|
+
updateShaderParams(camera: any): void;
|
|
45
|
+
dispose(): void;
|
|
46
|
+
addSplatsTile(positions: any, colors: any, cov1: any, cov2: any): {
|
|
47
|
+
hide: () => void;
|
|
48
|
+
show: (callback: any) => void;
|
|
49
|
+
remove: () => void;
|
|
50
|
+
sort: (cameraPosition: any, viewProjModel: any) => void;
|
|
51
|
+
raycast: (ray: any, intersects: any, threshold: any) => void;
|
|
52
|
+
isSplatsBatch: boolean;
|
|
53
|
+
} | undefined;
|
|
54
|
+
addSplatsBatch(positionsStartIndex: any, address: any, positions: any, colors: any, cov1: any, cov2: any): void;
|
|
55
|
+
growTextures(): void;
|
|
56
|
+
sort(cameraPosition: any, viewProjModel: any): void;
|
|
57
|
+
}
|
|
58
|
+
import { Mesh } from 'three';
|
|
59
|
+
import { InstancedBufferAttribute } from 'three';
|
|
60
|
+
import { Data3DTexture } from 'three';
|
|
61
|
+
import { MinPriorityQueue } from 'data-structure-typed';
|
|
62
|
+
import { Vector3 } from 'three';
|
|
63
|
+
import { Matrix4 } from 'three';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export const vertex: "\nfn splatsVS(\n // per-instance inputs\n order: u32,\n quadPos: vec3<f32>,\n\n // scene matrices (pass cameraProjectionMatrix, cameraViewMatrix, modelWorldMatrix from JS)\n projectionMatrix: mat4x4<f32>,\n viewMatrix: mat4x4<f32>,\n modelMatrix: mat4x4<f32>,\n\n // resources\n positionColor3D: texture_3d<u32>,\n covariance3D: texture_3d<u32>,\n\n // scalar uniforms\n textureSize: u32,\n sizeMultiplier: f32,\n k: f32,\n beta_k: f32,\n minSplatPixelSize: f32,\n minOpacity: f32,\n culling: u32,\n antialiasingFactor: f32,\n cropRadius: f32,\n depthBias: f32,\n viewportPixelSize: vec2<f32>,\n zUpToYUpMatrix3x3: mat3x3<f32>\n) -> vec4<f32> {\n // compute slice coords from linear address\n let texSize: u32 = textureSize;\n let slicePixels: u32 = texSize * texSize;\n let sliceIndex: u32 = order / slicePixels;\n let slicePixelIndex: u32 = order % slicePixels;\n let xVal: u32 = slicePixelIndex % texSize;\n let yVal: u32 = slicePixelIndex / texSize;\n let coord: vec3<i32> = vec3<i32>(i32(xVal), i32(yVal), i32(sliceIndex));\n\n // load packed position (xyz as u32 bitcasts) and color (rgba8)\n let posCol: vec4<u32> = textureLoad(positionColor3D, coord, 0);\n var splatPosModel: vec3<f32> = vec3<f32>(bitcast<f32>(posCol.r), bitcast<f32>(posCol.g), bitcast<f32>(posCol.b));\n // WGSL builtin to unpack 4x8 UNORM from u32\n var color: vec4<f32> = unpack4x8unorm(posCol.a);\n\n // cull by radius\n if (length(splatPosModel) > cropRadius) {\n // write varyings via injected 'varyings' object\n varyings.vUv = quadPos.xy;\n varyings.vStds = 0.0;\n varyings.vColor = vec4<f32>(0.0);\n varyings.vSplatDepth = 1.0;\n return vec4<f32>(0.0);\n }\n\n // fetch covariance rows packed as half2\n let cov: vec4<u32> = textureLoad(covariance3D, coord, 0);\n let c0: vec2<f32> = unpack2x16float(cov.r);\n let c1: vec2<f32> = unpack2x16float(cov.g);\n let c2: vec2<f32> = unpack2x16float(cov.b);\n var covariance: mat3x3<f32> = mat3x3<f32>(\n vec3<f32>(c0.x, c0.y, c1.x),\n vec3<f32>(c0.y, c1.y, c2.x),\n vec3<f32>(c1.x, c2.x, c2.y)\n );\n\n // rotate covariance from z-up to y-up and by model rotation\n let modelRot: mat3x3<f32> = mat3x3<f32>(\n modelMatrix[0].xyz,\n modelMatrix[1].xyz,\n modelMatrix[2].xyz\n );\n let modelRotT: mat3x3<f32> = transpose(modelRot);\n covariance = transpose(zUpToYUpMatrix3x3) * covariance * zUpToYUpMatrix3x3;\n covariance = modelRotT * covariance * modelRot;\n covariance = covariance * (sizeMultiplier * sizeMultiplier);\n\n // threshold-based stds for opacity falloff\n let maxV: f32 = max(color.a, 0.0001);\n let thresh: f32 = min(minOpacity, maxV);\n if (thresh >= maxV) {\n varyings.vUv = quadPos.xy;\n varyings.vStds = 0.0;\n varyings.vColor = vec4<f32>(0.0);\n varyings.vSplatDepth = 1.0;\n return vec4<f32>(0.0);\n }\n let lnRatio: f32 = log(thresh / maxV);\n var stds: f32 = pow(-8.0 * lnRatio / beta_k, 1.0 / k);\n\n // world position\n let rotatedModel: vec3<f32> = zUpToYUpMatrix3x3 * splatPosModel;\n let splatWorld: vec3<f32> = (modelMatrix * vec4<f32>(rotatedModel, 1.0)).xyz;\n\n // depth without and with bias\n var splatView: vec4<f32> = viewMatrix * vec4<f32>(splatWorld, 1.0);\n let splatProj: vec4<f32> = projectionMatrix * splatView;\n splatView.z = splatView.z + depthBias;\n let splatProjBias: vec4<f32> = projectionMatrix * splatView;\n let splatDepthWithBias: f32 = (splatProjBias.z / splatProjBias.w) * 0.5 + 0.5;\n\n // screen-space jacobian\n let posCam: vec3<f32> = (viewMatrix * vec4<f32>(splatWorld, 1.0)).xyz;\n let invZ: f32 = 1.0 / posCam.z;\n let invZ2: f32 = invZ * invZ;\n let fx: f32 = projectionMatrix[0][0];\n let fy: f32 = projectionMatrix[1][1];\n let j0: vec3<f32> = vec3<f32>(fx * invZ, 0.0, -fx * posCam.x * invZ2);\n let j1: vec3<f32> = vec3<f32>(0.0, fy * invZ, -fy * posCam.y * invZ2);\n let viewRot: mat3x3<f32> = mat3x3<f32>(\n viewMatrix[0].xyz,\n viewMatrix[1].xyz,\n viewMatrix[2].xyz\n );\n let viewRotT: mat3x3<f32> = transpose(viewRot);\n let j0W: vec3<f32> = viewRotT * j0 * 4.0;\n let j1W: vec3<f32> = viewRotT * j1 * 4.0;\n let tmp0: vec3<f32> = covariance * j0W;\n let tmp1: vec3<f32> = covariance * j1W;\n var a: f32 = dot(j0W, tmp0);\n var b: f32 = dot(j0W, tmp1);\n var c: f32 = dot(j1W, tmp1);\n let sigmaNDC: f32 = (antialiasingFactor / viewportPixelSize.x) * 2.0;\n let k2: f32 = sigmaNDC * sigmaNDC;\n let detOrig: f32 = a * c - b * b;\n a = a + k2;\n c = c + k2;\n let detBlur: f32 = a * c - b * b;\n color.a = color.a * sqrt(clamp(detOrig / detBlur, 0.0, 1.0 - 1.0e-6));\n if (color.a < 0.01) {\n varyings.vUv = quadPos.xy;\n varyings.vStds = 0.0;\n varyings.vColor = vec4<f32>(0.0);\n varyings.vSplatDepth = 1.0;\n return vec4<f32>(0.0);\n }\n\n // ellipse axes and quad extrusion\n let halfTrace: f32 = 0.5 * (a + c);\n let rootTerm: f32 = sqrt(max(halfTrace * halfTrace - (a * c - b * b), 0.0));\n let lambda1: f32 = halfTrace + rootTerm;\n let lambda2: f32 = halfTrace - rootTerm;\n if (min(lambda2, lambda1) <= 0.0) {\n varyings.vUv = quadPos.xy;\n varyings.vStds = 0.0;\n varyings.vColor = vec4<f32>(0.0);\n varyings.vSplatDepth = 1.0;\n return vec4<f32>(0.0);\n }\n var eig1: vec2<f32>;\n if (abs(b) < 1e-7) {\n if (a >= c) {\n eig1 = vec2<f32>(1.0, 0.0);\n } else {\n eig1 = vec2<f32>(0.0, 1.0);\n }\n } else {\n eig1 = normalize(vec2<f32>(b, lambda1 - a));\n }\n var eig2: vec2<f32> = vec2<f32>(-eig1.y, eig1.x);\n eig1 = eig1 * sqrt(lambda1) * 2.0;\n eig2 = eig2 * sqrt(lambda2) * 2.0;\n let alpha: f32 = dot(j0, j0);\n let betaV: f32 = dot(j0, j1);\n let gammaV: f32 = dot(j1, j1);\n let invDet: f32 = 1.0 / (alpha * gammaV - betaV * betaV);\n var deltaCam1: vec3<f32> = (gammaV * eig1.x - betaV * eig1.y) * j0 + (-betaV * eig1.x + alpha * eig1.y) * j1;\n var deltaCam2: vec3<f32> = (gammaV * eig2.x - betaV * eig2.y) * j0 + (-betaV * eig2.x + alpha * eig2.y) * j1;\n deltaCam1 = deltaCam1 * invDet * 0.5;\n deltaCam2 = deltaCam2 * invDet * 0.5;\n let axisW1: vec3<f32> = viewRotT * deltaCam1;\n let axisW2: vec3<f32> = viewRotT * deltaCam2;\n\n let outWorld: vec3<f32> = splatWorld + (quadPos.x * axisW1 + quadPos.y * axisW2) * stds;\n let outPos: vec4<f32> = projectionMatrix * viewMatrix * vec4<f32>(outWorld, 1.0);\n\n // write varyings\n varyings.vUv = quadPos.xy;\n varyings.vStds = stds;\n varyings.vColor = color;\n varyings.vSplatDepth = splatDepthWithBias;\n\n return outPos;\n}\n";
|
|
2
|
+
export const fragment: "\nfn splatsFS(\n vUv: vec2<f32>,\n vStds: f32,\n vColor: vec4<f32>,\n k: f32,\n beta_k: f32\n) -> vec4<f32> {\n // cheap quad-circle discard\n if (dot(vUv, vUv) > 0.25) {\n return vec4<f32>(0.0);\n }\n let p: vec2<f32> = vUv * vStds;\n let r2: f32 = dot(p, p);\n let rk: f32 = pow(r2, 0.5 * k);\n let alpha: f32 = vColor.a * exp(-beta_k * rk);\n let corrected: vec3<f32> = pow(vColor.rgb, vec3<f32>(1.0 / 2.2));\n return vec4<f32>(corrected, alpha);\n}\n";
|
|
3
|
+
export const depth: "\nfn splatsDepth(vSplatDepth: f32) -> f32 {\n return vSplatDepth;\n}\n";
|