{"version":3,"file":"index.js","sources":["../src/math/Vector3.ts","../src/math/Quaternion.ts","../src/events/EventDispatcher.ts","../src/math/Matrix4.ts","../src/events/Events.ts","../src/core/Object3D.ts","../src/math/Matrix3.ts","../src/splats/SplatData.ts","../src/splats/SplatvData.ts","../src/utils/Converter.ts","../src/math/Box3.ts","../src/splats/Splat.ts","../src/splats/Splatv.ts","../src/cameras/CameraData.ts","../src/math/Vector4.ts","../src/cameras/Camera.ts","../src/core/Scene.ts","../src/utils/LoaderUtils.ts","../src/loaders/Loader.ts","../src/loaders/PLYLoader.ts","../src/loaders/SplatvLoader.ts","../src/renderers/webgl/programs/ShaderProgram.ts","../src/wasm/data.js","../src/renderers/webgl/utils/RenderData.ts","../src/math/Color32.ts","../src/renderers/webgl/programs/RenderProgram.ts","../src/renderers/webgl/passes/FadeInPass.ts","../src/renderers/WebGLRenderer.ts","../src/controls/OrbitControls.ts","../src/controls/FPSControls.ts","../src/math/Plane.ts","../src/renderers/webgl/passes/ShaderPass.ts","../src/renderers/webgl/programs/VideoRenderProgram.ts","../src/math/BVH.ts","../src/renderers/webgl/utils/IntersectionTester.ts"],"sourcesContent":["import { Matrix4 } from \"./Matrix4\";\n\nclass Vector3 {\n public readonly x: number;\n public readonly y: number;\n public readonly z: number;\n\n constructor(x: number = 0, y: number = 0, z: number = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n equals(v: Vector3): boolean {\n if (this.x !== v.x) {\n return false;\n }\n if (this.y !== v.y) {\n return false;\n }\n if (this.z !== v.z) {\n return false;\n }\n\n return true;\n }\n\n add(v: number): Vector3;\n add(v: Vector3): Vector3;\n add(v: number | Vector3): Vector3 {\n if (typeof v === \"number\") {\n return new Vector3(this.x + v, this.y + v, this.z + v);\n } else {\n return new Vector3(this.x + v.x, this.y + v.y, this.z + v.z);\n }\n }\n\n subtract(v: number): Vector3;\n subtract(v: Vector3): Vector3;\n subtract(v: number | Vector3): Vector3 {\n if (typeof v === \"number\") {\n return new Vector3(this.x - v, this.y - v, this.z - v);\n } else {\n return new Vector3(this.x - v.x, this.y - v.y, this.z - v.z);\n }\n }\n\n multiply(v: number): Vector3;\n multiply(v: Vector3): Vector3;\n multiply(v: Matrix4): Vector3;\n multiply(v: number | Vector3 | Matrix4): Vector3 {\n if (typeof v === \"number\") {\n return new Vector3(this.x * v, this.y * v, this.z * v);\n } else if (v instanceof Vector3) {\n return new Vector3(this.x * v.x, this.y * v.y, this.z * v.z);\n } else {\n return new Vector3(\n this.x * v.buffer[0] + this.y * v.buffer[4] + this.z * v.buffer[8] + v.buffer[12],\n this.x * v.buffer[1] + this.y * v.buffer[5] + this.z * v.buffer[9] + v.buffer[13],\n this.x * v.buffer[2] + this.y * v.buffer[6] + this.z * v.buffer[10] + v.buffer[14],\n );\n }\n }\n\n divide(v: number): Vector3;\n divide(v: Vector3): Vector3;\n divide(v: number | Vector3): Vector3 {\n if (typeof v === \"number\") {\n return new Vector3(this.x / v, this.y / v, this.z / v);\n } else {\n return new Vector3(this.x / v.x, this.y / v.y, this.z / v.z);\n }\n }\n\n cross(v: Vector3): Vector3 {\n const x = this.y * v.z - this.z * v.y;\n const y = this.z * v.x - this.x * v.z;\n const z = this.x * v.y - this.y * v.x;\n\n return new Vector3(x, y, z);\n }\n\n dot(v: Vector3): number {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n }\n\n lerp(v: Vector3, t: number): Vector3 {\n return new Vector3(this.x + (v.x - this.x) * t, this.y + (v.y - this.y) * t, this.z + (v.z - this.z) * t);\n }\n\n min(v: Vector3): Vector3 {\n return new Vector3(Math.min(this.x, v.x), Math.min(this.y, v.y), Math.min(this.z, v.z));\n }\n\n max(v: Vector3): Vector3 {\n return new Vector3(Math.max(this.x, v.x), Math.max(this.y, v.y), Math.max(this.z, v.z));\n }\n\n getComponent(axis: number) {\n switch (axis) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n default:\n throw new Error(`Invalid component index: ${axis}`);\n }\n }\n\n minComponent(): number {\n if (this.x < this.y && this.x < this.z) {\n return 0;\n } else if (this.y < this.z) {\n return 1;\n } else {\n return 2;\n }\n }\n\n maxComponent(): number {\n if (this.x > this.y && this.x > this.z) {\n return 0;\n } else if (this.y > this.z) {\n return 1;\n } else {\n return 2;\n }\n }\n\n magnitude(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n\n distanceTo(v: Vector3): number {\n return Math.sqrt((this.x - v.x) ** 2 + (this.y - v.y) ** 2 + (this.z - v.z) ** 2);\n }\n\n normalize(): Vector3 {\n const length = this.magnitude();\n\n return new Vector3(this.x / length, this.y / length, this.z / length);\n }\n\n flat(): number[] {\n return [this.x, this.y, this.z];\n }\n\n clone(): Vector3 {\n return new Vector3(this.x, this.y, this.z);\n }\n\n toString(): string {\n return `[${this.flat().join(\", \")}]`;\n }\n\n static One(value: number = 1): Vector3 {\n return new Vector3(value, value, value);\n }\n}\n\nexport { Vector3 };\n","import { Matrix3 } from \"./Matrix3\";\nimport { Vector3 } from \"./Vector3\";\n\nclass Quaternion {\n public readonly x: number;\n public readonly y: number;\n public readonly z: number;\n public readonly w: number;\n\n constructor(x: number = 0, y: number = 0, z: number = 0, w: number = 1) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n\n equals(q: Quaternion): boolean {\n if (this.x !== q.x) {\n return false;\n }\n if (this.y !== q.y) {\n return false;\n }\n if (this.z !== q.z) {\n return false;\n }\n if (this.w !== q.w) {\n return false;\n }\n\n return true;\n }\n\n normalize(): Quaternion {\n const l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n return new Quaternion(this.x / l, this.y / l, this.z / l, this.w / l);\n }\n\n multiply(q: Quaternion): Quaternion {\n const w1 = this.w,\n x1 = this.x,\n y1 = this.y,\n z1 = this.z;\n const w2 = q.w,\n x2 = q.x,\n y2 = q.y,\n z2 = q.z;\n\n return new Quaternion(\n w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2,\n w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2,\n w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2,\n w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2,\n );\n }\n\n inverse(): Quaternion {\n const l = this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n return new Quaternion(-this.x / l, -this.y / l, -this.z / l, this.w / l);\n }\n\n apply(v: Vector3): Vector3 {\n const vecQuat = new Quaternion(v.x, v.y, v.z, 0);\n const conjugate = new Quaternion(-this.x, -this.y, -this.z, this.w);\n const rotatedQuat = this.multiply(vecQuat).multiply(conjugate);\n return new Vector3(rotatedQuat.x, rotatedQuat.y, rotatedQuat.z);\n }\n\n flat(): number[] {\n return [this.x, this.y, this.z, this.w];\n }\n\n clone(): Quaternion {\n return new Quaternion(this.x, this.y, this.z, this.w);\n }\n\n static FromEuler(e: Vector3): Quaternion {\n const halfX = e.x / 2;\n const halfY = e.y / 2;\n const halfZ = e.z / 2;\n const cy = Math.cos(halfY);\n const sy = Math.sin(halfY);\n const cp = Math.cos(halfX);\n const sp = Math.sin(halfX);\n const cz = Math.cos(halfZ);\n const sz = Math.sin(halfZ);\n\n const q = new Quaternion(\n cy * sp * cz + sy * cp * sz,\n sy * cp * cz - cy * sp * sz,\n cy * cp * sz - sy * sp * cz,\n cy * cp * cz + sy * sp * sz,\n );\n return q;\n }\n\n toEuler(): Vector3 {\n const sinr_cosp = 2 * (this.w * this.x + this.y * this.z);\n const cosr_cosp = 1 - 2 * (this.x * this.x + this.y * this.y);\n const x = Math.atan2(sinr_cosp, cosr_cosp);\n\n let y;\n const sinp = 2 * (this.w * this.y - this.z * this.x);\n if (Math.abs(sinp) >= 1) {\n y = (Math.sign(sinp) * Math.PI) / 2;\n } else {\n y = Math.asin(sinp);\n }\n\n const siny_cosp = 2 * (this.w * this.z + this.x * this.y);\n const cosy_cosp = 1 - 2 * (this.y * this.y + this.z * this.z);\n const z = Math.atan2(siny_cosp, cosy_cosp);\n\n return new Vector3(x, y, z);\n }\n\n static FromMatrix3(matrix: Matrix3): Quaternion {\n const m = matrix.buffer;\n const trace = m[0] + m[4] + m[8];\n let x, y, z, w;\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1.0);\n w = 0.25 / s;\n x = (m[7] - m[5]) * s;\n y = (m[2] - m[6]) * s;\n z = (m[3] - m[1]) * s;\n } else if (m[0] > m[4] && m[0] > m[8]) {\n const s = 2.0 * Math.sqrt(1.0 + m[0] - m[4] - m[8]);\n w = (m[7] - m[5]) / s;\n x = 0.25 * s;\n y = (m[1] + m[3]) / s;\n z = (m[2] + m[6]) / s;\n } else if (m[4] > m[8]) {\n const s = 2.0 * Math.sqrt(1.0 + m[4] - m[0] - m[8]);\n w = (m[2] - m[6]) / s;\n x = (m[1] + m[3]) / s;\n y = 0.25 * s;\n z = (m[5] + m[7]) / s;\n } else {\n const s = 2.0 * Math.sqrt(1.0 + m[8] - m[0] - m[4]);\n w = (m[3] - m[1]) / s;\n x = (m[2] + m[6]) / s;\n y = (m[5] + m[7]) / s;\n z = 0.25 * s;\n }\n return new Quaternion(x, y, z, w);\n }\n\n static FromAxisAngle(axis: Vector3, angle: number): Quaternion {\n const halfAngle = angle / 2;\n const sin = Math.sin(halfAngle);\n const cos = Math.cos(halfAngle);\n return new Quaternion(axis.x * sin, axis.y * sin, axis.z * sin, cos);\n }\n\n static LookRotation(direction: Vector3): Quaternion {\n const forward = new Vector3(0, 0, 1);\n const dot = forward.dot(direction);\n\n if (Math.abs(dot - -1.0) < 0.000001) {\n return new Quaternion(0, 1, 0, Math.PI);\n }\n if (Math.abs(dot - 1.0) < 0.000001) {\n return new Quaternion();\n }\n\n const rotAngle = Math.acos(dot);\n const rotAxis = forward.cross(direction).normalize();\n return Quaternion.FromAxisAngle(rotAxis, rotAngle);\n }\n\n toString(): string {\n return `[${this.flat().join(\", \")}]`;\n }\n}\n\nexport { Quaternion };\n","class EventDispatcher {\n addEventListener: (type: string, listener: (event: Event) => void) => void;\n removeEventListener: (type: string, listener: (event: Event) => void) => void;\n hasEventListener: (type: string, listener: (event: Event) => void) => boolean;\n dispatchEvent: (event: Event) => void;\n\n constructor() {\n const listeners = new Map void>>();\n\n this.addEventListener = (type: string, listener: (event: Event) => void) => {\n if (!listeners.has(type)) {\n listeners.set(type, new Set());\n }\n\n listeners.get(type)!.add(listener);\n };\n\n this.removeEventListener = (type: string, listener: (event: Event) => void) => {\n if (!listeners.has(type)) {\n return;\n }\n\n listeners.get(type)!.delete(listener);\n };\n\n this.hasEventListener = (type: string, listener: (event: Event) => void) => {\n if (!listeners.has(type)) {\n return false;\n }\n\n return listeners.get(type)!.has(listener);\n };\n\n this.dispatchEvent = (event: Event) => {\n if (!listeners.has(event.type)) {\n return;\n }\n\n for (const listener of listeners.get(event.type)!) {\n listener(event);\n }\n };\n }\n}\n\nexport { EventDispatcher };\n","import { Quaternion } from \"./Quaternion\";\nimport { Vector3 } from \"./Vector3\";\n\nclass Matrix4 {\n public readonly buffer: number[];\n\n // prettier-ignore\n constructor(n11: number = 1, n12: number = 0, n13: number = 0, n14: number = 0, \n n21: number = 0, n22: number = 1, n23: number = 0, n24: number = 0, \n n31: number = 0, n32: number = 0, n33: number = 1, n34: number = 0, \n n41: number = 0, n42: number = 0, n43: number = 0, n44: number = 1) {\n this.buffer = [\n n11, n12, n13, n14, \n n21, n22, n23, n24, \n n31, n32, n33, n34, \n n41, n42, n43, n44\n ];\n }\n\n equals(m: Matrix4): boolean {\n if (this.buffer.length !== m.buffer.length) {\n return false;\n }\n if (this.buffer === m.buffer) {\n return true;\n }\n for (let i = 0; i < this.buffer.length; i++) {\n if (this.buffer[i] !== m.buffer[i]) {\n return false;\n }\n }\n return true;\n }\n\n multiply(m: Matrix4): Matrix4 {\n const a = this.buffer;\n const b = m.buffer;\n return new Matrix4(\n b[0] * a[0] + b[1] * a[4] + b[2] * a[8] + b[3] * a[12],\n b[0] * a[1] + b[1] * a[5] + b[2] * a[9] + b[3] * a[13],\n b[0] * a[2] + b[1] * a[6] + b[2] * a[10] + b[3] * a[14],\n b[0] * a[3] + b[1] * a[7] + b[2] * a[11] + b[3] * a[15],\n b[4] * a[0] + b[5] * a[4] + b[6] * a[8] + b[7] * a[12],\n b[4] * a[1] + b[5] * a[5] + b[6] * a[9] + b[7] * a[13],\n b[4] * a[2] + b[5] * a[6] + b[6] * a[10] + b[7] * a[14],\n b[4] * a[3] + b[5] * a[7] + b[6] * a[11] + b[7] * a[15],\n b[8] * a[0] + b[9] * a[4] + b[10] * a[8] + b[11] * a[12],\n b[8] * a[1] + b[9] * a[5] + b[10] * a[9] + b[11] * a[13],\n b[8] * a[2] + b[9] * a[6] + b[10] * a[10] + b[11] * a[14],\n b[8] * a[3] + b[9] * a[7] + b[10] * a[11] + b[11] * a[15],\n b[12] * a[0] + b[13] * a[4] + b[14] * a[8] + b[15] * a[12],\n b[12] * a[1] + b[13] * a[5] + b[14] * a[9] + b[15] * a[13],\n b[12] * a[2] + b[13] * a[6] + b[14] * a[10] + b[15] * a[14],\n b[12] * a[3] + b[13] * a[7] + b[14] * a[11] + b[15] * a[15],\n );\n }\n\n clone(): Matrix4 {\n const e = this.buffer;\n // prettier-ignore\n return new Matrix4(\n e[0], e[1], e[2], e[3], \n e[4], e[5], e[6], e[7], \n e[8], e[9], e[10], e[11], \n e[12], e[13], e[14], e[15]\n );\n }\n\n determinant(): number {\n const e = this.buffer;\n // prettier-ignore\n return (\n e[12] * e[9] * e[6] * e[3] - e[8] * e[13] * e[6] * e[3] - e[12] * e[5] * e[10] * e[3] + e[4] * e[13] * e[10] * e[3] +\n e[8] * e[5] * e[14] * e[3] - e[4] * e[9] * e[14] * e[3] - e[12] * e[9] * e[2] * e[7] + e[8] * e[13] * e[2] * e[7] +\n e[12] * e[1] * e[10] * e[7] - e[0] * e[13] * e[10] * e[7] - e[8] * e[1] * e[14] * e[7] + e[0] * e[9] * e[14] * e[7] +\n e[12] * e[5] * e[2] * e[11] - e[4] * e[13] * e[2] * e[11] - e[12] * e[1] * e[6] * e[11] + e[0] * e[13] * e[6] * e[11] +\n e[4] * e[1] * e[14] * e[11] - e[0] * e[5] * e[14] * e[11] - e[8] * e[5] * e[2] * e[15] + e[4] * e[9] * e[2] * e[15] +\n e[8] * e[1] * e[6] * e[15] - e[0] * e[9] * e[6] * e[15] - e[4] * e[1] * e[10] * e[15] + e[0] * e[5] * e[10] * e[15]\n );\n }\n\n invert(): Matrix4 {\n const e = this.buffer;\n const det = this.determinant();\n if (det === 0) {\n throw new Error(\"Matrix is not invertible.\");\n }\n const invDet = 1 / det;\n // prettier-ignore\n return new Matrix4(\n invDet * (\n e[5] * e[10] * e[15] - e[5] * e[11] * e[14] - e[9] * e[6] * e[15] + e[9] * e[7] * e[14] + e[13] * e[6] * e[11] - e[13] * e[7] * e[10]\n ),\n invDet * (\n -e[1] * e[10] * e[15] + e[1] * e[11] * e[14] + e[9] * e[2] * e[15] - e[9] * e[3] * e[14] - e[13] * e[2] * e[11] + e[13] * e[3] * e[10]\n ),\n invDet * (\n e[1] * e[6] * e[15] - e[1] * e[7] * e[14] - e[5] * e[2] * e[15] + e[5] * e[3] * e[14] + e[13] * e[2] * e[7] - e[13] * e[3] * e[6]\n ),\n invDet * (\n -e[1] * e[6] * e[11] + e[1] * e[7] * e[10] + e[5] * e[2] * e[11] - e[5] * e[3] * e[10] - e[9] * e[2] * e[7] + e[9] * e[3] * e[6]\n ),\n invDet * (\n -e[4] * e[10] * e[15] + e[4] * e[11] * e[14] + e[8] * e[6] * e[15] - e[8] * e[7] * e[14] - e[12] * e[6] * e[11] + e[12] * e[7] * e[10]\n ),\n invDet * (\n e[0] * e[10] * e[15] - e[0] * e[11] * e[14] - e[8] * e[2] * e[15] + e[8] * e[3] * e[14] + e[12] * e[2] * e[11] - e[12] * e[3] * e[10]\n ),\n invDet * (\n -e[0] * e[6] * e[15] + e[0] * e[7] * e[14] + e[4] * e[2] * e[15] - e[4] * e[3] * e[14] - e[12] * e[2] * e[7] + e[12] * e[3] * e[6]\n ),\n invDet * (\n e[0] * e[6] * e[11] - e[0] * e[7] * e[10] - e[4] * e[2] * e[11] + e[4] * e[3] * e[10] + e[8] * e[2] * e[7] - e[8] * e[3] * e[6]\n ),\n invDet * (\n e[4] * e[9] * e[15] - e[4] * e[11] * e[13] - e[8] * e[5] * e[15] + e[8] * e[7] * e[13] + e[12] * e[5] * e[11] - e[12] * e[7] * e[9]\n ),\n invDet * (\n -e[0] * e[9] * e[15] + e[0] * e[11] * e[13] + e[8] * e[1] * e[15] - e[8] * e[3] * e[13] - e[12] * e[1] * e[11] + e[12] * e[3] * e[9]\n ),\n invDet * (\n e[0] * e[5] * e[15] - e[0] * e[7] * e[13] - e[4] * e[1] * e[15] + e[4] * e[3] * e[13] + e[12] * e[1] * e[7] - e[12] * e[3] * e[5]\n ),\n invDet * (\n -e[0] * e[5] * e[11] + e[0] * e[7] * e[9] + e[4] * e[1] * e[11] - e[4] * e[3] * e[9] - e[8] * e[1] * e[7] + e[8] * e[3] * e[5]\n ),\n invDet * (\n -e[4] * e[9] * e[14] + e[4] * e[10] * e[13] + e[8] * e[5] * e[14] - e[8] * e[6] * e[13] - e[12] * e[5] * e[10] + e[12] * e[6] * e[9]\n ),\n invDet * (\n e[0] * e[9] * e[14] - e[0] * e[10] * e[13] - e[8] * e[1] * e[14] + e[8] * e[2] * e[13] + e[12] * e[1] * e[10] - e[12] * e[2] * e[9]\n ),\n invDet * (\n -e[0] * e[5] * e[14] + e[0] * e[6] * e[13] + e[4] * e[1] * e[14] - e[4] * e[2] * e[13] - e[12] * e[1] * e[6] + e[12] * e[2] * e[5]\n ),\n invDet * (\n e[0] * e[5] * e[10] - e[0] * e[6] * e[9] - e[4] * e[1] * e[10] + e[4] * e[2] * e[9] + e[8] * e[1] * e[6] - e[8] * e[2] * e[5]\n ),\n );\n }\n\n static Compose(position: Vector3, rotation: Quaternion, scale: Vector3): Matrix4 {\n const x = rotation.x,\n y = rotation.y,\n z = rotation.z,\n w = rotation.w;\n const x2 = x + x,\n y2 = y + y,\n z2 = z + z;\n const xx = x * x2,\n xy = x * y2,\n xz = x * z2;\n const yy = y * y2,\n yz = y * z2,\n zz = z * z2;\n const wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n const sx = scale.x,\n sy = scale.y,\n sz = scale.z;\n // prettier-ignore\n return new Matrix4(\n (1 - (yy + zz)) * sx, (xy + wz) * sx, (xz - wy) * sx, 0,\n (xy - wz) * sy, (1 - (xx + zz)) * sy, (yz + wx) * sy, 0,\n (xz + wy) * sz, (yz - wx) * sz, (1 - (xx + yy)) * sz, 0,\n position.x, position.y, position.z, 1\n );\n }\n\n toString(): string {\n return `[${this.buffer.join(\", \")}]`;\n }\n}\n\nexport { Matrix4 };\n","import { Object3D } from \"../core/Object3D\";\n\nclass ObjectAddedEvent extends Event {\n constructor(public object: Object3D) {\n super(\"objectAdded\");\n }\n}\n\nclass ObjectRemovedEvent extends Event {\n constructor(public object: Object3D) {\n super(\"objectRemoved\");\n }\n}\n\nclass ObjectChangedEvent extends Event {\n constructor(public object: Object3D) {\n super(\"objectChanged\");\n }\n}\n\nexport { ObjectAddedEvent, ObjectRemovedEvent, ObjectChangedEvent };\n","import { Vector3 } from \"../math/Vector3\";\nimport { Quaternion } from \"../math/Quaternion\";\nimport { EventDispatcher } from \"../events/EventDispatcher\";\nimport { Matrix4 } from \"../math/Matrix4\";\nimport { ObjectChangedEvent } from \"../events/Events\";\n\nabstract class Object3D extends EventDispatcher {\n public positionChanged: boolean = false;\n public rotationChanged: boolean = false;\n public scaleChanged: boolean = false;\n\n protected _position: Vector3 = new Vector3();\n protected _rotation: Quaternion = new Quaternion();\n protected _scale: Vector3 = new Vector3(1, 1, 1);\n protected _transform: Matrix4 = new Matrix4();\n\n protected _changeEvent = new ObjectChangedEvent(this);\n\n update: () => void;\n applyPosition: () => void;\n applyRotation: () => void;\n applyScale: () => void;\n raiseChangeEvent: () => void;\n\n constructor() {\n super();\n\n this.update = () => {};\n\n this.applyPosition = () => {\n this.position = new Vector3();\n };\n\n this.applyRotation = () => {\n this.rotation = new Quaternion();\n };\n\n this.applyScale = () => {\n this.scale = new Vector3(1, 1, 1);\n };\n\n this.raiseChangeEvent = () => {\n this.dispatchEvent(this._changeEvent);\n };\n }\n\n protected _updateMatrix() {\n this._transform = Matrix4.Compose(this._position, this._rotation, this._scale);\n }\n\n get position() {\n return this._position;\n }\n\n set position(position: Vector3) {\n if (!this._position.equals(position)) {\n this._position = position;\n this.positionChanged = true;\n this._updateMatrix();\n this.dispatchEvent(this._changeEvent);\n }\n }\n\n get rotation() {\n return this._rotation;\n }\n\n set rotation(rotation: Quaternion) {\n if (!this._rotation.equals(rotation)) {\n this._rotation = rotation;\n this.rotationChanged = true;\n this._updateMatrix();\n this.dispatchEvent(this._changeEvent);\n }\n }\n\n get scale() {\n return this._scale;\n }\n\n set scale(scale: Vector3) {\n if (!this._scale.equals(scale)) {\n this._scale = scale;\n this.scaleChanged = true;\n this._updateMatrix();\n this.dispatchEvent(this._changeEvent);\n }\n }\n\n get forward() {\n let forward = new Vector3(0, 0, 1);\n forward = this.rotation.apply(forward);\n return forward;\n }\n\n get transform() {\n return this._transform;\n }\n}\n\nexport { Object3D };\n","import { Quaternion } from \"./Quaternion\";\nimport type { Vector3 } from \"./Vector3\";\n\nclass Matrix3 {\n public readonly buffer: number[];\n\n // prettier-ignore\n constructor(n11: number = 1, n12: number = 0, n13: number = 0,\n n21: number = 0, n22: number = 1, n23: number = 0,\n n31: number = 0, n32: number = 0, n33: number = 1) {\n this.buffer = [\n n11, n12, n13,\n n21, n22, n23,\n n31, n32, n33\n ];\n }\n\n equals(m: Matrix3): boolean {\n if (this.buffer.length !== m.buffer.length) {\n return false;\n }\n if (this.buffer === m.buffer) {\n return true;\n }\n for (let i = 0; i < this.buffer.length; i++) {\n if (this.buffer[i] !== m.buffer[i]) {\n return false;\n }\n }\n return true;\n }\n\n multiply(v: Matrix3): Matrix3 {\n const a = this.buffer;\n const b = v.buffer;\n return new Matrix3(\n b[0] * a[0] + b[3] * a[1] + b[6] * a[2],\n b[1] * a[0] + b[4] * a[1] + b[7] * a[2],\n b[2] * a[0] + b[5] * a[1] + b[8] * a[2],\n b[0] * a[3] + b[3] * a[4] + b[6] * a[5],\n b[1] * a[3] + b[4] * a[4] + b[7] * a[5],\n b[2] * a[3] + b[5] * a[4] + b[8] * a[5],\n b[0] * a[6] + b[3] * a[7] + b[6] * a[8],\n b[1] * a[6] + b[4] * a[7] + b[7] * a[8],\n b[2] * a[6] + b[5] * a[7] + b[8] * a[8],\n );\n }\n\n clone(): Matrix3 {\n const e = this.buffer;\n // prettier-ignore\n return new Matrix3(\n e[0], e[1], e[2],\n e[3], e[4], e[5],\n e[6], e[7], e[8]\n );\n }\n\n static Eye(v: number = 1): Matrix3 {\n return new Matrix3(v, 0, 0, 0, v, 0, 0, 0, v);\n }\n\n static Diagonal(v: Vector3): Matrix3 {\n return new Matrix3(v.x, 0, 0, 0, v.y, 0, 0, 0, v.z);\n }\n\n static RotationFromQuaternion(q: Quaternion): Matrix3 {\n const matrix = new Matrix3(\n 1 - 2 * q.y * q.y - 2 * q.z * q.z,\n 2 * q.x * q.y - 2 * q.z * q.w,\n 2 * q.x * q.z + 2 * q.y * q.w,\n 2 * q.x * q.y + 2 * q.z * q.w,\n 1 - 2 * q.x * q.x - 2 * q.z * q.z,\n 2 * q.y * q.z - 2 * q.x * q.w,\n 2 * q.x * q.z - 2 * q.y * q.w,\n 2 * q.y * q.z + 2 * q.x * q.w,\n 1 - 2 * q.x * q.x - 2 * q.y * q.y,\n );\n return matrix;\n }\n\n static RotationFromEuler(m: Vector3): Matrix3 {\n const cx = Math.cos(m.x);\n const sx = Math.sin(m.x);\n const cy = Math.cos(m.y);\n const sy = Math.sin(m.y);\n const cz = Math.cos(m.z);\n const sz = Math.sin(m.z);\n\n const rotationMatrix = [\n cy * cz + sy * sx * sz,\n -cy * sz + sy * sx * cz,\n sy * cx,\n cx * sz,\n cx * cz,\n -sx,\n -sy * cz + cy * sx * sz,\n sy * sz + cy * sx * cz,\n cy * cx,\n ];\n\n return new Matrix3(...rotationMatrix);\n }\n\n toString(): string {\n return `[${this.buffer.join(\", \")}]`;\n }\n}\n\nexport { Matrix3 };\n","import { Vector3 } from \"../math/Vector3\";\nimport { Quaternion } from \"../math/Quaternion\";\nimport { Matrix3 } from \"../math/Matrix3\";\n\nclass SplatData {\n static RowLength = 3 * 4 + 3 * 4 + 4 + 4;\n\n public changed = false;\n public detached = false;\n\n private _vertexCount: number;\n private _positions: Float32Array;\n private _rotations: Float32Array;\n private _scales: Float32Array;\n private _colors: Uint8Array;\n private _selection: Uint8Array;\n\n translate: (translation: Vector3) => void;\n rotate: (rotation: Quaternion) => void;\n scale: (scale: Vector3) => void;\n serialize: () => Uint8Array;\n reattach: (\n positions: ArrayBufferLike,\n rotations: ArrayBufferLike,\n scales: ArrayBufferLike,\n colors: ArrayBufferLike,\n selection: ArrayBufferLike,\n ) => void;\n\n constructor(\n vertexCount: number = 0,\n positions: Float32Array | null = null,\n rotations: Float32Array | null = null,\n scales: Float32Array | null = null,\n colors: Uint8Array | null = null,\n ) {\n this._vertexCount = vertexCount;\n this._positions = positions || new Float32Array(0);\n this._rotations = rotations || new Float32Array(0);\n this._scales = scales || new Float32Array(0);\n this._colors = colors || new Uint8Array(0);\n this._selection = new Uint8Array(this.vertexCount);\n\n this.translate = (translation: Vector3) => {\n for (let i = 0; i < this.vertexCount; i++) {\n this.positions[3 * i + 0] += translation.x;\n this.positions[3 * i + 1] += translation.y;\n this.positions[3 * i + 2] += translation.z;\n }\n\n this.changed = true;\n };\n\n this.rotate = (rotation: Quaternion) => {\n const R = Matrix3.RotationFromQuaternion(rotation).buffer;\n for (let i = 0; i < this.vertexCount; i++) {\n const x = this.positions[3 * i + 0];\n const y = this.positions[3 * i + 1];\n const z = this.positions[3 * i + 2];\n\n this.positions[3 * i + 0] = R[0] * x + R[1] * y + R[2] * z;\n this.positions[3 * i + 1] = R[3] * x + R[4] * y + R[5] * z;\n this.positions[3 * i + 2] = R[6] * x + R[7] * y + R[8] * z;\n\n const currentRotation = new Quaternion(\n this.rotations[4 * i + 1],\n this.rotations[4 * i + 2],\n this.rotations[4 * i + 3],\n this.rotations[4 * i + 0],\n );\n\n const newRot = rotation.multiply(currentRotation);\n this.rotations[4 * i + 1] = newRot.x;\n this.rotations[4 * i + 2] = newRot.y;\n this.rotations[4 * i + 3] = newRot.z;\n this.rotations[4 * i + 0] = newRot.w;\n }\n\n this.changed = true;\n };\n\n this.scale = (scale: Vector3) => {\n for (let i = 0; i < this.vertexCount; i++) {\n this.positions[3 * i + 0] *= scale.x;\n this.positions[3 * i + 1] *= scale.y;\n this.positions[3 * i + 2] *= scale.z;\n\n this.scales[3 * i + 0] *= scale.x;\n this.scales[3 * i + 1] *= scale.y;\n this.scales[3 * i + 2] *= scale.z;\n }\n\n this.changed = true;\n };\n\n this.serialize = () => {\n const data = new Uint8Array(this.vertexCount * SplatData.RowLength);\n\n const f_buffer = new Float32Array(data.buffer);\n const u_buffer = new Uint8Array(data.buffer);\n\n for (let i = 0; i < this.vertexCount; i++) {\n f_buffer[8 * i + 0] = this.positions[3 * i + 0];\n f_buffer[8 * i + 1] = this.positions[3 * i + 1];\n f_buffer[8 * i + 2] = this.positions[3 * i + 2];\n\n u_buffer[32 * i + 24 + 0] = this.colors[4 * i + 0];\n u_buffer[32 * i + 24 + 1] = this.colors[4 * i + 1];\n u_buffer[32 * i + 24 + 2] = this.colors[4 * i + 2];\n u_buffer[32 * i + 24 + 3] = this.colors[4 * i + 3];\n\n f_buffer[8 * i + 3 + 0] = this.scales[3 * i + 0];\n f_buffer[8 * i + 3 + 1] = this.scales[3 * i + 1];\n f_buffer[8 * i + 3 + 2] = this.scales[3 * i + 2];\n\n u_buffer[32 * i + 28 + 0] = (this.rotations[4 * i + 0] * 128 + 128) & 0xff;\n u_buffer[32 * i + 28 + 1] = (this.rotations[4 * i + 1] * 128 + 128) & 0xff;\n u_buffer[32 * i + 28 + 2] = (this.rotations[4 * i + 2] * 128 + 128) & 0xff;\n u_buffer[32 * i + 28 + 3] = (this.rotations[4 * i + 3] * 128 + 128) & 0xff;\n }\n\n return data;\n };\n\n this.reattach = (\n positions: ArrayBufferLike,\n rotations: ArrayBufferLike,\n scales: ArrayBufferLike,\n colors: ArrayBufferLike,\n selection: ArrayBufferLike,\n ) => {\n console.assert(\n positions.byteLength === this.vertexCount * 3 * 4,\n `Expected ${this.vertexCount * 3 * 4} bytes, got ${positions.byteLength} bytes`,\n );\n this._positions = new Float32Array(positions);\n this._rotations = new Float32Array(rotations);\n this._scales = new Float32Array(scales);\n this._colors = new Uint8Array(colors);\n this._selection = new Uint8Array(selection);\n this.detached = false;\n };\n }\n\n static Deserialize(data: Uint8Array): SplatData {\n const vertexCount = data.length / SplatData.RowLength;\n const positions = new Float32Array(3 * vertexCount);\n const rotations = new Float32Array(4 * vertexCount);\n const scales = new Float32Array(3 * vertexCount);\n const colors = new Uint8Array(4 * vertexCount);\n\n const f_buffer = new Float32Array(data.buffer);\n const u_buffer = new Uint8Array(data.buffer);\n\n for (let i = 0; i < vertexCount; i++) {\n positions[3 * i + 0] = f_buffer[8 * i + 0];\n positions[3 * i + 1] = f_buffer[8 * i + 1];\n positions[3 * i + 2] = f_buffer[8 * i + 2];\n\n rotations[4 * i + 0] = (u_buffer[32 * i + 28 + 0] - 128) / 128;\n rotations[4 * i + 1] = (u_buffer[32 * i + 28 + 1] - 128) / 128;\n rotations[4 * i + 2] = (u_buffer[32 * i + 28 + 2] - 128) / 128;\n rotations[4 * i + 3] = (u_buffer[32 * i + 28 + 3] - 128) / 128;\n\n scales[3 * i + 0] = f_buffer[8 * i + 3 + 0];\n scales[3 * i + 1] = f_buffer[8 * i + 3 + 1];\n scales[3 * i + 2] = f_buffer[8 * i + 3 + 2];\n\n colors[4 * i + 0] = u_buffer[32 * i + 24 + 0];\n colors[4 * i + 1] = u_buffer[32 * i + 24 + 1];\n colors[4 * i + 2] = u_buffer[32 * i + 24 + 2];\n colors[4 * i + 3] = u_buffer[32 * i + 24 + 3];\n }\n\n return new SplatData(vertexCount, positions, rotations, scales, colors);\n }\n\n get vertexCount() {\n return this._vertexCount;\n }\n\n get positions() {\n return this._positions;\n }\n\n get rotations() {\n return this._rotations;\n }\n\n get scales() {\n return this._scales;\n }\n\n get colors() {\n return this._colors;\n }\n\n get selection() {\n return this._selection;\n }\n\n clone() {\n return new SplatData(\n this.vertexCount,\n new Float32Array(this.positions),\n new Float32Array(this.rotations),\n new Float32Array(this.scales),\n new Uint8Array(this.colors),\n );\n }\n}\n\nexport { SplatData };\n","class SplatvData {\n static RowLength = 64;\n\n private _vertexCount: number;\n private _positions: Float32Array;\n private _data: Uint32Array;\n private _width: number;\n private _height: number;\n\n serialize: () => Uint8Array;\n\n constructor(vertexCount: number, positions: Float32Array, data: Uint32Array, width: number, height: number) {\n this._vertexCount = vertexCount;\n this._positions = positions;\n this._data = data;\n this._width = width;\n this._height = height;\n\n this.serialize = () => {\n return new Uint8Array(this._data.buffer);\n };\n }\n\n static Deserialize(data: Uint8Array, width: number, height: number): SplatvData {\n const buffer = new Uint32Array(data.buffer);\n const f_buffer = new Float32Array(data.buffer);\n const vertexCount = Math.floor(f_buffer.byteLength / this.RowLength);\n const positions = new Float32Array(vertexCount * 3);\n for (let i = 0; i < vertexCount; i++) {\n positions[3 * i + 0] = f_buffer[16 * i + 0];\n positions[3 * i + 1] = f_buffer[16 * i + 1];\n positions[3 * i + 2] = f_buffer[16 * i + 2];\n positions[3 * i + 0] = f_buffer[16 * i + 3];\n }\n return new SplatvData(vertexCount, positions, buffer, width, height);\n }\n\n get vertexCount() {\n return this._vertexCount;\n }\n\n get positions() {\n return this._positions;\n }\n\n get data() {\n return this._data;\n }\n\n get width() {\n return this._width;\n }\n\n get height() {\n return this._height;\n }\n}\n\nexport { SplatvData };\n","import { Quaternion } from \"../math/Quaternion\";\n\nclass Converter {\n public static SH_C0 = 0.28209479177387814;\n\n public static SplatToPLY(buffer: ArrayBuffer, vertexCount: number): ArrayBuffer {\n let header = \"ply\\nformat binary_little_endian 1.0\\n\";\n header += `element vertex ${vertexCount}\\n`;\n\n const properties = [\"x\", \"y\", \"z\", \"nx\", \"ny\", \"nz\", \"f_dc_0\", \"f_dc_1\", \"f_dc_2\"];\n for (let i = 0; i < 45; i++) {\n properties.push(`f_rest_${i}`);\n }\n properties.push(\"opacity\");\n properties.push(\"scale_0\");\n properties.push(\"scale_1\");\n properties.push(\"scale_2\");\n properties.push(\"rot_0\");\n properties.push(\"rot_1\");\n properties.push(\"rot_2\");\n properties.push(\"rot_3\");\n\n for (const property of properties) {\n header += `property float ${property}\\n`;\n }\n header += \"end_header\\n\";\n\n const headerBuffer = new TextEncoder().encode(header);\n\n const plyRowLength = 4 * 3 + 4 * 3 + 4 * 3 + 4 * 45 + 4 + 4 * 3 + 4 * 4;\n const plyLength = vertexCount * plyRowLength;\n const output = new DataView(new ArrayBuffer(headerBuffer.length + plyLength));\n new Uint8Array(output.buffer).set(headerBuffer, 0);\n\n const f_buffer = new Float32Array(buffer);\n const u_buffer = new Uint8Array(buffer);\n\n const offset = headerBuffer.length;\n const f_dc_offset = 4 * 3 + 4 * 3;\n const opacity_offset = f_dc_offset + 4 * 3 + 4 * 45;\n const scale_offset = opacity_offset + 4;\n const rot_offset = scale_offset + 4 * 3;\n for (let i = 0; i < vertexCount; i++) {\n const pos0 = f_buffer[8 * i + 0];\n const pos1 = f_buffer[8 * i + 1];\n const pos2 = f_buffer[8 * i + 2];\n\n const f_dc_0 = (u_buffer[32 * i + 24 + 0] / 255 - 0.5) / this.SH_C0;\n const f_dc_1 = (u_buffer[32 * i + 24 + 1] / 255 - 0.5) / this.SH_C0;\n const f_dc_2 = (u_buffer[32 * i + 24 + 2] / 255 - 0.5) / this.SH_C0;\n\n const alpha = u_buffer[32 * i + 24 + 3] / 255;\n const opacity = Math.log(alpha / (1 - alpha));\n\n const scale0 = Math.log(f_buffer[8 * i + 3 + 0]);\n const scale1 = Math.log(f_buffer[8 * i + 3 + 1]);\n const scale2 = Math.log(f_buffer[8 * i + 3 + 2]);\n\n let q = new Quaternion(\n (u_buffer[32 * i + 28 + 1] - 128) / 128,\n (u_buffer[32 * i + 28 + 2] - 128) / 128,\n (u_buffer[32 * i + 28 + 3] - 128) / 128,\n (u_buffer[32 * i + 28 + 0] - 128) / 128,\n );\n q = q.normalize();\n\n const rot0 = q.w;\n const rot1 = q.x;\n const rot2 = q.y;\n const rot3 = q.z;\n\n output.setFloat32(offset + plyRowLength * i + 0, pos0, true);\n output.setFloat32(offset + plyRowLength * i + 4, pos1, true);\n output.setFloat32(offset + plyRowLength * i + 8, pos2, true);\n\n output.setFloat32(offset + plyRowLength * i + f_dc_offset + 0, f_dc_0, true);\n output.setFloat32(offset + plyRowLength * i + f_dc_offset + 4, f_dc_1, true);\n output.setFloat32(offset + plyRowLength * i + f_dc_offset + 8, f_dc_2, true);\n\n output.setFloat32(offset + plyRowLength * i + opacity_offset, opacity, true);\n\n output.setFloat32(offset + plyRowLength * i + scale_offset + 0, scale0, true);\n output.setFloat32(offset + plyRowLength * i + scale_offset + 4, scale1, true);\n output.setFloat32(offset + plyRowLength * i + scale_offset + 8, scale2, true);\n\n output.setFloat32(offset + plyRowLength * i + rot_offset + 0, rot0, true);\n output.setFloat32(offset + plyRowLength * i + rot_offset + 4, rot1, true);\n output.setFloat32(offset + plyRowLength * i + rot_offset + 8, rot2, true);\n output.setFloat32(offset + plyRowLength * i + rot_offset + 12, rot3, true);\n }\n\n return output.buffer;\n }\n}\n\nexport { Converter };\n","import { Vector3 } from \"./Vector3\";\n\nclass Box3 {\n constructor(\n public min: Vector3,\n public max: Vector3,\n ) {}\n\n public contains(point: Vector3) {\n return (\n point.x >= this.min.x &&\n point.x <= this.max.x &&\n point.y >= this.min.y &&\n point.y <= this.max.y &&\n point.z >= this.min.z &&\n point.z <= this.max.z\n );\n }\n\n public intersects(box: Box3) {\n return (\n this.max.x >= box.min.x &&\n this.min.x <= box.max.x &&\n this.max.y >= box.min.y &&\n this.min.y <= box.max.y &&\n this.max.z >= box.min.z &&\n this.min.z <= box.max.z\n );\n }\n\n public size() {\n return this.max.subtract(this.min);\n }\n\n public center() {\n return this.min.add(this.max).divide(2);\n }\n\n public expand(point: Vector3) {\n this.min = this.min.min(point);\n this.max = this.max.max(point);\n }\n\n public permute() {\n const min = this.min;\n const max = this.max;\n this.min = new Vector3(Math.min(min.x, max.x), Math.min(min.y, max.y), Math.min(min.z, max.z));\n this.max = new Vector3(Math.max(min.x, max.x), Math.max(min.y, max.y), Math.max(min.z, max.z));\n }\n}\n\nexport { Box3 };\n","import { SplatData } from \"./SplatData\";\nimport { Object3D } from \"../core/Object3D\";\nimport { Vector3 } from \"../math/Vector3\";\nimport { Quaternion } from \"../math/Quaternion\";\nimport { Converter } from \"../utils/Converter\";\nimport { Matrix4 } from \"../math/Matrix4\";\nimport { Box3 } from \"../math/Box3\";\n\nclass Splat extends Object3D {\n public selectedChanged: boolean = false;\n public colorTransformChanged: boolean = false;\n\n private _data: SplatData;\n private _selected: boolean = false;\n private _colorTransforms: Array = [];\n private _colorTransformsMap: Map = new Map();\n private _bounds: Box3;\n\n recalculateBounds: () => void;\n\n constructor(splat: SplatData | undefined = undefined) {\n super();\n\n this._data = splat || new SplatData();\n this._bounds = new Box3(\n new Vector3(Infinity, Infinity, Infinity),\n new Vector3(-Infinity, -Infinity, -Infinity),\n );\n\n this.recalculateBounds = () => {\n this._bounds = new Box3(\n new Vector3(Infinity, Infinity, Infinity),\n new Vector3(-Infinity, -Infinity, -Infinity),\n );\n for (let i = 0; i < this._data.vertexCount; i++) {\n this._bounds.expand(\n new Vector3(\n this._data.positions[3 * i],\n this._data.positions[3 * i + 1],\n this._data.positions[3 * i + 2],\n ),\n );\n }\n };\n\n this.applyPosition = () => {\n this.data.translate(this.position);\n this.position = new Vector3();\n };\n\n this.applyRotation = () => {\n this.data.rotate(this.rotation);\n this.rotation = new Quaternion();\n };\n\n this.applyScale = () => {\n this.data.scale(this.scale);\n this.scale = new Vector3(1, 1, 1);\n };\n\n this.recalculateBounds();\n }\n\n saveToFile(name: string | null = null, format: \"splat\" | \"ply\" = \"splat\") {\n if (!document) return;\n\n if (!name) {\n const now = new Date();\n name = `splat-${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}.${format}`;\n }\n\n const splatClone = this.clone();\n\n splatClone.applyRotation();\n splatClone.applyScale();\n splatClone.applyPosition();\n\n const data = splatClone.data.serialize();\n let blob;\n if (format === \"ply\") {\n const plyData = Converter.SplatToPLY(data.buffer, splatClone.data.vertexCount);\n blob = new Blob([plyData], { type: \"application/octet-stream\" });\n } else {\n blob = new Blob([data.buffer], { type: \"application/octet-stream\" });\n }\n\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = URL.createObjectURL(blob);\n link.click();\n }\n\n get data() {\n return this._data;\n }\n\n get selected() {\n return this._selected;\n }\n\n set selected(selected: boolean) {\n if (this._selected !== selected) {\n this._selected = selected;\n this.selectedChanged = true;\n this.dispatchEvent(this._changeEvent);\n }\n }\n\n get colorTransforms() {\n return this._colorTransforms;\n }\n\n get colorTransformsMap() {\n return this._colorTransformsMap;\n }\n\n get bounds() {\n let center = this._bounds.center();\n center = center.add(this.position);\n\n let size = this._bounds.size();\n size = size.multiply(this.scale);\n\n return new Box3(center.subtract(size.divide(2)), center.add(size.divide(2)));\n }\n\n clone() {\n const splat = new Splat(this.data.clone());\n splat.position = this.position.clone();\n splat.rotation = this.rotation.clone();\n splat.scale = this.scale.clone();\n return splat;\n }\n}\n\nexport { Splat };\n","import { Object3D } from \"../core/Object3D\";\nimport { SplatvData } from \"./SplatvData\";\n\nclass Splatv extends Object3D {\n private _data: SplatvData;\n\n constructor(splat: SplatvData) {\n super();\n\n this._data = splat;\n }\n\n get data() {\n return this._data;\n }\n}\n\nexport { Splatv };\n","import { Quaternion } from \"../math/Quaternion\";\nimport { Matrix3 } from \"../math/Matrix3\";\nimport { Matrix4 } from \"../math/Matrix4\";\nimport { Vector3 } from \"../math/Vector3\";\n\nclass CameraData {\n private _fx: number = 1132;\n private _fy: number = 1132;\n private _near: number = 0.1;\n private _far: number = 100;\n\n private _width: number = 512;\n private _height: number = 512;\n\n private _projectionMatrix: Matrix4 = new Matrix4();\n private _viewMatrix: Matrix4 = new Matrix4();\n private _viewProj: Matrix4 = new Matrix4();\n\n update: (position: Vector3, rotation: Quaternion) => void;\n setSize: (width: number, height: number) => void;\n\n private _updateProjectionMatrix: () => void;\n\n constructor() {\n this._updateProjectionMatrix = () => {\n // prettier-ignore\n this._projectionMatrix = new Matrix4(\n 2 * this.fx / this.width, 0, 0, 0,\n 0, -2 * this.fy / this.height, 0, 0,\n 0, 0, this.far / (this.far - this.near), 1,\n 0, 0, -(this.far * this.near) / (this.far - this.near), 0\n );\n\n this._viewProj = this.projectionMatrix.multiply(this.viewMatrix);\n };\n\n this.update = (position: Vector3, rotation: Quaternion) => {\n const R = Matrix3.RotationFromQuaternion(rotation).buffer;\n const t = position.flat();\n\n // prettier-ignore\n this._viewMatrix = new Matrix4(\n R[0], R[1], R[2], 0,\n R[3], R[4], R[5], 0,\n R[6], R[7], R[8], 0,\n -t[0] * R[0] - t[1] * R[3] - t[2] * R[6],\n -t[0] * R[1] - t[1] * R[4] - t[2] * R[7],\n -t[0] * R[2] - t[1] * R[5] - t[2] * R[8],\n 1,\n );\n\n this._viewProj = this.projectionMatrix.multiply(this.viewMatrix);\n };\n\n this.setSize = (width: number, height: number) => {\n this._width = width;\n this._height = height;\n this._updateProjectionMatrix();\n };\n }\n\n get fx() {\n return this._fx;\n }\n\n set fx(fx: number) {\n if (this._fx !== fx) {\n this._fx = fx;\n this._updateProjectionMatrix();\n }\n }\n\n get fy() {\n return this._fy;\n }\n\n set fy(fy: number) {\n if (this._fy !== fy) {\n this._fy = fy;\n this._updateProjectionMatrix();\n }\n }\n\n get near() {\n return this._near;\n }\n\n set near(near: number) {\n if (this._near !== near) {\n this._near = near;\n this._updateProjectionMatrix();\n }\n }\n\n get far() {\n return this._far;\n }\n\n set far(far: number) {\n if (this._far !== far) {\n this._far = far;\n this._updateProjectionMatrix();\n }\n }\n\n get width() {\n return this._width;\n }\n\n get height() {\n return this._height;\n }\n\n get projectionMatrix() {\n return this._projectionMatrix;\n }\n\n get viewMatrix() {\n return this._viewMatrix;\n }\n\n get viewProj() {\n return this._viewProj;\n }\n}\n\nexport { CameraData };\n","import { Matrix4 } from \"./Matrix4\";\n\nclass Vector4 {\n public readonly x: number;\n public readonly y: number;\n public readonly z: number;\n public readonly w: number;\n\n constructor(x: number = 0, y: number = 0, z: number = 0, w: number = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n\n equals(v: Vector4): boolean {\n if (this.x !== v.x) {\n return false;\n }\n if (this.y !== v.y) {\n return false;\n }\n if (this.z !== v.z) {\n return false;\n }\n if (this.w !== v.w) {\n return false;\n }\n\n return true;\n }\n\n add(v: number): Vector4;\n add(v: Vector4): Vector4;\n add(v: number | Vector4): Vector4 {\n if (typeof v === \"number\") {\n return new Vector4(this.x + v, this.y + v, this.z + v, this.w + v);\n } else {\n return new Vector4(this.x + v.x, this.y + v.y, this.z + v.z, this.w + v.w);\n }\n }\n\n subtract(v: number): Vector4;\n subtract(v: Vector4): Vector4;\n subtract(v: number | Vector4): Vector4 {\n if (typeof v === \"number\") {\n return new Vector4(this.x - v, this.y - v, this.z - v, this.w - v);\n } else {\n return new Vector4(this.x - v.x, this.y - v.y, this.z - v.z, this.w - v.w);\n }\n }\n\n multiply(v: number): Vector4;\n multiply(v: Vector4): Vector4;\n multiply(v: Matrix4): Vector4;\n multiply(v: number | Vector4 | Matrix4): Vector4 {\n if (typeof v === \"number\") {\n return new Vector4(this.x * v, this.y * v, this.z * v, this.w * v);\n } else if (v instanceof Vector4) {\n return new Vector4(this.x * v.x, this.y * v.y, this.z * v.z, this.w * v.w);\n } else {\n return new Vector4(\n this.x * v.buffer[0] + this.y * v.buffer[4] + this.z * v.buffer[8] + this.w * v.buffer[12],\n this.x * v.buffer[1] + this.y * v.buffer[5] + this.z * v.buffer[9] + this.w * v.buffer[13],\n this.x * v.buffer[2] + this.y * v.buffer[6] + this.z * v.buffer[10] + this.w * v.buffer[14],\n this.x * v.buffer[3] + this.y * v.buffer[7] + this.z * v.buffer[11] + this.w * v.buffer[15],\n );\n }\n }\n\n dot(v: Vector4): number {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n }\n\n lerp(v: Vector4, t: number): Vector4 {\n return new Vector4(\n this.x + (v.x - this.x) * t,\n this.y + (v.y - this.y) * t,\n this.z + (v.z - this.z) * t,\n this.w + (v.w - this.w) * t,\n );\n }\n\n magnitude(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n }\n\n distanceTo(v: Vector4): number {\n return Math.sqrt((this.x - v.x) ** 2 + (this.y - v.y) ** 2 + (this.z - v.z) ** 2 + (this.w - v.w) ** 2);\n }\n\n normalize(): Vector4 {\n const length = this.magnitude();\n\n return new Vector4(this.x / length, this.y / length, this.z / length, this.w / length);\n }\n\n flat(): number[] {\n return [this.x, this.y, this.z, this.w];\n }\n\n clone(): Vector4 {\n return new Vector4(this.x, this.y, this.z, this.w);\n }\n\n toString(): string {\n return `[${this.flat().join(\", \")}]`;\n }\n}\n\nexport { Vector4 };\n","import { CameraData } from \"./CameraData\";\nimport { Object3D } from \"../core/Object3D\";\nimport { Vector3 } from \"../math/Vector3\";\nimport { Vector4 } from \"../math/Vector4\";\n\nclass Camera extends Object3D {\n private _data: CameraData;\n\n screenPointToRay: (x: number, y: number) => Vector3;\n\n // The constructor now accepts an optional initialPosition.\n constructor(cameraData?: CameraData, initialPosition?: Vector3) {\n super();\n\n this._data = cameraData ? cameraData : new CameraData();\n this._position = initialPosition ? initialPosition : new Vector3(1, 1, 5);\n\n this.update = () => {\n this.data.update(this.position, this.rotation);\n };\n\n this.screenPointToRay = (x: number, y: number) => {\n const clipSpaceCoords = new Vector4(x, y, -1, 1);\n const inverseProjectionMatrix = this._data.projectionMatrix.invert();\n const cameraSpaceCoords = clipSpaceCoords.multiply(inverseProjectionMatrix);\n const inverseViewMatrix = this._data.viewMatrix.invert();\n const worldSpaceCoords = cameraSpaceCoords.multiply(inverseViewMatrix);\n const worldSpacePosition = new Vector3(\n worldSpaceCoords.x / worldSpaceCoords.w,\n worldSpaceCoords.y / worldSpaceCoords.w,\n worldSpaceCoords.z / worldSpaceCoords.w,\n );\n const direction = worldSpacePosition.subtract(this.position).normalize();\n return direction;\n };\n }\n\n get data() {\n return this._data;\n }\n}\n\nexport { Camera };\n","import { Object3D } from \"./Object3D\";\nimport { SplatData } from \"../splats/SplatData\";\nimport { Splat } from \"../splats/Splat\";\nimport { EventDispatcher } from \"../events/EventDispatcher\";\nimport { ObjectAddedEvent, ObjectRemovedEvent } from \"../events/Events\";\nimport { Converter } from \"../utils/Converter\";\n\nclass Scene extends EventDispatcher {\n private _objects: Object3D[] = [];\n\n addObject: (object: Object3D) => void;\n removeObject: (object: Object3D) => void;\n findObject: (predicate: (object: Object3D) => boolean) => Object3D | undefined;\n findObjectOfType: (type: { new (): T }) => T | undefined;\n reset: () => void;\n\n constructor() {\n super();\n\n this.addObject = (object: Object3D) => {\n this.objects.push(object);\n this.dispatchEvent(new ObjectAddedEvent(object));\n };\n\n this.removeObject = (object: Object3D) => {\n const index = this.objects.indexOf(object);\n if (index < 0) {\n throw new Error(\"Object not found in scene\");\n }\n this.objects.splice(index, 1);\n this.dispatchEvent(new ObjectRemovedEvent(object));\n };\n\n this.findObject = (predicate: (object: Object3D) => boolean) => {\n for (const object of this.objects) {\n if (predicate(object)) {\n return object;\n }\n }\n return undefined;\n };\n\n this.findObjectOfType = (type: { new (): T }) => {\n for (const object of this.objects) {\n if (object instanceof type) {\n return object;\n }\n }\n return undefined;\n };\n\n this.reset = () => {\n const objectsToRemove = this.objects.slice();\n for (const object of objectsToRemove) {\n this.removeObject(object);\n }\n };\n\n this.reset();\n }\n\n getMergedSceneDataBuffer(format: \"splat\" | \"ply\" = \"splat\"): ArrayBuffer {\n const buffers: Uint8Array[] = [];\n let vertexCount = 0;\n\n for (const object of this.objects) {\n if (object instanceof Splat) {\n const splatClone = object.clone() as Splat;\n\n splatClone.applyRotation();\n splatClone.applyScale();\n splatClone.applyPosition();\n const buffer = splatClone.data.serialize();\n\n buffers.push(buffer);\n vertexCount += splatClone.data.vertexCount;\n }\n }\n\n const mergedSplatData = new Uint8Array(vertexCount * SplatData.RowLength);\n let offset = 0;\n for (const buffer of buffers) {\n mergedSplatData.set(buffer, offset);\n offset += buffer.length;\n }\n\n if (format === \"ply\") {\n return Converter.SplatToPLY(mergedSplatData.buffer, vertexCount);\n }\n\n return mergedSplatData.buffer;\n }\n\n saveToFile(name: string | null = null, format: \"splat\" | \"ply\" = \"splat\") {\n if (!document) return;\n\n if (!name) {\n const now = new Date();\n name = `scene-${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}.${format}`;\n }\n\n const mergedData = this.getMergedSceneDataBuffer(format);\n\n const blob = new Blob([mergedData], { type: \"application/octet-stream\" });\n\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = URL.createObjectURL(blob);\n link.click();\n }\n\n get objects() {\n return this._objects;\n }\n}\n\nexport { Scene };\n","export async function initiateFetchRequest(url: string, useCache: boolean): Promise {\n const req = await fetch(url, {\n mode: \"cors\",\n credentials: \"omit\",\n cache: useCache ? \"force-cache\" : \"default\",\n });\n\n if (req.status != 200) {\n throw new Error(req.status + \" Unable to load \" + req.url);\n }\n\n return req;\n}\n\nexport async function loadDataIntoBuffer(res: Response, onProgress?: (progress: number) => void): Promise {\n const reader = res.body!.getReader();\n\n const contentLength = parseInt(res.headers.get(\"content-length\") as string);\n const buffer = new Uint8Array(contentLength);\n\n let bytesRead = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer.set(value, bytesRead);\n bytesRead += value.length;\n onProgress?.(bytesRead / contentLength);\n }\n\n return buffer;\n}\n\nexport async function loadChunkedDataIntoBuffer(\n res: Response,\n onProgress?: (progress: number) => void,\n): Promise {\n const reader = res.body!.getReader();\n\n const chunks = [];\n let receivedLength = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n chunks.push(value);\n receivedLength += value.length;\n }\n\n const buffer = new Uint8Array(receivedLength);\n let position = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, position);\n position += chunk.length;\n\n onProgress?.(position / receivedLength);\n }\n\n return buffer;\n}\n\nexport async function loadRequestDataIntoBuffer(\n res: Response,\n onProgress?: (progress: number) => void,\n): Promise {\n if (res.headers.has(\"content-length\")) {\n return loadDataIntoBuffer(res, onProgress);\n } else {\n return loadChunkedDataIntoBuffer(res, onProgress);\n }\n}\n","import type { Scene } from \"../core/Scene\";\nimport { Splat } from \"../splats/Splat\";\nimport { SplatData } from \"../splats/SplatData\";\nimport { initiateFetchRequest, loadRequestDataIntoBuffer } from \"../utils/LoaderUtils\";\n\nclass Loader {\n static async LoadAsync(\n url: string,\n scene: Scene,\n onProgress?: (progress: number) => void,\n useCache: boolean = false,\n ): Promise {\n const res: Response = await initiateFetchRequest(url, useCache);\n\n const buffer = await loadRequestDataIntoBuffer(res, onProgress);\n return this.LoadFromArrayBuffer(buffer, scene);\n }\n\n static async LoadFromFileAsync(file: File, scene: Scene, onProgress?: (progress: number) => void): Promise {\n const reader = new FileReader();\n let splat = new Splat();\n reader.onload = (e) => {\n splat = this.LoadFromArrayBuffer(e.target!.result as ArrayBuffer, scene);\n };\n reader.onprogress = (e) => {\n onProgress?.(e.loaded / e.total);\n };\n reader.readAsArrayBuffer(file);\n await new Promise((resolve) => {\n reader.onloadend = () => {\n resolve();\n };\n });\n return splat;\n }\n\n static LoadFromArrayBuffer(arrayBuffer: ArrayBufferLike, scene: Scene): Splat {\n const buffer = new Uint8Array(arrayBuffer);\n const data = SplatData.Deserialize(buffer);\n const splat = new Splat(data);\n scene.addObject(splat);\n return splat;\n }\n}\n\nexport { Loader };\n","import { Scene } from \"../core/Scene\";\nimport { Vector3 } from \"../math/Vector3\";\nimport { Quaternion } from \"../math/Quaternion\";\nimport { SplatData } from \"../splats/SplatData\";\nimport { Splat } from \"../splats/Splat\";\nimport { Converter } from \"../utils/Converter\";\nimport { initiateFetchRequest, loadRequestDataIntoBuffer } from \"../utils/LoaderUtils\";\n\nclass PLYLoader {\n static async LoadAsync(\n url: string,\n scene: Scene,\n onProgress?: (progress: number) => void,\n format: string = \"\",\n useCache: boolean = false,\n ): Promise {\n const res: Response = await initiateFetchRequest(url, useCache);\n\n const plyData = await loadRequestDataIntoBuffer(res, onProgress);\n\n if (plyData[0] !== 112 || plyData[1] !== 108 || plyData[2] !== 121 || plyData[3] !== 10) {\n throw new Error(\"Invalid PLY file\");\n }\n\n return this.LoadFromArrayBuffer(plyData.buffer, scene, format);\n }\n\n static async LoadFromFileAsync(\n file: File,\n scene: Scene,\n onProgress?: (progress: number) => void,\n format: string = \"\",\n ): Promise {\n const reader = new FileReader();\n let splat = new Splat();\n reader.onload = (e) => {\n splat = this.LoadFromArrayBuffer(e.target!.result as ArrayBuffer, scene, format);\n };\n reader.onprogress = (e) => {\n onProgress?.(e.loaded / e.total);\n };\n reader.readAsArrayBuffer(file);\n await new Promise((resolve) => {\n reader.onloadend = () => {\n resolve();\n };\n });\n return splat;\n }\n\n static LoadFromArrayBuffer(arrayBuffer: ArrayBufferLike, scene: Scene, format: string = \"\"): Splat {\n const buffer = new Uint8Array(this._ParsePLYBuffer(arrayBuffer, format));\n const data = SplatData.Deserialize(buffer);\n const splat = new Splat(data);\n scene.addObject(splat);\n return splat;\n }\n\n private static _ParsePLYBuffer(inputBuffer: ArrayBuffer, format: string): ArrayBuffer {\n type PlyProperty = {\n name: string;\n type: string;\n offset: number;\n };\n\n const ubuf = new Uint8Array(inputBuffer);\n const headerText = new TextDecoder().decode(ubuf.slice(0, 1024 * 10));\n const header_end = \"end_header\\n\";\n const header_end_index = headerText.indexOf(header_end);\n if (header_end_index < 0) throw new Error(\"Unable to read .ply file header\");\n\n const vertexCount = parseInt(/element vertex (\\d+)\\n/.exec(headerText)![1]);\n\n let rowOffset = 0;\n const offsets: Record = {\n double: 8,\n int: 4,\n uint: 4,\n float: 4,\n short: 2,\n ushort: 2,\n uchar: 1,\n };\n\n const properties: PlyProperty[] = [];\n for (const prop of headerText\n .slice(0, header_end_index)\n .split(\"\\n\")\n .filter((k) => k.startsWith(\"property \"))) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_p, type, name] = prop.split(\" \");\n properties.push({ name, type, offset: rowOffset });\n \n if (!offsets[type]) throw new Error(`Unsupported property type: ${type}`);\n rowOffset += offsets[type];\n }\n\n const dataView = new DataView(inputBuffer, header_end_index + header_end.length);\n const buffer = new ArrayBuffer(SplatData.RowLength * vertexCount);\n\n const q_polycam = Quaternion.FromEuler(new Vector3(Math.PI / 2, 0, 0));\n\n for (let i = 0; i < vertexCount; i++) {\n const position = new Float32Array(buffer, i * SplatData.RowLength, 3);\n const scale = new Float32Array(buffer, i * SplatData.RowLength + 12, 3);\n const rgba = new Uint8ClampedArray(buffer, i * SplatData.RowLength + 24, 4);\n const rot = new Uint8ClampedArray(buffer, i * SplatData.RowLength + 28, 4);\n\n let r0: number = 255;\n let r1: number = 0;\n let r2: number = 0;\n let r3: number = 0;\n\n properties.forEach((property) => {\n let value;\n switch (property.type) {\n case \"float\":\n value = dataView.getFloat32(property.offset + i * rowOffset, true);\n break;\n case \"int\":\n value = dataView.getInt32(property.offset + i * rowOffset, true);\n break;\n default:\n throw new Error(`Unsupported property type: ${property.type}`);\n }\n\n switch (property.name) {\n case \"x\":\n position[0] = value;\n break;\n case \"y\":\n position[1] = value;\n break;\n case \"z\":\n position[2] = value;\n break;\n case \"scale_0\":\n case \"scaling_0\":\n scale[0] = Math.exp(value);\n break;\n case \"scale_1\":\n case \"scaling_1\":\n scale[1] = Math.exp(value);\n break;\n case \"scale_2\":\n case \"scaling_2\":\n scale[2] = Math.exp(value);\n break;\n case \"red\":\n rgba[0] = value;\n break;\n case \"green\":\n rgba[1] = value;\n break;\n case \"blue\":\n rgba[2] = value;\n break;\n case \"f_dc_0\":\n case \"features_0\":\n rgba[0] = (0.5 + Converter.SH_C0 * value) * 255;\n break;\n case \"f_dc_1\":\n case \"features_1\":\n rgba[1] = (0.5 + Converter.SH_C0 * value) * 255;\n break;\n case \"f_dc_2\":\n case \"features_2\":\n rgba[2] = (0.5 + Converter.SH_C0 * value) * 255;\n break;\n case \"f_dc_3\":\n rgba[3] = (0.5 + Converter.SH_C0 * value) * 255;\n break;\n case \"opacity\":\n case \"opacity_0\":\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\n break;\n case \"rot_0\":\n case \"rotation_0\":\n r0 = value;\n break;\n case \"rot_1\":\n case \"rotation_1\":\n r1 = value;\n break;\n case \"rot_2\":\n case \"rotation_2\":\n r2 = value;\n break;\n case \"rot_3\":\n case \"rotation_3\":\n r3 = value;\n break;\n }\n });\n\n let q = new Quaternion(r1, r2, r3, r0);\n\n switch (format) {\n case \"polycam\": {\n const temp = position[1];\n position[1] = -position[2];\n position[2] = temp;\n q = q_polycam.multiply(q);\n break;\n }\n case \"\":\n break;\n default:\n throw new Error(`Unsupported format: ${format}`);\n }\n\n q = q.normalize();\n rot[0] = q.w * 128 + 128;\n rot[1] = q.x * 128 + 128;\n rot[2] = q.y * 128 + 128;\n rot[3] = q.z * 128 + 128;\n }\n\n return buffer;\n }\n}\n\nexport { PLYLoader };\n","import { Camera } from \"../cameras/Camera\";\nimport type { Scene } from \"../core/Scene\";\nimport { Matrix3 } from \"../math/Matrix3\";\nimport { Quaternion } from \"../math/Quaternion\";\nimport { Vector3 } from \"../math/Vector3\";\nimport { Splatv } from \"../splats/Splatv\";\nimport { SplatvData } from \"../splats/SplatvData\";\nimport { initiateFetchRequest, loadRequestDataIntoBuffer } from \"../utils/LoaderUtils\";\n\nclass SplatvLoader {\n static async LoadAsync(\n url: string,\n scene: Scene,\n camera: Camera | null,\n onProgress?: (progress: number) => void,\n useCache: boolean = false,\n ): Promise {\n const res: Response = await initiateFetchRequest(url, useCache);\n\n const buffer = await loadRequestDataIntoBuffer(res, onProgress);\n return this._ParseSplatvBuffer(buffer.buffer, scene, camera);\n }\n\n static async LoadFromFileAsync(\n file: File,\n scene: Scene,\n camera: Camera | null,\n onProgress?: (progress: number) => void,\n ): Promise {\n const reader = new FileReader();\n let splatv: Splatv | null = null;\n reader.onload = (e) => {\n splatv = this._ParseSplatvBuffer(e.target!.result as ArrayBuffer, scene, camera);\n };\n reader.onprogress = (e) => {\n onProgress?.(e.loaded / e.total);\n };\n reader.readAsArrayBuffer(file);\n await new Promise((resolve) => {\n reader.onloadend = () => {\n resolve();\n };\n });\n if (!splatv) {\n throw new Error(\"Failed to load splatv file\");\n }\n return splatv;\n }\n\n private static _ParseSplatvBuffer(inputBuffer: ArrayBuffer, scene: Scene, camera: Camera | null): Splatv {\n let result: Splatv | null = null;\n\n const handleChunk = (\n chunk: { size: number; type: string; texwidth: number; texheight: number },\n buffer: Uint8Array,\n chunks: { size: number; type: string }[],\n ) => {\n if (chunk.type === \"magic\") {\n const intView = new Int32Array(buffer.buffer);\n if (intView[0] !== 0x674b) {\n throw new Error(\"Invalid splatv file\");\n }\n chunks.push({ size: intView[1], type: \"chunks\" });\n } else if (chunk.type === \"chunks\") {\n const splatChunks = JSON.parse(new TextDecoder(\"utf-8\").decode(buffer));\n if (splatChunks.length == 0) {\n throw new Error(\"Invalid splatv file\");\n } else if (splatChunks.length > 1) {\n console.warn(\"Splatv file contains more than one chunk, only the first one will be loaded\");\n }\n const chunk = splatChunks[0];\n const cameras = chunk.cameras as { position: number[]; rotation: number[][] }[];\n if (camera && cameras && cameras.length) {\n const cameraData = cameras[0];\n const position = new Vector3(\n cameraData.position[0],\n cameraData.position[1],\n cameraData.position[2],\n );\n const rotation = Quaternion.FromMatrix3(\n new Matrix3(\n cameraData.rotation[0][0],\n cameraData.rotation[0][1],\n cameraData.rotation[0][2],\n cameraData.rotation[1][0],\n cameraData.rotation[1][1],\n cameraData.rotation[1][2],\n cameraData.rotation[2][0],\n cameraData.rotation[2][1],\n cameraData.rotation[2][2],\n ),\n );\n camera.position = position;\n camera.rotation = rotation;\n }\n chunks.push(chunk);\n } else if (chunk.type === \"splat\") {\n const data = SplatvData.Deserialize(buffer, chunk.texwidth, chunk.texheight);\n const splatv = new Splatv(data);\n scene.addObject(splatv);\n result = splatv;\n }\n };\n\n const ubuf = new Uint8Array(inputBuffer);\n const chunks: { size: number; type: string; texwidth: number; texheight: number }[] = [\n { size: 8, type: \"magic\", texwidth: 0, texheight: 0 },\n ];\n let chunk: { size: number; type: string; texwidth: number; texheight: number } | undefined = chunks.shift();\n let buffer = new Uint8Array(chunk!.size);\n let offset = 0;\n let inputOffset = 0;\n while (chunk) {\n while (offset < chunk.size) {\n const sizeToRead = Math.min(chunk.size - offset, ubuf.length - inputOffset);\n buffer.set(ubuf.subarray(inputOffset, inputOffset + sizeToRead), offset);\n offset += sizeToRead;\n inputOffset += sizeToRead;\n }\n handleChunk(chunk, buffer, chunks);\n if (result) {\n return result;\n }\n chunk = chunks.shift();\n if (chunk) {\n buffer = new Uint8Array(chunk.size);\n offset = 0;\n }\n }\n\n throw new Error(\"Invalid splatv file\");\n }\n}\n\nexport { SplatvLoader };\n","import { Camera } from \"../../../cameras/Camera\";\nimport { Scene } from \"../../../core/Scene\";\nimport { WebGLRenderer } from \"../../WebGLRenderer\";\nimport { ShaderPass } from \"../passes/ShaderPass\";\n\nabstract class ShaderProgram {\n private _renderer: WebGLRenderer;\n private _program: WebGLProgram;\n private _passes: ShaderPass[];\n\n protected _scene: Scene | null = null;\n protected _camera: Camera | null = null;\n protected _started: boolean = false;\n protected _initialized: boolean = false;\n\n protected abstract _initialize: () => void;\n protected abstract _resize: () => void;\n protected abstract _render: () => void;\n protected abstract _dispose: () => void;\n\n initialize: () => void;\n resize: () => void;\n render: (scene: Scene, camera: Camera) => void;\n dispose: () => void;\n\n constructor(renderer: WebGLRenderer, passes: ShaderPass[]) {\n this._renderer = renderer;\n const gl = renderer.gl;\n\n this._program = gl.createProgram() as WebGLProgram;\n this._passes = passes || [];\n\n const vertexShader = gl.createShader(gl.VERTEX_SHADER) as WebGLShader;\n gl.shaderSource(vertexShader, this._getVertexSource());\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(vertexShader));\n }\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER) as WebGLShader;\n gl.shaderSource(fragmentShader, this._getFragmentSource());\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(fragmentShader));\n }\n\n gl.attachShader(this.program, vertexShader);\n gl.attachShader(this.program, fragmentShader);\n gl.linkProgram(this.program);\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(this.program));\n }\n\n this.resize = () => {\n gl.useProgram(this._program);\n\n this._resize();\n };\n\n this.initialize = () => {\n console.assert(!this._initialized, \"ShaderProgram already initialized\");\n\n gl.useProgram(this._program);\n\n this._initialize();\n for (const pass of this.passes) {\n pass.initialize(this);\n }\n\n this._initialized = true;\n this._started = true;\n };\n\n this.render = (scene: Scene, camera: Camera) => {\n gl.useProgram(this._program);\n\n if (this._scene !== scene || this._camera !== camera) {\n this.dispose();\n this._scene = scene;\n this._camera = camera;\n this.initialize();\n }\n\n for (const pass of this.passes) {\n pass.render();\n }\n\n this._render();\n };\n\n this.dispose = () => {\n if (!this._initialized) return;\n\n gl.useProgram(this._program);\n\n for (const pass of this.passes) {\n pass.dispose();\n }\n\n this._dispose();\n\n this._scene = null;\n this._camera = null;\n this._initialized = false;\n };\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get scene() {\n return this._scene;\n }\n\n get camera() {\n return this._camera;\n }\n\n get program() {\n return this._program;\n }\n\n get passes() {\n return this._passes;\n }\n\n get started() {\n return this._started;\n }\n\n protected abstract _getVertexSource(): string;\n protected abstract _getFragmentSource(): string;\n}\n\nexport { ShaderProgram };\n","var loadWasm = (() => {\r\n var _scriptName = import.meta.url;\r\n \r\n return (\r\nasync function(moduleArg = {}) {\r\n var moduleRtn;\r\n\r\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var scriptDirectory=\"\";var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith(\"blob:\")){scriptDirectory=\"\"}else{scriptDirectory=scriptDirectory.slice(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{var response=await fetch(url,{credentials:\"same-origin\"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+\" : \"+response.url)}}}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];var wasmBinary=Module[\"wasmBinary\"];var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b);Module[\"HEAP64\"]=HEAP64=new BigInt64Array(b);Module[\"HEAPU64\"]=HEAPU64=new BigUint64Array(b)}function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports[\"m\"]()}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module[\"monitorRunDependencies\"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module[\"monitorRunDependencies\"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module[\"onAbort\"]?.(what);what=\"Aborted(\"+what+\")\";err(what);ABORT=true;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile=\"data:application/octet-stream;base64,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AkcNASABQQE6ADYPCyAAKAIIIgAgASACIAMgBCAAKAIAKAIYEQIACwsxACAAIAEoAghBABALBEAgASACIAMQFA8LIAAoAggiACABIAIgAyAAKAIAKAIcEQAACxgAIAAgASgCCEEAEAsEQCABIAIgAxAUCwulBQEGfyMAQdAAayIEJAACQAJ/QQEgACABQQAQCw0AGkEAIAFFDQAaIwBBEGsiBiQAIAYgASgCACIDQQhrKAIAIgU2AgwgBiABIAVqNgIEIAYgA0EEaygCADYCCCAGKAIIIgNByAhBABALIQUgBigCBCEHAkAgBQRAIAYoAgwhASMAQUBqIgMkACADQUBrJABBACAHIAEbIQMMAQsgAyEFIwBBQGoiAyQAIAEgB04EQCADQgA3AhwgA0IANwIkIANCADcCLCADQgA3AhQgA0EANgIQIANByAg2AgwgAyAFNgIEIANBADYCPCADQoGAgICAgICAATcCNCADIAE2AgggBSADQQRqIAcgB0EBQQAgBSgCACgCFBEDACABQQAgAygCHBshCAsgA0FAayQAIAgiAw0AIwBBQGoiAyQAIANBADYCECADQZgINgIMIAMgATYCCCADQcgINgIEQQAhASADQRRqQQBBJ/wLACADQQA2AjwgA0EBOgA7IAUgA0EEaiAHQQFBACAFKAIAKAIYEQIAAkACQAJAIAMoAigOAgABAgsgAygCGEEAIAMoAiRBAUYbQQAgAygCIEEBRhtBACADKAIsQQFGGyEBDAELIAMoAhxBAUcEQCADKAIsDQEgAygCIEEBRw0BIAMoAiRBAUcNAQsgAygCFCEBCyADQUBrJAAgASEDCyAGQRBqJABBACADRQ0AGiACKAIAIgFFDQEgBEEYakEAQTj8CwAgBEEBOgBLIARBfzYCICAEIAA2AhwgBCADNgIUIARBATYCRCADIARBFGogAUEBIAMoAgAoAhwRAAAgBCgCLCIAQQFGBEAgAiAEKAIkNgIACyAAQQFGCyAEQdAAaiQADwsgBEHPCjYCCCAEQeUDNgIEIARBuQk2AgAQCQALCgAgACABQQAQCwsEACAACwvbEQIAQYAIC8oRBAkAAAgEAABTdDl0eXBlX2luZm8AAAAALAkAACQEAAAABAAATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAAAAALAkAAFQEAAAYBAAATjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9FAHVuc2lnbmVkIHNob3J0AHVuc2lnbmVkIGludABmbG9hdAB1aW50NjRfdAAlczolZDogJXMAdW5zaWduZWQgY2hhcgAvZW1zZGsvZW1zY3JpcHRlbi9zeXN0ZW0vbGliL2xpYmN4eGFiaS9zcmMvcHJpdmF0ZV90eXBlaW5mby5jcHAAYm9vbAB1bnNpZ25lZCBsb25nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBkb3VibGUAdm9pZABjYXRjaGluZyBhIGNsYXNzIHdpdGhvdXQgYW4gb2JqZWN0PwBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxmbG9hdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgbG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZG91YmxlPgAAAAAAAAAAFAgAAAEAAAACAAAAAwAAAAQAAAAFAAAALAkAACAIAAAYBAAATjEwX19jeHhhYml2MTIzX19mdW5kYW1lbnRhbF90eXBlX2luZm9FAAAIAABQCAAAdgAAAAAIAABcCAAAYgAAAAAIAABoCAAAYwAAAAAIAAB0CAAAaAAAAAAIAACACAAAYQAAAAAIAACMCAAAcwAAAAAIAACYCAAAdAAAAAAIAACkCAAAaQAAAAAIAACwCAAAagAAAAAIAAC8CAAAbAAAAAAIAADICAAAbQAAAAAIAADUCAAAeAAAAAAIAADgCAAAeQAAAAAIAADsCAAAZgAAAAAIAAD4CAAAZAAAAAAAAABIBAAAAQAAAAYAAAADAAAABAAAAAcAAAAIAAAACQAAAAoAAAAAAAAATAkAAAEAAAALAAAAAwAAAAQAAAAHAAAADAAAAA0AAAAOAAAALAkAAFgJAABIBAAATjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FAAAAAAQJAACICQAATlN0M19fMjEyYmFzaWNfc3RyaW5nSWNOU18xMWNoYXJfdHJhaXRzSWNFRU5TXzlhbGxvY2F0b3JJY0VFRUUAAAQJAADQCQAATlN0M19fMjEyYmFzaWNfc3RyaW5nSXdOU18xMWNoYXJfdHJhaXRzSXdFRU5TXzlhbGxvY2F0b3JJd0VFRUUAAAQJAAAYCgAATlN0M19fMjEyYmFzaWNfc3RyaW5nSURzTlNfMTFjaGFyX3RyYWl0c0lEc0VFTlNfOWFsbG9jYXRvcklEc0VFRUUAAAAECQAAZAoAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0lEaU5TXzExY2hhcl90cmFpdHNJRGlFRU5TXzlhbGxvY2F0b3JJRGlFRUVFAAAABAkAALAKAABOMTBlbXNjcmlwdGVuM3ZhbEUAAAQJAADMCgAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJY0VFAAAECQAA9AoAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWFFRQAABAkAABwLAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0loRUUAAAQJAABECwAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJc0VFAAAECQAAbAsAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SXRFRQAABAkAAJQLAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lpRUUAAAQJAAC8CwAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJakVFAAAECQAA5AsAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWxFRQAABAkAAAwMAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0ltRUUAAAQJAAA0DAAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJeEVFAAAECQAAXAwAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SXlFRQAABAkAAIQMAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lmRUUAAAQJAACsDAAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJZEVFAEHMGQsD0A4B\";function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}async function getWasmBinary(binaryFile){return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports[\"l\"];updateMemoryViews();removeRunDependency(\"wasm-instantiate\");return wasmExports}addRunDependency(\"wasm-instantiate\");function receiveInstantiationResult(result){return receiveInstance(result[\"instance\"])}var info=getWasmImports();if(Module[\"instantiateWasm\"]){return new Promise((resolve,reject)=>{Module[\"instantiateWasm\"](info,(mod,inst)=>{receiveInstance(mod,inst);resolve(mod.exports)})})}try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}class ExitStatus{name=\"ExitStatus\";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.unshift(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.unshift(cb);var noExitRuntime=Module[\"noExitRuntime\"]||true;var base64Decode=b64=>{var b1,b2,i=0,j=0,bLength=b64.length;var output=new Uint8Array((bLength*3>>2)-(b64[bLength-2]==\"=\")-(b64[bLength-1]==\"=\"));for(;i>4;output[j+1]=b1<<4|b2>>2;output[j+2]=b2<<6|base64ReverseLookup[b64.charCodeAt(i+3)]}return output};var isDataURI=filename=>filename.startsWith(dataURIPrefix);var dataURIPrefix=\"data:application/octet-stream;base64,\";var tryParseAsDataURI=filename=>{if(isDataURI(filename)){return base64Decode(filename.slice(dataURIPrefix.length))}};var __abort_js=()=>abort(\"\");var embindRepr=v=>{if(v===null){return\"null\"}var t=typeof v;if(t===\"object\"||t===\"array\"||t===\"function\"){return v.toString()}else{return\"\"+v}};var embind_init_charCodes=()=>{var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes};var embind_charCodes;var readLatin1String=ptr=>{var ret=\"\";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret};var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var BindingError;var throwBindingError=message=>{throw new BindingError(message)};var InternalError;function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type \"${name}\" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){return sharedRegisterType(rawType,registeredInstance,options)}var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];case 8:return signed?pointer=>HEAP64[pointer>>3]:pointer=>HEAPU64[pointer>>3];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);var isUnsignedType=name.indexOf(\"u\")!=-1;if(isUnsignedType){maxRange=(1n<<64n)-1n}registerType(primitiveType,{name,fromWireType:value=>value,toWireType:function(destructors,value){if(typeof value!=\"bigint\"&&typeof value!=\"number\"){throw new TypeError(`Cannot convert \"${embindRepr(value)}\" to ${this.name}`)}if(typeof value==\"number\"){value=BigInt(value)}return value},argPackAdvance:GenericWireTypeSize,readValueFromPointer:integerReadValueFromPointer(name,size,!isUnsignedType),destructorFunction:null})};var GenericWireTypeSize=8;var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=readLatin1String(name);registerType(rawType,{name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},argPackAdvance:GenericWireTypeSize,readValueFromPointer:function(pointer){return this[\"fromWireType\"](HEAPU8[pointer])},destructorFunction:null})};var emval_freelist=[];var emval_handles=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){emval_handles[handle]=undefined;emval_freelist.push(handle)}};var count_emval_handles=()=>emval_handles.length/2-5-emval_freelist.length;var init_emval=()=>{emval_handles.push(0,1,undefined,1,null,1,true,1,false,1);Module[\"count_emval_handles\"]=count_emval_handles};var Emval={toValue:handle=>{if(!handle){throwBindingError(\"Cannot use deleted val. handle = \"+handle)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};function readPointer(pointer){return this[\"fromWireType\"](HEAPU32[pointer>>2])}var EmValType={name:\"emscripten::val\",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this[\"fromWireType\"](HEAPF32[pointer>>2])};case 8:return function(pointer){return this[\"fromWireType\"](HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=readLatin1String(name);registerType(rawType,{name,fromWireType:value=>value,toWireType:(destructors,value)=>value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes(\"unsigned\");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name,fromWireType,toWireType,argPackAdvance:GenericWireTypeSize,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name,fromWireType:decodeMemoryView,argPackAdvance:GenericWireTypeSize,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\";var __embind_register_std_string=(rawType,name)=>{name=readLatin1String(name);var stdStringIsUTF8=true;registerType(rawType,{name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(base);throwBindingError(\"String has UTF-16 code units that do not fit in 8 bits\")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str=\"\";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str=\"\";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=readLatin1String(name);var decodeString,encodeString,readCharAt,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;readCharAt=pointer=>HEAPU16[pointer>>1]}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;readCharAt=pointer=>HEAPU32[pointer>>2]}registerType(rawType,{name,fromWireType:value=>{var length=HEAPU32[value>>2];var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||readCharAt(currentBytePtr)==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value==\"string\")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_void=(rawType,name)=>{name=readLatin1String(name);registerType(rawType,{isVoid:true,name,argPackAdvance:0,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};for(var base64ReverseLookup=new Uint8Array(123),i=25;i>=0;--i){base64ReverseLookup[48+i]=52+i;base64ReverseLookup[65+i]=i;base64ReverseLookup[97+i]=26+i}base64ReverseLookup[43]=62;base64ReverseLookup[47]=63;embind_init_charCodes();BindingError=Module[\"BindingError\"]=class BindingError extends Error{constructor(message){super(message);this.name=\"BindingError\"}};InternalError=Module[\"InternalError\"]=class InternalError extends Error{constructor(message){super(message);this.name=\"InternalError\"}};init_emval();var wasmImports={j:__abort_js,e:__embind_register_bigint,h:__embind_register_bool,f:__embind_register_emval,d:__embind_register_float,b:__embind_register_integer,a:__embind_register_memory_view,g:__embind_register_std_string,c:__embind_register_std_wstring,i:__embind_register_void,k:_emscripten_resize_heap};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports[\"m\"];var _pack=Module[\"_pack\"]=wasmExports[\"n\"];var _malloc=Module[\"_malloc\"]=wasmExports[\"o\"];var _free=Module[\"_free\"]=wasmExports[\"p\"];function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module[\"onRuntimeInitialized\"]?.();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(()=>{setTimeout(()=>Module[\"setStatus\"](\"\"),1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();moduleRtn=readyPromise;\r\n\r\n\r\n return moduleRtn;\r\n}\r\n);\r\n})();\r\nexport default loadWasm;\r\n","import { Scene } from \"../../../core/Scene\";\nimport { Splat } from \"../../../splats/Splat\";\nimport DataWorker from \"web-worker:./DataWorker.ts\";\nimport loadWasm from \"../../../wasm/data\";\nimport { Matrix4 } from \"../../../math/Matrix4\";\n\nclass RenderData {\n public dataChanged = false;\n public transformsChanged = false;\n public colorTransformsChanged = false;\n\n private _splatIndices: Map;\n private _offsets: Map;\n private _data: Uint32Array;\n private _width: number;\n private _height: number;\n private _transforms: Float32Array;\n private _transformsWidth: number;\n private _transformsHeight: number;\n private _transformIndices: Uint32Array;\n private _transformIndicesWidth: number;\n private _transformIndicesHeight: number;\n private _colorTransforms: Float32Array;\n private _colorTransformsWidth: number;\n private _colorTransformsHeight: number;\n private _colorTransformIndices: Uint32Array;\n private _colorTransformIndicesWidth: number;\n private _colorTransformIndicesHeight: number;\n private _positions: Float32Array;\n private _rotations: Float32Array;\n private _scales: Float32Array;\n private _vertexCount: number;\n private _updating: Set = new Set();\n private _dirty: Set = new Set();\n private _worker: Worker;\n\n getSplat: (index: number) => Splat | null;\n getLocalIndex: (splat: Splat, index: number) => number;\n markDirty: (splat: Splat) => void;\n rebuild: () => void;\n dispose: () => void;\n\n constructor(scene: Scene) {\n let vertexCount = 0;\n let splatIndex = 0;\n this._splatIndices = new Map();\n this._offsets = new Map();\n const lookup = new Map();\n for (const object of scene.objects) {\n if (object instanceof Splat) {\n this._splatIndices.set(object, splatIndex);\n this._offsets.set(object, vertexCount);\n lookup.set(vertexCount, object);\n vertexCount += object.data.vertexCount;\n splatIndex++;\n }\n }\n\n this._vertexCount = vertexCount;\n this._width = 2048;\n this._height = Math.ceil((2 * this.vertexCount) / this.width);\n this._data = new Uint32Array(this.width * this.height * 4);\n\n this._transformsWidth = 5;\n this._transformsHeight = lookup.size;\n this._transforms = new Float32Array(this._transformsWidth * this._transformsHeight * 4);\n\n this._transformIndicesWidth = 1024;\n this._transformIndicesHeight = Math.ceil(this.vertexCount / this._transformIndicesWidth);\n this._transformIndices = new Uint32Array(this._transformIndicesWidth * this._transformIndicesHeight);\n\n this._colorTransformsWidth = 4;\n this._colorTransformsHeight = 64;\n this._colorTransforms = new Float32Array(this._colorTransformsWidth * this._colorTransformsHeight * 4);\n this._colorTransforms.fill(0);\n this._colorTransforms[0] = 1;\n this._colorTransforms[5] = 1;\n this._colorTransforms[10] = 1;\n this._colorTransforms[15] = 1;\n\n this._colorTransformIndicesWidth = 1024;\n this._colorTransformIndicesHeight = Math.ceil(this.vertexCount / this._colorTransformIndicesWidth);\n this._colorTransformIndices = new Uint32Array(\n this._colorTransformIndicesWidth * this._colorTransformIndicesHeight,\n );\n this.colorTransformIndices.fill(0);\n\n this._positions = new Float32Array(this.vertexCount * 3);\n this._rotations = new Float32Array(this.vertexCount * 4);\n this._scales = new Float32Array(this.vertexCount * 3);\n\n this._worker = new DataWorker();\n\n const updateTransform = (splat: Splat) => {\n const splatIndex = this._splatIndices.get(splat) as number;\n this._transforms.set(splat.transform.buffer, splatIndex * 20);\n this._transforms[splatIndex * 20 + 16] = splat.selected ? 1 : 0;\n splat.positionChanged = false;\n splat.rotationChanged = false;\n splat.scaleChanged = false;\n splat.selectedChanged = false;\n this.transformsChanged = true;\n };\n\n const updateColorTransforms = () => {\n let colorTransformsChanged = false;\n for (const splat of this._splatIndices.keys()) {\n if (splat.colorTransformChanged) {\n colorTransformsChanged = true;\n break;\n }\n }\n if (!colorTransformsChanged) {\n return;\n }\n const colorTransformsMap: Matrix4[] = [new Matrix4()];\n this._colorTransformIndices.fill(0);\n let i = 1;\n for (const splat of this._splatIndices.keys()) {\n const offset = this._offsets.get(splat) as number;\n for (const colorTransform of splat.colorTransforms) {\n if (!colorTransformsMap.includes(colorTransform)) {\n colorTransformsMap.push(colorTransform);\n i++;\n }\n }\n for (const index of splat.colorTransformsMap.keys()) {\n const colorTransformIndex = splat.colorTransformsMap.get(index) as number;\n this._colorTransformIndices[index + offset] = colorTransformIndex + i - 1;\n }\n splat.colorTransformChanged = false;\n }\n for (let index = 0; index < colorTransformsMap.length; index++) {\n const colorTransform = colorTransformsMap[index];\n this._colorTransforms.set(colorTransform.buffer, index * 16);\n }\n this.colorTransformsChanged = true;\n };\n\n this._worker.onmessage = (e) => {\n if (e.data.response) {\n const response = e.data.response;\n const splat = lookup.get(response.offset) as Splat;\n updateTransform(splat);\n updateColorTransforms();\n\n const splatIndex = this._splatIndices.get(splat) as number;\n for (let i = 0; i < splat.data.vertexCount; i++) {\n this._transformIndices[response.offset + i] = splatIndex;\n }\n\n this._data.set(response.data, response.offset * 8);\n splat.data.reattach(\n response.positions,\n response.rotations,\n response.scales,\n response.colors,\n response.selection,\n );\n\n this._positions.set(response.worldPositions, response.offset * 3);\n this._rotations.set(response.worldRotations, response.offset * 4);\n this._scales.set(response.worldScales, response.offset * 3);\n\n this._updating.delete(splat);\n\n splat.selectedChanged = false;\n\n this.dataChanged = true;\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let wasmModule: any;\n\n async function initWasm() {\n wasmModule = await loadWasm();\n }\n\n initWasm();\n\n async function waitForWasm() {\n while (!wasmModule) {\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\n\n const buildImmediate = (splat: Splat) => {\n if (!wasmModule) {\n waitForWasm().then(() => {\n buildImmediate(splat);\n });\n return;\n }\n\n updateTransform(splat);\n\n const positionsPtr = wasmModule._malloc(3 * splat.data.vertexCount * 4);\n const rotationsPtr = wasmModule._malloc(4 * splat.data.vertexCount * 4);\n const scalesPtr = wasmModule._malloc(3 * splat.data.vertexCount * 4);\n const colorsPtr = wasmModule._malloc(4 * splat.data.vertexCount);\n const selectionPtr = wasmModule._malloc(splat.data.vertexCount);\n const dataPtr = wasmModule._malloc(8 * splat.data.vertexCount * 4);\n const worldPositionsPtr = wasmModule._malloc(3 * splat.data.vertexCount * 4);\n const worldRotationsPtr = wasmModule._malloc(4 * splat.data.vertexCount * 4);\n const worldScalesPtr = wasmModule._malloc(3 * splat.data.vertexCount * 4);\n\n wasmModule.HEAPF32.set(splat.data.positions, positionsPtr / 4);\n wasmModule.HEAPF32.set(splat.data.rotations, rotationsPtr / 4);\n wasmModule.HEAPF32.set(splat.data.scales, scalesPtr / 4);\n wasmModule.HEAPU8.set(splat.data.colors, colorsPtr);\n wasmModule.HEAPU8.set(splat.data.selection, selectionPtr);\n\n wasmModule._pack(\n splat.selected,\n splat.data.vertexCount,\n positionsPtr,\n rotationsPtr,\n scalesPtr,\n colorsPtr,\n selectionPtr,\n dataPtr,\n worldPositionsPtr,\n worldRotationsPtr,\n worldScalesPtr,\n );\n\n const outData = new Uint32Array(wasmModule.HEAPU32.buffer, dataPtr, splat.data.vertexCount * 8);\n const worldPositions = new Float32Array(\n wasmModule.HEAPF32.buffer,\n worldPositionsPtr,\n splat.data.vertexCount * 3,\n );\n const worldRotations = new Float32Array(\n wasmModule.HEAPF32.buffer,\n worldRotationsPtr,\n splat.data.vertexCount * 4,\n );\n const worldScales = new Float32Array(wasmModule.HEAPF32.buffer, worldScalesPtr, splat.data.vertexCount * 3);\n\n const splatIndex = this._splatIndices.get(splat) as number;\n const offset = this._offsets.get(splat) as number;\n for (let i = 0; i < splat.data.vertexCount; i++) {\n this._transformIndices[offset + i] = splatIndex;\n }\n this._data.set(outData, offset * 8);\n this._positions.set(worldPositions, offset * 3);\n this._rotations.set(worldRotations, offset * 4);\n this._scales.set(worldScales, offset * 3);\n\n wasmModule._free(positionsPtr);\n wasmModule._free(rotationsPtr);\n wasmModule._free(scalesPtr);\n wasmModule._free(colorsPtr);\n wasmModule._free(selectionPtr);\n wasmModule._free(dataPtr);\n wasmModule._free(worldPositionsPtr);\n wasmModule._free(worldRotationsPtr);\n wasmModule._free(worldScalesPtr);\n\n this.dataChanged = true;\n this.colorTransformsChanged = true;\n };\n\n const build = (splat: Splat) => {\n if (splat.positionChanged || splat.rotationChanged || splat.scaleChanged || splat.selectedChanged) {\n updateTransform(splat);\n }\n\n if (splat.colorTransformChanged) {\n updateColorTransforms();\n }\n\n if (!splat.data.changed || splat.data.detached) return;\n\n const serializedSplat = {\n position: new Float32Array(splat.position.flat()),\n rotation: new Float32Array(splat.rotation.flat()),\n scale: new Float32Array(splat.scale.flat()),\n selected: splat.selected,\n vertexCount: splat.data.vertexCount,\n positions: splat.data.positions,\n rotations: splat.data.rotations,\n scales: splat.data.scales,\n colors: splat.data.colors,\n selection: splat.data.selection,\n offset: this._offsets.get(splat) as number,\n };\n\n this._worker.postMessage(\n {\n splat: serializedSplat,\n },\n [\n serializedSplat.position.buffer,\n serializedSplat.rotation.buffer,\n serializedSplat.scale.buffer,\n serializedSplat.positions.buffer,\n serializedSplat.rotations.buffer,\n serializedSplat.scales.buffer,\n serializedSplat.colors.buffer,\n serializedSplat.selection.buffer,\n ],\n );\n\n this._updating.add(splat);\n\n splat.data.detached = true;\n };\n\n this.getSplat = (index: number) => {\n let splat = null;\n for (const [key, value] of this._offsets) {\n if (index >= value) {\n splat = key;\n } else {\n break;\n }\n }\n return splat;\n };\n\n this.getLocalIndex = (splat: Splat, index: number) => {\n const offset = this._offsets.get(splat) as number;\n return index - offset;\n };\n\n this.markDirty = (splat: Splat) => {\n this._dirty.add(splat);\n };\n\n this.rebuild = () => {\n for (const splat of this._dirty) {\n build(splat);\n }\n\n this._dirty.clear();\n };\n\n this.dispose = () => {\n this._worker.terminate();\n };\n\n for (const splat of this._splatIndices.keys()) {\n buildImmediate(splat);\n }\n\n updateColorTransforms();\n }\n\n get offsets() {\n return this._offsets;\n }\n\n get data() {\n return this._data;\n }\n\n get width() {\n return this._width;\n }\n\n get height() {\n return this._height;\n }\n\n get transforms() {\n return this._transforms;\n }\n\n get transformsWidth() {\n return this._transformsWidth;\n }\n\n get transformsHeight() {\n return this._transformsHeight;\n }\n\n get transformIndices() {\n return this._transformIndices;\n }\n\n get transformIndicesWidth() {\n return this._transformIndicesWidth;\n }\n\n get transformIndicesHeight() {\n return this._transformIndicesHeight;\n }\n\n get colorTransforms() {\n return this._colorTransforms;\n }\n\n get colorTransformsWidth() {\n return this._colorTransformsWidth;\n }\n\n get colorTransformsHeight() {\n return this._colorTransformsHeight;\n }\n\n get colorTransformIndices() {\n return this._colorTransformIndices;\n }\n\n get colorTransformIndicesWidth() {\n return this._colorTransformIndicesWidth;\n }\n\n get colorTransformIndicesHeight() {\n return this._colorTransformIndicesHeight;\n }\n\n get positions() {\n return this._positions;\n }\n\n get rotations() {\n return this._rotations;\n }\n\n get scales() {\n return this._scales;\n }\n\n get vertexCount() {\n return this._vertexCount;\n }\n\n get needsRebuild() {\n return this._dirty.size > 0;\n }\n\n get updating() {\n return this._updating.size > 0;\n }\n}\n\nexport { RenderData };\n","class Color32 {\n public readonly r: number;\n public readonly g: number;\n public readonly b: number;\n public readonly a: number;\n\n constructor(r: number = 0, g: number = 0, b: number = 0, a: number = 255) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n }\n\n flat(): number[] {\n return [this.r, this.g, this.b, this.a];\n }\n\n flatNorm(): number[] {\n return [this.r / 255, this.g / 255, this.b / 255, this.a / 255];\n }\n\n toHexString(): string {\n return (\n \"#\" +\n this.flat()\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n );\n }\n\n toString(): string {\n return `[${this.flat().join(\", \")}]`;\n }\n}\n\nexport { Color32 };\n","import SortWorker from \"web-worker:../utils/SortWorker.ts\";\n\nimport { ShaderProgram } from \"./ShaderProgram\";\nimport { ShaderPass } from \"../passes/ShaderPass\";\nimport { RenderData } from \"../utils/RenderData\";\nimport { Color32 } from \"../../../math/Color32\";\nimport { ObjectAddedEvent, ObjectChangedEvent, ObjectRemovedEvent } from \"../../../events/Events\";\nimport { Splat } from \"../../../splats/Splat\";\nimport { WebGLRenderer } from \"../../WebGLRenderer\";\nimport { Scene } from \"../../../core/Scene\"\n\nconst vertexShaderSource = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n\nuniform highp usampler2D u_texture;\nuniform highp sampler2D u_transforms;\nuniform highp usampler2D u_transformIndices;\nuniform highp sampler2D u_colorTransforms;\nuniform highp usampler2D u_colorTransformIndices;\nuniform mat4 projection, view;\nuniform vec2 focal;\nuniform vec2 viewport;\n\nuniform bool useDepthFade;\nuniform float depthFade;\n\nin vec2 position;\nin int index;\n\nout vec4 vColor;\nout vec2 vPosition;\nout float vSize;\nout float vSelected;\n\nvoid main () {\n uvec4 cen = texelFetch(u_texture, ivec2((uint(index) & 0x3ffu) << 1, uint(index) >> 10), 0);\n float selected = float((cen.w >> 24) & 0xffu);\n\n uint transformIndex = texelFetch(u_transformIndices, ivec2(uint(index) & 0x3ffu, uint(index) >> 10), 0).x;\n mat4 transform = mat4(\n texelFetch(u_transforms, ivec2(0, transformIndex), 0),\n texelFetch(u_transforms, ivec2(1, transformIndex), 0),\n texelFetch(u_transforms, ivec2(2, transformIndex), 0),\n texelFetch(u_transforms, ivec2(3, transformIndex), 0)\n );\n\n if (selected < 0.5) {\n selected = texelFetch(u_transforms, ivec2(4, transformIndex), 0).x;\n }\n\n mat4 viewTransform = view * transform;\n\n vec4 cam = viewTransform * vec4(uintBitsToFloat(cen.xyz), 1);\n vec4 pos2d = projection * cam;\n\n float clip = 1.2 * pos2d.w;\n if (pos2d.z < -pos2d.w || pos2d.z > pos2d.w || pos2d.x < -clip || pos2d.x > clip || pos2d.y < -clip || pos2d.y > clip) {\n gl_Position = vec4(0.0, 0.0, 2.0, 1.0);\n return;\n }\n\n uvec4 cov = texelFetch(u_texture, ivec2(((uint(index) & 0x3ffu) << 1) | 1u, uint(index) >> 10), 0);\n vec2 u1 = unpackHalf2x16(cov.x), u2 = unpackHalf2x16(cov.y), u3 = unpackHalf2x16(cov.z);\n mat3 Vrk = mat3(u1.x, u1.y, u2.x, u1.y, u2.y, u3.x, u2.x, u3.x, u3.y);\n\n mat3 J = mat3(\n focal.x / cam.z, 0., -(focal.x * cam.x) / (cam.z * cam.z), \n 0., -focal.y / cam.z, (focal.y * cam.y) / (cam.z * cam.z), \n 0., 0., 0.\n );\n\n mat3 T = transpose(mat3(viewTransform)) * J;\n mat3 cov2d = transpose(T) * Vrk * T;\n\n //ref: https://github.com/graphdeco-inria/diff-gaussian-rasterization/blob/main/cuda_rasterizer/forward.cu#L110-L111\n cov2d[0][0] += 0.3;\n cov2d[1][1] += 0.3;\n\n float mid = (cov2d[0][0] + cov2d[1][1]) / 2.0;\n float radius = length(vec2((cov2d[0][0] - cov2d[1][1]) / 2.0, cov2d[0][1]));\n float lambda1 = mid + radius, lambda2 = mid - radius;\n\n if (lambda2 < 0.0) return;\n vec2 diagonalVector = normalize(vec2(cov2d[0][1], lambda1 - cov2d[0][0]));\n vec2 majorAxis = min(sqrt(2.0 * lambda1), 1024.0) * diagonalVector;\n vec2 minorAxis = min(sqrt(2.0 * lambda2), 1024.0) * vec2(diagonalVector.y, -diagonalVector.x);\n\n uint colorTransformIndex = texelFetch(u_colorTransformIndices, ivec2(uint(index) & 0x3ffu, uint(index) >> 10), 0).x;\n mat4 colorTransform = mat4(\n texelFetch(u_colorTransforms, ivec2(0, colorTransformIndex), 0),\n texelFetch(u_colorTransforms, ivec2(1, colorTransformIndex), 0),\n texelFetch(u_colorTransforms, ivec2(2, colorTransformIndex), 0),\n texelFetch(u_colorTransforms, ivec2(3, colorTransformIndex), 0)\n );\n\n vec4 color = vec4((cov.w) & 0xffu, (cov.w >> 8) & 0xffu, (cov.w >> 16) & 0xffu, (cov.w >> 24) & 0xffu) / 255.0;\n vColor = colorTransform * color;\n\n vPosition = position;\n vSize = length(majorAxis);\n vSelected = selected;\n\n float scalingFactor = 1.0;\n\n if (useDepthFade) {\n float depthNorm = (pos2d.z / pos2d.w + 1.0) / 2.0;\n float near = 0.1; float far = 100.0;\n float normalizedDepth = (2.0 * near) / (far + near - depthNorm * (far - near));\n float start = max(normalizedDepth - 0.1, 0.0);\n float end = min(normalizedDepth + 0.1, 1.0);\n scalingFactor = clamp((depthFade - start) / (end - start), 0.0, 1.0);\n }\n\n vec2 vCenter = vec2(pos2d) / pos2d.w;\n gl_Position = vec4(\n vCenter \n + position.x * majorAxis * scalingFactor / viewport\n + position.y * minorAxis * scalingFactor / viewport, 0.0, 1.0);\n}\n`;\n\nconst fragmentShaderSource = /* glsl */ `#version 300 es\nprecision highp float;\n\nuniform float outlineThickness;\nuniform vec4 outlineColor;\n\nin vec4 vColor;\nin vec2 vPosition;\nin float vSize;\nin float vSelected;\n\nout vec4 fragColor;\n\nvoid main () {\n float A = -dot(vPosition, vPosition);\n\n if (A < -4.0) discard;\n\n if (vSelected < 0.5) {\n float B = exp(A) * vColor.a;\n fragColor = vec4(B * vColor.rgb, B);\n return;\n }\n\n float outlineThreshold = -4.0 + (outlineThickness / vSize);\n\n if (A < outlineThreshold) {\n fragColor = outlineColor;\n } \n else {\n float B = exp(A) * vColor.a;\n fragColor = vec4(B * vColor.rgb, B);\n }\n}\n`;\n\nclass RenderProgram extends ShaderProgram {\n private _outlineThickness: number = 10.0;\n private _outlineColor: Color32 = new Color32(255, 165, 0, 255);\n private _renderData: RenderData | null = null;\n private _depthIndex: Uint32Array = new Uint32Array();\n private _splatTexture: WebGLTexture | null = null;\n private _worker: Worker | null = null;\n\n protected _initialize: () => void;\n protected _resize: () => void;\n protected _render: () => void;\n protected _dispose: () => void;\n\n private _setOutlineThickness: (value: number) => void;\n private _setOutlineColor: (value: Color32) => void;\n\n constructor(renderer: WebGLRenderer, passes: ShaderPass[]) {\n super(renderer, passes);\n\n const canvas = renderer.canvas;\n const gl = renderer.gl;\n\n let u_projection: WebGLUniformLocation;\n let u_viewport: WebGLUniformLocation;\n let u_focal: WebGLUniformLocation;\n let u_view: WebGLUniformLocation;\n let u_texture: WebGLUniformLocation;\n let u_transforms: WebGLUniformLocation;\n let u_transformIndices: WebGLUniformLocation;\n let u_colorTransforms: WebGLUniformLocation;\n let u_colorTransformIndices: WebGLUniformLocation;\n\n let u_outlineThickness: WebGLUniformLocation;\n let u_outlineColor: WebGLUniformLocation;\n\n let positionAttribute: number;\n let indexAttribute: number;\n\n let transformsTexture: WebGLTexture;\n let transformIndicesTexture: WebGLTexture;\n\n let colorTransformsTexture: WebGLTexture;\n let colorTransformIndicesTexture: WebGLTexture;\n\n let vertexBuffer: WebGLBuffer;\n let indexBuffer: WebGLBuffer;\n\n this._resize = () => {\n if (!this._camera) return;\n\n this._camera.data.setSize(canvas.width, canvas.height);\n this._camera.update();\n\n u_projection = gl.getUniformLocation(this.program, \"projection\") as WebGLUniformLocation;\n gl.uniformMatrix4fv(u_projection, false, this._camera.data.projectionMatrix.buffer);\n\n u_viewport = gl.getUniformLocation(this.program, \"viewport\") as WebGLUniformLocation;\n gl.uniform2fv(u_viewport, new Float32Array([canvas.width, canvas.height]));\n };\n\n const createWorker = () => {\n this._worker = new SortWorker();\n this._worker.onmessage = (e) => {\n if (e.data.depthIndex) {\n const { depthIndex } = e.data;\n this._depthIndex = depthIndex;\n gl.bindBuffer(gl.ARRAY_BUFFER, indexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, depthIndex, gl.STATIC_DRAW);\n }\n };\n };\n\n this._initialize = () => {\n if (!this._scene || !this._camera) {\n console.error(\"Cannot render without scene and camera\");\n return;\n }\n\n this._resize();\n\n this._scene.addEventListener(\"objectAdded\", handleObjectAdded);\n this._scene.addEventListener(\"objectRemoved\", handleObjectRemoved);\n for (const object of this._scene.objects) {\n if (object instanceof Splat) {\n object.addEventListener(\"objectChanged\", handleObjectChanged);\n }\n }\n\n this._renderData = new RenderData(this._scene);\n\n u_focal = gl.getUniformLocation(this.program, \"focal\") as WebGLUniformLocation;\n gl.uniform2fv(u_focal, new Float32Array([this._camera.data.fx, this._camera.data.fy]));\n\n u_view = gl.getUniformLocation(this.program, \"view\") as WebGLUniformLocation;\n gl.uniformMatrix4fv(u_view, false, this._camera.data.viewMatrix.buffer);\n\n u_outlineThickness = gl.getUniformLocation(this.program, \"outlineThickness\") as WebGLUniformLocation;\n gl.uniform1f(u_outlineThickness, this.outlineThickness);\n\n u_outlineColor = gl.getUniformLocation(this.program, \"outlineColor\") as WebGLUniformLocation;\n gl.uniform4fv(u_outlineColor, new Float32Array(this.outlineColor.flatNorm()));\n\n this._splatTexture = gl.createTexture() as WebGLTexture;\n u_texture = gl.getUniformLocation(this.program, \"u_texture\") as WebGLUniformLocation;\n gl.uniform1i(u_texture, 0);\n\n transformsTexture = gl.createTexture() as WebGLTexture;\n u_transforms = gl.getUniformLocation(this.program, \"u_transforms\") as WebGLUniformLocation;\n gl.uniform1i(u_transforms, 1);\n\n transformIndicesTexture = gl.createTexture() as WebGLTexture;\n u_transformIndices = gl.getUniformLocation(this.program, \"u_transformIndices\") as WebGLUniformLocation;\n gl.uniform1i(u_transformIndices, 2);\n\n colorTransformsTexture = gl.createTexture() as WebGLTexture;\n u_colorTransforms = gl.getUniformLocation(this.program, \"u_colorTransforms\") as WebGLUniformLocation;\n gl.uniform1i(u_colorTransforms, 3);\n\n colorTransformIndicesTexture = gl.createTexture() as WebGLTexture;\n u_colorTransformIndices = gl.getUniformLocation(\n this.program,\n \"u_colorTransformIndices\",\n ) as WebGLUniformLocation;\n gl.uniform1i(u_colorTransformIndices, 4);\n\n vertexBuffer = gl.createBuffer() as WebGLBuffer;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-2, -2, 2, -2, 2, 2, -2, 2]), gl.STATIC_DRAW);\n\n positionAttribute = gl.getAttribLocation(this.program, \"position\");\n gl.enableVertexAttribArray(positionAttribute);\n gl.vertexAttribPointer(positionAttribute, 2, gl.FLOAT, false, 0, 0);\n\n indexBuffer = gl.createBuffer() as WebGLBuffer;\n indexAttribute = gl.getAttribLocation(this.program, \"index\");\n gl.enableVertexAttribArray(indexAttribute);\n gl.bindBuffer(gl.ARRAY_BUFFER, indexBuffer);\n\n createWorker();\n };\n\n const handleObjectAdded = (event: Event) => {\n const e = event as ObjectAddedEvent;\n\n if (e.object instanceof Splat) {\n e.object.addEventListener(\"objectChanged\", handleObjectChanged);\n }\n\n resetSplatData();\n };\n\n const handleObjectRemoved = (event: Event) => {\n const e = event as ObjectRemovedEvent;\n\n if (e.object instanceof Splat) {\n e.object.removeEventListener(\"objectChanged\", handleObjectChanged);\n }\n\n resetSplatData();\n };\n\n const handleObjectChanged = (event: Event) => {\n const e = event as ObjectChangedEvent;\n\n if (e.object instanceof Splat && this._renderData) {\n this._renderData.markDirty(e.object);\n }\n };\n\n const resetSplatData = () => {\n this._renderData?.dispose();\n this._renderData = new RenderData(this._scene as Scene);\n\n this._worker?.terminate();\n createWorker();\n };\n\n this._render = () => {\n if (!this._scene || !this._camera || !this.renderData) {\n console.error(\"Cannot render without scene and camera\");\n return;\n }\n\n if (this.renderData.needsRebuild) {\n this.renderData.rebuild();\n }\n\n if (\n this.renderData.dataChanged ||\n this.renderData.transformsChanged ||\n this.renderData.colorTransformsChanged\n ) {\n if (this.renderData.dataChanged) {\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.splatTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA32UI,\n this.renderData.width,\n this.renderData.height,\n 0,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_INT,\n this.renderData.data,\n );\n }\n\n if (this.renderData.transformsChanged) {\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, transformsTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA32F,\n this.renderData.transformsWidth,\n this.renderData.transformsHeight,\n 0,\n gl.RGBA,\n gl.FLOAT,\n this.renderData.transforms,\n );\n\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, transformIndicesTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.R32UI,\n this.renderData.transformIndicesWidth,\n this.renderData.transformIndicesHeight,\n 0,\n gl.RED_INTEGER,\n gl.UNSIGNED_INT,\n this.renderData.transformIndices,\n );\n }\n\n if (this.renderData.colorTransformsChanged) {\n gl.activeTexture(gl.TEXTURE3);\n gl.bindTexture(gl.TEXTURE_2D, colorTransformsTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA32F,\n this.renderData.colorTransformsWidth,\n this.renderData.colorTransformsHeight,\n 0,\n gl.RGBA,\n gl.FLOAT,\n this.renderData.colorTransforms,\n );\n\n gl.activeTexture(gl.TEXTURE4);\n gl.bindTexture(gl.TEXTURE_2D, colorTransformIndicesTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.R32UI,\n this.renderData.colorTransformIndicesWidth,\n this.renderData.colorTransformIndicesHeight,\n 0,\n gl.RED_INTEGER,\n gl.UNSIGNED_INT,\n this.renderData.colorTransformIndices,\n );\n }\n\n const detachedPositions = new Float32Array(this.renderData.positions.slice().buffer);\n const detachedTransforms = new Float32Array(this.renderData.transforms.slice().buffer);\n const detachedTransformIndices = new Uint32Array(this.renderData.transformIndices.slice().buffer);\n this._worker?.postMessage(\n {\n sortData: {\n positions: detachedPositions,\n transforms: detachedTransforms,\n transformIndices: detachedTransformIndices,\n vertexCount: this.renderData.vertexCount,\n },\n },\n [detachedPositions.buffer, detachedTransforms.buffer, detachedTransformIndices.buffer],\n );\n\n this.renderData.dataChanged = false;\n this.renderData.transformsChanged = false;\n this.renderData.colorTransformsChanged = false;\n }\n\n this._camera.update();\n this._worker?.postMessage({ viewProj: this._camera.data.viewProj.buffer });\n\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.disable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFuncSeparate(gl.ONE_MINUS_DST_ALPHA, gl.ONE, gl.ONE_MINUS_DST_ALPHA, gl.ONE);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n\n gl.uniformMatrix4fv(u_projection, false, this._camera.data.projectionMatrix.buffer);\n gl.uniformMatrix4fv(u_view, false, this._camera.data.viewMatrix.buffer);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.vertexAttribPointer(positionAttribute, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, indexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.depthIndex, gl.STATIC_DRAW);\n gl.vertexAttribIPointer(indexAttribute, 1, gl.INT, 0, 0);\n gl.vertexAttribDivisor(indexAttribute, 1);\n\n gl.drawArraysInstanced(gl.TRIANGLE_FAN, 0, 4, this.depthIndex.length);\n };\n\n this._dispose = () => {\n if (!this._scene || !this._camera || !this.renderData) {\n console.error(\"Cannot dispose without scene and camera\");\n return;\n }\n\n this._scene.removeEventListener(\"objectAdded\", handleObjectAdded);\n this._scene.removeEventListener(\"objectRemoved\", handleObjectRemoved);\n for (const object of this._scene.objects) {\n if (object instanceof Splat) {\n object.removeEventListener(\"objectChanged\", handleObjectChanged);\n }\n }\n\n this._worker?.terminate();\n this.renderData.dispose();\n\n gl.deleteTexture(this.splatTexture);\n gl.deleteTexture(transformsTexture);\n gl.deleteTexture(transformIndicesTexture);\n\n gl.deleteBuffer(indexBuffer);\n gl.deleteBuffer(vertexBuffer);\n };\n\n this._setOutlineThickness = (value: number) => {\n this._outlineThickness = value;\n if (this._initialized) {\n gl.uniform1f(u_outlineThickness, value);\n }\n };\n\n this._setOutlineColor = (value: Color32) => {\n this._outlineColor = value;\n if (this._initialized) {\n gl.uniform4fv(u_outlineColor, new Float32Array(value.flatNorm()));\n }\n };\n }\n\n get renderData() {\n return this._renderData;\n }\n\n get depthIndex() {\n return this._depthIndex;\n }\n\n get splatTexture() {\n return this._splatTexture;\n }\n\n get outlineThickness() {\n return this._outlineThickness;\n }\n\n set outlineThickness(value: number) {\n this._setOutlineThickness(value);\n }\n\n get outlineColor() {\n return this._outlineColor;\n }\n\n set outlineColor(value: Color32) {\n this._setOutlineColor(value);\n }\n\n get worker() {\n return this._worker;\n }\n\n protected _getVertexSource() {\n return vertexShaderSource;\n }\n\n protected _getFragmentSource() {\n return fragmentShaderSource;\n }\n}\n\nexport { RenderProgram };\n","import { RenderProgram } from \"../programs/RenderProgram\";\nimport { ShaderProgram } from \"../programs/ShaderProgram\";\nimport { ShaderPass } from \"./ShaderPass\";\n\nclass FadeInPass implements ShaderPass {\n initialize: (program: ShaderProgram) => void;\n render: () => void;\n\n constructor(speed: number = 1.0) {\n let value = 0.0;\n let active = false;\n\n let renderProgram: RenderProgram;\n let gl: WebGL2RenderingContext;\n let u_useDepthFade: WebGLUniformLocation;\n let u_depthFade: WebGLUniformLocation;\n\n this.initialize = (program: ShaderProgram) => {\n if (!(program instanceof RenderProgram)) {\n throw new Error(\"FadeInPass requires a RenderProgram\");\n }\n\n value = program.started ? 1.0 : 0.0;\n active = true;\n renderProgram = program;\n gl = program.renderer.gl;\n\n u_useDepthFade = gl.getUniformLocation(renderProgram.program, \"useDepthFade\") as WebGLUniformLocation;\n gl.uniform1i(u_useDepthFade, 1);\n\n u_depthFade = gl.getUniformLocation(renderProgram.program, \"depthFade\") as WebGLUniformLocation;\n gl.uniform1f(u_depthFade, value);\n };\n\n this.render = () => {\n if (!active || renderProgram.renderData?.updating) return;\n gl.useProgram(renderProgram.program);\n value = Math.min(value + speed * 0.01, 1.0);\n if (value >= 1.0) {\n active = false;\n gl.uniform1i(u_useDepthFade, 0);\n }\n gl.uniform1f(u_depthFade, value);\n };\n }\n\n dispose() {}\n}\n\nexport { FadeInPass };\n","import type { Scene } from \"../core/Scene\";\nimport { FadeInPass } from \"./webgl/passes/FadeInPass\";\nimport { Camera } from \"../cameras/Camera\";\nimport { Color32 } from \"../math/Color32\";\nimport { ShaderProgram } from \"./webgl/programs/ShaderProgram\";\nimport { RenderProgram } from \"./webgl/programs/RenderProgram\";\nimport { ShaderPass } from \"./webgl/passes/ShaderPass\";\n\nexport class WebGLRenderer {\n private _canvas: HTMLCanvasElement;\n private _gl: WebGL2RenderingContext;\n private _backgroundColor: Color32 = new Color32();\n private _renderProgram: RenderProgram;\n\n addProgram: (program: ShaderProgram) => void;\n removeProgram: (program: ShaderProgram) => void;\n resize: () => void;\n setSize: (width: number, height: number) => void;\n render: (scene: Scene, camera: Camera) => void;\n dispose: () => void;\n\n constructor(optionalCanvas: HTMLCanvasElement | null = null, optionalRenderPasses: ShaderPass[] | null = null) {\n const canvas: HTMLCanvasElement = optionalCanvas || document.createElement(\"canvas\");\n if (!optionalCanvas) {\n canvas.style.display = \"block\";\n canvas.style.boxSizing = \"border-box\";\n canvas.style.width = \"100%\";\n canvas.style.height = \"100%\";\n canvas.style.margin = \"0\";\n canvas.style.padding = \"0\";\n document.body.appendChild(canvas);\n }\n canvas.style.background = this._backgroundColor.toHexString();\n this._canvas = canvas;\n\n this._gl = canvas.getContext(\"webgl2\", { antialias: false }) as WebGL2RenderingContext;\n\n const renderPasses = optionalRenderPasses || [];\n if (!optionalRenderPasses) {\n renderPasses.push(new FadeInPass());\n }\n\n this._renderProgram = new RenderProgram(this, renderPasses);\n const programs = [this._renderProgram] as ShaderProgram[];\n\n this.resize = () => {\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n if (canvas.width !== width || canvas.height !== height) {\n this.setSize(width, height);\n }\n };\n\n this.setSize = (width: number, height: number) => {\n canvas.width = width;\n canvas.height = height;\n this._gl.viewport(0, 0, canvas.width, canvas.height);\n for (const program of programs) {\n program.resize();\n }\n };\n\n this.render = (scene: Scene, camera: Camera) => {\n for (const program of programs) {\n program.render(scene, camera);\n }\n };\n\n this.dispose = () => {\n for (const program of programs) {\n program.dispose();\n }\n };\n\n this.addProgram = (program: ShaderProgram) => {\n programs.push(program);\n };\n\n this.removeProgram = (program: ShaderProgram) => {\n const index = programs.indexOf(program);\n if (index < 0) {\n throw new Error(\"Program not found\");\n }\n programs.splice(index, 1);\n };\n\n this.resize();\n }\n\n get canvas() {\n return this._canvas;\n }\n\n get gl() {\n return this._gl;\n }\n\n get renderProgram() {\n return this._renderProgram;\n }\n\n get backgroundColor() {\n return this._backgroundColor;\n }\n\n set backgroundColor(value: Color32) {\n this._backgroundColor = value;\n this._canvas.style.background = value.toHexString();\n }\n}\n","import { Camera } from \"../cameras/Camera\";\nimport { Matrix3 } from \"../math/Matrix3\";\nimport { Quaternion } from \"../math/Quaternion\";\nimport { Vector3 } from \"../math/Vector3\";\n\nclass OrbitControls {\n // Vertical (polar) limits: by default, free rotation.\n minAngle: number = -Infinity;\n maxAngle: number = Infinity;\n // Horizontal (azimuth) limits: by default, free rotation.\n minAzimuth: number = -Infinity;\n maxAzimuth: number = Infinity;\n minZoom: number = 0.1;\n maxZoom: number = 30;\n orbitSpeed: number = 1;\n panSpeed: number = 1;\n zoomSpeed: number = 1;\n dampening: number = 0.12;\n setCameraTarget: (newTarget: Vector3) => void = () => {};\n update: () => void;\n dispose: () => void;\n\n /**\n * @param camera the camera to control.\n * @param canvas the element to attach events.\n * @param alpha initial horizontal angle (in radians).\n * @param beta initial vertical angle (in radians).\n * @param radius initial distance from the target.\n * @param enableKeyboardControls whether to listen to keyboard events.\n * @param inputTarget the point to orbit around.\n */\n constructor(\n camera: Camera,\n canvas: HTMLElement,\n alpha: number = 0.5,\n beta: number = 0.5,\n radius: number = 5,\n enableKeyboardControls: boolean = true,\n inputTarget: Vector3 = new Vector3(),\n // New optional parameters to be set from JSON:\n initAlpha?: number,\n initBeta?: number,\n initRadius?: number,\n ) {\n // Use the JSON-provided initial values if given.\n const defaultAlpha = initAlpha !== undefined ? initAlpha : alpha;\n const defaultBeta = initBeta !== undefined ? initBeta : beta;\n const defaultRadius = initRadius !== undefined ? initRadius : radius;\n\n // The target (the point the camera orbits around)\n let target = inputTarget.clone();\n\n // Set both the current and desired orbit parameters to the defaults.\n let desiredTarget = target.clone();\n let desiredAlpha = defaultAlpha;\n let desiredBeta = defaultBeta;\n let desiredRadius = defaultRadius;\n\n // We now use separate “current” state variables so that update() can lerp toward desired values.\n let currentAlpha = defaultAlpha;\n let currentBeta = defaultBeta;\n let currentRadius = defaultRadius;\n\n let dragging = false;\n let panning = false;\n let lastDist = 0;\n let lastX = 0;\n let lastY = 0;\n\n const keys: { [key: string]: boolean } = {};\n\n let isUpdatingCamera = false;\n\n // (Optionally you could keep an onCameraChange listener to update the current state when the camera changes,\n // but that may override your JSON settings. In this example, we remove it.)\n // camera.addEventListener(\"objectChanged\", onCameraChange);\n\n this.setCameraTarget = (newTarget: Vector3) => {\n const dx = newTarget.x - camera.position.x;\n const dy = newTarget.y - camera.position.y;\n const dz = newTarget.z - camera.position.z;\n desiredRadius = Math.sqrt(dx * dx + dy * dy + dz * dz);\n desiredBeta = Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));\n desiredAlpha = -Math.atan2(dx, dz);\n desiredTarget = new Vector3(newTarget.x, newTarget.y, newTarget.z);\n };\n\n const computeZoomNorm = () => {\n return 0.1 + (0.9 * (desiredRadius - this.minZoom)) / (this.maxZoom - this.minZoom);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n keys[e.code] = true;\n // Map arrow keys to WASD keys\n if (e.code === \"ArrowUp\") keys[\"KeyW\"] = true;\n if (e.code === \"ArrowDown\") keys[\"KeyS\"] = true;\n if (e.code === \"ArrowLeft\") keys[\"KeyA\"] = true;\n if (e.code === \"ArrowRight\") keys[\"KeyD\"] = true;\n };\n\n const onKeyUp = (e: KeyboardEvent) => {\n keys[e.code] = false;\n if (e.code === \"ArrowUp\") keys[\"KeyW\"] = false;\n if (e.code === \"ArrowDown\") keys[\"KeyS\"] = false;\n if (e.code === \"ArrowLeft\") keys[\"KeyA\"] = false;\n if (e.code === \"ArrowRight\") keys[\"KeyD\"] = false;\n };\n\n const onMouseDown = (e: MouseEvent) => {\n preventDefault(e);\n dragging = true;\n panning = e.button === 2;\n lastX = e.clientX;\n lastY = e.clientY;\n window.addEventListener(\"mouseup\", onMouseUp);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n preventDefault(e);\n dragging = false;\n panning = false;\n window.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n const onMouseMove = (e: MouseEvent) => {\n preventDefault(e);\n if (!dragging || !camera) return;\n\n const dx = e.clientX - lastX;\n const dy = e.clientY - lastY;\n\n if (panning) {\n const zoomNorm = computeZoomNorm();\n const panX = -dx * this.panSpeed * 0.01 * zoomNorm;\n const panY = -dy * this.panSpeed * 0.01 * zoomNorm;\n const R = Matrix3.RotationFromQuaternion(camera.rotation).buffer;\n const right = new Vector3(R[0], R[3], R[6]);\n const up = new Vector3(R[1], R[4], R[7]);\n desiredTarget = desiredTarget.add(right.multiply(panX));\n desiredTarget = desiredTarget.add(up.multiply(panY));\n } else {\n desiredAlpha -= dx * this.orbitSpeed * 0.003;\n desiredBeta += dy * this.orbitSpeed * 0.003;\n // Clamp vertical angle (beta) if limits are finite\n desiredBeta = Math.min(\n Math.max(desiredBeta, (this.minAngle * Math.PI) / 180),\n (this.maxAngle * Math.PI) / 180,\n );\n }\n\n lastX = e.clientX;\n lastY = e.clientY;\n };\n\n const onWheel = (e: WheelEvent) => {\n preventDefault(e);\n const zoomNorm = computeZoomNorm();\n desiredRadius += e.deltaY * this.zoomSpeed * 0.025 * zoomNorm;\n desiredRadius = Math.min(Math.max(desiredRadius, this.minZoom), this.maxZoom);\n };\n\n const onTouchStart = (e: TouchEvent) => {\n preventDefault(e);\n if (e.touches.length === 1) {\n dragging = true;\n panning = false;\n lastX = e.touches[0].clientX;\n lastY = e.touches[0].clientY;\n lastDist = 0;\n } else if (e.touches.length === 2) {\n dragging = true;\n panning = true;\n lastX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n lastY = (e.touches[0].clientY + e.touches[1].clientY) / 2;\n const distX = e.touches[0].clientX - e.touches[1].clientX;\n const distY = e.touches[0].clientY - e.touches[1].clientY;\n lastDist = Math.sqrt(distX * distX + distY * distY);\n }\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n preventDefault(e);\n dragging = false;\n panning = false;\n };\n\n const onTouchMove = (e: TouchEvent) => {\n preventDefault(e);\n if (!dragging || !camera) return;\n\n if (panning) {\n const zoomNorm = computeZoomNorm();\n const distX = e.touches[0].clientX - e.touches[1].clientX;\n const distY = e.touches[0].clientY - e.touches[1].clientY;\n const dist = Math.sqrt(distX * distX + distY * distY);\n const delta = lastDist - dist;\n desiredRadius += delta * this.zoomSpeed * 0.1 * zoomNorm;\n desiredRadius = Math.min(Math.max(desiredRadius, this.minZoom), this.maxZoom);\n lastDist = dist;\n\n const touchX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n const touchY = (e.touches[0].clientY + e.touches[1].clientY) / 2;\n const dx = touchX - lastX;\n const dy = touchY - lastY;\n const R = Matrix3.RotationFromQuaternion(camera.rotation).buffer;\n const right = new Vector3(R[0], R[3], R[6]);\n const up = new Vector3(R[1], R[4], R[7]);\n desiredTarget = desiredTarget.add(right.multiply(-dx * this.panSpeed * 0.025 * zoomNorm));\n desiredTarget = desiredTarget.add(up.multiply(-dy * this.panSpeed * 0.025 * zoomNorm));\n lastX = touchX;\n lastY = touchY;\n } else {\n const dx = e.touches[0].clientX - lastX;\n const dy = e.touches[0].clientY - lastY;\n\n desiredAlpha -= dx * this.orbitSpeed * 0.003;\n desiredBeta += dy * this.orbitSpeed * 0.003;\n desiredBeta = Math.min(\n Math.max(desiredBeta, (this.minAngle * Math.PI) / 180),\n (this.maxAngle * Math.PI) / 180,\n );\n\n lastX = e.touches[0].clientX;\n lastY = e.touches[0].clientY;\n }\n };\n\n const lerp = (a: number, b: number, t: number) => (1 - t) * a + t * b;\n\n this.update = () => {\n isUpdatingCamera = true;\n\n // Lerp the current state toward the desired state.\n currentAlpha = lerp(currentAlpha, desiredAlpha, this.dampening);\n currentBeta = lerp(currentBeta, desiredBeta, this.dampening);\n currentRadius = lerp(currentRadius, desiredRadius, this.dampening);\n target = target.lerp(desiredTarget, this.dampening);\n\n // Recompute the camera position from currentAlpha/currentBeta/currentRadius.\n const x = target.x + currentRadius * Math.sin(currentAlpha) * Math.cos(currentBeta);\n const y = target.y - currentRadius * Math.sin(currentBeta);\n const z = target.z - currentRadius * Math.cos(currentAlpha) * Math.cos(currentBeta);\n camera.position = new Vector3(x, y, z);\n\n // Compute new rotation so that the camera looks at the target.\n const direction = target.subtract(camera.position).normalize();\n const rx = Math.asin(-direction.y);\n const ry = Math.atan2(direction.x, direction.z);\n camera.rotation = Quaternion.FromEuler(new Vector3(rx, ry, 0));\n\n const moveSpeed = 0.025;\n const rotateSpeed = 0.01;\n const R = Matrix3.RotationFromQuaternion(camera.rotation).buffer;\n const forward = new Vector3(-R[2], -R[5], -R[8]);\n const right = new Vector3(R[0], R[3], R[6]);\n\n if (keys[\"KeyS\"]) desiredTarget = desiredTarget.add(forward.multiply(moveSpeed));\n if (keys[\"KeyW\"]) desiredTarget = desiredTarget.subtract(forward.multiply(moveSpeed));\n if (keys[\"KeyA\"]) desiredTarget = desiredTarget.subtract(right.multiply(moveSpeed));\n if (keys[\"KeyD\"]) desiredTarget = desiredTarget.add(right.multiply(moveSpeed));\n\n // Horizontal (azimuth) rotation with 'e' and 'q'\n if (keys[\"KeyE\"]) desiredAlpha += rotateSpeed;\n if (keys[\"KeyQ\"]) desiredAlpha -= rotateSpeed;\n desiredAlpha = Math.min(\n Math.max(desiredAlpha, (this.minAzimuth * Math.PI) / 180),\n (this.maxAzimuth * Math.PI) / 180,\n );\n\n // Vertical (polar) rotation with 'r' and 'f'\n if (keys[\"KeyR\"]) desiredBeta += rotateSpeed;\n if (keys[\"KeyF\"]) desiredBeta -= rotateSpeed;\n desiredBeta = Math.min(\n Math.max(desiredBeta, (this.minAngle * Math.PI) / 180),\n (this.maxAngle * Math.PI) / 180,\n );\n\n isUpdatingCamera = false;\n };\n\n const preventDefault = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n this.dispose = () => {\n canvas.removeEventListener(\"dragenter\", preventDefault);\n canvas.removeEventListener(\"dragover\", preventDefault);\n canvas.removeEventListener(\"dragleave\", preventDefault);\n canvas.removeEventListener(\"contextmenu\", preventDefault);\n\n canvas.removeEventListener(\"mousedown\", onMouseDown);\n canvas.removeEventListener(\"mousemove\", onMouseMove);\n canvas.removeEventListener(\"wheel\", onWheel);\n\n canvas.removeEventListener(\"touchstart\", onTouchStart);\n canvas.removeEventListener(\"touchend\", onTouchEnd);\n canvas.removeEventListener(\"touchmove\", onTouchMove);\n\n if (enableKeyboardControls) {\n window.removeEventListener(\"keydown\", onKeyDown);\n window.removeEventListener(\"keyup\", onKeyUp);\n }\n };\n\n if (enableKeyboardControls) {\n window.addEventListener(\"keydown\", onKeyDown);\n window.addEventListener(\"keyup\", onKeyUp);\n }\n\n canvas.addEventListener(\"dragenter\", preventDefault);\n canvas.addEventListener(\"dragover\", preventDefault);\n canvas.addEventListener(\"dragleave\", preventDefault);\n canvas.addEventListener(\"contextmenu\", preventDefault);\n\n canvas.addEventListener(\"mousedown\", onMouseDown);\n canvas.addEventListener(\"mousemove\", onMouseMove);\n canvas.addEventListener(\"wheel\", onWheel);\n\n canvas.addEventListener(\"touchstart\", onTouchStart);\n canvas.addEventListener(\"touchend\", onTouchEnd);\n canvas.addEventListener(\"touchmove\", onTouchMove);\n\n this.update();\n }\n}\n\nexport { OrbitControls };\n","import { Camera } from \"../cameras/Camera\";\nimport { Quaternion } from \"../math/Quaternion\";\nimport { Matrix3 } from \"../math/Matrix3\";\nimport { Vector3 } from \"../math/Vector3\";\n\nclass FPSControls {\n moveSpeed: number = 1.5;\n lookSpeed: number = 0.7;\n dampening: number = 0.5;\n update: () => void;\n dispose: () => void;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n const keys: { [key: string]: boolean } = {};\n let pitch = camera.rotation.toEuler().x;\n let yaw = camera.rotation.toEuler().y;\n let targetPosition = camera.position;\n let pointerLock = false;\n\n const onMouseDown = () => {\n canvas.requestPointerLock();\n };\n\n const onPointerLockChange = () => {\n pointerLock = document.pointerLockElement === canvas;\n if (pointerLock) {\n canvas.addEventListener(\"mousemove\", onMouseMove);\n } else {\n canvas.removeEventListener(\"mousemove\", onMouseMove);\n }\n };\n\n const onMouseMove = (e: MouseEvent) => {\n const mouseX = e.movementX;\n const mouseY = e.movementY;\n\n yaw += mouseX * this.lookSpeed * 0.001;\n pitch -= mouseY * this.lookSpeed * 0.001;\n pitch = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, pitch));\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n keys[e.code] = true;\n // Map arrow keys to WASD keys\n if (e.code === \"ArrowUp\") keys[\"KeyW\"] = true;\n if (e.code === \"ArrowDown\") keys[\"KeyS\"] = true;\n if (e.code === \"ArrowLeft\") keys[\"KeyA\"] = true;\n if (e.code === \"ArrowRight\") keys[\"KeyD\"] = true;\n };\n\n const onKeyUp = (e: KeyboardEvent) => {\n keys[e.code] = false;\n // Map arrow keys to WASD keys\n if (e.code === \"ArrowUp\") keys[\"KeyW\"] = false;\n if (e.code === \"ArrowDown\") keys[\"KeyS\"] = false;\n if (e.code === \"ArrowLeft\") keys[\"KeyA\"] = false;\n if (e.code === \"ArrowRight\") keys[\"KeyD\"] = false;\n if (e.code === \"Escape\") document.exitPointerLock();\n };\n\n this.update = () => {\n const R = Matrix3.RotationFromQuaternion(camera.rotation).buffer;\n const forward = new Vector3(-R[2], -R[5], -R[8]);\n const right = new Vector3(R[0], R[3], R[6]);\n let move = new Vector3(0, 0, 0);\n if (keys[\"KeyS\"]) {\n move = move.add(forward);\n }\n if (keys[\"KeyW\"]) {\n move = move.subtract(forward);\n }\n if (keys[\"KeyA\"]) {\n move = move.subtract(right);\n }\n if (keys[\"KeyD\"]) {\n move = move.add(right);\n }\n move = new Vector3(move.x, 0, move.z);\n if (move.magnitude() > 0) {\n move = move.normalize();\n }\n\n targetPosition = targetPosition.add(move.multiply(this.moveSpeed * 0.01));\n camera.position = camera.position.add(targetPosition.subtract(camera.position).multiply(this.dampening));\n\n camera.rotation = Quaternion.FromEuler(new Vector3(pitch, yaw, 0));\n };\n\n const preventDefault = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n this.dispose = () => {\n canvas.removeEventListener(\"dragenter\", preventDefault);\n canvas.removeEventListener(\"dragover\", preventDefault);\n canvas.removeEventListener(\"dragleave\", preventDefault);\n canvas.removeEventListener(\"contextmenu\", preventDefault);\n canvas.removeEventListener(\"mousedown\", onMouseDown);\n\n document.removeEventListener(\"pointerlockchange\", onPointerLockChange);\n\n window.removeEventListener(\"keydown\", onKeyDown);\n window.removeEventListener(\"keyup\", onKeyUp);\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n window.addEventListener(\"keyup\", onKeyUp);\n\n canvas.addEventListener(\"dragenter\", preventDefault);\n canvas.addEventListener(\"dragover\", preventDefault);\n canvas.addEventListener(\"dragleave\", preventDefault);\n canvas.addEventListener(\"contextmenu\", preventDefault);\n canvas.addEventListener(\"mousedown\", onMouseDown);\n\n document.addEventListener(\"pointerlockchange\", onPointerLockChange);\n\n this.update();\n }\n}\n\nexport { FPSControls };\n","import { Vector3 } from \"./Vector3\";\n\nclass Plane {\n public readonly normal: Vector3;\n public readonly point: Vector3;\n\n constructor(normal: Vector3, point: Vector3) {\n this.normal = normal;\n this.point = point;\n }\n\n intersect(origin: Vector3, direction: Vector3): Vector3 | null {\n const denominator = this.normal.dot(direction);\n\n if (Math.abs(denominator) < 0.0001) {\n return null;\n }\n\n const t = this.normal.dot(this.point.subtract(origin)) / denominator;\n\n if (t < 0) {\n return null;\n }\n\n return origin.add(direction.multiply(t));\n }\n}\n\nexport { Plane };\n","import { ShaderProgram } from \"../programs/ShaderProgram\";\n\nclass ShaderPass {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n initialize(program: ShaderProgram) {}\n render() {}\n dispose() {}\n}\n\nexport { ShaderPass };\n","import { Splatv } from \"../../../splats/Splatv\";\nimport { SplatvData } from \"../../../splats/SplatvData\";\nimport { WebGLRenderer } from \"../../WebGLRenderer\";\nimport { ShaderPass } from \"../passes/ShaderPass\";\nimport { ShaderProgram } from \"./ShaderProgram\";\nimport { ObjectAddedEvent, ObjectChangedEvent, ObjectRemovedEvent } from \"../../../events/Events\";\nimport { Matrix4 } from \"../../../math/Matrix4\";\n\nconst vertexShaderSource = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n \nuniform highp usampler2D u_texture;\nuniform mat4 projection, view;\nuniform vec2 focal;\nuniform vec2 viewport;\nuniform float time;\n \nin vec2 position;\nin int index;\n \nout vec4 vColor;\nout vec2 vPosition;\n \nvoid main () {\n gl_Position = vec4(0.0, 0.0, 2.0, 1.0);\n\n uvec4 motion1 = texelFetch(u_texture, ivec2(((uint(index) & 0x3ffu) << 2) | 3u, uint(index) >> 10), 0);\n vec2 trbf = unpackHalf2x16(motion1.w);\n float dt = time - trbf.x;\n\n float topacity = exp(-1.0 * pow(dt / trbf.y, 2.0));\n if(topacity < 0.02) return;\n\n uvec4 motion0 = texelFetch(u_texture, ivec2(((uint(index) & 0x3ffu) << 2) | 2u, uint(index) >> 10), 0);\n uvec4 static0 = texelFetch(u_texture, ivec2(((uint(index) & 0x3ffu) << 2), uint(index) >> 10), 0);\n\n vec2 m0 = unpackHalf2x16(motion0.x), m1 = unpackHalf2x16(motion0.y), m2 = unpackHalf2x16(motion0.z), \n m3 = unpackHalf2x16(motion0.w), m4 = unpackHalf2x16(motion1.x); \n \n vec4 trot = vec4(unpackHalf2x16(motion1.y).xy, unpackHalf2x16(motion1.z).xy) * dt;\n vec3 tpos = (vec3(m0.xy, m1.x) * dt + vec3(m1.y, m2.xy) * dt*dt + vec3(m3.xy, m4.x) * dt*dt*dt);\n \n vec4 cam = view * vec4(uintBitsToFloat(static0.xyz) + tpos, 1);\n vec4 pos = projection * cam;\n \n float clip = 1.2 * pos.w;\n if (pos.z < -clip || pos.x < -clip || pos.x > clip || pos.y < -clip || pos.y > clip) return;\n uvec4 static1 = texelFetch(u_texture, ivec2(((uint(index) & 0x3ffu) << 2) | 1u, uint(index) >> 10), 0);\n\n vec4 rot = vec4(unpackHalf2x16(static0.w).xy, unpackHalf2x16(static1.x).xy) + trot;\n vec3 scale = vec3(unpackHalf2x16(static1.y).xy, unpackHalf2x16(static1.z).x);\n rot /= sqrt(dot(rot, rot));\n \n mat3 S = mat3(scale.x, 0.0, 0.0, 0.0, scale.y, 0.0, 0.0, 0.0, scale.z);\n mat3 R = mat3(\n 1.0 - 2.0 * (rot.z * rot.z + rot.w * rot.w), 2.0 * (rot.y * rot.z - rot.x * rot.w), 2.0 * (rot.y * rot.w + rot.x * rot.z),\n 2.0 * (rot.y * rot.z + rot.x * rot.w), 1.0 - 2.0 * (rot.y * rot.y + rot.w * rot.w), 2.0 * (rot.z * rot.w - rot.x * rot.y),\n 2.0 * (rot.y * rot.w - rot.x * rot.z), 2.0 * (rot.z * rot.w + rot.x * rot.y), 1.0 - 2.0 * (rot.y * rot.y + rot.z * rot.z));\n mat3 M = S * R;\n mat3 Vrk = 4.0 * transpose(M) * M;\n mat3 J = mat3(\n focal.x / cam.z, 0., -(focal.x * cam.x) / (cam.z * cam.z), \n 0., -focal.y / cam.z, (focal.y * cam.y) / (cam.z * cam.z), \n 0., 0., 0.\n );\n \n mat3 T = transpose(mat3(view)) * J;\n mat3 cov2d = transpose(T) * Vrk * T;\n \n float mid = (cov2d[0][0] + cov2d[1][1]) / 2.0;\n float radius = length(vec2((cov2d[0][0] - cov2d[1][1]) / 2.0, cov2d[0][1]));\n float lambda1 = mid + radius, lambda2 = mid - radius;\n \n if(lambda2 < 0.0) return;\n vec2 diagonalVector = normalize(vec2(cov2d[0][1], lambda1 - cov2d[0][0]));\n vec2 majorAxis = min(sqrt(2.0 * lambda1), 1024.0) * diagonalVector;\n vec2 minorAxis = min(sqrt(2.0 * lambda2), 1024.0) * vec2(diagonalVector.y, -diagonalVector.x);\n \n uint rgba = static1.w;\n vColor = \n clamp(pos.z/pos.w+1.0, 0.0, 1.0) * \n vec4(1.0, 1.0, 1.0, topacity) *\n vec4(\n (rgba) & 0xffu, \n (rgba >> 8) & 0xffu, \n (rgba >> 16) & 0xffu, \n (rgba >> 24) & 0xffu) / 255.0;\n\n vec2 vCenter = vec2(pos) / pos.w;\n gl_Position = vec4(\n vCenter \n + position.x * majorAxis / viewport \n + position.y * minorAxis / viewport, 0.0, 1.0);\n\n vPosition = position;\n}\n`;\n\nconst fragmentShaderSource = /* glsl */ `#version 300 es\nprecision highp float;\n \nin vec4 vColor;\nin vec2 vPosition;\n\nout vec4 fragColor;\n\nvoid main () {\n float A = -dot(vPosition, vPosition);\n if (A < -4.0) discard;\n float B = exp(A) * vColor.a;\n fragColor = vec4(B * vColor.rgb, B);\n}\n`;\n\nclass VideoRenderProgram extends ShaderProgram {\n private _renderData: SplatvData | null = null;\n private _depthIndex: Uint32Array = new Uint32Array();\n private _splatTexture: WebGLTexture | null = null;\n\n protected _initialize: () => void;\n protected _resize: () => void;\n protected _render: () => void;\n protected _dispose: () => void;\n\n constructor(renderer: WebGLRenderer, passes: ShaderPass[] = []) {\n super(renderer, passes);\n\n const canvas = renderer.canvas;\n const gl = renderer.gl;\n\n let worker: Worker;\n\n let u_projection: WebGLUniformLocation;\n let u_viewport: WebGLUniformLocation;\n let u_focal: WebGLUniformLocation;\n let u_view: WebGLUniformLocation;\n let u_texture: WebGLUniformLocation;\n let u_time: WebGLUniformLocation;\n\n let positionAttribute: number;\n let indexAttribute: number;\n\n let vertexBuffer: WebGLBuffer;\n let indexBuffer: WebGLBuffer;\n\n this._resize = () => {\n if (!this._camera) return;\n\n this._camera.data.setSize(canvas.width, canvas.height);\n this._camera.update();\n\n u_projection = gl.getUniformLocation(this.program, \"projection\") as WebGLUniformLocation;\n gl.uniformMatrix4fv(u_projection, false, this._camera.data.projectionMatrix.buffer);\n\n u_viewport = gl.getUniformLocation(this.program, \"viewport\") as WebGLUniformLocation;\n gl.uniform2fv(u_viewport, new Float32Array([canvas.width, canvas.height]));\n };\n\n const setupWorker = () => {\n if (renderer.renderProgram.worker === null) {\n console.error(\"Render program is not initialized. Cannot render without worker\");\n return;\n }\n worker = renderer.renderProgram.worker;\n worker.onmessage = (e) => {\n if (e.data.depthIndex) {\n const { depthIndex } = e.data;\n this._depthIndex = depthIndex;\n gl.bindBuffer(gl.ARRAY_BUFFER, indexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, depthIndex, gl.STATIC_DRAW);\n }\n };\n };\n\n this._initialize = () => {\n if (!this._scene || !this._camera) {\n console.error(\"Cannot render without scene and camera\");\n return;\n }\n\n this._resize();\n\n this._scene.addEventListener(\"objectAdded\", handleObjectAdded);\n this._scene.addEventListener(\"objectRemoved\", handleObjectRemoved);\n for (const object of this._scene.objects) {\n if (object instanceof Splatv) {\n if (this._renderData === null) {\n this._renderData = object.data;\n object.addEventListener(\"objectChanged\", handleObjectChanged);\n } else {\n console.warn(\"Multiple Splatv objects are not currently supported\");\n }\n }\n }\n\n if (this._renderData === null) {\n console.error(\"Cannot render without Splatv object\");\n return;\n }\n\n u_focal = gl.getUniformLocation(this.program, \"focal\") as WebGLUniformLocation;\n gl.uniform2fv(u_focal, new Float32Array([this._camera.data.fx, this._camera.data.fy]));\n\n u_view = gl.getUniformLocation(this.program, \"view\") as WebGLUniformLocation;\n gl.uniformMatrix4fv(u_view, false, this._camera.data.viewMatrix.buffer);\n\n this._splatTexture = gl.createTexture() as WebGLTexture;\n u_texture = gl.getUniformLocation(this.program, \"u_texture\") as WebGLUniformLocation;\n gl.uniform1i(u_texture, 0);\n\n u_time = gl.getUniformLocation(this.program, \"time\") as WebGLUniformLocation;\n gl.uniform1f(u_time, Math.sin(Date.now() / 1000) / 2 + 1 / 2);\n\n vertexBuffer = gl.createBuffer() as WebGLBuffer;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-2, -2, 2, -2, 2, 2, -2, 2]), gl.STATIC_DRAW);\n\n positionAttribute = gl.getAttribLocation(this.program, \"position\");\n gl.enableVertexAttribArray(positionAttribute);\n gl.vertexAttribPointer(positionAttribute, 2, gl.FLOAT, false, 0, 0);\n\n indexBuffer = gl.createBuffer() as WebGLBuffer;\n indexAttribute = gl.getAttribLocation(this.program, \"index\");\n gl.enableVertexAttribArray(indexAttribute);\n gl.bindBuffer(gl.ARRAY_BUFFER, indexBuffer);\n\n setupWorker();\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._splatTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA32UI,\n this._renderData.width,\n this._renderData.height,\n 0,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_INT,\n this._renderData.data,\n );\n\n const positions = this._renderData.positions;\n const dummyTransforms = new Float32Array(new Matrix4().buffer);\n const dummyTransformIndices = new Uint32Array(this._renderData.vertexCount);\n dummyTransformIndices.fill(0);\n worker.postMessage(\n {\n sortData: {\n positions: positions,\n transforms: dummyTransforms,\n transformIndices: dummyTransformIndices,\n vertexCount: this._renderData.vertexCount,\n },\n },\n [positions.buffer, dummyTransforms.buffer, dummyTransformIndices.buffer],\n );\n };\n\n const handleObjectAdded = (event: Event) => {\n const e = event as ObjectAddedEvent;\n\n if (e.object instanceof Splatv) {\n if (this._renderData === null) {\n this._renderData = e.object.data;\n e.object.addEventListener(\"objectChanged\", handleObjectChanged);\n } else {\n console.warn(\"Splatv not supported by default RenderProgram. Use VideoRenderProgram instead.\");\n }\n }\n\n this.dispose();\n };\n\n const handleObjectRemoved = (event: Event) => {\n const e = event as ObjectRemovedEvent;\n\n if (e.object instanceof Splatv) {\n if (this._renderData === e.object.data) {\n this._renderData = null;\n e.object.removeEventListener(\"objectChanged\", handleObjectChanged);\n }\n }\n\n this.dispose();\n };\n\n const handleObjectChanged = (event: Event) => {\n const e = event as ObjectChangedEvent;\n\n if (e.object instanceof Splatv && this._renderData === e.object.data) {\n this.dispose();\n }\n };\n\n this._render = () => {\n if (!this._scene || !this._camera) {\n console.error(\"Cannot render without scene and camera\");\n return;\n }\n\n if (!this._renderData) {\n console.warn(\"Cannot render without Splatv object\");\n return;\n }\n\n this._camera.update();\n worker.postMessage({ viewProj: this._camera.data.viewProj.buffer });\n\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.disable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFuncSeparate(gl.ONE_MINUS_DST_ALPHA, gl.ONE, gl.ONE_MINUS_DST_ALPHA, gl.ONE);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n\n gl.uniformMatrix4fv(u_projection, false, this._camera.data.projectionMatrix.buffer);\n gl.uniformMatrix4fv(u_view, false, this._camera.data.viewMatrix.buffer);\n gl.uniform1f(u_time, Math.sin(Date.now() / 1000) / 2 + 1 / 2);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.vertexAttribPointer(positionAttribute, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, indexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._depthIndex, gl.STATIC_DRAW);\n gl.vertexAttribIPointer(indexAttribute, 1, gl.INT, 0, 0);\n gl.vertexAttribDivisor(indexAttribute, 1);\n\n gl.drawArraysInstanced(gl.TRIANGLE_FAN, 0, 4, this._renderData.vertexCount);\n };\n\n this._dispose = () => {\n if (!this._scene || !this._camera) {\n console.error(\"Cannot dispose without scene and camera\");\n return;\n }\n\n this._scene.removeEventListener(\"objectAdded\", handleObjectAdded);\n this._scene.removeEventListener(\"objectRemoved\", handleObjectRemoved);\n for (const object of this._scene.objects) {\n if (object instanceof Splatv) {\n if (this._renderData === object.data) {\n this._renderData = null;\n object.removeEventListener(\"objectChanged\", handleObjectChanged);\n }\n }\n }\n\n worker?.terminate();\n\n gl.deleteTexture(this._splatTexture);\n\n gl.deleteBuffer(indexBuffer);\n gl.deleteBuffer(vertexBuffer);\n };\n }\n\n get renderData(): SplatvData | null {\n return this._renderData;\n }\n\n protected _getVertexSource(): string {\n return vertexShaderSource;\n }\n\n protected _getFragmentSource(): string {\n return fragmentShaderSource;\n }\n}\n\nexport { VideoRenderProgram };\n","import { Box3 } from \"./Box3\";\n\nclass BVHNode {\n public left: BVHNode | null = null;\n public right: BVHNode | null = null;\n public pointIndices: number[] = [];\n\n constructor(\n public bounds: Box3,\n public boxes: Box3[],\n pointIndices: number[],\n ) {\n if (pointIndices.length > 1) {\n this.split(bounds, boxes, pointIndices);\n } else if (pointIndices.length > 0) {\n this.pointIndices = pointIndices;\n }\n }\n\n private split(bounds: Box3, boxes: Box3[], pointIndices: number[]) {\n const axis = bounds.size().maxComponent();\n pointIndices.sort((a, b) => boxes[a].center().getComponent(axis) - boxes[b].center().getComponent(axis));\n\n const mid = Math.floor(pointIndices.length / 2);\n const leftIndices = pointIndices.slice(0, mid);\n const rightIndices = pointIndices.slice(mid);\n\n this.left = new BVHNode(bounds, boxes, leftIndices);\n this.right = new BVHNode(bounds, boxes, rightIndices);\n }\n\n public queryRange(range: Box3): number[] {\n if (!this.bounds.intersects(range)) {\n return [];\n } else if (this.left !== null && this.right !== null) {\n return this.left.queryRange(range).concat(this.right.queryRange(range));\n } else {\n return this.pointIndices.filter((index) => range.intersects(this.boxes[index]));\n }\n }\n}\n\nclass BVH {\n public root: BVHNode;\n\n constructor(bounds: Box3, boxes: Box3[]) {\n const pointIndices = boxes.map((_, index) => index);\n this.root = new BVHNode(bounds, boxes, pointIndices);\n }\n\n public queryRange(range: Box3) {\n return this.root.queryRange(range);\n }\n}\n\nexport { BVH };\n","import { Camera } from \"../../../cameras/Camera\";\nimport { Vector3 } from \"../../../math/Vector3\";\nimport { Splat } from \"../../../splats/Splat\";\nimport { RenderProgram } from \"../programs/RenderProgram\";\nimport { Box3 } from \"../../../math/Box3\";\nimport { BVH } from \"../../../math/BVH\";\nimport { RenderData } from \"./RenderData\";\n\nclass IntersectionTester {\n testPoint: (x: number, y: number) => Splat | null;\n\n constructor(renderProgram: RenderProgram, maxDistance: number = 100, resolution: number = 1.0) {\n let vertexCount = 0;\n let bvh: BVH | null = null;\n let lookup: Splat[] = [];\n\n const build = () => {\n if (renderProgram.renderData === null) {\n console.error(\"IntersectionTester cannot be called before renderProgram has been initialized\");\n return;\n }\n lookup = [];\n const renderData = renderProgram.renderData as RenderData;\n const boxes = new Array(renderData.offsets.size);\n let i = 0;\n const bounds = new Box3(\n new Vector3(Infinity, Infinity, Infinity),\n new Vector3(-Infinity, -Infinity, -Infinity),\n );\n for (const splat of renderData.offsets.keys()) {\n const splatBounds = splat.bounds;\n boxes[i++] = splatBounds;\n bounds.expand(splatBounds.min);\n bounds.expand(splatBounds.max);\n lookup.push(splat);\n }\n bounds.permute();\n bvh = new BVH(bounds, boxes);\n vertexCount = renderData.vertexCount;\n };\n\n this.testPoint = (x: number, y: number) => {\n if (renderProgram.renderData === null || renderProgram.camera === null) {\n console.error(\"IntersectionTester cannot be called before renderProgram has been initialized\");\n return null;\n }\n\n build();\n\n if (bvh === null) {\n console.error(\"Failed to build octree for IntersectionTester\");\n return null;\n }\n\n const renderData = renderProgram.renderData as RenderData;\n const camera = renderProgram.camera as Camera;\n\n if (vertexCount !== renderData.vertexCount) {\n console.warn(\"IntersectionTester has not been rebuilt since the last render\");\n }\n\n const ray = camera.screenPointToRay(x, y);\n for (let x = 0; x < maxDistance; x += resolution) {\n const point = camera.position.add(ray.multiply(x));\n const minPoint = new Vector3(\n point.x - resolution / 2,\n point.y - resolution / 2,\n point.z - resolution / 2,\n );\n const maxPoint = new Vector3(\n point.x + resolution / 2,\n point.y + resolution / 2,\n point.z + resolution / 2,\n );\n const queryBox = new Box3(minPoint, maxPoint);\n const points = bvh.queryRange(queryBox);\n if (points.length > 0) {\n return lookup[points[0]];\n }\n }\n\n return null;\n };\n }\n}\n\nexport { IntersectionTester };\n"],"names":["Vector3","constructor","x","y","z","this","equals","v","add","subtract","multiply","buffer","divide","cross","dot","lerp","t","min","Math","max","getComponent","axis","Error","minComponent","maxComponent","magnitude","sqrt","distanceTo","normalize","length","flat","clone","toString","join","One","value","Quaternion","w","q","l","w1","x1","y1","z1","w2","x2","y2","z2","inverse","apply","vecQuat","conjugate","rotatedQuat","FromEuler","e","halfX","halfY","halfZ","cy","cos","sy","sin","cp","sp","cz","sz","toEuler","sinr_cosp","cosr_cosp","atan2","sinp","abs","sign","PI","asin","siny_cosp","cosy_cosp","FromMatrix3","matrix","m","trace","s","FromAxisAngle","angle","halfAngle","LookRotation","direction","forward","rotAngle","acos","rotAxis","EventDispatcher","listeners","Map","addEventListener","type","listener","has","set","Set","get","removeEventListener","delete","hasEventListener","dispatchEvent","event","Matrix4","n11","n12","n13","n14","n21","n22","n23","n24","n31","n32","n33","n34","n41","n42","n43","n44","i","a","b","determinant","invert","det","invDet","Compose","position","rotation","scale","xx","xy","xz","yy","yz","zz","wx","wy","wz","sx","ObjectAddedEvent","Event","object","super","ObjectRemovedEvent","ObjectChangedEvent","Object3D","positionChanged","rotationChanged","scaleChanged","_position","_rotation","_scale","_transform","_changeEvent","update","applyPosition","applyRotation","applyScale","raiseChangeEvent","_updateMatrix","transform","Matrix3","Eye","Diagonal","RotationFromQuaternion","RotationFromEuler","cx","SplatData","vertexCount","positions","rotations","scales","colors","changed","detached","_vertexCount","_positions","Float32Array","_rotations","_scales","_colors","Uint8Array","_selection","translate","translation","rotate","R","currentRotation","newRot","serialize","data","RowLength","f_buffer","u_buffer","reattach","selection","console","assert","byteLength","Deserialize","SplatvData","width","height","_data","_width","_height","Uint32Array","floor","Converter","SplatToPLY","header","properties","push","property","headerBuffer","TextEncoder","encode","plyRowLength","plyLength","output","DataView","ArrayBuffer","offset","scale_offset","opacity_offset","rot_offset","pos0","pos1","pos2","f_dc_0","SH_C0","f_dc_1","f_dc_2","alpha","opacity","log","scale0","scale1","scale2","rot0","rot1","rot2","rot3","setFloat32","f_dc_offset","Box3","contains","point","intersects","box","size","center","expand","permute","Splat","splat","undefined","selectedChanged","colorTransformChanged","_selected","_colorTransforms","_colorTransformsMap","_bounds","Infinity","recalculateBounds","saveToFile","name","format","document","now","Date","getFullYear","getMonth","getDate","splatClone","blob","plyData","Blob","link","createElement","download","href","URL","createObjectURL","click","selected","colorTransforms","colorTransformsMap","bounds","Splatv","CameraData","_fx","_fy","_near","_far","_projectionMatrix","_viewMatrix","_viewProj","_updateProjectionMatrix","fx","fy","far","near","projectionMatrix","viewMatrix","setSize","viewProj","Vector4","Camera","cameraData","initialPosition","screenPointToRay","clipSpaceCoords","inverseProjectionMatrix","cameraSpaceCoords","inverseViewMatrix","worldSpaceCoords","Scene","_objects","addObject","objects","removeObject","index","indexOf","splice","findObject","predicate","findObjectOfType","reset","objectsToRemove","slice","getMergedSceneDataBuffer","buffers","mergedSplatData","mergedData","async","initiateFetchRequest","url","useCache","req","fetch","mode","credentials","cache","status","loadRequestDataIntoBuffer","res","onProgress","headers","reader","body","getReader","contentLength","parseInt","bytesRead","done","read","loadDataIntoBuffer","chunks","receivedLength","chunk","loadChunkedDataIntoBuffer","Loader","LoadAsync","scene","LoadFromArrayBuffer","LoadFromFileAsync","file","FileReader","onload","target","result","onprogress","loaded","total","readAsArrayBuffer","Promise","resolve","onloadend","arrayBuffer","PLYLoader","_ParsePLYBuffer","inputBuffer","ubuf","headerText","TextDecoder","decode","header_end","header_end_index","exec","rowOffset","offsets","double","int","uint","float","short","ushort","uchar","prop","split","filter","k","startsWith","_p","dataView","q_polycam","rgba","Uint8ClampedArray","rot","r0","r1","r2","r3","forEach","getFloat32","getInt32","exp","temp","SplatvLoader","camera","_ParseSplatvBuffer","splatv","handleChunk","intView","Int32Array","splatChunks","JSON","parse","warn","cameras","texwidth","texheight","shift","inputOffset","sizeToRead","subarray","ShaderProgram","renderer","passes","_scene","_camera","_started","_initialized","_renderer","gl","_program","createProgram","_passes","vertexShader","createShader","VERTEX_SHADER","shaderSource","_getVertexSource","compileShader","getShaderParameter","COMPILE_STATUS","error","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","_getFragmentSource","attachShader","program","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","resize","useProgram","_resize","initialize","_initialize","pass","render","dispose","_render","_dispose","started","loadWasm","moduleArg","readyPromiseResolve","readyPromiseReject","readBinary","Module","readyPromise","reject","moduleOverrides","Object","assign","scriptDirectory","self","location","replace","lastIndexOf","xhr","XMLHttpRequest","open","responseType","send","response","bind","err","wasmMemory","HEAP8","HEAPU8","HEAP16","HEAPU16","HEAP32","HEAPU32","HEAPF32","HEAP64","HEAPU64","HEAPF64","wasmBinary","ABORT","updateMemoryViews","Int8Array","Int16Array","Uint16Array","Float64Array","BigInt64Array","BigUint64Array","runDependencies","dependenciesFulfilled","abort","what","WebAssembly","RuntimeError","wasmBinaryFile","getWasmBinary","binaryFile","binary","tryParseAsDataURI","getBinarySync","instantiateAsync","imports","instantiate","reason","instantiateArrayBuffer","callRuntimeCallbacks","callbacks","onPostRuns","addOnPostRun","cb","unshift","onPreRuns","addOnPreRun","embind_charCodes","BindingError","dataURIPrefix","filename","isDataURI","b64","b1","b2","j","bLength","base64ReverseLookup","charCodeAt","base64Decode","readLatin1String","ptr","ret","c","awaitingDependencies","registeredTypes","throwBindingError","message","registerType","rawType","registeredInstance","options","hasOwnProperty","ignoreDuplicateRegistrations","sharedRegisterType","integerReadValueFromPointer","signed","pointer","TypeError","GenericWireTypeSize","emval_freelist","emval_handles","count_emval_handles","Emval","handle","pop","readPointer","EmValType","fromWireType","rv","__emval_decref","toWireType","destructors","argPackAdvance","readValueFromPointer","destructorFunction","floatReadValueFromPointer","UTF8Decoder","UTF8ToString","maxBytesToRead","heapOrArray","idx","NaN","endIdx","endPtr","str","u0","u1","u2","String","fromCharCode","ch","UTF8ArrayToString","UTF16Decoder","UTF16ToString","maxIdx","codeUnit","stringToUTF16","outPtr","maxBytesToWrite","startPtr","numCharsToWrite","lengthBytesUTF16","UTF32ToString","utf32","stringToUTF32","lengthBytesUTF32","len","growMemory","pages","grow","codes","Array","embind_init_charCodes","wasmImports","primitiveType","minRange","maxRange","isUnsignedType","embindRepr","BigInt","h","trueValue","falseValue","wt","o","f","d","bitshift","includes","dataTypeIndex","TA","decodeMemoryView","g","payload","decodeStartPtr","currentBytePtr","stringSegment","_free","valueIsOfTypeString","lengthBytesUTF8","base","_malloc","heap","outIdx","u","startIdx","stringToUTF8Array","charCode","charSize","decodeString","encodeString","readCharAt","lengthBytesUTF","isVoid","requestedSize","alignment","oldSize","maxHeapSize","cutDown","overGrownHeapSize","newSize","ceil","wasmExports","receiveInstance","instance","module","exports","id","callback","removeRunDependency","info","mod","inst","receiveInstantiationResult","createWasm","run","doRun","postRun","preRun","setTimeout","RenderData","dataChanged","transformsChanged","colorTransformsChanged","_updating","_dirty","splatIndex","_splatIndices","_offsets","lookup","_transformsWidth","_transformsHeight","_transforms","_transformIndicesWidth","_transformIndicesHeight","_transformIndices","_colorTransformsWidth","_colorTransformsHeight","fill","_colorTransformIndicesWidth","_colorTransformIndicesHeight","_colorTransformIndices","colorTransformIndices","_worker","DataWorker","updateTransform","updateColorTransforms","keys","colorTransform","colorTransformIndex","wasmModule","onmessage","worldPositions","worldRotations","worldScales","initWasm","buildImmediate","waitForWasm","then","positionsPtr","rotationsPtr","scalesPtr","colorsPtr","selectionPtr","dataPtr","worldPositionsPtr","worldRotationsPtr","worldScalesPtr","_pack","outData","build","serializedSplat","postMessage","getSplat","key","getLocalIndex","markDirty","rebuild","clear","terminate","transforms","transformsWidth","transformsHeight","transformIndices","transformIndicesWidth","transformIndicesHeight","colorTransformsWidth","colorTransformsHeight","colorTransformIndicesWidth","colorTransformIndicesHeight","needsRebuild","updating","Color32","r","flatNorm","toHexString","map","padStart","RenderProgram","_outlineThickness","_outlineColor","_renderData","_depthIndex","_splatTexture","canvas","u_projection","u_viewport","u_focal","u_view","u_texture","u_transforms","u_transformIndices","u_colorTransforms","u_colorTransformIndices","u_outlineThickness","u_outlineColor","positionAttribute","indexAttribute","transformsTexture","transformIndicesTexture","colorTransformsTexture","colorTransformIndicesTexture","vertexBuffer","indexBuffer","getUniformLocation","uniformMatrix4fv","uniform2fv","createWorker","SortWorker","depthIndex","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","handleObjectAdded","handleObjectRemoved","handleObjectChanged","uniform1f","outlineThickness","uniform4fv","outlineColor","createTexture","uniform1i","createBuffer","getAttribLocation","enableVertexAttribArray","vertexAttribPointer","FLOAT","resetSplatData","_a","_b","renderData","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","splatTexture","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","texImage2D","RGBA32UI","RGBA_INTEGER","UNSIGNED_INT","TEXTURE1","RGBA32F","RGBA","TEXTURE2","R32UI","RED_INTEGER","TEXTURE3","TEXTURE4","detachedPositions","detachedTransforms","detachedTransformIndices","sortData","viewport","clearColor","COLOR_BUFFER_BIT","disable","DEPTH_TEST","enable","BLEND","blendFuncSeparate","ONE_MINUS_DST_ALPHA","ONE","blendEquationSeparate","FUNC_ADD","vertexAttribIPointer","INT","vertexAttribDivisor","drawArraysInstanced","TRIANGLE_FAN","deleteTexture","deleteBuffer","_setOutlineThickness","_setOutlineColor","worker","FadeInPass","speed","renderProgram","u_useDepthFade","u_depthFade","active","WebGLRenderer","optionalCanvas","optionalRenderPasses","_backgroundColor","style","display","boxSizing","margin","padding","appendChild","background","_canvas","_gl","getContext","antialias","renderPasses","_renderProgram","programs","clientWidth","clientHeight","addProgram","removeProgram","backgroundColor","OrbitControls","beta","radius","enableKeyboardControls","inputTarget","initAlpha","initBeta","initRadius","minAngle","maxAngle","minAzimuth","maxAzimuth","minZoom","maxZoom","orbitSpeed","panSpeed","zoomSpeed","dampening","setCameraTarget","defaultAlpha","defaultBeta","defaultRadius","desiredTarget","desiredAlpha","desiredBeta","desiredRadius","currentAlpha","currentBeta","currentRadius","dragging","panning","lastDist","lastX","lastY","newTarget","dx","dy","dz","computeZoomNorm","onKeyDown","code","onKeyUp","onMouseDown","preventDefault","button","clientX","clientY","window","onMouseUp","onMouseMove","zoomNorm","panX","panY","right","up","onWheel","deltaY","onTouchStart","touches","distX","distY","onTouchEnd","onTouchMove","dist","touchX","touchY","rx","ry","moveSpeed","rotateSpeed","stopPropagation","FPSControls","lookSpeed","pitch","yaw","targetPosition","pointerLock","requestPointerLock","onPointerLockChange","pointerLockElement","mouseX","movementX","mouseY","movementY","exitPointerLock","move","Plane","normal","intersect","origin","denominator","ShaderPass","VideoRenderProgram","u_time","setupWorker","dummyTransforms","dummyTransformIndices","BVHNode","boxes","pointIndices","left","sort","mid","leftIndices","rightIndices","queryRange","range","concat","BVH","_","root","IntersectionTester","maxDistance","resolution","bvh","testPoint","splatBounds","ray","minPoint","maxPoint","queryBox","points"],"mappings":"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IACK3E,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAEtI2E,GACI3E,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAEnI2E,IACK3E,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAEhI2E,IACK3E,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAEtI2E,GACI3E,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE,IAErI2E,IACK3E,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAKA,EAAE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"}