gaussian-splat-lite 0.1.10 → 0.1.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/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ and this project follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.11] - 2026-08-30
11
+
12
+ ### Changed
13
+
14
+ - Evaluated dynamic post-decode `when` guards before output-only expressions and compacted matching Splats within each worker block, skipping unnecessary attribute reads and arithmetic for rejected Splats.
15
+ - Pruned unused post-decode instructions, constants, and attributes during serialization, including folding constant `when` conditions.
16
+ - Reused post-decode temporary registers after their final use and allocated exact value widths, reducing worker scratch memory and increasing block sizes for long expression programs.
17
+ - Replaced recursive post-decode liveness traversal with an iterative worklist so maximum-length programs do not depend on the JavaScript call-stack limit.
18
+ - Avoided redundant `NaN` initialization before fully copying sort-center updates.
19
+
10
20
  ## [0.1.10] - 2026-08-29
11
21
 
12
22
  ### Changed
@@ -134,7 +144,8 @@ and this project follows [Semantic Versioning](https://semver.org/).
134
144
 
135
145
  - Initial public release of the Three.js Gaussian Splatting renderer.
136
146
 
137
- [Unreleased]: https://github.com/WilliamLiu-1997/Gaussian-Splat-Lite/compare/v0.1.10...HEAD
147
+ [Unreleased]: https://github.com/WilliamLiu-1997/Gaussian-Splat-Lite/compare/v0.1.11...HEAD
148
+ [0.1.11]: https://github.com/WilliamLiu-1997/Gaussian-Splat-Lite/compare/v0.1.10...v0.1.11
138
149
  [0.1.10]: https://github.com/WilliamLiu-1997/Gaussian-Splat-Lite/compare/v0.1.9...v0.1.10
139
150
  [0.1.9]: https://github.com/WilliamLiu-1997/Gaussian-Splat-Lite/compare/v0.1.8...v0.1.9
140
151
  [0.1.8]: https://github.com/WilliamLiu-1997/Gaussian-Splat-Lite/compare/v0.1.7...v0.1.8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-BjNOf79T.js","sources":["../rust/gaussian-splat-rs/pkg/gaussian_splat_rs.js","../src/float16.ts","../src/postDecode.ts","../src/splatCodec.ts","../src/postDecodeRuntime.ts","../src/transferable.ts","../src/worker.ts"],"sourcesContent":["/* @ts-self-types=\"./gaussian_splat_rs.d.ts\" */\n\nexport class ChunkDecoder {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(ChunkDecoder.prototype);\n obj.__wbg_ptr = ptr;\n ChunkDecoderFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n ChunkDecoderFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_chunkdecoder_free(ptr, 0);\n }\n /**\n * @returns {any}\n */\n finish() {\n const ptr = this.__destroy_into_raw();\n const ret = wasm.chunkdecoder_finish(ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {Uint8Array} bytes\n */\n push(bytes) {\n const ret = wasm.chunkdecoder_push(this.__wbg_ptr, bytes);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {number} size\n */\n set_expected_input_size(size) {\n const ret = wasm.chunkdecoder_set_expected_input_size(this.__wbg_ptr, size);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n}\nif (Symbol.dispose) ChunkDecoder.prototype[Symbol.dispose] = ChunkDecoder.prototype.free;\n\n/**\n * @param {string | null} [file_type]\n * @param {string | null} [path_name]\n * @returns {ChunkDecoder}\n */\nexport function decode_to_splats(file_type, path_name) {\n var ptr0 = isLikeNone(file_type) ? 0 : passStringToWasm0(file_type, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ptr1 = isLikeNone(path_name) ? 0 : passStringToWasm0(path_name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n const ret = wasm.decode_to_splats(ptr0, len0, ptr1, len1);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ChunkDecoder.__wrap(ret[0]);\n}\n\n/**\n * @returns {Uint32Array}\n */\nexport function get_raycast_buffer() {\n const ret = wasm.get_raycast_buffer();\n return ret;\n}\n\n/**\n * @returns {Uint32Array}\n */\nexport function get_raycast_buffer2() {\n const ret = wasm.get_raycast_buffer2();\n return ret;\n}\n\n/**\n * @param {number} origin_x\n * @param {number} origin_y\n * @param {number} origin_z\n * @param {number} dir_x\n * @param {number} dir_y\n * @param {number} dir_z\n * @param {number} min_opacity\n * @param {number} near\n * @param {number} far\n * @param {number} count\n * @returns {Float32Array}\n */\nexport function raycast_splat_buffers(origin_x, origin_y, origin_z, dir_x, dir_y, dir_z, min_opacity, near, far, count) {\n const ret = wasm.raycast_splat_buffers(origin_x, origin_y, origin_z, dir_x, dir_y, dir_z, min_opacity, near, far, count);\n return ret;\n}\n\n/**\n * @param {Uint32Array} center_update_range_indices\n * @param {Float32Array} update_centers\n * @param {Uint32Array} matrix_update_range_indices\n * @param {Float64Array} update_matrices\n * @param {Uint32Array} range_mesh_ids\n * @param {Uint32Array} range_bases\n * @param {Uint32Array} range_counts\n */\nexport function set_sort_center_state(center_update_range_indices, update_centers, matrix_update_range_indices, update_matrices, range_mesh_ids, range_bases, range_counts) {\n wasm.set_sort_center_state(center_update_range_indices, update_centers, matrix_update_range_indices, update_matrices, range_mesh_ids, range_bases, range_counts);\n}\n\n/**\n * @param {number} num_splats\n * @param {number} camera_x\n * @param {number} camera_y\n * @param {number} camera_z\n * @param {number} direction_x\n * @param {number} direction_y\n * @param {number} direction_z\n * @param {boolean} radial\n * @param {Uint32Array} ordering\n * @returns {number}\n */\nexport function sort32_centers(num_splats, camera_x, camera_y, camera_z, direction_x, direction_y, direction_z, radial, ordering) {\n const ret = wasm.sort32_centers(num_splats, camera_x, camera_y, camera_z, direction_x, direction_y, direction_z, radial, ordering);\n return ret >>> 0;\n}\n\nexport function wasm_start() {\n wasm.wasm_start();\n}\n\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg___wbindgen_debug_string_dd5d2d07ce9e6c57: function(arg0, arg1) {\n const ret = debugString(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_throw_81fc77679af83bc6: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_error_a6fa202b58aa1cd3: function(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);\n }\n },\n __wbg_get_index_983d655608220248: function(arg0, arg1) {\n const ret = arg0[arg1 >>> 0];\n return ret;\n },\n __wbg_length_0c32cb8543c8e4c8: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_length_1e701798fdcaa3b4: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_length_526c0f6e4ebae15d: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_length_fd4646b401926788: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_new_227d7c05414eb861: function() {\n const ret = new Error();\n return ret;\n },\n __wbg_new_4f9fafbb3909af72: function() {\n const ret = new Object();\n return ret;\n },\n __wbg_new_with_length_26bffbe236bf73f9: function(arg0) {\n const ret = new Float32Array(arg0 >>> 0);\n return ret;\n },\n __wbg_new_with_length_41a22191b9bdfd66: function(arg0) {\n const ret = new Uint32Array(arg0 >>> 0);\n return ret;\n },\n __wbg_prototypesetcall_021fd89d67217368: function(arg0, arg1, arg2) {\n Float64Array.prototype.set.call(getArrayF64FromWasm0(arg0, arg1), arg2);\n },\n __wbg_prototypesetcall_3e05eb9545565046: function(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);\n },\n __wbg_prototypesetcall_66c8e1fb820946be: function(arg0, arg1, arg2) {\n Float32Array.prototype.set.call(getArrayF32FromWasm0(arg0, arg1), arg2);\n },\n __wbg_prototypesetcall_e42275e601e14eeb: function(arg0, arg1, arg2) {\n Uint32Array.prototype.set.call(getArrayU32FromWasm0(arg0, arg1), arg2);\n },\n __wbg_set_448126769bf7c181: function(arg0, arg1, arg2) {\n arg0.set(getArrayU32FromWasm0(arg1, arg2));\n },\n __wbg_set_8ee2d34facb8466e: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = Reflect.set(arg0, arg1, arg2);\n return ret;\n }, arguments); },\n __wbg_set_a98c8da6557e63de: function(arg0, arg1, arg2) {\n arg0.set(getArrayF32FromWasm0(arg1, arg2));\n },\n __wbg_set_index_a561936dd7004b5a: function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n },\n __wbg_stack_3b0d974bbf31e44f: function(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_subarray_0f98d3fb634508ad: function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n },\n __wbg_subarray_1230568a23d546e8: function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n },\n __wbg_subarray_4342405c1ffc86d6: function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n },\n __wbg_subarray_d51e89458b3fdbf6: function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n },\n __wbindgen_cast_0000000000000001: function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n },\n __wbindgen_cast_0000000000000002: function(arg0, arg1) {\n // Cast intrinsic for `Ref(Slice(F32)) -> NamedExternref(\"Float32Array\")`.\n const ret = getArrayF32FromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000003: function(arg0, arg1) {\n // Cast intrinsic for `Ref(Slice(U32)) -> NamedExternref(\"Uint32Array\")`.\n const ret = getArrayU32FromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000004: function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_init_externref_table: function() {\n const table = wasm.__wbindgen_externrefs;\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 return {\n __proto__: null,\n \"./gaussian_splat_rs_bg.js\": import0,\n };\n}\n\nconst ChunkDecoderFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_chunkdecoder_free(ptr >>> 0, 1));\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_externrefs.set(idx, obj);\n return idx;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction getArrayF32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayF64FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getFloat64ArrayMemory0().subarray(ptr / 8, ptr / 8 + len);\n}\n\nfunction getArrayU32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nlet cachedFloat32ArrayMemory0 = null;\nfunction getFloat32ArrayMemory0() {\n if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {\n cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);\n }\n return cachedFloat32ArrayMemory0;\n}\n\nlet cachedFloat64ArrayMemory0 = null;\nfunction getFloat64ArrayMemory0() {\n if (cachedFloat64ArrayMemory0 === null || cachedFloat64ArrayMemory0.byteLength === 0) {\n cachedFloat64ArrayMemory0 = new Float64Array(wasm.memory.buffer);\n }\n return cachedFloat64ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint32ArrayMemory0 = null;\nfunction getUint32ArrayMemory0() {\n if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n }\n return cachedUint32ArrayMemory0;\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n wasmModule = module;\n cachedDataViewMemory0 = null;\n cachedFloat32ArrayMemory0 = null;\n cachedFloat64ArrayMemory0 = null;\n cachedUint32ArrayMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n wasm.__wbindgen_start();\n return wasm;\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 } catch (e) {\n const validResponse = module.ok && expectedResponseType(module.type);\n\n if (validResponse && 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 { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (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 if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\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 (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\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 const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","const f32 = new Float32Array(1);\nconst u32 = new Uint32Array(f32.buffer);\nconst supportsFloat16Array = \"Float16Array\" in globalThis;\nconst f16 = supportsFloat16Array\n ? new globalThis[\"Float16Array\" as keyof typeof globalThis](1)\n : null;\nconst u16 = new Uint16Array(f16?.buffer);\n\nfunction toHalfNative(value: number): number {\n f16[0] = value;\n return u16[0];\n}\n\nfunction toHalfJs(value: number): number {\n f32[0] = value;\n const bits = u32[0];\n const sign = (bits >>> 16) & 0x8000;\n const exponent = (bits >>> 23) & 0xff;\n const fraction = bits & 0x7f_ffff;\n\n if (exponent === 0xff) {\n return sign | (fraction === 0 ? 0x7c00 : 0x7fff);\n }\n\n const halfExponent = exponent - 127 + 15;\n if (halfExponent >= 0x1f) return sign | 0x7c00;\n if (halfExponent <= 0) {\n if (halfExponent < -10) return sign;\n return sign | ((fraction | 0x80_0000) >>> (1 - halfExponent + 13));\n }\n return sign | (halfExponent << 10) | (fraction >>> 13);\n}\n\nfunction fromHalfNative(value: number): number {\n u16[0] = value;\n return f16[0];\n}\n\nfunction fromHalfJs(value: number): number {\n const sign = (value >>> 15) & 1;\n const exponent = (value >>> 10) & 0x1f;\n const fraction = value & 0x3ff;\n let bits: number;\n\n if (exponent === 0) {\n if (fraction === 0) {\n bits = sign << 31;\n } else {\n let mantissa = fraction;\n let adjustedExponent = -14;\n while ((mantissa & 0x400) === 0) {\n mantissa <<= 1;\n adjustedExponent -= 1;\n }\n bits =\n (sign << 31) |\n ((adjustedExponent + 127) << 23) |\n ((mantissa & 0x3ff) << 13);\n }\n } else if (exponent === 0x1f) {\n bits = (sign << 31) | (fraction === 0 ? 0x7f80_0000 : 0x7fc0_0000);\n } else {\n bits = (sign << 31) | ((exponent - 15 + 127) << 23) | (fraction << 13);\n }\n\n u32[0] = bits;\n return f32[0];\n}\n\nexport const toHalf = supportsFloat16Array ? toHalfNative : toHalfJs;\nexport const fromHalf = supportsFloat16Array ? fromHalfNative : fromHalfJs;\n","/** @internal */\nexport enum Opcode {\n Constant = 1,\n InputField = 2,\n InputAttribute = 3,\n\n Negate = 10,\n Abs = 11,\n Sqrt = 12,\n Log = 13,\n Exp = 14,\n Floor = 15,\n Ceil = 16,\n Round = 17,\n Normalize = 18,\n Length = 19,\n IsFinite = 20,\n Not = 22,\n Sin = 23,\n Cos = 24,\n Acos = 25,\n\n Add = 30,\n Subtract = 31,\n Multiply = 32,\n Divide = 33,\n Min = 34,\n Max = 35,\n Pow = 36,\n Dot = 37,\n Cross = 38,\n Equal = 39,\n NotEqual = 40,\n Less = 41,\n LessEqual = 42,\n Greater = 43,\n GreaterEqual = 44,\n And = 45,\n Or = 46,\n QuaternionMultiply = 47,\n RotateVector = 48,\n\n Select = 60,\n Clamp = 61,\n Mix = 62,\n\n Vec2 = 70,\n Vec3 = 71,\n Vec4 = 72,\n Component = 74,\n MaxComponentIndex = 75,\n}\n\n/** @internal */\nexport enum InputField {\n Position = 1,\n Scale = 2,\n Quaternion = 3,\n Opacity = 4,\n Alpha = 5,\n Color = 6,\n Sh0 = 7,\n}\n\n/** @internal */\nexport const SH_COEFFICIENT_COUNT = 15;\n\n/** @internal */\nexport type SplatPostDecodeValueType =\n | \"float\"\n | \"bool\"\n | \"vec2\"\n | \"vec3\"\n | \"vec4\"\n | \"quaternion\";\n\ntype NumericValueType = \"float\" | \"vec2\" | \"vec3\" | \"vec4\";\ntype VectorValueType = \"vec2\" | \"vec3\" | \"vec4\";\n\n/** @internal */\nexport const TYPE_WIDTHS: Record<SplatPostDecodeValueType, number> = {\n float: 1,\n bool: 1,\n vec2: 2,\n vec3: 3,\n vec4: 4,\n quaternion: 4,\n};\n\nclass SplatPostDecodeValue<T extends SplatPostDecodeValueType> {\n /** @internal */\n constructor(\n readonly type: T,\n /** @internal */ readonly register: number,\n /** @internal */ readonly owner: ProgramBuilder,\n ) {}\n}\n\ntype FloatValue = SplatPostDecodeValue<\"float\">;\ntype BoolValue = SplatPostDecodeValue<\"bool\">;\ntype Vec2Value = SplatPostDecodeValue<\"vec2\">;\ntype Vec3Value = SplatPostDecodeValue<\"vec3\">;\ntype Vec4Value = SplatPostDecodeValue<\"vec4\">;\ntype QuaternionValue = SplatPostDecodeValue<\"quaternion\">;\n\ntype FloatLike = number | FloatValue;\ntype BoolLike = boolean | BoolValue;\ntype Vec2Literal = readonly [number, number];\ntype Vec3Literal = readonly [number, number, number];\ntype Vec4Literal = readonly [number, number, number, number];\ntype Vec2Like = Vec2Literal | Vec2Value;\ntype Vec3Like = Vec3Literal | Vec3Value;\ntype Vec4Like = Vec4Literal | Vec4Value;\ntype QuaternionLike = Vec4Literal | QuaternionValue;\n\ntype LiteralFor<T extends SplatPostDecodeValueType> = T extends \"float\"\n ? number\n : T extends \"bool\"\n ? boolean\n : T extends \"vec2\"\n ? Vec2Literal\n : T extends \"vec3\"\n ? Vec3Literal\n : Vec4Literal;\n\ntype ValueLike<T extends SplatPostDecodeValueType> =\n | LiteralFor<T>\n | SplatPostDecodeValue<T>;\n\ntype AnyValueLike = ValueLike<SplatPostDecodeValueType>;\n\ntype BroadcastLike<T extends NumericValueType> = ValueLike<T> | FloatLike;\n\n/** @internal */\nexport type SplatPostDecodeInstruction = {\n opcode: Opcode;\n type: SplatPostDecodeValueType;\n args: readonly number[];\n immediate: number;\n};\n\n/** @internal */\nexport type SplatPostDecodeAttributeFormat =\n | \"f32\"\n | \"f16\"\n | \"u8\"\n | \"unorm8\"\n | \"i8\"\n | \"snorm8\"\n | \"u16\"\n | \"unorm16\"\n | \"i16\"\n | \"snorm16\"\n | \"u32\"\n | \"i32\";\n\n/** @internal */\nexport const ATTRIBUTE_FORMAT_BYTES: Record<\n SplatPostDecodeAttributeFormat,\n number\n> = {\n f32: 4,\n f16: 2,\n u8: 1,\n unorm8: 1,\n i8: 1,\n snorm8: 1,\n u16: 2,\n unorm16: 2,\n i16: 2,\n snorm16: 2,\n u32: 4,\n i32: 4,\n};\n\ntype AttributeComponents = 1 | 2 | 3 | 4;\nconst COMPONENT_TYPES = [\"float\", \"vec2\", \"vec3\", \"vec4\"] as const;\n\ntype SplatPostDecodeAttributeOptions<\n Components extends AttributeComponents = 1,\n> = {\n data: ArrayBufferView;\n format: SplatPostDecodeAttributeFormat;\n count: number;\n components?: Components;\n /** Byte offset relative to the supplied data view. */\n byteOffset?: number;\n byteStride?: number;\n};\n\ntype AttributeValue<Components extends AttributeComponents> =\n Components extends 1\n ? FloatValue\n : Components extends 2\n ? Vec2Value\n : Components extends 3\n ? Vec3Value\n : Vec4Value;\n\ntype AttributeBinding = {\n data: ArrayBufferView;\n format: SplatPostDecodeAttributeFormat;\n count: number;\n components: AttributeComponents;\n byteOffset: number;\n byteStride: number;\n};\n\ntype SplatShCoefficientContext = {\n index: number;\n degree: 1 | 2 | 3;\n order: number;\n};\n\nclass SplatPostDecodeShPatch {\n /** @internal */\n constructor(\n /** @internal */ readonly owner: ProgramBuilder,\n /** @internal */ readonly coefficients: readonly Vec3Value[],\n ) {}\n}\n\nclass SplatPostDecodeShValue {\n /** @internal */\n constructor(private readonly owner: ProgramBuilder) {}\n\n coefficient(index: number): Vec3Value {\n if (\n !Number.isInteger(index) ||\n index < 0 ||\n index >= SH_COEFFICIENT_COUNT\n ) {\n throw new Error(\"SH coefficient index must be between 0 and 14\");\n }\n return this.owner.inputField(\"vec3\", InputField.Sh0 + index);\n }\n\n map(\n transform: (\n coefficient: Vec3Value,\n context: SplatShCoefficientContext,\n ) => Vec3Like,\n ): SplatPostDecodeShPatch {\n const coefficients: Vec3Value[] = [];\n let index = 0;\n for (let degree = 1 as 1 | 2 | 3; degree <= 3; degree += 1) {\n for (let order = -degree; order <= degree; order += 1) {\n const value = transform(this.coefficient(index), {\n index,\n degree,\n order,\n });\n coefficients.push(this.owner.coerce(value, \"vec3\"));\n index += 1;\n }\n }\n return new SplatPostDecodeShPatch(this.owner, coefficients);\n }\n}\n\ntype SplatPostDecodeInput = {\n readonly position: Vec3Value;\n readonly scale: Vec3Value;\n readonly quaternion: QuaternionValue;\n /** Semantic opacity in the [0, 1000] range. */\n readonly opacity: FloatValue;\n /** Standard alpha in the [0, 1] range. */\n readonly alpha: FloatValue;\n readonly color: Vec3Value;\n readonly sh: SplatPostDecodeShValue;\n};\n\ntype SplatPostDecodePatch = {\n /** If false, this splat's packed values are left byte-for-byte unchanged. */\n when?: BoolLike;\n position?: Vec3Like;\n scale?: Vec3Like;\n quaternion?: QuaternionLike;\n /** Semantic opacity, clamped to [0, 1000] and encoded by the library. */\n opacity?: FloatLike;\n /**\n * Standard alpha, clamped to [0, 1] and independent from semantic opacity.\n * Cannot be output with opacity in the same patch.\n */\n alpha?: FloatLike;\n color?: Vec3Like;\n sh?: SplatPostDecodeShPatch;\n};\n\ntype SplatPostDecodeContext = {\n splat: SplatPostDecodeInput;\n op: SplatPostDecodeOperations;\n attribute<Components extends AttributeComponents = 1>(\n options: SplatPostDecodeAttributeOptions<Components>,\n ): AttributeValue<Components>;\n};\n\ntype VariadicNumericOperation = <T extends NumericValueType>(\n first: ValueLike<T>,\n ...rest: BroadcastLike<T>[]\n) => SplatPostDecodeValue<T>;\n\ntype BinaryNumericOperation = <T extends NumericValueType>(\n left: ValueLike<T>,\n right: BroadcastLike<T>,\n) => SplatPostDecodeValue<T>;\n\ntype UnaryNumericOperation = <T extends NumericValueType>(\n value: ValueLike<T>,\n) => SplatPostDecodeValue<T>;\n\ntype SplatPostDecodeOperations = {\n add: VariadicNumericOperation;\n sub: BinaryNumericOperation;\n mul: VariadicNumericOperation;\n div: BinaryNumericOperation;\n min: BinaryNumericOperation;\n max: BinaryNumericOperation;\n pow: BinaryNumericOperation;\n clamp<T extends NumericValueType>(\n value: ValueLike<T>,\n min: BroadcastLike<T>,\n max: BroadcastLike<T>,\n ): SplatPostDecodeValue<T>;\n mix<T extends NumericValueType>(\n left: ValueLike<T>,\n right: ValueLike<T>,\n amount: BroadcastLike<T>,\n ): SplatPostDecodeValue<T>;\n neg: UnaryNumericOperation;\n abs: UnaryNumericOperation;\n sqrt: UnaryNumericOperation;\n log: UnaryNumericOperation;\n exp: UnaryNumericOperation;\n floor: UnaryNumericOperation;\n ceil: UnaryNumericOperation;\n round: UnaryNumericOperation;\n sin: UnaryNumericOperation;\n cos: UnaryNumericOperation;\n acos: UnaryNumericOperation;\n normalize<T extends VectorValueType | \"quaternion\">(\n value: ValueLike<T>,\n ): SplatPostDecodeValue<T>;\n length(value: Vec2Like | Vec3Like | Vec4Like): FloatValue;\n isFinite(\n value: FloatLike | Vec2Like | Vec3Like | Vec4Like | QuaternionLike,\n ): BoolValue;\n not(value: BoolLike): BoolValue;\n eq<T extends SplatPostDecodeValueType>(\n left: ValueLike<T>,\n right: ValueLike<T>,\n ): BoolValue;\n ne<T extends SplatPostDecodeValueType>(\n left: ValueLike<T>,\n right: ValueLike<T>,\n ): BoolValue;\n lt(left: FloatLike, right: FloatLike): BoolValue;\n lte(left: FloatLike, right: FloatLike): BoolValue;\n gt(left: FloatLike, right: FloatLike): BoolValue;\n gte(left: FloatLike, right: FloatLike): BoolValue;\n and(first: BoolLike, ...rest: BoolLike[]): BoolValue;\n or(first: BoolLike, ...rest: BoolLike[]): BoolValue;\n select<T extends SplatPostDecodeValueType>(\n condition: BoolLike,\n whenTrue: ValueLike<T>,\n whenFalse: ValueLike<T>,\n ): SplatPostDecodeValue<T>;\n dot(\n left: Vec2Like | Vec3Like | Vec4Like,\n right: Vec2Like | Vec3Like | Vec4Like,\n ): FloatValue;\n cross(left: Vec3Like, right: Vec3Like): Vec3Value;\n vec2(x: FloatLike, y: FloatLike): Vec2Value;\n vec3(x: FloatLike, y: FloatLike, z: FloatLike): Vec3Value;\n vec4(x: FloatLike, y: FloatLike, z: FloatLike, w: FloatLike): Vec4Value;\n quaternion(\n x: FloatLike,\n y: FloatLike,\n z: FloatLike,\n w: FloatLike,\n ): QuaternionValue;\n component(\n value: Vec2Like | Vec3Like | Vec4Like | QuaternionLike,\n index: number,\n ): FloatValue;\n maxComponentIndex(value: Vec2Like | Vec3Like | Vec4Like): FloatValue;\n quatMul(left: QuaternionLike, right: QuaternionLike): QuaternionValue;\n rotateVector(quaternion: QuaternionLike, vector: Vec3Like): Vec3Value;\n};\n\n/** @internal */\nexport type SerializedSplatPostDecodeAttribute = {\n format: SplatPostDecodeAttributeFormat;\n components: AttributeComponents;\n byteOffset: number;\n byteStride: number;\n count: number;\n};\n\n/** @internal */\nexport type SplatPostDecodeOutputs = {\n when?: number;\n position?: number;\n scale?: number;\n quaternion?: number;\n opacity?: number;\n alpha?: number;\n color?: number;\n sh?: readonly number[];\n};\n\n/** @internal */\nexport type SerializedSplatPostDecode = {\n instructions: readonly SplatPostDecodeInstruction[];\n constants: Float32Array;\n outputs: SplatPostDecodeOutputs;\n attributeData: Uint8Array;\n attributes: readonly SerializedSplatPostDecodeAttribute[];\n};\n\nconst SPLAT_POST_DECODE_PROGRAM = Symbol(\"SplatPostDecodeProgram\");\n\nfunction constantKey(\n type: SplatPostDecodeValueType,\n values: readonly number[],\n) {\n return `${type}:${values\n .map((value) => (Object.is(value, -0) ? \"-0\" : value))\n .join(\":\")}`;\n}\n\nexport type SplatPostDecodeProgram = {\n readonly [SPLAT_POST_DECODE_PROGRAM]: true;\n};\n\nclass ProgramBuilder {\n readonly instructions: SplatPostDecodeInstruction[] = [];\n readonly constants: number[] = [];\n readonly attributes: AttributeBinding[] = [];\n readonly constantRegisters = new Map<\n string,\n SplatPostDecodeValue<SplatPostDecodeValueType>\n >();\n readonly inputRegisters = new Map<\n number,\n SplatPostDecodeValue<SplatPostDecodeValueType>\n >();\n\n readonly op: SplatPostDecodeOperations;\n readonly splat: SplatPostDecodeInput;\n\n constructor() {\n this.op = this.createOperations();\n const owner = this;\n const sh = new SplatPostDecodeShValue(this);\n this.splat = {\n get position() {\n return owner.inputField(\"vec3\", InputField.Position);\n },\n get scale() {\n return owner.inputField(\"vec3\", InputField.Scale);\n },\n get quaternion() {\n return owner.inputField(\"quaternion\", InputField.Quaternion);\n },\n get opacity() {\n return owner.inputField(\"float\", InputField.Opacity);\n },\n get alpha() {\n return owner.inputField(\"float\", InputField.Alpha);\n },\n get color() {\n return owner.inputField(\"vec3\", InputField.Color);\n },\n sh,\n };\n }\n\n inputField<T extends SplatPostDecodeValueType>(\n type: T,\n field: InputField,\n ): SplatPostDecodeValue<T> {\n const current = this.inputRegisters.get(field);\n if (current) return current as SplatPostDecodeValue<T>;\n const value = this.instruction(type, Opcode.InputField, [], field);\n this.inputRegisters.set(field, value);\n return value;\n }\n\n attribute<Components extends AttributeComponents = 1>(\n options: SplatPostDecodeAttributeOptions<Components>,\n ): AttributeValue<Components> {\n if (!ArrayBuffer.isView(options.data)) {\n throw new Error(\"postDecode attribute data must be an ArrayBuffer view\");\n }\n const componentBytes = ATTRIBUTE_FORMAT_BYTES[options.format];\n if (!componentBytes)\n throw new Error(`Unknown postDecode format: ${options.format}`);\n const count = options.count;\n const components = options.components ?? 1;\n const byteOffset = options.byteOffset ?? 0;\n const packedBytes = componentBytes * components;\n const byteStride = options.byteStride ?? packedBytes;\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new Error(\"postDecode attribute count must be non-negative\");\n }\n if (!Number.isInteger(components) || components < 1 || components > 4) {\n throw new Error(\n \"postDecode attribute components must be between 1 and 4\",\n );\n }\n if (\n !Number.isSafeInteger(byteOffset) ||\n byteOffset < 0 ||\n !Number.isSafeInteger(byteStride) ||\n byteStride < packedBytes\n ) {\n throw new Error(\"Invalid postDecode attribute byteOffset or byteStride\");\n }\n const requiredBytes =\n count === 0\n ? byteOffset\n : byteOffset + (count - 1) * byteStride + packedBytes;\n if (\n !Number.isSafeInteger(requiredBytes) ||\n requiredBytes > options.data.byteLength\n ) {\n throw new Error(\"postDecode attribute data is too small\");\n }\n\n const type = COMPONENT_TYPES[components - 1];\n const index = this.attributes.length;\n this.attributes.push({\n data: options.data,\n format: options.format,\n count,\n components,\n byteOffset,\n byteStride,\n });\n return this.instruction(\n type,\n Opcode.InputAttribute,\n [],\n index,\n ) as AttributeValue<Components>;\n }\n\n coerce<T extends SplatPostDecodeValueType>(\n value: ValueLike<T>,\n expectedType?: T,\n ): SplatPostDecodeValue<T> {\n if (value instanceof SplatPostDecodeValue) {\n if (value.owner !== this) {\n throw new Error(\n \"Cannot combine values from different postDecode programs\",\n );\n }\n if (expectedType && value.type !== expectedType) {\n const quaternionCompatible =\n (expectedType === \"quaternion\" && value.type === \"vec4\") ||\n (expectedType === \"vec4\" && value.type === \"quaternion\");\n if (!quaternionCompatible) {\n throw new Error(`Expected ${expectedType}, received ${value.type}`);\n }\n }\n return value as SplatPostDecodeValue<T>;\n }\n\n const type = expectedType ?? inferLiteralType(value);\n const numeric =\n typeof value === \"boolean\"\n ? [value ? 1 : 0]\n : typeof value === \"number\"\n ? [value]\n : [...(value as readonly number[])];\n const width = TYPE_WIDTHS[type];\n if (numeric.length !== width) {\n throw new Error(`Expected ${width} values for ${type}`);\n }\n const floatValues = numeric.map((component) => Math.fround(component));\n if (!floatValues.every(Number.isFinite)) {\n throw new Error(\"postDecode constants must be finite\");\n }\n const key = constantKey(type, floatValues);\n const current = this.constantRegisters.get(key);\n if (current) return current as SplatPostDecodeValue<T>;\n\n const constantBase = this.constants.length;\n this.constants.push(...floatValues);\n const constant = this.instruction(\n type as T,\n Opcode.Constant,\n [],\n constantBase,\n );\n this.constantRegisters.set(key, constant);\n return constant;\n }\n\n private instruction<T extends SplatPostDecodeValueType>(\n type: T,\n opcode: Opcode,\n args: readonly number[] = [],\n immediate = 0,\n ): SplatPostDecodeValue<T> {\n if (this.instructions.length >= 4096) {\n throw new Error(\"postDecode program exceeds 4096 instructions\");\n }\n const register = this.instructions.length;\n this.instructions.push({ opcode, type, args, immediate });\n return new SplatPostDecodeValue(type, register, this);\n }\n\n private unary<T extends SplatPostDecodeValueType>(\n opcode: Opcode,\n value: ValueLike<T>,\n outputType?: SplatPostDecodeValueType,\n ) {\n const input = this.coerce(value);\n return this.instruction(outputType ?? input.type, opcode, [input.register]);\n }\n\n private binary<T extends SplatPostDecodeValueType>(\n opcode: Opcode,\n leftValue: ValueLike<T>,\n rightValue: AnyValueLike,\n outputType?: SplatPostDecodeValueType,\n ) {\n const left = this.coerce(leftValue);\n const right = this.coerceForBinary(rightValue, left.type);\n return this.instruction(outputType ?? left.type, opcode, [\n left.register,\n right.register,\n ]);\n }\n\n private ternary<T extends SplatPostDecodeValueType>(\n opcode: Opcode,\n firstValue: ValueLike<T>,\n secondValue: ValueLike<T> | FloatLike,\n thirdValue: ValueLike<T> | FloatLike,\n ) {\n const first = this.coerce(firstValue);\n const second = this.coerceForBinary(secondValue, first.type);\n const third = this.coerceForBinary(thirdValue, first.type);\n return this.instruction(first.type, opcode, [\n first.register,\n second.register,\n third.register,\n ]);\n }\n\n private coerceForBinary(\n value: AnyValueLike,\n targetType: SplatPostDecodeValueType,\n ) {\n if (value instanceof SplatPostDecodeValue) {\n if (value.type === \"float\" && TYPE_WIDTHS[targetType] > 1) {\n return this.coerce(value);\n }\n return this.coerce(value, targetType);\n }\n return this.coerce(\n value,\n typeof value === \"number\" && TYPE_WIDTHS[targetType] > 1\n ? \"float\"\n : targetType,\n );\n }\n\n private createOperations(): SplatPostDecodeOperations {\n const reduceNumeric =\n (opcode: Opcode): VariadicNumericOperation =>\n <T extends NumericValueType>(\n first: ValueLike<T>,\n ...rest: BroadcastLike<T>[]\n ) => {\n let value = this.coerce(first);\n for (const right of rest) {\n value = this.binary(opcode, value, right) as SplatPostDecodeValue<T>;\n }\n return value;\n };\n const binaryNumeric =\n (opcode: Opcode): BinaryNumericOperation =>\n <T extends NumericValueType>(\n left: ValueLike<T>,\n right: BroadcastLike<T>,\n ) =>\n this.binary(opcode, left, right) as SplatPostDecodeValue<T>;\n const unaryNumeric =\n (opcode: Opcode): UnaryNumericOperation =>\n <T extends NumericValueType>(value: ValueLike<T>) =>\n this.unary(opcode, value) as SplatPostDecodeValue<T>;\n const compare =\n (opcode: Opcode) => (left: AnyValueLike, right: AnyValueLike) =>\n this.binary(opcode, left, right, \"bool\") as BoolValue;\n const reduceBoolean =\n (opcode: Opcode) =>\n (first: BoolLike, ...rest: BoolLike[]) => {\n let value = this.coerce(first, \"bool\");\n for (const right of rest) {\n value = this.binary(opcode, value, right, \"bool\") as BoolValue;\n }\n return value;\n };\n const construct = <T extends VectorValueType | \"quaternion\">(\n opcode: Opcode,\n type: T,\n values: FloatLike[],\n ) => {\n const args = values.map((value) => this.coerce(value, \"float\").register);\n return this.instruction(type, opcode, args);\n };\n\n return {\n add: reduceNumeric(Opcode.Add),\n sub: binaryNumeric(Opcode.Subtract),\n mul: reduceNumeric(Opcode.Multiply),\n div: binaryNumeric(Opcode.Divide),\n min: binaryNumeric(Opcode.Min),\n max: binaryNumeric(Opcode.Max),\n pow: binaryNumeric(Opcode.Pow),\n clamp: <T extends NumericValueType>(\n value: ValueLike<T>,\n min: BroadcastLike<T>,\n max: BroadcastLike<T>,\n ) =>\n this.ternary(Opcode.Clamp, value, min, max) as SplatPostDecodeValue<T>,\n mix: <T extends NumericValueType>(\n left: ValueLike<T>,\n right: ValueLike<T>,\n amount: BroadcastLike<T>,\n ) =>\n this.ternary(\n Opcode.Mix,\n left,\n right,\n amount,\n ) as SplatPostDecodeValue<T>,\n neg: unaryNumeric(Opcode.Negate),\n abs: unaryNumeric(Opcode.Abs),\n sqrt: unaryNumeric(Opcode.Sqrt),\n log: unaryNumeric(Opcode.Log),\n exp: unaryNumeric(Opcode.Exp),\n floor: unaryNumeric(Opcode.Floor),\n ceil: unaryNumeric(Opcode.Ceil),\n round: unaryNumeric(Opcode.Round),\n sin: unaryNumeric(Opcode.Sin),\n cos: unaryNumeric(Opcode.Cos),\n acos: unaryNumeric(Opcode.Acos),\n normalize: <T extends VectorValueType | \"quaternion\">(\n value: ValueLike<T>,\n ) => this.unary(Opcode.Normalize, value) as SplatPostDecodeValue<T>,\n length: (value) =>\n this.unary(Opcode.Length, value as AnyValueLike, \"float\") as FloatValue,\n isFinite: (value) =>\n this.unary(Opcode.IsFinite, value as AnyValueLike, \"bool\") as BoolValue,\n not: (value) =>\n this.unary(Opcode.Not, this.coerce(value, \"bool\"), \"bool\") as BoolValue,\n eq: compare(Opcode.Equal),\n ne: compare(Opcode.NotEqual),\n lt: compare(Opcode.Less),\n lte: compare(Opcode.LessEqual),\n gt: compare(Opcode.Greater),\n gte: compare(Opcode.GreaterEqual),\n and: reduceBoolean(Opcode.And),\n or: reduceBoolean(Opcode.Or),\n select: <T extends SplatPostDecodeValueType>(\n condition: BoolLike,\n whenTrue: ValueLike<T>,\n whenFalse: ValueLike<T>,\n ) => {\n const trueValue = this.coerce(whenTrue);\n const falseValue = this.coerce(whenFalse, trueValue.type);\n return this.instruction(trueValue.type, Opcode.Select, [\n this.coerce(condition, \"bool\").register,\n trueValue.register,\n falseValue.register,\n ]) as SplatPostDecodeValue<T>;\n },\n dot: (left, right) =>\n this.binary(\n Opcode.Dot,\n left as AnyValueLike,\n right as AnyValueLike,\n \"float\",\n ) as FloatValue,\n cross: (left, right) =>\n this.binary(Opcode.Cross, left, right) as Vec3Value,\n vec2: (x, y) => construct(Opcode.Vec2, \"vec2\", [x, y]),\n vec3: (x, y, z) => construct(Opcode.Vec3, \"vec3\", [x, y, z]),\n vec4: (x, y, z, w) => construct(Opcode.Vec4, \"vec4\", [x, y, z, w]),\n quaternion: (x, y, z, w) =>\n construct(Opcode.Vec4, \"quaternion\", [x, y, z, w]),\n component: (value, index) => {\n const input = this.coerce(value as AnyValueLike);\n if (\n !Number.isInteger(index) ||\n index < 0 ||\n index >= TYPE_WIDTHS[input.type]\n ) {\n throw new Error(\"postDecode component index is out of bounds\");\n }\n return this.instruction(\n \"float\",\n Opcode.Component,\n [input.register],\n index,\n );\n },\n maxComponentIndex: (value) =>\n this.unary(\n Opcode.MaxComponentIndex,\n value as AnyValueLike,\n \"float\",\n ) as FloatValue,\n quatMul: (left, right) => {\n const leftValue = this.coerce(left, \"quaternion\");\n const rightValue = this.coerce(right, \"quaternion\");\n return this.instruction(\"quaternion\", Opcode.QuaternionMultiply, [\n leftValue.register,\n rightValue.register,\n ]);\n },\n rotateVector: (quaternion, vector) => {\n const quaternionValue = this.coerce(quaternion, \"quaternion\");\n const vectorValue = this.coerce(vector, \"vec3\");\n return this.instruction(\"vec3\", Opcode.RotateVector, [\n quaternionValue.register,\n vectorValue.register,\n ]);\n },\n };\n }\n}\n\nfunction inferLiteralType(value: unknown): SplatPostDecodeValueType {\n if (typeof value === \"boolean\") return \"bool\";\n if (typeof value === \"number\") return \"float\";\n if (Array.isArray(value)) {\n if (value.length === 2) return \"vec2\";\n if (value.length === 3) return \"vec3\";\n if (value.length === 4) return \"vec4\";\n }\n throw new Error(\"Unsupported postDecode literal\");\n}\n\nfunction pruneProgram(\n builder: ProgramBuilder,\n sourceOutputs: SplatPostDecodeOutputs,\n) {\n const outputs = { ...sourceOutputs };\n if (outputs.when !== undefined) {\n const condition = builder.instructions[outputs.when];\n if (condition.opcode === Opcode.Constant) {\n if (builder.constants[condition.immediate] === 0) {\n return {\n instructions: [],\n constants: [],\n outputs: {},\n attributes: [],\n };\n }\n outputs.when = undefined;\n }\n }\n\n const markDependencies = (\n roots: readonly (number | undefined)[],\n marked: Uint8Array,\n ) => {\n const pending: number[] = [];\n for (const register of roots) {\n if (register === undefined || marked[register]) continue;\n marked[register] = 1;\n pending.push(register);\n }\n while (pending.length !== 0) {\n const register = pending.pop();\n if (register === undefined) break;\n for (const argument of builder.instructions[register].args) {\n if (marked[argument]) continue;\n marked[argument] = 1;\n pending.push(argument);\n }\n }\n };\n\n const live = new Uint8Array(builder.instructions.length);\n markDependencies(\n [\n outputs.when,\n outputs.position,\n outputs.scale,\n outputs.quaternion,\n outputs.opacity,\n outputs.alpha,\n outputs.color,\n ...(outputs.sh ?? []),\n ],\n live,\n );\n\n // Dynamic conditions form a topological prefix. The worker can evaluate\n // that prefix for the full block, compact the matching Splats, and avoid all\n // output-only work for the rest.\n const conditionLive = new Uint8Array(builder.instructions.length);\n if (outputs.when !== undefined) {\n markDependencies([outputs.when], conditionLive);\n }\n const instructionOrder: number[] = [];\n if (outputs.when !== undefined) {\n for (let index = 0; index < live.length; index += 1) {\n if (conditionLive[index]) instructionOrder.push(index);\n }\n }\n for (let index = 0; index < live.length; index += 1) {\n if (live[index] && !conditionLive[index]) instructionOrder.push(index);\n }\n\n const registerMap = new Int32Array(builder.instructions.length).fill(-1);\n for (let index = 0; index < instructionOrder.length; index += 1) {\n registerMap[instructionOrder[index]] = index;\n }\n\n const constants: number[] = [];\n const attributes: AttributeBinding[] = [];\n const attributeMap = new Map<number, number>();\n const instructions = instructionOrder.map((sourceIndex) => {\n const instruction = builder.instructions[sourceIndex];\n let immediate = instruction.immediate;\n if (instruction.opcode === Opcode.Constant) {\n immediate = constants.length;\n constants.push(\n ...builder.constants.slice(\n instruction.immediate,\n instruction.immediate + TYPE_WIDTHS[instruction.type],\n ),\n );\n } else if (instruction.opcode === Opcode.InputAttribute) {\n let mapped = attributeMap.get(instruction.immediate);\n if (mapped === undefined) {\n mapped = attributes.length;\n attributeMap.set(instruction.immediate, mapped);\n attributes.push(builder.attributes[instruction.immediate]);\n }\n immediate = mapped;\n }\n return {\n ...instruction,\n args: instruction.args.map((argument) => registerMap[argument]),\n immediate,\n };\n });\n const remap = (register: number | undefined) =>\n register === undefined ? undefined : registerMap[register];\n\n return {\n instructions,\n constants,\n outputs: {\n when: remap(outputs.when),\n position: remap(outputs.position),\n scale: remap(outputs.scale),\n quaternion: remap(outputs.quaternion),\n opacity: remap(outputs.opacity),\n alpha: remap(outputs.alpha),\n color: remap(outputs.color),\n sh: outputs.sh?.map((register) => registerMap[register]),\n },\n attributes,\n };\n}\n\nclass SplatPostDecodeProgramImpl implements SplatPostDecodeProgram {\n readonly [SPLAT_POST_DECODE_PROGRAM] = true as const;\n\n constructor(\n private readonly builder: ProgramBuilder,\n private readonly outputs: SplatPostDecodeOutputs,\n ) {}\n\n static serialize(program: SplatPostDecodeProgram): SerializedSplatPostDecode {\n if (!(program instanceof SplatPostDecodeProgramImpl)) {\n throw new Error(\"Invalid postDecode program\");\n }\n const { builder } = program;\n const {\n instructions,\n constants,\n outputs,\n attributes: attributeBindings,\n } = pruneProgram(builder, program.outputs);\n type AttributeRegion = {\n buffer: ArrayBufferLike;\n start: number;\n end: number;\n outputOffset: number;\n };\n const rangesByBuffer = new Map<\n ArrayBufferLike,\n { start: number; end: number }[]\n >();\n for (const attribute of attributeBindings) {\n if (attribute.count === 0) continue;\n const packedBytes =\n ATTRIBUTE_FORMAT_BYTES[attribute.format] * attribute.components;\n const start = attribute.data.byteOffset + attribute.byteOffset;\n const end =\n start + (attribute.count - 1) * attribute.byteStride + packedBytes;\n const ranges = rangesByBuffer.get(attribute.data.buffer) ?? [];\n ranges.push({ start, end });\n rangesByBuffer.set(attribute.data.buffer, ranges);\n }\n\n const regions: AttributeRegion[] = [];\n for (const [buffer, ranges] of rangesByBuffer) {\n ranges.sort((left, right) => left.start - right.start);\n let current: AttributeRegion | undefined;\n for (const range of ranges) {\n if (current && range.start <= current.end) {\n current.end = Math.max(current.end, range.end);\n } else {\n current = { buffer, ...range, outputOffset: 0 };\n regions.push(current);\n }\n }\n }\n\n let attributeByteLength = 0;\n for (const region of regions) {\n region.outputOffset = attributeByteLength;\n attributeByteLength += region.end - region.start;\n }\n const attributeData = new Uint8Array(attributeByteLength);\n for (const region of regions) {\n attributeData.set(\n new Uint8Array(region.buffer, region.start, region.end - region.start),\n region.outputOffset,\n );\n }\n const attributes = attributeBindings.map((attribute) => {\n let byteOffset = 0;\n if (attribute.count !== 0) {\n const sourceOffset = attribute.data.byteOffset + attribute.byteOffset;\n const region = regions.find(\n (candidate) =>\n candidate.buffer === attribute.data.buffer &&\n sourceOffset >= candidate.start &&\n sourceOffset < candidate.end,\n );\n if (!region) {\n throw new Error(\"postDecode attribute view was not serialized\");\n }\n byteOffset = region.outputOffset + sourceOffset - region.start;\n }\n return {\n format: attribute.format,\n components: attribute.components,\n byteOffset,\n byteStride: attribute.byteStride,\n count: attribute.count,\n };\n });\n\n return {\n instructions,\n constants: new Float32Array(constants),\n outputs,\n attributeData,\n attributes,\n };\n }\n}\n\n/** @internal */\nexport function serializeSplatPostDecode(\n program: SplatPostDecodeProgram,\n): SerializedSplatPostDecode {\n return SplatPostDecodeProgramImpl.serialize(program);\n}\n\nfunction buildOutputs(builder: ProgramBuilder, patch: SplatPostDecodePatch) {\n if (patch.opacity !== undefined && patch.alpha !== undefined) {\n throw new Error(\"postDecode opacity cannot be combined with alpha\");\n }\n\n const output = <T extends SplatPostDecodeValueType>(\n value: ValueLike<T> | undefined,\n type: T,\n ) => (value === undefined ? undefined : builder.coerce(value, type).register);\n const outputs: SplatPostDecodeOutputs = {\n when: output(patch.when, \"bool\"),\n position: output(patch.position, \"vec3\"),\n scale: output(patch.scale, \"vec3\"),\n quaternion: output(patch.quaternion, \"quaternion\"),\n opacity: output(patch.opacity, \"float\"),\n alpha: output(patch.alpha, \"float\"),\n color: output(patch.color, \"vec3\"),\n };\n\n if (patch.sh !== undefined) {\n if (\n !(patch.sh instanceof SplatPostDecodeShPatch) ||\n patch.sh.owner !== builder\n ) {\n throw new Error(\n \"postDecode SH output must be created from splat.sh.map()\",\n );\n }\n outputs.sh = patch.sh.coefficients.map((value) => value.register);\n }\n return outputs;\n}\n\nfunction defineSplatPostDecode(\n build: (context: SplatPostDecodeContext) => SplatPostDecodePatch,\n): SplatPostDecodeProgram {\n const builder = new ProgramBuilder();\n const patch = build({\n splat: builder.splat,\n op: builder.op,\n attribute: (options) => builder.attribute(options),\n });\n if (!patch || typeof patch !== \"object\") {\n throw new Error(\"postDecode builder must return a splat patch object\");\n }\n const outputs = buildOutputs(builder, patch);\n return new SplatPostDecodeProgramImpl(builder, outputs);\n}\n\nexport const postDecode = {\n define: defineSplatPostDecode,\n};\n","import { fromHalf, toHalf } from \"./float16\";\n\nconst MAX_SPLAT_OPACITY = 1000;\nconst F32_EPSILON = 1.192_092_895_507_812_5e-7;\nconst ENCODED_IDENTITY_QUATERNION = (512 << 10) | 1023;\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function decodeSplatOpacity(word: number) {\n const shapeAmount = fromHalf(word >>> 16);\n if (shapeAmount > 0) {\n const kernelShape = shapeAmount * 4 + 1;\n return Math.min(\n MAX_SPLAT_OPACITY,\n Math.exp((kernelShape * kernelShape - 1) / Math.E),\n );\n }\n return fromHalf(word & 0xffff);\n}\n\nexport function encodeSplatOpacity(opacity: number) {\n if (opacity > 0 && opacity <= 1) return toHalf(opacity);\n const value = clamp(opacity, 0, MAX_SPLAT_OPACITY);\n if (value > 1) {\n const shapeAmount = 0.25 * (Math.sqrt(Math.log(value) * Math.E + 1) - 1);\n return (toHalf(1) | (toHalf(shapeAmount) << 16)) >>> 0;\n }\n return toHalf(value);\n}\n\ntype QuaternionOutput = Float32Array | number[];\n\nexport function decodeQuatOctXy1010R12ToArray(\n word: number,\n output: QuaternionOutput,\n base = 0,\n stride = 1,\n) {\n const u = word & 0x3ff;\n const v = (word >>> 10) & 0x3ff;\n const angle = word >>> 20;\n let x = (u / 1023) * 2 - 1;\n let y = (v / 1023) * 2 - 1;\n const z = 1 - Math.abs(x) - Math.abs(y);\n const fold = Math.max(-z, 0);\n x += x >= 0 ? -fold : fold;\n y += y >= 0 ? -fold : fold;\n const inverseLength = 1 / Math.sqrt(x * x + y * y + z * z);\n const halfTheta = (angle / 4095) * 0.5 * Math.PI;\n const sine = Math.sin(halfTheta);\n output[base] = x * inverseLength * sine;\n output[base + stride] = y * inverseLength * sine;\n output[base + stride * 2] = z * inverseLength * sine;\n output[base + stride * 3] = Math.cos(halfTheta);\n}\n\nfunction encodeQuaternion(\n qx: number,\n qy: number,\n qz: number,\n qw: number,\n minimumLengthSquared: number,\n) {\n const lengthSquared = qx * qx + qy * qy + qz * qz + qw * qw;\n if (\n !Number.isFinite(lengthSquared) ||\n lengthSquared <= minimumLengthSquared\n ) {\n return undefined;\n }\n if (qx === 0 && qy === 0 && qz === 0) {\n return ENCODED_IDENTITY_QUATERNION;\n }\n\n const inverseLength = 1 / Math.sqrt(lengthSquared);\n let x = qx * inverseLength;\n let y = qy * inverseLength;\n let z = qz * inverseLength;\n let w = qw * inverseLength;\n if (w < 0) {\n x = -x;\n y = -y;\n z = -z;\n w = -w;\n }\n\n const theta = 2 * Math.acos(clamp(w, 0, 1));\n const sine = Math.sin(theta * 0.5);\n const axisX = Math.abs(sine) < 1e-6 ? 1 : x / sine;\n const axisY = Math.abs(sine) < 1e-6 ? 0 : y / sine;\n const axisZ = Math.abs(sine) < 1e-6 ? 0 : z / sine;\n const sum = Math.abs(axisX) + Math.abs(axisY) + Math.abs(axisZ);\n let octX = axisX / sum;\n let octY = axisY / sum;\n if (axisZ < 0) {\n const previousX = octX;\n octX = (1 - Math.abs(octY)) * (octX >= 0 ? 1 : -1);\n octY = (1 - Math.abs(previousX)) * (octY >= 0 ? 1 : -1);\n }\n\n const u = Math.round(clamp((octX * 0.5 + 0.5) * 1023, 0, 1023));\n const v = Math.round(clamp((octY * 0.5 + 0.5) * 1023, 0, 1023));\n const angle = Math.round(clamp((theta / Math.PI) * 4095, 0, 4095));\n return ((angle << 20) | (v << 10) | u) >>> 0;\n}\n\nexport function encodeQuatOctXy1010R12(\n qx: number,\n qy: number,\n qz: number,\n qw: number,\n): number {\n return (encodeQuaternion(qx, qy, qz, qw, 0) ?? 0) | 0;\n}\n\nexport function tryEncodeQuatOctXy1010R12(\n qx: number,\n qy: number,\n qz: number,\n qw: number,\n) {\n return encodeQuaternion(qx, qy, qz, qw, F32_EPSILON);\n}\n","import { fromHalf, toHalf } from \"./float16\";\nimport {\n ATTRIBUTE_FORMAT_BYTES,\n InputField,\n Opcode,\n SH_COEFFICIENT_COUNT,\n type SerializedSplatPostDecode,\n type SerializedSplatPostDecodeAttribute,\n TYPE_WIDTHS,\n} from \"./postDecode\";\nimport {\n decodeQuatOctXy1010R12ToArray,\n decodeSplatOpacity,\n encodeSplatOpacity,\n tryEncodeQuatOctXy1010R12,\n} from \"./splatCodec\";\n\nexport type PostDecodeSplatData = {\n numSplats: number;\n splat0: Uint32Array;\n splat1: Uint32Array;\n sortCenters: Float32Array;\n sh1?: Uint32Array;\n sh2?: Uint32Array;\n sh3a?: Uint32Array;\n sh3b?: Uint32Array;\n};\n\nconst MAX_BLOCK_SIZE = 512;\n// Keep each worker's temporary register file bounded for very large programs.\nconst MAX_REGISTER_BYTES = 4 * 1024 * 1024;\n\nfunction getBlockSize(registerValueCount: number, processCount: number) {\n const bytesPerSplat = registerValueCount * Float32Array.BYTES_PER_ELEMENT;\n return Math.min(\n processCount,\n MAX_BLOCK_SIZE,\n Math.max(1, Math.floor(MAX_REGISTER_BYTES / bytesPerSplat)),\n );\n}\n\ntype FreeRegisterRange = {\n offset: number;\n width: number;\n};\n\n/** @internal */\nexport function allocateSplatPostDecodeRegisters(\n program: SerializedSplatPostDecode,\n) {\n const { instructions, outputs } = program;\n const instructionCount = instructions.length;\n const lastUses = new Uint32Array(instructionCount);\n for (let index = 0; index < instructionCount; index += 1) {\n lastUses[index] = index;\n for (const argument of instructions[index].args) {\n lastUses[argument] = index;\n }\n }\n\n const programEnd = instructionCount;\n // `when` is consumed at the condition boundary before its range may be\n // reused by the output suffix; only values written back must reach the end.\n for (const output of [\n outputs.position,\n outputs.scale,\n outputs.quaternion,\n outputs.opacity,\n outputs.alpha,\n outputs.color,\n ...(outputs.sh ?? []),\n ]) {\n if (output !== undefined) lastUses[output] = programEnd;\n }\n\n const registerOffsets = new Uint32Array(instructionCount);\n const constantRegisters = new Uint8Array(instructionCount);\n let registerValueCount = 0;\n // Constants are initialized before instruction evaluation and only once for\n // all blocks, so their physical ranges span the entire program.\n for (let index = 0; index < instructionCount; index += 1) {\n if (instructions[index].opcode === Opcode.Constant) {\n constantRegisters[index] = 1;\n lastUses[index] = programEnd;\n registerOffsets[index] = registerValueCount;\n registerValueCount += TYPE_WIDTHS[instructions[index].type];\n }\n }\n\n const releases: FreeRegisterRange[][] = Array.from(\n { length: instructionCount },\n () => [],\n );\n const freeRanges: FreeRegisterRange[] = [];\n\n const release = (released: FreeRegisterRange) => {\n let insertIndex = 0;\n while (\n insertIndex < freeRanges.length &&\n freeRanges[insertIndex].offset < released.offset\n ) {\n insertIndex += 1;\n }\n\n let offset = released.offset;\n let width = released.width;\n const previous = freeRanges[insertIndex - 1];\n if (previous && previous.offset + previous.width === offset) {\n offset = previous.offset;\n width += previous.width;\n freeRanges.splice(insertIndex - 1, 1);\n insertIndex -= 1;\n }\n const next = freeRanges[insertIndex];\n if (next && offset + width === next.offset) {\n width += next.width;\n freeRanges.splice(insertIndex, 1);\n }\n freeRanges.splice(insertIndex, 0, { offset, width });\n };\n\n const allocate = (width: number) => {\n let bestIndex = -1;\n for (let index = 0; index < freeRanges.length; index += 1) {\n const range = freeRanges[index];\n if (\n range.width >= width &&\n (bestIndex === -1 || range.width < freeRanges[bestIndex].width)\n ) {\n bestIndex = index;\n }\n }\n if (bestIndex === -1) {\n const offset = registerValueCount;\n registerValueCount += width;\n return offset;\n }\n\n const range = freeRanges[bestIndex];\n const offset = range.offset;\n if (range.width === width) {\n freeRanges.splice(bestIndex, 1);\n } else {\n range.offset += width;\n range.width -= width;\n }\n return offset;\n };\n\n for (let index = 0; index < instructionCount; index += 1) {\n for (const range of releases[index]) release(range);\n if (constantRegisters[index]) continue;\n const width = TYPE_WIDTHS[instructions[index].type];\n const offset = allocate(width);\n registerOffsets[index] = offset;\n const releaseIndex = lastUses[index] + 1;\n if (releaseIndex < instructionCount) {\n releases[releaseIndex].push({ offset, width });\n }\n }\n\n const conditionCarryOffsets: number[] = [];\n const conditionEnd = outputs.when === undefined ? 0 : outputs.when + 1;\n for (let index = 0; index < conditionEnd; index += 1) {\n if (constantRegisters[index] || lastUses[index] < conditionEnd) continue;\n const offset = registerOffsets[index];\n const width = TYPE_WIDTHS[instructions[index].type];\n for (let lane = 0; lane < width; lane += 1) {\n conditionCarryOffsets.push(offset + lane);\n }\n }\n\n return {\n registerOffsets,\n registerValueCount,\n conditionCarryOffsets: new Uint32Array(conditionCarryOffsets),\n };\n}\n\nfunction rustMin(left: number, right: number) {\n if (Number.isNaN(left)) return right;\n if (Number.isNaN(right)) return left;\n return Math.min(left, right);\n}\n\nfunction rustMax(left: number, right: number) {\n if (Number.isNaN(left)) return right;\n if (Number.isNaN(right)) return left;\n return Math.max(left, right);\n}\n\nfunction roundAwayFromZero(value: number) {\n return value < 0 ? -Math.round(-value) : Math.round(value);\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nconst ATTRIBUTE_READERS = {\n f32: (data, offset) => data.getFloat32(offset, true),\n f16: (data, offset) => fromHalf(data.getUint16(offset, true)),\n u8: (data, offset) => data.getUint8(offset),\n unorm8: (data, offset) => data.getUint8(offset) / 0xff,\n i8: (data, offset) => data.getInt8(offset),\n snorm8: (data, offset) => Math.max(-1, data.getInt8(offset) / 0x7f),\n u16: (data, offset) => data.getUint16(offset, true),\n unorm16: (data, offset) => data.getUint16(offset, true) / 0xffff,\n i16: (data, offset) => data.getInt16(offset, true),\n snorm16: (data, offset) => Math.max(-1, data.getInt16(offset, true) / 0x7fff),\n u32: (data, offset) => data.getUint32(offset, true),\n i32: (data, offset) => data.getInt32(offset, true),\n} satisfies Record<\n SerializedSplatPostDecodeAttribute[\"format\"],\n (data: DataView, offset: number) => number\n>;\n\nfunction readAttributeBlock(\n data: DataView,\n attribute: SerializedSplatPostDecodeAttribute,\n blockStart: number,\n blockCount: number,\n blockSize: number,\n registers: Float32Array,\n outputBase: number,\n sourceIndices?: Uint16Array,\n) {\n const componentBytes = ATTRIBUTE_FORMAT_BYTES[attribute.format];\n const read = ATTRIBUTE_READERS[attribute.format];\n for (let component = 0; component < attribute.components; component += 1) {\n const componentOutput = outputBase + component * blockSize;\n if (sourceIndices) {\n for (let index = 0; index < blockCount; index += 1) {\n const inputOffset =\n attribute.byteOffset +\n (blockStart + sourceIndices[index]) * attribute.byteStride +\n component * componentBytes;\n registers[componentOutput + index] = read(data, inputOffset);\n }\n } else {\n let inputOffset =\n attribute.byteOffset +\n blockStart * attribute.byteStride +\n component * componentBytes;\n for (let index = 0; index < blockCount; index += 1) {\n registers[componentOutput + index] = read(data, inputOffset);\n inputOffset += attribute.byteStride;\n }\n }\n }\n}\n\nfunction encodeQuaternion(\n registers: Float32Array,\n base: number,\n stride: number,\n) {\n return tryEncodeQuatOctXy1010R12(\n registers[base],\n registers[base + stride],\n registers[base + stride * 2],\n registers[base + stride * 3],\n );\n}\n\nfunction decodeSh(\n word: number,\n output: Float32Array,\n base: number,\n stride: number,\n) {\n const exponentAndSigns = word >>> 24;\n const multiplier = 2 ** ((exponentAndSigns >>> 3) - 15) / 255;\n for (let component = 0; component < 3; component += 1) {\n const magnitude = ((word >>> (component * 8)) & 0xff) * multiplier;\n output[base + component * stride] =\n exponentAndSigns & (1 << component) ? -magnitude : magnitude;\n }\n}\n\nfunction encodeSh(registers: Float32Array, base: number, stride: number) {\n const red = registers[base];\n const green = registers[base + stride];\n const blue = registers[base + stride * 2];\n const maxAbsolute = rustMax(\n Math.abs(red),\n rustMax(Math.abs(green), Math.abs(blue)),\n );\n const exponent = roundAwayFromZero(\n clamp(Math.floor(Math.log2(maxAbsolute)) + 15, 0, 31),\n );\n const divisor = 2 ** (exponent - 15) / 255;\n const encodeComponent = (value: number) =>\n roundAwayFromZero(clamp(Math.abs(value) / divisor, 0, 255));\n const signs = (red < 0 ? 1 : 0) | (green < 0 ? 2 : 0) | (blue < 0 ? 4 : 0);\n return (\n (encodeComponent(red) |\n (encodeComponent(green) << 8) |\n (encodeComponent(blue) << 16) |\n (((exponent << 3) | signs) << 24)) >>>\n 0\n );\n}\n\nfunction shWord(\n data: PostDecodeSplatData,\n coefficient: number,\n): [Uint32Array, number] | undefined {\n if (coefficient <= 2 && data.sh1) return [data.sh1, coefficient];\n if (coefficient === 3 && data.sh1 && data.sh2) return [data.sh1, 3];\n if (coefficient <= 7 && data.sh2) return [data.sh2, coefficient - 4];\n if (coefficient <= 11 && data.sh3a) return [data.sh3a, coefficient - 8];\n if (coefficient <= 14 && data.sh3b) return [data.sh3b, coefficient - 12];\n return undefined;\n}\n\nfunction evaluateInputFieldBlock(\n field: number,\n blockStart: number,\n blockCount: number,\n blockSize: number,\n data: PostDecodeSplatData,\n splat0Float: Float32Array,\n registers: Float32Array,\n outputBase: number,\n sourceIndices?: Uint16Array,\n) {\n switch (field) {\n case InputField.Position:\n for (let index = 0; index < blockCount; index += 1) {\n const sourceIndex = sourceIndices?.[index] ?? index;\n const wordBase = (blockStart + sourceIndex) * 4;\n registers[outputBase + index] = splat0Float[wordBase];\n registers[outputBase + blockSize + index] = splat0Float[wordBase + 1];\n registers[outputBase + blockSize * 2 + index] =\n splat0Float[wordBase + 2];\n }\n break;\n case InputField.Scale:\n for (let index = 0; index < blockCount; index += 1) {\n const sourceIndex = sourceIndices?.[index] ?? index;\n const wordBase = (blockStart + sourceIndex) * 4;\n const word1 = data.splat1[wordBase + 1];\n const word2 = data.splat1[wordBase + 2];\n registers[outputBase + index] = Math.exp(fromHalf(word1 >>> 16));\n registers[outputBase + blockSize + index] = Math.exp(\n fromHalf(word2 & 0xffff),\n );\n registers[outputBase + blockSize * 2 + index] = Math.exp(\n fromHalf(word2 >>> 16),\n );\n }\n break;\n case InputField.Quaternion:\n for (let index = 0; index < blockCount; index += 1) {\n const sourceIndex = sourceIndices?.[index] ?? index;\n const wordBase = (blockStart + sourceIndex) * 4;\n decodeQuatOctXy1010R12ToArray(\n data.splat1[wordBase + 3],\n registers,\n outputBase + index,\n blockSize,\n );\n }\n break;\n case InputField.Opacity:\n for (let index = 0; index < blockCount; index += 1) {\n const sourceIndex = sourceIndices?.[index] ?? index;\n registers[outputBase + index] = decodeSplatOpacity(\n data.splat0[(blockStart + sourceIndex) * 4 + 3],\n );\n }\n break;\n case InputField.Alpha:\n for (let index = 0; index < blockCount; index += 1) {\n const sourceIndex = sourceIndices?.[index] ?? index;\n registers[outputBase + index] = fromHalf(\n data.splat0[(blockStart + sourceIndex) * 4 + 3] & 0xffff,\n );\n }\n break;\n case InputField.Color:\n for (let index = 0; index < blockCount; index += 1) {\n const sourceIndex = sourceIndices?.[index] ?? index;\n const wordBase = (blockStart + sourceIndex) * 4;\n const word0 = data.splat1[wordBase];\n const word1 = data.splat1[wordBase + 1];\n registers[outputBase + index] = fromHalf(word0 & 0xffff);\n registers[outputBase + blockSize + index] = fromHalf(word0 >>> 16);\n registers[outputBase + blockSize * 2 + index] = fromHalf(\n word1 & 0xffff,\n );\n }\n break;\n default: {\n const coefficient = field - InputField.Sh0;\n const location = shWord(data, coefficient);\n if (location) {\n for (let index = 0; index < blockCount; index += 1) {\n const sourceIndex = sourceIndices?.[index] ?? index;\n decodeSh(\n location[0][(blockStart + sourceIndex) * 4 + location[1]],\n registers,\n outputBase + index,\n blockSize,\n );\n }\n } else {\n registers.fill(0, outputBase, outputBase + blockCount);\n registers.fill(\n 0,\n outputBase + blockSize,\n outputBase + blockSize + blockCount,\n );\n registers.fill(\n 0,\n outputBase + blockSize * 2,\n outputBase + blockSize * 2 + blockCount,\n );\n }\n }\n }\n}\n\nfunction filterConditionBlock(\n registers: Float32Array,\n conditionBase: number,\n carryOffsets: Uint32Array,\n sourceIndices: Uint16Array,\n blockCount: number,\n blockSize: number,\n) {\n let activeCount = 0;\n for (let index = 0; index < blockCount; index += 1) {\n if (registers[conditionBase + index] !== 0) {\n sourceIndices[activeCount++] = index;\n }\n }\n if (activeCount === 0 || activeCount === blockCount) return activeCount;\n\n for (const offset of carryOffsets) {\n const base = offset * blockSize;\n // Matches are collected in ascending order, so this forward in-place copy\n // never overwrites a source lane that has not been read yet.\n for (let index = 0; index < activeCount; index += 1) {\n registers[base + index] = registers[base + sourceIndices[index]];\n }\n }\n return activeCount;\n}\n\nfunction evaluateProgram(\n data: PostDecodeSplatData,\n program: SerializedSplatPostDecode,\n attributeData: DataView,\n splat0Float: Float32Array,\n registers: Float32Array,\n registerOffsets: Uint32Array,\n conditionCarryOffsets: Uint32Array,\n processCount: number,\n blockSize: number,\n) {\n const { attributes, constants, instructions, outputs } = program;\n const whenRegister = outputs.when;\n const activeIndices =\n whenRegister === undefined ? undefined : new Uint16Array(blockSize);\n // SoA layout: each vector lane owns blockSize contiguous register values.\n for (\n let instructionIndex = 0;\n instructionIndex < instructions.length;\n instructionIndex += 1\n ) {\n const instruction = instructions[instructionIndex];\n if (instruction.opcode !== Opcode.Constant) continue;\n const outputBase = registerOffsets[instructionIndex] * blockSize;\n const width = TYPE_WIDTHS[instruction.type];\n for (let lane = 0; lane < width; lane += 1) {\n registers.fill(\n constants[instruction.immediate + lane],\n outputBase + lane * blockSize,\n outputBase + (lane + 1) * blockSize,\n );\n }\n }\n\n for (let blockStart = 0; blockStart < processCount; blockStart += blockSize) {\n let blockCount = Math.min(blockSize, processCount - blockStart);\n let sourceIndices: Uint16Array | undefined;\n for (\n let instructionIndex = 0;\n instructionIndex < instructions.length;\n instructionIndex += 1\n ) {\n const instruction = instructions[instructionIndex];\n const { args, immediate, opcode, type } = instruction;\n if (opcode === Opcode.Constant) continue;\n const outputBase = registerOffsets[instructionIndex] * blockSize;\n const width = TYPE_WIDTHS[type];\n const arg0 = registerOffsets[args[0] ?? 0] * blockSize;\n const arg1 = registerOffsets[args[1] ?? 0] * blockSize;\n const arg2 = registerOffsets[args[2] ?? 0] * blockSize;\n const arg0Width =\n args[0] === undefined ? 0 : TYPE_WIDTHS[instructions[args[0]].type];\n const arg1Width =\n args[1] === undefined ? 0 : TYPE_WIDTHS[instructions[args[1]].type];\n const arg2Width =\n args[2] === undefined ? 0 : TYPE_WIDTHS[instructions[args[2]].type];\n\n switch (opcode) {\n case Opcode.InputField:\n evaluateInputFieldBlock(\n immediate,\n blockStart,\n blockCount,\n blockSize,\n data,\n splat0Float,\n registers,\n outputBase,\n sourceIndices,\n );\n break;\n case Opcode.InputAttribute:\n readAttributeBlock(\n attributeData,\n attributes[immediate],\n blockStart,\n blockCount,\n blockSize,\n registers,\n outputBase,\n sourceIndices,\n );\n break;\n case Opcode.Negate:\n case Opcode.Abs:\n case Opcode.Log:\n case Opcode.Exp:\n case Opcode.Floor:\n case Opcode.Ceil:\n case Opcode.Round:\n case Opcode.Sin:\n case Opcode.Cos:\n case Opcode.Acos:\n for (let lane = 0; lane < width; lane += 1) {\n const output = outputBase + lane * blockSize;\n const input = arg0 + lane * blockSize;\n for (let index = 0; index < blockCount; index += 1) {\n const value = registers[input + index];\n let result: number;\n switch (opcode) {\n case Opcode.Negate:\n result = -value;\n break;\n case Opcode.Abs:\n result = Math.abs(value);\n break;\n case Opcode.Log:\n result = Math.log(value);\n break;\n case Opcode.Exp:\n result = Math.exp(value);\n break;\n case Opcode.Floor:\n result = Math.floor(value);\n break;\n case Opcode.Ceil:\n result = Math.ceil(value);\n break;\n case Opcode.Round:\n result = roundAwayFromZero(value);\n break;\n case Opcode.Sin:\n result = Math.sin(value);\n break;\n case Opcode.Cos:\n result = Math.cos(value);\n break;\n default:\n result = Math.acos(value);\n }\n registers[output + index] = result;\n }\n }\n break;\n case Opcode.Sqrt:\n for (let lane = 0; lane < width; lane += 1) {\n const output = outputBase + lane * blockSize;\n const input = arg0 + lane * blockSize;\n for (let index = 0; index < blockCount; index += 1) {\n registers[output + index] = Math.sqrt(registers[input + index]);\n }\n }\n break;\n case Opcode.Normalize: {\n for (let index = 0; index < blockCount; index += 1) {\n let lengthSquared = 0;\n for (let lane = 0; lane < width; lane += 1) {\n const value = registers[arg0 + lane * blockSize + index];\n lengthSquared += value * value;\n }\n const length = Math.sqrt(lengthSquared);\n for (let lane = 0; lane < width; lane += 1) {\n const input = registers[arg0 + lane * blockSize + index];\n registers[outputBase + lane * blockSize + index] =\n length === 0 || !Number.isFinite(length)\n ? input\n : input / length;\n }\n }\n break;\n }\n case Opcode.Length: {\n const inputWidth = arg0Width;\n for (let index = 0; index < blockCount; index += 1) {\n let lengthSquared = 0;\n for (let lane = 0; lane < inputWidth; lane += 1) {\n const value = registers[arg0 + lane * blockSize + index];\n lengthSquared += value * value;\n }\n registers[outputBase + index] = Math.sqrt(lengthSquared);\n }\n break;\n }\n case Opcode.IsFinite: {\n const inputWidth = arg0Width;\n for (let index = 0; index < blockCount; index += 1) {\n let finite = true;\n for (let lane = 0; lane < inputWidth; lane += 1) {\n finite &&= Number.isFinite(\n registers[arg0 + lane * blockSize + index],\n );\n }\n registers[outputBase + index] = finite ? 1 : 0;\n }\n break;\n }\n case Opcode.Not:\n for (let index = 0; index < blockCount; index += 1) {\n registers[outputBase + index] =\n registers[arg0 + index] === 0 ? 1 : 0;\n }\n break;\n case Opcode.Add:\n case Opcode.Subtract:\n case Opcode.Multiply:\n case Opcode.Divide:\n case Opcode.Pow:\n for (let lane = 0; lane < width; lane += 1) {\n const output = outputBase + lane * blockSize;\n const left = arg0 + lane * blockSize;\n const right = arg1 + (arg1Width === 1 ? 0 : lane * blockSize);\n for (let index = 0; index < blockCount; index += 1) {\n const leftValue = registers[left + index];\n const rightValue = registers[right + index];\n let result: number;\n switch (opcode) {\n case Opcode.Add:\n result = leftValue + rightValue;\n break;\n case Opcode.Subtract:\n result = leftValue - rightValue;\n break;\n case Opcode.Multiply:\n result = leftValue * rightValue;\n break;\n case Opcode.Divide:\n result = leftValue / rightValue;\n break;\n default:\n result = leftValue ** rightValue;\n }\n registers[output + index] = result;\n }\n }\n break;\n case Opcode.Min:\n case Opcode.Max:\n for (let lane = 0; lane < width; lane += 1) {\n const output = outputBase + lane * blockSize;\n const left = arg0 + lane * blockSize;\n const right = arg1 + (arg1Width === 1 ? 0 : lane * blockSize);\n for (let index = 0; index < blockCount; index += 1) {\n registers[output + index] =\n opcode === Opcode.Min\n ? rustMin(registers[left + index], registers[right + index])\n : rustMax(registers[left + index], registers[right + index]);\n }\n }\n break;\n case Opcode.Dot: {\n const inputWidth = arg0Width;\n for (let index = 0; index < blockCount; index += 1) {\n let dot = 0;\n for (let lane = 0; lane < inputWidth; lane += 1) {\n dot +=\n registers[arg0 + lane * blockSize + index] *\n registers[arg1 + lane * blockSize + index];\n }\n registers[outputBase + index] = dot;\n }\n break;\n }\n case Opcode.Cross:\n for (let index = 0; index < blockCount; index += 1) {\n registers[outputBase + index] =\n registers[arg0 + blockSize + index] *\n registers[arg1 + blockSize * 2 + index] -\n registers[arg0 + blockSize * 2 + index] *\n registers[arg1 + blockSize + index];\n registers[outputBase + blockSize + index] =\n registers[arg0 + blockSize * 2 + index] *\n registers[arg1 + index] -\n registers[arg0 + index] * registers[arg1 + blockSize * 2 + index];\n registers[outputBase + blockSize * 2 + index] =\n registers[arg0 + index] * registers[arg1 + blockSize + index] -\n registers[arg0 + blockSize + index] * registers[arg1 + index];\n }\n break;\n case Opcode.Equal:\n case Opcode.NotEqual: {\n const inputWidth = arg0Width;\n for (let index = 0; index < blockCount; index += 1) {\n let equal = true;\n for (let lane = 0; lane < inputWidth; lane += 1) {\n equal &&=\n registers[arg0 + lane * blockSize + index] ===\n registers[arg1 + lane * blockSize + index];\n }\n registers[outputBase + index] = (\n opcode === Opcode.Equal\n ? equal\n : !equal\n )\n ? 1\n : 0;\n }\n break;\n }\n case Opcode.Less:\n case Opcode.LessEqual:\n case Opcode.Greater:\n case Opcode.GreaterEqual:\n for (let index = 0; index < blockCount; index += 1) {\n const left = registers[arg0 + index];\n const right = registers[arg1 + index];\n registers[outputBase + index] = (\n opcode === Opcode.Less\n ? left < right\n : opcode === Opcode.LessEqual\n ? left <= right\n : opcode === Opcode.Greater\n ? left > right\n : left >= right\n )\n ? 1\n : 0;\n }\n break;\n case Opcode.And:\n case Opcode.Or:\n for (let index = 0; index < blockCount; index += 1) {\n registers[outputBase + index] = (\n opcode === Opcode.And\n ? registers[arg0 + index] !== 0 && registers[arg1 + index] !== 0\n : registers[arg0 + index] !== 0 || registers[arg1 + index] !== 0\n )\n ? 1\n : 0;\n }\n break;\n case Opcode.QuaternionMultiply:\n for (let index = 0; index < blockCount; index += 1) {\n const leftX = registers[arg0 + index];\n const leftY = registers[arg0 + blockSize + index];\n const leftZ = registers[arg0 + blockSize * 2 + index];\n const leftW = registers[arg0 + blockSize * 3 + index];\n const rightX = registers[arg1 + index];\n const rightY = registers[arg1 + blockSize + index];\n const rightZ = registers[arg1 + blockSize * 2 + index];\n const rightW = registers[arg1 + blockSize * 3 + index];\n registers[outputBase + index] =\n leftW * rightX + leftX * rightW + leftY * rightZ - leftZ * rightY;\n registers[outputBase + blockSize + index] =\n leftW * rightY - leftX * rightZ + leftY * rightW + leftZ * rightX;\n registers[outputBase + blockSize * 2 + index] =\n leftW * rightZ + leftX * rightY - leftY * rightX + leftZ * rightW;\n registers[outputBase + blockSize * 3 + index] =\n leftW * rightW - leftX * rightX - leftY * rightY - leftZ * rightZ;\n }\n break;\n case Opcode.RotateVector:\n for (let index = 0; index < blockCount; index += 1) {\n const quaternionX = registers[arg0 + index];\n const quaternionY = registers[arg0 + blockSize + index];\n const quaternionZ = registers[arg0 + blockSize * 2 + index];\n const quaternionW = registers[arg0 + blockSize * 3 + index];\n const vectorX = registers[arg1 + index];\n const vectorY = registers[arg1 + blockSize + index];\n const vectorZ = registers[arg1 + blockSize * 2 + index];\n const crossX = 2 * (quaternionY * vectorZ - quaternionZ * vectorY);\n const crossY = 2 * (quaternionZ * vectorX - quaternionX * vectorZ);\n const crossZ = 2 * (quaternionX * vectorY - quaternionY * vectorX);\n registers[outputBase + index] =\n vectorX +\n quaternionW * crossX +\n quaternionY * crossZ -\n quaternionZ * crossY;\n registers[outputBase + blockSize + index] =\n vectorY +\n quaternionW * crossY +\n quaternionZ * crossX -\n quaternionX * crossZ;\n registers[outputBase + blockSize * 2 + index] =\n vectorZ +\n quaternionW * crossZ +\n quaternionX * crossY -\n quaternionY * crossX;\n }\n break;\n case Opcode.Select: {\n for (let lane = 0; lane < width; lane += 1) {\n const output = outputBase + lane * blockSize;\n const whenTrue = arg1 + lane * blockSize;\n const whenFalse = arg2 + lane * blockSize;\n for (let index = 0; index < blockCount; index += 1) {\n registers[output + index] =\n registers[arg0 + index] !== 0\n ? registers[whenTrue + index]\n : registers[whenFalse + index];\n }\n }\n break;\n }\n case Opcode.Clamp: {\n const secondWidth = arg1Width;\n const thirdWidth = arg2Width;\n for (let lane = 0; lane < width; lane += 1) {\n const output = outputBase + lane * blockSize;\n const value = arg0 + lane * blockSize;\n const min = arg1 + (secondWidth === 1 ? 0 : lane * blockSize);\n const max = arg2 + (thirdWidth === 1 ? 0 : lane * blockSize);\n for (let index = 0; index < blockCount; index += 1) {\n registers[output + index] = rustMin(\n rustMax(registers[value + index], registers[min + index]),\n registers[max + index],\n );\n }\n }\n break;\n }\n case Opcode.Mix: {\n const secondWidth = arg1Width;\n const thirdWidth = arg2Width;\n for (let lane = 0; lane < width; lane += 1) {\n const output = outputBase + lane * blockSize;\n const left = arg0 + lane * blockSize;\n const right = arg1 + (secondWidth === 1 ? 0 : lane * blockSize);\n const amount = arg2 + (thirdWidth === 1 ? 0 : lane * blockSize);\n for (let index = 0; index < blockCount; index += 1) {\n const leftValue = registers[left + index];\n registers[output + index] =\n leftValue +\n (registers[right + index] - leftValue) *\n registers[amount + index];\n }\n }\n break;\n }\n case Opcode.Vec2:\n case Opcode.Vec3:\n case Opcode.Vec4:\n for (let index = 0; index < blockCount; index += 1) {\n registers[outputBase + index] = registers[arg0 + index];\n registers[outputBase + blockSize + index] = registers[arg1 + index];\n if (width >= 3) {\n registers[outputBase + blockSize * 2 + index] =\n registers[arg2 + index];\n }\n if (width === 4) {\n registers[outputBase + blockSize * 3 + index] =\n registers[registerOffsets[args[3] ?? 0] * blockSize + index];\n }\n }\n break;\n case Opcode.Component:\n for (let index = 0; index < blockCount; index += 1) {\n registers[outputBase + index] =\n registers[arg0 + immediate * blockSize + index];\n }\n break;\n case Opcode.MaxComponentIndex: {\n const inputWidth = arg0Width;\n for (let index = 0; index < blockCount; index += 1) {\n let largest = 0;\n let largestValue = registers[arg0 + index];\n for (let lane = 1; lane < inputWidth; lane += 1) {\n const value = registers[arg0 + lane * blockSize + index];\n if (value > largestValue) {\n largest = lane;\n largestValue = value;\n }\n }\n registers[outputBase + index] = largest;\n }\n }\n }\n\n // Serialization guarantees that the dynamic condition and all of its\n // dependencies form the prefix ending at `whenRegister`.\n if (instructionIndex === whenRegister && activeIndices) {\n const conditionBase = registerOffsets[whenRegister] * blockSize;\n const activeCount = filterConditionBlock(\n registers,\n conditionBase,\n conditionCarryOffsets,\n activeIndices,\n blockCount,\n blockSize,\n );\n if (activeCount !== blockCount) {\n if (activeCount !== 0) sourceIndices = activeIndices;\n blockCount = activeCount;\n if (blockCount === 0) break;\n }\n }\n }\n for (let index = 0; index < blockCount; index += 1) {\n writeOutputs(\n data,\n splat0Float,\n program,\n registers,\n registerOffsets,\n blockSize,\n index,\n blockStart + (sourceIndices?.[index] ?? index),\n );\n }\n }\n}\n\nfunction writeOutputs(\n data: PostDecodeSplatData,\n splat0Float: Float32Array,\n program: SerializedSplatPostDecode,\n registers: Float32Array,\n registerOffsets: Uint32Array,\n blockSize: number,\n blockIndex: number,\n splatIndex: number,\n) {\n const { outputs } = program;\n const wordBase = splatIndex * 4;\n if (outputs.position !== undefined) {\n const base = registerOffsets[outputs.position] * blockSize + blockIndex;\n splat0Float[wordBase] = registers[base];\n splat0Float[wordBase + 1] = registers[base + blockSize];\n splat0Float[wordBase + 2] = registers[base + blockSize * 2];\n }\n if (outputs.scale !== undefined) {\n const base = registerOffsets[outputs.scale] * blockSize + blockIndex;\n const first = data.splat1[wordBase + 1] & 0xffff;\n data.splat1[wordBase + 1] =\n (first | (toHalf(Math.log(registers[base])) << 16)) >>> 0;\n data.splat1[wordBase + 2] =\n (toHalf(Math.log(registers[base + blockSize])) |\n (toHalf(Math.log(registers[base + blockSize * 2])) << 16)) >>>\n 0;\n }\n if (outputs.quaternion !== undefined) {\n const base = registerOffsets[outputs.quaternion] * blockSize + blockIndex;\n const encoded = encodeQuaternion(registers, base, blockSize);\n if (encoded !== undefined) data.splat1[wordBase + 3] = encoded;\n }\n if (outputs.opacity !== undefined) {\n const base = registerOffsets[outputs.opacity] * blockSize + blockIndex;\n data.splat0[wordBase + 3] = encodeSplatOpacity(registers[base]);\n }\n if (outputs.alpha !== undefined) {\n const base = registerOffsets[outputs.alpha] * blockSize + blockIndex;\n data.splat0[wordBase + 3] =\n ((data.splat0[wordBase + 3] & 0xffff_0000) |\n toHalf(clamp(registers[base], 0, 1))) >>>\n 0;\n }\n if (outputs.color !== undefined) {\n const base = registerOffsets[outputs.color] * blockSize + blockIndex;\n data.splat1[wordBase] =\n (toHalf(registers[base]) |\n (toHalf(registers[base + blockSize]) << 16)) >>>\n 0;\n data.splat1[wordBase + 1] =\n ((data.splat1[wordBase + 1] & 0xffff_0000) |\n toHalf(registers[base + blockSize * 2])) >>>\n 0;\n }\n if (outputs.sh) {\n for (\n let coefficient = 0;\n coefficient < SH_COEFFICIENT_COUNT;\n coefficient += 1\n ) {\n const location = shWord(data, coefficient);\n if (location) {\n const base =\n registerOffsets[outputs.sh[coefficient]] * blockSize + blockIndex;\n location[0][wordBase + location[1]] = encodeSh(\n registers,\n base,\n blockSize,\n );\n }\n }\n }\n\n if (outputs.position !== undefined || outputs.scale !== undefined) {\n const disabled =\n data.splat1[wordBase + 1] >>> 16 === 0xfc00 &&\n (data.splat1[wordBase + 2] & 0xffff) === 0xfc00 &&\n data.splat1[wordBase + 2] >>> 16 === 0xfc00;\n const centerBase = splatIndex * 3;\n if (disabled) {\n data.sortCenters[centerBase] = Number.NaN;\n data.sortCenters[centerBase + 1] = Number.NaN;\n data.sortCenters[centerBase + 2] = Number.NaN;\n } else {\n data.sortCenters[centerBase] = splat0Float[wordBase];\n data.sortCenters[centerBase + 1] = splat0Float[wordBase + 1];\n data.sortCenters[centerBase + 2] = splat0Float[wordBase + 2];\n }\n }\n}\n\nexport function applySplatPostDecode(\n data: PostDecodeSplatData,\n program: SerializedSplatPostDecode,\n) {\n let processCount = data.numSplats;\n for (const attribute of program.attributes) {\n processCount = Math.min(processCount, attribute.count);\n }\n if (processCount === 0 || program.instructions.length === 0) return;\n\n const { registerOffsets, registerValueCount, conditionCarryOffsets } =\n allocateSplatPostDecodeRegisters(program);\n const blockSize = getBlockSize(registerValueCount, processCount);\n const registers = new Float32Array(registerValueCount * blockSize);\n const attributeData = new DataView(\n program.attributeData.buffer,\n program.attributeData.byteOffset,\n program.attributeData.byteLength,\n );\n const splat0Float = new Float32Array(\n data.splat0.buffer,\n data.splat0.byteOffset,\n data.splat0.length,\n );\n\n evaluateProgram(\n data,\n program,\n attributeData,\n splat0Float,\n registers,\n registerOffsets,\n conditionCarryOffsets,\n processCount,\n blockSize,\n );\n}\n","// Recursively finds all ArrayBuffers in an object for structured-clone transfer.\nexport function getTransferable(ctx: unknown): Transferable[] {\n const buffers = new Set<Transferable>();\n const seen = new Set();\n\n function traverse(obj: unknown) {\n if (!obj || typeof obj !== \"object\" || seen.has(obj)) return;\n seen.add(obj);\n\n if (obj instanceof ArrayBuffer) {\n buffers.add(obj);\n } else if (ArrayBuffer.isView(obj)) {\n buffers.add(obj.buffer as ArrayBuffer);\n } else {\n Object.values(obj).forEach(traverse);\n }\n }\n\n traverse(ctx);\n return [...buffers];\n}\n","import init_wasm, {\n type ChunkDecoder,\n decode_to_splats,\n set_sort_center_state,\n sort32_centers,\n} from \"gaussian-splat-rs\";\nimport type { SplatResult } from \"./defines\";\nimport type { SerializedSplatPostDecode } from \"./postDecode\";\nimport {\n type PostDecodeSplatData,\n applySplatPostDecode,\n} from \"./postDecodeRuntime\";\nimport { getTransferable } from \"./transferable\";\n\nconst rpcHandlers = {\n setSortCenterState,\n sortCenters32,\n loadSplats,\n nextChunk,\n};\nexport type RpcHandlers = typeof rpcHandlers;\n\nlet wasmMemory: WebAssembly.Memory | undefined;\n\nfunction getWasmMemoryBytes() {\n return wasmMemory?.buffer.byteLength ?? 0;\n}\n\nfunction setSortCenterState({\n centerUpdateRangeIndices,\n updateCenters,\n matrixUpdateRangeIndices,\n updateMatrices,\n rangeMeshIds,\n rangeBases,\n rangeCounts,\n}: {\n centerUpdateRangeIndices: Uint32Array;\n updateCenters: Float32Array;\n matrixUpdateRangeIndices: Uint32Array;\n updateMatrices: Float64Array;\n rangeMeshIds: Uint32Array;\n rangeBases: Uint32Array;\n rangeCounts: Uint32Array;\n}) {\n set_sort_center_state(\n centerUpdateRangeIndices,\n updateCenters,\n matrixUpdateRangeIndices,\n updateMatrices,\n rangeMeshIds,\n rangeBases,\n rangeCounts,\n );\n}\n\nfunction sortCenters32({\n numSplats,\n cameraPosition,\n direction,\n radial,\n ordering,\n}: {\n numSplats: number;\n cameraPosition: [number, number, number];\n direction: [number, number, number];\n radial: boolean;\n ordering: Uint32Array;\n}) {\n const activeSplats = sort32_centers(\n numSplats,\n cameraPosition[0],\n cameraPosition[1],\n cameraPosition[2],\n direction[0],\n direction[1],\n direction[2],\n radial,\n ordering,\n );\n return { activeSplats, ordering };\n}\n\nasync function onMessage(event: MessageEvent) {\n const {\n id,\n name,\n args,\n }: { id: unknown; name: keyof typeof rpcHandlers; args: unknown } =\n event.data;\n try {\n const handler = rpcHandlers[name] as (\n args: unknown,\n options: { sendStatus: (data: unknown) => void },\n ) => unknown | Promise<unknown>;\n if (!handler) {\n throw new Error(`Unknown worker RPC: ${name}`);\n }\n\n const sendStatus = (data: unknown) => {\n self.postMessage(\n { id, status: data },\n { transfer: getTransferable(data) },\n );\n };\n const result = await handler(args, { sendStatus });\n self.postMessage(\n { id, result, wasmMemoryBytes: getWasmMemoryBytes() },\n { transfer: getTransferable(result) },\n );\n } catch (error) {\n console.warn(`Worker error: ${error}`);\n self.postMessage(\n { id, error, wasmMemoryBytes: getWasmMemoryBytes() },\n { transfer: getTransferable(error) },\n );\n }\n}\n\nasync function decodeBytesUrl({\n decoder,\n fileBytes,\n url,\n requestHeader,\n withCredentials,\n chunked,\n chunkedLength,\n sendStatus,\n}: {\n decoder: ChunkDecoder;\n fileBytes?: Uint8Array;\n url?: string;\n requestHeader?: Record<string, string>;\n withCredentials?: boolean;\n chunked?: boolean;\n chunkedLength?: number;\n sendStatus: (data: unknown) => void;\n}) {\n if (fileBytes) {\n const byteLength = fileBytes.length;\n if (byteLength > 0) {\n decoder.set_expected_input_size(byteLength);\n }\n sendStatus({ loaded: byteLength, total: byteLength });\n decoder.push(fileBytes);\n return decoder.finish();\n }\n\n const suppliedInputLength = chunkedLength ?? 0;\n if (!Number.isSafeInteger(suppliedInputLength) || suppliedInputLength < 0) {\n throw new Error(\"streamLength must be a non-negative integer\");\n }\n let streamLength = suppliedInputLength;\n let expectedInputLength = 0;\n let responseBody: ReadableStream<Uint8Array> | undefined;\n\n if (url) {\n const request = new Request(url, {\n headers: requestHeader ? new Headers(requestHeader) : undefined,\n credentials: withCredentials ? \"include\" : \"same-origin\",\n });\n\n const response = await fetch(request);\n if (!response.ok || !response.body) {\n throw new Error(\n `Failed to fetch \"${url}\": ${response.status} ${response.statusText}`,\n );\n }\n responseBody = response.body;\n const contentLength = Number(response.headers.get(\"Content-Length\") || \"0\");\n const responseLength =\n Number.isSafeInteger(contentLength) && contentLength > 0\n ? contentLength\n : 0;\n streamLength ||= responseLength;\n const contentEncoding = response.headers.get(\"Content-Encoding\");\n // A CORS-filtered response can hide Content-Encoding while exposing\n // Content-Length, so only use the response length for decoder validation\n // when every response header is visible.\n const hasIdentityEncoding =\n !contentEncoding || contentEncoding.toLowerCase() === \"identity\";\n if (response.type === \"basic\" && hasIdentityEncoding) {\n expectedInputLength = responseLength;\n }\n } else if (!chunked) {\n throw new Error(\"No url or fileBytes provided\");\n }\n\n const streamReader = responseBody?.getReader();\n const readInputChunk = async () => {\n if (streamReader) {\n const { done, value } = await streamReader.read();\n return done ? undefined : value;\n }\n\n const chunk = await new Promise<Uint8Array>((resolve) => {\n nextChunkWaiter = resolve;\n sendStatus({ nextChunk: true });\n });\n return chunk.length === 0 ? undefined : chunk;\n };\n\n let loaded = 0;\n try {\n if (expectedInputLength > 0) {\n decoder.set_expected_input_size(expectedInputLength);\n }\n\n while (true) {\n const value = await readInputChunk();\n if (!value) break;\n\n loaded += value.length;\n if (expectedInputLength > 0 && loaded > expectedInputLength) {\n throw new Error(\n `Input length exceeds the expected ${expectedInputLength} bytes`,\n );\n }\n sendStatus({ loaded, total: streamLength });\n decoder.push(value);\n }\n\n if (expectedInputLength > 0 && loaded !== expectedInputLength) {\n throw new Error(\n `Input length mismatch: expected ${expectedInputLength} bytes, received ${loaded}`,\n );\n }\n\n if (chunked && streamLength === 0) {\n sendStatus({ loaded, total: loaded });\n }\n\n return decoder.finish();\n } catch (error) {\n try {\n await streamReader?.cancel(error);\n } catch {\n // Preserve the decoding error if stream cancellation itself fails.\n }\n throw error;\n } finally {\n streamReader?.releaseLock();\n }\n}\n\nfunction toSplatResult(decoded: PostDecodeSplatData): SplatResult {\n return {\n numSplats: decoded.numSplats,\n splatArrays: [decoded.splat0, decoded.splat1],\n sortCenters: decoded.sortCenters,\n extra: {\n sh1: decoded.sh1,\n sh2: decoded.sh2,\n sh3a: decoded.sh3a,\n sh3b: decoded.sh3b,\n },\n };\n}\n\nasync function loadSplats(\n {\n url,\n requestHeader,\n withCredentials,\n fileBytes,\n fileType,\n pathName,\n chunked,\n chunkedLength,\n postDecode,\n }: {\n url?: string;\n requestHeader?: Record<string, string>;\n withCredentials?: boolean;\n fileBytes?: Uint8Array;\n fileType?: string;\n pathName?: string;\n chunked?: boolean;\n chunkedLength?: number;\n postDecode?: SerializedSplatPostDecode;\n },\n { sendStatus }: { sendStatus: (data: unknown) => void },\n) {\n const decoder = decode_to_splats(fileType, pathName ?? url);\n const decoded = (await decodeBytesUrl({\n decoder,\n fileBytes,\n url,\n requestHeader,\n withCredentials,\n chunked,\n chunkedLength,\n sendStatus,\n })) as PostDecodeSplatData;\n if (postDecode) applySplatPostDecode(decoded, postDecode);\n return toSplatResult(decoded);\n}\n\nlet nextChunkWaiter = (_chunk: Uint8Array) => {};\n\nasync function nextChunk({ chunk }: { chunk: Uint8Array }) {\n nextChunkWaiter(chunk);\n}\n\nasync function initialize() {\n let resolveWaitForModule: (value: WebAssembly.Module) => void;\n const waitForModule = new Promise<WebAssembly.Module>((resolve) => {\n resolveWaitForModule = resolve;\n });\n\n const pending: MessageEvent[] = [];\n const bufferMessage = (event: MessageEvent) => {\n if (event.data.name === \"init-wasm\") {\n resolveWaitForModule(event.data.module as WebAssembly.Module);\n return;\n }\n pending.push(event);\n };\n self.addEventListener(\"message\", bufferMessage);\n\n const wasm = await init_wasm({ module_or_path: await waitForModule });\n wasmMemory = wasm.memory;\n\n self.removeEventListener(\"message\", bufferMessage);\n self.addEventListener(\"message\", onMessage);\n\n for (const event of pending) {\n onMessage(event);\n }\n pending.length = 0;\n}\n\ninitialize().catch(console.error);\n"],"names":["ptr","Opcode","InputField","clamp","encodeQuaternion","range","offset","wasm","init_wasm"],"mappings":"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"}