gaussian-splat-lite 0.1.13 → 0.1.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"gaussian-splat-lite.cjs","sources":["../src/cameraRelative.ts","../src/SplatEdit.ts","../rust/gaussian-splat-rs/pkg/gaussian_splat_rs.js","../src/float16.ts","../src/splatCodec.ts","../src/defines.ts","../src/transferable.ts","../src/utils.ts","../src/Splats.ts","../virtual:decode-64","../src/wasm.ts","../src/SplatMesh.ts","../src/shaders/splatDefines.glsl","../src/shaders/splatFragment.glsl","../src/shaders/splatVertex.glsl","../src/shaders.ts","../src/shaders/splatGenerate.glsl","../src/splatTransform.ts","../src/SplatAccumulator.ts","../src/SplatGeometry.ts","../src/workerIdleTimeout.ts","../src/SplatWorker.ts","../src/GaussianSplatRenderer.ts","../src/postDecode.ts","../src/SplatLoader.ts"],"sourcesContent":["import type * as THREE from \"three\";\n\nimport type { SplatAccumulator } from \"./SplatAccumulator\";\nimport type { SplatMesh } from \"./SplatMesh\";\n\ntype SortCenterEntry = {\n meshId: number;\n centerVersion: number;\n sortVersion: number;\n};\n\n/**\n * Re-expresses an affine transform so it consumes positions relative to\n * `origin` instead of absolute world positions.\n *\n * If `matrix` maps p to A * p + t, the rebased matrix maps (p - origin) to\n * A * (p - origin) + (A * origin + t), which is the same result without doing\n * a large-coordinate subtraction in float32 shader code.\n */\nexport function rebaseAffineTransform(\n matrix: THREE.Matrix4,\n origin: THREE.Vector3,\n) {\n const elements = matrix.elements;\n const x = origin.x;\n const y = origin.y;\n const z = origin.z;\n\n const tx = elements[0] * x + elements[4] * y + elements[8] * z + elements[12];\n const ty = elements[1] * x + elements[5] * y + elements[9] * z + elements[13];\n const tz =\n elements[2] * x + elements[6] * y + elements[10] * z + elements[14];\n\n elements[12] = tx;\n elements[13] = ty;\n elements[14] = tz;\n return matrix;\n}\n\n/** Tracks raw-center and matrix revisions cached by the sort worker. */\nexport class SortCenterCache {\n private entries = new Map<SplatMesh, SortCenterEntry>();\n private freeMeshIds: number[] = [];\n private nextMeshId = 0;\n\n private allocateMeshId() {\n const reused = this.freeMeshIds.pop();\n if (reused !== undefined) return reused;\n\n if (this.nextMeshId > 0xffff_ffff) {\n throw new Error(\"Sort center mesh ID space exhausted\");\n }\n return this.nextMeshId++;\n }\n\n dispose() {\n this.entries.clear();\n this.freeMeshIds.length = 0;\n this.nextMeshId = 0;\n }\n\n prepare(current: SplatAccumulator) {\n const rangeMeshIds = new Uint32Array(current.mapping.length);\n const rangeBases = new Uint32Array(current.mapping.length);\n const rangeCounts = new Uint32Array(current.mapping.length);\n const retiredNodes = new Set(this.entries.keys());\n const changedCenters: {\n node: SplatMesh;\n count: number;\n rangeIndex: number;\n }[] = [];\n const changedMatrices: {\n node: SplatMesh;\n rangeIndex: number;\n }[] = [];\n let updateCount = 0;\n\n current.mapping.forEach(\n ({ node, base, count, centerVersion, sortVersion }, rangeIndex) => {\n retiredNodes.delete(node);\n let entry = this.entries.get(node);\n if (!entry) {\n // Store a provisional entry immediately so a failed worker call can\n // retry with the same ID. Its sentinel version forces a re-upload.\n entry = {\n meshId: this.allocateMeshId(),\n centerVersion: -1,\n sortVersion: -1,\n };\n this.entries.set(node, entry);\n }\n\n rangeMeshIds[rangeIndex] = entry.meshId;\n rangeBases[rangeIndex] = base;\n rangeCounts[rangeIndex] = count;\n\n if (entry.centerVersion !== centerVersion) {\n changedCenters.push({\n node,\n count,\n rangeIndex,\n });\n updateCount += count;\n }\n if (entry.sortVersion !== sortVersion) {\n changedMatrices.push({\n node,\n rangeIndex,\n });\n }\n },\n );\n\n const centerUpdateRangeIndices = new Uint32Array(changedCenters.length);\n const updateCenters = new Float32Array(updateCount * 3);\n\n let updateBase = 0;\n changedCenters.forEach(({ node, count, rangeIndex }, updateIndex) => {\n centerUpdateRangeIndices[updateIndex] = rangeIndex;\n\n if (!node.splats) throw new Error(\"SplatMesh has no source\");\n node.splats.copySortCenters(updateCenters, updateBase * 3, count);\n updateBase += count;\n });\n\n const matrixUpdateRangeIndices = new Uint32Array(changedMatrices.length);\n const updateMatrices = new Float64Array(changedMatrices.length * 16);\n changedMatrices.forEach(({ node, rangeIndex }, updateIndex) => {\n matrixUpdateRangeIndices[updateIndex] = rangeIndex;\n updateMatrices.set(node.matrixWorld.elements, updateIndex * 16);\n });\n\n return {\n payload: {\n centerUpdateRangeIndices,\n updateCenters,\n matrixUpdateRangeIndices,\n updateMatrices,\n rangeMeshIds,\n rangeBases,\n rangeCounts,\n },\n commit: () => {\n for (const { node, centerVersion, sortVersion } of current.mapping) {\n const entry = this.entries.get(node);\n if (!entry) continue;\n entry.centerVersion = centerVersion;\n entry.sortVersion = sortVersion;\n }\n // Recycle IDs only after the worker accepted the replacement state.\n // A mesh that later becomes active again gets a fresh entry and must\n // upload all of its centers before using its recycled ID.\n for (const node of retiredNodes) {\n const entry = this.entries.get(node);\n if (!entry) continue;\n this.entries.delete(node);\n this.freeMeshIds.push(entry.meshId);\n }\n },\n };\n }\n}\n","import * as THREE from \"three\";\n\nimport { rebaseAffineTransform } from \"./cameraRelative\";\n\nexport enum SplatEditSdfType {\n ALL = \"all\",\n PLANE = \"plane\",\n SPHERE = \"sphere\",\n BOX = \"box\",\n ELLIPSOID = \"ellipsoid\",\n CYLINDER = \"cylinder\",\n CAPSULE = \"capsule\",\n INFINITE_CONE = \"infinite_cone\",\n}\n\n/** RGBA-only operations supported by the SDF pipeline. */\nexport enum SplatEditRgbaBlendMode {\n MULTIPLY_RGBA = \"multiply_rgba\",\n SET_RGBA = \"set_rgba\",\n ADD_RGBA = \"add_rgba\",\n}\n\nexport type SplatEditSdfColor = {\n r?: number;\n g?: number;\n b?: number;\n};\n\nexport type SplatEditSdfOptions = {\n type?: SplatEditSdfType;\n invert?: boolean;\n opacity?: number;\n color?: SplatEditSdfColor;\n radius?: number;\n};\n\n/** A signed-distance shape carrying optional color and opacity channels. */\nexport class SplatEditSdf extends THREE.Object3D {\n type: SplatEditSdfType;\n invert: boolean;\n opacity?: number;\n color: SplatEditSdfColor;\n radius: number;\n\n constructor(options: SplatEditSdfOptions = {}) {\n super();\n this.type = options.type ?? SplatEditSdfType.SPHERE;\n this.invert = options.invert ?? false;\n this.opacity = options.opacity;\n this.color = options.color ?? {};\n this.radius = options.radius ?? 0;\n }\n}\n\nexport type SplatEditOptions = {\n name?: string;\n rgbaBlendMode?: SplatEditRgbaBlendMode;\n sdfSmooth?: number;\n softEdge?: number;\n invert?: boolean;\n sdfs?: SplatEditSdf[];\n};\n\n/** An ordered RGBA operation evaluated over one or more SDF shapes. */\nexport class SplatEdit extends THREE.Object3D {\n ordering: number;\n rgbaBlendMode: SplatEditRgbaBlendMode;\n sdfSmooth: number;\n softEdge: number;\n invert: boolean;\n sdfs: SplatEditSdf[] | null;\n\n static nextOrdering = 1;\n\n constructor(options: SplatEditOptions = {}) {\n super();\n this.rgbaBlendMode =\n options.rgbaBlendMode ?? SplatEditRgbaBlendMode.MULTIPLY_RGBA;\n this.sdfSmooth = options.sdfSmooth ?? 0;\n this.softEdge = options.softEdge ?? 0;\n this.invert = options.invert ?? false;\n this.sdfs = options.sdfs ?? null;\n this.ordering = SplatEdit.nextOrdering++;\n this.name = options.name ?? `Edit ${this.ordering}`;\n }\n\n addSdf(sdf: SplatEditSdf) {\n this.sdfs ??= [];\n if (!this.sdfs.includes(sdf)) {\n this.sdfs.push(sdf);\n }\n }\n\n removeSdf(sdf: SplatEditSdf) {\n if (this.sdfs) {\n this.sdfs = this.sdfs.filter((candidate) => candidate !== sdf);\n }\n }\n}\n\nexport type SplatEditGroup = { edit: SplatEdit; sdfs: SplatEditSdf[] };\n\nconst SDF_TEXELS = 5;\nconst SDF_RGBA_MASK_SHIFT = 16;\nconst MIN_CAPACITY = 16;\nconst scratchFloat = new Float32Array(1);\nconst scratchUint = new Uint32Array(scratchFloat.buffer);\n\n/** Encodes SDF geometry/RGBA and edit operations as regular integer textures. */\nexport class SplatEdits {\n maxSdfs: number;\n numSdfs = 0;\n sdfData: Uint32Array;\n sdfFloatData: Float32Array;\n sdfTexture: THREE.DataTexture;\n\n maxEdits: number;\n numEdits = 0;\n editData: Uint32Array;\n editFloatData: Float32Array;\n editTexture: THREE.DataTexture;\n\n constructor({ maxSdfs = 0, maxEdits = 0 } = {}) {\n this.maxSdfs = Math.max(MIN_CAPACITY, maxSdfs);\n this.sdfData = new Uint32Array(this.maxSdfs * SDF_TEXELS * 4);\n this.sdfFloatData = new Float32Array(this.sdfData.buffer);\n this.sdfTexture = makeUintTexture(this.sdfData, SDF_TEXELS, this.maxSdfs);\n\n this.maxEdits = Math.max(MIN_CAPACITY, maxEdits);\n this.editData = new Uint32Array(this.maxEdits * 4);\n this.editFloatData = new Float32Array(this.editData.buffer);\n this.editTexture = makeUintTexture(this.editData, 1, this.maxEdits);\n }\n\n dispose() {\n this.sdfTexture.dispose();\n this.editTexture.dispose();\n }\n\n update(\n groups: SplatEditGroup[],\n coordinateOrigin?: THREE.Vector3,\n ): { updated: boolean } {\n const sdfCount = groups.reduce(\n (total, group) => total + group.sdfs.length,\n 0,\n );\n let updated = this.ensureCapacity(sdfCount, groups.length);\n\n if (this.numSdfs !== sdfCount || this.numEdits !== groups.length) {\n this.numSdfs = sdfCount;\n this.numEdits = groups.length;\n updated = true;\n }\n\n const center = new THREE.Vector3();\n const quaternion = new THREE.Quaternion();\n const inverseScale = new THREE.Vector3();\n const sizes = new THREE.Vector4();\n const worldToSdf = new THREE.Matrix4();\n let sdfIndex = 0;\n let sdfUpdated = false;\n let editUpdated = false;\n\n groups.forEach(({ edit, sdfs }, editIndex) => {\n editUpdated =\n this.encodeEdit(editIndex, edit, sdfIndex, sdfs.length) || editUpdated;\n\n for (const sdf of sdfs) {\n sizes.set(sdf.scale.x, sdf.scale.y, sdf.scale.z, sdf.radius);\n const originalScale = sdf.scale.clone();\n try {\n sdf.scale.setScalar(1);\n sdf.updateWorldMatrix(true, false);\n worldToSdf.copy(sdf.matrixWorld).invert();\n // Only the internal numeric frame changes. SDF Object3D transforms,\n // sizes, smoothing distances, and edit semantics remain world-space.\n if (coordinateOrigin) {\n rebaseAffineTransform(worldToSdf, coordinateOrigin);\n }\n worldToSdf.decompose(center, quaternion, inverseScale);\n } finally {\n sdf.scale.copy(originalScale);\n sdf.updateWorldMatrix(true, false);\n }\n\n sdfUpdated =\n this.encodeSdf(\n sdfIndex,\n sdf,\n center,\n quaternion,\n inverseScale,\n sizes,\n ) || sdfUpdated;\n sdfIndex += 1;\n }\n });\n\n if (sdfUpdated) {\n this.sdfTexture.needsUpdate = true;\n }\n if (editUpdated) {\n this.editTexture.needsUpdate = true;\n }\n return { updated: updated || sdfUpdated || editUpdated };\n }\n\n private ensureCapacity(sdfs: number, edits: number) {\n let updated = false;\n if (sdfs > this.maxSdfs) {\n this.maxSdfs = Math.max(sdfs, this.maxSdfs * 2);\n this.sdfTexture.dispose();\n this.sdfData = new Uint32Array(this.maxSdfs * SDF_TEXELS * 4);\n this.sdfFloatData = new Float32Array(this.sdfData.buffer);\n this.sdfTexture = makeUintTexture(this.sdfData, SDF_TEXELS, this.maxSdfs);\n updated = true;\n }\n if (edits > this.maxEdits) {\n this.maxEdits = Math.max(edits, this.maxEdits * 2);\n this.editTexture.dispose();\n this.editData = new Uint32Array(this.maxEdits * 4);\n this.editFloatData = new Float32Array(this.editData.buffer);\n this.editTexture = makeUintTexture(this.editData, 1, this.maxEdits);\n updated = true;\n }\n return updated;\n }\n\n private encodeEdit(\n index: number,\n edit: SplatEdit,\n sdfFirst: number,\n sdfCount: number,\n ) {\n if (sdfFirst > 0xffff || sdfCount > 0xffff) {\n throw new Error(\"An SDF edit supports at most 65535 shapes\");\n }\n const base = index * 4;\n const blend = rgbaBlendModeToNumber(edit.rgbaBlendMode);\n const flags = blend | (edit.invert ? 1 << 8 : 0);\n let updated = this.setEditUint(base, flags);\n updated =\n this.setEditUint(base + 1, sdfFirst | (sdfCount << 16)) || updated;\n updated = this.setEditFloat(base + 2, edit.softEdge) || updated;\n updated = this.setEditFloat(base + 3, edit.sdfSmooth) || updated;\n return updated;\n }\n\n private encodeSdf(\n index: number,\n sdf: SplatEditSdf,\n center: THREE.Vector3,\n quaternion: THREE.Quaternion,\n scale: THREE.Vector3,\n sizes: THREE.Vector4,\n ) {\n const base = index * SDF_TEXELS * 4;\n const color = sdf.color;\n const rgbaMask =\n (color.r === undefined ? 0 : 1) |\n (color.g === undefined ? 0 : 1 << 1) |\n (color.b === undefined ? 0 : 1 << 2) |\n (sdf.opacity === undefined ? 0 : 1 << 3);\n const flags =\n sdfTypeToNumber(sdf.type) |\n (sdf.invert ? 1 << 8 : 0) |\n (rgbaMask << SDF_RGBA_MASK_SHIFT);\n let updated = this.setSdfFloat(base, center.x);\n updated = this.setSdfFloat(base + 1, center.y) || updated;\n updated = this.setSdfFloat(base + 2, center.z) || updated;\n updated = this.setSdfUint(base + 3, flags) || updated;\n\n updated = this.setSdfFloat(base + 4, quaternion.x) || updated;\n updated = this.setSdfFloat(base + 5, quaternion.y) || updated;\n updated = this.setSdfFloat(base + 6, quaternion.z) || updated;\n updated = this.setSdfFloat(base + 7, quaternion.w) || updated;\n\n updated = this.setSdfFloat(base + 8, scale.x) || updated;\n updated = this.setSdfFloat(base + 9, scale.y) || updated;\n updated = this.setSdfFloat(base + 10, scale.z) || updated;\n updated = this.setSdfUint(base + 11, 0) || updated;\n\n updated = this.setSdfFloat(base + 12, sizes.x) || updated;\n updated = this.setSdfFloat(base + 13, sizes.y) || updated;\n updated = this.setSdfFloat(base + 14, sizes.z) || updated;\n updated = this.setSdfFloat(base + 15, sizes.w) || updated;\n\n updated = this.setSdfFloat(base + 16, color.r ?? 0) || updated;\n updated = this.setSdfFloat(base + 17, color.g ?? 0) || updated;\n updated = this.setSdfFloat(base + 18, color.b ?? 0) || updated;\n updated = this.setSdfFloat(base + 19, sdf.opacity ?? 0) || updated;\n return updated;\n }\n\n private setSdfUint(offset: number, value: number) {\n const updated = this.sdfData[offset] !== value;\n this.sdfData[offset] = value;\n return updated;\n }\n\n private setSdfFloat(offset: number, value: number) {\n scratchFloat[0] = value;\n return this.setSdfUint(offset, scratchUint[0]);\n }\n\n private setEditUint(offset: number, value: number) {\n const updated = this.editData[offset] !== value;\n this.editData[offset] = value;\n return updated;\n }\n\n private setEditFloat(offset: number, value: number) {\n scratchFloat[0] = value;\n return this.setEditUint(offset, scratchUint[0]);\n }\n\n static emptyTexture = makeUintTexture(new Uint32Array(4), 1, 1);\n}\n\nfunction rgbaBlendModeToNumber(mode: SplatEditRgbaBlendMode) {\n switch (mode) {\n case SplatEditRgbaBlendMode.MULTIPLY_RGBA:\n return 0;\n case SplatEditRgbaBlendMode.SET_RGBA:\n return 1;\n case SplatEditRgbaBlendMode.ADD_RGBA:\n return 2;\n }\n}\n\nfunction sdfTypeToNumber(type: SplatEditSdfType) {\n switch (type) {\n case SplatEditSdfType.ALL:\n return 0;\n case SplatEditSdfType.PLANE:\n return 1;\n case SplatEditSdfType.SPHERE:\n return 2;\n case SplatEditSdfType.BOX:\n return 3;\n case SplatEditSdfType.ELLIPSOID:\n return 4;\n case SplatEditSdfType.CYLINDER:\n return 5;\n case SplatEditSdfType.CAPSULE:\n return 6;\n case SplatEditSdfType.INFINITE_CONE:\n return 7;\n }\n}\n\nfunction makeUintTexture(data: Uint32Array, width: number, height: number) {\n const texture = new THREE.DataTexture(\n data,\n width,\n height,\n THREE.RGBAIntegerFormat,\n THREE.UnsignedIntType,\n );\n texture.internalFormat = \"RGBA32UI\";\n texture.magFilter = THREE.NearestFilter;\n texture.minFilter = THREE.NearestFilter;\n texture.generateMipmaps = false;\n texture.needsUpdate = true;\n return texture;\n}\n","/* @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","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","// Gsplats are stored in textures that are 2^11 x 2^11 x up to 2^11\n// Most WebGL2 implementations support 2D textures up to 2^12 x 2^12 (max 16M Gsplats)\n// 2D array textures and 3D textures up to 2^11 x 2^11 x 2^11 (max 8G Gsplats),\n// so we use 2D array textures for our representation for higher limits.\n\nexport const SPLAT_TEX_WIDTH_BITS = 11;\nexport const SPLAT_TEX_HEIGHT_BITS = 11;\n\nexport const SPLAT_TEX_WIDTH = 1 << SPLAT_TEX_WIDTH_BITS; // 2048\nexport const SPLAT_TEX_HEIGHT = 1 << SPLAT_TEX_HEIGHT_BITS; // 2048\nexport const SPLAT_TEX_MIN_HEIGHT = 1;\n\nexport enum SplatFileType {\n PLY = \"ply\",\n SPZ = \"spz\",\n}\n\nexport type SplatExtra = {\n sh1?: Uint32Array;\n sh2?: Uint32Array;\n sh3a?: Uint32Array;\n sh3b?: Uint32Array;\n};\n\nexport type SplatResult = {\n numSplats: number;\n splatArrays: [Uint32Array, Uint32Array];\n sortCenters?: Float32Array;\n extra: SplatExtra;\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 * as THREE from \"three\";\n\n// Miscellaneous utility functions for Gaussian Splat Lite\n\nimport {\n SPLAT_TEX_HEIGHT,\n SPLAT_TEX_MIN_HEIGHT,\n SPLAT_TEX_WIDTH,\n} from \"./defines.js\";\nimport {\n decodeQuatOctXy1010R12ToArray,\n decodeSplatOpacity,\n} from \"./splatCodec\";\nexport { fromHalf, toHalf } from \"./float16\";\nexport { encodeQuatOctXy1010R12 } from \"./splatCodec\";\nexport { getTransferable } from \"./transferable\";\nimport { fromHalf } from \"./float16\";\n\nexport const threeRevision = Number.parseInt(THREE.REVISION);\nexport const threeMrtArray = threeRevision >= 179;\n\nconst f32buffer = new Float32Array(1);\nconst u32buffer = new Uint32Array(f32buffer.buffer);\n\n// Reinterpret the bits of a float32 as a uint32\nexport function floatBitsToUint(f: number): number {\n f32buffer[0] = f;\n return u32buffer[0];\n}\n\n// Reinterpret the bits of a uint32 as a float32\nexport function uintBitsToFloat(u: number): number {\n u32buffer[0] = u;\n return f32buffer[0];\n}\n\nexport function decodeSplat(\n splatArrays: [Uint32Array, Uint32Array],\n index: number,\n): {\n center: THREE.Vector3;\n scales: THREE.Vector3;\n quaternion: THREE.Quaternion;\n color: THREE.Color;\n opacity: number;\n} {\n // Returns a static object which is reused each time\n const result = splatFields;\n const i4 = index * 4;\n const [splatA, splatB] = splatArrays;\n result.center.x = uintBitsToFloat(splatA[i4]);\n result.center.y = uintBitsToFloat(splatA[i4 + 1]);\n result.center.z = uintBitsToFloat(splatA[i4 + 2]);\n result.opacity = decodeSplatOpacity(splatA[i4 + 3]);\n result.color.r = fromHalf(splatB[i4] & 0xffff);\n result.color.g = fromHalf(splatB[i4] >>> 16);\n result.color.b = fromHalf(splatB[i4 + 1] & 0xffff);\n result.scales.x = Math.exp(fromHalf(splatB[i4 + 1] >>> 16));\n result.scales.y = Math.exp(fromHalf(splatB[i4 + 2] & 0xffff));\n result.scales.z = Math.exp(fromHalf(splatB[i4 + 2] >>> 16));\n decodeQuatOctXy1010R12(splatB[i4 + 3], result.quaternion);\n return result;\n}\n\nconst splatCenter = new THREE.Vector3();\nconst splatScales = new THREE.Vector3();\nconst splatQuaternion = new THREE.Quaternion();\nconst splatColor = new THREE.Color();\nconst splatFields = {\n center: splatCenter,\n scales: splatScales,\n quaternion: splatQuaternion,\n color: splatColor,\n opacity: 0.0,\n};\n\n// Compute a texture array size that is large enough to fit numSplats. The most\n// common 2D texture size in WebGL2 is 4096x4096 which only allows for 16M splats,\n// so Gaussian Splat Lite stores Gsplat data in a 2D texture array, which most platforms support\n// up to 2048x2048x2048 = 8G splats. Allocations that fit within a single 2D texture\n// array layer will be rounded up to fill an entire texture row. Once a texture\n// array layer is filled, the allocation will be rounded up to fill an entire layer.\n// This is done so the entire set of splats can be covered by min/max coords across\n// each dimension.\nexport function getTextureSize(numSplats: number): {\n width: number;\n height: number;\n depth: number;\n maxSplats: number;\n} {\n // Compute a texture array size that is large enough to fit numSplats.\n // The width is always 2048, the height sized to fit the splats but no larger than 2048.\n // The depth is the number of layers needed to fit the splats.\n // maxSplats is computed as the new total available splats that can be stored.\n const width = SPLAT_TEX_WIDTH;\n const height = Math.max(\n SPLAT_TEX_MIN_HEIGHT,\n Math.min(SPLAT_TEX_HEIGHT, Math.ceil(numSplats / width)),\n );\n const depth = Math.ceil(numSplats / (width * height));\n const maxSplats = width * height * depth;\n return { width, height, depth, maxSplats };\n}\n\n// \"Identity\" vertex shader that just passes through the position.\nexport const IDENT_VERTEX_SHADER = `\nprecision highp float;\n\nin vec3 position;\n\nvoid main() {\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst decodedQuaternion = [0, 0, 0, 1];\n\nexport function decodeQuatOctXy1010R12(\n encoded: number,\n out: THREE.Quaternion,\n): THREE.Quaternion {\n decodeQuatOctXy1010R12ToArray(encoded, decodedQuaternion);\n out.set(\n decodedQuaternion[0],\n decodedQuaternion[1],\n decodedQuaternion[2],\n decodedQuaternion[3],\n );\n return out;\n}\n\nexport function uploadU32DataTextureRows(\n renderer: THREE.WebGLRenderer,\n texture: THREE.Texture,\n width: number,\n rows: number,\n data: Uint32Array,\n) {\n const gl = renderer.getContext() as WebGL2RenderingContext;\n const props = renderer.properties.get(texture) as {\n __webglTexture: WebGLTexture;\n };\n const glTexture = props?.__webglTexture;\n if (!glTexture) {\n throw new Error(\"texture not found\");\n }\n\n // renderer.state.pixelStorei is only available in newer Three.js releases,\n // so preserve these WebGL flags explicitly across the direct texture upload.\n const currentFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);\n const currentPremultiply = gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL);\n renderer.state.activeTexture(gl.TEXTURE0);\n renderer.state.bindTexture(gl.TEXTURE_2D, glTexture);\n gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, null);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n 0,\n width,\n rows,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_INT,\n data,\n );\n renderer.state.unbindTexture();\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, currentFlipY);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, currentPremultiply);\n}\n\nexport function resolveTimer(timer?: THREE.Timer): {\n timer: THREE.Timer;\n ownsTimer: boolean;\n} {\n return {\n timer: timer ?? new THREE.Timer(),\n // A caller-supplied timer may be shared with other systems, so only update\n // the timer that Gaussian Splat Lite creates and owns itself.\n ownsTimer: timer === undefined,\n };\n}\n","import * as THREE from \"three\";\n\nimport type { SplatFileType } from \"./defines\";\nimport { toHalf } from \"./float16\";\nimport type { SplatPostDecodeProgram } from \"./postDecode\";\nimport { encodeQuatOctXy1010R12, encodeSplatOpacity } from \"./splatCodec\";\nimport { decodeSplat, getTextureSize } from \"./utils\";\n\ntype SplatShTextures = {\n sh1?: THREE.DataArrayTexture;\n sh2?: THREE.DataArrayTexture;\n sh3a?: THREE.DataArrayTexture;\n sh3b?: THREE.DataArrayTexture;\n};\n\ntype SplatShArrays = (Uint32Array | undefined)[];\n\nconst SH_COUNTS = [0, 3, 8, 15] as const;\nconst SH_KEYS = [\"sh1\", \"sh2\", \"sh3a\", \"sh3b\"] as const;\nconst SH_ARRAY_COUNTS = [0, 1, 2, 4] as const;\n\ntype DecodedSplat = ReturnType<typeof decodeSplat>;\nexport type SplatInput = {\n center: THREE.Vector3;\n scales: THREE.Vector3;\n quaternion: THREE.Quaternion;\n opacity: number;\n color: THREE.Color;\n /** SH0/1/2/3 use 0, 3, 8, or 15 RGB coefficients respectively. */\n sh?: readonly THREE.Color[];\n};\n\ntype DecodedSplatWithSh = DecodedSplat & { sh: THREE.Color[] };\n\nexport type SplatsOptions = {\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n /** Optional stream byte-length estimate used for progress reporting. */\n streamLength?: number;\n /** Declarative per-splat transform executed in the decode worker. */\n postDecode?: SplatPostDecodeProgram;\n maxSplats?: number;\n construct?: (splats: Splats) => Promise<void> | void;\n onProgress?: (event: ProgressEvent) => void;\n};\n\ntype SplatsInitializationOptions = SplatsOptions & {\n splatArrays?: [Uint32Array, Uint32Array];\n sortCenters?: Float32Array;\n numSplats?: number;\n extra?: Record<string, unknown>;\n};\n\ntype SplatsState = {\n maxSplats: number;\n numSplats: number;\n splatArrays: [Uint32Array, Uint32Array];\n sortCenters: Float32Array;\n extra: Record<string, unknown>;\n sortCentersDirty: boolean;\n};\n\nfunction getInitializationInputs(\n options: SplatsInitializationOptions,\n): string[] {\n const inputs: string[] = [];\n if (options.url !== undefined) inputs.push(\"url\");\n if (options.fileBytes !== undefined) inputs.push(\"fileBytes\");\n if (options.stream !== undefined) inputs.push(\"stream\");\n if (options.splatArrays !== undefined) inputs.push(\"splatArrays\");\n if (options.construct !== undefined) inputs.push(\"construct\");\n return inputs;\n}\n\nfunction validateInitializationInputs(options: SplatsInitializationOptions) {\n const inputs = getInitializationInputs(options);\n if (inputs.length > 1) {\n throw new Error(\n `Splats initialization inputs are mutually exclusive; provide only one of url, fileBytes, stream, splatArrays, or construct (received: ${inputs.join(\", \")})`,\n );\n }\n}\n\nfunction hasFileInput(options: SplatsOptions) {\n return (\n options.url !== undefined ||\n options.fileBytes !== undefined ||\n options.stream !== undefined\n );\n}\n\nfunction createSplatsState(options: SplatsInitializationOptions): SplatsState {\n if (options.splatArrays !== undefined) {\n const [first, second] = options.splatArrays;\n if (first.length !== second.length) {\n throw new Error(\"splatArrays must have the same length\");\n }\n if (first.length % 4 !== 0) {\n throw new Error(\"splatArrays must contain complete four-word records\");\n }\n\n const inputCapacity = first.length / 4;\n const numSplats = options.numSplats ?? inputCapacity;\n if (\n !Number.isSafeInteger(numSplats) ||\n numSplats < 0 ||\n numSplats > inputCapacity\n ) {\n throw new Error(\"numSplats must be an integer within splatArrays\");\n }\n if (\n options.sortCenters !== undefined &&\n options.sortCenters.length < numSplats * 3\n ) {\n throw new Error(\"sortCenters is smaller than numSplats\");\n }\n\n const maxSplats =\n inputCapacity === 0 ? 0 : getTextureSize(inputCapacity).maxSplats;\n let splatArrays = options.splatArrays;\n if (maxSplats !== inputCapacity) {\n splatArrays = [\n new Uint32Array(maxSplats * 4),\n new Uint32Array(maxSplats * 4),\n ];\n splatArrays[0].set(first);\n splatArrays[1].set(second);\n }\n return {\n maxSplats,\n numSplats,\n splatArrays,\n sortCenters: options.sortCenters ?? new Float32Array(0),\n extra: options.extra ?? {},\n sortCentersDirty: options.sortCenters === undefined,\n };\n }\n\n return {\n maxSplats: options.maxSplats ?? 0,\n numSplats: 0,\n splatArrays: [new Uint32Array(0), new Uint32Array(0)],\n sortCenters: new Float32Array(0),\n extra: options.extra ?? {},\n sortCentersDirty: false,\n };\n}\n\n/** A mutable splat source with two 16-byte texture records per splat. */\nexport class Splats {\n maxSplats = 0;\n numSplats = 0;\n private splatArrays: [Uint32Array, Uint32Array] = [\n new Uint32Array(0),\n new Uint32Array(0),\n ];\n private sortCenters: Float32Array = new Float32Array(0);\n private extra: Record<string, unknown> = {};\n\n initialized: Promise<Splats>;\n isInitialized = false;\n\n private textures: [THREE.DataArrayTexture, THREE.DataArrayTexture];\n private shTextures: SplatShTextures = {};\n private updateNeeded = true;\n private sortCentersDirty = false;\n private initializationVersion = 0;\n\n constructor(options: SplatsOptions = {}) {\n this.textures = [Splats.emptyTexture, Splats.emptyTexture];\n this.initialized = Promise.resolve(this);\n this.initialize(options);\n }\n\n initialize(options: SplatsOptions = {}): Promise<Splats> {\n const initializationOptions = options as SplatsInitializationOptions;\n validateInitializationInputs(initializationOptions);\n const isAsync = hasFileInput(options) || options.construct !== undefined;\n const state = createSplatsState(\n isAsync ? { maxSplats: options.maxSplats } : initializationOptions,\n );\n const version = ++this.initializationVersion;\n\n this.isInitialized = false;\n this.commitState(state);\n\n if (isAsync) {\n // Defer construction so initialize() can publish the new promise before a\n // user callback has an opportunity to re-enter initialize().\n this.initialized = Promise.resolve()\n .then(() =>\n version === this.initializationVersion\n ? this.asyncInitialize(options)\n : undefined,\n )\n .then((initialized) => {\n if (!initialized) return this;\n try {\n if (version === this.initializationVersion) {\n this.commitState(initialized.captureState());\n this.isInitialized = true;\n }\n } finally {\n initialized.dispose();\n }\n return this;\n });\n } else {\n this.isInitialized = true;\n this.initialized = Promise.resolve(this);\n }\n\n return this.initialized;\n }\n\n private commitState(state: SplatsState) {\n this.disposeTextures();\n this.maxSplats = state.maxSplats;\n this.numSplats = state.numSplats;\n this.splatArrays = state.splatArrays;\n this.sortCenters = state.sortCenters;\n this.extra = state.extra;\n this.sortCentersDirty = state.sortCentersDirty;\n this.updateNeeded = true;\n }\n\n private captureState(): SplatsState {\n return {\n maxSplats: this.maxSplats,\n numSplats: this.numSplats,\n splatArrays: this.splatArrays,\n sortCenters: this.sortCenters,\n extra: this.extra,\n sortCentersDirty: this.sortCentersDirty,\n };\n }\n\n private async asyncInitialize(options: SplatsOptions): Promise<Splats> {\n if (hasFileInput(options)) {\n const { SplatLoader } = await import(\"./SplatLoader\");\n return new SplatLoader().loadInternalAsync({\n url: options.url,\n fileBytes: options.fileBytes,\n fileType: options.fileType,\n fileName: options.fileName,\n stream: options.stream,\n streamLength: options.streamLength,\n postDecode: options.postDecode,\n onProgress: options.onProgress,\n });\n }\n\n const initialized = new Splats({ maxSplats: options.maxSplats });\n try {\n await options.construct?.(initialized);\n return initialized;\n } catch (error) {\n initialized.dispose();\n throw error;\n }\n }\n\n dispose() {\n this.initializationVersion += 1;\n this.isInitialized = false;\n this.commitState(createSplatsState({}));\n }\n\n private disposeTextures() {\n for (const texture of this.textures ?? []) {\n if (texture !== Splats.emptyTexture) {\n texture.dispose();\n }\n }\n this.textures = [Splats.emptyTexture, Splats.emptyTexture];\n for (const texture of Object.values(this.shTextures ?? {})) {\n texture?.dispose();\n }\n this.shTextures = {};\n }\n\n getNumSplats() {\n return this.numSplats;\n }\n\n getNumSh() {\n return !this.extra.sh1\n ? 0\n : !this.extra.sh2\n ? 1\n : !this.extra.sh3a || !this.extra.sh3b\n ? 2\n : 3;\n }\n\n /** Current retained bytes for encoded Splat, sort-center, and SH arrays. */\n getByteLength() {\n let byteLength =\n this.splatArrays[0].byteLength +\n this.splatArrays[1].byteLength +\n this.sortCenters.byteLength;\n\n for (const value of Object.values(this.extra)) {\n if (ArrayBuffer.isView(value)) {\n byteLength += value.byteLength;\n }\n }\n\n return byteLength;\n }\n\n get needsUpdate() {\n return this.updateNeeded;\n }\n\n set needsUpdate(value: boolean) {\n this.updateNeeded = value;\n if (value) this.sortCentersDirty = true;\n }\n\n private ensureSortCenterCapacity(capacity: number) {\n const requiredValues = capacity * 3;\n if (this.sortCenters.length >= requiredValues) return;\n\n const sortCenters = new Float32Array(requiredValues);\n sortCenters.set(this.sortCenters);\n this.sortCenters = sortCenters;\n }\n\n private ensureShCapacity(degree: number, capacity: number) {\n const numArrays = SH_ARRAY_COUNTS[degree] ?? 0;\n const requiredValues = capacity * 4;\n for (let index = 0; index < numArrays; index += 1) {\n const key = SH_KEYS[index];\n const current = this.extra[key];\n if (current instanceof Uint32Array && current.length >= requiredValues) {\n continue;\n }\n const data = new Uint32Array(requiredValues);\n if (current instanceof Uint32Array) data.set(current);\n this.extra[key] = data;\n }\n }\n\n private ensureSplats(numSplats: number): [Uint32Array, Uint32Array] {\n const currentCapacity = this.splatArrays[0].length / 4;\n const targetSize =\n numSplats <= this.maxSplats\n ? this.maxSplats\n : Math.max(numSplats, 2 * this.maxSplats);\n if (targetSize > currentCapacity) {\n this.maxSplats = getTextureSize(Math.max(1, targetSize)).maxSplats;\n const first = new Uint32Array(this.maxSplats * 4);\n const second = new Uint32Array(this.maxSplats * 4);\n first.set(this.splatArrays[0]);\n second.set(this.splatArrays[1]);\n this.splatArrays = [first, second];\n this.updateNeeded = true;\n }\n const capacity = this.splatArrays[0].length / 4;\n this.ensureSortCenterCapacity(capacity);\n this.ensureShCapacity(this.getNumSh(), capacity);\n return this.splatArrays;\n }\n\n private prepareSplatEncoding(numSplats: number, shDegree: number) {\n const arrays = this.ensureSplats(numSplats);\n this.ensureShCapacity(shDegree, arrays[0].length / 4);\n return {\n arrays,\n splatCenters: new Float32Array(\n arrays[0].buffer,\n arrays[0].byteOffset,\n arrays[0].length,\n ),\n sortCenters: this.getSortCenters(),\n shArrays: shDegree === 0 ? undefined : getSplatShArrays(this.extra),\n };\n }\n\n getSplat(index: number): DecodedSplatWithSh;\n getSplat(index: number, includeSh: true): DecodedSplatWithSh;\n getSplat(index: number, includeSh: false): DecodedSplat;\n getSplat(index: number, includeSh: boolean): DecodedSplat;\n getSplat(index: number, includeSh = true) {\n if (index < 0 || index >= this.numSplats) {\n throw new Error(\"Invalid splat index\");\n }\n const splat = decodeSplat(this.splatArrays, index);\n return includeSh\n ? { ...splat, sh: decodeSplatSh(this.extra, index, this.getNumSh()) }\n : splat;\n }\n\n copySplatRecords(\n firstTarget: Uint32Array,\n secondTarget: Uint32Array,\n sourceStart: number,\n count: number,\n ) {\n const wordStart = sourceStart * 4;\n const wordEnd = wordStart + count * 4;\n firstTarget.set(this.splatArrays[0].subarray(wordStart, wordEnd));\n secondTarget.set(this.splatArrays[1].subarray(wordStart, wordEnd));\n }\n\n setSplats(indices: readonly number[], splats: readonly SplatInput[]) {\n if (indices.length !== splats.length) {\n throw new Error(\"Splat indices and data must have the same length\");\n }\n const count = splats.length;\n if (count === 0) return;\n\n let shDegree = this.getNumSh();\n let maxIndex = -1;\n for (let offset = 0; offset < count; offset += 1) {\n const index = indices[offset];\n validateSplatIndex(index);\n if (index > maxIndex) maxIndex = index;\n const sh = splats[offset].sh;\n if (sh === undefined) continue;\n const degree = getShDegree(sh);\n if (degree > shDegree) shDegree = degree;\n }\n\n const { arrays, splatCenters, sortCenters, shArrays } =\n this.prepareSplatEncoding(maxIndex + 1, shDegree);\n for (let offset = 0; offset < count; offset += 1) {\n encodeSplat(\n arrays,\n splatCenters,\n shArrays,\n sortCenters,\n indices[offset],\n splats[offset],\n );\n }\n if (maxIndex >= this.numSplats) this.numSplats = maxIndex + 1;\n this.updateNeeded = true;\n }\n\n pushSplats(splats: readonly SplatInput[]) {\n const count = splats.length;\n if (count === 0) return;\n\n const startIndex = this.numSplats;\n const endIndex = startIndex + count;\n validateSplatIndex(endIndex - 1);\n\n let shDegree = this.getNumSh();\n for (let offset = 0; offset < count; offset += 1) {\n const sh = splats[offset].sh;\n if (sh === undefined) continue;\n const degree = getShDegree(sh);\n if (degree > shDegree) shDegree = degree;\n }\n\n const { arrays, splatCenters, sortCenters, shArrays } =\n this.prepareSplatEncoding(endIndex, shDegree);\n for (let offset = 0; offset < count; offset += 1) {\n encodeSplat(\n arrays,\n splatCenters,\n shArrays,\n sortCenters,\n startIndex + offset,\n splats[offset],\n );\n }\n this.numSplats = endIndex;\n this.updateNeeded = true;\n }\n\n removeSplats(indices: readonly number[]) {\n if (indices.length === 0) return;\n\n let sortedUnique = true;\n let previousIndex = -1;\n for (const index of indices) {\n validateSplatIndex(index);\n if (index >= this.numSplats) throw new Error(\"Invalid splat index\");\n if (index <= previousIndex) sortedUnique = false;\n previousIndex = index;\n }\n const removedIndices = sortedUnique\n ? indices\n : [...new Set(indices)].sort((left, right) => left - right);\n\n const recordCount = this.numSplats;\n this.ensureShCapacity(this.getNumSh(), this.splatArrays[0].length / 4);\n const sortCenters = this.getSortCenters();\n const recordArrays = [...this.splatArrays];\n for (const key of SH_KEYS) {\n const sh = this.extra[key];\n if (sh instanceof Uint32Array) recordArrays.push(sh);\n }\n\n let targetIndex = removedIndices[0];\n let sourceIndex = targetIndex + 1;\n for (let offset = 1; offset < removedIndices.length; offset += 1) {\n const nextRemoved = removedIndices[offset];\n const count = nextRemoved - sourceIndex;\n if (count > 0) {\n copySplatRange(\n recordArrays,\n sortCenters,\n targetIndex,\n sourceIndex,\n count,\n );\n targetIndex += count;\n }\n sourceIndex = nextRemoved + 1;\n }\n const tailCount = recordCount - sourceIndex;\n if (tailCount > 0) {\n copySplatRange(\n recordArrays,\n sortCenters,\n targetIndex,\n sourceIndex,\n tailCount,\n );\n targetIndex += tailCount;\n }\n for (const data of recordArrays) {\n data.fill(0, targetIndex * 4, recordCount * 4);\n }\n sortCenters.fill(0, targetIndex * 3, recordCount * 3);\n\n this.numSplats = targetIndex;\n this.updateNeeded = true;\n }\n\n private getSortCenters() {\n if (this.sortCentersDirty) this.rebuildSortCenters();\n return this.sortCenters;\n }\n\n copySortCenters(target: Float32Array, targetStart: number, count: number) {\n if (count > this.numSplats || targetStart + count * 3 > target.length) {\n throw new Error(\"Invalid sort center copy range\");\n }\n target.set(this.getSortCenters().subarray(0, count * 3), targetStart);\n }\n\n private rebuildSortCenters() {\n const capacity = this.splatArrays[0].length / 4;\n this.ensureSortCenterCapacity(capacity);\n const [splatA, splatB] = this.splatArrays;\n const centerView = new Float32Array(\n splatA.buffer,\n splatA.byteOffset,\n splatA.length,\n );\n for (let index = 0; index < this.numSplats; index += 1) {\n const i3 = index * 3;\n const i4 = index * 4;\n const disabled =\n splatB[i4 + 1] >>> 16 === 0xfc00 &&\n (splatB[i4 + 2] & 0xffff) === 0xfc00 &&\n splatB[i4 + 2] >>> 16 === 0xfc00;\n this.sortCenters[i3] = disabled ? Number.NaN : centerView[i4];\n this.sortCenters[i3 + 1] = disabled ? Number.NaN : centerView[i4 + 1];\n this.sortCenters[i3 + 2] = disabled ? Number.NaN : centerView[i4 + 2];\n }\n this.sortCentersDirty = false;\n }\n\n forEachCenter(\n callback: (index: number, x: number, y: number, z: number) => void,\n ) {\n const centers = this.getSortCenters();\n for (let index = 0; index < this.numSplats; index += 1) {\n const i3 = index * 3;\n callback(index, centers[i3], centers[i3 + 1], centers[i3 + 2]);\n }\n }\n\n forEachSplat(\n callback: (\n index: number,\n center: THREE.Vector3,\n scales: THREE.Vector3,\n quaternion: THREE.Quaternion,\n opacity: number,\n color: THREE.Color,\n ) => void,\n ) {\n for (let index = 0; index < this.numSplats; index += 1) {\n const splat = decodeSplat(this.splatArrays, index);\n callback(\n index,\n splat.center,\n splat.scales,\n splat.quaternion,\n splat.opacity,\n splat.color,\n );\n }\n }\n\n setTextureUniforms(uniforms: Record<string, THREE.IUniform>) {\n const [splats, splats2] = this.getSplatTextures();\n const sh = this.getShTextures();\n uniforms.sourceSplats.value = splats;\n uniforms.sourceSplats2.value = splats2;\n uniforms.sh1Texture.value = sh.sh1 ?? Splats.emptyTexture;\n uniforms.sh2Texture.value = sh.sh2 ?? Splats.emptyTexture;\n uniforms.sh3TextureA.value = sh.sh3a ?? Splats.emptyTexture;\n uniforms.sh3TextureB.value = sh.sh3b ?? Splats.emptyTexture;\n this.updateNeeded = false;\n }\n\n private getSplatTextures() {\n if (this.maxSplats === 0 || this.splatArrays[0].length === 0) {\n return [Splats.emptyTexture, Splats.emptyTexture] as const;\n }\n\n const { width, height, depth } = getTextureSize(this.maxSplats);\n const textureData = this.textures[0].image.data;\n const incompatible =\n this.textures[0] === Splats.emptyTexture ||\n this.textures[0].image.width !== width ||\n this.textures[0].image.height !== height ||\n this.textures[0].image.depth !== depth ||\n textureData === null ||\n textureData.buffer !== this.splatArrays[0].buffer;\n if (incompatible) {\n this.disposeMainTextures();\n this.textures = [\n newUintArrayTexture(this.splatArrays[0], width, height, depth),\n newUintArrayTexture(this.splatArrays[1], width, height, depth),\n ];\n } else if (this.needsUpdate) {\n this.textures[0].needsUpdate = true;\n this.textures[1].needsUpdate = true;\n }\n return this.textures;\n }\n\n private disposeMainTextures() {\n for (const texture of this.textures) {\n if (texture !== Splats.emptyTexture) {\n texture.dispose();\n }\n }\n this.textures = [Splats.emptyTexture, Splats.emptyTexture];\n }\n\n private getShTextures(): SplatShTextures {\n this.shTextures.sh1 = this.ensureShTexture(\"sh1\", this.shTextures.sh1);\n this.shTextures.sh2 = this.ensureShTexture(\"sh2\", this.shTextures.sh2);\n this.shTextures.sh3a = this.ensureShTexture(\"sh3a\", this.shTextures.sh3a);\n this.shTextures.sh3b = this.ensureShTexture(\"sh3b\", this.shTextures.sh3b);\n return this.shTextures;\n }\n\n private ensureShTexture(\n key: \"sh1\" | \"sh2\" | \"sh3a\" | \"sh3b\",\n current?: THREE.DataArrayTexture,\n ) {\n let texture = current;\n const data = this.extra[key] as Uint32Array | undefined;\n if (!data) {\n texture?.dispose();\n return undefined;\n }\n const { width, height, depth, maxSplats } = getTextureSize(\n Math.max(1, data.length / 4),\n );\n let padded = data;\n if (data.length < maxSplats * 4) {\n padded = new Uint32Array(maxSplats * 4);\n padded.set(data);\n this.extra[key] = padded;\n }\n const incompatible =\n texture &&\n (texture.image.width !== width ||\n texture.image.height !== height ||\n texture.image.depth !== depth ||\n texture.image.data === null ||\n texture.image.data.buffer !== padded.buffer);\n if (incompatible) {\n texture?.dispose();\n texture = undefined;\n }\n if (!texture) {\n texture = newUintArrayTexture(padded, width, height, depth);\n } else if (this.needsUpdate) {\n texture.needsUpdate = true;\n }\n return texture;\n }\n\n static emptyTexture = newUintArrayTexture(new Uint32Array(4), 1, 1, 1);\n}\n\nfunction newUintArrayTexture(\n data: Uint32Array,\n width: number,\n height: number,\n depth: number,\n) {\n const texture = new THREE.DataArrayTexture(data, width, height, depth);\n texture.format = THREE.RGBAIntegerFormat;\n texture.type = THREE.UnsignedIntType;\n texture.internalFormat = \"RGBA32UI\";\n texture.magFilter = THREE.NearestFilter;\n texture.minFilter = THREE.NearestFilter;\n texture.generateMipmaps = false;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction decodeSplatSh(\n extra: Record<string, unknown>,\n index: number,\n degree: number,\n) {\n const count = SH_COUNTS[degree] ?? 0;\n const result = new Array<THREE.Color>(count);\n const base = index * 4;\n for (let coefficient = 0; coefficient < count; coefficient += 1) {\n const data = extra[SH_KEYS[coefficient >> 2]];\n const word =\n data instanceof Uint32Array ? data[base + (coefficient & 3)] : 0;\n result[coefficient] = decodeShColor(word);\n }\n return result;\n}\n\nfunction validateSplatIndex(index: number) {\n if (\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index >= Number.MAX_SAFE_INTEGER\n ) {\n throw new Error(\"Invalid splat index\");\n }\n}\n\nfunction copySplatRange(\n recordArrays: Uint32Array[],\n sortCenters: Float32Array,\n targetIndex: number,\n sourceIndex: number,\n count: number,\n) {\n const target4 = targetIndex * 4;\n const source4 = sourceIndex * 4;\n const count4 = count * 4;\n for (const data of recordArrays) {\n data.copyWithin(target4, source4, source4 + count4);\n }\n const target3 = targetIndex * 3;\n const source3 = sourceIndex * 3;\n sortCenters.copyWithin(target3, source3, source3 + count * 3);\n}\n\nfunction encodeSplat(\n splatArrays: [Uint32Array, Uint32Array],\n splatCenters: Float32Array,\n shArrays: SplatShArrays | undefined,\n sortCenters: Float32Array,\n index: number,\n splat: SplatInput,\n) {\n const i4 = index * 4;\n const [splatA, splatB] = splatArrays;\n const { center, scales, quaternion, opacity, color } = splat;\n splatCenters[i4] = center.x;\n splatCenters[i4 + 1] = center.y;\n splatCenters[i4 + 2] = center.z;\n splatA[i4 + 3] = encodeSplatOpacity(opacity);\n splatB[i4] = toHalf(color.r) | (toHalf(color.g) << 16);\n splatB[i4 + 1] = toHalf(color.b) | (toHalf(Math.log(scales.x)) << 16);\n splatB[i4 + 2] =\n toHalf(Math.log(scales.y)) | (toHalf(Math.log(scales.z)) << 16);\n splatB[i4 + 3] = encodeQuatOctXy1010R12(\n quaternion.x,\n quaternion.y,\n quaternion.z,\n quaternion.w,\n );\n if (shArrays) encodeSplatSh(shArrays, index, splat.sh);\n\n const i3 = index * 3;\n const disabled = scales.x === 0 && scales.y === 0 && scales.z === 0;\n sortCenters[i3] = disabled ? Number.NaN : center.x;\n sortCenters[i3 + 1] = disabled ? Number.NaN : center.y;\n sortCenters[i3 + 2] = disabled ? Number.NaN : center.z;\n}\n\nfunction getShDegree(sh?: readonly THREE.Color[]) {\n const count = sh?.length ?? 0;\n switch (count) {\n case 0:\n return 0;\n case 3:\n return 1;\n case 8:\n return 2;\n case 15:\n return 3;\n default:\n throw new Error(\"SH must contain 0, 3, 8, or 15 coefficients\");\n }\n}\n\nfunction getSplatShArrays(extra: Record<string, unknown>): SplatShArrays {\n const sh1 = extra.sh1;\n const sh2 = extra.sh2;\n const sh3a = extra.sh3a;\n const sh3b = extra.sh3b;\n return [\n sh1 instanceof Uint32Array ? sh1 : undefined,\n sh2 instanceof Uint32Array ? sh2 : undefined,\n sh3a instanceof Uint32Array ? sh3a : undefined,\n sh3b instanceof Uint32Array ? sh3b : undefined,\n ];\n}\n\nfunction encodeSplatSh(\n shArrays: SplatShArrays,\n index: number,\n sh?: readonly THREE.Color[],\n) {\n const base = index * 4;\n for (let arrayIndex = 0; arrayIndex < shArrays.length; arrayIndex += 1) {\n const data = shArrays[arrayIndex];\n if (!data) continue;\n data[base] = 0;\n data[base + 1] = 0;\n data[base + 2] = 0;\n data[base + 3] = 0;\n }\n if (!sh) return;\n\n for (let coefficient = 0; coefficient < sh.length; coefficient += 1) {\n const data = shArrays[coefficient >> 2];\n if (!data) continue;\n data[base + (coefficient & 3)] = encodeShColor(sh[coefficient]);\n }\n}\n\nfunction encodeShColor(color: THREE.Color) {\n const maxAbs = Math.max(\n Math.abs(color.r),\n Math.abs(color.g),\n Math.abs(color.b),\n );\n const exponent = Math.round(\n Math.min(31, Math.max(0, Math.floor(Math.log2(maxAbs)) + 15)),\n );\n const divisor = 2 ** (exponent - 15) / 255;\n const encodedR = Math.round(\n Math.min(255, Math.max(0, Math.abs(color.r) / divisor)),\n );\n const encodedG = Math.round(\n Math.min(255, Math.max(0, Math.abs(color.g) / divisor)),\n );\n const encodedB = Math.round(\n Math.min(255, Math.max(0, Math.abs(color.b) / divisor)),\n );\n const signs =\n (color.r < 0 ? 1 : 0) | (color.g < 0 ? 2 : 0) | (color.b < 0 ? 4 : 0);\n return (\n encodedR |\n (encodedG << 8) |\n (encodedB << 16) |\n (((exponent << 3) | signs) << 24)\n );\n}\n\nfunction decodeShColor(word: number) {\n const exponentAndSigns = word >>> 24;\n const multiplier = 2 ** ((exponentAndSigns >>> 3) - 15) / 255;\n let r = (word & 0xff) * multiplier;\n let g = ((word >>> 8) & 0xff) * multiplier;\n let b = ((word >>> 16) & 0xff) * multiplier;\n if (exponentAndSigns & 1) r = -r;\n if (exponentAndSigns & 2) g = -g;\n if (exponentAndSigns & 4) b = -b;\n return new THREE.Color(r, g, b);\n}\n","function b64ToUint6(nChr) {\n return nChr > 64 && nChr < 91\n ? nChr - 65\n : nChr > 96 && nChr < 123\n ? nChr - 71\n : nChr > 47 && nChr < 58\n ? nChr + 4\n : nChr === 43\n ? 62\n : nChr === 47\n ? 63\n : 0\n}\n\nfunction base64ToUint8(sBase64, nBlocksSize) {\n const sB64Enc = sBase64.replace(/[^A-Za-z0-9+/]/g, \"\")\n const nInLen = sB64Enc.length\n const nOutLen = nBlocksSize\n ? Math.ceil(((nInLen * 3 + 1) >> 2) / nBlocksSize) * nBlocksSize\n : (nInLen * 3 + 1) >> 2\n const taBytes = new Uint8Array(nOutLen)\n\n let nMod3\n let nMod4\n let nUint24 = 0\n let nOutIdx = 0\n for (let nInIdx = 0; nInIdx < nInLen; nInIdx++) {\n nMod4 = nInIdx & 3\n nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (6 * (3 - nMod4))\n if (nMod4 === 3 || nInLen - nInIdx === 1) {\n nMod3 = 0\n while (nMod3 < 3 && nOutIdx < nOutLen) {\n taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255\n nMod3++\n nOutIdx++\n }\n nUint24 = 0\n }\n }\n\n return taBytes\n}\nfunction toUint8(b64) {\n if (typeof Uint8Array.fromBase64 === \"function\") return Uint8Array.fromBase64(b64)\n let bin = atob(b64)\n let len = bin.length\n let bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = bin.charCodeAt(i)\n }\n return bytes\n}\n\nconst decode64 = typeof atob === \"function\" ? toUint8 : base64ToUint8\n\nexport default decode64\n","import initWasm from \"gaussian-splat-rs\";\nimport wasmBytes from \"gaussian-splat-rs/gaussian_splat_rs_bg.wasm?arraybuffer&base64\";\n\nexport const WASM_MODULE = WebAssembly.compile(wasmBytes);\n\nlet initialized = false;\n\n/** Initializes the main-thread WASM instance used by raycasting. */\ninitWasm({ module_or_path: WASM_MODULE }).then(() => {\n initialized = true;\n});\n\nexport function isInitialized() {\n return initialized;\n}\n","import * as THREE from \"three\";\n\nimport {\n get_raycast_buffer,\n get_raycast_buffer2,\n raycast_splat_buffers,\n} from \"gaussian-splat-rs\";\nimport { SplatEdit, SplatEditSdf, SplatEdits } from \"./SplatEdit\";\nimport { type SplatInput, Splats } from \"./Splats\";\nimport type { SplatFileType } from \"./defines\";\nimport type { SplatPostDecodeProgram } from \"./postDecode\";\nimport * as wasm from \"./wasm\";\n\nconst raycastWorldToMesh = new THREE.Matrix4();\nconst raycastDirectionMatrix = new THREE.Matrix3();\nconst raycastOrigin = new THREE.Vector3();\nconst raycastDirection = new THREE.Vector3();\n\nexport type SplatMeshOptions = {\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n /** Optional stream byte-length estimate used for progress reporting. */\n streamLength?: number;\n /** Declarative per-splat transform executed in the decode worker. */\n postDecode?: SplatPostDecodeProgram;\n splats?: Splats;\n maxSplats?: number;\n constructSplats?: (splats: Splats) => Promise<void> | void;\n onProgress?: (event: ProgressEvent) => void;\n onLoad?: (mesh: SplatMesh) => Promise<void> | void;\n editable?: boolean;\n raycastable?: boolean;\n minRaycastOpacity?: number;\n onFrame?: (context: {\n mesh: SplatMesh;\n time: number;\n deltaTime: number;\n }) => void;\n};\n\nexport type SplatMeshFrameContext = {\n time: number;\n deltaTime: number;\n camera: THREE.Camera;\n globalEdits: SplatEdit[];\n};\n\nfunction validateSplatMeshInitializationInputs(options: SplatMeshOptions) {\n const inputs: string[] = [];\n if (options.url !== undefined) inputs.push(\"url\");\n if (options.fileBytes !== undefined) inputs.push(\"fileBytes\");\n if (options.stream !== undefined) inputs.push(\"stream\");\n if (options.splats !== undefined) inputs.push(\"splats\");\n if (options.constructSplats !== undefined) inputs.push(\"constructSplats\");\n if (inputs.length > 1) {\n throw new Error(\n `SplatMesh initialization inputs are mutually exclusive; provide only one of url, fileBytes, stream, splats, or constructSplats (received: ${inputs.join(\", \")})`,\n );\n }\n}\n\n/** A scene object backed by a fixed encoded splat source and RGBA SDF edits. */\nexport class SplatMesh extends THREE.Object3D {\n initialized: Promise<SplatMesh>;\n isInitialized = false;\n\n splats?: Splats;\n\n numSplats = 0;\n recolor = new THREE.Color(1, 1, 1);\n opacity = 1;\n maxSh = 3;\n\n edits: SplatEdit[] | null = null;\n editable: boolean;\n raycastable: boolean;\n minRaycastOpacity: number;\n sdfEdits: SplatEdits | null = null;\n\n onFrame?: SplatMeshOptions[\"onFrame\"];\n\n version = 0;\n sortVersion = 0;\n centerVersion = 0;\n mappingVersion = 0;\n\n private lastSplats?: Splats;\n private lastNumSplats = -1;\n private lastMaxSh = -1;\n private lastMatrixWorld = new THREE.Matrix4();\n private hasLastMatrixWorld = false;\n private lastRecolor = new THREE.Vector4().setScalar(Number.NaN);\n private viewOrigin = new THREE.Vector3();\n private lastViewOrigin = new THREE.Vector3().setScalar(Number.NaN);\n private sdfCoordinateOrigin = new THREE.Vector3();\n\n constructor(options: SplatMeshOptions = {}) {\n super();\n\n if (options.splats && !(options.splats instanceof Splats)) {\n throw new TypeError(\"SplatMesh splats must be a Splats instance\");\n }\n validateSplatMeshInitializationInputs(options);\n this.splats =\n options.splats ??\n new Splats({\n url: options.url,\n fileBytes: options.fileBytes,\n fileType: options.fileType,\n fileName: options.fileName,\n stream: options.stream,\n streamLength: options.streamLength,\n postDecode: options.postDecode,\n maxSplats: options.maxSplats,\n construct: options.constructSplats,\n onProgress: options.onProgress,\n });\n\n this.numSplats = this.splats.getNumSplats();\n this.editable = options.editable ?? true;\n this.raycastable = options.raycastable ?? true;\n this.minRaycastOpacity = options.minRaycastOpacity ?? 0.05;\n this.onFrame = options.onFrame;\n\n if (!this.splats.isInitialized) {\n this.initialized = this.splats.initialized.then(async () => {\n this.numSplats = this.splats?.getNumSplats() ?? 0;\n this.updateMappingVersion();\n this.isInitialized = true;\n await options.onLoad?.(this);\n return this;\n });\n } else {\n this.isInitialized = true;\n const maybePromise = options.onLoad?.(this);\n this.initialized =\n maybePromise instanceof Promise\n ? maybePromise.then(() => this)\n : Promise.resolve(this);\n }\n }\n\n pushSplats(splats: readonly SplatInput[]) {\n if (!this.splats) {\n throw new Error(\"Cannot push Splats after SplatMesh is disposed\");\n }\n this.splats.pushSplats(splats);\n this.numSplats = this.splats.getNumSplats();\n }\n\n setSplats(indices: readonly number[], splats: readonly SplatInput[]) {\n if (!this.splats) {\n throw new Error(\"Cannot set Splats after SplatMesh is disposed\");\n }\n this.splats.setSplats(indices, splats);\n this.numSplats = this.splats.getNumSplats();\n }\n\n removeSplats(indices: readonly number[]) {\n if (!this.splats) {\n throw new Error(\"Cannot remove Splats after SplatMesh is disposed\");\n }\n this.splats.removeSplats(indices);\n this.numSplats = this.splats.getNumSplats();\n }\n\n forEachSplat(\n callback: (\n index: number,\n center: THREE.Vector3,\n scales: THREE.Vector3,\n quaternion: THREE.Quaternion,\n opacity: number,\n color: THREE.Color,\n ) => void,\n ) {\n this.splats?.forEachSplat(callback);\n }\n\n dispose() {\n // @ts-ignore Object base class has a dispose method in Three.js >= r186\n super.dispose?.();\n\n this.sdfEdits?.dispose();\n this.sdfEdits = null;\n this.splats?.dispose();\n this.splats = undefined;\n }\n\n getBoundingBox(centersOnly = true) {\n if (!this.isInitialized) {\n throw new Error(\n \"Cannot get bounding box before SplatMesh is initialized\",\n );\n }\n const minimum = new THREE.Vector3().setScalar(Number.POSITIVE_INFINITY);\n const maximum = new THREE.Vector3().setScalar(Number.NEGATIVE_INFINITY);\n const corner = new THREE.Vector3();\n\n if (centersOnly) {\n this.splats?.forEachCenter((_index, x, y, z) => {\n if (Number.isNaN(x)) return;\n corner.set(x, y, z);\n minimum.min(corner);\n maximum.max(corner);\n });\n return new THREE.Box3(minimum, maximum);\n }\n\n const signs = [-1, 1];\n this.splats?.forEachSplat((_index, center, scales, quaternion) => {\n for (const x of signs) {\n for (const y of signs) {\n for (const z of signs) {\n corner\n .set(x * scales.x, y * scales.y, z * scales.z)\n .applyQuaternion(quaternion)\n .add(center);\n minimum.min(corner);\n maximum.max(corner);\n }\n }\n }\n });\n return new THREE.Box3(minimum, maximum);\n }\n\n frameUpdate({ time, deltaTime, camera, globalEdits }: SplatMeshFrameContext) {\n this.onFrame?.({ mesh: this, time, deltaTime });\n\n const source = this.splats;\n if (!source) {\n return;\n }\n this.splats = source;\n\n let updated = false;\n let centersUpdated = false;\n let transformUpdated = false;\n const count = source.getNumSplats();\n if (source !== this.lastSplats) {\n this.lastSplats = source;\n updated = true;\n centersUpdated = true;\n }\n if (count !== this.lastNumSplats) {\n this.lastNumSplats = count;\n this.numSplats = count;\n this.mappingVersion += 1;\n updated = true;\n centersUpdated = true;\n }\n if (source.needsUpdate) {\n updated = true;\n centersUpdated = true;\n }\n if (this.maxSh !== this.lastMaxSh) {\n this.lastMaxSh = this.maxSh;\n updated = true;\n }\n if (this.maxSh > 0 && source.getNumSh() > 0) {\n camera.getWorldPosition(this.viewOrigin);\n if (!this.viewOrigin.equals(this.lastViewOrigin)) {\n this.lastViewOrigin.copy(this.viewOrigin);\n // Directional SH changes appearance but never changes splat depth.\n updated = true;\n }\n }\n\n this.updateWorldMatrix(true, false);\n if (\n !this.hasLastMatrixWorld ||\n !this.lastMatrixWorld.equals(this.matrixWorld)\n ) {\n this.lastMatrixWorld.copy(this.matrixWorld);\n this.hasLastMatrixWorld = true;\n updated = true;\n transformUpdated = true;\n }\n\n const recolor = new THREE.Vector4(\n this.recolor.r,\n this.recolor.g,\n this.recolor.b,\n THREE.MathUtils.clamp(this.opacity, 0, 1),\n );\n if (!recolor.equals(this.lastRecolor)) {\n this.lastRecolor.copy(recolor);\n updated = true;\n }\n\n const edits = new Set<SplatEdit>();\n if (this.editable) {\n for (const edit of globalEdits) edits.add(edit);\n if (this.edits) {\n for (const edit of this.edits) edits.add(edit);\n } else {\n this.traverseVisible((node) => {\n if (node instanceof SplatEdit) edits.add(node);\n });\n }\n }\n const orderedEdits = Array.from(edits).sort(\n (left, right) => left.ordering - right.ordering,\n );\n const groups = orderedEdits.map((edit) => {\n if (edit.sdfs) return { edit, sdfs: edit.sdfs };\n const sdfs: SplatEditSdf[] = [];\n edit.traverseVisible((node) => {\n if (node instanceof SplatEditSdf) sdfs.push(node);\n });\n return { edit, sdfs };\n });\n\n if (groups.length > 0 && !this.sdfEdits) {\n this.sdfEdits = new SplatEdits({\n maxEdits: groups.length,\n maxSdfs: groups.reduce((total, group) => total + group.sdfs.length, 0),\n });\n updated = true;\n }\n const sdfCoordinateOrigin = this.sdfCoordinateOrigin.setFromMatrixPosition(\n this.matrixWorld,\n );\n if (this.sdfEdits?.update(groups, sdfCoordinateOrigin).updated) {\n // RGBA-only SDF changes preserve centers and their existing sort order.\n updated = true;\n }\n\n if (updated) {\n this.version += 1;\n if (centersUpdated || transformUpdated) this.sortVersion += 1;\n if (centersUpdated) this.centerVersion += 1;\n }\n }\n\n updateVersion({ sort = true }: { sort?: boolean } = {}) {\n this.version += 1;\n if (sort) {\n this.sortVersion += 1;\n this.centerVersion += 1;\n }\n }\n\n updateMappingVersion() {\n this.mappingVersion += 1;\n this.updateVersion();\n }\n\n set needsUpdate(value: boolean) {\n if (value) this.updateVersion();\n }\n\n raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) {\n if (!wasm.isInitialized() || !this.raycastable || !this.splats) {\n return;\n }\n\n const { near, far, ray } = raycaster;\n if (\n this.numSplats === 0 ||\n !Number.isFinite(this.minRaycastOpacity) ||\n this.minRaycastOpacity >= 1 ||\n near > far\n ) {\n return;\n }\n const worldToMesh = raycastWorldToMesh.copy(this.matrixWorld).invert();\n const origin = raycastOrigin.copy(ray.origin).applyMatrix4(worldToMesh);\n const direction = raycastDirection\n .copy(ray.direction)\n .applyMatrix3(raycastDirectionMatrix.setFromMatrix4(worldToMesh));\n const buffer = get_raycast_buffer();\n const buffer2 = get_raycast_buffer2();\n const capacity = buffer.length / 4;\n\n for (let base = 0; base < this.numSplats; base += capacity) {\n const count = Math.min(capacity, this.numSplats - base);\n this.splats.copySplatRecords(buffer, buffer2, base, count);\n const distances = raycast_splat_buffers(\n origin.x,\n origin.y,\n origin.z,\n direction.x,\n direction.y,\n direction.z,\n this.minRaycastOpacity,\n near,\n far,\n count,\n );\n\n for (let index = 0; index < distances.length; index += 1) {\n const distance = distances[index];\n intersects.push({\n distance,\n point: ray.at(distance, new THREE.Vector3()),\n object: this,\n });\n }\n }\n }\n}\n","const uint SPLAT_TEX_WIDTH_BITS = 11u;\nconst uint SPLAT_TEX_HEIGHT_BITS = 11u;\nconst uint SPLAT_TEX_LAYER_BITS = SPLAT_TEX_WIDTH_BITS + SPLAT_TEX_HEIGHT_BITS;\n\nconst uint SPLAT_TEX_WIDTH = 1u << SPLAT_TEX_WIDTH_BITS;\nconst uint SPLAT_TEX_HEIGHT = 1u << SPLAT_TEX_HEIGHT_BITS;\n\nconst uint SPLAT_TEX_WIDTH_MASK = SPLAT_TEX_WIDTH - 1u;\nconst uint SPLAT_TEX_HEIGHT_MASK = SPLAT_TEX_HEIGHT - 1u;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nconst float INFINITY = 1.0 / 0.0;\n\nvec3 srgbToLinear(vec3 rgb) {\n return pow(rgb, vec3(2.2));\n}\n\nuint encodeQuatOctXy1010R12(vec4 q) {\n // Ensure minimal representation: flip if q.w is negative.\n if (q.w < 0.0) {\n q = -q;\n }\n // Compute rotation angle: θ = 2 * acos(q.w) ∈ [0,π]\n float theta = 2.0 * acos(clamp(q.w, 0.0, 1.0));\n\n // --- Folded Octahedral Mapping (inline) ---\n // q.xyz = axis * sin(theta / 2). The common sine factor cancels during\n // octahedral normalization, so the rotation axis need not be recovered.\n float sum = abs(q.x) + abs(q.y) + abs(q.z);\n // Use the canonical +X axis when the vector part is too small to project.\n vec2 p = (sum < 1e-6) ? vec2(1.0, 0.0) : q.xy / sum;\n // Fold the lower hemisphere.\n if (q.z < 0.0) {\n float oldPx = p.x;\n p.x = (1.0 - abs(p.y)) * (p.x >= 0.0 ? 1.0 : -1.0);\n p.y = (1.0 - abs(oldPx)) * (p.y >= 0.0 ? 1.0 : -1.0);\n }\n // Remap from [-1,1] to [0,1]\n float u_f = p.x * 0.5 + 0.5;\n float v_f = p.y * 0.5 + 0.5;\n // Quantize to 10 bits (0 to 1023)\n uint quantU = uint(clamp(round(u_f * 1023.0), 0.0, 1023.0));\n uint quantV = uint(clamp(round(v_f * 1023.0), 0.0, 1023.0));\n \n // --- Angle Quantization ---\n // Quantize θ ∈ [0,π] to 12 bits (0 to 4095)\n uint angleInt = uint(clamp(round((theta / PI) * 4095.0), 0.0, 4095.0));\n \n // Pack bits: bits [0–9]: quantU, [10–19]: quantV, [20–31]: angleInt.\n return (angleInt << 20u) | (quantV << 10u) | quantU;\n}\n\nvec4 decodeQuatOctXy1010R12(uint encoded) {\n // Extract the fields.\n uint quantU = encoded & uint(0x3FFu); // bits 0–9\n uint quantV = (encoded >> 10u) & uint(0x3FFu); // bits 10–19\n uint angleInt = encoded >> 20u; // bits 20–31\n\n // Recover u and v in [0,1], then map to [-1,1].\n float u_f = float(quantU) / 1023.0;\n float v_f = float(quantV) / 1023.0;\n vec2 f = vec2(u_f * 2.0 - 1.0, v_f * 2.0 - 1.0);\n\n vec3 axis = vec3(f.xy, 1.0 - abs(f.x) - abs(f.y));\n float t = max(-axis.z, 0.0);\n axis.x += (axis.x >= 0.0) ? -t : t;\n axis.y += (axis.y >= 0.0) ? -t : t;\n axis = normalize(axis);\n \n // Decode the angle θ ∈ [0,π].\n float theta = (float(angleInt) / 4095.0) * PI;\n float halfTheta = theta * 0.5;\n float s = sin(halfTheta);\n float w = cos(halfTheta);\n \n return vec4(axis * s, w);\n}\n\nvec3 decodeSplatCenter(uvec4 splatData) {\n return vec3(\n uintBitsToFloat(splatData.x),\n uintBitsToFloat(splatData.y),\n uintBitsToFloat(splatData.z)\n );\n}\n\n// Encode a Splat whose scale is already logarithmic into the standard\n// two-record representation. The first record's final word stores alpha and\n// special-kernel shape amount as float16.\nvoid encodeSplatLnScale(\n out uvec4 splatData, out uvec4 splatData2,\n vec3 center, vec3 lnScales, vec4 quaternion, vec4 rgba, float shapeAmount\n) {\n splatData.x = floatBitsToUint(center.x);\n splatData.y = floatBitsToUint(center.y);\n splatData.z = floatBitsToUint(center.z);\n splatData.w = packHalf2x16(clamp(vec2(rgba.a, shapeAmount), 0.0, 1.0));\n\n splatData2.x = packHalf2x16(rgba.rg);\n splatData2.y = packHalf2x16(vec2(rgba.b, lnScales.x));\n splatData2.z = packHalf2x16(lnScales.yz);\n splatData2.w = encodeQuatOctXy1010R12(quaternion);\n}\n\nvec2 decodeSplatAlphaShapeAmount(uvec4 splatData) {\n return unpackHalf2x16(splatData.w);\n}\n\nvoid decodeSplatAttributesLnScale(\n uvec4 splatData2,\n float alpha,\n out vec3 lnScales, out vec4 quaternion, out vec4 rgba\n) {\n rgba.a = alpha;\n\n rgba.rg = unpackHalf2x16(splatData2.x);\n vec2 split = unpackHalf2x16(splatData2.y);\n rgba.b = split.x;\n lnScales.x = split.y;\n lnScales.yz = unpackHalf2x16(splatData2.z);\n quaternion = decodeQuatOctXy1010R12(splatData2.w);\n}\n\nvec3 decodeSplatShRgb(uint encoded) {\n uint biasedBase = (encoded >> 27u) & 0x1fu;\n // Re-bias the exponent from the packed bias of 15 to float32's bias of 127,\n // then construct the exact power of two directly (127 - 15 = 112).\n float divisor = uintBitsToFloat((biasedBase + 112u) << 23u) / 255.0;\n\n vec3 rgb = vec3(uvec3(encoded & 0xffu, (encoded >> 8u) & 0xffu, (encoded >> 16u) & 0xffu));\n rgb *= divisor;\n\n return vec3(\n ((encoded & 0x1000000u) != 0u) ? -rgb.r : rgb.r,\n ((encoded & 0x2000000u) != 0u) ? -rgb.g : rgb.g,\n ((encoded & 0x4000000u) != 0u) ? -rgb.b : rgb.b\n );\n}\n\n// Rotate vector v by quaternion q\nvec3 quatVec(vec4 q, vec3 v) {\n // Rotate vector v by quaternion q\n vec3 t = 2.0 * cross(q.xyz, v);\n return v + q.w * t + cross(q.xyz, t);\n}\n\n// Apply quaternion q1 after quaternion q2\nvec4 quatQuat(vec4 q1, vec4 q2) {\n return vec4(\n q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,\n q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x,\n q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w,\n q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n );\n}\n\nmat3 scaleQuaternionToMatrix(vec3 s, vec4 q) {\n // Compute the matrix of scaling by s then rotating by q\n return mat3(\n s.x * (1.0 - 2.0 * (q.y * q.y + q.z * q.z)),\n s.x * (2.0 * (q.x * q.y + q.w * q.z)),\n s.x * (2.0 * (q.x * q.z - q.w * q.y)),\n s.y * (2.0 * (q.x * q.y - q.w * q.z)),\n s.y * (1.0 - 2.0 * (q.x * q.x + q.z * q.z)),\n s.y * (2.0 * (q.y * q.z + q.w * q.x)),\n s.z * (2.0 * (q.x * q.z + q.w * q.y)),\n s.z * (2.0 * (q.y * q.z - q.w * q.x)),\n s.z * (1.0 - 2.0 * (q.x * q.x + q.y * q.y))\n );\n}\n\nivec3 splatTexCoord(int index) {\n uint x = uint(index) & SPLAT_TEX_WIDTH_MASK;\n uint y = (uint(index) >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK;\n uint z = uint(index) >> SPLAT_TEX_LAYER_BITS;\n return ivec3(x, y, z);\n}\n","\nprecision highp float;\nprecision highp int;\n\n#include <splatDefines>\n\nuniform float near;\nuniform float far;\nuniform bool encodeLinear;\nuniform float time;\nuniform bool debugFlag;\nuniform float minAlpha;\n\nout vec4 fragColor;\n\nin vec4 vRgba;\nin vec2 vSplatUv;\nin vec3 vNdc;\nflat in uint vSplatIndex;\nflat in float vSupportRadiusSquared;\nflat in float vKernelPower;\n\n#include <logdepthbuf_pars_fragment>\n\nvoid main() {\n vec4 rgba = vRgba;\n\n float z2 = dot(vSplatUv, vSplatUv);\n if (z2 > vSupportRadiusSquared) {\n discard;\n }\n\n float kernelAlpha = exp(-0.5 * z2);\n if (vKernelPower != 0.0) {\n kernelAlpha = 1.0 - pow(1.0 - kernelAlpha, vKernelPower);\n }\n rgba.a *= kernelAlpha;\n\n if (rgba.a < minAlpha) {\n discard;\n }\n if (encodeLinear) {\n rgba.rgb = srgbToLinear(rgba.rgb);\n }\n\n #ifdef PREMULTIPLIED_ALPHA\n fragColor = vec4(rgba.rgb * rgba.a, rgba.a);\n #else\n fragColor = rgba;\n #endif\n\n #include <logdepthbuf_fragment>\n}\n","\nprecision highp float;\nprecision highp int;\nprecision highp usampler2DArray;\n\n#include <splatDefines>\n\nout vec4 vRgba;\nout vec2 vSplatUv;\nout vec3 vNdc;\nflat out uint vSplatIndex;\nflat out float vSupportRadiusSquared;\nflat out float vKernelPower;\n\n// uniform uint numSplats;\nuniform vec2 renderSize;\nuniform vec4 renderToViewQuat;\nuniform vec3 renderToViewPos;\n// Uniform scale of the render-to-view transform (1.0 unless the camera is scaled)\nuniform float renderToViewScale;\nuniform float maxStdDev;\nuniform float minPixelRadius;\nuniform float maxPixelRadius;\nuniform float time;\nuniform float deltaTime;\nuniform bool debugFlag;\nuniform float minAlpha;\nuniform bool enable2DGS;\nuniform float blurAmount;\nuniform float preBlurAmount;\nuniform float clipXY;\nuniform float focalAdjustment;\n\nuniform usampler2D ordering;\nuniform usampler2DArray splats;\nuniform usampler2DArray splats2;\n\n// Required by logdepthbuf_pars_vertex (normally defined in three.js #include <common>)\nbool isPerspectiveMatrix( mat4 m ) {\n return m[ 2 ][ 3 ] == -1.0;\n}\n\n#include <logdepthbuf_pars_vertex>\n\nfloat gaussianSupportRadius(float alpha, float maximumRadius) {\n if (minAlpha <= 0.0) return maximumRadius;\n float radiusSquared = 2.0 * log(alpha / minAlpha);\n return min(maximumRadius, sqrt(max(0.0, radiusSquared)));\n}\n\nvoid main() {\n // Default to outside the frustum so it's discarded if we return early\n gl_Position = vec4(0.0, 0.0, 2.0, 1.0);\n\n ivec2 orderingCoord = ivec2((gl_InstanceID >> 2) & 4095, gl_InstanceID >> 14);\n uint splatIndex = texelFetch(ordering, orderingCoord, 0)[gl_InstanceID & 3];\n if (splatIndex == 0xffffffffu) {\n // Special value reserved for \"no splat\"\n return;\n }\n\n ivec3 texCoord = splatTexCoord(int(splatIndex));\n uvec4 splat1 = texelFetch(splats, texCoord, 0);\n vec2 alphaShapeAmount = decodeSplatAlphaShapeAmount(splat1);\n float alpha = alphaShapeAmount.x;\n if ((alpha == 0.0) || (alpha < minAlpha)) {\n return;\n }\n vec3 center = decodeSplatCenter(splat1);\n // Compute the view space center of the splat\n vec3 viewCenter = renderToViewScale * quatVec(renderToViewQuat, center) + renderToViewPos;\n\n // Discard splats behind the camera\n if (viewCenter.z >= 0.0) {\n return;\n }\n\n // Compute the clip space center of the splat\n vec4 clipCenter = projectionMatrix * vec4(viewCenter, 1.0);\n\n // Discard splats outside near/far planes\n if (abs(clipCenter.z) >= clipCenter.w) {\n return;\n }\n\n // Discard splats more than clipXY times outside the XY frustum\n float clip = clipXY * clipCenter.w;\n if (abs(clipCenter.x) > clip || abs(clipCenter.y) > clip) {\n return;\n }\n\n // The second record is only needed by splats whose centers survive the\n // view-frustum checks above.\n vec3 lnScales;\n vec4 quaternion, rgba;\n uvec4 splat2 = texelFetch(splats2, texCoord, 0);\n decodeSplatAttributesLnScale(splat2, alpha, lnScales, quaternion, rgba);\n vec3 scales = exp(lnScales);\n bvec3 zeroScales = equal(scales, vec3(0.0));\n if (all(zeroScales)) {\n return;\n }\n\n // Match the reference 3DGS rasterizer by clamping SH-evaluated RGB positive.\n rgba.rgb = max(rgba.rgb, vec3(0.0));\n\n // Decode the shape amount independently from mesh/SDF opacity, which\n // remains in the main splat's alpha.\n float kernelShape = 1.0 + 4.0 * min(alphaShapeAmount.y, 1.0);\n // Zero marks the ordinary Gaussian path; wider kernels reuse this power\n // for every covered fragment.\n float kernelPower = 0.0;\n if (kernelShape > 1.0) {\n kernelPower = exp(\n (kernelShape * kernelShape - 1.0) / 2.718281828459045\n );\n }\n vKernelPower = kernelPower;\n\n // Expand wider shape kernels until alpha is nearly zero before clipping.\n float maximumSupportRadius = maxStdDev\n + 0.7 * max(kernelShape - 1.0, 0.0);\n float supportRadius = maximumSupportRadius;\n\n scales *= renderToViewScale;\n\n vRgba = vec4(rgba.rgb, alpha);\n\n // Record the splat index for entropy\n vSplatIndex = splatIndex;\n\n // Compute view space quaternion of splat\n vec4 viewQuaternion = quatQuat(renderToViewQuat, quaternion);\n\n if (enable2DGS && any(zeroScales)) {\n if (kernelPower == 0.0) {\n supportRadius = gaussianSupportRadius(alpha, supportRadius);\n }\n vSupportRadiusSquared = supportRadius * supportRadius;\n vSplatUv = position.xy * supportRadius;\n\n vec3 offset;\n if (zeroScales.z) {\n offset = vec3(vSplatUv.xy * scales.xy, 0.0);\n } else if (zeroScales.y) {\n offset = vec3(vSplatUv.x * scales.x, 0.0, vSplatUv.y * scales.z);\n } else {\n offset = vec3(0.0, vSplatUv.xy * scales.yz);\n }\n\n vec3 viewPos = viewCenter + quatVec(viewQuaternion, offset);\n gl_Position = projectionMatrix * vec4(viewPos, 1.0);\n vNdc = gl_Position.xyz / gl_Position.w;\n\n #include <logdepthbuf_vertex>\n return;\n }\n\n // Compute the scaled rotation basis of the splat.\n mat3 RS = scaleQuaternionToMatrix(scales, viewQuaternion);\n\n // Compute the two relevant columns of the projection Jacobian.\n vec2 scaledRenderSize = renderSize * focalAdjustment;\n vec2 focal = 0.5 * scaledRenderSize * vec2(projectionMatrix[0][0], projectionMatrix[1][1]);\n\n vec3 j0;\n vec3 j1;\n if (isOrthographic) {\n j0 = vec3(focal.x, 0.0, 0.0);\n j1 = vec3(0.0, focal.y, 0.0);\n } else {\n float invZ = 1.0 / viewCenter.z;\n vec2 J1 = focal * invZ;\n vec2 J2 = -(J1 * viewCenter.xy) * invZ;\n j0 = vec3(J1.x, 0.0, J2.x);\n j1 = vec3(0.0, J1.y, J2.y);\n }\n\n // Project only the 2D covariance entries that are consumed below:\n // j^T * RS * RS^T * j = dot(RS^T * j, RS^T * j).\n vec3 p0 = transpose(RS) * j0;\n vec3 p1 = transpose(RS) * j1;\n float a = dot(p0, p0);\n float b = dot(p0, p1);\n float d = dot(p1, p1);\n\n // Optionally pre-blur the splat to match non-antialias optimized splats\n a += preBlurAmount;\n d += preBlurAmount;\n\n // Do convolution with a 0.5-pixel Gaussian for anti-aliasing: sqrt(0.3) ~= 0.5\n float detOrig = a * d - b * b;\n a += blurAmount;\n d += blurAmount;\n float det = a * d - b * b;\n\n // Compute anti-aliasing intensity scaling factor\n float blurAdjust = sqrt(max(0.0, detOrig / det));\n alpha *= blurAdjust;\n if (alpha < minAlpha) {\n return;\n }\n vRgba.a = alpha;\n\n // Ordinary Gaussians need only cover fragments that can reach minAlpha.\n // Wide kernels retain their separately expanded support radius.\n if (kernelPower == 0.0) {\n supportRadius = gaussianSupportRadius(alpha, supportRadius);\n }\n vSupportRadiusSquared = supportRadius * supportRadius;\n vSplatUv = position.xy * supportRadius;\n\n // Compute the eigenvalue and eigenvectors of the 2D covariance matrix\n float eigenAvg = 0.5 * (a + d);\n float eigenDelta = sqrt(max(0.0, eigenAvg * eigenAvg - det));\n float eigen1 = eigenAvg + eigenDelta;\n float eigen2 = eigenAvg - eigenDelta;\n\n vec2 eigenVec1 = (abs(b) > 0.001) ? normalize(vec2(b, eigen1 - a))\n : ((a >= d) ? vec2(1.0, 0.0) : vec2(0.0, 1.0));\n vec2 eigenVec2 = vec2(eigenVec1.y, -eigenVec1.x);\n\n // Apply maxPixelRadius to the original support first, then shrink both the\n // quad and its UV extent by the same ratio to preserve the Gaussian profile.\n float scale1 = min(maxPixelRadius, maximumSupportRadius * sqrt(eigen1));\n float scale2 = min(maxPixelRadius, maximumSupportRadius * sqrt(eigen2));\n float supportScale = (maximumSupportRadius > 0.0)\n ? supportRadius / maximumSupportRadius\n : 0.0;\n scale1 *= supportScale;\n scale2 *= supportScale;\n if (scale1 < minPixelRadius && scale2 < minPixelRadius) {\n return;\n }\n\n // Compute the NDC coordinates for the ellipsoid's diagonal axes.\n vec2 pixelOffset = position.x * eigenVec1 * scale1 + position.y * eigenVec2 * scale2;\n vec2 ndcOffset = (2.0 / scaledRenderSize) * pixelOffset;\n\n // Compute NDC center of the splat\n vec3 ndcCenter = clipCenter.xyz / clipCenter.w;\n vec3 ndc = vec3(ndcCenter.xy + ndcOffset, ndcCenter.z);\n\n vNdc = ndc;\n gl_Position = vec4(ndc.xy * clipCenter.w, clipCenter.zw);\n\n #include <logdepthbuf_vertex>\n}\n","import * as THREE from \"three\";\n\nimport splatDefines from \"./shaders/splatDefines.glsl\";\nimport splatFragment from \"./shaders/splatFragment.glsl\";\nimport splatVertex from \"./shaders/splatVertex.glsl\";\n\nlet shaders: Record<string, string> | null = null;\n\nexport function getShaders(): Record<string, string> {\n if (!shaders) {\n // @ts-ignore\n THREE.ShaderChunk.splatDefines = splatDefines;\n shaders = {\n splatVertex,\n splatFragment,\n };\n }\n return shaders;\n}\n","precision highp float;\nprecision highp int;\nprecision highp usampler2D;\nprecision highp usampler2DArray;\n\n#include <splatDefines>\n\nuniform uint targetLayer;\nuniform int targetBase;\nuniform int targetCount;\n\nuniform usampler2DArray sourceSplats;\nuniform usampler2DArray sourceSplats2;\n\nuniform int numSh;\nuniform usampler2DArray sh1Texture;\nuniform usampler2DArray sh2Texture;\nuniform usampler2DArray sh3TextureA;\nuniform usampler2DArray sh3TextureB;\n\nuniform mat3 objectBasis;\nuniform vec3 objectOffset;\nuniform vec3 objectLnScale;\nuniform vec4 objectQuaternion;\nuniform vec4 recolor;\n\nuniform int numSdfs;\nuniform int numEdits;\nuniform usampler2D sdfTexture;\nuniform usampler2D editTexture;\n\nlayout(location = 0) out uvec4 target;\nlayout(location = 1) out uvec4 target2;\n\nconst float MAX_SEMANTIC_OPACITY = 1000.0;\n\nfloat decodeSemanticOpacity(float alpha, float shapeAmount) {\n if (shapeAmount <= 0.0) return alpha;\n\n float kernelShape = 1.0 + 4.0 * shapeAmount;\n float kernelOpacity = exp(\n (kernelShape * kernelShape - 1.0) / 2.718281828459045\n );\n return min(MAX_SEMANTIC_OPACITY, alpha * kernelOpacity);\n}\n\nfloat encodeWideSemanticOpacity(float opacity) {\n opacity = min(opacity, MAX_SEMANTIC_OPACITY);\n float kernelShape = sqrt(log(opacity) * 2.718281828459045 + 1.0);\n return 0.25 * (kernelShape - 1.0);\n}\n\nvec3 evaluateSH1(uvec4 data, vec3 direction) {\n return decodeSplatShRgb(data.x) * (-0.4886025 * direction.y)\n + decodeSplatShRgb(data.y) * (0.4886025 * direction.z)\n + decodeSplatShRgb(data.z) * (-0.4886025 * direction.x);\n}\n\nvec3 evaluateSH12(uvec4 first, uvec4 second, vec3 direction) {\n vec3 result = evaluateSH1(first, direction);\n result += decodeSplatShRgb(first.w) * (1.0925484 * direction.x * direction.y);\n result += decodeSplatShRgb(second.x) * (-1.0925484 * direction.y * direction.z);\n result += decodeSplatShRgb(second.y) * (0.3153915 * (2.0 * direction.z * direction.z - direction.x * direction.x - direction.y * direction.y));\n result += decodeSplatShRgb(second.z) * (-1.0925484 * direction.x * direction.z);\n result += decodeSplatShRgb(second.w) * (0.5462742 * (direction.x * direction.x - direction.y * direction.y));\n return result;\n}\n\nvec3 evaluateSH3(uvec4 first, uvec4 second, vec3 direction) {\n float xx = direction.x * direction.x;\n float yy = direction.y * direction.y;\n float zz = direction.z * direction.z;\n return decodeSplatShRgb(first.x) * (-0.5900436 * direction.y * (3.0 * xx - yy))\n + decodeSplatShRgb(first.y) * (2.8906114 * direction.x * direction.y * direction.z)\n + decodeSplatShRgb(first.z) * (-0.4570458 * direction.y * (4.0 * zz - xx - yy))\n + decodeSplatShRgb(first.w) * (0.3731763 * direction.z * (2.0 * zz - 3.0 * xx - 3.0 * yy))\n + decodeSplatShRgb(second.x) * (-0.4570458 * direction.x * (4.0 * zz - xx - yy))\n + decodeSplatShRgb(second.y) * (1.4453057 * direction.z * (xx - yy))\n + decodeSplatShRgb(second.z) * (-0.5900436 * direction.x * (xx - 3.0 * yy));\n}\n\nvec3 evaluateSH(ivec3 coord, vec3 direction) {\n vec3 result = vec3(0.0);\n if (numSh == 1) {\n result = evaluateSH1(texelFetch(sh1Texture, coord, 0), direction);\n } else if (numSh >= 2) {\n result = evaluateSH12(\n texelFetch(sh1Texture, coord, 0),\n texelFetch(sh2Texture, coord, 0),\n direction\n );\n if (numSh >= 3) {\n result += evaluateSH3(\n texelFetch(sh3TextureA, coord, 0),\n texelFetch(sh3TextureB, coord, 0),\n direction\n );\n }\n }\n return result;\n}\n\nvoid unpackSdf(\n int index,\n out uint flags,\n out vec3 center,\n out vec4 quaternion,\n out vec3 scale,\n out vec4 sizes,\n out vec4 sdfRgba\n) {\n uvec4 data = texelFetch(sdfTexture, ivec2(0, index), 0);\n center = vec3(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z));\n flags = data.w;\n data = texelFetch(sdfTexture, ivec2(1, index), 0);\n quaternion = vec4(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z), uintBitsToFloat(data.w));\n data = texelFetch(sdfTexture, ivec2(2, index), 0);\n scale = vec3(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z));\n data = texelFetch(sdfTexture, ivec2(3, index), 0);\n sizes = vec4(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z), uintBitsToFloat(data.w));\n data = texelFetch(sdfTexture, ivec2(4, index), 0);\n sdfRgba = vec4(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z), uintBitsToFloat(data.w));\n}\n\nfloat sdfDistance(uint type, vec3 position, vec4 sizes) {\n switch (type) {\n case 0u: return -INFINITY;\n case 1u: return position.z;\n case 2u: return length(position) - sizes.w;\n case 3u: {\n vec3 q = abs(position) - sizes.xyz + sizes.w;\n return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - sizes.w;\n }\n case 4u: {\n float k0 = length(position / sizes.xyz);\n float k1 = length(position / dot(sizes.xyz, sizes.xyz));\n return k0 * (k0 - 1.0) / k1;\n }\n case 5u: {\n vec2 d = abs(vec2(length(position.xz), position.y)) - sizes.wy;\n return min(max(d.x, d.y), 0.0) + length(max(d, 0.0));\n }\n case 6u: {\n position.y -= clamp(position.y, -0.5 * sizes.y, 0.5 * sizes.y);\n return length(position) - sizes.w;\n }\n case 7u: {\n float angle = 0.25 * PI * sizes.w;\n vec2 c = vec2(sin(angle), cos(angle));\n vec2 q = vec2(length(position.xy), -position.z);\n float distance = length(q - c * max(dot(q, c), 0.0));\n return distance * (((q.x * c.y - q.y * c.x) < 0.0) ? -1.0 : 1.0);\n }\n }\n return INFINITY;\n}\n\nfloat evaluateSdfs(\n int sdfFirst,\n int sdfCount,\n vec3 position,\n float smoothAmount,\n out vec4 resultRgba,\n out vec4 resultRgbaMask\n) {\n float distanceAccum = smoothAmount == 0.0 ? INFINITY : 0.0;\n float maxExponent = -INFINITY;\n resultRgba = vec4(0.0);\n resultRgbaMask = vec4(0.0);\n int sdfLast = min(sdfFirst + sdfCount, numSdfs);\n\n for (int index = sdfFirst; index < sdfLast; ++index) {\n uint flags;\n vec3 center;\n vec4 quaternion;\n vec3 scale;\n vec4 sizes;\n vec4 value;\n unpackSdf(index, flags, center, quaternion, scale, sizes, value);\n vec4 valueMask = vec4(\n (flags & 0x10000u) != 0u ? 1.0 : 0.0,\n (flags & 0x20000u) != 0u ? 1.0 : 0.0,\n (flags & 0x40000u) != 0u ? 1.0 : 0.0,\n (flags & 0x80000u) != 0u ? 1.0 : 0.0\n );\n vec3 sdfPosition = quatVec(quaternion, position * scale) + center;\n float distance = sdfDistance(flags & 0xffu, sdfPosition, sizes);\n if ((flags & 0x100u) != 0u) distance = -distance;\n\n if (smoothAmount == 0.0) {\n if (distance < distanceAccum) {\n distanceAccum = distance;\n resultRgba = value * valueMask;\n resultRgbaMask = valueMask;\n }\n } else {\n float exponent = -distance / smoothAmount;\n if (exponent > maxExponent) {\n float rescale = exp(maxExponent - exponent);\n distanceAccum *= rescale;\n resultRgba *= rescale;\n resultRgbaMask *= rescale;\n maxExponent = exponent;\n }\n float weight = exp(exponent - maxExponent);\n distanceAccum += weight;\n resultRgba += weight * value * valueMask;\n resultRgbaMask += weight * valueMask;\n }\n }\n\n if (smoothAmount == 0.0 || distanceAccum == 0.0) {\n return distanceAccum == 0.0 ? INFINITY : distanceAccum;\n }\n resultRgba /= distanceAccum;\n resultRgbaMask /= distanceAccum;\n return (-log(distanceAccum) - maxExponent) * smoothAmount;\n}\n\nbool applySdfEdits(\n vec3 position,\n inout vec4 rgba,\n float shapeAmount\n) {\n bool semanticOpacityDecoded = false;\n for (int editIndex = 0; editIndex < numEdits; ++editIndex) {\n uvec4 edit = texelFetch(editTexture, ivec2(0, editIndex), 0);\n uint blendMode = edit.x & 0xffu;\n bool invert = (edit.x & 0x100u) != 0u;\n int sdfFirst = int(edit.y & 0xffffu);\n int sdfCount = int(edit.y >> 16u);\n float softEdge = uintBitsToFloat(edit.z);\n float smoothAmount = uintBitsToFloat(edit.w);\n\n vec4 sdfRgba;\n vec4 sdfRgbaMask;\n float distance = evaluateSdfs(\n sdfFirst,\n sdfCount,\n position,\n smoothAmount,\n sdfRgba,\n sdfRgbaMask\n );\n if (invert) distance = -distance;\n float amount = softEdge == 0.0\n ? (distance < 0.0 ? 1.0 : 0.0)\n : clamp(-distance / softEdge + 0.5, 0.0, 1.0);\n bool editOpacity = amount > 0.0 && sdfRgbaMask.a > 0.0;\n if (editOpacity && !semanticOpacityDecoded) {\n // SDF opacity values operate on semantic opacity, not on the alpha\n // half of the nonlinear wide-kernel encoding.\n rgba.a = decodeSemanticOpacity(\n clamp(rgba.a, 0.0, 1.0),\n shapeAmount\n );\n semanticOpacityDecoded = true;\n }\n vec4 target = rgba;\n switch (blendMode) {\n case 0u:\n target = rgba * (vec4(1.0) + sdfRgba - sdfRgbaMask);\n break;\n case 1u:\n target = rgba * (vec4(1.0) - sdfRgbaMask) + sdfRgba;\n break;\n case 2u:\n target = rgba + sdfRgba;\n break;\n }\n rgba = mix(rgba, target, amount);\n }\n return semanticOpacityDecoded;\n}\n\nvoid produceSplat(int index) {\n ivec3 coord = splatTexCoord(index);\n uvec4 sourceSplat = texelFetch(sourceSplats, coord, 0);\n vec2 alphaShapeAmount = decodeSplatAlphaShapeAmount(sourceSplat);\n vec3 center = decodeSplatCenter(sourceSplat);\n vec3 lnScales;\n vec4 quaternion;\n vec4 rgba;\n decodeSplatAttributesLnScale(\n texelFetch(sourceSplats2, coord, 0),\n alphaShapeAmount.x,\n lnScales,\n quaternion,\n rgba\n );\n if (all(equal(lnScales, vec3(-INFINITY)))) return;\n float shapeAmount = alphaShapeAmount.y;\n\n // Match PlayCanvas' work-buffer transform. Centers retain the complete\n // affine transform, while Gaussian shape is approximated by composing the\n // model rotation and its positive per-axis scale with each splat.\n center = objectBasis * center;\n if (numSh > 0) {\n vec3 worldViewDirection = center + objectOffset;\n vec4 inverseObjectQuaternion = vec4(-objectQuaternion.xyz, objectQuaternion.w);\n vec3 sourceViewDirection = normalize(quatVec(inverseObjectQuaternion, worldViewDirection));\n rgba.rgb += evaluateSH(coord, sourceViewDirection);\n }\n lnScales += objectLnScale;\n quaternion = quatQuat(objectQuaternion, quaternion);\n\n vec3 editPosition = center;\n center += objectOffset;\n// The center is camera-relative while editPosition is mesh-origin-relative,\n// matching the rebased SDF transforms without reconstructing world position.\n // Opacity is clamped once on the CPU when preparing this mesh.\n float opacityScale = recolor.a;\n bool semanticOpacityDecoded = applySdfEdits(\n editPosition,\n rgba,\n shapeAmount\n );\n rgba.rgb *= recolor.rgb;\n if (!semanticOpacityDecoded && opacityScale >= 1.0) {\n // Neither SDFs nor the mesh opacity changed opacity, so preserve the\n // source alpha/shape encoding without any transcendental operations.\n rgba.a = clamp(rgba.a, 0.0, 1.0);\n } else {\n if (!semanticOpacityDecoded) {\n rgba.a = decodeSemanticOpacity(\n clamp(rgba.a, 0.0, 1.0),\n shapeAmount\n );\n }\n float semanticOpacity = rgba.a * opacityScale;\n if (semanticOpacity <= 1.0) {\n rgba.a = clamp(semanticOpacity, 0.0, 1.0);\n shapeAmount = 0.0;\n } else {\n rgba.a = 1.0;\n shapeAmount = encodeWideSemanticOpacity(semanticOpacity);\n }\n }\n\n encodeSplatLnScale(\n target,\n target2,\n center,\n lnScales,\n quaternion,\n rgba,\n shapeAmount\n );\n}\n\nvoid main() {\n int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS)\n + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS)\n + int(gl_FragCoord.x);\n int index = targetIndex - targetBase;\n\n target = uvec4(0u);\n target2 = uvec4(0u);\n if (index >= 0 && index < targetCount) {\n produceSplat(index);\n }\n}\n","import * as THREE from \"three\";\n\nconst rotationMatrix = new THREE.Matrix4();\nconst axisX = new THREE.Vector3();\nconst axisY = new THREE.Vector3();\nconst axisZ = new THREE.Vector3();\nconst sourceAxis = new THREE.Vector3();\n\n/**\n * Extracts the positive per-axis scale and approximate rotation used by the\n * PlayCanvas-style splat work-buffer transform.\n *\n * Unlike Matrix4.decompose(), this remains finite when a model scale axis is\n * zero. When possible, the missing basis axis is reconstructed from the other\n * two so a model-level collapse can still produce a correctly oriented 2DGS.\n */\nexport function decomposeSplatTransform(\n matrix: THREE.Matrix4,\n scale: THREE.Vector3,\n rotation: THREE.Quaternion,\n) {\n const source = matrix.elements;\n const sx = Math.hypot(source[0], source[1], source[2]);\n const sy = Math.hypot(source[4], source[5], source[6]);\n const sz = Math.hypot(source[8], source[9], source[10]);\n scale.set(sx, sy, sz);\n\n axisX.set(source[0], source[1], source[2]);\n axisY.set(source[4], source[5], source[6]);\n axisZ.set(source[8], source[9], source[10]);\n if (sx > 0) axisX.multiplyScalar(1 / sx);\n if (sy > 0) axisY.multiplyScalar(1 / sy);\n if (sz > 0) axisZ.multiplyScalar(1 / sz);\n\n const nonZeroAxes = Number(sx > 0) + Number(sy > 0) + Number(sz > 0);\n if (nonZeroAxes === 0) {\n rotation.identity();\n return;\n }\n\n if (nonZeroAxes === 1) {\n const localAxis = sx > 0 ? 0 : sy > 0 ? 1 : 2;\n sourceAxis.set(\n localAxis === 0 ? 1 : 0,\n localAxis === 1 ? 1 : 0,\n localAxis === 2 ? 1 : 0,\n );\n rotation\n .setFromUnitVectors(\n sourceAxis,\n localAxis === 0 ? axisX : localAxis === 1 ? axisY : axisZ,\n )\n .normalize();\n return;\n }\n\n if (sx === 0) axisX.copy(axisY).cross(axisZ).normalize();\n if (sy === 0) axisY.copy(axisZ).cross(axisX).normalize();\n if (sz === 0) axisZ.copy(axisX).cross(axisY).normalize();\n if (matrix.determinant() < 0) axisX.negate();\n\n rotationMatrix.makeBasis(axisX, axisY, axisZ);\n rotation.setFromRotationMatrix(rotationMatrix).normalize();\n}\n","import * as THREE from \"three\";\nimport { FullScreenQuad } from \"three/addons/postprocessing/Pass.js\";\n\nimport { SplatEdit, SplatEdits } from \"./SplatEdit\";\nimport { SplatMesh } from \"./SplatMesh\";\nimport { SPLAT_TEX_HEIGHT, SPLAT_TEX_WIDTH } from \"./defines\";\nimport { getShaders } from \"./shaders\";\nimport splatGenerate from \"./shaders/splatGenerate.glsl\";\nimport { decomposeSplatTransform } from \"./splatTransform\";\nimport { IDENT_VERTEX_SHADER, getTextureSize, threeMrtArray } from \"./utils\";\n\nexport type SplatMapping = {\n node: SplatMesh;\n version: number;\n sortVersion: number;\n centerVersion: number;\n mappingVersion: number;\n base: number;\n count: number;\n};\n\ntype GenerateUniforms = Record<string, THREE.IUniform>;\ntype SplatDataTextures = readonly [\n THREE.DataArrayTexture,\n THREE.DataArrayTexture,\n];\n\nexport class SplatAccumulator {\n time = 0;\n deltaTime = 0;\n viewOrigin = new THREE.Vector3();\n viewDirection = new THREE.Vector3();\n maxSplats = 0;\n numSplats = 0;\n target: THREE.WebGLArrayRenderTarget | null = null;\n mapping: SplatMapping[] = [];\n version = -1;\n mappingVersion = -1;\n\n private transformScale = new THREE.Vector3();\n private transformQuaternion = new THREE.Quaternion();\n\n constructor() {\n if (!threeMrtArray) {\n throw new Error(\"Gaussian Splat Lite requires THREE.js r179 or above\");\n }\n }\n\n dispose() {\n this.disposeTarget();\n this.mapping = [];\n this.numSplats = 0;\n this.version = -1;\n this.mappingVersion = -1;\n }\n\n private disposeTarget() {\n this.target?.dispose();\n this.target = null;\n this.maxSplats = 0;\n }\n\n getTextures(): SplatDataTextures {\n // ensureGenerate() fixes every target to exactly two data attachments.\n return (this.target?.textures ??\n SplatAccumulator.emptyTextures) as SplatDataTextures;\n }\n\n generateMapping(splatCounts: number[]) {\n let maxSplats = 0;\n const mapping = splatCounts.map((count) => {\n const base = maxSplats;\n maxSplats += Math.ceil(count / SPLAT_TEX_WIDTH) * SPLAT_TEX_WIDTH;\n return { base, count };\n });\n return { maxSplats, mapping };\n }\n\n ensureGenerate({\n maxSplats,\n shrinkResources = false,\n }: {\n maxSplats: number;\n shrinkResources?: boolean;\n }) {\n const textureSize = getTextureSize(Math.max(1, maxSplats));\n if (\n this.target &&\n (shrinkResources\n ? textureSize.maxSplats === this.maxSplats\n : textureSize.maxSplats <= this.maxSplats)\n ) {\n return false;\n }\n // Keep the prepared mapping and versions while replacing only its GPU\n // storage. Full dispose() also severs references to source meshes.\n this.disposeTarget();\n\n const { width, height, depth } = textureSize;\n this.maxSplats = textureSize.maxSplats;\n this.target = new THREE.WebGLArrayRenderTarget(width, height, depth, {\n depthBuffer: false,\n stencilBuffer: false,\n generateMipmaps: false,\n magFilter: THREE.NearestFilter,\n minFilter: THREE.NearestFilter,\n format: THREE.RGBAIntegerFormat,\n type: THREE.UnsignedIntType,\n });\n this.target.scissorTest = true;\n\n const second = this.target.texture.clone();\n this.target.textures = [this.target.texture, second];\n return true;\n }\n\n private getMaterial() {\n let material = SplatAccumulator.material;\n if (!material) {\n getShaders();\n material = new THREE.RawShaderMaterial({\n glslVersion: THREE.GLSL3,\n vertexShader: IDENT_VERTEX_SHADER,\n fragmentShader: splatGenerate,\n uniforms: makeGenerateUniforms(),\n depthTest: false,\n depthWrite: false,\n });\n SplatAccumulator.material = material;\n }\n return material;\n }\n\n private prepareMaterial(mesh: SplatMesh) {\n const source = mesh.splats;\n if (!source) {\n throw new Error(\"SplatMesh has no source\");\n }\n const material = this.getMaterial();\n const uniforms = material.uniforms as GenerateUniforms;\n source.setTextureUniforms(uniforms);\n uniforms.numSh.value = Math.min(mesh.maxSh, source.getNumSh());\n\n decomposeSplatTransform(\n mesh.matrixWorld,\n this.transformScale,\n this.transformQuaternion,\n );\n uniforms.objectBasis.value.setFromMatrix4(mesh.matrixWorld);\n uniforms.objectOffset.value.setFromMatrixPosition(mesh.matrixWorld);\n // THREE.Vector3 and Matrix4 use JS numbers, so this subtraction happens\n // before the value is narrowed to a float32 WebGL uniform.\n uniforms.objectOffset.value.sub(this.viewOrigin);\n // Match PlayCanvas' work-buffer transform: centers use the complete affine\n // basis, while splat shape uses the decomposed rotation and positive\n // per-axis scale. This is intentionally an approximation for non-uniform\n // transforms, but preserves ordinary scale/quaternion storage and 2DGS\n // zero axes.\n uniforms.objectLnScale.value.set(\n Math.log(this.transformScale.x),\n Math.log(this.transformScale.y),\n Math.log(this.transformScale.z),\n );\n uniforms.objectQuaternion.value.copy(this.transformQuaternion);\n uniforms.recolor.value.set(\n mesh.recolor.r,\n mesh.recolor.g,\n mesh.recolor.b,\n THREE.MathUtils.clamp(mesh.opacity, 0, 1),\n );\n\n const edits = mesh.sdfEdits;\n uniforms.numSdfs.value = edits?.numSdfs ?? 0;\n uniforms.numEdits.value = edits?.numEdits ?? 0;\n uniforms.sdfTexture.value = edits?.sdfTexture ?? SplatEdits.emptyTexture;\n uniforms.editTexture.value = edits?.editTexture ?? SplatEdits.emptyTexture;\n\n SplatAccumulator.fullScreenQuad.material = material;\n return material;\n }\n\n generate({\n mesh,\n base,\n count,\n renderer,\n }: {\n mesh: SplatMesh;\n base: number;\n count: number;\n renderer: THREE.WebGLRenderer;\n }) {\n if (!this.target) throw new Error(\"Accumulator target is not initialized\");\n if (base + count > this.maxSplats) {\n throw new Error(\"Splat generation range exceeds accumulator capacity\");\n }\n\n const material = this.prepareMaterial(mesh);\n const uniforms = material.uniforms as GenerateUniforms;\n const renderState = this.saveRenderState(renderer);\n const nextBase =\n Math.ceil((base + count) / SPLAT_TEX_WIDTH) * SPLAT_TEX_WIDTH;\n const layerSize = SPLAT_TEX_WIDTH * SPLAT_TEX_HEIGHT;\n uniforms.targetBase.value = base;\n uniforms.targetCount.value = count;\n\n while (base < nextBase) {\n const layer = Math.floor(base / layerSize);\n uniforms.targetLayer.value = layer;\n const layerBase = layer * layerSize;\n const yStart = Math.floor((base - layerBase) / SPLAT_TEX_WIDTH);\n const yEnd = Math.min(\n SPLAT_TEX_HEIGHT,\n Math.ceil((nextBase - layerBase) / SPLAT_TEX_WIDTH),\n );\n this.target.scissor.set(0, yStart, SPLAT_TEX_WIDTH, yEnd - yStart);\n renderer.setRenderTarget(this.target, layer);\n renderer.xr.enabled = false;\n renderer.autoClear = false;\n SplatAccumulator.fullScreenQuad.render(renderer);\n base += SPLAT_TEX_WIDTH * (yEnd - yStart);\n }\n this.resetRenderState(renderer, renderState);\n }\n\n prepareGenerate({\n renderer,\n scene,\n timer,\n camera,\n previous,\n }: {\n renderer: THREE.WebGLRenderer;\n scene: THREE.Scene;\n timer: THREE.Timer;\n camera: THREE.Camera;\n previous: SplatAccumulator;\n }) {\n camera.getWorldPosition(this.viewOrigin);\n camera.getWorldDirection(this.viewDirection);\n this.time = timer.getElapsed();\n this.deltaTime = timer.getDelta();\n\n const allMeshes: SplatMesh[] = [];\n scene.traverse((node) => {\n if (node instanceof SplatMesh && camera.layers.test(node.layers)) {\n allMeshes.push(node);\n }\n });\n\n const globalEdits = new Set<SplatEdit>();\n scene.traverseVisible((node) => {\n if (!(node instanceof SplatEdit)) return;\n let ancestor = node.parent;\n while (ancestor && !(ancestor instanceof SplatMesh)) {\n ancestor = ancestor.parent;\n }\n if (!ancestor) globalEdits.add(node);\n });\n\n for (const mesh of allMeshes) {\n try {\n mesh.frameUpdate({\n time: this.time,\n deltaTime: this.deltaTime,\n camera,\n globalEdits: Array.from(globalEdits),\n });\n } catch (error) {\n console.error(\"SplatMesh frame update failed\", error);\n }\n }\n\n const visibleMeshes: SplatMesh[] = [];\n scene.traverseVisible((node) => {\n // Mesh opacity is the final multiplier after SDF opacity edits, so zero\n // remains fully transparent even when an SDF sets or adds opacity.\n if (\n node instanceof SplatMesh &&\n camera.layers.test(node.layers) &&\n node.opacity > 0\n ) {\n visibleMeshes.push(node);\n }\n });\n const { maxSplats, mapping: ranges } = this.generateMapping(\n visibleMeshes.map((mesh) => mesh.numSplats),\n );\n\n this.mapping = [];\n this.numSplats = 0;\n ranges.forEach(({ base, count }, index) => {\n const node = visibleMeshes[index];\n if (!node.splats || count <= 0) return;\n this.mapping.push({\n node,\n version: node.version,\n sortVersion: node.sortVersion,\n centerVersion: node.centerVersion,\n mappingVersion: node.mappingVersion,\n base,\n count,\n });\n this.numSplats = Math.max(this.numSplats, base + count);\n });\n\n const { splatsUpdated, mappingUpdated, sortUpdated } =\n previous.checkVersions(this.mapping);\n this.version = previous.version + (splatsUpdated ? 1 : 0);\n this.mappingVersion = previous.mappingVersion + (mappingUpdated ? 1 : 0);\n\n return {\n version: this.version,\n sortUpdated,\n requiredMaxSplats: getTextureSize(Math.max(1, maxSplats)).maxSplats,\n generate: (shrinkResources = false) => {\n this.ensureGenerate({ maxSplats, shrinkResources });\n for (const { node, base, count } of this.mapping) {\n this.generate({ mesh: node, base, count, renderer });\n }\n },\n };\n }\n\n checkVersions(other: SplatMapping[]) {\n if (this.mapping.length !== other.length) {\n return { splatsUpdated: true, mappingUpdated: true, sortUpdated: true };\n }\n const mappingUpdated = this.mapping.some((item, index) => {\n const previous = other[index];\n return (\n item.node !== previous.node ||\n item.base !== previous.base ||\n item.count !== previous.count ||\n item.mappingVersion !== previous.mappingVersion\n );\n });\n if (mappingUpdated) {\n return { splatsUpdated: true, mappingUpdated: true, sortUpdated: true };\n }\n return {\n splatsUpdated: this.mapping.some(\n (item, index) => item.version !== other[index].version,\n ),\n mappingUpdated: false,\n sortUpdated: this.mapping.some(\n (item, index) => item.sortVersion !== other[index].sortVersion,\n ),\n };\n }\n\n private saveRenderState(renderer: THREE.WebGLRenderer) {\n return {\n target: renderer.getRenderTarget(),\n activeCubeFace: renderer.getActiveCubeFace(),\n activeMipmapLevel: renderer.getActiveMipmapLevel(),\n xrEnabled: renderer.xr.enabled,\n autoClear: renderer.autoClear,\n };\n }\n\n private resetRenderState(\n renderer: THREE.WebGLRenderer,\n state: ReturnType<SplatAccumulator[\"saveRenderState\"]>,\n ) {\n renderer.setRenderTarget(\n state.target,\n state.activeCubeFace,\n state.activeMipmapLevel,\n );\n renderer.xr.enabled = state.xrEnabled;\n renderer.autoClear = state.autoClear;\n }\n\n static emptyTexture = (() => {\n const { width, height, depth, maxSplats } = getTextureSize(1);\n const texture = new THREE.DataArrayTexture(\n new Uint32Array(maxSplats * 4),\n width,\n height,\n depth,\n );\n texture.format = THREE.RGBAIntegerFormat;\n texture.type = THREE.UnsignedIntType;\n texture.internalFormat = \"RGBA32UI\";\n texture.needsUpdate = true;\n return texture;\n })();\n\n static emptyTextures: SplatDataTextures = [\n SplatAccumulator.emptyTexture,\n SplatAccumulator.emptyTexture,\n ];\n private static material: THREE.RawShaderMaterial | null = null;\n private static fullScreenQuad = new FullScreenQuad(\n new THREE.RawShaderMaterial({ visible: false }),\n );\n}\n\nfunction makeGenerateUniforms(): GenerateUniforms {\n return {\n targetLayer: { value: 0 },\n targetBase: { value: 0 },\n targetCount: { value: 0 },\n sourceSplats: { value: SplatAccumulator.emptyTexture },\n sourceSplats2: { value: SplatAccumulator.emptyTexture },\n numSh: { value: 0 },\n sh1Texture: { value: SplatAccumulator.emptyTexture },\n sh2Texture: { value: SplatAccumulator.emptyTexture },\n sh3TextureA: { value: SplatAccumulator.emptyTexture },\n sh3TextureB: { value: SplatAccumulator.emptyTexture },\n objectBasis: { value: new THREE.Matrix3() },\n objectOffset: { value: new THREE.Vector3() },\n objectLnScale: { value: new THREE.Vector3() },\n objectQuaternion: { value: new THREE.Quaternion() },\n recolor: { value: new THREE.Vector4(1, 1, 1, 1) },\n numSdfs: { value: 0 },\n numEdits: { value: 0 },\n sdfTexture: { value: SplatEdits.emptyTexture },\n editTexture: { value: SplatEdits.emptyTexture },\n };\n}\n","import * as THREE from \"three\";\n\n// SplatGeometry is an internal class used by GaussianSplatRenderer to render a collection\n// of Gsplats in a single draw call by extending THREE.InstancedBufferGeometry.\n// Each Gsplat is drawn as two triangles, with the order of the Gsplats determined\n// by a texture lookup via gl_InstanceID.\n\nexport class SplatGeometry extends THREE.InstancedBufferGeometry {\n constructor() {\n super();\n this.setAttribute(\"position\", new THREE.BufferAttribute(QUAD_VERTICES, 3));\n this.setIndex(new THREE.BufferAttribute(QUAD_INDICES, 1));\n }\n}\n\n// Each instance draws to triangles covering a quad over coords (-1,-1,0)..(1,1,0)\nconst QUAD_VERTICES = new Float32Array([\n -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0,\n]);\n\nconst QUAD_INDICES = new Uint16Array([0, 1, 2, 0, 2, 3]);\n","const MEBIBYTE = 1024 * 1024;\n\nconst SMALL_WORKER_MEMORY_BYTES = 64 * MEBIBYTE;\nconst LARGE_WORKER_MEMORY_BYTES = 256 * MEBIBYTE;\nconst SMALL_WORKER_IDLE_TIMEOUT_MS = 3 * 60 * 1000;\nconst LARGE_WORKER_IDLE_TIMEOUT_MS = 3 * 1000;\n\n/**\n * Keep small workers around for reuse, while releasing workers whose WASM\n * linear memory has grown large much sooner.\n */\nexport function getWorkerIdleTimeoutMs(peakWasmMemoryBytes: number): number {\n const clampedMemoryBytes = Math.min(\n LARGE_WORKER_MEMORY_BYTES,\n Math.max(SMALL_WORKER_MEMORY_BYTES, peakWasmMemoryBytes),\n );\n const memoryRatio =\n (clampedMemoryBytes - SMALL_WORKER_MEMORY_BYTES) /\n (LARGE_WORKER_MEMORY_BYTES - SMALL_WORKER_MEMORY_BYTES);\n\n return Math.round(\n SMALL_WORKER_IDLE_TIMEOUT_MS +\n memoryRatio *\n (LARGE_WORKER_IDLE_TIMEOUT_MS - SMALL_WORKER_IDLE_TIMEOUT_MS),\n );\n}\n\n/**\n * Prefer the smallest idle worker so workers with large WASM heaps can reach\n * their shorter expiry timers. Equal-sized workers retain LIFO behavior.\n */\nexport function getWorkerReuseIndex(\n workers: readonly { peakWasmMemoryBytes: number }[],\n): number {\n let selectedIndex = -1;\n let selectedMemoryBytes = Number.POSITIVE_INFINITY;\n\n for (let index = workers.length - 1; index >= 0; index -= 1) {\n const memoryBytes = workers[index].peakWasmMemoryBytes;\n if (memoryBytes < selectedMemoryBytes) {\n selectedIndex = index;\n selectedMemoryBytes = memoryBytes;\n }\n }\n\n return selectedIndex;\n}\n","import { getTransferable } from \"./transferable\";\nimport { WASM_MODULE } from \"./wasm\";\nimport type { RpcHandlers } from \"./worker\";\nimport BundledWorker from \"./worker?worker&inline\";\nimport {\n getWorkerIdleTimeoutMs,\n getWorkerReuseIndex,\n} from \"./workerIdleTimeout\";\n\ntype PromiseRecord = {\n resolve: (value: unknown) => void;\n reject: (reason?: unknown) => void;\n onStatus?: (data: unknown) => void | Promise<void>;\n statusQueue: Promise<void>;\n};\n\nexport class SplatWorker {\n worker: Worker;\n messages: Record<number, PromiseRecord> = {};\n peakWasmMemoryBytes = 0;\n static currentId = 0;\n\n constructor() {\n this.worker = new BundledWorker();\n this.worker.onmessage = (event) => this.onMessage(event);\n WASM_MODULE.then((module) => {\n this.worker.postMessage({ name: \"init-wasm\", module });\n });\n }\n\n onMessage(event: MessageEvent) {\n const { id, result, error, status, wasmMemoryBytes } = event.data;\n if (Number.isSafeInteger(wasmMemoryBytes) && wasmMemoryBytes >= 0) {\n this.peakWasmMemoryBytes = Math.max(\n this.peakWasmMemoryBytes,\n wasmMemoryBytes,\n );\n }\n const promise = this.messages[id];\n if (!promise) return;\n\n if (status !== undefined) {\n promise.statusQueue = promise.statusQueue.then(() => {\n if (this.messages[id] === promise) {\n return promise.onStatus?.(status);\n }\n });\n void promise.statusQueue.catch(() => {});\n return;\n }\n\n void promise.statusQueue\n .then(() => {\n if (error !== undefined) throw error;\n return result;\n })\n .finally(() => {\n delete this.messages[id];\n })\n .then(promise.resolve, promise.reject);\n }\n\n async call<Name extends keyof RpcHandlers>(\n name: Name,\n args: Parameters<RpcHandlers[Name]>[0],\n options: {\n onStatus?: (data: unknown) => void | Promise<void>;\n } = {},\n ): Promise<Awaited<ReturnType<RpcHandlers[Name]>>> {\n type Result = Awaited<ReturnType<RpcHandlers[Name]>>;\n const id = ++SplatWorker.currentId;\n const promise = new Promise<Result>((resolve, reject) => {\n this.messages[id] = {\n resolve: (value) => resolve(value as Result),\n reject,\n onStatus: options.onStatus,\n statusQueue: Promise.resolve(),\n };\n });\n this.worker.postMessage(\n { id, name, args },\n { transfer: getTransferable(args) },\n );\n return promise;\n }\n\n dispose() {\n this.worker.terminate();\n\n const messages = Object.values(this.messages);\n this.messages = {};\n for (const message of messages) {\n message.reject(new Error(\"Worker terminate\"));\n }\n }\n}\n\nclass SplatWorkerPool {\n maxWorkers;\n numWorkers = 0;\n freelist: SplatWorker[] = [];\n idleWorkerTimeouts = new Map<SplatWorker, ReturnType<typeof setTimeout>>();\n queue: ((worker: SplatWorker) => void)[] = [];\n\n constructor(maxWorkers = 4) {\n this.maxWorkers = maxWorkers;\n }\n\n async withWorker<T>(\n callback: (worker: SplatWorker) => Promise<T>,\n ): Promise<T> {\n const worker = await this.allocWorker();\n try {\n return await callback(worker);\n } finally {\n this.freeWorker(worker);\n }\n }\n\n async allocWorker(): Promise<SplatWorker> {\n const workerIndex = getWorkerReuseIndex(this.freelist);\n if (workerIndex !== -1) {\n const worker = this.freelist.splice(workerIndex, 1)[0];\n const timeout = this.idleWorkerTimeouts.get(worker);\n if (timeout !== undefined) {\n clearTimeout(timeout);\n this.idleWorkerTimeouts.delete(worker);\n }\n return worker;\n }\n\n if (this.numWorkers < this.maxWorkers) {\n const worker = new SplatWorker();\n this.numWorkers += 1;\n return worker;\n }\n\n return new Promise((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n freeWorker(worker: SplatWorker) {\n if (this.numWorkers > this.maxWorkers) {\n // Worker no longer needed\n worker.dispose();\n this.numWorkers -= 1;\n return;\n }\n\n const waiter = this.queue.shift();\n if (waiter) {\n waiter(worker);\n return;\n }\n\n this.freelist.push(worker);\n const timeout = setTimeout(() => {\n this.idleWorkerTimeouts.delete(worker);\n const index = this.freelist.indexOf(worker);\n if (index === -1) return;\n\n this.freelist.splice(index, 1);\n worker.dispose();\n this.numWorkers -= 1;\n }, getWorkerIdleTimeoutMs(worker.peakWasmMemoryBytes));\n this.idleWorkerTimeouts.set(worker, timeout);\n }\n}\n\nexport const workerPool = new SplatWorkerPool();\n","import * as THREE from \"three\";\nimport { SplatAccumulator } from \"./SplatAccumulator\";\nimport { SplatGeometry } from \"./SplatGeometry\";\nimport { SplatWorker } from \"./SplatWorker\";\nimport { SortCenterCache } from \"./cameraRelative\";\nimport { getShaders } from \"./shaders\";\nimport { resolveTimer, uploadU32DataTextureRows } from \"./utils\";\n\nconst renderToViewScaleTmp = new THREE.Vector3();\nconst ORDERING_TEXTURE_WIDTH = 4096;\nconst SPLATS_PER_ORDERING_ROW = ORDERING_TEXTURE_WIDTH * 4;\nconst DEFAULT_MIN_ALPHA = 1 / 255;\n\nfunction getOrderingCapacity(maxSplats: number) {\n return (\n Math.max(1, Math.ceil(maxSplats / SPLATS_PER_ORDERING_ROW)) *\n SPLATS_PER_ORDERING_ROW\n );\n}\n\ntype UpdateRequest = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n autoUpdate: boolean;\n shrinkResources: boolean;\n};\n\n// Average (uniform) world scale of a camera.\nfunction getCameraWorldScale(camera: THREE.Camera): number {\n const scale = camera.getWorldScale(renderToViewScaleTmp);\n return (scale.x + scale.y + scale.z) / 3;\n}\n\nexport interface GaussianSplatRendererOptions {\n /**\n * Pass in your THREE.WebGLRenderer instance so Gaussian Splat Lite can perform work\n * outside the usual render loop. Should be created with antialias: false\n * (default setting) as WebGL anti-aliasing doesn't improve Gaussian Splatting\n * rendering and significantly reduces performance.\n */\n renderer: THREE.WebGLRenderer;\n /**\n * Callback function to be called when GaussianSplatRenderer needs to re-render,\n * for example when a splat sort completes.\n */\n onDirty?: () => void;\n /**\n * Whether to use premultiplied alpha when accumulating splat RGB\n * @default true\n */\n premultipliedAlpha?: boolean;\n /**\n * Pass in a THREE.Timer to synchronize time-based effects across different\n * systems. A supplied timer remains owned and updated by the caller.\n * @default new THREE.Timer()\n */\n timer?: THREE.Timer;\n /**\n * Controls whether to check and automatically update Gsplat collection\n * each frame render.\n * @default true\n */\n autoUpdate?: boolean;\n /**\n * Controls whether to update the Gsplats before or after rendering. For WebXR\n * this is set to false in order to complete rendering as soon as possible.\n * @default true (if not WebXR)\n */\n preUpdate?: boolean;\n /**\n * Maximum standard deviations from the center to render Gaussians. Values\n * Math.sqrt(4)..Math.sqrt(9) produce acceptable results and can be tweaked for\n * performance.\n * @default Math.sqrt(8)\n */\n maxStdDev?: number;\n /*\n **\n * Minimum pixel radius for splat rendering.\n * @default 0.0\n */\n minPixelRadius?: number;\n /**\n * Maximum pixel radius for splat rendering.\n * @default 512.0\n */\n maxPixelRadius?: number;\n /**\n * Minimum alpha value for splat rendering.\n * @default 1 / 255\n */\n minAlpha?: number;\n /**\n * Enable 2D Gaussian splatting rendering ability. When this mode is enabled,\n * any scale x/y/z component that is exactly 0 (minimum quantized value) results\n * in the other two non-0 axis being interpreted as an oriented 2D Gaussian Splat,\n * rather instead of the usual projected 3DGS Z-slice. When reading PLY files,\n * scale values less than e^-30 will be interpreted as 0.\n * @default false\n */\n enable2DGS?: boolean;\n /**\n * Scalar value to add to 2D splat covariance diagonal, effectively blurring +\n * enlarging splats. In scenes trained without the Gsplat anti-aliasing tweak\n * this value was typically 0.3, but with anti-aliasing it is 0.0\n * @default 0.0\n */\n preBlurAmount?: number;\n /**\n * Scalar value to add to 2D splat covarianve diagonal, with opacity adjustment\n * to correctly account for \"blurring\" when anti-aliasing. Typically 0.3\n * (equivalent to approx 0.5 pixel radius) in scenes trained with anti-aliasing.\n */\n blurAmount?: number;\n /**\n * X/Y clipping boundary factor for Gsplat centers against view frustum.\n * 1.0 clips any centers that are exactly out of bounds, while 1.25 clips\n * centers that are 25% beyond the bounds.\n * @default 1.25\n */\n clipXY?: number;\n /**\n * Parameter to adjust projected splat scale calculation to match other renderers,\n * similar to the same parameter in the MKellogg 3DGS renderer. Higher values will\n * tend to sharpen the splats. A value 2.0 can be used to match the behavior of\n * the PlayCanvas renderer.\n * @default 2.0\n */\n focalAdjustment?: number;\n /**\n * Whether to sort splats radially (geometric distance) from the viewpoint (true)\n * or by Z-depth (false). Most scenes are trained with the Z-depth sort metric\n * and will render more accurately at certain viewpoints. However, radial sorting\n * is more stable under viewpoint rotations.\n * @default false\n */\n sortRadial?: boolean;\n /**\n * Minimum interval between sort calls in milliseconds.\n * @default 0\n */\n minSortIntervalMs?: number;\n /**\n * Configures an offline render target for the GaussianSplatRenderer (as opposed to\n * rendering to the canvas). This is useful for rendering environment maps,\n * additional viewpoints, or video frame rendering.\n * @default undefined\n */\n target?: {\n /**\n * Width of the render target in pixels.\n */\n width: number;\n /**\n * Height of the render target in pixels.\n */\n height: number;\n /**\n * If you want to be able to render a scene that depends on this target's\n * output (for example, a recursive viewport), set this to true to enable\n * double buffering.\n * @default false\n */\n doubleBuffer?: boolean;\n /**\n * Super-sampling factor for the render target. Values 1-4 are supported.\n * Note that re-sampling back down to .width x .height is done on the CPU\n * with simple averaging only when calling readTarget().\n * @default 1\n */\n superXY?: number;\n } & THREE.RenderTargetOptions;\n /**\n * Extra uniform values to pass to the shader.\n * @default undefined = no extra uniforms\n */\n extraUniforms?: Record<string, unknown>;\n /**\n * Replace the default `splatVertex.glsl` splat shader with a custom one.\n * @default undefined = use the default `splatVertex.glsl` shader\n */\n vertexShader?: string;\n /**\n * Replace the default `splatFragment.glsl` splat shader with a custom one.\n * @default undefined = use the default `splatFragment.glsl` shader\n */\n fragmentShader?: string;\n /**\n * Set the splat shader material to be transparent which determines if the\n * splats are rendered during the first opaque THREE.js render pass or the\n * second transparent render pass.\n * @default undefined = true\n */\n transparent?: boolean;\n /**\n * Set the splat shader material to enable depth testing which determines if the\n * splats respect the Z depth buffer and blend with other opaque objects in the scene.\n * @default undefined = true\n */\n depthTest?: boolean;\n /**\n * Set the splat shader material to enable depth writing which determines if the\n * splats write to the Z depth buffer. Note that enabling this may produce\n * undesirable results because most of the Gsplat is transparent.\n * @default undefined = false\n */\n depthWrite?: boolean;\n}\n\nexport class GaussianSplatRenderer extends THREE.Mesh {\n readonly renderer: THREE.WebGLRenderer;\n readonly material: THREE.ShaderMaterial;\n readonly uniforms: ReturnType<typeof GaussianSplatRenderer.makeUniforms>;\n\n autoUpdate: boolean;\n preUpdate: boolean;\n static gaussianSplatOverride?: GaussianSplatRenderer;\n\n renderSize = new THREE.Vector2();\n maxStdDev: number;\n minPixelRadius: number;\n maxPixelRadius: number;\n minAlpha: number;\n enable2DGS: boolean;\n preBlurAmount: number;\n blurAmount: number;\n clipXY: number;\n focalAdjustment: number;\n sortRadial: boolean;\n minSortIntervalMs: number;\n\n readonly timer: THREE.Timer;\n private readonly ownsTimer: boolean;\n lastFrame = -1;\n updateTimeoutId = -1;\n onDirty?: () => void;\n dirty: boolean;\n\n private orderingTexture: THREE.DataTexture | null = null;\n private orderingBuffer: Uint32Array = new Uint32Array(0);\n maxSplats = 0;\n activeSplats = 0;\n\n display: SplatAccumulator;\n current: SplatAccumulator;\n accumulators: SplatAccumulator[] = [];\n\n sorting = false;\n sortDirty = false;\n lastSortTime = 0;\n sortWorker: SplatWorker | null = null;\n sortedCenter = new THREE.Vector3().setScalar(Number.NEGATIVE_INFINITY);\n sortedDir = new THREE.Vector3().setScalar(0);\n private sortedRadial: boolean | undefined;\n private sortCenterCache = new SortCenterCache();\n private sortStateRevision = 0;\n private uploadedSortStateRevision = -1;\n private updateRunning = false;\n private updatePromise: Promise<void> = Promise.resolve();\n private queuedUpdate: UpdateRequest | null = null;\n private disposed = false;\n\n target?: THREE.WebGLRenderTarget;\n backTarget?: THREE.WebGLRenderTarget;\n superPixels?: Uint8Array;\n targetPixels?: Uint8Array;\n superXY = 1;\n\n constructor(options: GaussianSplatRendererOptions) {\n if (!options) {\n throw new Error(\"GaussianSplatRenderer options are required\");\n }\n if (!options.renderer) {\n throw new Error(\"renderer is required in GaussianSplatRenderer options\");\n }\n\n const uniforms = GaussianSplatRenderer.makeUniforms();\n Object.assign(uniforms, options.extraUniforms ?? {});\n\n const shaders = getShaders();\n const premultipliedAlpha = options.premultipliedAlpha ?? true;\n const geometry = new SplatGeometry();\n const material = new THREE.ShaderMaterial({\n glslVersion: THREE.GLSL3,\n vertexShader: options.vertexShader ?? shaders.splatVertex,\n fragmentShader: options.fragmentShader ?? shaders.splatFragment,\n uniforms,\n premultipliedAlpha,\n transparent: options.transparent ?? true,\n depthTest: options.depthTest ?? true,\n depthWrite: options.depthWrite ?? false,\n side: THREE.DoubleSide,\n allowOverride: false,\n });\n\n super(geometry, material);\n this.material = material;\n this.uniforms = uniforms;\n // Disable frustum culling because we want to always draw them all\n // and cull Gsplats individually in the shader\n this.frustumCulled = false;\n\n // By default GaussianSplatRenderer will only render for layer 0\n // this.layers.enableAll();\n\n // gaussianSplatRendererInstance = this;\n this.renderer = options.renderer;\n this.onDirty = options.onDirty;\n this.dirty = true;\n this.autoUpdate = options.autoUpdate ?? true;\n this.preUpdate = options.preUpdate ?? true;\n\n this.maxStdDev = options.maxStdDev ?? Math.sqrt(8.0);\n this.minPixelRadius = options.minPixelRadius ?? 1.0;\n this.maxPixelRadius = options.maxPixelRadius ?? 512.0;\n this.minAlpha = options.minAlpha ?? DEFAULT_MIN_ALPHA;\n this.enable2DGS = options.enable2DGS ?? false;\n this.preBlurAmount = options.preBlurAmount ?? 0.0;\n this.blurAmount = options.blurAmount ?? 0.3;\n this.clipXY = options.clipXY ?? 1.25;\n this.focalAdjustment = options.focalAdjustment ?? 2.0;\n this.sortRadial = options.sortRadial ?? false;\n this.minSortIntervalMs = options.minSortIntervalMs ?? 0;\n\n const { timer, ownsTimer } = resolveTimer(options.timer);\n this.timer = timer;\n this.ownsTimer = ownsTimer;\n\n this.display = this.createAccumulator();\n this.current = this.display;\n this.accumulators.push(this.createAccumulator());\n\n // Check if the provoking vertex convention should be changed.\n const provokingVertexExt = this.renderer\n .getContext()\n .getExtension(\"WEBGL_provoking_vertex\");\n if (provokingVertexExt) {\n provokingVertexExt.provokingVertexWEBGL(\n provokingVertexExt.FIRST_VERTEX_CONVENTION_WEBGL,\n );\n }\n\n if (options.target) {\n const {\n width,\n height,\n doubleBuffer,\n superXY: origSuperXY,\n ...origTargetOptions\n } = options.target;\n const superXY = Math.max(1, Math.min(4, origSuperXY ?? 1));\n if (width * superXY > 8192 || height * superXY > 8192) {\n throw new Error(\"Target size too large\");\n }\n this.superXY = superXY;\n\n const superWidth = width * superXY;\n const superHeight = height * superXY;\n const targetOptions: THREE.RenderTargetOptions = {\n format: THREE.RGBAFormat,\n type: THREE.UnsignedByteType,\n colorSpace: THREE.SRGBColorSpace,\n ...origTargetOptions,\n };\n\n this.target = new THREE.WebGLRenderTarget(\n superWidth,\n superHeight,\n targetOptions,\n );\n if (doubleBuffer) {\n this.backTarget = new THREE.WebGLRenderTarget(\n superWidth,\n superHeight,\n targetOptions,\n );\n }\n }\n }\n\n raycast(_raycaster: THREE.Raycaster, _intersects: THREE.Intersection[]) {}\n\n static makeUniforms() {\n const uniforms = {\n // // number of active splats to render\n // numSplats: { value: 0 },\n // Size of render viewport in pixels\n renderSize: { value: new THREE.Vector2() },\n // Near and far plane distances\n near: { value: 0.1 },\n far: { value: 1000.0 },\n // SplatAccumulator to view transformation quaternion\n renderToViewQuat: { value: new THREE.Quaternion() },\n // SplatAccumulator to view transformation translation\n renderToViewPos: { value: new THREE.Vector3() },\n // SplatAccumulator to view transformation uniform scale\n renderToViewScale: { value: 1 },\n // Maximum distance (in stddevs) from Gsplat center to render\n maxStdDev: { value: 1.0 },\n // Minimum pixel radius for splat rendering\n minPixelRadius: { value: 1.0 },\n // Maximum pixel radius for splat rendering\n maxPixelRadius: { value: 512.0 },\n // Minimum alpha value for splat rendering\n minAlpha: { value: DEFAULT_MIN_ALPHA },\n // Enable interpreting 0-thickness Gsplats as 2DGS\n enable2DGS: { value: false },\n // Add to projected 2D splat covariance diagonal (thickens and brightens)\n preBlurAmount: { value: 0.0 },\n // Add to 2D splat covariance diagonal and adjust opacity (anti-aliasing)\n blurAmount: { value: 0.3 },\n // Clip Gsplats that are clipXY times beyond the +-1 frustum bounds\n clipXY: { value: 1.25 },\n // Debug renderSize scale factor\n focalAdjustment: { value: 2.0 },\n // Whether to encode Gsplat with linear RGB (for environment mapping)\n encodeLinear: { value: false },\n // Back-to-front sort ordering of splat indices\n ordering: { type: \"t\", value: GaussianSplatRenderer.emptyOrdering },\n // Gsplat collection to render\n splats: { type: \"t\", value: SplatAccumulator.emptyTexture },\n splats2: { type: \"t\", value: SplatAccumulator.emptyTexture },\n // Time in seconds for time-based effects\n time: { value: 0 },\n // Delta time in seconds since last frame\n deltaTime: { value: 0 },\n // Debug flag that alternates each frame\n debugFlag: { value: false },\n };\n return uniforms;\n }\n\n dispose() {\n if (this.disposed) return;\n this.disposed = true;\n this.queuedUpdate = null;\n\n // @ts-ignore Object base class has a dispose method in Three.js >= r186\n super.dispose?.();\n\n if (this.target) {\n this.target.dispose();\n this.target = undefined;\n }\n if (this.backTarget) {\n this.backTarget.dispose();\n this.backTarget = undefined;\n }\n if (this.orderingTexture) {\n this.orderingTexture.dispose();\n this.orderingTexture = null;\n }\n\n const accumulators = new Set<SplatAccumulator>();\n accumulators.add(this.display);\n accumulators.add(this.current);\n for (const accumulator of this.accumulators) {\n accumulators.add(accumulator);\n }\n for (const accumulator of accumulators) {\n accumulator.dispose();\n }\n this.accumulators.length = 0;\n\n this.resetSortWorker();\n this.releaseReadbackBuffers();\n this.orderingBuffer = new Uint32Array(0);\n this.maxSplats = 0;\n this.activeSplats = 0;\n\n this.geometry.dispose();\n this.material.dispose();\n }\n\n setDirty() {\n if (!this.dirty) {\n this.dirty = true;\n this.onDirty?.();\n }\n }\n\n private resetSortWorker() {\n this.sortWorker?.dispose();\n this.sortWorker = null;\n this.sortCenterCache.dispose();\n this.uploadedSortStateRevision = -1;\n }\n\n private releaseReadbackBuffers() {\n this.superPixels = undefined;\n this.targetPixels = undefined;\n }\n\n private createAccumulator() {\n return new SplatAccumulator();\n }\n\n private takeAccumulator() {\n return this.accumulators.pop() ?? this.createAccumulator();\n }\n\n private releaseAccumulator(accumulator: SplatAccumulator) {\n this.accumulators.push(accumulator);\n }\n\n private disposeOversizedAccumulators(maxSplats: number) {\n for (const accumulator of this.accumulators) {\n if (accumulator.maxSplats > maxSplats) accumulator.dispose();\n }\n }\n\n onBeforeRender(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.Camera,\n ) {\n const gaussianSplatRenderer =\n GaussianSplatRenderer.gaussianSplatOverride ?? this;\n\n const frame = renderer.info.render.frame;\n const isNewFrame = frame !== gaussianSplatRenderer.lastFrame;\n gaussianSplatRenderer.lastFrame = frame;\n\n const currentRenderTarget = renderer.getRenderTarget();\n const isXRRenderTarget = checkIsXRRenderTarget(currentRenderTarget);\n if (currentRenderTarget) {\n gaussianSplatRenderer.renderSize.set(\n currentRenderTarget.width,\n currentRenderTarget.height,\n );\n\n // WebXR mode on Apple Vision Pro returns 1x1 when presenting.\n // Use a different means to figure out the render size.\n if (\n isXRRenderTarget &&\n gaussianSplatRenderer.renderSize.x === 1 &&\n gaussianSplatRenderer.renderSize.y === 1\n ) {\n const baseLayer = renderer.xr.getSession()?.renderState.baseLayer;\n if (baseLayer) {\n gaussianSplatRenderer.renderSize.x = baseLayer.framebufferWidth;\n gaussianSplatRenderer.renderSize.y = baseLayer.framebufferHeight;\n }\n }\n } else {\n renderer.getDrawingBufferSize(gaussianSplatRenderer.renderSize);\n }\n this.uniforms.renderSize.value.copy(gaussianSplatRenderer.renderSize);\n\n // Trigger update after refreshing renderSize but before any uniforms that\n // depend on the active accumulator, avoiding both size and display latency.\n if (gaussianSplatRenderer.autoUpdate && isNewFrame) {\n const preUpdate =\n gaussianSplatRenderer.preUpdate && !renderer.xr.isPresenting;\n let useCamera = camera;\n if (renderer.xr.isPresenting) {\n const xrCamera = renderer.xr.getCamera();\n // Keep the per-eye camera parented to the XR rig so its world transform\n // includes any scale applied to that rig.\n useCamera = xrCamera.cameras[0] ?? xrCamera;\n }\n if (preUpdate) {\n gaussianSplatRenderer.updateInternal({\n scene,\n camera: useCamera,\n autoUpdate: true,\n shrinkResources: false,\n });\n } else if (gaussianSplatRenderer.updateTimeoutId === -1) {\n gaussianSplatRenderer.updateTimeoutId = setTimeout(() => {\n gaussianSplatRenderer.updateTimeoutId = -1;\n gaussianSplatRenderer.updateInternal({\n scene,\n camera: useCamera,\n autoUpdate: true,\n shrinkResources: false,\n });\n }, 1);\n }\n }\n\n const typedCamera = camera as\n | THREE.PerspectiveCamera\n | THREE.OrthographicCamera;\n\n this.uniforms.near.value = typedCamera.near;\n this.uniforms.far.value = typedCamera.far;\n\n const geometry = this.geometry as SplatGeometry;\n geometry.instanceCount = gaussianSplatRenderer.activeSplats;\n\n const display = gaussianSplatRenderer.display;\n // Accumulator centers are stored camera-relative.\n const accumToWorld = new THREE.Matrix4().makeTranslation(\n display.viewOrigin,\n );\n const cameraToWorld = camera.matrixWorld.clone();\n const worldToCamera = cameraToWorld.invert();\n const accumToCamera = worldToCamera.multiply(accumToWorld);\n accumToCamera.decompose(\n this.uniforms.renderToViewPos.value,\n this.uniforms.renderToViewQuat.value,\n renderToViewScaleTmp,\n );\n this.uniforms.renderToViewScale.value =\n (renderToViewScaleTmp.x +\n renderToViewScaleTmp.y +\n renderToViewScaleTmp.z) /\n 3;\n this.uniforms.maxStdDev.value = gaussianSplatRenderer.maxStdDev;\n this.uniforms.minPixelRadius.value = gaussianSplatRenderer.minPixelRadius;\n this.uniforms.maxPixelRadius.value = gaussianSplatRenderer.maxPixelRadius;\n this.uniforms.minAlpha.value = gaussianSplatRenderer.minAlpha;\n this.uniforms.enable2DGS.value = gaussianSplatRenderer.enable2DGS;\n this.uniforms.preBlurAmount.value = gaussianSplatRenderer.preBlurAmount;\n this.uniforms.blurAmount.value = gaussianSplatRenderer.blurAmount;\n this.uniforms.clipXY.value = gaussianSplatRenderer.clipXY;\n this.uniforms.focalAdjustment.value = gaussianSplatRenderer.focalAdjustment;\n const outputColorSpace =\n currentRenderTarget === null\n ? renderer.outputColorSpace\n : isXRRenderTarget\n ? currentRenderTarget.texture.colorSpace\n : THREE.ColorManagement.workingColorSpace;\n this.uniforms.encodeLinear.value =\n outputColorSpace !== THREE.SRGBColorSpace;\n\n this.uniforms.ordering.value =\n gaussianSplatRenderer.orderingTexture ??\n GaussianSplatRenderer.emptyOrdering;\n const splatTextures = display.getTextures();\n this.uniforms.splats.value = splatTextures[0];\n this.uniforms.splats2.value = splatTextures[1];\n\n this.uniforms.time.value = display.time;\n this.uniforms.deltaTime.value = display.deltaTime;\n // Alternating debug flag that can aid in visual debugging\n this.uniforms.debugFlag.value = (performance.now() / 1000.0) % 2.0 < 1.0;\n\n gaussianSplatRenderer.dirty = false;\n }\n\n clearSplats() {\n this.activeSplats = 0;\n this.display.numSplats = 0;\n this.setDirty();\n }\n\n async update({\n scene,\n camera,\n }: {\n scene: THREE.Scene;\n camera: THREE.Camera;\n }) {\n await this.updateInternal({\n scene,\n camera,\n autoUpdate: false,\n shrinkResources: false,\n });\n }\n\n /** Updates the current scene and shrinks renderer work resources to their current allocation tiers. */\n async shrinkResources({\n scene,\n camera,\n }: {\n scene: THREE.Scene;\n camera: THREE.Camera;\n }) {\n await this.updateInternal({\n scene,\n camera,\n autoUpdate: false,\n shrinkResources: true,\n });\n }\n\n private updateInternal(request: UpdateRequest): Promise<void> {\n if (this.disposed) return Promise.resolve();\n\n const pending = this.queuedUpdate;\n this.queuedUpdate = {\n scene: request.scene,\n camera: request.camera,\n // A queued explicit update must not be weakened by a later automatic one.\n autoUpdate: request.autoUpdate && (pending?.autoUpdate ?? true),\n shrinkResources:\n request.shrinkResources || (pending?.shrinkResources ?? false),\n };\n\n if (!this.updateRunning) {\n this.updateRunning = true;\n this.updatePromise = this.drainUpdates();\n }\n return this.updatePromise;\n }\n\n private async drainUpdates() {\n try {\n while (this.queuedUpdate) {\n const request = this.queuedUpdate;\n this.queuedUpdate = null;\n await this.performUpdate(request);\n }\n } catch (error) {\n this.queuedUpdate = null;\n throw error;\n } finally {\n this.updateRunning = false;\n }\n }\n\n private async performUpdate({\n scene,\n camera,\n autoUpdate,\n shrinkResources,\n }: UpdateRequest) {\n const renderer = this.renderer;\n if (shrinkResources) {\n this.releaseReadbackBuffers();\n }\n if (this.ownsTimer) {\n this.timer.update();\n }\n\n const center = camera.getWorldPosition(new THREE.Vector3());\n const dir = camera.getWorldDirection(new THREE.Vector3());\n\n const viewChanged =\n center.distanceTo(this.sortedCenter) >\n 0.001 * getCameraWorldScale(camera) ||\n dir.dot(this.sortedDir) < 0.999 ||\n this.sortRadial !== this.sortedRadial;\n\n const next = this.takeAccumulator();\n if (next === this.current) {\n // Should never happen\n throw new Error(\n \"Next accumulator is the same as the current accumulator\",\n );\n }\n let preparation: ReturnType<SplatAccumulator[\"prepareGenerate\"]>;\n try {\n preparation = next.prepareGenerate({\n renderer,\n scene,\n timer: this.timer,\n camera,\n previous: this.current,\n });\n } catch (error) {\n this.releaseAccumulator(next);\n throw error;\n }\n const { version, sortUpdated, requiredMaxSplats, generate } = preparation;\n const orderingNeedsShrink =\n shrinkResources &&\n getOrderingCapacity(requiredMaxSplats) < this.maxSplats;\n // Explicit updates, including shrinkResources(), always regenerate. Only an\n // unchanged automatic update can skip the candidate accumulator.\n const doUpdate =\n !autoUpdate || viewChanged || version !== this.current.version;\n const needsSort = orderingNeedsShrink || viewChanged || sortUpdated;\n\n if (!doUpdate) {\n // Restore unused accumulator to the free list\n this.releaseAccumulator(next);\n } else {\n try {\n generate(shrinkResources);\n } catch (error) {\n this.releaseAccumulator(next);\n throw error;\n }\n\n if (sortUpdated) {\n this.sortStateRevision += 1;\n }\n\n if (this.display.mappingVersion === next.mappingVersion && !needsSort) {\n // Appearance-only update: the mapping and existing sort order are\n // still valid, so display the new accumulator immediately.\n this.releaseAccumulator(this.display);\n this.display = next;\n } else {\n if (this.display !== this.current) {\n // The previous current is not being displayed, so replace it\n this.releaseAccumulator(this.current);\n }\n }\n\n this.current = next;\n // Appearance-only updates can reuse the current ordering. Preserve an\n // already pending sort, but do not enqueue a new one unless depth or the\n // mapping may have changed.\n this.sortDirty ||= needsSort;\n this.setDirty();\n }\n\n await this.driveSort(orderingNeedsShrink);\n if (shrinkResources) {\n this.disposeOversizedAccumulators(this.current.maxSplats);\n }\n }\n\n private async driveSort(shrinkOrdering = false) {\n if (this.disposed || this.sorting || !this.sortDirty) {\n return;\n }\n\n const now = performance.now();\n const nextSortTime = this.lastSortTime\n ? this.lastSortTime + this.minSortIntervalMs\n : now;\n if (now < nextSortTime) {\n await new Promise((resolve) => setTimeout(resolve, nextSortTime - now));\n if (this.disposed) return;\n }\n\n this.sorting = true;\n this.sortDirty = false;\n this.lastSortTime = performance.now();\n const current = this.current;\n const previousActiveSplats = this.activeSplats;\n\n try {\n if (shrinkOrdering) this.resetSortWorker();\n const sortRadial = this.sortRadial;\n if (this.sortWorker && this.sortedRadial !== sortRadial) {\n this.resetSortWorker();\n }\n this.sortWorker ??= new SplatWorker();\n const sortWorker = this.sortWorker;\n const { numSplats, maxSplats } = current;\n const orderingMaxSplats = getOrderingCapacity(maxSplats);\n const rows = orderingMaxSplats / SPLATS_PER_ORDERING_ROW;\n this.maxSplats = shrinkOrdering\n ? orderingMaxSplats\n : Math.max(this.maxSplats, orderingMaxSplats);\n if (this.orderingBuffer.length !== this.maxSplats) {\n this.orderingBuffer = new Uint32Array(this.maxSplats);\n }\n\n const stateRevision = this.sortStateRevision;\n if (this.uploadedSortStateRevision !== stateRevision) {\n const { payload, commit } = this.sortCenterCache.prepare(current);\n await sortWorker.call(\"setSortCenterState\", payload);\n commit();\n this.uploadedSortStateRevision = stateRevision;\n }\n\n const result = await sortWorker.call(\"sortCenters32\", {\n numSplats,\n cameraPosition: [\n current.viewOrigin.x,\n current.viewOrigin.y,\n current.viewOrigin.z,\n ],\n direction: [\n current.viewDirection.x,\n current.viewDirection.y,\n current.viewDirection.z,\n ],\n radial: sortRadial,\n ordering: this.orderingBuffer,\n });\n\n this.activeSplats = result.activeSplats;\n const activeRows = Math.ceil(\n result.activeSplats / SPLATS_PER_ORDERING_ROW,\n );\n const previousOrdering = this.orderingTexture?.image.data;\n\n if (\n this.orderingTexture &&\n (rows > this.orderingTexture.image.height ||\n (shrinkOrdering && rows !== this.orderingTexture.image.height))\n ) {\n this.orderingTexture.dispose();\n this.orderingTexture = null;\n }\n\n if (!this.orderingTexture) {\n // console.log(`Allocating orderingTexture: ${ORDERING_TEXTURE_WIDTH}x${rows}`);\n const orderingTexture = new THREE.DataTexture(\n result.ordering,\n ORDERING_TEXTURE_WIDTH,\n rows,\n THREE.RGBAIntegerFormat,\n THREE.UnsignedIntType,\n );\n orderingTexture.internalFormat = \"RGBA32UI\";\n orderingTexture.needsUpdate = true;\n this.orderingTexture = orderingTexture;\n } else {\n this.orderingTexture.image.data = result.ordering;\n const renderer = this.renderer;\n if (!renderer.properties.has(this.orderingTexture)) {\n this.orderingTexture.needsUpdate = true;\n } else if (activeRows > 0) {\n uploadU32DataTextureRows(\n renderer,\n this.orderingTexture,\n ORDERING_TEXTURE_WIDTH,\n activeRows,\n result.ordering,\n );\n }\n }\n\n // Alternate two buffers so the texture's CPU-side source stays attached\n // while the other buffer is transferred to the worker for the next sort.\n this.orderingBuffer =\n previousOrdering instanceof Uint32Array &&\n previousOrdering.length === this.maxSplats\n ? previousOrdering\n : new Uint32Array(this.maxSplats);\n\n // console.log(`Sorted (${this.minSortIntervalMs}) ${numSplats} splats in ${(performance.now() - now).toFixed(0)} ms`);\n\n this.sortedCenter.copy(current.viewOrigin);\n this.sortedDir.copy(current.viewDirection);\n this.sortedRadial = sortRadial;\n if (this.current === current && this.display !== current) {\n this.releaseAccumulator(this.display);\n this.display = current;\n }\n this.setDirty();\n } catch (error) {\n if (this.disposed) return;\n\n this.sortDirty = true;\n if (\n this.current === current &&\n current !== this.display &&\n this.accumulators.length === 0\n ) {\n // A candidate waiting on a new ordering cannot be displayed. Roll back\n // to the still-valid display accumulator and free the failed one.\n this.current = this.display;\n this.releaseAccumulator(current);\n this.activeSplats = previousActiveSplats;\n this.sortDirty = false;\n this.uploadedSortStateRevision = -1;\n }\n throw error;\n } finally {\n this.sorting = false;\n }\n }\n\n private static emptyOrdering = (() => {\n const numIndices = 4 * ORDERING_TEXTURE_WIDTH;\n const emptyArray = new Uint32Array(numIndices);\n const texture = new THREE.DataTexture(\n emptyArray,\n ORDERING_TEXTURE_WIDTH,\n 1,\n );\n texture.format = THREE.RGBAIntegerFormat;\n texture.type = THREE.UnsignedIntType;\n texture.internalFormat = \"RGBA32UI\";\n texture.needsUpdate = true;\n return texture;\n })();\n\n render(scene: THREE.Scene, camera: THREE.Camera) {\n const previousOverride = GaussianSplatRenderer.gaussianSplatOverride;\n try {\n GaussianSplatRenderer.gaussianSplatOverride = this;\n this.renderer.render(scene, camera);\n } finally {\n GaussianSplatRenderer.gaussianSplatOverride = previousOverride;\n }\n }\n\n renderTarget({\n scene,\n camera,\n }: { scene: THREE.Scene; camera: THREE.Camera }): THREE.WebGLRenderTarget {\n const target = this.backTarget ?? this.target;\n if (!target) {\n throw new Error(\"No target\");\n }\n\n const previousTarget = this.renderer.getRenderTarget();\n const previousOverride = GaussianSplatRenderer.gaussianSplatOverride;\n try {\n this.renderer.setRenderTarget(target);\n GaussianSplatRenderer.gaussianSplatOverride = this;\n this.renderer.render(scene, camera);\n } finally {\n GaussianSplatRenderer.gaussianSplatOverride = previousOverride;\n this.renderer.setRenderTarget(previousTarget);\n }\n\n if (target !== this.target) {\n // Swap back buffer and target\n [this.target, this.backTarget] = [this.backTarget, this.target];\n }\n return target;\n }\n\n // Read back the previously rendered target image as a Uint8Array of packed\n // RGBA values (in that order). Subsequent calls to this.readTarget()\n // will reuse the same buffers to minimize memory allocations.\n async readTarget(): Promise<Uint8Array> {\n if (!this.target) {\n throw new Error(\"Must initialize with target\");\n }\n const { width, height } = this.target;\n const byteSize = width * height * 4;\n if (!this.superPixels || this.superPixels.length < byteSize) {\n this.superPixels = new Uint8Array(byteSize);\n // console.log(`Allocated superPixels: ${width}x${height} = ${pixelCount} bytes`);\n }\n const superPixels = this.superPixels;\n\n await this.renderer.readRenderTargetPixelsAsync(\n this.target,\n 0,\n 0,\n width,\n height,\n superPixels,\n );\n\n const { superXY } = this;\n if (superXY === 1) {\n return superPixels;\n }\n\n const subWidth = width / superXY;\n const subHeight = height / superXY;\n const subSize = subWidth * subHeight * 4;\n if (!this.targetPixels || this.targetPixels.length < subSize) {\n this.targetPixels = new Uint8Array(subSize);\n // console.log(`Allocated targetPixels: ${subWidth}x${subHeight} = ${subSize} bytes`);\n }\n const targetPixels = this.targetPixels;\n\n const super2 = superXY * superXY;\n for (let y = 0; y < subHeight; y++) {\n const row = y * subWidth;\n for (let x = 0; x < subWidth; x++) {\n const superCol = x * superXY;\n let r = 0;\n let g = 0;\n let b = 0;\n let a = 0;\n for (let sy = 0; sy < superXY; sy++) {\n const superRow = (y * superXY + sy) * width;\n for (let sx = 0; sx < superXY; sx++) {\n const superIndex = (superRow + superCol + sx) * 4;\n r += superPixels[superIndex];\n g += superPixels[superIndex + 1];\n b += superPixels[superIndex + 2];\n a += superPixels[superIndex + 3];\n }\n }\n const pixelIndex = (row + x) * 4;\n targetPixels[pixelIndex] = r / super2;\n targetPixels[pixelIndex + 1] = g / super2;\n targetPixels[pixelIndex + 2] = b / super2;\n targetPixels[pixelIndex + 3] = a / super2;\n }\n }\n return targetPixels;\n }\n\n async renderReadTarget({\n scene,\n camera,\n }: {\n scene: THREE.Scene;\n camera: THREE.Camera;\n }): Promise<Uint8Array> {\n this.renderTarget({ scene, camera });\n return this.readTarget();\n }\n\n // Data and buffers used for environment map rendering\n private static cubeRender: {\n target: THREE.WebGLCubeRenderTarget;\n cubeCamera: THREE.CubeCamera;\n near: number;\n far: number;\n } | null = null;\n private static pmrem: THREE.PMREMGenerator | null = null;\n\n // Renders out the scene to a cube map that can be used for\n // Image-based lighting or similar applications. First optionally updates Gsplats,\n // sorts them with respect to the provided worldCenter, renders 6 cube faces.\n async renderCubeMap({\n scene,\n worldCenter,\n size = 256,\n near = 0.1,\n far = 1000,\n hideObjects = [],\n update = true,\n filter = false,\n }: {\n scene: THREE.Scene;\n worldCenter: THREE.Vector3;\n size?: number;\n near?: number;\n far?: number;\n hideObjects: THREE.Object3D[];\n update: boolean;\n filter: boolean;\n }): Promise<THREE.CubeTexture> {\n if (\n !GaussianSplatRenderer.cubeRender ||\n GaussianSplatRenderer.cubeRender.target.width !== size ||\n GaussianSplatRenderer.cubeRender.near !== near ||\n GaussianSplatRenderer.cubeRender.far !== far\n ) {\n if (GaussianSplatRenderer.cubeRender) {\n GaussianSplatRenderer.cubeRender.target.dispose();\n }\n const target = new THREE.WebGLCubeRenderTarget(size, {\n format: THREE.RGBAFormat,\n type: THREE.UnsignedByteType,\n generateMipmaps: filter,\n minFilter: filter ? THREE.LinearMipMapLinearFilter : THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n colorSpace: filter ? THREE.LinearSRGBColorSpace : THREE.SRGBColorSpace,\n });\n const cubeCamera = new THREE.CubeCamera(near, far, target);\n GaussianSplatRenderer.cubeRender = { target, cubeCamera, near, far };\n }\n\n const { target, cubeCamera } = GaussianSplatRenderer.cubeRender;\n cubeCamera.position.copy(worldCenter);\n\n // Save the visibility state of objects we want to hide before render\n const objectVisibility = new Map<THREE.Object3D, boolean>();\n for (const object of hideObjects) {\n if (!objectVisibility.has(object)) {\n objectVisibility.set(object, object.visible);\n }\n object.visible = false;\n }\n\n const previousOverride = GaussianSplatRenderer.gaussianSplatOverride;\n try {\n if (update) {\n const tempCamera = new THREE.Camera();\n tempCamera.position.copy(worldCenter);\n await this.update({ scene, camera: tempCamera });\n }\n\n GaussianSplatRenderer.gaussianSplatOverride = this;\n // Update the CubeCamera, which performs 6 cube face renders\n cubeCamera.update(this.renderer, scene);\n return target.texture;\n } finally {\n GaussianSplatRenderer.gaussianSplatOverride = previousOverride;\n for (const [object, visible] of objectVisibility.entries()) {\n object.visible = visible;\n }\n }\n }\n\n async readCubeTargets(): Promise<Uint8Array[]> {\n if (!GaussianSplatRenderer.cubeRender) {\n throw new Error(\"No cube render\");\n }\n\n const { target } = GaussianSplatRenderer.cubeRender;\n const { width, height } = target;\n const promises = [];\n const buffers = [];\n\n for (let i = 0; i < target.texture.images.length; ++i) {\n const byteSize = width * height * 4;\n const readback = new Uint8Array(byteSize);\n buffers.push(readback);\n const promise = this.renderer.readRenderTargetPixelsAsync(\n target,\n 0,\n 0,\n width,\n height,\n readback,\n i,\n );\n promises.push(promise);\n }\n\n await Promise.all(promises);\n return buffers;\n }\n\n // Renders out the scene to an environment map that can be used for\n // Image-based lighting or similar applications. First optionally updates Gsplats,\n // sorts them with respect to the provided worldCenter, renders 6 cube faces,\n // then pre-filters them using THREE.PMREMGenerator and returns a THREE.Texture\n // that can assigned directly to a THREE.MeshStandardMaterial.envMap property.\n async renderEnvMap({\n scene,\n worldCenter,\n size = 256,\n near = 0.1,\n far = 1000,\n hideObjects = [],\n update = true,\n }: {\n scene: THREE.Scene;\n worldCenter: THREE.Vector3;\n size?: number;\n near?: number;\n far?: number;\n hideObjects: THREE.Object3D[];\n update: boolean;\n }): Promise<THREE.Texture> {\n const cubeTexture = await this.renderCubeMap({\n scene,\n worldCenter,\n size,\n near,\n far,\n hideObjects,\n update,\n filter: true,\n });\n // Pre-filter the cube map using THREE.PMREMGenerator if requested\n if (!GaussianSplatRenderer.pmrem) {\n GaussianSplatRenderer.pmrem = new THREE.PMREMGenerator(this.renderer);\n }\n\n return GaussianSplatRenderer.pmrem?.fromCubemap(cubeTexture).texture;\n }\n\n // Utility function to recursively set the envMap property for any\n // THREE.MeshStandardMaterial within the subtree of root.\n recurseSetEnvMap(root: THREE.Object3D, envMap: THREE.Texture) {\n root.traverse((node) => {\n if (node instanceof THREE.Mesh) {\n if (Array.isArray(node.material)) {\n for (const material of node.material) {\n if (material instanceof THREE.MeshStandardMaterial) {\n material.envMap = envMap;\n }\n }\n } else {\n if (node.material instanceof THREE.MeshStandardMaterial) {\n node.material.envMap = envMap;\n }\n }\n }\n });\n }\n\n get premultipliedAlpha(): boolean {\n return this.material.premultipliedAlpha;\n }\n\n set premultipliedAlpha(value: boolean) {\n if (this.material.premultipliedAlpha !== value) {\n this.material.premultipliedAlpha = value;\n this.material.needsUpdate = true;\n }\n }\n\n get transparent(): boolean {\n return this.material.transparent;\n }\n\n set transparent(value: boolean) {\n if (this.material.transparent !== value) {\n this.material.transparent = value;\n this.material.needsUpdate = true;\n }\n }\n\n get depthTest(): boolean {\n return this.material.depthTest;\n }\n\n set depthTest(value: boolean) {\n this.material.depthTest = value;\n }\n\n get depthWrite(): boolean {\n return this.material.depthWrite;\n }\n\n set depthWrite(value: boolean) {\n this.material.depthWrite = value;\n }\n}\n\nfunction checkIsXRRenderTarget(renderTarget: THREE.RenderTarget | null) {\n return (renderTarget as unknown as Record<string, boolean>)?.isXRRenderTarget;\n}\n","/** @internal */\nexport enum Opcode {\n Constant = 1,\n InputField = 2,\n InputAttribute = 3,\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 Tan = 26,\n Asin = 27,\n Atan = 28,\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 Atan2 = 49,\n Select = 60,\n Clamp = 61,\n Mix = 62,\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\">;\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;\ntype ValueLike<T extends SplatPostDecodeValueType> =\n | LiteralFor<T>\n | SplatPostDecodeValue<T>;\ntype AnyValueLike = ValueLike<SplatPostDecodeValueType>;\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 const SPLAT_POST_DECODE_INSTRUCTION_OPCODE = 0;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_WIDTH = 1;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_IMMEDIATE = 2;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_0 = 3;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_COUNT = 4;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_STRIDE = 7;\n/** @internal */\nexport const SPLAT_POST_DECODE_MISSING_ARGUMENT = 0xffff;\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;\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};\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;\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 coefficients.push(\n this.owner.coerce(\n transform(this.coefficient(index), { index, degree, order }),\n \"vec3\",\n ),\n );\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};\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 VariadicNumericOperation = <T extends NumericValueType>(\n first: ValueLike<T>,\n ...rest: BroadcastLike<T>[]\n) => SplatPostDecodeValue<T>;\ntype BinaryNumericOperation = <T extends NumericValueType>(\n left: ValueLike<T>,\n right: BroadcastLike<T>,\n) => SplatPostDecodeValue<T>;\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 tan: UnaryNumericOperation;\n asin: UnaryNumericOperation;\n atan: UnaryNumericOperation;\n atan2: BinaryNumericOperation;\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\ntype SplatPostDecodeContext = {\n splat: SplatPostDecodeInput;\n op: SplatPostDecodeOperations;\n attribute<Components extends AttributeComponents = 1>(\n options: SplatPostDecodeAttributeOptions<Components>,\n ): AttributeValue<Components>;\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 const SPLAT_POST_DECODE_FLOW_STAGE_START = 0;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_INSTRUCTION = 1;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_REGISTER = 2;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_ON_TRUE = 3;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_ON_FALSE = 4;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_STRIDE = 5;\n\n/** @internal */\nexport type SerializedSplatPostDecodeCondition = {\n mode: \"flow\";\n /** Packed start/instruction/register/onTrue/onFalse Uint16 records. */\n stages: Uint16Array;\n};\n\n/** @internal */\nexport type SerializedSplatPostDecode = {\n /** Packed opcode/width/immediate/arg0/arg1/arg2/arg3 Uint16 records. */\n instructions: Uint16Array;\n constants: Float32Array;\n outputs: Omit<SplatPostDecodeOutputs, \"when\">;\n condition?: SerializedSplatPostDecodeCondition;\n attributeData: Uint8Array;\n attributes: readonly SerializedSplatPostDecodeAttribute[];\n};\n\nconst SPLAT_POST_DECODE_PROGRAM = Symbol(\"SplatPostDecodeProgram\");\nexport type SplatPostDecodeProgram = {\n readonly [SPLAT_POST_DECODE_PROGRAM]: true;\n};\n\nconst COMPONENT_TYPES = [\"float\", \"vec2\", \"vec3\", \"vec4\"] as const;\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) && value.length >= 2 && value.length <= 4) {\n return COMPONENT_TYPES[value.length - 1];\n }\n throw new Error(\"Unsupported postDecode literal\");\n}\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\nclass ProgramBuilder {\n readonly instructions: SplatPostDecodeInstruction[] = [];\n readonly constants: number[] = [];\n readonly attributes: AttributeBinding[] = [];\n readonly op: SplatPostDecodeOperations;\n readonly splat: SplatPostDecodeInput;\n\n readonly constantRegisters = new Map<\n string,\n SplatPostDecodeValue<SplatPostDecodeValueType>\n >();\n readonly inputRegisters = new Map<\n number,\n SplatPostDecodeValue<SplatPostDecodeValueType>\n >();\n\n constructor() {\n this.op = this.createOperations();\n const builder = this;\n const sh = new SplatPostDecodeShValue(this);\n this.splat = {\n get position() {\n return builder.inputField(\"vec3\", InputField.Position);\n },\n get scale() {\n return builder.inputField(\"vec3\", InputField.Scale);\n },\n get quaternion() {\n return builder.inputField(\"quaternion\", InputField.Quaternion);\n },\n get opacity() {\n return builder.inputField(\"float\", InputField.Opacity);\n },\n get alpha() {\n return builder.inputField(\"float\", InputField.Alpha);\n },\n get color() {\n return builder.inputField(\"vec3\", InputField.Color);\n },\n sh,\n };\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 inputField<T extends SplatPostDecodeValueType>(\n type: T,\n field: InputField,\n ): SplatPostDecodeValue<T> {\n const existing = this.inputRegisters.get(field);\n if (existing) return existing 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 }\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 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 COMPONENT_TYPES[components - 1],\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 vec4Quaternion =\n (expectedType === \"quaternion\" && value.type === \"vec4\") ||\n (expectedType === \"vec4\" && value.type === \"quaternion\");\n if (!vec4Quaternion) {\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 values = numeric.map(Math.fround);\n if (!values.every(Number.isFinite)) {\n throw new Error(\"postDecode constants must be finite\");\n }\n const key = constantKey(type, values);\n const existing = this.constantRegisters.get(key);\n if (existing) return existing as SplatPostDecodeValue<T>;\n\n const immediate = this.constants.length;\n this.constants.push(...values);\n const result = this.instruction(type as T, Opcode.Constant, [], immediate);\n this.constantRegisters.set(key, result);\n return result;\n }\n\n private unary(\n opcode: Opcode,\n value: AnyValueLike,\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(\n opcode: Opcode,\n leftValue: AnyValueLike,\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(\n opcode: Opcode,\n firstValue: AnyValueLike,\n secondValue: AnyValueLike,\n thirdValue: AnyValueLike,\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 return value.type === \"float\" && TYPE_WIDTHS[targetType] > 1\n ? this.coerce(value)\n : 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 result = this.coerce(first);\n for (const right of rest) {\n result = this.binary(\n opcode,\n result,\n right,\n ) as SplatPostDecodeValue<T>;\n }\n return result;\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[]): BoolValue => {\n let result = this.coerce(first, \"bool\");\n for (const right of rest) {\n result = this.binary(opcode, result, right, \"bool\") as BoolValue;\n }\n return result;\n };\n const construct = <T extends VectorValueType | \"quaternion\">(\n opcode: Opcode,\n type: T,\n values: FloatLike[],\n ) =>\n this.instruction(\n type,\n opcode,\n values.map((value) => this.coerce(value, \"float\").register),\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: (value, min, max) =>\n this.ternary(Opcode.Clamp, value, min, max) as never,\n mix: (left, right, amount) =>\n this.ternary(Opcode.Mix, left, right, amount) as never,\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 tan: unaryNumeric(Opcode.Tan),\n asin: unaryNumeric(Opcode.Asin),\n atan: unaryNumeric(Opcode.Atan),\n atan2: binaryNumeric(Opcode.Atan2),\n normalize: (value) => this.unary(Opcode.Normalize, value) as never,\n length: (value) =>\n this.unary(Opcode.Length, value, \"float\") as FloatValue,\n isFinite: (value) =>\n this.unary(Opcode.IsFinite, value, \"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: (condition, whenTrue, whenFalse) => {\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 never;\n },\n dot: (left, right) =>\n this.binary(Opcode.Dot, left, right, \"float\") 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(Opcode.MaxComponentIndex, value, \"float\") as FloatValue,\n quatMul: (left, right) => {\n const a = this.coerce(left, \"quaternion\");\n const b = this.coerce(right, \"quaternion\");\n return this.instruction(\"quaternion\", Opcode.QuaternionMultiply, [\n a.register,\n b.register,\n ]);\n },\n rotateVector: (quaternion, vector) => {\n const q = this.coerce(quaternion, \"quaternion\");\n const v = this.coerce(vector, \"vec3\");\n return this.instruction(\"vec3\", Opcode.RotateVector, [\n q.register,\n v.register,\n ]);\n },\n };\n }\n}\n\nclass GenerationRegisterMap {\n private readonly values: Int32Array;\n private readonly generations: Uint32Array;\n private generation = 1;\n\n constructor(size: number) {\n this.values = new Int32Array(size);\n this.generations = new Uint32Array(size);\n }\n\n clear() {\n if (this.generation === 0xffff_ffff) {\n this.generations.fill(0);\n this.generation = 1;\n } else {\n this.generation += 1;\n }\n }\n\n has(source: number) {\n return this.generations[source] === this.generation;\n }\n\n get(source: number) {\n return this.has(source) ? this.values[source] : undefined;\n }\n\n set(source: number, target: number) {\n this.generations[source] = this.generation;\n this.values[source] = target;\n }\n\n delete(source: number) {\n this.generations[source] = 0;\n }\n}\n\ntype CompiledProgram = {\n instructions: SplatPostDecodeInstruction[];\n constants: number[];\n outputs: Omit<SplatPostDecodeOutputs, \"when\">;\n condition?: SerializedSplatPostDecodeCondition;\n attributes: AttributeBinding[];\n};\n\nfunction markDependencies(\n builder: ProgramBuilder,\n roots: readonly (number | undefined)[],\n marked: Uint8Array,\n) {\n const pending: number[] = [];\n for (const root of roots) {\n if (root === undefined || marked[root]) continue;\n marked[root] = 1;\n pending.push(root);\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/**\n * Serializes source instructions while remapping only live registers. A\n * generation map represents the current straight-line path. Branch merges\n * advance its generation in O(1), while unique predecessors reuse it. One\n * generation array is also shared by every dependency walk.\n */\nclass InstructionSerializer {\n readonly instructions: SplatPostDecodeInstruction[] = [];\n readonly constants: number[] = [];\n readonly attributes: AttributeBinding[] = [];\n\n private readonly constantMap = new Map<number, number>();\n private readonly attributeMap = new Map<number, number>();\n private readonly dependencyMarks: Uint32Array;\n private dependencyGeneration = 0;\n\n constructor(private readonly builder: ProgramBuilder) {\n this.dependencyMarks = new Uint32Array(builder.instructions.length);\n }\n\n appendDependencies(\n roots: readonly (number | undefined)[],\n registers: GenerationRegisterMap,\n forceRoots = false,\n ) {\n if (forceRoots) {\n for (const root of roots) {\n if (\n root !== undefined &&\n this.builder.instructions[root].opcode !== Opcode.Constant\n ) {\n registers.delete(root);\n }\n }\n }\n\n this.dependencyGeneration += 1;\n const generation = this.dependencyGeneration;\n const pending: number[] = [];\n const sourceOrder: number[] = [];\n for (const root of roots) {\n if (root !== undefined && !registers.has(root)) pending.push(root);\n }\n while (pending.length !== 0) {\n const source = pending.pop();\n if (\n source === undefined ||\n registers.has(source) ||\n this.dependencyMarks[source] === generation\n ) {\n continue;\n }\n this.dependencyMarks[source] = generation;\n sourceOrder.push(source);\n for (const argument of this.builder.instructions[source].args) {\n if (!registers.has(argument)) pending.push(argument);\n }\n }\n\n sourceOrder.sort((left, right) => left - right);\n this.append(sourceOrder, registers);\n return registers;\n }\n\n append(sourceOrder: readonly number[], registers: GenerationRegisterMap) {\n for (const sourceIndex of sourceOrder) {\n const source = this.builder.instructions[sourceIndex];\n if (source.opcode === Opcode.Constant) {\n let target = this.constantMap.get(sourceIndex);\n if (target === undefined) {\n this.reserveInstruction();\n target = this.instructions.length;\n this.constantMap.set(sourceIndex, target);\n const immediate = this.constants.length;\n this.constants.push(\n ...this.builder.constants.slice(\n source.immediate,\n source.immediate + TYPE_WIDTHS[source.type],\n ),\n );\n this.instructions.push({ ...source, immediate });\n }\n registers.set(sourceIndex, target);\n continue;\n }\n\n this.reserveInstruction();\n let immediate = source.immediate;\n if (source.opcode === Opcode.InputAttribute) {\n let target = this.attributeMap.get(immediate);\n if (target === undefined) {\n target = this.attributes.length;\n this.attributeMap.set(immediate, target);\n this.attributes.push(this.builder.attributes[immediate]);\n }\n immediate = target;\n }\n const args = source.args.map((argument) => {\n const target = registers.get(argument);\n if (target === undefined) {\n throw new Error(\"Invalid postDecode instruction dependency\");\n }\n return target;\n });\n registers.set(sourceIndex, this.instructions.length);\n this.instructions.push({ ...source, args, immediate });\n }\n }\n\n private reserveInstruction() {\n if (this.instructions.length >= 4096) {\n throw new Error(\"postDecode compiled program exceeds 4096 instructions\");\n }\n }\n}\n\nfunction emptyCompiledProgram(): CompiledProgram {\n return {\n instructions: [],\n constants: [],\n outputs: {},\n condition: undefined,\n attributes: [],\n };\n}\n\nfunction remapOutputs(\n outputs: SplatPostDecodeOutputs,\n registers: GenerationRegisterMap,\n): Omit<SplatPostDecodeOutputs, \"when\"> {\n const remap = (register: number | undefined) =>\n register === undefined ? undefined : registers.get(register);\n return {\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) => {\n const target = registers.get(register);\n if (target === undefined) {\n throw new Error(\"Invalid postDecode output dependency\");\n }\n return target;\n }),\n };\n}\n\ntype FlowNode = {\n register: number;\n onTrue: number;\n onFalse: number;\n};\n\nfunction compileConditionFlow(\n builder: ProgramBuilder,\n outputs: SplatPostDecodeOutputs,\n outputRoots: readonly (number | undefined)[],\n whenRegister: number,\n): CompiledProgram | undefined {\n const FLOW_ACCEPT = -1;\n const FLOW_REJECT = -2;\n const FLOW_DYNAMIC = 0;\n const FLOW_CONSTANT_FALSE = 1;\n const FLOW_CONSTANT_TRUE = 2;\n const constantValues = new Uint8Array(whenRegister + 1);\n for (let register = 0; register <= whenRegister; register += 1) {\n const instruction = builder.instructions[register];\n if (instruction.opcode === Opcode.Constant && instruction.type === \"bool\") {\n constantValues[register] = builder.constants[instruction.immediate]\n ? FLOW_CONSTANT_TRUE\n : FLOW_CONSTANT_FALSE;\n continue;\n }\n const left = constantValues[instruction.args[0]];\n if (instruction.opcode === Opcode.Not) {\n constantValues[register] =\n left === FLOW_CONSTANT_TRUE\n ? FLOW_CONSTANT_FALSE\n : left === FLOW_CONSTANT_FALSE\n ? FLOW_CONSTANT_TRUE\n : FLOW_DYNAMIC;\n } else if (instruction.opcode === Opcode.And) {\n const right = constantValues[instruction.args[1]];\n constantValues[register] =\n left === FLOW_CONSTANT_FALSE || right === FLOW_CONSTANT_FALSE\n ? FLOW_CONSTANT_FALSE\n : left === FLOW_CONSTANT_TRUE && right === FLOW_CONSTANT_TRUE\n ? FLOW_CONSTANT_TRUE\n : FLOW_DYNAMIC;\n } else if (instruction.opcode === Opcode.Or) {\n const right = constantValues[instruction.args[1]];\n constantValues[register] =\n left === FLOW_CONSTANT_TRUE || right === FLOW_CONSTANT_TRUE\n ? FLOW_CONSTANT_TRUE\n : left === FLOW_CONSTANT_FALSE && right === FLOW_CONSTANT_FALSE\n ? FLOW_CONSTANT_FALSE\n : FLOW_DYNAMIC;\n }\n }\n\n const reverseNodes: FlowNode[] = [];\n const FLOW_AND_LEFT = 0;\n const FLOW_OR_LEFT = 1;\n const FLOW_CONTINUATION_SIZE = 3;\n let continuations: Int32Array | undefined;\n let continuationEnd = 0;\n let register = whenRegister;\n let onTrue = FLOW_ACCEPT;\n let onFalse = FLOW_REJECT;\n let compiledTarget = FLOW_REJECT;\n while (true) {\n const constant = constantValues[register];\n if (constant !== FLOW_DYNAMIC) {\n compiledTarget = constant === FLOW_CONSTANT_TRUE ? onTrue : onFalse;\n } else {\n const instruction = builder.instructions[register];\n if (instruction.opcode === Opcode.Not) {\n register = instruction.args[0];\n const target = onTrue;\n onTrue = onFalse;\n onFalse = target;\n continue;\n }\n if (\n instruction.opcode === Opcode.And ||\n instruction.opcode === Opcode.Or\n ) {\n continuations ??= new Int32Array(\n (whenRegister + 1) * FLOW_CONTINUATION_SIZE,\n );\n if (continuationEnd === continuations.length) {\n throw new Error(\"Invalid postDecode condition depth\");\n }\n const isAnd = instruction.opcode === Opcode.And;\n continuations[continuationEnd] = isAnd ? FLOW_AND_LEFT : FLOW_OR_LEFT;\n continuations[continuationEnd + 1] = instruction.args[0];\n continuations[continuationEnd + 2] = isAnd ? onFalse : onTrue;\n continuationEnd += FLOW_CONTINUATION_SIZE;\n register = instruction.args[1];\n continue;\n }\n if (reverseNodes.length >= 4096) {\n throw new Error(\"postDecode condition exceeds 4096 flow nodes\");\n }\n compiledTarget = reverseNodes.length;\n reverseNodes.push({ register, onTrue, onFalse });\n }\n\n if (continuationEnd === 0) break;\n continuationEnd -= FLOW_CONTINUATION_SIZE;\n if (!continuations) {\n throw new Error(\"Invalid postDecode condition continuation\");\n }\n const type = continuations[continuationEnd];\n register = continuations[continuationEnd + 1];\n const target = continuations[continuationEnd + 2];\n if (type === FLOW_AND_LEFT) {\n onTrue = compiledTarget;\n onFalse = target;\n } else {\n onTrue = target;\n onFalse = compiledTarget;\n }\n }\n\n const entry = compiledTarget;\n if (entry === FLOW_REJECT) return emptyCompiledProgram();\n if (entry === FLOW_ACCEPT) {\n outputs.when = undefined;\n return undefined;\n }\n\n const stageCount = reverseNodes.length;\n if (entry !== stageCount - 1) {\n throw new Error(\"Invalid postDecode condition flow\");\n }\n\n const acceptTarget = stageCount;\n const rejectTarget = acceptTarget + 1;\n const stages = new Uint16Array(\n stageCount * SPLAT_POST_DECODE_FLOW_STAGE_STRIDE,\n );\n const predecessors = new Int32Array(stageCount).fill(-1);\n let acceptPredecessor = -1;\n const recordPredecessor = (target: number, predecessor: number) => {\n if (target === rejectTarget) return;\n if (target === acceptTarget) {\n acceptPredecessor =\n acceptPredecessor === -1\n ? predecessor\n : acceptPredecessor === predecessor\n ? predecessor\n : -2;\n return;\n }\n predecessors[target] =\n predecessors[target] === -1\n ? predecessor\n : predecessors[target] === predecessor\n ? predecessor\n : -2;\n };\n const remapTarget = (target: number) =>\n target === FLOW_ACCEPT\n ? acceptTarget\n : target === FLOW_REJECT\n ? rejectTarget\n : stageCount - 1 - target;\n\n for (let stage = 0; stage < stageCount; stage += 1) {\n const node = reverseNodes[stageCount - 1 - stage];\n const offset = stage * SPLAT_POST_DECODE_FLOW_STAGE_STRIDE;\n const onTrue = remapTarget(node.onTrue);\n const onFalse = remapTarget(node.onFalse);\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_ON_TRUE] = onTrue;\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_ON_FALSE] = onFalse;\n recordPredecessor(onTrue, stage);\n recordPredecessor(onFalse, stage);\n }\n\n const serializer = new InstructionSerializer(builder);\n const pathRegisters = new GenerationRegisterMap(builder.instructions.length);\n for (let stage = 0; stage < stageCount; stage += 1) {\n if (stage === 0 || predecessors[stage] !== stage - 1) {\n pathRegisters.clear();\n }\n const node = reverseNodes[stageCount - 1 - stage];\n const offset = stage * SPLAT_POST_DECODE_FLOW_STAGE_STRIDE;\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_START] =\n serializer.instructions.length;\n serializer.appendDependencies([node.register], pathRegisters, true);\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_INSTRUCTION] =\n serializer.instructions.length - 1;\n const predicateRegister = pathRegisters.get(node.register);\n if (predicateRegister === undefined) {\n throw new Error(\"Invalid postDecode condition register\");\n }\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_REGISTER] = predicateRegister;\n }\n\n if (acceptPredecessor !== stageCount - 1) pathRegisters.clear();\n serializer.appendDependencies(outputRoots, pathRegisters);\n return {\n instructions: serializer.instructions,\n constants: serializer.constants,\n outputs: remapOutputs(outputs, pathRegisters),\n condition: { mode: \"flow\", stages },\n attributes: serializer.attributes,\n };\n}\n\nfunction compileProgram(\n builder: ProgramBuilder,\n sourceOutputs: SplatPostDecodeOutputs,\n): CompiledProgram {\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 emptyCompiledProgram();\n }\n outputs.when = undefined;\n }\n }\n\n const outputRoots = [\n outputs.position,\n outputs.scale,\n outputs.quaternion,\n outputs.opacity,\n outputs.alpha,\n outputs.color,\n ...(outputs.sh ?? []),\n ];\n if (outputs.when !== undefined) {\n const flow = compileConditionFlow(\n builder,\n outputs,\n outputRoots,\n outputs.when,\n );\n if (flow) return flow;\n }\n\n const live = new Uint8Array(builder.instructions.length);\n markDependencies(builder, outputRoots, live);\n const instructionOrder: number[] = [];\n for (let register = 0; register < live.length; register += 1) {\n if (live[register]) instructionOrder.push(register);\n }\n\n const serializer = new InstructionSerializer(builder);\n const registers = new GenerationRegisterMap(builder.instructions.length);\n serializer.append(instructionOrder, registers);\n return {\n instructions: serializer.instructions,\n constants: serializer.constants,\n outputs: remapOutputs(outputs, registers),\n attributes: serializer.attributes,\n };\n}\n\nfunction packInstructions(\n instructions: readonly SplatPostDecodeInstruction[],\n): Uint16Array {\n const packed = new Uint16Array(\n instructions.length * SPLAT_POST_DECODE_INSTRUCTION_STRIDE,\n );\n packed.fill(SPLAT_POST_DECODE_MISSING_ARGUMENT);\n for (let index = 0; index < instructions.length; index += 1) {\n const instruction = instructions[index];\n if (\n instruction.args.length > SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_COUNT ||\n !Number.isInteger(instruction.immediate) ||\n instruction.immediate < 0 ||\n instruction.immediate > 0xffff ||\n instruction.args.some(\n (argument) =>\n !Number.isInteger(argument) ||\n argument < 0 ||\n argument >= SPLAT_POST_DECODE_MISSING_ARGUMENT,\n )\n ) {\n throw new Error(\"postDecode instruction exceeds Uint16 bytecode limits\");\n }\n const offset = index * SPLAT_POST_DECODE_INSTRUCTION_STRIDE;\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_OPCODE] = instruction.opcode;\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_WIDTH] =\n TYPE_WIDTHS[instruction.type];\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_IMMEDIATE] =\n instruction.immediate;\n for (let argument = 0; argument < instruction.args.length; argument += 1) {\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_0 + argument] =\n instruction.args[argument];\n }\n }\n return packed;\n}\n\ntype AttributeRegion = {\n buffer: ArrayBufferLike;\n start: number;\n end: number;\n outputOffset: number;\n};\n\nfunction snapshotAttributes(bindings: readonly AttributeBinding[]) {\n const rangesByBuffer = new Map<\n ArrayBufferLike,\n { start: number; end: number }[]\n >();\n for (const binding of bindings) {\n if (binding.count === 0) continue;\n const packedBytes =\n ATTRIBUTE_FORMAT_BYTES[binding.format] * binding.components;\n const start = binding.data.byteOffset + binding.byteOffset;\n const end = start + (binding.count - 1) * binding.byteStride + packedBytes;\n const ranges = rangesByBuffer.get(binding.data.buffer) ?? [];\n ranges.push({ start, end });\n rangesByBuffer.set(binding.data.buffer, ranges);\n }\n\n const regions: AttributeRegion[] = [];\n const regionsByBuffer = new Map<ArrayBufferLike, AttributeRegion[]>();\n for (const [buffer, ranges] of rangesByBuffer) {\n ranges.sort((left, right) => left.start - right.start);\n const bufferRegions: AttributeRegion[] = [];\n for (const range of ranges) {\n const previous = bufferRegions[bufferRegions.length - 1];\n if (previous && range.start <= previous.end) {\n previous.end = Math.max(previous.end, range.end);\n } else {\n const region = { buffer, ...range, outputOffset: 0 };\n bufferRegions.push(region);\n regions.push(region);\n }\n }\n regionsByBuffer.set(buffer, bufferRegions);\n }\n\n let byteLength = 0;\n for (const region of regions) {\n region.outputOffset = byteLength;\n byteLength += region.end - region.start;\n }\n const data = new Uint8Array(byteLength);\n for (const region of regions) {\n data.set(\n new Uint8Array(region.buffer, region.start, region.end - region.start),\n region.outputOffset,\n );\n }\n\n const attributes: SerializedSplatPostDecodeAttribute[] = bindings.map(\n (binding) => {\n let byteOffset = 0;\n if (binding.count !== 0) {\n const sourceOffset = binding.data.byteOffset + binding.byteOffset;\n const region = regionsByBuffer\n .get(binding.data.buffer)\n ?.find(\n (candidate) =>\n sourceOffset >= candidate.start && 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: binding.format,\n components: binding.components,\n byteOffset,\n byteStride: binding.byteStride,\n count: binding.count,\n };\n },\n );\n return { data, attributes };\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 compiled = compileProgram(program.builder, program.outputs);\n const snapshot = snapshotAttributes(compiled.attributes);\n return {\n instructions: packInstructions(compiled.instructions),\n constants: new Float32Array(compiled.constants),\n outputs: compiled.outputs,\n condition: compiled.condition,\n attributeData: snapshot.data,\n attributes: snapshot.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 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 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 return new SplatPostDecodeProgramImpl(builder, buildOutputs(builder, patch));\n}\n\nexport const postDecode = {\n define: defineSplatPostDecode,\n};\n","import { Loader } from \"three\";\nimport { SplatMesh } from \"./SplatMesh\";\nimport { workerPool } from \"./SplatWorker\";\nimport { Splats, type SplatsOptions } from \"./Splats\";\nimport type { SplatFileType } from \"./defines\";\nimport {\n type SplatPostDecodeProgram,\n serializeSplatPostDecode,\n} from \"./postDecode\";\n\n// SplatLoader implements the THREE.Loader interface for PLY and SPZ files.\nexport class SplatLoader extends Loader {\n load(\n url: string,\n onLoad?: (decoded: Splats) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (error: unknown) => void,\n ) {\n return this.loadInternal({ url, onLoad, onProgress, onError });\n }\n\n async loadAsync(\n url: string,\n onProgress?: (event: ProgressEvent) => void,\n ): Promise<Splats> {\n return new Promise((resolve, reject) => {\n this.load(url, resolve, onProgress, reject);\n });\n }\n\n parse(splats: Splats): SplatMesh {\n return new SplatMesh({ splats });\n }\n\n loadInternal({\n splats,\n url,\n fileBytes,\n fileType,\n fileName,\n stream,\n streamLength,\n postDecode,\n onLoad,\n onProgress,\n onError,\n }: {\n splats?: Splats;\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n streamLength?: number;\n postDecode?: SplatPostDecodeProgram;\n onLoad?: (decoded: Splats) => void;\n onProgress?: (event: ProgressEvent) => void;\n onError?: (error: unknown) => void;\n }) {\n const byteArray =\n fileBytes instanceof ArrayBuffer ? new Uint8Array(fileBytes) : fileBytes;\n const resolvedURL = byteArray\n ? undefined\n : this.manager.resolveURL((this.path ?? \"\") + (url ?? \"\"));\n let streamReader = stream?.getReader();\n const cancelStreamReader = async (reason: unknown) => {\n const reader = streamReader;\n streamReader = undefined;\n if (!reader) return;\n try {\n await reader.cancel(reason);\n } catch {\n // Preserve the original error if stream cancellation fails.\n }\n reader.releaseLock();\n };\n\n this.manager.itemStart(resolvedURL ?? \"\");\n\n workerPool\n .withWorker(async (worker) => {\n const readStreamChunk = async () => {\n const reader = streamReader;\n if (!reader) return new Uint8Array(0);\n\n try {\n const { done, value } = await reader.read();\n if (!done) return value;\n\n reader.releaseLock();\n streamReader = undefined;\n return new Uint8Array(0);\n } catch (error) {\n await worker.call(\"nextChunk\", { chunk: new Uint8Array(0) });\n throw error;\n }\n };\n\n const onStatus = async (data: unknown) => {\n const { loaded, total } = data as {\n loaded?: number;\n total?: number;\n };\n if (loaded !== undefined && onProgress) {\n try {\n onProgress(\n new ProgressEvent(\"progress\", {\n lengthComputable: total !== 0,\n loaded,\n total: total ?? 0,\n }),\n );\n } catch (error) {\n console.error(\"Progress callback failed\", error);\n }\n }\n\n if ((data as { nextChunk?: boolean }).nextChunk) {\n const chunk = await readStreamChunk();\n await worker.call(\"nextChunk\", { chunk });\n }\n };\n\n const basedUrl = resolvedURL\n ? new URL(resolvedURL, window.location.href).toString()\n : undefined;\n const decoded = await worker.call(\n \"loadSplats\",\n {\n url: basedUrl,\n requestHeader: this.requestHeader,\n withCredentials: this.withCredentials,\n fileBytes: byteArray?.slice(),\n fileType,\n pathName: resolvedURL || fileName,\n chunked: stream !== undefined,\n chunkedLength: streamLength,\n postDecode: postDecode\n ? serializeSplatPostDecode(postDecode)\n : undefined,\n },\n { onStatus },\n );\n\n const result = splats ?? new Splats();\n result.initialize(decoded as SplatsOptions);\n onLoad?.(result);\n })\n .catch(async (error) => {\n await cancelStreamReader(error);\n this.manager.itemError(resolvedURL ?? \"\");\n onError?.(error);\n })\n .finally(() => {\n this.manager.itemEnd(resolvedURL ?? \"\");\n });\n }\n\n async loadInternalAsync({\n splats,\n url,\n fileBytes,\n fileType,\n fileName,\n stream,\n streamLength,\n postDecode,\n onProgress,\n }: {\n splats?: Splats;\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n streamLength?: number;\n postDecode?: SplatPostDecodeProgram;\n onProgress?: (event: ProgressEvent) => void;\n }): Promise<Splats> {\n return new Promise((resolve, reject) => {\n this.loadInternal({\n splats,\n url,\n fileBytes,\n fileType,\n fileName,\n stream,\n streamLength,\n postDecode,\n onLoad: resolve,\n onProgress,\n onError: reject,\n });\n });\n }\n}\n"],"names":["SplatEditSdfType","SplatEditRgbaBlendMode","THREE","ptr","module","axisX","axisY","axisZ","SplatFileType","fromHalf","initialized","SplatLoader","_a","initWasm","wasm.isInitialized","splatDefines","splatVertex","splatFragment","splatGenerate","FullScreenQuad","BundledWorker","shaders","target","cubeCamera","immediate","register","onTrue","onFalse","_SplatPostDecodeProgramImpl","Loader","postDecode"],"mappings":"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"}
1
+ {"version":3,"file":"gaussian-splat-lite.cjs","sources":["../src/cameraRelative.ts","../src/SplatEdit.ts","../rust/gaussian-splat-rs/pkg/gaussian_splat_rs.js","../src/float16.ts","../src/splatCodec.ts","../src/defines.ts","../src/transferable.ts","../src/utils.ts","../src/Splats.ts","../virtual:decode-64","../src/wasm.ts","../src/SplatMesh.ts","../src/shaders/splatDefines.glsl","../src/shaders/splatFragment.glsl","../src/shaders/splatVertex.glsl","../src/shaders.ts","../src/shaders/splatGenerate.glsl","../src/splatTransform.ts","../src/SplatAccumulator.ts","../src/SplatGeometry.ts","../src/workerIdleTimeout.ts","../src/SplatWorker.ts","../src/GaussianSplatRenderer.ts","../src/postDecode.ts","../src/SplatLoader.ts"],"sourcesContent":["import type * as THREE from \"three\";\n\nimport type { SplatAccumulator } from \"./SplatAccumulator\";\nimport type { SplatMesh } from \"./SplatMesh\";\n\ntype SortCenterEntry = {\n meshId: number;\n centerVersion: number;\n sortVersion: number;\n};\n\n/**\n * Re-expresses an affine transform so it consumes positions relative to\n * `origin` instead of absolute world positions.\n *\n * If `matrix` maps p to A * p + t, the rebased matrix maps (p - origin) to\n * A * (p - origin) + (A * origin + t), which is the same result without doing\n * a large-coordinate subtraction in float32 shader code.\n */\nexport function rebaseAffineTransform(\n matrix: THREE.Matrix4,\n origin: THREE.Vector3,\n) {\n const elements = matrix.elements;\n const x = origin.x;\n const y = origin.y;\n const z = origin.z;\n\n const tx = elements[0] * x + elements[4] * y + elements[8] * z + elements[12];\n const ty = elements[1] * x + elements[5] * y + elements[9] * z + elements[13];\n const tz =\n elements[2] * x + elements[6] * y + elements[10] * z + elements[14];\n\n elements[12] = tx;\n elements[13] = ty;\n elements[14] = tz;\n return matrix;\n}\n\n/** Tracks raw-center and matrix revisions cached by the sort worker. */\nexport class SortCenterCache {\n private entries = new Map<SplatMesh, SortCenterEntry>();\n private freeMeshIds: number[] = [];\n private nextMeshId = 0;\n\n private allocateMeshId() {\n const reused = this.freeMeshIds.pop();\n if (reused !== undefined) return reused;\n\n if (this.nextMeshId > 0xffff_ffff) {\n throw new Error(\"Sort center mesh ID space exhausted\");\n }\n return this.nextMeshId++;\n }\n\n dispose() {\n this.entries.clear();\n this.freeMeshIds.length = 0;\n this.nextMeshId = 0;\n }\n\n prepare(current: SplatAccumulator) {\n const rangeMeshIds = new Uint32Array(current.mapping.length);\n const rangeBases = new Uint32Array(current.mapping.length);\n const rangeCounts = new Uint32Array(current.mapping.length);\n const retiredNodes = new Set(this.entries.keys());\n const changedCenters: {\n node: SplatMesh;\n count: number;\n rangeIndex: number;\n }[] = [];\n const changedMatrices: {\n node: SplatMesh;\n rangeIndex: number;\n }[] = [];\n let updateCount = 0;\n\n current.mapping.forEach(\n ({ node, base, count, centerVersion, sortVersion }, rangeIndex) => {\n retiredNodes.delete(node);\n let entry = this.entries.get(node);\n if (!entry) {\n // Store a provisional entry immediately so a failed worker call can\n // retry with the same ID. Its sentinel version forces a re-upload.\n entry = {\n meshId: this.allocateMeshId(),\n centerVersion: -1,\n sortVersion: -1,\n };\n this.entries.set(node, entry);\n }\n\n rangeMeshIds[rangeIndex] = entry.meshId;\n rangeBases[rangeIndex] = base;\n rangeCounts[rangeIndex] = count;\n\n if (entry.centerVersion !== centerVersion) {\n changedCenters.push({\n node,\n count,\n rangeIndex,\n });\n updateCount += count;\n }\n if (entry.sortVersion !== sortVersion) {\n changedMatrices.push({\n node,\n rangeIndex,\n });\n }\n },\n );\n\n const centerUpdateRangeIndices = new Uint32Array(changedCenters.length);\n const updateCenters = new Float32Array(updateCount * 3);\n\n let updateBase = 0;\n changedCenters.forEach(({ node, count, rangeIndex }, updateIndex) => {\n centerUpdateRangeIndices[updateIndex] = rangeIndex;\n\n if (!node.splats) throw new Error(\"SplatMesh has no source\");\n node.splats.copySortCenters(updateCenters, updateBase * 3, count);\n updateBase += count;\n });\n\n const matrixUpdateRangeIndices = new Uint32Array(changedMatrices.length);\n const updateMatrices = new Float64Array(changedMatrices.length * 16);\n changedMatrices.forEach(({ node, rangeIndex }, updateIndex) => {\n matrixUpdateRangeIndices[updateIndex] = rangeIndex;\n updateMatrices.set(node.matrixWorld.elements, updateIndex * 16);\n });\n\n return {\n payload: {\n centerUpdateRangeIndices,\n updateCenters,\n matrixUpdateRangeIndices,\n updateMatrices,\n rangeMeshIds,\n rangeBases,\n rangeCounts,\n },\n commit: () => {\n for (const { node, centerVersion, sortVersion } of current.mapping) {\n const entry = this.entries.get(node);\n if (!entry) continue;\n entry.centerVersion = centerVersion;\n entry.sortVersion = sortVersion;\n }\n // Recycle IDs only after the worker accepted the replacement state.\n // A mesh that later becomes active again gets a fresh entry and must\n // upload all of its centers before using its recycled ID.\n for (const node of retiredNodes) {\n const entry = this.entries.get(node);\n if (!entry) continue;\n this.entries.delete(node);\n this.freeMeshIds.push(entry.meshId);\n }\n },\n };\n }\n}\n","import * as THREE from \"three\";\n\nimport { rebaseAffineTransform } from \"./cameraRelative\";\n\nexport enum SplatEditSdfType {\n ALL = \"all\",\n PLANE = \"plane\",\n SPHERE = \"sphere\",\n BOX = \"box\",\n ELLIPSOID = \"ellipsoid\",\n CYLINDER = \"cylinder\",\n CAPSULE = \"capsule\",\n INFINITE_CONE = \"infinite_cone\",\n}\n\n/** RGBA-only operations supported by the SDF pipeline. */\nexport enum SplatEditRgbaBlendMode {\n MULTIPLY_RGBA = \"multiply_rgba\",\n SET_RGBA = \"set_rgba\",\n ADD_RGBA = \"add_rgba\",\n}\n\nexport type SplatEditSdfColor = {\n r?: number;\n g?: number;\n b?: number;\n};\n\nexport type SplatEditSdfOptions = {\n type?: SplatEditSdfType;\n invert?: boolean;\n opacity?: number;\n color?: SplatEditSdfColor;\n radius?: number;\n};\n\n/** A signed-distance shape carrying optional color and opacity channels. */\nexport class SplatEditSdf extends THREE.Object3D {\n type: SplatEditSdfType;\n invert: boolean;\n opacity?: number;\n color: SplatEditSdfColor;\n radius: number;\n\n constructor(options: SplatEditSdfOptions = {}) {\n super();\n this.type = options.type ?? SplatEditSdfType.SPHERE;\n this.invert = options.invert ?? false;\n this.opacity = options.opacity;\n this.color = options.color ?? {};\n this.radius = options.radius ?? 0;\n }\n}\n\nexport type SplatEditOptions = {\n name?: string;\n rgbaBlendMode?: SplatEditRgbaBlendMode;\n sdfSmooth?: number;\n softEdge?: number;\n invert?: boolean;\n sdfs?: SplatEditSdf[];\n};\n\n/** An ordered RGBA operation evaluated over one or more SDF shapes. */\nexport class SplatEdit extends THREE.Object3D {\n ordering: number;\n rgbaBlendMode: SplatEditRgbaBlendMode;\n sdfSmooth: number;\n softEdge: number;\n invert: boolean;\n sdfs: SplatEditSdf[] | null;\n\n static nextOrdering = 1;\n\n constructor(options: SplatEditOptions = {}) {\n super();\n this.rgbaBlendMode =\n options.rgbaBlendMode ?? SplatEditRgbaBlendMode.MULTIPLY_RGBA;\n this.sdfSmooth = options.sdfSmooth ?? 0;\n this.softEdge = options.softEdge ?? 0;\n this.invert = options.invert ?? false;\n this.sdfs = options.sdfs ?? null;\n this.ordering = SplatEdit.nextOrdering++;\n this.name = options.name ?? `Edit ${this.ordering}`;\n }\n\n addSdf(sdf: SplatEditSdf) {\n this.sdfs ??= [];\n if (!this.sdfs.includes(sdf)) {\n this.sdfs.push(sdf);\n }\n }\n\n removeSdf(sdf: SplatEditSdf) {\n if (this.sdfs) {\n this.sdfs = this.sdfs.filter((candidate) => candidate !== sdf);\n }\n }\n}\n\nexport type SplatEditGroup = { edit: SplatEdit; sdfs: SplatEditSdf[] };\n\nconst SDF_TEXELS = 5;\nconst SDF_RGBA_MASK_SHIFT = 16;\nconst MIN_CAPACITY = 16;\nconst scratchFloat = new Float32Array(1);\nconst scratchUint = new Uint32Array(scratchFloat.buffer);\n\n/** Encodes SDF geometry/RGBA and edit operations as regular integer textures. */\nexport class SplatEdits {\n maxSdfs: number;\n numSdfs = 0;\n sdfData: Uint32Array;\n sdfFloatData: Float32Array;\n sdfTexture: THREE.DataTexture;\n\n maxEdits: number;\n numEdits = 0;\n editData: Uint32Array;\n editFloatData: Float32Array;\n editTexture: THREE.DataTexture;\n\n constructor({ maxSdfs = 0, maxEdits = 0 } = {}) {\n this.maxSdfs = Math.max(MIN_CAPACITY, maxSdfs);\n this.sdfData = new Uint32Array(this.maxSdfs * SDF_TEXELS * 4);\n this.sdfFloatData = new Float32Array(this.sdfData.buffer);\n this.sdfTexture = makeUintTexture(this.sdfData, SDF_TEXELS, this.maxSdfs);\n\n this.maxEdits = Math.max(MIN_CAPACITY, maxEdits);\n this.editData = new Uint32Array(this.maxEdits * 4);\n this.editFloatData = new Float32Array(this.editData.buffer);\n this.editTexture = makeUintTexture(this.editData, 1, this.maxEdits);\n }\n\n dispose() {\n this.sdfTexture.dispose();\n this.editTexture.dispose();\n }\n\n update(\n groups: SplatEditGroup[],\n coordinateOrigin?: THREE.Vector3,\n ): { updated: boolean } {\n const sdfCount = groups.reduce(\n (total, group) => total + group.sdfs.length,\n 0,\n );\n let updated = this.ensureCapacity(sdfCount, groups.length);\n\n if (this.numSdfs !== sdfCount || this.numEdits !== groups.length) {\n this.numSdfs = sdfCount;\n this.numEdits = groups.length;\n updated = true;\n }\n\n const center = new THREE.Vector3();\n const quaternion = new THREE.Quaternion();\n const inverseScale = new THREE.Vector3();\n const sizes = new THREE.Vector4();\n const worldToSdf = new THREE.Matrix4();\n let sdfIndex = 0;\n let sdfUpdated = false;\n let editUpdated = false;\n\n groups.forEach(({ edit, sdfs }, editIndex) => {\n editUpdated =\n this.encodeEdit(editIndex, edit, sdfIndex, sdfs.length) || editUpdated;\n\n for (const sdf of sdfs) {\n sizes.set(sdf.scale.x, sdf.scale.y, sdf.scale.z, sdf.radius);\n const originalScale = sdf.scale.clone();\n try {\n sdf.scale.setScalar(1);\n sdf.updateWorldMatrix(true, false);\n worldToSdf.copy(sdf.matrixWorld).invert();\n // Only the internal numeric frame changes. SDF Object3D transforms,\n // sizes, smoothing distances, and edit semantics remain world-space.\n if (coordinateOrigin) {\n rebaseAffineTransform(worldToSdf, coordinateOrigin);\n }\n worldToSdf.decompose(center, quaternion, inverseScale);\n } finally {\n sdf.scale.copy(originalScale);\n sdf.updateWorldMatrix(true, false);\n }\n\n sdfUpdated =\n this.encodeSdf(\n sdfIndex,\n sdf,\n center,\n quaternion,\n inverseScale,\n sizes,\n ) || sdfUpdated;\n sdfIndex += 1;\n }\n });\n\n if (sdfUpdated) {\n this.sdfTexture.needsUpdate = true;\n }\n if (editUpdated) {\n this.editTexture.needsUpdate = true;\n }\n return { updated: updated || sdfUpdated || editUpdated };\n }\n\n private ensureCapacity(sdfs: number, edits: number) {\n let updated = false;\n if (sdfs > this.maxSdfs) {\n this.maxSdfs = Math.max(sdfs, this.maxSdfs * 2);\n this.sdfTexture.dispose();\n this.sdfData = new Uint32Array(this.maxSdfs * SDF_TEXELS * 4);\n this.sdfFloatData = new Float32Array(this.sdfData.buffer);\n this.sdfTexture = makeUintTexture(this.sdfData, SDF_TEXELS, this.maxSdfs);\n updated = true;\n }\n if (edits > this.maxEdits) {\n this.maxEdits = Math.max(edits, this.maxEdits * 2);\n this.editTexture.dispose();\n this.editData = new Uint32Array(this.maxEdits * 4);\n this.editFloatData = new Float32Array(this.editData.buffer);\n this.editTexture = makeUintTexture(this.editData, 1, this.maxEdits);\n updated = true;\n }\n return updated;\n }\n\n private encodeEdit(\n index: number,\n edit: SplatEdit,\n sdfFirst: number,\n sdfCount: number,\n ) {\n if (sdfFirst > 0xffff || sdfCount > 0xffff) {\n throw new Error(\"An SDF edit supports at most 65535 shapes\");\n }\n const base = index * 4;\n const blend = rgbaBlendModeToNumber(edit.rgbaBlendMode);\n const flags = blend | (edit.invert ? 1 << 8 : 0);\n let updated = this.setEditUint(base, flags);\n updated =\n this.setEditUint(base + 1, sdfFirst | (sdfCount << 16)) || updated;\n updated = this.setEditFloat(base + 2, edit.softEdge) || updated;\n updated = this.setEditFloat(base + 3, edit.sdfSmooth) || updated;\n return updated;\n }\n\n private encodeSdf(\n index: number,\n sdf: SplatEditSdf,\n center: THREE.Vector3,\n quaternion: THREE.Quaternion,\n scale: THREE.Vector3,\n sizes: THREE.Vector4,\n ) {\n const base = index * SDF_TEXELS * 4;\n const color = sdf.color;\n const rgbaMask =\n (color.r === undefined ? 0 : 1) |\n (color.g === undefined ? 0 : 1 << 1) |\n (color.b === undefined ? 0 : 1 << 2) |\n (sdf.opacity === undefined ? 0 : 1 << 3);\n const flags =\n sdfTypeToNumber(sdf.type) |\n (sdf.invert ? 1 << 8 : 0) |\n (rgbaMask << SDF_RGBA_MASK_SHIFT);\n let updated = this.setSdfFloat(base, center.x);\n updated = this.setSdfFloat(base + 1, center.y) || updated;\n updated = this.setSdfFloat(base + 2, center.z) || updated;\n updated = this.setSdfUint(base + 3, flags) || updated;\n\n updated = this.setSdfFloat(base + 4, quaternion.x) || updated;\n updated = this.setSdfFloat(base + 5, quaternion.y) || updated;\n updated = this.setSdfFloat(base + 6, quaternion.z) || updated;\n updated = this.setSdfFloat(base + 7, quaternion.w) || updated;\n\n updated = this.setSdfFloat(base + 8, scale.x) || updated;\n updated = this.setSdfFloat(base + 9, scale.y) || updated;\n updated = this.setSdfFloat(base + 10, scale.z) || updated;\n updated = this.setSdfUint(base + 11, 0) || updated;\n\n updated = this.setSdfFloat(base + 12, sizes.x) || updated;\n updated = this.setSdfFloat(base + 13, sizes.y) || updated;\n updated = this.setSdfFloat(base + 14, sizes.z) || updated;\n updated = this.setSdfFloat(base + 15, sizes.w) || updated;\n\n updated = this.setSdfFloat(base + 16, color.r ?? 0) || updated;\n updated = this.setSdfFloat(base + 17, color.g ?? 0) || updated;\n updated = this.setSdfFloat(base + 18, color.b ?? 0) || updated;\n updated = this.setSdfFloat(base + 19, sdf.opacity ?? 0) || updated;\n return updated;\n }\n\n private setSdfUint(offset: number, value: number) {\n const updated = this.sdfData[offset] !== value;\n this.sdfData[offset] = value;\n return updated;\n }\n\n private setSdfFloat(offset: number, value: number) {\n scratchFloat[0] = value;\n return this.setSdfUint(offset, scratchUint[0]);\n }\n\n private setEditUint(offset: number, value: number) {\n const updated = this.editData[offset] !== value;\n this.editData[offset] = value;\n return updated;\n }\n\n private setEditFloat(offset: number, value: number) {\n scratchFloat[0] = value;\n return this.setEditUint(offset, scratchUint[0]);\n }\n\n static emptyTexture = makeUintTexture(new Uint32Array(4), 1, 1);\n}\n\nfunction rgbaBlendModeToNumber(mode: SplatEditRgbaBlendMode) {\n switch (mode) {\n case SplatEditRgbaBlendMode.MULTIPLY_RGBA:\n return 0;\n case SplatEditRgbaBlendMode.SET_RGBA:\n return 1;\n case SplatEditRgbaBlendMode.ADD_RGBA:\n return 2;\n }\n}\n\nfunction sdfTypeToNumber(type: SplatEditSdfType) {\n switch (type) {\n case SplatEditSdfType.ALL:\n return 0;\n case SplatEditSdfType.PLANE:\n return 1;\n case SplatEditSdfType.SPHERE:\n return 2;\n case SplatEditSdfType.BOX:\n return 3;\n case SplatEditSdfType.ELLIPSOID:\n return 4;\n case SplatEditSdfType.CYLINDER:\n return 5;\n case SplatEditSdfType.CAPSULE:\n return 6;\n case SplatEditSdfType.INFINITE_CONE:\n return 7;\n }\n}\n\nfunction makeUintTexture(data: Uint32Array, width: number, height: number) {\n const texture = new THREE.DataTexture(\n data,\n width,\n height,\n THREE.RGBAIntegerFormat,\n THREE.UnsignedIntType,\n );\n texture.internalFormat = \"RGBA32UI\";\n texture.magFilter = THREE.NearestFilter;\n texture.minFilter = THREE.NearestFilter;\n texture.generateMipmaps = false;\n texture.needsUpdate = true;\n return texture;\n}\n","/* @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","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","// Gsplats are stored in textures that are 2^11 x 2^11 x up to 2^11\n// Most WebGL2 implementations support 2D textures up to 2^12 x 2^12 (max 16M Gsplats)\n// 2D array textures and 3D textures up to 2^11 x 2^11 x 2^11 (max 8G Gsplats),\n// so we use 2D array textures for our representation for higher limits.\n\nexport const SPLAT_TEX_WIDTH_BITS = 11;\nexport const SPLAT_TEX_HEIGHT_BITS = 11;\n\nexport const SPLAT_TEX_WIDTH = 1 << SPLAT_TEX_WIDTH_BITS; // 2048\nexport const SPLAT_TEX_HEIGHT = 1 << SPLAT_TEX_HEIGHT_BITS; // 2048\nexport const SPLAT_TEX_MIN_HEIGHT = 1;\n\nexport enum SplatFileType {\n PLY = \"ply\",\n SPZ = \"spz\",\n}\n\nexport type SplatExtra = {\n sh1?: Uint32Array;\n sh2?: Uint32Array;\n sh3a?: Uint32Array;\n sh3b?: Uint32Array;\n};\n\nexport type SplatResult = {\n numSplats: number;\n splatArrays: [Uint32Array, Uint32Array];\n sortCenters?: Float32Array;\n extra: SplatExtra;\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 * as THREE from \"three\";\n\n// Miscellaneous utility functions for Gaussian Splat Lite\n\nimport {\n SPLAT_TEX_HEIGHT,\n SPLAT_TEX_MIN_HEIGHT,\n SPLAT_TEX_WIDTH,\n} from \"./defines.js\";\nimport {\n decodeQuatOctXy1010R12ToArray,\n decodeSplatOpacity,\n} from \"./splatCodec\";\nexport { fromHalf, toHalf } from \"./float16\";\nexport { encodeQuatOctXy1010R12 } from \"./splatCodec\";\nexport { getTransferable } from \"./transferable\";\nimport { fromHalf } from \"./float16\";\n\nexport const threeRevision = Number.parseInt(THREE.REVISION);\nexport const threeMrtArray = threeRevision >= 179;\n\nconst f32buffer = new Float32Array(1);\nconst u32buffer = new Uint32Array(f32buffer.buffer);\n\n// Reinterpret the bits of a float32 as a uint32\nexport function floatBitsToUint(f: number): number {\n f32buffer[0] = f;\n return u32buffer[0];\n}\n\n// Reinterpret the bits of a uint32 as a float32\nexport function uintBitsToFloat(u: number): number {\n u32buffer[0] = u;\n return f32buffer[0];\n}\n\nexport function decodeSplat(\n splatArrays: [Uint32Array, Uint32Array],\n index: number,\n): {\n center: THREE.Vector3;\n scales: THREE.Vector3;\n quaternion: THREE.Quaternion;\n color: THREE.Color;\n opacity: number;\n} {\n // Returns a static object which is reused each time\n const result = splatFields;\n const i4 = index * 4;\n const [splatA, splatB] = splatArrays;\n result.center.x = uintBitsToFloat(splatA[i4]);\n result.center.y = uintBitsToFloat(splatA[i4 + 1]);\n result.center.z = uintBitsToFloat(splatA[i4 + 2]);\n result.opacity = decodeSplatOpacity(splatA[i4 + 3]);\n result.color.r = fromHalf(splatB[i4] & 0xffff);\n result.color.g = fromHalf(splatB[i4] >>> 16);\n result.color.b = fromHalf(splatB[i4 + 1] & 0xffff);\n result.scales.x = Math.exp(fromHalf(splatB[i4 + 1] >>> 16));\n result.scales.y = Math.exp(fromHalf(splatB[i4 + 2] & 0xffff));\n result.scales.z = Math.exp(fromHalf(splatB[i4 + 2] >>> 16));\n decodeQuatOctXy1010R12(splatB[i4 + 3], result.quaternion);\n return result;\n}\n\nconst splatCenter = new THREE.Vector3();\nconst splatScales = new THREE.Vector3();\nconst splatQuaternion = new THREE.Quaternion();\nconst splatColor = new THREE.Color();\nconst splatFields = {\n center: splatCenter,\n scales: splatScales,\n quaternion: splatQuaternion,\n color: splatColor,\n opacity: 0.0,\n};\n\n// Compute a texture array size that is large enough to fit numSplats. The most\n// common 2D texture size in WebGL2 is 4096x4096 which only allows for 16M splats,\n// so Gaussian Splat Lite stores Gsplat data in a 2D texture array, which most platforms support\n// up to 2048x2048x2048 = 8G splats. Allocations that fit within a single 2D texture\n// array layer will be rounded up to fill an entire texture row. Once a texture\n// array layer is filled, the allocation will be rounded up to fill an entire layer.\n// This is done so the entire set of splats can be covered by min/max coords across\n// each dimension.\nexport function getTextureSize(numSplats: number): {\n width: number;\n height: number;\n depth: number;\n maxSplats: number;\n} {\n // Compute a texture array size that is large enough to fit numSplats.\n // The width is always 2048, the height sized to fit the splats but no larger than 2048.\n // The depth is the number of layers needed to fit the splats.\n // maxSplats is computed as the new total available splats that can be stored.\n const width = SPLAT_TEX_WIDTH;\n const height = Math.max(\n SPLAT_TEX_MIN_HEIGHT,\n Math.min(SPLAT_TEX_HEIGHT, Math.ceil(numSplats / width)),\n );\n const depth = Math.ceil(numSplats / (width * height));\n const maxSplats = width * height * depth;\n return { width, height, depth, maxSplats };\n}\n\n// \"Identity\" vertex shader that just passes through the position.\nexport const IDENT_VERTEX_SHADER = `\nprecision highp float;\n\nin vec3 position;\n\nvoid main() {\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst decodedQuaternion = [0, 0, 0, 1];\n\nexport function decodeQuatOctXy1010R12(\n encoded: number,\n out: THREE.Quaternion,\n): THREE.Quaternion {\n decodeQuatOctXy1010R12ToArray(encoded, decodedQuaternion);\n out.set(\n decodedQuaternion[0],\n decodedQuaternion[1],\n decodedQuaternion[2],\n decodedQuaternion[3],\n );\n return out;\n}\n\nexport function uploadU32DataTextureRows(\n renderer: THREE.WebGLRenderer,\n texture: THREE.Texture,\n width: number,\n rows: number,\n data: Uint32Array,\n) {\n const gl = renderer.getContext() as WebGL2RenderingContext;\n const props = renderer.properties.get(texture) as {\n __webglTexture: WebGLTexture;\n };\n const glTexture = props?.__webglTexture;\n if (!glTexture) {\n throw new Error(\"texture not found\");\n }\n\n // renderer.state.pixelStorei is only available in newer Three.js releases,\n // so preserve these WebGL flags explicitly across the direct texture upload.\n const currentFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);\n const currentPremultiply = gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL);\n renderer.state.activeTexture(gl.TEXTURE0);\n renderer.state.bindTexture(gl.TEXTURE_2D, glTexture);\n gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, null);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n 0,\n width,\n rows,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_INT,\n data,\n );\n renderer.state.unbindTexture();\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, currentFlipY);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, currentPremultiply);\n}\n\nexport function resolveTimer(timer?: THREE.Timer): {\n timer: THREE.Timer;\n ownsTimer: boolean;\n} {\n return {\n timer: timer ?? new THREE.Timer(),\n // A caller-supplied timer may be shared with other systems, so only update\n // the timer that Gaussian Splat Lite creates and owns itself.\n ownsTimer: timer === undefined,\n };\n}\n","import * as THREE from \"three\";\n\nimport type { SplatFileType } from \"./defines\";\nimport { toHalf } from \"./float16\";\nimport type { SplatPostDecodeProgram } from \"./postDecode\";\nimport { encodeQuatOctXy1010R12, encodeSplatOpacity } from \"./splatCodec\";\nimport { decodeSplat, getTextureSize } from \"./utils\";\n\ntype SplatShTextures = {\n sh1?: THREE.DataArrayTexture;\n sh2?: THREE.DataArrayTexture;\n sh3a?: THREE.DataArrayTexture;\n sh3b?: THREE.DataArrayTexture;\n};\n\ntype SplatShArrays = (Uint32Array | undefined)[];\n\nconst SH_COUNTS = [0, 3, 8, 15] as const;\nconst SH_KEYS = [\"sh1\", \"sh2\", \"sh3a\", \"sh3b\"] as const;\nconst SH_ARRAY_COUNTS = [0, 1, 2, 4] as const;\n\ntype DecodedSplat = ReturnType<typeof decodeSplat>;\nexport type SplatInput = {\n center: THREE.Vector3;\n scales: THREE.Vector3;\n quaternion: THREE.Quaternion;\n opacity: number;\n color: THREE.Color;\n /** SH0/1/2/3 use 0, 3, 8, or 15 RGB coefficients respectively. */\n sh?: readonly THREE.Color[];\n};\n\ntype DecodedSplatWithSh = DecodedSplat & { sh: THREE.Color[] };\n\nexport type SplatsOptions = {\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n /** Optional stream byte-length estimate used for progress reporting. */\n streamLength?: number;\n /** Declarative per-splat transform executed in the decode worker. */\n postDecode?: SplatPostDecodeProgram;\n maxSplats?: number;\n construct?: (splats: Splats) => Promise<void> | void;\n onProgress?: (event: ProgressEvent) => void;\n};\n\ntype SplatsInitializationOptions = SplatsOptions & {\n splatArrays?: [Uint32Array, Uint32Array];\n sortCenters?: Float32Array;\n numSplats?: number;\n extra?: Record<string, unknown>;\n};\n\ntype SplatsState = {\n maxSplats: number;\n numSplats: number;\n splatArrays: [Uint32Array, Uint32Array];\n sortCenters: Float32Array;\n extra: Record<string, unknown>;\n sortCentersDirty: boolean;\n};\n\nfunction getInitializationInputs(\n options: SplatsInitializationOptions,\n): string[] {\n const inputs: string[] = [];\n if (options.url !== undefined) inputs.push(\"url\");\n if (options.fileBytes !== undefined) inputs.push(\"fileBytes\");\n if (options.stream !== undefined) inputs.push(\"stream\");\n if (options.splatArrays !== undefined) inputs.push(\"splatArrays\");\n if (options.construct !== undefined) inputs.push(\"construct\");\n return inputs;\n}\n\nfunction validateInitializationInputs(options: SplatsInitializationOptions) {\n const inputs = getInitializationInputs(options);\n if (inputs.length > 1) {\n throw new Error(\n `Splats initialization inputs are mutually exclusive; provide only one of url, fileBytes, stream, splatArrays, or construct (received: ${inputs.join(\", \")})`,\n );\n }\n}\n\nfunction hasFileInput(options: SplatsOptions) {\n return (\n options.url !== undefined ||\n options.fileBytes !== undefined ||\n options.stream !== undefined\n );\n}\n\nfunction createSplatsState(options: SplatsInitializationOptions): SplatsState {\n if (options.splatArrays !== undefined) {\n const [first, second] = options.splatArrays;\n if (first.length !== second.length) {\n throw new Error(\"splatArrays must have the same length\");\n }\n if (first.length % 4 !== 0) {\n throw new Error(\"splatArrays must contain complete four-word records\");\n }\n\n const inputCapacity = first.length / 4;\n const numSplats = options.numSplats ?? inputCapacity;\n if (\n !Number.isSafeInteger(numSplats) ||\n numSplats < 0 ||\n numSplats > inputCapacity\n ) {\n throw new Error(\"numSplats must be an integer within splatArrays\");\n }\n if (\n options.sortCenters !== undefined &&\n options.sortCenters.length < numSplats * 3\n ) {\n throw new Error(\"sortCenters is smaller than numSplats\");\n }\n\n const maxSplats =\n inputCapacity === 0 ? 0 : getTextureSize(inputCapacity).maxSplats;\n let splatArrays = options.splatArrays;\n if (maxSplats !== inputCapacity) {\n splatArrays = [\n new Uint32Array(maxSplats * 4),\n new Uint32Array(maxSplats * 4),\n ];\n splatArrays[0].set(first);\n splatArrays[1].set(second);\n }\n return {\n maxSplats,\n numSplats,\n splatArrays,\n sortCenters: options.sortCenters ?? new Float32Array(0),\n extra: options.extra ?? {},\n sortCentersDirty: options.sortCenters === undefined,\n };\n }\n\n return {\n maxSplats: options.maxSplats ?? 0,\n numSplats: 0,\n splatArrays: [new Uint32Array(0), new Uint32Array(0)],\n sortCenters: new Float32Array(0),\n extra: options.extra ?? {},\n sortCentersDirty: false,\n };\n}\n\n/** A mutable splat source with two 16-byte texture records per splat. */\nexport class Splats {\n maxSplats = 0;\n numSplats = 0;\n private splatArrays: [Uint32Array, Uint32Array] = [\n new Uint32Array(0),\n new Uint32Array(0),\n ];\n private sortCenters: Float32Array = new Float32Array(0);\n private extra: Record<string, unknown> = {};\n\n initialized: Promise<Splats>;\n isInitialized = false;\n\n private textures: [THREE.DataArrayTexture, THREE.DataArrayTexture];\n private shTextures: SplatShTextures = {};\n private updateNeeded = true;\n private sortCentersDirty = false;\n private initializationVersion = 0;\n\n constructor(options: SplatsOptions = {}) {\n this.textures = [Splats.emptyTexture, Splats.emptyTexture];\n this.initialized = Promise.resolve(this);\n this.initialize(options);\n }\n\n initialize(options: SplatsOptions = {}): Promise<Splats> {\n const initializationOptions = options as SplatsInitializationOptions;\n validateInitializationInputs(initializationOptions);\n const isAsync = hasFileInput(options) || options.construct !== undefined;\n const state = createSplatsState(\n isAsync ? { maxSplats: options.maxSplats } : initializationOptions,\n );\n const version = ++this.initializationVersion;\n\n this.isInitialized = false;\n this.commitState(state);\n\n if (isAsync) {\n // Defer construction so initialize() can publish the new promise before a\n // user callback has an opportunity to re-enter initialize().\n this.initialized = Promise.resolve()\n .then(() =>\n version === this.initializationVersion\n ? this.asyncInitialize(options)\n : undefined,\n )\n .then((initialized) => {\n if (!initialized) return this;\n try {\n if (version === this.initializationVersion) {\n this.commitState(initialized.captureState());\n this.isInitialized = true;\n }\n } finally {\n initialized.dispose();\n }\n return this;\n });\n } else {\n this.isInitialized = true;\n this.initialized = Promise.resolve(this);\n }\n\n return this.initialized;\n }\n\n private commitState(state: SplatsState) {\n this.disposeTextures();\n this.maxSplats = state.maxSplats;\n this.numSplats = state.numSplats;\n this.splatArrays = state.splatArrays;\n this.sortCenters = state.sortCenters;\n this.extra = state.extra;\n this.sortCentersDirty = state.sortCentersDirty;\n this.updateNeeded = true;\n }\n\n private captureState(): SplatsState {\n return {\n maxSplats: this.maxSplats,\n numSplats: this.numSplats,\n splatArrays: this.splatArrays,\n sortCenters: this.sortCenters,\n extra: this.extra,\n sortCentersDirty: this.sortCentersDirty,\n };\n }\n\n private async asyncInitialize(options: SplatsOptions): Promise<Splats> {\n if (hasFileInput(options)) {\n const { SplatLoader } = await import(\"./SplatLoader\");\n return new SplatLoader().loadInternalAsync({\n url: options.url,\n fileBytes: options.fileBytes,\n fileType: options.fileType,\n fileName: options.fileName,\n stream: options.stream,\n streamLength: options.streamLength,\n postDecode: options.postDecode,\n onProgress: options.onProgress,\n });\n }\n\n const initialized = new Splats({ maxSplats: options.maxSplats });\n try {\n await options.construct?.(initialized);\n return initialized;\n } catch (error) {\n initialized.dispose();\n throw error;\n }\n }\n\n dispose() {\n this.initializationVersion += 1;\n this.isInitialized = false;\n this.commitState(createSplatsState({}));\n }\n\n private disposeTextures() {\n for (const texture of this.textures ?? []) {\n if (texture !== Splats.emptyTexture) {\n texture.dispose();\n }\n }\n this.textures = [Splats.emptyTexture, Splats.emptyTexture];\n for (const texture of Object.values(this.shTextures ?? {})) {\n texture?.dispose();\n }\n this.shTextures = {};\n }\n\n getNumSplats() {\n return this.numSplats;\n }\n\n getNumSh() {\n return !this.extra.sh1\n ? 0\n : !this.extra.sh2\n ? 1\n : !this.extra.sh3a || !this.extra.sh3b\n ? 2\n : 3;\n }\n\n /** Current retained bytes for encoded Splat, sort-center, and SH arrays. */\n getByteLength() {\n let byteLength =\n this.splatArrays[0].byteLength +\n this.splatArrays[1].byteLength +\n this.sortCenters.byteLength;\n\n for (const value of Object.values(this.extra)) {\n if (ArrayBuffer.isView(value)) {\n byteLength += value.byteLength;\n }\n }\n\n return byteLength;\n }\n\n get needsUpdate() {\n return this.updateNeeded;\n }\n\n set needsUpdate(value: boolean) {\n this.updateNeeded = value;\n if (value) this.sortCentersDirty = true;\n }\n\n private ensureSortCenterCapacity(capacity: number) {\n const requiredValues = capacity * 3;\n if (this.sortCenters.length >= requiredValues) return;\n\n const sortCenters = new Float32Array(requiredValues);\n sortCenters.set(this.sortCenters);\n this.sortCenters = sortCenters;\n }\n\n private ensureShCapacity(degree: number, capacity: number) {\n const numArrays = SH_ARRAY_COUNTS[degree] ?? 0;\n const requiredValues = capacity * 4;\n for (let index = 0; index < numArrays; index += 1) {\n const key = SH_KEYS[index];\n const current = this.extra[key];\n if (current instanceof Uint32Array && current.length >= requiredValues) {\n continue;\n }\n const data = new Uint32Array(requiredValues);\n if (current instanceof Uint32Array) data.set(current);\n this.extra[key] = data;\n }\n }\n\n private ensureSplats(numSplats: number): [Uint32Array, Uint32Array] {\n const currentCapacity = this.splatArrays[0].length / 4;\n const targetSize =\n numSplats <= this.maxSplats\n ? this.maxSplats\n : Math.max(numSplats, 2 * this.maxSplats);\n if (targetSize > currentCapacity) {\n this.maxSplats = getTextureSize(Math.max(1, targetSize)).maxSplats;\n const first = new Uint32Array(this.maxSplats * 4);\n const second = new Uint32Array(this.maxSplats * 4);\n first.set(this.splatArrays[0]);\n second.set(this.splatArrays[1]);\n this.splatArrays = [first, second];\n this.updateNeeded = true;\n }\n const capacity = this.splatArrays[0].length / 4;\n this.ensureSortCenterCapacity(capacity);\n this.ensureShCapacity(this.getNumSh(), capacity);\n return this.splatArrays;\n }\n\n private prepareSplatEncoding(numSplats: number, shDegree: number) {\n const arrays = this.ensureSplats(numSplats);\n this.ensureShCapacity(shDegree, arrays[0].length / 4);\n return {\n arrays,\n splatCenters: new Float32Array(\n arrays[0].buffer,\n arrays[0].byteOffset,\n arrays[0].length,\n ),\n sortCenters: this.getSortCenters(),\n shArrays: shDegree === 0 ? undefined : getSplatShArrays(this.extra),\n };\n }\n\n getSplat(index: number): DecodedSplatWithSh;\n getSplat(index: number, includeSh: true): DecodedSplatWithSh;\n getSplat(index: number, includeSh: false): DecodedSplat;\n getSplat(index: number, includeSh: boolean): DecodedSplat;\n getSplat(index: number, includeSh = true) {\n if (index < 0 || index >= this.numSplats) {\n throw new Error(\"Invalid splat index\");\n }\n const splat = decodeSplat(this.splatArrays, index);\n return includeSh\n ? { ...splat, sh: decodeSplatSh(this.extra, index, this.getNumSh()) }\n : splat;\n }\n\n copySplatRecords(\n firstTarget: Uint32Array,\n secondTarget: Uint32Array,\n sourceStart: number,\n count: number,\n ) {\n const wordStart = sourceStart * 4;\n const wordEnd = wordStart + count * 4;\n firstTarget.set(this.splatArrays[0].subarray(wordStart, wordEnd));\n secondTarget.set(this.splatArrays[1].subarray(wordStart, wordEnd));\n }\n\n setSplats(indices: readonly number[], splats: readonly SplatInput[]) {\n if (indices.length !== splats.length) {\n throw new Error(\"Splat indices and data must have the same length\");\n }\n const count = splats.length;\n if (count === 0) return;\n\n let shDegree = this.getNumSh();\n let maxIndex = -1;\n for (let offset = 0; offset < count; offset += 1) {\n const index = indices[offset];\n validateSplatIndex(index);\n if (index > maxIndex) maxIndex = index;\n const sh = splats[offset].sh;\n if (sh === undefined) continue;\n const degree = getShDegree(sh);\n if (degree > shDegree) shDegree = degree;\n }\n\n const { arrays, splatCenters, sortCenters, shArrays } =\n this.prepareSplatEncoding(maxIndex + 1, shDegree);\n for (let offset = 0; offset < count; offset += 1) {\n encodeSplat(\n arrays,\n splatCenters,\n shArrays,\n sortCenters,\n indices[offset],\n splats[offset],\n );\n }\n if (maxIndex >= this.numSplats) this.numSplats = maxIndex + 1;\n this.updateNeeded = true;\n }\n\n pushSplats(splats: readonly SplatInput[]) {\n const count = splats.length;\n if (count === 0) return;\n\n const startIndex = this.numSplats;\n const endIndex = startIndex + count;\n validateSplatIndex(endIndex - 1);\n\n let shDegree = this.getNumSh();\n for (let offset = 0; offset < count; offset += 1) {\n const sh = splats[offset].sh;\n if (sh === undefined) continue;\n const degree = getShDegree(sh);\n if (degree > shDegree) shDegree = degree;\n }\n\n const { arrays, splatCenters, sortCenters, shArrays } =\n this.prepareSplatEncoding(endIndex, shDegree);\n for (let offset = 0; offset < count; offset += 1) {\n encodeSplat(\n arrays,\n splatCenters,\n shArrays,\n sortCenters,\n startIndex + offset,\n splats[offset],\n );\n }\n this.numSplats = endIndex;\n this.updateNeeded = true;\n }\n\n removeSplats(indices: readonly number[]) {\n if (indices.length === 0) return;\n\n let sortedUnique = true;\n let previousIndex = -1;\n for (const index of indices) {\n validateSplatIndex(index);\n if (index >= this.numSplats) throw new Error(\"Invalid splat index\");\n if (index <= previousIndex) sortedUnique = false;\n previousIndex = index;\n }\n const removedIndices = sortedUnique\n ? indices\n : [...new Set(indices)].sort((left, right) => left - right);\n\n const recordCount = this.numSplats;\n this.ensureShCapacity(this.getNumSh(), this.splatArrays[0].length / 4);\n const sortCenters = this.getSortCenters();\n const recordArrays = [...this.splatArrays];\n for (const key of SH_KEYS) {\n const sh = this.extra[key];\n if (sh instanceof Uint32Array) recordArrays.push(sh);\n }\n\n let targetIndex = removedIndices[0];\n let sourceIndex = targetIndex + 1;\n for (let offset = 1; offset < removedIndices.length; offset += 1) {\n const nextRemoved = removedIndices[offset];\n const count = nextRemoved - sourceIndex;\n if (count > 0) {\n copySplatRange(\n recordArrays,\n sortCenters,\n targetIndex,\n sourceIndex,\n count,\n );\n targetIndex += count;\n }\n sourceIndex = nextRemoved + 1;\n }\n const tailCount = recordCount - sourceIndex;\n if (tailCount > 0) {\n copySplatRange(\n recordArrays,\n sortCenters,\n targetIndex,\n sourceIndex,\n tailCount,\n );\n targetIndex += tailCount;\n }\n for (const data of recordArrays) {\n data.fill(0, targetIndex * 4, recordCount * 4);\n }\n sortCenters.fill(0, targetIndex * 3, recordCount * 3);\n\n this.numSplats = targetIndex;\n this.updateNeeded = true;\n }\n\n private getSortCenters() {\n if (this.sortCentersDirty) this.rebuildSortCenters();\n return this.sortCenters;\n }\n\n copySortCenters(target: Float32Array, targetStart: number, count: number) {\n if (count > this.numSplats || targetStart + count * 3 > target.length) {\n throw new Error(\"Invalid sort center copy range\");\n }\n target.set(this.getSortCenters().subarray(0, count * 3), targetStart);\n }\n\n private rebuildSortCenters() {\n const capacity = this.splatArrays[0].length / 4;\n this.ensureSortCenterCapacity(capacity);\n const [splatA, splatB] = this.splatArrays;\n const centerView = new Float32Array(\n splatA.buffer,\n splatA.byteOffset,\n splatA.length,\n );\n for (let index = 0; index < this.numSplats; index += 1) {\n const i3 = index * 3;\n const i4 = index * 4;\n const disabled =\n splatB[i4 + 1] >>> 16 === 0xfc00 &&\n (splatB[i4 + 2] & 0xffff) === 0xfc00 &&\n splatB[i4 + 2] >>> 16 === 0xfc00;\n this.sortCenters[i3] = disabled ? Number.NaN : centerView[i4];\n this.sortCenters[i3 + 1] = disabled ? Number.NaN : centerView[i4 + 1];\n this.sortCenters[i3 + 2] = disabled ? Number.NaN : centerView[i4 + 2];\n }\n this.sortCentersDirty = false;\n }\n\n forEachCenter(\n callback: (index: number, x: number, y: number, z: number) => void,\n ) {\n const centers = this.getSortCenters();\n for (let index = 0; index < this.numSplats; index += 1) {\n const i3 = index * 3;\n callback(index, centers[i3], centers[i3 + 1], centers[i3 + 2]);\n }\n }\n\n forEachSplat(\n callback: (\n index: number,\n center: THREE.Vector3,\n scales: THREE.Vector3,\n quaternion: THREE.Quaternion,\n opacity: number,\n color: THREE.Color,\n ) => void,\n ) {\n for (let index = 0; index < this.numSplats; index += 1) {\n const splat = decodeSplat(this.splatArrays, index);\n callback(\n index,\n splat.center,\n splat.scales,\n splat.quaternion,\n splat.opacity,\n splat.color,\n );\n }\n }\n\n setTextureUniforms(uniforms: Record<string, THREE.IUniform>) {\n const [splats, splats2] = this.getSplatTextures();\n const sh = this.getShTextures();\n uniforms.sourceSplats.value = splats;\n uniforms.sourceSplats2.value = splats2;\n uniforms.sh1Texture.value = sh.sh1 ?? Splats.emptyTexture;\n uniforms.sh2Texture.value = sh.sh2 ?? Splats.emptyTexture;\n uniforms.sh3TextureA.value = sh.sh3a ?? Splats.emptyTexture;\n uniforms.sh3TextureB.value = sh.sh3b ?? Splats.emptyTexture;\n this.updateNeeded = false;\n }\n\n private getSplatTextures() {\n if (this.maxSplats === 0 || this.splatArrays[0].length === 0) {\n return [Splats.emptyTexture, Splats.emptyTexture] as const;\n }\n\n const { width, height, depth } = getTextureSize(this.maxSplats);\n const textureData = this.textures[0].image.data;\n const incompatible =\n this.textures[0] === Splats.emptyTexture ||\n this.textures[0].image.width !== width ||\n this.textures[0].image.height !== height ||\n this.textures[0].image.depth !== depth ||\n textureData === null ||\n textureData.buffer !== this.splatArrays[0].buffer;\n if (incompatible) {\n this.disposeMainTextures();\n this.textures = [\n newUintArrayTexture(this.splatArrays[0], width, height, depth),\n newUintArrayTexture(this.splatArrays[1], width, height, depth),\n ];\n } else if (this.needsUpdate) {\n this.textures[0].needsUpdate = true;\n this.textures[1].needsUpdate = true;\n }\n return this.textures;\n }\n\n private disposeMainTextures() {\n for (const texture of this.textures) {\n if (texture !== Splats.emptyTexture) {\n texture.dispose();\n }\n }\n this.textures = [Splats.emptyTexture, Splats.emptyTexture];\n }\n\n private getShTextures(): SplatShTextures {\n this.shTextures.sh1 = this.ensureShTexture(\"sh1\", this.shTextures.sh1);\n this.shTextures.sh2 = this.ensureShTexture(\"sh2\", this.shTextures.sh2);\n this.shTextures.sh3a = this.ensureShTexture(\"sh3a\", this.shTextures.sh3a);\n this.shTextures.sh3b = this.ensureShTexture(\"sh3b\", this.shTextures.sh3b);\n return this.shTextures;\n }\n\n private ensureShTexture(\n key: \"sh1\" | \"sh2\" | \"sh3a\" | \"sh3b\",\n current?: THREE.DataArrayTexture,\n ) {\n let texture = current;\n const data = this.extra[key] as Uint32Array | undefined;\n if (!data) {\n texture?.dispose();\n return undefined;\n }\n const { width, height, depth, maxSplats } = getTextureSize(\n Math.max(1, data.length / 4),\n );\n let padded = data;\n if (data.length < maxSplats * 4) {\n padded = new Uint32Array(maxSplats * 4);\n padded.set(data);\n this.extra[key] = padded;\n }\n const incompatible =\n texture &&\n (texture.image.width !== width ||\n texture.image.height !== height ||\n texture.image.depth !== depth ||\n texture.image.data === null ||\n texture.image.data.buffer !== padded.buffer);\n if (incompatible) {\n texture?.dispose();\n texture = undefined;\n }\n if (!texture) {\n texture = newUintArrayTexture(padded, width, height, depth);\n } else if (this.needsUpdate) {\n texture.needsUpdate = true;\n }\n return texture;\n }\n\n static emptyTexture = newUintArrayTexture(new Uint32Array(4), 1, 1, 1);\n}\n\nfunction newUintArrayTexture(\n data: Uint32Array,\n width: number,\n height: number,\n depth: number,\n) {\n const texture = new THREE.DataArrayTexture(data, width, height, depth);\n texture.format = THREE.RGBAIntegerFormat;\n texture.type = THREE.UnsignedIntType;\n texture.internalFormat = \"RGBA32UI\";\n texture.magFilter = THREE.NearestFilter;\n texture.minFilter = THREE.NearestFilter;\n texture.generateMipmaps = false;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction decodeSplatSh(\n extra: Record<string, unknown>,\n index: number,\n degree: number,\n) {\n const count = SH_COUNTS[degree] ?? 0;\n const result = new Array<THREE.Color>(count);\n const base = index * 4;\n for (let coefficient = 0; coefficient < count; coefficient += 1) {\n const data = extra[SH_KEYS[coefficient >> 2]];\n const word =\n data instanceof Uint32Array ? data[base + (coefficient & 3)] : 0;\n result[coefficient] = decodeShColor(word);\n }\n return result;\n}\n\nfunction validateSplatIndex(index: number) {\n if (\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index >= Number.MAX_SAFE_INTEGER\n ) {\n throw new Error(\"Invalid splat index\");\n }\n}\n\nfunction copySplatRange(\n recordArrays: Uint32Array[],\n sortCenters: Float32Array,\n targetIndex: number,\n sourceIndex: number,\n count: number,\n) {\n const target4 = targetIndex * 4;\n const source4 = sourceIndex * 4;\n const count4 = count * 4;\n for (const data of recordArrays) {\n data.copyWithin(target4, source4, source4 + count4);\n }\n const target3 = targetIndex * 3;\n const source3 = sourceIndex * 3;\n sortCenters.copyWithin(target3, source3, source3 + count * 3);\n}\n\nfunction encodeSplat(\n splatArrays: [Uint32Array, Uint32Array],\n splatCenters: Float32Array,\n shArrays: SplatShArrays | undefined,\n sortCenters: Float32Array,\n index: number,\n splat: SplatInput,\n) {\n const i4 = index * 4;\n const [splatA, splatB] = splatArrays;\n const { center, scales, quaternion, opacity, color } = splat;\n splatCenters[i4] = center.x;\n splatCenters[i4 + 1] = center.y;\n splatCenters[i4 + 2] = center.z;\n splatA[i4 + 3] = encodeSplatOpacity(opacity);\n splatB[i4] = toHalf(color.r) | (toHalf(color.g) << 16);\n splatB[i4 + 1] = toHalf(color.b) | (toHalf(Math.log(scales.x)) << 16);\n splatB[i4 + 2] =\n toHalf(Math.log(scales.y)) | (toHalf(Math.log(scales.z)) << 16);\n splatB[i4 + 3] = encodeQuatOctXy1010R12(\n quaternion.x,\n quaternion.y,\n quaternion.z,\n quaternion.w,\n );\n if (shArrays) encodeSplatSh(shArrays, index, splat.sh);\n\n const i3 = index * 3;\n const disabled = scales.x === 0 && scales.y === 0 && scales.z === 0;\n sortCenters[i3] = disabled ? Number.NaN : center.x;\n sortCenters[i3 + 1] = disabled ? Number.NaN : center.y;\n sortCenters[i3 + 2] = disabled ? Number.NaN : center.z;\n}\n\nfunction getShDegree(sh?: readonly THREE.Color[]) {\n const count = sh?.length ?? 0;\n switch (count) {\n case 0:\n return 0;\n case 3:\n return 1;\n case 8:\n return 2;\n case 15:\n return 3;\n default:\n throw new Error(\"SH must contain 0, 3, 8, or 15 coefficients\");\n }\n}\n\nfunction getSplatShArrays(extra: Record<string, unknown>): SplatShArrays {\n const sh1 = extra.sh1;\n const sh2 = extra.sh2;\n const sh3a = extra.sh3a;\n const sh3b = extra.sh3b;\n return [\n sh1 instanceof Uint32Array ? sh1 : undefined,\n sh2 instanceof Uint32Array ? sh2 : undefined,\n sh3a instanceof Uint32Array ? sh3a : undefined,\n sh3b instanceof Uint32Array ? sh3b : undefined,\n ];\n}\n\nfunction encodeSplatSh(\n shArrays: SplatShArrays,\n index: number,\n sh?: readonly THREE.Color[],\n) {\n const base = index * 4;\n for (let arrayIndex = 0; arrayIndex < shArrays.length; arrayIndex += 1) {\n const data = shArrays[arrayIndex];\n if (!data) continue;\n data[base] = 0;\n data[base + 1] = 0;\n data[base + 2] = 0;\n data[base + 3] = 0;\n }\n if (!sh) return;\n\n for (let coefficient = 0; coefficient < sh.length; coefficient += 1) {\n const data = shArrays[coefficient >> 2];\n if (!data) continue;\n data[base + (coefficient & 3)] = encodeShColor(sh[coefficient]);\n }\n}\n\nfunction encodeShColor(color: THREE.Color) {\n const maxAbs = Math.max(\n Math.abs(color.r),\n Math.abs(color.g),\n Math.abs(color.b),\n );\n const exponent = Math.round(\n Math.min(31, Math.max(0, Math.floor(Math.log2(maxAbs)) + 15)),\n );\n const divisor = 2 ** (exponent - 15) / 255;\n const encodedR = Math.round(\n Math.min(255, Math.max(0, Math.abs(color.r) / divisor)),\n );\n const encodedG = Math.round(\n Math.min(255, Math.max(0, Math.abs(color.g) / divisor)),\n );\n const encodedB = Math.round(\n Math.min(255, Math.max(0, Math.abs(color.b) / divisor)),\n );\n const signs =\n (color.r < 0 ? 1 : 0) | (color.g < 0 ? 2 : 0) | (color.b < 0 ? 4 : 0);\n return (\n encodedR |\n (encodedG << 8) |\n (encodedB << 16) |\n (((exponent << 3) | signs) << 24)\n );\n}\n\nfunction decodeShColor(word: number) {\n const exponentAndSigns = word >>> 24;\n const multiplier = 2 ** ((exponentAndSigns >>> 3) - 15) / 255;\n let r = (word & 0xff) * multiplier;\n let g = ((word >>> 8) & 0xff) * multiplier;\n let b = ((word >>> 16) & 0xff) * multiplier;\n if (exponentAndSigns & 1) r = -r;\n if (exponentAndSigns & 2) g = -g;\n if (exponentAndSigns & 4) b = -b;\n return new THREE.Color(r, g, b);\n}\n","function b64ToUint6(nChr) {\n return nChr > 64 && nChr < 91\n ? nChr - 65\n : nChr > 96 && nChr < 123\n ? nChr - 71\n : nChr > 47 && nChr < 58\n ? nChr + 4\n : nChr === 43\n ? 62\n : nChr === 47\n ? 63\n : 0\n}\n\nfunction base64ToUint8(sBase64, nBlocksSize) {\n const sB64Enc = sBase64.replace(/[^A-Za-z0-9+/]/g, \"\")\n const nInLen = sB64Enc.length\n const nOutLen = nBlocksSize\n ? Math.ceil(((nInLen * 3 + 1) >> 2) / nBlocksSize) * nBlocksSize\n : (nInLen * 3 + 1) >> 2\n const taBytes = new Uint8Array(nOutLen)\n\n let nMod3\n let nMod4\n let nUint24 = 0\n let nOutIdx = 0\n for (let nInIdx = 0; nInIdx < nInLen; nInIdx++) {\n nMod4 = nInIdx & 3\n nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (6 * (3 - nMod4))\n if (nMod4 === 3 || nInLen - nInIdx === 1) {\n nMod3 = 0\n while (nMod3 < 3 && nOutIdx < nOutLen) {\n taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255\n nMod3++\n nOutIdx++\n }\n nUint24 = 0\n }\n }\n\n return taBytes\n}\nfunction toUint8(b64) {\n if (typeof Uint8Array.fromBase64 === \"function\") return Uint8Array.fromBase64(b64)\n let bin = atob(b64)\n let len = bin.length\n let bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = bin.charCodeAt(i)\n }\n return bytes\n}\n\nconst decode64 = typeof atob === \"function\" ? toUint8 : base64ToUint8\n\nexport default decode64\n","import initWasm from \"gaussian-splat-rs\";\nimport wasmBytes from \"gaussian-splat-rs/gaussian_splat_rs_bg.wasm?arraybuffer&base64\";\n\nexport const WASM_MODULE = WebAssembly.compile(wasmBytes);\n\nlet initialized = false;\n\n/** Initializes the main-thread WASM instance used by raycasting. */\ninitWasm({ module_or_path: WASM_MODULE }).then(() => {\n initialized = true;\n});\n\nexport function isInitialized() {\n return initialized;\n}\n","import * as THREE from \"three\";\n\nimport {\n get_raycast_buffer,\n get_raycast_buffer2,\n raycast_splat_buffers,\n} from \"gaussian-splat-rs\";\nimport { SplatEdit, SplatEditSdf, SplatEdits } from \"./SplatEdit\";\nimport { type SplatInput, Splats } from \"./Splats\";\nimport type { SplatFileType } from \"./defines\";\nimport type { SplatPostDecodeProgram } from \"./postDecode\";\nimport * as wasm from \"./wasm\";\n\nconst raycastWorldToMesh = new THREE.Matrix4();\nconst raycastDirectionMatrix = new THREE.Matrix3();\nconst raycastOrigin = new THREE.Vector3();\nconst raycastDirection = new THREE.Vector3();\n\nexport type SplatMeshOptions = {\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n /** Optional stream byte-length estimate used for progress reporting. */\n streamLength?: number;\n /** Declarative per-splat transform executed in the decode worker. */\n postDecode?: SplatPostDecodeProgram;\n splats?: Splats;\n maxSplats?: number;\n constructSplats?: (splats: Splats) => Promise<void> | void;\n onProgress?: (event: ProgressEvent) => void;\n onLoad?: (mesh: SplatMesh) => Promise<void> | void;\n editable?: boolean;\n raycastable?: boolean;\n minRaycastOpacity?: number;\n onFrame?: (context: {\n mesh: SplatMesh;\n time: number;\n deltaTime: number;\n }) => void;\n};\n\nexport type SplatMeshFrameContext = {\n time: number;\n deltaTime: number;\n camera: THREE.Camera;\n globalEdits: SplatEdit[];\n};\n\nfunction validateSplatMeshInitializationInputs(options: SplatMeshOptions) {\n const inputs: string[] = [];\n if (options.url !== undefined) inputs.push(\"url\");\n if (options.fileBytes !== undefined) inputs.push(\"fileBytes\");\n if (options.stream !== undefined) inputs.push(\"stream\");\n if (options.splats !== undefined) inputs.push(\"splats\");\n if (options.constructSplats !== undefined) inputs.push(\"constructSplats\");\n if (inputs.length > 1) {\n throw new Error(\n `SplatMesh initialization inputs are mutually exclusive; provide only one of url, fileBytes, stream, splats, or constructSplats (received: ${inputs.join(\", \")})`,\n );\n }\n}\n\n/** A scene object backed by a fixed encoded splat source and RGBA SDF edits. */\nexport class SplatMesh extends THREE.Object3D {\n initialized: Promise<SplatMesh>;\n isInitialized = false;\n\n splats?: Splats;\n\n numSplats = 0;\n recolor = new THREE.Color(1, 1, 1);\n opacity = 1;\n maxSh = 3;\n\n edits: SplatEdit[] | null = null;\n editable: boolean;\n raycastable: boolean;\n minRaycastOpacity: number;\n sdfEdits: SplatEdits | null = null;\n\n onFrame?: SplatMeshOptions[\"onFrame\"];\n\n version = 0;\n sortVersion = 0;\n centerVersion = 0;\n mappingVersion = 0;\n\n private lastSplats?: Splats;\n private lastNumSplats = -1;\n private lastMaxSh = -1;\n private lastMatrixWorld = new THREE.Matrix4();\n private hasLastMatrixWorld = false;\n private lastRecolor = new THREE.Vector4().setScalar(Number.NaN);\n private viewOrigin = new THREE.Vector3();\n private lastViewOrigin = new THREE.Vector3().setScalar(Number.NaN);\n private sdfCoordinateOrigin = new THREE.Vector3();\n\n constructor(options: SplatMeshOptions = {}) {\n super();\n\n if (options.splats && !(options.splats instanceof Splats)) {\n throw new TypeError(\"SplatMesh splats must be a Splats instance\");\n }\n validateSplatMeshInitializationInputs(options);\n this.splats =\n options.splats ??\n new Splats({\n url: options.url,\n fileBytes: options.fileBytes,\n fileType: options.fileType,\n fileName: options.fileName,\n stream: options.stream,\n streamLength: options.streamLength,\n postDecode: options.postDecode,\n maxSplats: options.maxSplats,\n construct: options.constructSplats,\n onProgress: options.onProgress,\n });\n\n this.numSplats = this.splats.getNumSplats();\n this.editable = options.editable ?? true;\n this.raycastable = options.raycastable ?? true;\n this.minRaycastOpacity = options.minRaycastOpacity ?? 0.05;\n this.onFrame = options.onFrame;\n\n if (!this.splats.isInitialized) {\n this.initialized = this.splats.initialized.then(async () => {\n this.numSplats = this.splats?.getNumSplats() ?? 0;\n this.updateMappingVersion();\n this.isInitialized = true;\n await options.onLoad?.(this);\n return this;\n });\n } else {\n this.isInitialized = true;\n const maybePromise = options.onLoad?.(this);\n this.initialized =\n maybePromise instanceof Promise\n ? maybePromise.then(() => this)\n : Promise.resolve(this);\n }\n }\n\n pushSplats(splats: readonly SplatInput[]) {\n if (!this.splats) {\n throw new Error(\"Cannot push Splats after SplatMesh is disposed\");\n }\n this.splats.pushSplats(splats);\n this.numSplats = this.splats.getNumSplats();\n }\n\n setSplats(indices: readonly number[], splats: readonly SplatInput[]) {\n if (!this.splats) {\n throw new Error(\"Cannot set Splats after SplatMesh is disposed\");\n }\n this.splats.setSplats(indices, splats);\n this.numSplats = this.splats.getNumSplats();\n }\n\n removeSplats(indices: readonly number[]) {\n if (!this.splats) {\n throw new Error(\"Cannot remove Splats after SplatMesh is disposed\");\n }\n this.splats.removeSplats(indices);\n this.numSplats = this.splats.getNumSplats();\n }\n\n forEachSplat(\n callback: (\n index: number,\n center: THREE.Vector3,\n scales: THREE.Vector3,\n quaternion: THREE.Quaternion,\n opacity: number,\n color: THREE.Color,\n ) => void,\n ) {\n this.splats?.forEachSplat(callback);\n }\n\n dispose() {\n // @ts-ignore Object base class has a dispose method in Three.js >= r186\n super.dispose?.();\n\n this.sdfEdits?.dispose();\n this.sdfEdits = null;\n this.splats?.dispose();\n this.splats = undefined;\n }\n\n getBoundingBox(centersOnly = true) {\n if (!this.isInitialized) {\n throw new Error(\n \"Cannot get bounding box before SplatMesh is initialized\",\n );\n }\n const minimum = new THREE.Vector3().setScalar(Number.POSITIVE_INFINITY);\n const maximum = new THREE.Vector3().setScalar(Number.NEGATIVE_INFINITY);\n const corner = new THREE.Vector3();\n\n if (centersOnly) {\n this.splats?.forEachCenter((_index, x, y, z) => {\n if (Number.isNaN(x)) return;\n corner.set(x, y, z);\n minimum.min(corner);\n maximum.max(corner);\n });\n return new THREE.Box3(minimum, maximum);\n }\n\n const signs = [-1, 1];\n this.splats?.forEachSplat((_index, center, scales, quaternion) => {\n for (const x of signs) {\n for (const y of signs) {\n for (const z of signs) {\n corner\n .set(x * scales.x, y * scales.y, z * scales.z)\n .applyQuaternion(quaternion)\n .add(center);\n minimum.min(corner);\n maximum.max(corner);\n }\n }\n }\n });\n return new THREE.Box3(minimum, maximum);\n }\n\n frameUpdate({ time, deltaTime, camera, globalEdits }: SplatMeshFrameContext) {\n this.onFrame?.({ mesh: this, time, deltaTime });\n\n const source = this.splats;\n if (!source) {\n return;\n }\n this.splats = source;\n\n let updated = false;\n let centersUpdated = false;\n let transformUpdated = false;\n const count = source.getNumSplats();\n if (source !== this.lastSplats) {\n this.lastSplats = source;\n updated = true;\n centersUpdated = true;\n }\n if (count !== this.lastNumSplats) {\n this.lastNumSplats = count;\n this.numSplats = count;\n this.mappingVersion += 1;\n updated = true;\n centersUpdated = true;\n }\n if (source.needsUpdate) {\n updated = true;\n centersUpdated = true;\n }\n if (this.maxSh !== this.lastMaxSh) {\n this.lastMaxSh = this.maxSh;\n updated = true;\n }\n if (this.maxSh > 0 && source.getNumSh() > 0) {\n camera.getWorldPosition(this.viewOrigin);\n if (!this.viewOrigin.equals(this.lastViewOrigin)) {\n this.lastViewOrigin.copy(this.viewOrigin);\n // Directional SH changes appearance but never changes splat depth.\n updated = true;\n }\n }\n\n this.updateWorldMatrix(true, false);\n if (\n !this.hasLastMatrixWorld ||\n !this.lastMatrixWorld.equals(this.matrixWorld)\n ) {\n this.lastMatrixWorld.copy(this.matrixWorld);\n this.hasLastMatrixWorld = true;\n updated = true;\n transformUpdated = true;\n }\n\n const recolor = new THREE.Vector4(\n this.recolor.r,\n this.recolor.g,\n this.recolor.b,\n THREE.MathUtils.clamp(this.opacity, 0, 1),\n );\n if (!recolor.equals(this.lastRecolor)) {\n this.lastRecolor.copy(recolor);\n updated = true;\n }\n\n const edits = new Set<SplatEdit>();\n if (this.editable) {\n for (const edit of globalEdits) edits.add(edit);\n if (this.edits) {\n for (const edit of this.edits) edits.add(edit);\n } else {\n this.traverseVisible((node) => {\n if (node instanceof SplatEdit) edits.add(node);\n });\n }\n }\n const orderedEdits = Array.from(edits).sort(\n (left, right) => left.ordering - right.ordering,\n );\n const groups = orderedEdits.map((edit) => {\n if (edit.sdfs) return { edit, sdfs: edit.sdfs };\n const sdfs: SplatEditSdf[] = [];\n edit.traverseVisible((node) => {\n if (node instanceof SplatEditSdf) sdfs.push(node);\n });\n return { edit, sdfs };\n });\n\n if (groups.length > 0 && !this.sdfEdits) {\n this.sdfEdits = new SplatEdits({\n maxEdits: groups.length,\n maxSdfs: groups.reduce((total, group) => total + group.sdfs.length, 0),\n });\n updated = true;\n }\n const sdfCoordinateOrigin = this.sdfCoordinateOrigin.setFromMatrixPosition(\n this.matrixWorld,\n );\n if (this.sdfEdits?.update(groups, sdfCoordinateOrigin).updated) {\n // RGBA-only SDF changes preserve centers and their existing sort order.\n updated = true;\n }\n\n if (updated) {\n this.version += 1;\n if (centersUpdated || transformUpdated) this.sortVersion += 1;\n if (centersUpdated) this.centerVersion += 1;\n }\n }\n\n updateVersion({ sort = true }: { sort?: boolean } = {}) {\n this.version += 1;\n if (sort) {\n this.sortVersion += 1;\n this.centerVersion += 1;\n }\n }\n\n updateMappingVersion() {\n this.mappingVersion += 1;\n this.updateVersion();\n }\n\n set needsUpdate(value: boolean) {\n if (value) this.updateVersion();\n }\n\n raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) {\n if (!wasm.isInitialized() || !this.raycastable || !this.splats) {\n return;\n }\n\n const { near, far, ray } = raycaster;\n if (\n this.numSplats === 0 ||\n !Number.isFinite(this.minRaycastOpacity) ||\n this.minRaycastOpacity >= 1 ||\n near > far\n ) {\n return;\n }\n const worldToMesh = raycastWorldToMesh.copy(this.matrixWorld).invert();\n const origin = raycastOrigin.copy(ray.origin).applyMatrix4(worldToMesh);\n const direction = raycastDirection\n .copy(ray.direction)\n .applyMatrix3(raycastDirectionMatrix.setFromMatrix4(worldToMesh));\n const buffer = get_raycast_buffer();\n const buffer2 = get_raycast_buffer2();\n const capacity = buffer.length / 4;\n\n for (let base = 0; base < this.numSplats; base += capacity) {\n const count = Math.min(capacity, this.numSplats - base);\n this.splats.copySplatRecords(buffer, buffer2, base, count);\n const distances = raycast_splat_buffers(\n origin.x,\n origin.y,\n origin.z,\n direction.x,\n direction.y,\n direction.z,\n this.minRaycastOpacity,\n near,\n far,\n count,\n );\n\n for (let index = 0; index < distances.length; index += 1) {\n const distance = distances[index];\n intersects.push({\n distance,\n point: ray.at(distance, new THREE.Vector3()),\n object: this,\n });\n }\n }\n }\n}\n","const uint SPLAT_TEX_WIDTH_BITS = 11u;\nconst uint SPLAT_TEX_HEIGHT_BITS = 11u;\nconst uint SPLAT_TEX_LAYER_BITS = SPLAT_TEX_WIDTH_BITS + SPLAT_TEX_HEIGHT_BITS;\n\nconst uint SPLAT_TEX_WIDTH = 1u << SPLAT_TEX_WIDTH_BITS;\nconst uint SPLAT_TEX_HEIGHT = 1u << SPLAT_TEX_HEIGHT_BITS;\n\nconst uint SPLAT_TEX_WIDTH_MASK = SPLAT_TEX_WIDTH - 1u;\nconst uint SPLAT_TEX_HEIGHT_MASK = SPLAT_TEX_HEIGHT - 1u;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nconst float INFINITY = 1.0 / 0.0;\n\nvec3 srgbToLinear(vec3 rgb) {\n return pow(rgb, vec3(2.2));\n}\n\nuint encodeQuatOctXy1010R12(vec4 q) {\n // Ensure minimal representation: flip if q.w is negative.\n if (q.w < 0.0) {\n q = -q;\n }\n // Compute rotation angle: θ = 2 * acos(q.w) ∈ [0,π]\n float theta = 2.0 * acos(clamp(q.w, 0.0, 1.0));\n\n // --- Folded Octahedral Mapping (inline) ---\n // q.xyz = axis * sin(theta / 2). The common sine factor cancels during\n // octahedral normalization, so the rotation axis need not be recovered.\n float sum = abs(q.x) + abs(q.y) + abs(q.z);\n // Use the canonical +X axis when the vector part is too small to project.\n vec2 p = (sum < 1e-6) ? vec2(1.0, 0.0) : q.xy / sum;\n // Fold the lower hemisphere.\n if (q.z < 0.0) {\n float oldPx = p.x;\n p.x = (1.0 - abs(p.y)) * (p.x >= 0.0 ? 1.0 : -1.0);\n p.y = (1.0 - abs(oldPx)) * (p.y >= 0.0 ? 1.0 : -1.0);\n }\n // Remap from [-1,1] to [0,1]\n float u_f = p.x * 0.5 + 0.5;\n float v_f = p.y * 0.5 + 0.5;\n // Quantize to 10 bits (0 to 1023)\n uint quantU = uint(clamp(round(u_f * 1023.0), 0.0, 1023.0));\n uint quantV = uint(clamp(round(v_f * 1023.0), 0.0, 1023.0));\n \n // --- Angle Quantization ---\n // Quantize θ ∈ [0,π] to 12 bits (0 to 4095)\n uint angleInt = uint(clamp(round((theta / PI) * 4095.0), 0.0, 4095.0));\n \n // Pack bits: bits [0–9]: quantU, [10–19]: quantV, [20–31]: angleInt.\n return (angleInt << 20u) | (quantV << 10u) | quantU;\n}\n\nvec4 decodeQuatOctXy1010R12(uint encoded) {\n // Extract the fields.\n uint quantU = encoded & uint(0x3FFu); // bits 0–9\n uint quantV = (encoded >> 10u) & uint(0x3FFu); // bits 10–19\n uint angleInt = encoded >> 20u; // bits 20–31\n\n // Recover u and v in [0,1], then map to [-1,1].\n float u_f = float(quantU) / 1023.0;\n float v_f = float(quantV) / 1023.0;\n vec2 f = vec2(u_f * 2.0 - 1.0, v_f * 2.0 - 1.0);\n\n vec3 axis = vec3(f.xy, 1.0 - abs(f.x) - abs(f.y));\n float t = max(-axis.z, 0.0);\n axis.x += (axis.x >= 0.0) ? -t : t;\n axis.y += (axis.y >= 0.0) ? -t : t;\n axis = normalize(axis);\n \n // Decode the angle θ ∈ [0,π].\n float theta = (float(angleInt) / 4095.0) * PI;\n float halfTheta = theta * 0.5;\n float s = sin(halfTheta);\n float w = cos(halfTheta);\n \n return vec4(axis * s, w);\n}\n\nvec3 decodeSplatCenter(uvec4 splatData) {\n return vec3(\n uintBitsToFloat(splatData.x),\n uintBitsToFloat(splatData.y),\n uintBitsToFloat(splatData.z)\n );\n}\n\n// Encode a Splat whose scale is already logarithmic into the standard\n// two-record representation. The first record's final word stores alpha and\n// special-kernel shape amount as float16.\nvoid encodeSplatLnScale(\n out uvec4 splatData, out uvec4 splatData2,\n vec3 center, vec3 lnScales, vec4 quaternion, vec4 rgba, float shapeAmount\n) {\n splatData.x = floatBitsToUint(center.x);\n splatData.y = floatBitsToUint(center.y);\n splatData.z = floatBitsToUint(center.z);\n splatData.w = packHalf2x16(clamp(vec2(rgba.a, shapeAmount), 0.0, 1.0));\n\n splatData2.x = packHalf2x16(rgba.rg);\n splatData2.y = packHalf2x16(vec2(rgba.b, lnScales.x));\n splatData2.z = packHalf2x16(lnScales.yz);\n splatData2.w = encodeQuatOctXy1010R12(quaternion);\n}\n\nvec2 decodeSplatAlphaShapeAmount(uvec4 splatData) {\n return unpackHalf2x16(splatData.w);\n}\n\nvoid decodeSplatAttributesLnScale(\n uvec4 splatData2,\n float alpha,\n out vec3 lnScales, out vec4 quaternion, out vec4 rgba\n) {\n rgba.a = alpha;\n\n rgba.rg = unpackHalf2x16(splatData2.x);\n vec2 split = unpackHalf2x16(splatData2.y);\n rgba.b = split.x;\n lnScales.x = split.y;\n lnScales.yz = unpackHalf2x16(splatData2.z);\n quaternion = decodeQuatOctXy1010R12(splatData2.w);\n}\n\nvec3 decodeSplatShRgb(uint encoded) {\n uint biasedBase = (encoded >> 27u) & 0x1fu;\n // Re-bias the exponent from the packed bias of 15 to float32's bias of 127,\n // then construct the exact power of two directly (127 - 15 = 112).\n float divisor = uintBitsToFloat((biasedBase + 112u) << 23u) / 255.0;\n\n vec3 rgb = vec3(uvec3(encoded & 0xffu, (encoded >> 8u) & 0xffu, (encoded >> 16u) & 0xffu));\n rgb *= divisor;\n\n return vec3(\n ((encoded & 0x1000000u) != 0u) ? -rgb.r : rgb.r,\n ((encoded & 0x2000000u) != 0u) ? -rgb.g : rgb.g,\n ((encoded & 0x4000000u) != 0u) ? -rgb.b : rgb.b\n );\n}\n\n// Rotate vector v by quaternion q\nvec3 quatVec(vec4 q, vec3 v) {\n // Rotate vector v by quaternion q\n vec3 t = 2.0 * cross(q.xyz, v);\n return v + q.w * t + cross(q.xyz, t);\n}\n\n// Apply quaternion q1 after quaternion q2\nvec4 quatQuat(vec4 q1, vec4 q2) {\n return vec4(\n q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,\n q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x,\n q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w,\n q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n );\n}\n\nmat3 scaleQuaternionToMatrix(vec3 s, vec4 q) {\n // Compute the matrix of scaling by s then rotating by q\n return mat3(\n s.x * (1.0 - 2.0 * (q.y * q.y + q.z * q.z)),\n s.x * (2.0 * (q.x * q.y + q.w * q.z)),\n s.x * (2.0 * (q.x * q.z - q.w * q.y)),\n s.y * (2.0 * (q.x * q.y - q.w * q.z)),\n s.y * (1.0 - 2.0 * (q.x * q.x + q.z * q.z)),\n s.y * (2.0 * (q.y * q.z + q.w * q.x)),\n s.z * (2.0 * (q.x * q.z + q.w * q.y)),\n s.z * (2.0 * (q.y * q.z - q.w * q.x)),\n s.z * (1.0 - 2.0 * (q.x * q.x + q.y * q.y))\n );\n}\n\nivec3 splatTexCoord(int index) {\n uint x = uint(index) & SPLAT_TEX_WIDTH_MASK;\n uint y = (uint(index) >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK;\n uint z = uint(index) >> SPLAT_TEX_LAYER_BITS;\n return ivec3(x, y, z);\n}\n","\nprecision highp float;\nprecision highp int;\n\n#include <splatDefines>\n\nuniform float near;\nuniform float far;\nuniform bool encodeLinear;\nuniform float time;\nuniform bool debugFlag;\nuniform float minAlpha;\n\nout vec4 fragColor;\n\nin vec4 vRgba;\nin vec2 vSplatUv;\nin vec3 vNdc;\nflat in uint vSplatIndex;\nflat in float vSupportRadiusSquared;\nflat in float vKernelPower;\n\n#include <logdepthbuf_pars_fragment>\n\nvoid main() {\n vec4 rgba = vRgba;\n\n float z2 = dot(vSplatUv, vSplatUv);\n if (z2 > vSupportRadiusSquared) {\n discard;\n }\n\n float kernelAlpha = exp(-0.5 * z2);\n if (vKernelPower != 0.0) {\n kernelAlpha = 1.0 - pow(1.0 - kernelAlpha, vKernelPower);\n }\n rgba.a *= kernelAlpha;\n\n if (rgba.a < minAlpha) {\n discard;\n }\n if (encodeLinear) {\n rgba.rgb = srgbToLinear(rgba.rgb);\n }\n\n #ifdef PREMULTIPLIED_ALPHA\n fragColor = vec4(rgba.rgb * rgba.a, rgba.a);\n #else\n fragColor = rgba;\n #endif\n\n #include <logdepthbuf_fragment>\n}\n","\nprecision highp float;\nprecision highp int;\nprecision highp usampler2DArray;\n\n#include <splatDefines>\n\nout vec4 vRgba;\nout vec2 vSplatUv;\nout vec3 vNdc;\nflat out uint vSplatIndex;\nflat out float vSupportRadiusSquared;\nflat out float vKernelPower;\n\n// uniform uint numSplats;\nuniform vec2 renderSize;\nuniform vec4 renderToViewQuat;\nuniform vec3 renderToViewPos;\n// Uniform scale of the render-to-view transform (1.0 unless the camera is scaled)\nuniform float renderToViewScale;\nuniform float maxStdDev;\nuniform float minPixelRadius;\nuniform float maxPixelRadius;\nuniform float time;\nuniform float deltaTime;\nuniform bool debugFlag;\nuniform float minAlpha;\nuniform bool enable2DGS;\nuniform float blurAmount;\nuniform float preBlurAmount;\nuniform float clipXY;\nuniform float focalAdjustment;\n\nuniform usampler2D ordering;\nuniform usampler2DArray splats;\nuniform usampler2DArray splats2;\n\n// Required by logdepthbuf_pars_vertex (normally defined in three.js #include <common>)\nbool isPerspectiveMatrix( mat4 m ) {\n return m[ 2 ][ 3 ] == -1.0;\n}\n\n#include <logdepthbuf_pars_vertex>\n\nfloat gaussianSupportRadius(float alpha, float maximumRadius) {\n if (minAlpha <= 0.0) return maximumRadius;\n float radiusSquared = 2.0 * log(alpha / minAlpha);\n return min(maximumRadius, sqrt(max(0.0, radiusSquared)));\n}\n\nvoid main() {\n // Default to outside the frustum so it's discarded if we return early\n gl_Position = vec4(0.0, 0.0, 2.0, 1.0);\n\n ivec2 orderingCoord = ivec2((gl_InstanceID >> 2) & 4095, gl_InstanceID >> 14);\n uint splatIndex = texelFetch(ordering, orderingCoord, 0)[gl_InstanceID & 3];\n if (splatIndex == 0xffffffffu) {\n // Special value reserved for \"no splat\"\n return;\n }\n\n ivec3 texCoord = splatTexCoord(int(splatIndex));\n uvec4 splat1 = texelFetch(splats, texCoord, 0);\n vec2 alphaShapeAmount = decodeSplatAlphaShapeAmount(splat1);\n float alpha = alphaShapeAmount.x;\n if ((alpha == 0.0) || (alpha < minAlpha)) {\n return;\n }\n vec3 center = decodeSplatCenter(splat1);\n // Compute the view space center of the splat\n vec3 viewCenter = renderToViewScale * quatVec(renderToViewQuat, center) + renderToViewPos;\n\n // Discard splats behind the camera\n if (viewCenter.z >= 0.0) {\n return;\n }\n\n // Compute the clip space center of the splat\n vec4 clipCenter = projectionMatrix * vec4(viewCenter, 1.0);\n\n // Discard splats outside near/far planes\n if (abs(clipCenter.z) >= clipCenter.w) {\n return;\n }\n\n // Discard splats more than clipXY times outside the XY frustum\n float clip = clipXY * clipCenter.w;\n if (abs(clipCenter.x) > clip || abs(clipCenter.y) > clip) {\n return;\n }\n\n // The second record is only needed by splats whose centers survive the\n // view-frustum checks above.\n vec3 lnScales;\n vec4 quaternion, rgba;\n uvec4 splat2 = texelFetch(splats2, texCoord, 0);\n decodeSplatAttributesLnScale(splat2, alpha, lnScales, quaternion, rgba);\n vec3 scales = exp(lnScales);\n bvec3 zeroScales = equal(scales, vec3(0.0));\n if (all(zeroScales)) {\n return;\n }\n\n // Match the reference 3DGS rasterizer by clamping SH-evaluated RGB positive.\n rgba.rgb = max(rgba.rgb, vec3(0.0));\n\n // Decode the shape amount independently from mesh/SDF opacity, which\n // remains in the main splat's alpha.\n float kernelShape = 1.0 + 4.0 * min(alphaShapeAmount.y, 1.0);\n // Zero marks the ordinary Gaussian path; wider kernels reuse this power\n // for every covered fragment.\n float kernelPower = 0.0;\n if (kernelShape > 1.0) {\n kernelPower = exp(\n (kernelShape * kernelShape - 1.0) / 2.718281828459045\n );\n }\n vKernelPower = kernelPower;\n\n // Expand wider shape kernels until alpha is nearly zero before clipping.\n float maximumSupportRadius = maxStdDev\n + 0.7 * max(kernelShape - 1.0, 0.0);\n float supportRadius = maximumSupportRadius;\n\n scales *= renderToViewScale;\n\n vRgba = vec4(rgba.rgb, alpha);\n\n // Record the splat index for entropy\n vSplatIndex = splatIndex;\n\n // Compute view space quaternion of splat\n vec4 viewQuaternion = quatQuat(renderToViewQuat, quaternion);\n\n if (enable2DGS && any(zeroScales)) {\n if (kernelPower == 0.0) {\n supportRadius = gaussianSupportRadius(alpha, supportRadius);\n }\n vSupportRadiusSquared = supportRadius * supportRadius;\n vSplatUv = position.xy * supportRadius;\n\n vec3 offset;\n if (zeroScales.z) {\n offset = vec3(vSplatUv.xy * scales.xy, 0.0);\n } else if (zeroScales.y) {\n offset = vec3(vSplatUv.x * scales.x, 0.0, vSplatUv.y * scales.z);\n } else {\n offset = vec3(0.0, vSplatUv.xy * scales.yz);\n }\n\n vec3 viewPos = viewCenter + quatVec(viewQuaternion, offset);\n gl_Position = projectionMatrix * vec4(viewPos, 1.0);\n vNdc = gl_Position.xyz / gl_Position.w;\n\n #include <logdepthbuf_vertex>\n return;\n }\n\n // Compute the scaled rotation basis of the splat.\n mat3 RS = scaleQuaternionToMatrix(scales, viewQuaternion);\n\n // Compute the two relevant columns of the projection Jacobian.\n vec2 scaledRenderSize = renderSize * focalAdjustment;\n vec2 focal = 0.5 * scaledRenderSize * vec2(projectionMatrix[0][0], projectionMatrix[1][1]);\n\n vec3 j0;\n vec3 j1;\n if (isOrthographic) {\n j0 = vec3(focal.x, 0.0, 0.0);\n j1 = vec3(0.0, focal.y, 0.0);\n } else {\n float invZ = 1.0 / viewCenter.z;\n vec2 J1 = focal * invZ;\n vec2 J2 = -(J1 * viewCenter.xy) * invZ;\n j0 = vec3(J1.x, 0.0, J2.x);\n j1 = vec3(0.0, J1.y, J2.y);\n }\n\n // Project only the 2D covariance entries that are consumed below:\n // j^T * RS * RS^T * j = dot(RS^T * j, RS^T * j).\n vec3 p0 = transpose(RS) * j0;\n vec3 p1 = transpose(RS) * j1;\n float a = dot(p0, p0);\n float b = dot(p0, p1);\n float d = dot(p1, p1);\n\n // Optionally pre-blur the splat to match non-antialias optimized splats\n a += preBlurAmount;\n d += preBlurAmount;\n\n // Do convolution with a 0.5-pixel Gaussian for anti-aliasing: sqrt(0.3) ~= 0.5\n float detOrig = a * d - b * b;\n a += blurAmount;\n d += blurAmount;\n float det = a * d - b * b;\n\n // Compute anti-aliasing intensity scaling factor\n float blurAdjust = sqrt(max(0.0, detOrig / det));\n alpha *= blurAdjust;\n if (alpha < minAlpha) {\n return;\n }\n vRgba.a = alpha;\n\n // Ordinary Gaussians need only cover fragments that can reach minAlpha.\n // Wide kernels retain their separately expanded support radius.\n if (kernelPower == 0.0) {\n supportRadius = gaussianSupportRadius(alpha, supportRadius);\n }\n vSupportRadiusSquared = supportRadius * supportRadius;\n vSplatUv = position.xy * supportRadius;\n\n // Compute the eigenvalue and eigenvectors of the 2D covariance matrix\n float eigenAvg = 0.5 * (a + d);\n float eigenDelta = sqrt(max(0.0, eigenAvg * eigenAvg - det));\n float eigen1 = eigenAvg + eigenDelta;\n float eigen2 = eigenAvg - eigenDelta;\n\n vec2 eigenVec1 = (abs(b) > 0.001) ? normalize(vec2(b, eigen1 - a))\n : ((a >= d) ? vec2(1.0, 0.0) : vec2(0.0, 1.0));\n vec2 eigenVec2 = vec2(eigenVec1.y, -eigenVec1.x);\n\n // Apply maxPixelRadius to the original support first, then shrink both the\n // quad and its UV extent by the same ratio to preserve the Gaussian profile.\n float scale1 = min(maxPixelRadius, maximumSupportRadius * sqrt(eigen1));\n float scale2 = min(maxPixelRadius, maximumSupportRadius * sqrt(eigen2));\n float supportScale = (maximumSupportRadius > 0.0)\n ? supportRadius / maximumSupportRadius\n : 0.0;\n scale1 *= supportScale;\n scale2 *= supportScale;\n if (scale1 < minPixelRadius && scale2 < minPixelRadius) {\n return;\n }\n\n // Compute the NDC coordinates for the ellipsoid's diagonal axes.\n vec2 pixelOffset = position.x * eigenVec1 * scale1 + position.y * eigenVec2 * scale2;\n vec2 ndcOffset = (2.0 / scaledRenderSize) * pixelOffset;\n\n // Compute NDC center of the splat\n vec3 ndcCenter = clipCenter.xyz / clipCenter.w;\n vec3 ndc = vec3(ndcCenter.xy + ndcOffset, ndcCenter.z);\n\n vNdc = ndc;\n gl_Position = vec4(ndc.xy * clipCenter.w, clipCenter.zw);\n\n #include <logdepthbuf_vertex>\n}\n","import * as THREE from \"three\";\n\nimport splatDefines from \"./shaders/splatDefines.glsl\";\nimport splatFragment from \"./shaders/splatFragment.glsl\";\nimport splatVertex from \"./shaders/splatVertex.glsl\";\n\nlet shaders: Record<string, string> | null = null;\n\nexport function getShaders(): Record<string, string> {\n if (!shaders) {\n // @ts-ignore\n THREE.ShaderChunk.splatDefines = splatDefines;\n shaders = {\n splatVertex,\n splatFragment,\n };\n }\n return shaders;\n}\n","precision highp float;\nprecision highp int;\nprecision highp usampler2D;\nprecision highp usampler2DArray;\n\n#include <splatDefines>\n\nuniform uint targetLayer;\nuniform int targetBase;\nuniform int targetCount;\n\nuniform usampler2DArray sourceSplats;\nuniform usampler2DArray sourceSplats2;\n\nuniform int numSh;\nuniform usampler2DArray sh1Texture;\nuniform usampler2DArray sh2Texture;\nuniform usampler2DArray sh3TextureA;\nuniform usampler2DArray sh3TextureB;\n\nuniform mat3 objectBasis;\nuniform vec3 objectOffset;\nuniform vec3 objectLnScale;\nuniform vec4 objectQuaternion;\nuniform vec4 recolor;\n\nuniform int numSdfs;\nuniform int numEdits;\nuniform usampler2D sdfTexture;\nuniform usampler2D editTexture;\n\nlayout(location = 0) out uvec4 target;\nlayout(location = 1) out uvec4 target2;\n\nconst float MAX_SEMANTIC_OPACITY = 1000.0;\n\nfloat decodeSemanticOpacity(float alpha, float shapeAmount) {\n if (shapeAmount <= 0.0) return alpha;\n\n float kernelShape = 1.0 + 4.0 * shapeAmount;\n float kernelOpacity = exp(\n (kernelShape * kernelShape - 1.0) / 2.718281828459045\n );\n return min(MAX_SEMANTIC_OPACITY, alpha * kernelOpacity);\n}\n\nfloat encodeWideSemanticOpacity(float opacity) {\n opacity = min(opacity, MAX_SEMANTIC_OPACITY);\n float kernelShape = sqrt(log(opacity) * 2.718281828459045 + 1.0);\n return 0.25 * (kernelShape - 1.0);\n}\n\nvec3 evaluateSH1(uvec4 data, vec3 direction) {\n return decodeSplatShRgb(data.x) * (-0.4886025 * direction.y)\n + decodeSplatShRgb(data.y) * (0.4886025 * direction.z)\n + decodeSplatShRgb(data.z) * (-0.4886025 * direction.x);\n}\n\nvec3 evaluateSH12(uvec4 first, uvec4 second, vec3 direction) {\n vec3 result = evaluateSH1(first, direction);\n result += decodeSplatShRgb(first.w) * (1.0925484 * direction.x * direction.y);\n result += decodeSplatShRgb(second.x) * (-1.0925484 * direction.y * direction.z);\n result += decodeSplatShRgb(second.y) * (0.3153915 * (2.0 * direction.z * direction.z - direction.x * direction.x - direction.y * direction.y));\n result += decodeSplatShRgb(second.z) * (-1.0925484 * direction.x * direction.z);\n result += decodeSplatShRgb(second.w) * (0.5462742 * (direction.x * direction.x - direction.y * direction.y));\n return result;\n}\n\nvec3 evaluateSH3(uvec4 first, uvec4 second, vec3 direction) {\n float xx = direction.x * direction.x;\n float yy = direction.y * direction.y;\n float zz = direction.z * direction.z;\n return decodeSplatShRgb(first.x) * (-0.5900436 * direction.y * (3.0 * xx - yy))\n + decodeSplatShRgb(first.y) * (2.8906114 * direction.x * direction.y * direction.z)\n + decodeSplatShRgb(first.z) * (-0.4570458 * direction.y * (4.0 * zz - xx - yy))\n + decodeSplatShRgb(first.w) * (0.3731763 * direction.z * (2.0 * zz - 3.0 * xx - 3.0 * yy))\n + decodeSplatShRgb(second.x) * (-0.4570458 * direction.x * (4.0 * zz - xx - yy))\n + decodeSplatShRgb(second.y) * (1.4453057 * direction.z * (xx - yy))\n + decodeSplatShRgb(second.z) * (-0.5900436 * direction.x * (xx - 3.0 * yy));\n}\n\nvec3 evaluateSH(ivec3 coord, vec3 direction) {\n vec3 result = vec3(0.0);\n if (numSh == 1) {\n result = evaluateSH1(texelFetch(sh1Texture, coord, 0), direction);\n } else if (numSh >= 2) {\n result = evaluateSH12(\n texelFetch(sh1Texture, coord, 0),\n texelFetch(sh2Texture, coord, 0),\n direction\n );\n if (numSh >= 3) {\n result += evaluateSH3(\n texelFetch(sh3TextureA, coord, 0),\n texelFetch(sh3TextureB, coord, 0),\n direction\n );\n }\n }\n return result;\n}\n\nvoid unpackSdf(\n int index,\n out uint flags,\n out vec3 center,\n out vec4 quaternion,\n out vec3 scale,\n out vec4 sizes,\n out vec4 sdfRgba\n) {\n uvec4 data = texelFetch(sdfTexture, ivec2(0, index), 0);\n center = vec3(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z));\n flags = data.w;\n data = texelFetch(sdfTexture, ivec2(1, index), 0);\n quaternion = vec4(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z), uintBitsToFloat(data.w));\n data = texelFetch(sdfTexture, ivec2(2, index), 0);\n scale = vec3(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z));\n data = texelFetch(sdfTexture, ivec2(3, index), 0);\n sizes = vec4(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z), uintBitsToFloat(data.w));\n data = texelFetch(sdfTexture, ivec2(4, index), 0);\n sdfRgba = vec4(uintBitsToFloat(data.x), uintBitsToFloat(data.y), uintBitsToFloat(data.z), uintBitsToFloat(data.w));\n}\n\nfloat sdfDistance(uint type, vec3 position, vec4 sizes) {\n switch (type) {\n case 0u: return -INFINITY;\n case 1u: return position.z;\n case 2u: return length(position) - sizes.w;\n case 3u: {\n vec3 q = abs(position) - sizes.xyz + sizes.w;\n return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - sizes.w;\n }\n case 4u: {\n float k0 = length(position / sizes.xyz);\n float k1 = length(position / dot(sizes.xyz, sizes.xyz));\n return k0 * (k0 - 1.0) / k1;\n }\n case 5u: {\n vec2 d = abs(vec2(length(position.xz), position.y)) - sizes.wy;\n return min(max(d.x, d.y), 0.0) + length(max(d, 0.0));\n }\n case 6u: {\n position.y -= clamp(position.y, -0.5 * sizes.y, 0.5 * sizes.y);\n return length(position) - sizes.w;\n }\n case 7u: {\n float angle = 0.25 * PI * sizes.w;\n vec2 c = vec2(sin(angle), cos(angle));\n vec2 q = vec2(length(position.xy), -position.z);\n float distance = length(q - c * max(dot(q, c), 0.0));\n return distance * (((q.x * c.y - q.y * c.x) < 0.0) ? -1.0 : 1.0);\n }\n }\n return INFINITY;\n}\n\nfloat evaluateSdfs(\n int sdfFirst,\n int sdfCount,\n vec3 position,\n float smoothAmount,\n out vec4 resultRgba,\n out vec4 resultRgbaMask\n) {\n float distanceAccum = smoothAmount == 0.0 ? INFINITY : 0.0;\n float maxExponent = -INFINITY;\n resultRgba = vec4(0.0);\n resultRgbaMask = vec4(0.0);\n int sdfLast = min(sdfFirst + sdfCount, numSdfs);\n\n for (int index = sdfFirst; index < sdfLast; ++index) {\n uint flags;\n vec3 center;\n vec4 quaternion;\n vec3 scale;\n vec4 sizes;\n vec4 value;\n unpackSdf(index, flags, center, quaternion, scale, sizes, value);\n vec4 valueMask = vec4(\n (flags & 0x10000u) != 0u ? 1.0 : 0.0,\n (flags & 0x20000u) != 0u ? 1.0 : 0.0,\n (flags & 0x40000u) != 0u ? 1.0 : 0.0,\n (flags & 0x80000u) != 0u ? 1.0 : 0.0\n );\n vec3 sdfPosition = quatVec(quaternion, position * scale) + center;\n float distance = sdfDistance(flags & 0xffu, sdfPosition, sizes);\n if ((flags & 0x100u) != 0u) distance = -distance;\n\n if (smoothAmount == 0.0) {\n if (distance < distanceAccum) {\n distanceAccum = distance;\n resultRgba = value * valueMask;\n resultRgbaMask = valueMask;\n }\n } else {\n float exponent = -distance / smoothAmount;\n if (exponent > maxExponent) {\n float rescale = exp(maxExponent - exponent);\n distanceAccum *= rescale;\n resultRgba *= rescale;\n resultRgbaMask *= rescale;\n maxExponent = exponent;\n }\n float weight = exp(exponent - maxExponent);\n distanceAccum += weight;\n resultRgba += weight * value * valueMask;\n resultRgbaMask += weight * valueMask;\n }\n }\n\n if (smoothAmount == 0.0 || distanceAccum == 0.0) {\n return distanceAccum == 0.0 ? INFINITY : distanceAccum;\n }\n resultRgba /= distanceAccum;\n resultRgbaMask /= distanceAccum;\n return (-log(distanceAccum) - maxExponent) * smoothAmount;\n}\n\nbool applySdfEdits(\n vec3 position,\n inout vec4 rgba,\n float shapeAmount\n) {\n bool semanticOpacityDecoded = false;\n for (int editIndex = 0; editIndex < numEdits; ++editIndex) {\n uvec4 edit = texelFetch(editTexture, ivec2(0, editIndex), 0);\n uint blendMode = edit.x & 0xffu;\n bool invert = (edit.x & 0x100u) != 0u;\n int sdfFirst = int(edit.y & 0xffffu);\n int sdfCount = int(edit.y >> 16u);\n float softEdge = uintBitsToFloat(edit.z);\n float smoothAmount = uintBitsToFloat(edit.w);\n\n vec4 sdfRgba;\n vec4 sdfRgbaMask;\n float distance = evaluateSdfs(\n sdfFirst,\n sdfCount,\n position,\n smoothAmount,\n sdfRgba,\n sdfRgbaMask\n );\n if (invert) distance = -distance;\n float amount = softEdge == 0.0\n ? (distance < 0.0 ? 1.0 : 0.0)\n : clamp(-distance / softEdge + 0.5, 0.0, 1.0);\n bool editOpacity = amount > 0.0 && sdfRgbaMask.a > 0.0;\n if (editOpacity && !semanticOpacityDecoded) {\n // SDF opacity values operate on semantic opacity, not on the alpha\n // half of the nonlinear wide-kernel encoding.\n rgba.a = decodeSemanticOpacity(\n clamp(rgba.a, 0.0, 1.0),\n shapeAmount\n );\n semanticOpacityDecoded = true;\n }\n vec4 target = rgba;\n switch (blendMode) {\n case 0u:\n target = rgba * (vec4(1.0) + sdfRgba - sdfRgbaMask);\n break;\n case 1u:\n target = rgba * (vec4(1.0) - sdfRgbaMask) + sdfRgba;\n break;\n case 2u:\n target = rgba + sdfRgba;\n break;\n }\n rgba = mix(rgba, target, amount);\n }\n return semanticOpacityDecoded;\n}\n\nvoid produceSplat(int index) {\n ivec3 coord = splatTexCoord(index);\n uvec4 sourceSplat = texelFetch(sourceSplats, coord, 0);\n vec2 alphaShapeAmount = decodeSplatAlphaShapeAmount(sourceSplat);\n vec3 center = decodeSplatCenter(sourceSplat);\n vec3 lnScales;\n vec4 quaternion;\n vec4 rgba;\n decodeSplatAttributesLnScale(\n texelFetch(sourceSplats2, coord, 0),\n alphaShapeAmount.x,\n lnScales,\n quaternion,\n rgba\n );\n if (all(equal(lnScales, vec3(-INFINITY)))) return;\n float shapeAmount = alphaShapeAmount.y;\n\n // Match PlayCanvas' work-buffer transform. Centers retain the complete\n // affine transform, while Gaussian shape is approximated by composing the\n // model rotation and its positive per-axis scale with each splat.\n center = objectBasis * center;\n if (numSh > 0) {\n vec3 worldViewDirection = center + objectOffset;\n vec4 inverseObjectQuaternion = vec4(-objectQuaternion.xyz, objectQuaternion.w);\n vec3 sourceViewDirection = normalize(quatVec(inverseObjectQuaternion, worldViewDirection));\n rgba.rgb += evaluateSH(coord, sourceViewDirection);\n }\n lnScales += objectLnScale;\n quaternion = quatQuat(objectQuaternion, quaternion);\n\n vec3 editPosition = center;\n center += objectOffset;\n// The center is camera-relative while editPosition is mesh-origin-relative,\n// matching the rebased SDF transforms without reconstructing world position.\n // Opacity is clamped once on the CPU when preparing this mesh.\n float opacityScale = recolor.a;\n bool semanticOpacityDecoded = applySdfEdits(\n editPosition,\n rgba,\n shapeAmount\n );\n rgba.rgb *= recolor.rgb;\n if (!semanticOpacityDecoded && opacityScale >= 1.0) {\n // Neither SDFs nor the mesh opacity changed opacity, so preserve the\n // source alpha/shape encoding without any transcendental operations.\n rgba.a = clamp(rgba.a, 0.0, 1.0);\n } else {\n if (!semanticOpacityDecoded) {\n rgba.a = decodeSemanticOpacity(\n clamp(rgba.a, 0.0, 1.0),\n shapeAmount\n );\n }\n float semanticOpacity = rgba.a * opacityScale;\n if (semanticOpacity <= 1.0) {\n rgba.a = clamp(semanticOpacity, 0.0, 1.0);\n shapeAmount = 0.0;\n } else {\n rgba.a = 1.0;\n shapeAmount = encodeWideSemanticOpacity(semanticOpacity);\n }\n }\n\n encodeSplatLnScale(\n target,\n target2,\n center,\n lnScales,\n quaternion,\n rgba,\n shapeAmount\n );\n}\n\nvoid main() {\n int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS)\n + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS)\n + int(gl_FragCoord.x);\n int index = targetIndex - targetBase;\n\n target = uvec4(0u);\n target2 = uvec4(0u);\n if (index >= 0 && index < targetCount) {\n produceSplat(index);\n }\n}\n","import * as THREE from \"three\";\n\nconst rotationMatrix = new THREE.Matrix4();\nconst axisX = new THREE.Vector3();\nconst axisY = new THREE.Vector3();\nconst axisZ = new THREE.Vector3();\nconst sourceAxis = new THREE.Vector3();\n\n/**\n * Extracts the positive per-axis scale and approximate rotation used by the\n * PlayCanvas-style splat work-buffer transform.\n *\n * Unlike Matrix4.decompose(), this remains finite when a model scale axis is\n * zero. When possible, the missing basis axis is reconstructed from the other\n * two so a model-level collapse can still produce a correctly oriented 2DGS.\n */\nexport function decomposeSplatTransform(\n matrix: THREE.Matrix4,\n scale: THREE.Vector3,\n rotation: THREE.Quaternion,\n) {\n const source = matrix.elements;\n const sx = Math.hypot(source[0], source[1], source[2]);\n const sy = Math.hypot(source[4], source[5], source[6]);\n const sz = Math.hypot(source[8], source[9], source[10]);\n scale.set(sx, sy, sz);\n\n axisX.set(source[0], source[1], source[2]);\n axisY.set(source[4], source[5], source[6]);\n axisZ.set(source[8], source[9], source[10]);\n if (sx > 0) axisX.multiplyScalar(1 / sx);\n if (sy > 0) axisY.multiplyScalar(1 / sy);\n if (sz > 0) axisZ.multiplyScalar(1 / sz);\n\n const nonZeroAxes = Number(sx > 0) + Number(sy > 0) + Number(sz > 0);\n if (nonZeroAxes === 0) {\n rotation.identity();\n return;\n }\n\n if (nonZeroAxes === 1) {\n const localAxis = sx > 0 ? 0 : sy > 0 ? 1 : 2;\n sourceAxis.set(\n localAxis === 0 ? 1 : 0,\n localAxis === 1 ? 1 : 0,\n localAxis === 2 ? 1 : 0,\n );\n rotation\n .setFromUnitVectors(\n sourceAxis,\n localAxis === 0 ? axisX : localAxis === 1 ? axisY : axisZ,\n )\n .normalize();\n return;\n }\n\n if (sx === 0) axisX.copy(axisY).cross(axisZ).normalize();\n if (sy === 0) axisY.copy(axisZ).cross(axisX).normalize();\n if (sz === 0) axisZ.copy(axisX).cross(axisY).normalize();\n if (matrix.determinant() < 0) axisX.negate();\n\n rotationMatrix.makeBasis(axisX, axisY, axisZ);\n rotation.setFromRotationMatrix(rotationMatrix).normalize();\n}\n","import * as THREE from \"three\";\nimport { FullScreenQuad } from \"three/addons/postprocessing/Pass.js\";\n\nimport { SplatEdit, SplatEdits } from \"./SplatEdit\";\nimport { SplatMesh } from \"./SplatMesh\";\nimport { SPLAT_TEX_HEIGHT, SPLAT_TEX_WIDTH } from \"./defines\";\nimport { getShaders } from \"./shaders\";\nimport splatGenerate from \"./shaders/splatGenerate.glsl\";\nimport { decomposeSplatTransform } from \"./splatTransform\";\nimport { IDENT_VERTEX_SHADER, getTextureSize, threeMrtArray } from \"./utils\";\n\nexport type SplatMapping = {\n node: SplatMesh;\n version: number;\n sortVersion: number;\n centerVersion: number;\n mappingVersion: number;\n base: number;\n count: number;\n};\n\ntype GenerateUniforms = Record<string, THREE.IUniform>;\ntype SplatDataTextures = readonly [\n THREE.DataArrayTexture,\n THREE.DataArrayTexture,\n];\n\nexport class SplatAccumulator {\n time = 0;\n deltaTime = 0;\n viewOrigin = new THREE.Vector3();\n viewDirection = new THREE.Vector3();\n maxSplats = 0;\n numSplats = 0;\n target: THREE.WebGLArrayRenderTarget | null = null;\n mapping: SplatMapping[] = [];\n version = -1;\n mappingVersion = -1;\n\n private transformScale = new THREE.Vector3();\n private transformQuaternion = new THREE.Quaternion();\n\n constructor() {\n if (!threeMrtArray) {\n throw new Error(\"Gaussian Splat Lite requires THREE.js r179 or above\");\n }\n }\n\n dispose() {\n this.disposeTarget();\n this.mapping = [];\n this.numSplats = 0;\n this.version = -1;\n this.mappingVersion = -1;\n }\n\n private disposeTarget() {\n this.target?.dispose();\n this.target = null;\n this.maxSplats = 0;\n }\n\n getTextures(): SplatDataTextures {\n // ensureGenerate() fixes every target to exactly two data attachments.\n return (this.target?.textures ??\n SplatAccumulator.emptyTextures) as SplatDataTextures;\n }\n\n generateMapping(splatCounts: number[]) {\n let maxSplats = 0;\n const mapping = splatCounts.map((count) => {\n const base = maxSplats;\n maxSplats += Math.ceil(count / SPLAT_TEX_WIDTH) * SPLAT_TEX_WIDTH;\n return { base, count };\n });\n return { maxSplats, mapping };\n }\n\n ensureGenerate({\n maxSplats,\n shrinkResources = false,\n }: {\n maxSplats: number;\n shrinkResources?: boolean;\n }) {\n const textureSize = getTextureSize(Math.max(1, maxSplats));\n if (\n this.target &&\n (shrinkResources\n ? textureSize.maxSplats === this.maxSplats\n : textureSize.maxSplats <= this.maxSplats)\n ) {\n return false;\n }\n // Keep the prepared mapping and versions while replacing only its GPU\n // storage. Full dispose() also severs references to source meshes.\n this.disposeTarget();\n\n const { width, height, depth } = textureSize;\n this.maxSplats = textureSize.maxSplats;\n this.target = new THREE.WebGLArrayRenderTarget(width, height, depth, {\n depthBuffer: false,\n stencilBuffer: false,\n generateMipmaps: false,\n magFilter: THREE.NearestFilter,\n minFilter: THREE.NearestFilter,\n format: THREE.RGBAIntegerFormat,\n type: THREE.UnsignedIntType,\n });\n this.target.scissorTest = true;\n\n const second = this.target.texture.clone();\n this.target.textures = [this.target.texture, second];\n return true;\n }\n\n private getMaterial() {\n let material = SplatAccumulator.material;\n if (!material) {\n getShaders();\n material = new THREE.RawShaderMaterial({\n glslVersion: THREE.GLSL3,\n vertexShader: IDENT_VERTEX_SHADER,\n fragmentShader: splatGenerate,\n uniforms: makeGenerateUniforms(),\n depthTest: false,\n depthWrite: false,\n });\n SplatAccumulator.material = material;\n }\n return material;\n }\n\n private prepareMaterial(mesh: SplatMesh) {\n const source = mesh.splats;\n if (!source) {\n throw new Error(\"SplatMesh has no source\");\n }\n const material = this.getMaterial();\n const uniforms = material.uniforms as GenerateUniforms;\n source.setTextureUniforms(uniforms);\n uniforms.numSh.value = Math.min(mesh.maxSh, source.getNumSh());\n\n decomposeSplatTransform(\n mesh.matrixWorld,\n this.transformScale,\n this.transformQuaternion,\n );\n uniforms.objectBasis.value.setFromMatrix4(mesh.matrixWorld);\n uniforms.objectOffset.value.setFromMatrixPosition(mesh.matrixWorld);\n // THREE.Vector3 and Matrix4 use JS numbers, so this subtraction happens\n // before the value is narrowed to a float32 WebGL uniform.\n uniforms.objectOffset.value.sub(this.viewOrigin);\n // Match PlayCanvas' work-buffer transform: centers use the complete affine\n // basis, while splat shape uses the decomposed rotation and positive\n // per-axis scale. This is intentionally an approximation for non-uniform\n // transforms, but preserves ordinary scale/quaternion storage and 2DGS\n // zero axes.\n uniforms.objectLnScale.value.set(\n Math.log(this.transformScale.x),\n Math.log(this.transformScale.y),\n Math.log(this.transformScale.z),\n );\n uniforms.objectQuaternion.value.copy(this.transformQuaternion);\n uniforms.recolor.value.set(\n mesh.recolor.r,\n mesh.recolor.g,\n mesh.recolor.b,\n THREE.MathUtils.clamp(mesh.opacity, 0, 1),\n );\n\n const edits = mesh.sdfEdits;\n uniforms.numSdfs.value = edits?.numSdfs ?? 0;\n uniforms.numEdits.value = edits?.numEdits ?? 0;\n uniforms.sdfTexture.value = edits?.sdfTexture ?? SplatEdits.emptyTexture;\n uniforms.editTexture.value = edits?.editTexture ?? SplatEdits.emptyTexture;\n\n SplatAccumulator.fullScreenQuad.material = material;\n return material;\n }\n\n generate({\n mesh,\n base,\n count,\n renderer,\n }: {\n mesh: SplatMesh;\n base: number;\n count: number;\n renderer: THREE.WebGLRenderer;\n }) {\n if (!this.target) throw new Error(\"Accumulator target is not initialized\");\n if (base + count > this.maxSplats) {\n throw new Error(\"Splat generation range exceeds accumulator capacity\");\n }\n\n const material = this.prepareMaterial(mesh);\n const uniforms = material.uniforms as GenerateUniforms;\n const renderState = this.saveRenderState(renderer);\n const nextBase =\n Math.ceil((base + count) / SPLAT_TEX_WIDTH) * SPLAT_TEX_WIDTH;\n const layerSize = SPLAT_TEX_WIDTH * SPLAT_TEX_HEIGHT;\n uniforms.targetBase.value = base;\n uniforms.targetCount.value = count;\n\n while (base < nextBase) {\n const layer = Math.floor(base / layerSize);\n uniforms.targetLayer.value = layer;\n const layerBase = layer * layerSize;\n const yStart = Math.floor((base - layerBase) / SPLAT_TEX_WIDTH);\n const yEnd = Math.min(\n SPLAT_TEX_HEIGHT,\n Math.ceil((nextBase - layerBase) / SPLAT_TEX_WIDTH),\n );\n this.target.scissor.set(0, yStart, SPLAT_TEX_WIDTH, yEnd - yStart);\n renderer.setRenderTarget(this.target, layer);\n renderer.xr.enabled = false;\n renderer.autoClear = false;\n SplatAccumulator.fullScreenQuad.render(renderer);\n base += SPLAT_TEX_WIDTH * (yEnd - yStart);\n }\n this.resetRenderState(renderer, renderState);\n }\n\n prepareGenerate({\n renderer,\n scene,\n timer,\n camera,\n previous,\n }: {\n renderer: THREE.WebGLRenderer;\n scene: THREE.Scene;\n timer: THREE.Timer;\n camera: THREE.Camera;\n previous: SplatAccumulator;\n }) {\n camera.getWorldPosition(this.viewOrigin);\n camera.getWorldDirection(this.viewDirection);\n this.time = timer.getElapsed();\n this.deltaTime = timer.getDelta();\n\n const allMeshes: SplatMesh[] = [];\n scene.traverse((node) => {\n if (node instanceof SplatMesh && camera.layers.test(node.layers)) {\n allMeshes.push(node);\n }\n });\n\n const globalEdits = new Set<SplatEdit>();\n scene.traverseVisible((node) => {\n if (!(node instanceof SplatEdit)) return;\n let ancestor = node.parent;\n while (ancestor && !(ancestor instanceof SplatMesh)) {\n ancestor = ancestor.parent;\n }\n if (!ancestor) globalEdits.add(node);\n });\n\n for (const mesh of allMeshes) {\n try {\n mesh.frameUpdate({\n time: this.time,\n deltaTime: this.deltaTime,\n camera,\n globalEdits: Array.from(globalEdits),\n });\n } catch (error) {\n console.error(\"SplatMesh frame update failed\", error);\n }\n }\n\n const visibleMeshes: SplatMesh[] = [];\n scene.traverseVisible((node) => {\n // Mesh opacity is the final multiplier after SDF opacity edits, so zero\n // remains fully transparent even when an SDF sets or adds opacity.\n if (\n node instanceof SplatMesh &&\n camera.layers.test(node.layers) &&\n node.opacity > 0\n ) {\n visibleMeshes.push(node);\n }\n });\n const { maxSplats, mapping: ranges } = this.generateMapping(\n visibleMeshes.map((mesh) => mesh.numSplats),\n );\n\n this.mapping = [];\n this.numSplats = 0;\n ranges.forEach(({ base, count }, index) => {\n const node = visibleMeshes[index];\n if (!node.splats || count <= 0) return;\n this.mapping.push({\n node,\n version: node.version,\n sortVersion: node.sortVersion,\n centerVersion: node.centerVersion,\n mappingVersion: node.mappingVersion,\n base,\n count,\n });\n this.numSplats = Math.max(this.numSplats, base + count);\n });\n\n const { splatsUpdated, mappingUpdated, sortUpdated } =\n previous.checkVersions(this.mapping);\n this.version = previous.version + (splatsUpdated ? 1 : 0);\n this.mappingVersion = previous.mappingVersion + (mappingUpdated ? 1 : 0);\n\n return {\n version: this.version,\n sortUpdated,\n requiredMaxSplats: getTextureSize(Math.max(1, maxSplats)).maxSplats,\n generate: (shrinkResources = false) => {\n this.ensureGenerate({ maxSplats, shrinkResources });\n for (const { node, base, count } of this.mapping) {\n this.generate({ mesh: node, base, count, renderer });\n }\n },\n };\n }\n\n checkVersions(other: SplatMapping[]) {\n if (this.mapping.length !== other.length) {\n return { splatsUpdated: true, mappingUpdated: true, sortUpdated: true };\n }\n const mappingUpdated = this.mapping.some((item, index) => {\n const previous = other[index];\n return (\n item.node !== previous.node ||\n item.base !== previous.base ||\n item.count !== previous.count ||\n item.mappingVersion !== previous.mappingVersion\n );\n });\n if (mappingUpdated) {\n return { splatsUpdated: true, mappingUpdated: true, sortUpdated: true };\n }\n return {\n splatsUpdated: this.mapping.some(\n (item, index) => item.version !== other[index].version,\n ),\n mappingUpdated: false,\n sortUpdated: this.mapping.some(\n (item, index) => item.sortVersion !== other[index].sortVersion,\n ),\n };\n }\n\n private saveRenderState(renderer: THREE.WebGLRenderer) {\n return {\n target: renderer.getRenderTarget(),\n activeCubeFace: renderer.getActiveCubeFace(),\n activeMipmapLevel: renderer.getActiveMipmapLevel(),\n xrEnabled: renderer.xr.enabled,\n autoClear: renderer.autoClear,\n };\n }\n\n private resetRenderState(\n renderer: THREE.WebGLRenderer,\n state: ReturnType<SplatAccumulator[\"saveRenderState\"]>,\n ) {\n renderer.setRenderTarget(\n state.target,\n state.activeCubeFace,\n state.activeMipmapLevel,\n );\n renderer.xr.enabled = state.xrEnabled;\n renderer.autoClear = state.autoClear;\n }\n\n static emptyTexture = (() => {\n const { width, height, depth, maxSplats } = getTextureSize(1);\n const texture = new THREE.DataArrayTexture(\n new Uint32Array(maxSplats * 4),\n width,\n height,\n depth,\n );\n texture.format = THREE.RGBAIntegerFormat;\n texture.type = THREE.UnsignedIntType;\n texture.internalFormat = \"RGBA32UI\";\n texture.needsUpdate = true;\n return texture;\n })();\n\n static emptyTextures: SplatDataTextures = [\n SplatAccumulator.emptyTexture,\n SplatAccumulator.emptyTexture,\n ];\n private static material: THREE.RawShaderMaterial | null = null;\n private static fullScreenQuad = new FullScreenQuad(\n new THREE.RawShaderMaterial({ visible: false }),\n );\n}\n\nfunction makeGenerateUniforms(): GenerateUniforms {\n return {\n targetLayer: { value: 0 },\n targetBase: { value: 0 },\n targetCount: { value: 0 },\n sourceSplats: { value: SplatAccumulator.emptyTexture },\n sourceSplats2: { value: SplatAccumulator.emptyTexture },\n numSh: { value: 0 },\n sh1Texture: { value: SplatAccumulator.emptyTexture },\n sh2Texture: { value: SplatAccumulator.emptyTexture },\n sh3TextureA: { value: SplatAccumulator.emptyTexture },\n sh3TextureB: { value: SplatAccumulator.emptyTexture },\n objectBasis: { value: new THREE.Matrix3() },\n objectOffset: { value: new THREE.Vector3() },\n objectLnScale: { value: new THREE.Vector3() },\n objectQuaternion: { value: new THREE.Quaternion() },\n recolor: { value: new THREE.Vector4(1, 1, 1, 1) },\n numSdfs: { value: 0 },\n numEdits: { value: 0 },\n sdfTexture: { value: SplatEdits.emptyTexture },\n editTexture: { value: SplatEdits.emptyTexture },\n };\n}\n","import * as THREE from \"three\";\n\n// SplatGeometry is an internal class used by GaussianSplatRenderer to render a collection\n// of Gsplats in a single draw call by extending THREE.InstancedBufferGeometry.\n// Each Gsplat is drawn as two triangles, with the order of the Gsplats determined\n// by a texture lookup via gl_InstanceID.\n\nexport class SplatGeometry extends THREE.InstancedBufferGeometry {\n constructor() {\n super();\n this.setAttribute(\"position\", new THREE.BufferAttribute(QUAD_VERTICES, 3));\n this.setIndex(new THREE.BufferAttribute(QUAD_INDICES, 1));\n }\n}\n\n// Each instance draws to triangles covering a quad over coords (-1,-1,0)..(1,1,0)\nconst QUAD_VERTICES = new Float32Array([\n -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0,\n]);\n\nconst QUAD_INDICES = new Uint16Array([0, 1, 2, 0, 2, 3]);\n","const MEBIBYTE = 1024 * 1024;\n\nconst SMALL_WORKER_MEMORY_BYTES = 64 * MEBIBYTE;\nconst LARGE_WORKER_MEMORY_BYTES = 256 * MEBIBYTE;\nconst SMALL_WORKER_IDLE_TIMEOUT_MS = 3 * 60 * 1000;\nconst LARGE_WORKER_IDLE_TIMEOUT_MS = 3 * 1000;\n\n/**\n * Keep small workers around for reuse, while releasing workers whose WASM\n * linear memory has grown large much sooner.\n */\nexport function getWorkerIdleTimeoutMs(peakWasmMemoryBytes: number): number {\n const clampedMemoryBytes = Math.min(\n LARGE_WORKER_MEMORY_BYTES,\n Math.max(SMALL_WORKER_MEMORY_BYTES, peakWasmMemoryBytes),\n );\n const memoryRatio =\n (clampedMemoryBytes - SMALL_WORKER_MEMORY_BYTES) /\n (LARGE_WORKER_MEMORY_BYTES - SMALL_WORKER_MEMORY_BYTES);\n\n return Math.round(\n SMALL_WORKER_IDLE_TIMEOUT_MS +\n memoryRatio *\n (LARGE_WORKER_IDLE_TIMEOUT_MS - SMALL_WORKER_IDLE_TIMEOUT_MS),\n );\n}\n\n/**\n * Prefer the smallest idle worker so workers with large WASM heaps can reach\n * their shorter expiry timers. Equal-sized workers retain LIFO behavior.\n */\nexport function getWorkerReuseIndex(\n workers: readonly { peakWasmMemoryBytes: number }[],\n): number {\n let selectedIndex = -1;\n let selectedMemoryBytes = Number.POSITIVE_INFINITY;\n\n for (let index = workers.length - 1; index >= 0; index -= 1) {\n const memoryBytes = workers[index].peakWasmMemoryBytes;\n if (memoryBytes < selectedMemoryBytes) {\n selectedIndex = index;\n selectedMemoryBytes = memoryBytes;\n }\n }\n\n return selectedIndex;\n}\n","import { getTransferable } from \"./transferable\";\nimport { WASM_MODULE } from \"./wasm\";\nimport type { RpcHandlers } from \"./worker\";\nimport BundledWorker from \"./worker?worker&inline\";\nimport {\n getWorkerIdleTimeoutMs,\n getWorkerReuseIndex,\n} from \"./workerIdleTimeout\";\n\ntype PromiseRecord = {\n resolve: (value: unknown) => void;\n reject: (reason?: unknown) => void;\n onStatus?: (data: unknown) => void | Promise<void>;\n statusQueue: Promise<void>;\n};\n\nexport class SplatWorker {\n worker: Worker;\n messages: Record<number, PromiseRecord> = {};\n peakWasmMemoryBytes = 0;\n static currentId = 0;\n\n constructor() {\n this.worker = new BundledWorker();\n this.worker.onmessage = (event) => this.onMessage(event);\n WASM_MODULE.then((module) => {\n this.worker.postMessage({ name: \"init-wasm\", module });\n });\n }\n\n onMessage(event: MessageEvent) {\n const { id, result, error, status, wasmMemoryBytes } = event.data;\n if (Number.isSafeInteger(wasmMemoryBytes) && wasmMemoryBytes >= 0) {\n this.peakWasmMemoryBytes = Math.max(\n this.peakWasmMemoryBytes,\n wasmMemoryBytes,\n );\n }\n const promise = this.messages[id];\n if (!promise) return;\n\n if (status !== undefined) {\n promise.statusQueue = promise.statusQueue.then(() => {\n if (this.messages[id] === promise) {\n return promise.onStatus?.(status);\n }\n });\n void promise.statusQueue.catch(() => {});\n return;\n }\n\n void promise.statusQueue\n .then(() => {\n if (error !== undefined) throw error;\n return result;\n })\n .finally(() => {\n delete this.messages[id];\n })\n .then(promise.resolve, promise.reject);\n }\n\n async call<Name extends keyof RpcHandlers>(\n name: Name,\n args: Parameters<RpcHandlers[Name]>[0],\n options: {\n onStatus?: (data: unknown) => void | Promise<void>;\n } = {},\n ): Promise<Awaited<ReturnType<RpcHandlers[Name]>>> {\n type Result = Awaited<ReturnType<RpcHandlers[Name]>>;\n const id = ++SplatWorker.currentId;\n const promise = new Promise<Result>((resolve, reject) => {\n this.messages[id] = {\n resolve: (value) => resolve(value as Result),\n reject,\n onStatus: options.onStatus,\n statusQueue: Promise.resolve(),\n };\n });\n this.worker.postMessage(\n { id, name, args },\n { transfer: getTransferable(args) },\n );\n return promise;\n }\n\n dispose() {\n this.worker.terminate();\n\n const messages = Object.values(this.messages);\n this.messages = {};\n for (const message of messages) {\n message.reject(new Error(\"Worker terminate\"));\n }\n }\n}\n\nclass SplatWorkerPool {\n maxWorkers;\n numWorkers = 0;\n freelist: SplatWorker[] = [];\n idleWorkerTimeouts = new Map<SplatWorker, ReturnType<typeof setTimeout>>();\n queue: ((worker: SplatWorker) => void)[] = [];\n\n constructor(maxWorkers = 4) {\n this.maxWorkers = maxWorkers;\n }\n\n async withWorker<T>(\n callback: (worker: SplatWorker) => Promise<T>,\n ): Promise<T> {\n const worker = await this.allocWorker();\n try {\n return await callback(worker);\n } finally {\n this.freeWorker(worker);\n }\n }\n\n async allocWorker(): Promise<SplatWorker> {\n const workerIndex = getWorkerReuseIndex(this.freelist);\n if (workerIndex !== -1) {\n const worker = this.freelist.splice(workerIndex, 1)[0];\n const timeout = this.idleWorkerTimeouts.get(worker);\n if (timeout !== undefined) {\n clearTimeout(timeout);\n this.idleWorkerTimeouts.delete(worker);\n }\n return worker;\n }\n\n if (this.numWorkers < this.maxWorkers) {\n const worker = new SplatWorker();\n this.numWorkers += 1;\n return worker;\n }\n\n return new Promise((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n freeWorker(worker: SplatWorker) {\n if (this.numWorkers > this.maxWorkers) {\n // Worker no longer needed\n worker.dispose();\n this.numWorkers -= 1;\n return;\n }\n\n const waiter = this.queue.shift();\n if (waiter) {\n waiter(worker);\n return;\n }\n\n this.freelist.push(worker);\n const timeout = setTimeout(() => {\n this.idleWorkerTimeouts.delete(worker);\n const index = this.freelist.indexOf(worker);\n if (index === -1) return;\n\n this.freelist.splice(index, 1);\n worker.dispose();\n this.numWorkers -= 1;\n }, getWorkerIdleTimeoutMs(worker.peakWasmMemoryBytes));\n this.idleWorkerTimeouts.set(worker, timeout);\n }\n}\n\nexport const workerPool = new SplatWorkerPool();\n","import * as THREE from \"three\";\nimport { SplatAccumulator } from \"./SplatAccumulator\";\nimport { SplatGeometry } from \"./SplatGeometry\";\nimport { SplatWorker } from \"./SplatWorker\";\nimport { SortCenterCache } from \"./cameraRelative\";\nimport { getShaders } from \"./shaders\";\nimport { resolveTimer, uploadU32DataTextureRows } from \"./utils\";\n\nconst renderToViewScaleTmp = new THREE.Vector3();\nconst ORDERING_TEXTURE_WIDTH = 4096;\nconst SPLATS_PER_ORDERING_ROW = ORDERING_TEXTURE_WIDTH * 4;\nconst DEFAULT_MIN_ALPHA = 0.5 / 255;\n\nfunction getOrderingCapacity(maxSplats: number) {\n return (\n Math.max(1, Math.ceil(maxSplats / SPLATS_PER_ORDERING_ROW)) *\n SPLATS_PER_ORDERING_ROW\n );\n}\n\ntype UpdateRequest = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n autoUpdate: boolean;\n shrinkResources: boolean;\n};\n\n// Average (uniform) world scale of a camera.\nfunction getCameraWorldScale(camera: THREE.Camera): number {\n const scale = camera.getWorldScale(renderToViewScaleTmp);\n return (scale.x + scale.y + scale.z) / 3;\n}\n\nexport interface GaussianSplatRendererOptions {\n /**\n * Pass in your THREE.WebGLRenderer instance so Gaussian Splat Lite can perform work\n * outside the usual render loop. Should be created with antialias: false\n * (default setting) as WebGL anti-aliasing doesn't improve Gaussian Splatting\n * rendering and significantly reduces performance.\n */\n renderer: THREE.WebGLRenderer;\n /**\n * Callback function to be called when GaussianSplatRenderer needs to re-render,\n * for example when a splat sort completes.\n */\n onDirty?: () => void;\n /**\n * Whether to use premultiplied alpha when accumulating splat RGB\n * @default true\n */\n premultipliedAlpha?: boolean;\n /**\n * Pass in a THREE.Timer to synchronize time-based effects across different\n * systems. A supplied timer remains owned and updated by the caller.\n * @default new THREE.Timer()\n */\n timer?: THREE.Timer;\n /**\n * Controls whether to check and automatically update Gsplat collection\n * each frame render.\n * @default true\n */\n autoUpdate?: boolean;\n /**\n * Controls whether to update the Gsplats before or after rendering. For WebXR\n * this is set to false in order to complete rendering as soon as possible.\n * @default true (if not WebXR)\n */\n preUpdate?: boolean;\n /**\n * Maximum standard deviations from the center to render Gaussians. Values\n * Math.sqrt(4)..Math.sqrt(9) produce acceptable results and can be tweaked for\n * performance.\n * @default Math.sqrt(8)\n */\n maxStdDev?: number;\n /*\n **\n * Minimum pixel radius for splat rendering.\n * @default 0.0\n */\n minPixelRadius?: number;\n /**\n * Maximum pixel radius for splat rendering.\n * @default 512.0\n */\n maxPixelRadius?: number;\n /**\n * Minimum alpha value for splat rendering.\n * @default 0.5 / 255\n */\n minAlpha?: number;\n /**\n * Enable 2D Gaussian splatting rendering ability. When this mode is enabled,\n * any scale x/y/z component that is exactly 0 (minimum quantized value) results\n * in the other two non-0 axis being interpreted as an oriented 2D Gaussian Splat,\n * rather instead of the usual projected 3DGS Z-slice. When reading PLY files,\n * scale values less than e^-30 will be interpreted as 0.\n * @default false\n */\n enable2DGS?: boolean;\n /**\n * Scalar value to add to 2D splat covariance diagonal, effectively blurring +\n * enlarging splats. In scenes trained without the Gsplat anti-aliasing tweak\n * this value was typically 0.3, but with anti-aliasing it is 0.0\n * @default 0.0\n */\n preBlurAmount?: number;\n /**\n * Scalar value to add to 2D splat covarianve diagonal, with opacity adjustment\n * to correctly account for \"blurring\" when anti-aliasing. Typically 0.3\n * (equivalent to approx 0.5 pixel radius) in scenes trained with anti-aliasing.\n */\n blurAmount?: number;\n /**\n * X/Y clipping boundary factor for Gsplat centers against view frustum.\n * 1.0 clips any centers that are exactly out of bounds, while 1.25 clips\n * centers that are 25% beyond the bounds.\n * @default 1.25\n */\n clipXY?: number;\n /**\n * Parameter to adjust projected splat scale calculation to match other renderers,\n * similar to the same parameter in the MKellogg 3DGS renderer. Higher values will\n * tend to sharpen the splats. A value 2.0 can be used to match the behavior of\n * the PlayCanvas renderer.\n * @default 2.0\n */\n focalAdjustment?: number;\n /**\n * Whether to sort splats radially (geometric distance) from the viewpoint (true)\n * or by Z-depth (false). Most scenes are trained with the Z-depth sort metric\n * and will render more accurately at certain viewpoints. However, radial sorting\n * is more stable under viewpoint rotations.\n * @default false\n */\n sortRadial?: boolean;\n /**\n * Minimum interval between sort calls in milliseconds.\n * @default 0\n */\n minSortIntervalMs?: number;\n /**\n * Configures an offline render target for the GaussianSplatRenderer (as opposed to\n * rendering to the canvas). This is useful for rendering environment maps,\n * additional viewpoints, or video frame rendering.\n * @default undefined\n */\n target?: {\n /**\n * Width of the render target in pixels.\n */\n width: number;\n /**\n * Height of the render target in pixels.\n */\n height: number;\n /**\n * If you want to be able to render a scene that depends on this target's\n * output (for example, a recursive viewport), set this to true to enable\n * double buffering.\n * @default false\n */\n doubleBuffer?: boolean;\n /**\n * Super-sampling factor for the render target. Values 1-4 are supported.\n * Note that re-sampling back down to .width x .height is done on the CPU\n * with simple averaging only when calling readTarget().\n * @default 1\n */\n superXY?: number;\n } & THREE.RenderTargetOptions;\n /**\n * Extra uniform values to pass to the shader.\n * @default undefined = no extra uniforms\n */\n extraUniforms?: Record<string, unknown>;\n /**\n * Replace the default `splatVertex.glsl` splat shader with a custom one.\n * @default undefined = use the default `splatVertex.glsl` shader\n */\n vertexShader?: string;\n /**\n * Replace the default `splatFragment.glsl` splat shader with a custom one.\n * @default undefined = use the default `splatFragment.glsl` shader\n */\n fragmentShader?: string;\n /**\n * Set the splat shader material to be transparent which determines if the\n * splats are rendered during the first opaque THREE.js render pass or the\n * second transparent render pass.\n * @default undefined = true\n */\n transparent?: boolean;\n /**\n * Set the splat shader material to enable depth testing which determines if the\n * splats respect the Z depth buffer and blend with other opaque objects in the scene.\n * @default undefined = true\n */\n depthTest?: boolean;\n /**\n * Set the splat shader material to enable depth writing which determines if the\n * splats write to the Z depth buffer. Note that enabling this may produce\n * undesirable results because most of the Gsplat is transparent.\n * @default undefined = false\n */\n depthWrite?: boolean;\n}\n\nexport class GaussianSplatRenderer extends THREE.Mesh {\n readonly renderer: THREE.WebGLRenderer;\n readonly material: THREE.ShaderMaterial;\n readonly uniforms: ReturnType<typeof GaussianSplatRenderer.makeUniforms>;\n\n autoUpdate: boolean;\n preUpdate: boolean;\n static gaussianSplatOverride?: GaussianSplatRenderer;\n\n renderSize = new THREE.Vector2();\n maxStdDev: number;\n minPixelRadius: number;\n maxPixelRadius: number;\n minAlpha: number;\n enable2DGS: boolean;\n preBlurAmount: number;\n blurAmount: number;\n clipXY: number;\n focalAdjustment: number;\n sortRadial: boolean;\n minSortIntervalMs: number;\n\n readonly timer: THREE.Timer;\n private readonly ownsTimer: boolean;\n lastFrame = -1;\n updateTimeoutId = -1;\n onDirty?: () => void;\n dirty: boolean;\n\n private orderingTexture: THREE.DataTexture | null = null;\n private orderingBuffer: Uint32Array = new Uint32Array(0);\n maxSplats = 0;\n activeSplats = 0;\n\n display: SplatAccumulator;\n current: SplatAccumulator;\n accumulators: SplatAccumulator[] = [];\n\n sorting = false;\n sortDirty = false;\n lastSortTime = 0;\n sortWorker: SplatWorker | null = null;\n sortedCenter = new THREE.Vector3().setScalar(Number.NEGATIVE_INFINITY);\n sortedDir = new THREE.Vector3().setScalar(0);\n private sortedRadial: boolean | undefined;\n private sortCenterCache = new SortCenterCache();\n private sortStateRevision = 0;\n private uploadedSortStateRevision = -1;\n private updateRunning = false;\n private updatePromise: Promise<void> = Promise.resolve();\n private queuedUpdate: UpdateRequest | null = null;\n private disposed = false;\n\n target?: THREE.WebGLRenderTarget;\n backTarget?: THREE.WebGLRenderTarget;\n superPixels?: Uint8Array;\n targetPixels?: Uint8Array;\n superXY = 1;\n\n constructor(options: GaussianSplatRendererOptions) {\n if (!options) {\n throw new Error(\"GaussianSplatRenderer options are required\");\n }\n if (!options.renderer) {\n throw new Error(\"renderer is required in GaussianSplatRenderer options\");\n }\n\n const uniforms = GaussianSplatRenderer.makeUniforms();\n Object.assign(uniforms, options.extraUniforms ?? {});\n\n const shaders = getShaders();\n const premultipliedAlpha = options.premultipliedAlpha ?? true;\n const geometry = new SplatGeometry();\n const material = new THREE.ShaderMaterial({\n glslVersion: THREE.GLSL3,\n vertexShader: options.vertexShader ?? shaders.splatVertex,\n fragmentShader: options.fragmentShader ?? shaders.splatFragment,\n uniforms,\n premultipliedAlpha,\n transparent: options.transparent ?? true,\n depthTest: options.depthTest ?? true,\n depthWrite: options.depthWrite ?? false,\n side: THREE.DoubleSide,\n allowOverride: false,\n });\n\n super(geometry, material);\n this.material = material;\n this.uniforms = uniforms;\n // Disable frustum culling because we want to always draw them all\n // and cull Gsplats individually in the shader\n this.frustumCulled = false;\n\n // By default GaussianSplatRenderer will only render for layer 0\n // this.layers.enableAll();\n\n // gaussianSplatRendererInstance = this;\n this.renderer = options.renderer;\n this.onDirty = options.onDirty;\n this.dirty = true;\n this.autoUpdate = options.autoUpdate ?? true;\n this.preUpdate = options.preUpdate ?? true;\n\n this.maxStdDev = options.maxStdDev ?? Math.sqrt(8.0);\n this.minPixelRadius = options.minPixelRadius ?? 1.0;\n this.maxPixelRadius = options.maxPixelRadius ?? 512.0;\n this.minAlpha = options.minAlpha ?? DEFAULT_MIN_ALPHA;\n this.enable2DGS = options.enable2DGS ?? false;\n this.preBlurAmount = options.preBlurAmount ?? 0.0;\n this.blurAmount = options.blurAmount ?? 0.3;\n this.clipXY = options.clipXY ?? 1.25;\n this.focalAdjustment = options.focalAdjustment ?? 2.0;\n this.sortRadial = options.sortRadial ?? false;\n this.minSortIntervalMs = options.minSortIntervalMs ?? 0;\n\n const { timer, ownsTimer } = resolveTimer(options.timer);\n this.timer = timer;\n this.ownsTimer = ownsTimer;\n\n this.display = this.createAccumulator();\n this.current = this.display;\n this.accumulators.push(this.createAccumulator());\n\n // Check if the provoking vertex convention should be changed.\n const provokingVertexExt = this.renderer\n .getContext()\n .getExtension(\"WEBGL_provoking_vertex\");\n if (provokingVertexExt) {\n provokingVertexExt.provokingVertexWEBGL(\n provokingVertexExt.FIRST_VERTEX_CONVENTION_WEBGL,\n );\n }\n\n if (options.target) {\n const {\n width,\n height,\n doubleBuffer,\n superXY: origSuperXY,\n ...origTargetOptions\n } = options.target;\n const superXY = Math.max(1, Math.min(4, origSuperXY ?? 1));\n if (width * superXY > 8192 || height * superXY > 8192) {\n throw new Error(\"Target size too large\");\n }\n this.superXY = superXY;\n\n const superWidth = width * superXY;\n const superHeight = height * superXY;\n const targetOptions: THREE.RenderTargetOptions = {\n format: THREE.RGBAFormat,\n type: THREE.UnsignedByteType,\n colorSpace: THREE.SRGBColorSpace,\n ...origTargetOptions,\n };\n\n this.target = new THREE.WebGLRenderTarget(\n superWidth,\n superHeight,\n targetOptions,\n );\n if (doubleBuffer) {\n this.backTarget = new THREE.WebGLRenderTarget(\n superWidth,\n superHeight,\n targetOptions,\n );\n }\n }\n }\n\n raycast(_raycaster: THREE.Raycaster, _intersects: THREE.Intersection[]) {}\n\n static makeUniforms() {\n const uniforms = {\n // // number of active splats to render\n // numSplats: { value: 0 },\n // Size of render viewport in pixels\n renderSize: { value: new THREE.Vector2() },\n // Near and far plane distances\n near: { value: 0.1 },\n far: { value: 1000.0 },\n // SplatAccumulator to view transformation quaternion\n renderToViewQuat: { value: new THREE.Quaternion() },\n // SplatAccumulator to view transformation translation\n renderToViewPos: { value: new THREE.Vector3() },\n // SplatAccumulator to view transformation uniform scale\n renderToViewScale: { value: 1 },\n // Maximum distance (in stddevs) from Gsplat center to render\n maxStdDev: { value: 1.0 },\n // Minimum pixel radius for splat rendering\n minPixelRadius: { value: 1.0 },\n // Maximum pixel radius for splat rendering\n maxPixelRadius: { value: 512.0 },\n // Minimum alpha value for splat rendering\n minAlpha: { value: DEFAULT_MIN_ALPHA },\n // Enable interpreting 0-thickness Gsplats as 2DGS\n enable2DGS: { value: false },\n // Add to projected 2D splat covariance diagonal (thickens and brightens)\n preBlurAmount: { value: 0.0 },\n // Add to 2D splat covariance diagonal and adjust opacity (anti-aliasing)\n blurAmount: { value: 0.3 },\n // Clip Gsplats that are clipXY times beyond the +-1 frustum bounds\n clipXY: { value: 1.25 },\n // Debug renderSize scale factor\n focalAdjustment: { value: 2.0 },\n // Whether to encode Gsplat with linear RGB (for environment mapping)\n encodeLinear: { value: false },\n // Back-to-front sort ordering of splat indices\n ordering: { type: \"t\", value: GaussianSplatRenderer.emptyOrdering },\n // Gsplat collection to render\n splats: { type: \"t\", value: SplatAccumulator.emptyTexture },\n splats2: { type: \"t\", value: SplatAccumulator.emptyTexture },\n // Time in seconds for time-based effects\n time: { value: 0 },\n // Delta time in seconds since last frame\n deltaTime: { value: 0 },\n // Debug flag that alternates each frame\n debugFlag: { value: false },\n };\n return uniforms;\n }\n\n dispose() {\n if (this.disposed) return;\n this.disposed = true;\n this.queuedUpdate = null;\n\n // @ts-ignore Object base class has a dispose method in Three.js >= r186\n super.dispose?.();\n\n if (this.target) {\n this.target.dispose();\n this.target = undefined;\n }\n if (this.backTarget) {\n this.backTarget.dispose();\n this.backTarget = undefined;\n }\n if (this.orderingTexture) {\n this.orderingTexture.dispose();\n this.orderingTexture = null;\n }\n\n const accumulators = new Set<SplatAccumulator>();\n accumulators.add(this.display);\n accumulators.add(this.current);\n for (const accumulator of this.accumulators) {\n accumulators.add(accumulator);\n }\n for (const accumulator of accumulators) {\n accumulator.dispose();\n }\n this.accumulators.length = 0;\n\n this.resetSortWorker();\n this.releaseReadbackBuffers();\n this.orderingBuffer = new Uint32Array(0);\n this.maxSplats = 0;\n this.activeSplats = 0;\n\n this.geometry.dispose();\n this.material.dispose();\n }\n\n setDirty() {\n if (!this.dirty) {\n this.dirty = true;\n this.onDirty?.();\n }\n }\n\n private resetSortWorker() {\n this.sortWorker?.dispose();\n this.sortWorker = null;\n this.sortCenterCache.dispose();\n this.uploadedSortStateRevision = -1;\n }\n\n private releaseReadbackBuffers() {\n this.superPixels = undefined;\n this.targetPixels = undefined;\n }\n\n private createAccumulator() {\n return new SplatAccumulator();\n }\n\n private takeAccumulator() {\n return this.accumulators.pop() ?? this.createAccumulator();\n }\n\n private releaseAccumulator(accumulator: SplatAccumulator) {\n this.accumulators.push(accumulator);\n }\n\n private disposeOversizedAccumulators(maxSplats: number) {\n for (const accumulator of this.accumulators) {\n if (accumulator.maxSplats > maxSplats) accumulator.dispose();\n }\n }\n\n onBeforeRender(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.Camera,\n ) {\n const gaussianSplatRenderer =\n GaussianSplatRenderer.gaussianSplatOverride ?? this;\n\n const frame = renderer.info.render.frame;\n const isNewFrame = frame !== gaussianSplatRenderer.lastFrame;\n gaussianSplatRenderer.lastFrame = frame;\n\n const currentRenderTarget = renderer.getRenderTarget();\n const isXRRenderTarget = checkIsXRRenderTarget(currentRenderTarget);\n if (currentRenderTarget) {\n gaussianSplatRenderer.renderSize.set(\n currentRenderTarget.width,\n currentRenderTarget.height,\n );\n\n // WebXR mode on Apple Vision Pro returns 1x1 when presenting.\n // Use a different means to figure out the render size.\n if (\n isXRRenderTarget &&\n gaussianSplatRenderer.renderSize.x === 1 &&\n gaussianSplatRenderer.renderSize.y === 1\n ) {\n const baseLayer = renderer.xr.getSession()?.renderState.baseLayer;\n if (baseLayer) {\n gaussianSplatRenderer.renderSize.x = baseLayer.framebufferWidth;\n gaussianSplatRenderer.renderSize.y = baseLayer.framebufferHeight;\n }\n }\n } else {\n renderer.getDrawingBufferSize(gaussianSplatRenderer.renderSize);\n }\n this.uniforms.renderSize.value.copy(gaussianSplatRenderer.renderSize);\n\n // Trigger update after refreshing renderSize but before any uniforms that\n // depend on the active accumulator, avoiding both size and display latency.\n if (gaussianSplatRenderer.autoUpdate && isNewFrame) {\n const preUpdate =\n gaussianSplatRenderer.preUpdate && !renderer.xr.isPresenting;\n let useCamera = camera;\n if (renderer.xr.isPresenting) {\n const xrCamera = renderer.xr.getCamera();\n // Keep the per-eye camera parented to the XR rig so its world transform\n // includes any scale applied to that rig.\n useCamera = xrCamera.cameras[0] ?? xrCamera;\n }\n if (preUpdate) {\n gaussianSplatRenderer.updateInternal({\n scene,\n camera: useCamera,\n autoUpdate: true,\n shrinkResources: false,\n });\n } else if (gaussianSplatRenderer.updateTimeoutId === -1) {\n gaussianSplatRenderer.updateTimeoutId = setTimeout(() => {\n gaussianSplatRenderer.updateTimeoutId = -1;\n gaussianSplatRenderer.updateInternal({\n scene,\n camera: useCamera,\n autoUpdate: true,\n shrinkResources: false,\n });\n }, 1);\n }\n }\n\n const typedCamera = camera as\n | THREE.PerspectiveCamera\n | THREE.OrthographicCamera;\n\n this.uniforms.near.value = typedCamera.near;\n this.uniforms.far.value = typedCamera.far;\n\n const geometry = this.geometry as SplatGeometry;\n geometry.instanceCount = gaussianSplatRenderer.activeSplats;\n\n const display = gaussianSplatRenderer.display;\n // Accumulator centers are stored camera-relative.\n const accumToWorld = new THREE.Matrix4().makeTranslation(\n display.viewOrigin,\n );\n const cameraToWorld = camera.matrixWorld.clone();\n const worldToCamera = cameraToWorld.invert();\n const accumToCamera = worldToCamera.multiply(accumToWorld);\n accumToCamera.decompose(\n this.uniforms.renderToViewPos.value,\n this.uniforms.renderToViewQuat.value,\n renderToViewScaleTmp,\n );\n this.uniforms.renderToViewScale.value =\n (renderToViewScaleTmp.x +\n renderToViewScaleTmp.y +\n renderToViewScaleTmp.z) /\n 3;\n this.uniforms.maxStdDev.value = gaussianSplatRenderer.maxStdDev;\n this.uniforms.minPixelRadius.value = gaussianSplatRenderer.minPixelRadius;\n this.uniforms.maxPixelRadius.value = gaussianSplatRenderer.maxPixelRadius;\n this.uniforms.minAlpha.value = gaussianSplatRenderer.minAlpha;\n this.uniforms.enable2DGS.value = gaussianSplatRenderer.enable2DGS;\n this.uniforms.preBlurAmount.value = gaussianSplatRenderer.preBlurAmount;\n this.uniforms.blurAmount.value = gaussianSplatRenderer.blurAmount;\n this.uniforms.clipXY.value = gaussianSplatRenderer.clipXY;\n this.uniforms.focalAdjustment.value = gaussianSplatRenderer.focalAdjustment;\n const outputColorSpace =\n currentRenderTarget === null\n ? renderer.outputColorSpace\n : isXRRenderTarget\n ? currentRenderTarget.texture.colorSpace\n : THREE.ColorManagement.workingColorSpace;\n this.uniforms.encodeLinear.value =\n outputColorSpace !== THREE.SRGBColorSpace;\n\n this.uniforms.ordering.value =\n gaussianSplatRenderer.orderingTexture ??\n GaussianSplatRenderer.emptyOrdering;\n const splatTextures = display.getTextures();\n this.uniforms.splats.value = splatTextures[0];\n this.uniforms.splats2.value = splatTextures[1];\n\n this.uniforms.time.value = display.time;\n this.uniforms.deltaTime.value = display.deltaTime;\n // Alternating debug flag that can aid in visual debugging\n this.uniforms.debugFlag.value = (performance.now() / 1000.0) % 2.0 < 1.0;\n\n gaussianSplatRenderer.dirty = false;\n }\n\n clearSplats() {\n this.activeSplats = 0;\n this.display.numSplats = 0;\n this.setDirty();\n }\n\n async update({\n scene,\n camera,\n }: {\n scene: THREE.Scene;\n camera: THREE.Camera;\n }) {\n await this.updateInternal({\n scene,\n camera,\n autoUpdate: false,\n shrinkResources: false,\n });\n }\n\n /** Updates the current scene and shrinks renderer work resources to their current allocation tiers. */\n async shrinkResources({\n scene,\n camera,\n }: {\n scene: THREE.Scene;\n camera: THREE.Camera;\n }) {\n await this.updateInternal({\n scene,\n camera,\n autoUpdate: false,\n shrinkResources: true,\n });\n }\n\n private updateInternal(request: UpdateRequest): Promise<void> {\n if (this.disposed) return Promise.resolve();\n\n const pending = this.queuedUpdate;\n this.queuedUpdate = {\n scene: request.scene,\n camera: request.camera,\n // A queued explicit update must not be weakened by a later automatic one.\n autoUpdate: request.autoUpdate && (pending?.autoUpdate ?? true),\n shrinkResources:\n request.shrinkResources || (pending?.shrinkResources ?? false),\n };\n\n if (!this.updateRunning) {\n this.updateRunning = true;\n this.updatePromise = this.drainUpdates();\n }\n return this.updatePromise;\n }\n\n private async drainUpdates() {\n try {\n while (this.queuedUpdate) {\n const request = this.queuedUpdate;\n this.queuedUpdate = null;\n await this.performUpdate(request);\n }\n } catch (error) {\n this.queuedUpdate = null;\n throw error;\n } finally {\n this.updateRunning = false;\n }\n }\n\n private async performUpdate({\n scene,\n camera,\n autoUpdate,\n shrinkResources,\n }: UpdateRequest) {\n const renderer = this.renderer;\n if (shrinkResources) {\n this.releaseReadbackBuffers();\n }\n if (this.ownsTimer) {\n this.timer.update();\n }\n\n const center = camera.getWorldPosition(new THREE.Vector3());\n const dir = camera.getWorldDirection(new THREE.Vector3());\n\n const viewChanged =\n center.distanceTo(this.sortedCenter) >\n 0.001 * getCameraWorldScale(camera) ||\n dir.dot(this.sortedDir) < 0.999 ||\n this.sortRadial !== this.sortedRadial;\n\n const next = this.takeAccumulator();\n if (next === this.current) {\n // Should never happen\n throw new Error(\n \"Next accumulator is the same as the current accumulator\",\n );\n }\n let preparation: ReturnType<SplatAccumulator[\"prepareGenerate\"]>;\n try {\n preparation = next.prepareGenerate({\n renderer,\n scene,\n timer: this.timer,\n camera,\n previous: this.current,\n });\n } catch (error) {\n this.releaseAccumulator(next);\n throw error;\n }\n const { version, sortUpdated, requiredMaxSplats, generate } = preparation;\n const orderingNeedsShrink =\n shrinkResources &&\n getOrderingCapacity(requiredMaxSplats) < this.maxSplats;\n // Explicit updates, including shrinkResources(), always regenerate. Only an\n // unchanged automatic update can skip the candidate accumulator.\n const doUpdate =\n !autoUpdate || viewChanged || version !== this.current.version;\n const needsSort = orderingNeedsShrink || viewChanged || sortUpdated;\n\n if (!doUpdate) {\n // Restore unused accumulator to the free list\n this.releaseAccumulator(next);\n } else {\n try {\n generate(shrinkResources);\n } catch (error) {\n this.releaseAccumulator(next);\n throw error;\n }\n\n if (sortUpdated) {\n this.sortStateRevision += 1;\n }\n\n if (this.display.mappingVersion === next.mappingVersion && !needsSort) {\n // Appearance-only update: the mapping and existing sort order are\n // still valid, so display the new accumulator immediately.\n this.releaseAccumulator(this.display);\n this.display = next;\n } else {\n if (this.display !== this.current) {\n // The previous current is not being displayed, so replace it\n this.releaseAccumulator(this.current);\n }\n }\n\n this.current = next;\n // Appearance-only updates can reuse the current ordering. Preserve an\n // already pending sort, but do not enqueue a new one unless depth or the\n // mapping may have changed.\n this.sortDirty ||= needsSort;\n this.setDirty();\n }\n\n await this.driveSort(orderingNeedsShrink);\n if (shrinkResources) {\n this.disposeOversizedAccumulators(this.current.maxSplats);\n }\n }\n\n private async driveSort(shrinkOrdering = false) {\n if (this.disposed || this.sorting || !this.sortDirty) {\n return;\n }\n\n const now = performance.now();\n const nextSortTime = this.lastSortTime\n ? this.lastSortTime + this.minSortIntervalMs\n : now;\n if (now < nextSortTime) {\n await new Promise((resolve) => setTimeout(resolve, nextSortTime - now));\n if (this.disposed) return;\n }\n\n this.sorting = true;\n this.sortDirty = false;\n this.lastSortTime = performance.now();\n const current = this.current;\n const previousActiveSplats = this.activeSplats;\n\n try {\n if (shrinkOrdering) this.resetSortWorker();\n const sortRadial = this.sortRadial;\n if (this.sortWorker && this.sortedRadial !== sortRadial) {\n this.resetSortWorker();\n }\n this.sortWorker ??= new SplatWorker();\n const sortWorker = this.sortWorker;\n const { numSplats, maxSplats } = current;\n const orderingMaxSplats = getOrderingCapacity(maxSplats);\n const rows = orderingMaxSplats / SPLATS_PER_ORDERING_ROW;\n this.maxSplats = shrinkOrdering\n ? orderingMaxSplats\n : Math.max(this.maxSplats, orderingMaxSplats);\n if (this.orderingBuffer.length !== this.maxSplats) {\n this.orderingBuffer = new Uint32Array(this.maxSplats);\n }\n\n const stateRevision = this.sortStateRevision;\n if (this.uploadedSortStateRevision !== stateRevision) {\n const { payload, commit } = this.sortCenterCache.prepare(current);\n await sortWorker.call(\"setSortCenterState\", payload);\n commit();\n this.uploadedSortStateRevision = stateRevision;\n }\n\n const result = await sortWorker.call(\"sortCenters32\", {\n numSplats,\n cameraPosition: [\n current.viewOrigin.x,\n current.viewOrigin.y,\n current.viewOrigin.z,\n ],\n direction: [\n current.viewDirection.x,\n current.viewDirection.y,\n current.viewDirection.z,\n ],\n radial: sortRadial,\n ordering: this.orderingBuffer,\n });\n\n this.activeSplats = result.activeSplats;\n const activeRows = Math.ceil(\n result.activeSplats / SPLATS_PER_ORDERING_ROW,\n );\n const previousOrdering = this.orderingTexture?.image.data;\n\n if (\n this.orderingTexture &&\n (rows > this.orderingTexture.image.height ||\n (shrinkOrdering && rows !== this.orderingTexture.image.height))\n ) {\n this.orderingTexture.dispose();\n this.orderingTexture = null;\n }\n\n if (!this.orderingTexture) {\n // console.log(`Allocating orderingTexture: ${ORDERING_TEXTURE_WIDTH}x${rows}`);\n const orderingTexture = new THREE.DataTexture(\n result.ordering,\n ORDERING_TEXTURE_WIDTH,\n rows,\n THREE.RGBAIntegerFormat,\n THREE.UnsignedIntType,\n );\n orderingTexture.internalFormat = \"RGBA32UI\";\n orderingTexture.needsUpdate = true;\n this.orderingTexture = orderingTexture;\n } else {\n this.orderingTexture.image.data = result.ordering;\n const renderer = this.renderer;\n if (!renderer.properties.has(this.orderingTexture)) {\n this.orderingTexture.needsUpdate = true;\n } else if (activeRows > 0) {\n uploadU32DataTextureRows(\n renderer,\n this.orderingTexture,\n ORDERING_TEXTURE_WIDTH,\n activeRows,\n result.ordering,\n );\n }\n }\n\n // Alternate two buffers so the texture's CPU-side source stays attached\n // while the other buffer is transferred to the worker for the next sort.\n this.orderingBuffer =\n previousOrdering instanceof Uint32Array &&\n previousOrdering.length === this.maxSplats\n ? previousOrdering\n : new Uint32Array(this.maxSplats);\n\n // console.log(`Sorted (${this.minSortIntervalMs}) ${numSplats} splats in ${(performance.now() - now).toFixed(0)} ms`);\n\n this.sortedCenter.copy(current.viewOrigin);\n this.sortedDir.copy(current.viewDirection);\n this.sortedRadial = sortRadial;\n if (this.current === current && this.display !== current) {\n this.releaseAccumulator(this.display);\n this.display = current;\n }\n this.setDirty();\n } catch (error) {\n if (this.disposed) return;\n\n this.sortDirty = true;\n if (\n this.current === current &&\n current !== this.display &&\n this.accumulators.length === 0\n ) {\n // A candidate waiting on a new ordering cannot be displayed. Roll back\n // to the still-valid display accumulator and free the failed one.\n this.current = this.display;\n this.releaseAccumulator(current);\n this.activeSplats = previousActiveSplats;\n this.sortDirty = false;\n this.uploadedSortStateRevision = -1;\n }\n throw error;\n } finally {\n this.sorting = false;\n }\n }\n\n private static emptyOrdering = (() => {\n const numIndices = 4 * ORDERING_TEXTURE_WIDTH;\n const emptyArray = new Uint32Array(numIndices);\n const texture = new THREE.DataTexture(\n emptyArray,\n ORDERING_TEXTURE_WIDTH,\n 1,\n );\n texture.format = THREE.RGBAIntegerFormat;\n texture.type = THREE.UnsignedIntType;\n texture.internalFormat = \"RGBA32UI\";\n texture.needsUpdate = true;\n return texture;\n })();\n\n render(scene: THREE.Scene, camera: THREE.Camera) {\n const previousOverride = GaussianSplatRenderer.gaussianSplatOverride;\n try {\n GaussianSplatRenderer.gaussianSplatOverride = this;\n this.renderer.render(scene, camera);\n } finally {\n GaussianSplatRenderer.gaussianSplatOverride = previousOverride;\n }\n }\n\n renderTarget({\n scene,\n camera,\n }: { scene: THREE.Scene; camera: THREE.Camera }): THREE.WebGLRenderTarget {\n const target = this.backTarget ?? this.target;\n if (!target) {\n throw new Error(\"No target\");\n }\n\n const previousTarget = this.renderer.getRenderTarget();\n const previousOverride = GaussianSplatRenderer.gaussianSplatOverride;\n try {\n this.renderer.setRenderTarget(target);\n GaussianSplatRenderer.gaussianSplatOverride = this;\n this.renderer.render(scene, camera);\n } finally {\n GaussianSplatRenderer.gaussianSplatOverride = previousOverride;\n this.renderer.setRenderTarget(previousTarget);\n }\n\n if (target !== this.target) {\n // Swap back buffer and target\n [this.target, this.backTarget] = [this.backTarget, this.target];\n }\n return target;\n }\n\n // Read back the previously rendered target image as a Uint8Array of packed\n // RGBA values (in that order). Subsequent calls to this.readTarget()\n // will reuse the same buffers to minimize memory allocations.\n async readTarget(): Promise<Uint8Array> {\n if (!this.target) {\n throw new Error(\"Must initialize with target\");\n }\n const { width, height } = this.target;\n const byteSize = width * height * 4;\n if (!this.superPixels || this.superPixels.length < byteSize) {\n this.superPixels = new Uint8Array(byteSize);\n // console.log(`Allocated superPixels: ${width}x${height} = ${pixelCount} bytes`);\n }\n const superPixels = this.superPixels;\n\n await this.renderer.readRenderTargetPixelsAsync(\n this.target,\n 0,\n 0,\n width,\n height,\n superPixels,\n );\n\n const { superXY } = this;\n if (superXY === 1) {\n return superPixels;\n }\n\n const subWidth = width / superXY;\n const subHeight = height / superXY;\n const subSize = subWidth * subHeight * 4;\n if (!this.targetPixels || this.targetPixels.length < subSize) {\n this.targetPixels = new Uint8Array(subSize);\n // console.log(`Allocated targetPixels: ${subWidth}x${subHeight} = ${subSize} bytes`);\n }\n const targetPixels = this.targetPixels;\n\n const super2 = superXY * superXY;\n for (let y = 0; y < subHeight; y++) {\n const row = y * subWidth;\n for (let x = 0; x < subWidth; x++) {\n const superCol = x * superXY;\n let r = 0;\n let g = 0;\n let b = 0;\n let a = 0;\n for (let sy = 0; sy < superXY; sy++) {\n const superRow = (y * superXY + sy) * width;\n for (let sx = 0; sx < superXY; sx++) {\n const superIndex = (superRow + superCol + sx) * 4;\n r += superPixels[superIndex];\n g += superPixels[superIndex + 1];\n b += superPixels[superIndex + 2];\n a += superPixels[superIndex + 3];\n }\n }\n const pixelIndex = (row + x) * 4;\n targetPixels[pixelIndex] = r / super2;\n targetPixels[pixelIndex + 1] = g / super2;\n targetPixels[pixelIndex + 2] = b / super2;\n targetPixels[pixelIndex + 3] = a / super2;\n }\n }\n return targetPixels;\n }\n\n async renderReadTarget({\n scene,\n camera,\n }: {\n scene: THREE.Scene;\n camera: THREE.Camera;\n }): Promise<Uint8Array> {\n this.renderTarget({ scene, camera });\n return this.readTarget();\n }\n\n // Data and buffers used for environment map rendering\n private static cubeRender: {\n target: THREE.WebGLCubeRenderTarget;\n cubeCamera: THREE.CubeCamera;\n near: number;\n far: number;\n } | null = null;\n private static pmrem: THREE.PMREMGenerator | null = null;\n\n // Renders out the scene to a cube map that can be used for\n // Image-based lighting or similar applications. First optionally updates Gsplats,\n // sorts them with respect to the provided worldCenter, renders 6 cube faces.\n async renderCubeMap({\n scene,\n worldCenter,\n size = 256,\n near = 0.1,\n far = 1000,\n hideObjects = [],\n update = true,\n filter = false,\n }: {\n scene: THREE.Scene;\n worldCenter: THREE.Vector3;\n size?: number;\n near?: number;\n far?: number;\n hideObjects: THREE.Object3D[];\n update: boolean;\n filter: boolean;\n }): Promise<THREE.CubeTexture> {\n if (\n !GaussianSplatRenderer.cubeRender ||\n GaussianSplatRenderer.cubeRender.target.width !== size ||\n GaussianSplatRenderer.cubeRender.near !== near ||\n GaussianSplatRenderer.cubeRender.far !== far\n ) {\n if (GaussianSplatRenderer.cubeRender) {\n GaussianSplatRenderer.cubeRender.target.dispose();\n }\n const target = new THREE.WebGLCubeRenderTarget(size, {\n format: THREE.RGBAFormat,\n type: THREE.UnsignedByteType,\n generateMipmaps: filter,\n minFilter: filter ? THREE.LinearMipMapLinearFilter : THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n colorSpace: filter ? THREE.LinearSRGBColorSpace : THREE.SRGBColorSpace,\n });\n const cubeCamera = new THREE.CubeCamera(near, far, target);\n GaussianSplatRenderer.cubeRender = { target, cubeCamera, near, far };\n }\n\n const { target, cubeCamera } = GaussianSplatRenderer.cubeRender;\n cubeCamera.position.copy(worldCenter);\n\n // Save the visibility state of objects we want to hide before render\n const objectVisibility = new Map<THREE.Object3D, boolean>();\n for (const object of hideObjects) {\n if (!objectVisibility.has(object)) {\n objectVisibility.set(object, object.visible);\n }\n object.visible = false;\n }\n\n const previousOverride = GaussianSplatRenderer.gaussianSplatOverride;\n try {\n if (update) {\n const tempCamera = new THREE.Camera();\n tempCamera.position.copy(worldCenter);\n await this.update({ scene, camera: tempCamera });\n }\n\n GaussianSplatRenderer.gaussianSplatOverride = this;\n // Update the CubeCamera, which performs 6 cube face renders\n cubeCamera.update(this.renderer, scene);\n return target.texture;\n } finally {\n GaussianSplatRenderer.gaussianSplatOverride = previousOverride;\n for (const [object, visible] of objectVisibility.entries()) {\n object.visible = visible;\n }\n }\n }\n\n async readCubeTargets(): Promise<Uint8Array[]> {\n if (!GaussianSplatRenderer.cubeRender) {\n throw new Error(\"No cube render\");\n }\n\n const { target } = GaussianSplatRenderer.cubeRender;\n const { width, height } = target;\n const promises = [];\n const buffers = [];\n\n for (let i = 0; i < target.texture.images.length; ++i) {\n const byteSize = width * height * 4;\n const readback = new Uint8Array(byteSize);\n buffers.push(readback);\n const promise = this.renderer.readRenderTargetPixelsAsync(\n target,\n 0,\n 0,\n width,\n height,\n readback,\n i,\n );\n promises.push(promise);\n }\n\n await Promise.all(promises);\n return buffers;\n }\n\n // Renders out the scene to an environment map that can be used for\n // Image-based lighting or similar applications. First optionally updates Gsplats,\n // sorts them with respect to the provided worldCenter, renders 6 cube faces,\n // then pre-filters them using THREE.PMREMGenerator and returns a THREE.Texture\n // that can assigned directly to a THREE.MeshStandardMaterial.envMap property.\n async renderEnvMap({\n scene,\n worldCenter,\n size = 256,\n near = 0.1,\n far = 1000,\n hideObjects = [],\n update = true,\n }: {\n scene: THREE.Scene;\n worldCenter: THREE.Vector3;\n size?: number;\n near?: number;\n far?: number;\n hideObjects: THREE.Object3D[];\n update: boolean;\n }): Promise<THREE.Texture> {\n const cubeTexture = await this.renderCubeMap({\n scene,\n worldCenter,\n size,\n near,\n far,\n hideObjects,\n update,\n filter: true,\n });\n // Pre-filter the cube map using THREE.PMREMGenerator if requested\n if (!GaussianSplatRenderer.pmrem) {\n GaussianSplatRenderer.pmrem = new THREE.PMREMGenerator(this.renderer);\n }\n\n return GaussianSplatRenderer.pmrem?.fromCubemap(cubeTexture).texture;\n }\n\n // Utility function to recursively set the envMap property for any\n // THREE.MeshStandardMaterial within the subtree of root.\n recurseSetEnvMap(root: THREE.Object3D, envMap: THREE.Texture) {\n root.traverse((node) => {\n if (node instanceof THREE.Mesh) {\n if (Array.isArray(node.material)) {\n for (const material of node.material) {\n if (material instanceof THREE.MeshStandardMaterial) {\n material.envMap = envMap;\n }\n }\n } else {\n if (node.material instanceof THREE.MeshStandardMaterial) {\n node.material.envMap = envMap;\n }\n }\n }\n });\n }\n\n get premultipliedAlpha(): boolean {\n return this.material.premultipliedAlpha;\n }\n\n set premultipliedAlpha(value: boolean) {\n if (this.material.premultipliedAlpha !== value) {\n this.material.premultipliedAlpha = value;\n this.material.needsUpdate = true;\n }\n }\n\n get transparent(): boolean {\n return this.material.transparent;\n }\n\n set transparent(value: boolean) {\n if (this.material.transparent !== value) {\n this.material.transparent = value;\n this.material.needsUpdate = true;\n }\n }\n\n get depthTest(): boolean {\n return this.material.depthTest;\n }\n\n set depthTest(value: boolean) {\n this.material.depthTest = value;\n }\n\n get depthWrite(): boolean {\n return this.material.depthWrite;\n }\n\n set depthWrite(value: boolean) {\n this.material.depthWrite = value;\n }\n}\n\nfunction checkIsXRRenderTarget(renderTarget: THREE.RenderTarget | null) {\n return (renderTarget as unknown as Record<string, boolean>)?.isXRRenderTarget;\n}\n","/** @internal */\nexport enum Opcode {\n Constant = 1,\n InputField = 2,\n InputAttribute = 3,\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 Tan = 26,\n Asin = 27,\n Atan = 28,\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 Atan2 = 49,\n Select = 60,\n Clamp = 61,\n Mix = 62,\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\">;\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;\ntype ValueLike<T extends SplatPostDecodeValueType> =\n | LiteralFor<T>\n | SplatPostDecodeValue<T>;\ntype AnyValueLike = ValueLike<SplatPostDecodeValueType>;\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 const SPLAT_POST_DECODE_INSTRUCTION_OPCODE = 0;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_WIDTH = 1;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_IMMEDIATE = 2;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_0 = 3;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_COUNT = 4;\n/** @internal */\nexport const SPLAT_POST_DECODE_INSTRUCTION_STRIDE = 7;\n/** @internal */\nexport const SPLAT_POST_DECODE_MISSING_ARGUMENT = 0xffff;\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;\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};\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;\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 coefficients.push(\n this.owner.coerce(\n transform(this.coefficient(index), { index, degree, order }),\n \"vec3\",\n ),\n );\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};\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 VariadicNumericOperation = <T extends NumericValueType>(\n first: ValueLike<T>,\n ...rest: BroadcastLike<T>[]\n) => SplatPostDecodeValue<T>;\ntype BinaryNumericOperation = <T extends NumericValueType>(\n left: ValueLike<T>,\n right: BroadcastLike<T>,\n) => SplatPostDecodeValue<T>;\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 tan: UnaryNumericOperation;\n asin: UnaryNumericOperation;\n atan: UnaryNumericOperation;\n atan2: BinaryNumericOperation;\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\ntype SplatPostDecodeContext = {\n splat: SplatPostDecodeInput;\n op: SplatPostDecodeOperations;\n attribute<Components extends AttributeComponents = 1>(\n options: SplatPostDecodeAttributeOptions<Components>,\n ): AttributeValue<Components>;\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 const SPLAT_POST_DECODE_FLOW_STAGE_START = 0;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_INSTRUCTION = 1;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_REGISTER = 2;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_ON_TRUE = 3;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_ON_FALSE = 4;\n/** @internal */\nexport const SPLAT_POST_DECODE_FLOW_STAGE_STRIDE = 5;\n\n/** @internal */\nexport type SerializedSplatPostDecodeCondition = {\n mode: \"flow\";\n /** Packed start/instruction/register/onTrue/onFalse Uint16 records. */\n stages: Uint16Array;\n};\n\n/** @internal */\nexport type SerializedSplatPostDecode = {\n /** Packed opcode/width/immediate/arg0/arg1/arg2/arg3 Uint16 records. */\n instructions: Uint16Array;\n constants: Float32Array;\n outputs: Omit<SplatPostDecodeOutputs, \"when\">;\n condition?: SerializedSplatPostDecodeCondition;\n attributeData: Uint8Array;\n attributes: readonly SerializedSplatPostDecodeAttribute[];\n};\n\nconst SPLAT_POST_DECODE_PROGRAM = Symbol(\"SplatPostDecodeProgram\");\nexport type SplatPostDecodeProgram = {\n readonly [SPLAT_POST_DECODE_PROGRAM]: true;\n};\n\nconst COMPONENT_TYPES = [\"float\", \"vec2\", \"vec3\", \"vec4\"] as const;\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) && value.length >= 2 && value.length <= 4) {\n return COMPONENT_TYPES[value.length - 1];\n }\n throw new Error(\"Unsupported postDecode literal\");\n}\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\nclass ProgramBuilder {\n readonly instructions: SplatPostDecodeInstruction[] = [];\n readonly constants: number[] = [];\n readonly attributes: AttributeBinding[] = [];\n readonly op: SplatPostDecodeOperations;\n readonly splat: SplatPostDecodeInput;\n\n readonly constantRegisters = new Map<\n string,\n SplatPostDecodeValue<SplatPostDecodeValueType>\n >();\n readonly inputRegisters = new Map<\n number,\n SplatPostDecodeValue<SplatPostDecodeValueType>\n >();\n\n constructor() {\n this.op = this.createOperations();\n const builder = this;\n const sh = new SplatPostDecodeShValue(this);\n this.splat = {\n get position() {\n return builder.inputField(\"vec3\", InputField.Position);\n },\n get scale() {\n return builder.inputField(\"vec3\", InputField.Scale);\n },\n get quaternion() {\n return builder.inputField(\"quaternion\", InputField.Quaternion);\n },\n get opacity() {\n return builder.inputField(\"float\", InputField.Opacity);\n },\n get alpha() {\n return builder.inputField(\"float\", InputField.Alpha);\n },\n get color() {\n return builder.inputField(\"vec3\", InputField.Color);\n },\n sh,\n };\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 inputField<T extends SplatPostDecodeValueType>(\n type: T,\n field: InputField,\n ): SplatPostDecodeValue<T> {\n const existing = this.inputRegisters.get(field);\n if (existing) return existing 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 }\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 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 COMPONENT_TYPES[components - 1],\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 vec4Quaternion =\n (expectedType === \"quaternion\" && value.type === \"vec4\") ||\n (expectedType === \"vec4\" && value.type === \"quaternion\");\n if (!vec4Quaternion) {\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 values = numeric.map(Math.fround);\n if (!values.every(Number.isFinite)) {\n throw new Error(\"postDecode constants must be finite\");\n }\n const key = constantKey(type, values);\n const existing = this.constantRegisters.get(key);\n if (existing) return existing as SplatPostDecodeValue<T>;\n\n const immediate = this.constants.length;\n this.constants.push(...values);\n const result = this.instruction(type as T, Opcode.Constant, [], immediate);\n this.constantRegisters.set(key, result);\n return result;\n }\n\n private unary(\n opcode: Opcode,\n value: AnyValueLike,\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(\n opcode: Opcode,\n leftValue: AnyValueLike,\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(\n opcode: Opcode,\n firstValue: AnyValueLike,\n secondValue: AnyValueLike,\n thirdValue: AnyValueLike,\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 return value.type === \"float\" && TYPE_WIDTHS[targetType] > 1\n ? this.coerce(value)\n : 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 result = this.coerce(first);\n for (const right of rest) {\n result = this.binary(\n opcode,\n result,\n right,\n ) as SplatPostDecodeValue<T>;\n }\n return result;\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[]): BoolValue => {\n let result = this.coerce(first, \"bool\");\n for (const right of rest) {\n result = this.binary(opcode, result, right, \"bool\") as BoolValue;\n }\n return result;\n };\n const construct = <T extends VectorValueType | \"quaternion\">(\n opcode: Opcode,\n type: T,\n values: FloatLike[],\n ) =>\n this.instruction(\n type,\n opcode,\n values.map((value) => this.coerce(value, \"float\").register),\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: (value, min, max) =>\n this.ternary(Opcode.Clamp, value, min, max) as never,\n mix: (left, right, amount) =>\n this.ternary(Opcode.Mix, left, right, amount) as never,\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 tan: unaryNumeric(Opcode.Tan),\n asin: unaryNumeric(Opcode.Asin),\n atan: unaryNumeric(Opcode.Atan),\n atan2: binaryNumeric(Opcode.Atan2),\n normalize: (value) => this.unary(Opcode.Normalize, value) as never,\n length: (value) =>\n this.unary(Opcode.Length, value, \"float\") as FloatValue,\n isFinite: (value) =>\n this.unary(Opcode.IsFinite, value, \"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: (condition, whenTrue, whenFalse) => {\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 never;\n },\n dot: (left, right) =>\n this.binary(Opcode.Dot, left, right, \"float\") 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(Opcode.MaxComponentIndex, value, \"float\") as FloatValue,\n quatMul: (left, right) => {\n const a = this.coerce(left, \"quaternion\");\n const b = this.coerce(right, \"quaternion\");\n return this.instruction(\"quaternion\", Opcode.QuaternionMultiply, [\n a.register,\n b.register,\n ]);\n },\n rotateVector: (quaternion, vector) => {\n const q = this.coerce(quaternion, \"quaternion\");\n const v = this.coerce(vector, \"vec3\");\n return this.instruction(\"vec3\", Opcode.RotateVector, [\n q.register,\n v.register,\n ]);\n },\n };\n }\n}\n\nclass GenerationRegisterMap {\n private readonly values: Int32Array;\n private readonly generations: Uint32Array;\n private generation = 1;\n\n constructor(size: number) {\n this.values = new Int32Array(size);\n this.generations = new Uint32Array(size);\n }\n\n clear() {\n if (this.generation === 0xffff_ffff) {\n this.generations.fill(0);\n this.generation = 1;\n } else {\n this.generation += 1;\n }\n }\n\n has(source: number) {\n return this.generations[source] === this.generation;\n }\n\n get(source: number) {\n return this.has(source) ? this.values[source] : undefined;\n }\n\n set(source: number, target: number) {\n this.generations[source] = this.generation;\n this.values[source] = target;\n }\n\n delete(source: number) {\n this.generations[source] = 0;\n }\n}\n\ntype CompiledProgram = {\n instructions: SplatPostDecodeInstruction[];\n constants: number[];\n outputs: Omit<SplatPostDecodeOutputs, \"when\">;\n condition?: SerializedSplatPostDecodeCondition;\n attributes: AttributeBinding[];\n};\n\nfunction markDependencies(\n builder: ProgramBuilder,\n roots: readonly (number | undefined)[],\n marked: Uint8Array,\n) {\n const pending: number[] = [];\n for (const root of roots) {\n if (root === undefined || marked[root]) continue;\n marked[root] = 1;\n pending.push(root);\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/**\n * Serializes source instructions while remapping only live registers. A\n * generation map represents the current straight-line path. Branch merges\n * advance its generation in O(1), while unique predecessors reuse it. One\n * generation array is also shared by every dependency walk.\n */\nclass InstructionSerializer {\n readonly instructions: SplatPostDecodeInstruction[] = [];\n readonly constants: number[] = [];\n readonly attributes: AttributeBinding[] = [];\n\n private readonly constantMap = new Map<number, number>();\n private readonly attributeMap = new Map<number, number>();\n private readonly dependencyMarks: Uint32Array;\n private dependencyGeneration = 0;\n\n constructor(private readonly builder: ProgramBuilder) {\n this.dependencyMarks = new Uint32Array(builder.instructions.length);\n }\n\n appendDependencies(\n roots: readonly (number | undefined)[],\n registers: GenerationRegisterMap,\n forceRoots = false,\n ) {\n if (forceRoots) {\n for (const root of roots) {\n if (\n root !== undefined &&\n this.builder.instructions[root].opcode !== Opcode.Constant\n ) {\n registers.delete(root);\n }\n }\n }\n\n this.dependencyGeneration += 1;\n const generation = this.dependencyGeneration;\n const pending: number[] = [];\n const sourceOrder: number[] = [];\n for (const root of roots) {\n if (root !== undefined && !registers.has(root)) pending.push(root);\n }\n while (pending.length !== 0) {\n const source = pending.pop();\n if (\n source === undefined ||\n registers.has(source) ||\n this.dependencyMarks[source] === generation\n ) {\n continue;\n }\n this.dependencyMarks[source] = generation;\n sourceOrder.push(source);\n for (const argument of this.builder.instructions[source].args) {\n if (!registers.has(argument)) pending.push(argument);\n }\n }\n\n sourceOrder.sort((left, right) => left - right);\n this.append(sourceOrder, registers);\n return registers;\n }\n\n append(sourceOrder: readonly number[], registers: GenerationRegisterMap) {\n for (const sourceIndex of sourceOrder) {\n const source = this.builder.instructions[sourceIndex];\n if (source.opcode === Opcode.Constant) {\n let target = this.constantMap.get(sourceIndex);\n if (target === undefined) {\n this.reserveInstruction();\n target = this.instructions.length;\n this.constantMap.set(sourceIndex, target);\n const immediate = this.constants.length;\n this.constants.push(\n ...this.builder.constants.slice(\n source.immediate,\n source.immediate + TYPE_WIDTHS[source.type],\n ),\n );\n this.instructions.push({ ...source, immediate });\n }\n registers.set(sourceIndex, target);\n continue;\n }\n\n this.reserveInstruction();\n let immediate = source.immediate;\n if (source.opcode === Opcode.InputAttribute) {\n let target = this.attributeMap.get(immediate);\n if (target === undefined) {\n target = this.attributes.length;\n this.attributeMap.set(immediate, target);\n this.attributes.push(this.builder.attributes[immediate]);\n }\n immediate = target;\n }\n const args = source.args.map((argument) => {\n const target = registers.get(argument);\n if (target === undefined) {\n throw new Error(\"Invalid postDecode instruction dependency\");\n }\n return target;\n });\n registers.set(sourceIndex, this.instructions.length);\n this.instructions.push({ ...source, args, immediate });\n }\n }\n\n private reserveInstruction() {\n if (this.instructions.length >= 4096) {\n throw new Error(\"postDecode compiled program exceeds 4096 instructions\");\n }\n }\n}\n\nfunction emptyCompiledProgram(): CompiledProgram {\n return {\n instructions: [],\n constants: [],\n outputs: {},\n condition: undefined,\n attributes: [],\n };\n}\n\nfunction remapOutputs(\n outputs: SplatPostDecodeOutputs,\n registers: GenerationRegisterMap,\n): Omit<SplatPostDecodeOutputs, \"when\"> {\n const remap = (register: number | undefined) =>\n register === undefined ? undefined : registers.get(register);\n return {\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) => {\n const target = registers.get(register);\n if (target === undefined) {\n throw new Error(\"Invalid postDecode output dependency\");\n }\n return target;\n }),\n };\n}\n\ntype FlowNode = {\n register: number;\n onTrue: number;\n onFalse: number;\n};\n\nfunction compileConditionFlow(\n builder: ProgramBuilder,\n outputs: SplatPostDecodeOutputs,\n outputRoots: readonly (number | undefined)[],\n whenRegister: number,\n): CompiledProgram | undefined {\n const FLOW_ACCEPT = -1;\n const FLOW_REJECT = -2;\n const FLOW_DYNAMIC = 0;\n const FLOW_CONSTANT_FALSE = 1;\n const FLOW_CONSTANT_TRUE = 2;\n const constantValues = new Uint8Array(whenRegister + 1);\n for (let register = 0; register <= whenRegister; register += 1) {\n const instruction = builder.instructions[register];\n if (instruction.opcode === Opcode.Constant && instruction.type === \"bool\") {\n constantValues[register] = builder.constants[instruction.immediate]\n ? FLOW_CONSTANT_TRUE\n : FLOW_CONSTANT_FALSE;\n continue;\n }\n const left = constantValues[instruction.args[0]];\n if (instruction.opcode === Opcode.Not) {\n constantValues[register] =\n left === FLOW_CONSTANT_TRUE\n ? FLOW_CONSTANT_FALSE\n : left === FLOW_CONSTANT_FALSE\n ? FLOW_CONSTANT_TRUE\n : FLOW_DYNAMIC;\n } else if (instruction.opcode === Opcode.And) {\n const right = constantValues[instruction.args[1]];\n constantValues[register] =\n left === FLOW_CONSTANT_FALSE || right === FLOW_CONSTANT_FALSE\n ? FLOW_CONSTANT_FALSE\n : left === FLOW_CONSTANT_TRUE && right === FLOW_CONSTANT_TRUE\n ? FLOW_CONSTANT_TRUE\n : FLOW_DYNAMIC;\n } else if (instruction.opcode === Opcode.Or) {\n const right = constantValues[instruction.args[1]];\n constantValues[register] =\n left === FLOW_CONSTANT_TRUE || right === FLOW_CONSTANT_TRUE\n ? FLOW_CONSTANT_TRUE\n : left === FLOW_CONSTANT_FALSE && right === FLOW_CONSTANT_FALSE\n ? FLOW_CONSTANT_FALSE\n : FLOW_DYNAMIC;\n }\n }\n\n const reverseNodes: FlowNode[] = [];\n const FLOW_AND_LEFT = 0;\n const FLOW_OR_LEFT = 1;\n const FLOW_CONTINUATION_SIZE = 3;\n let continuations: Int32Array | undefined;\n let continuationEnd = 0;\n let register = whenRegister;\n let onTrue = FLOW_ACCEPT;\n let onFalse = FLOW_REJECT;\n let compiledTarget = FLOW_REJECT;\n while (true) {\n const constant = constantValues[register];\n if (constant !== FLOW_DYNAMIC) {\n compiledTarget = constant === FLOW_CONSTANT_TRUE ? onTrue : onFalse;\n } else {\n const instruction = builder.instructions[register];\n if (instruction.opcode === Opcode.Not) {\n register = instruction.args[0];\n const target = onTrue;\n onTrue = onFalse;\n onFalse = target;\n continue;\n }\n if (\n instruction.opcode === Opcode.And ||\n instruction.opcode === Opcode.Or\n ) {\n continuations ??= new Int32Array(\n (whenRegister + 1) * FLOW_CONTINUATION_SIZE,\n );\n if (continuationEnd === continuations.length) {\n throw new Error(\"Invalid postDecode condition depth\");\n }\n const isAnd = instruction.opcode === Opcode.And;\n continuations[continuationEnd] = isAnd ? FLOW_AND_LEFT : FLOW_OR_LEFT;\n continuations[continuationEnd + 1] = instruction.args[0];\n continuations[continuationEnd + 2] = isAnd ? onFalse : onTrue;\n continuationEnd += FLOW_CONTINUATION_SIZE;\n register = instruction.args[1];\n continue;\n }\n if (reverseNodes.length >= 4096) {\n throw new Error(\"postDecode condition exceeds 4096 flow nodes\");\n }\n compiledTarget = reverseNodes.length;\n reverseNodes.push({ register, onTrue, onFalse });\n }\n\n if (continuationEnd === 0) break;\n continuationEnd -= FLOW_CONTINUATION_SIZE;\n if (!continuations) {\n throw new Error(\"Invalid postDecode condition continuation\");\n }\n const type = continuations[continuationEnd];\n register = continuations[continuationEnd + 1];\n const target = continuations[continuationEnd + 2];\n if (type === FLOW_AND_LEFT) {\n onTrue = compiledTarget;\n onFalse = target;\n } else {\n onTrue = target;\n onFalse = compiledTarget;\n }\n }\n\n const entry = compiledTarget;\n if (entry === FLOW_REJECT) return emptyCompiledProgram();\n if (entry === FLOW_ACCEPT) {\n outputs.when = undefined;\n return undefined;\n }\n\n const stageCount = reverseNodes.length;\n if (entry !== stageCount - 1) {\n throw new Error(\"Invalid postDecode condition flow\");\n }\n\n const acceptTarget = stageCount;\n const rejectTarget = acceptTarget + 1;\n const stages = new Uint16Array(\n stageCount * SPLAT_POST_DECODE_FLOW_STAGE_STRIDE,\n );\n const predecessors = new Int32Array(stageCount).fill(-1);\n let acceptPredecessor = -1;\n const recordPredecessor = (target: number, predecessor: number) => {\n if (target === rejectTarget) return;\n if (target === acceptTarget) {\n acceptPredecessor =\n acceptPredecessor === -1\n ? predecessor\n : acceptPredecessor === predecessor\n ? predecessor\n : -2;\n return;\n }\n predecessors[target] =\n predecessors[target] === -1\n ? predecessor\n : predecessors[target] === predecessor\n ? predecessor\n : -2;\n };\n const remapTarget = (target: number) =>\n target === FLOW_ACCEPT\n ? acceptTarget\n : target === FLOW_REJECT\n ? rejectTarget\n : stageCount - 1 - target;\n\n for (let stage = 0; stage < stageCount; stage += 1) {\n const node = reverseNodes[stageCount - 1 - stage];\n const offset = stage * SPLAT_POST_DECODE_FLOW_STAGE_STRIDE;\n const onTrue = remapTarget(node.onTrue);\n const onFalse = remapTarget(node.onFalse);\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_ON_TRUE] = onTrue;\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_ON_FALSE] = onFalse;\n recordPredecessor(onTrue, stage);\n recordPredecessor(onFalse, stage);\n }\n\n const serializer = new InstructionSerializer(builder);\n const pathRegisters = new GenerationRegisterMap(builder.instructions.length);\n for (let stage = 0; stage < stageCount; stage += 1) {\n if (stage === 0 || predecessors[stage] !== stage - 1) {\n pathRegisters.clear();\n }\n const node = reverseNodes[stageCount - 1 - stage];\n const offset = stage * SPLAT_POST_DECODE_FLOW_STAGE_STRIDE;\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_START] =\n serializer.instructions.length;\n serializer.appendDependencies([node.register], pathRegisters, true);\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_INSTRUCTION] =\n serializer.instructions.length - 1;\n const predicateRegister = pathRegisters.get(node.register);\n if (predicateRegister === undefined) {\n throw new Error(\"Invalid postDecode condition register\");\n }\n stages[offset + SPLAT_POST_DECODE_FLOW_STAGE_REGISTER] = predicateRegister;\n }\n\n if (acceptPredecessor !== stageCount - 1) pathRegisters.clear();\n serializer.appendDependencies(outputRoots, pathRegisters);\n return {\n instructions: serializer.instructions,\n constants: serializer.constants,\n outputs: remapOutputs(outputs, pathRegisters),\n condition: { mode: \"flow\", stages },\n attributes: serializer.attributes,\n };\n}\n\nfunction compileProgram(\n builder: ProgramBuilder,\n sourceOutputs: SplatPostDecodeOutputs,\n): CompiledProgram {\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 emptyCompiledProgram();\n }\n outputs.when = undefined;\n }\n }\n\n const outputRoots = [\n outputs.position,\n outputs.scale,\n outputs.quaternion,\n outputs.opacity,\n outputs.alpha,\n outputs.color,\n ...(outputs.sh ?? []),\n ];\n if (outputs.when !== undefined) {\n const flow = compileConditionFlow(\n builder,\n outputs,\n outputRoots,\n outputs.when,\n );\n if (flow) return flow;\n }\n\n const live = new Uint8Array(builder.instructions.length);\n markDependencies(builder, outputRoots, live);\n const instructionOrder: number[] = [];\n for (let register = 0; register < live.length; register += 1) {\n if (live[register]) instructionOrder.push(register);\n }\n\n const serializer = new InstructionSerializer(builder);\n const registers = new GenerationRegisterMap(builder.instructions.length);\n serializer.append(instructionOrder, registers);\n return {\n instructions: serializer.instructions,\n constants: serializer.constants,\n outputs: remapOutputs(outputs, registers),\n attributes: serializer.attributes,\n };\n}\n\nfunction packInstructions(\n instructions: readonly SplatPostDecodeInstruction[],\n): Uint16Array {\n const packed = new Uint16Array(\n instructions.length * SPLAT_POST_DECODE_INSTRUCTION_STRIDE,\n );\n packed.fill(SPLAT_POST_DECODE_MISSING_ARGUMENT);\n for (let index = 0; index < instructions.length; index += 1) {\n const instruction = instructions[index];\n if (\n instruction.args.length > SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_COUNT ||\n !Number.isInteger(instruction.immediate) ||\n instruction.immediate < 0 ||\n instruction.immediate > 0xffff ||\n instruction.args.some(\n (argument) =>\n !Number.isInteger(argument) ||\n argument < 0 ||\n argument >= SPLAT_POST_DECODE_MISSING_ARGUMENT,\n )\n ) {\n throw new Error(\"postDecode instruction exceeds Uint16 bytecode limits\");\n }\n const offset = index * SPLAT_POST_DECODE_INSTRUCTION_STRIDE;\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_OPCODE] = instruction.opcode;\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_WIDTH] =\n TYPE_WIDTHS[instruction.type];\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_IMMEDIATE] =\n instruction.immediate;\n for (let argument = 0; argument < instruction.args.length; argument += 1) {\n packed[offset + SPLAT_POST_DECODE_INSTRUCTION_ARGUMENT_0 + argument] =\n instruction.args[argument];\n }\n }\n return packed;\n}\n\ntype AttributeRegion = {\n buffer: ArrayBufferLike;\n start: number;\n end: number;\n outputOffset: number;\n};\n\nfunction snapshotAttributes(bindings: readonly AttributeBinding[]) {\n const rangesByBuffer = new Map<\n ArrayBufferLike,\n { start: number; end: number }[]\n >();\n for (const binding of bindings) {\n if (binding.count === 0) continue;\n const packedBytes =\n ATTRIBUTE_FORMAT_BYTES[binding.format] * binding.components;\n const start = binding.data.byteOffset + binding.byteOffset;\n const end = start + (binding.count - 1) * binding.byteStride + packedBytes;\n const ranges = rangesByBuffer.get(binding.data.buffer) ?? [];\n ranges.push({ start, end });\n rangesByBuffer.set(binding.data.buffer, ranges);\n }\n\n const regions: AttributeRegion[] = [];\n const regionsByBuffer = new Map<ArrayBufferLike, AttributeRegion[]>();\n for (const [buffer, ranges] of rangesByBuffer) {\n ranges.sort((left, right) => left.start - right.start);\n const bufferRegions: AttributeRegion[] = [];\n for (const range of ranges) {\n const previous = bufferRegions[bufferRegions.length - 1];\n if (previous && range.start <= previous.end) {\n previous.end = Math.max(previous.end, range.end);\n } else {\n const region = { buffer, ...range, outputOffset: 0 };\n bufferRegions.push(region);\n regions.push(region);\n }\n }\n regionsByBuffer.set(buffer, bufferRegions);\n }\n\n let byteLength = 0;\n for (const region of regions) {\n region.outputOffset = byteLength;\n byteLength += region.end - region.start;\n }\n const data = new Uint8Array(byteLength);\n for (const region of regions) {\n data.set(\n new Uint8Array(region.buffer, region.start, region.end - region.start),\n region.outputOffset,\n );\n }\n\n const attributes: SerializedSplatPostDecodeAttribute[] = bindings.map(\n (binding) => {\n let byteOffset = 0;\n if (binding.count !== 0) {\n const sourceOffset = binding.data.byteOffset + binding.byteOffset;\n const region = regionsByBuffer\n .get(binding.data.buffer)\n ?.find(\n (candidate) =>\n sourceOffset >= candidate.start && 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: binding.format,\n components: binding.components,\n byteOffset,\n byteStride: binding.byteStride,\n count: binding.count,\n };\n },\n );\n return { data, attributes };\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 compiled = compileProgram(program.builder, program.outputs);\n const snapshot = snapshotAttributes(compiled.attributes);\n return {\n instructions: packInstructions(compiled.instructions),\n constants: new Float32Array(compiled.constants),\n outputs: compiled.outputs,\n condition: compiled.condition,\n attributeData: snapshot.data,\n attributes: snapshot.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 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 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 return new SplatPostDecodeProgramImpl(builder, buildOutputs(builder, patch));\n}\n\nexport const postDecode = {\n define: defineSplatPostDecode,\n};\n","import { Loader } from \"three\";\nimport { SplatMesh } from \"./SplatMesh\";\nimport { workerPool } from \"./SplatWorker\";\nimport { Splats, type SplatsOptions } from \"./Splats\";\nimport type { SplatFileType } from \"./defines\";\nimport {\n type SplatPostDecodeProgram,\n serializeSplatPostDecode,\n} from \"./postDecode\";\n\n// SplatLoader implements the THREE.Loader interface for PLY and SPZ files.\nexport class SplatLoader extends Loader {\n load(\n url: string,\n onLoad?: (decoded: Splats) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (error: unknown) => void,\n ) {\n return this.loadInternal({ url, onLoad, onProgress, onError });\n }\n\n async loadAsync(\n url: string,\n onProgress?: (event: ProgressEvent) => void,\n ): Promise<Splats> {\n return new Promise((resolve, reject) => {\n this.load(url, resolve, onProgress, reject);\n });\n }\n\n parse(splats: Splats): SplatMesh {\n return new SplatMesh({ splats });\n }\n\n loadInternal({\n splats,\n url,\n fileBytes,\n fileType,\n fileName,\n stream,\n streamLength,\n postDecode,\n onLoad,\n onProgress,\n onError,\n }: {\n splats?: Splats;\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n streamLength?: number;\n postDecode?: SplatPostDecodeProgram;\n onLoad?: (decoded: Splats) => void;\n onProgress?: (event: ProgressEvent) => void;\n onError?: (error: unknown) => void;\n }) {\n const byteArray =\n fileBytes instanceof ArrayBuffer ? new Uint8Array(fileBytes) : fileBytes;\n const resolvedURL = byteArray\n ? undefined\n : this.manager.resolveURL((this.path ?? \"\") + (url ?? \"\"));\n let streamReader = stream?.getReader();\n const cancelStreamReader = async (reason: unknown) => {\n const reader = streamReader;\n streamReader = undefined;\n if (!reader) return;\n try {\n await reader.cancel(reason);\n } catch {\n // Preserve the original error if stream cancellation fails.\n }\n reader.releaseLock();\n };\n\n this.manager.itemStart(resolvedURL ?? \"\");\n\n workerPool\n .withWorker(async (worker) => {\n const readStreamChunk = async () => {\n const reader = streamReader;\n if (!reader) return new Uint8Array(0);\n\n try {\n const { done, value } = await reader.read();\n if (!done) return value;\n\n reader.releaseLock();\n streamReader = undefined;\n return new Uint8Array(0);\n } catch (error) {\n await worker.call(\"nextChunk\", { chunk: new Uint8Array(0) });\n throw error;\n }\n };\n\n const onStatus = async (data: unknown) => {\n const { loaded, total } = data as {\n loaded?: number;\n total?: number;\n };\n if (loaded !== undefined && onProgress) {\n try {\n onProgress(\n new ProgressEvent(\"progress\", {\n lengthComputable: total !== 0,\n loaded,\n total: total ?? 0,\n }),\n );\n } catch (error) {\n console.error(\"Progress callback failed\", error);\n }\n }\n\n if ((data as { nextChunk?: boolean }).nextChunk) {\n const chunk = await readStreamChunk();\n await worker.call(\"nextChunk\", { chunk });\n }\n };\n\n const basedUrl = resolvedURL\n ? new URL(resolvedURL, window.location.href).toString()\n : undefined;\n const decoded = await worker.call(\n \"loadSplats\",\n {\n url: basedUrl,\n requestHeader: this.requestHeader,\n withCredentials: this.withCredentials,\n fileBytes: byteArray?.slice(),\n fileType,\n pathName: resolvedURL || fileName,\n chunked: stream !== undefined,\n chunkedLength: streamLength,\n postDecode: postDecode\n ? serializeSplatPostDecode(postDecode)\n : undefined,\n },\n { onStatus },\n );\n\n const result = splats ?? new Splats();\n result.initialize(decoded as SplatsOptions);\n onLoad?.(result);\n })\n .catch(async (error) => {\n await cancelStreamReader(error);\n this.manager.itemError(resolvedURL ?? \"\");\n onError?.(error);\n })\n .finally(() => {\n this.manager.itemEnd(resolvedURL ?? \"\");\n });\n }\n\n async loadInternalAsync({\n splats,\n url,\n fileBytes,\n fileType,\n fileName,\n stream,\n streamLength,\n postDecode,\n onProgress,\n }: {\n splats?: Splats;\n url?: string;\n fileBytes?: Uint8Array | ArrayBuffer;\n fileType?: SplatFileType;\n fileName?: string;\n stream?: ReadableStream;\n streamLength?: number;\n postDecode?: SplatPostDecodeProgram;\n onProgress?: (event: ProgressEvent) => void;\n }): Promise<Splats> {\n return new Promise((resolve, reject) => {\n this.loadInternal({\n splats,\n url,\n fileBytes,\n fileType,\n fileName,\n stream,\n streamLength,\n postDecode,\n onLoad: resolve,\n onProgress,\n onError: reject,\n });\n });\n }\n}\n"],"names":["SplatEditSdfType","SplatEditRgbaBlendMode","THREE","ptr","module","axisX","axisY","axisZ","SplatFileType","fromHalf","initialized","SplatLoader","_a","initWasm","wasm.isInitialized","splatDefines","splatVertex","splatFragment","splatGenerate","FullScreenQuad","BundledWorker","shaders","target","cubeCamera","immediate","register","onTrue","onFalse","_SplatPostDecodeProgramImpl","Loader","postDecode"],"mappings":"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"}