@onerjs/loaders 8.52.4 → 8.52.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/SPLAT/sog.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { AllocateShBuffers } from "@onerjs/core/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js";
1
2
  import { Scalar } from "@onerjs/core/Maths/math.scalar.js";
2
3
  import { RawTexture } from "@onerjs/core/Materials/Textures/rawTexture.js";
3
4
  import { Constants } from "@onerjs/core/Engines/constants.js";
@@ -195,16 +196,11 @@ async function ParseSogDatas(data, imageDataArrays, scene) {
195
196
  const shComponentCount = coeffs * 3;
196
197
  const textureCount = Math.ceil(shComponentCount / 16); // 4 components can be stored per texture, 4 sh per component
197
198
  //let shIndexRead = byteOffset;
198
- // sh is an array of uint8array that will be used to create sh textures
199
- const sh = [];
200
199
  const engine = scene.getEngine();
201
200
  const width = engine.getCaps().maxTextureSize;
202
201
  const height = Math.ceil(splatCount / width);
203
- // create array for the number of textures needed.
204
- for (let textureIndex = 0; textureIndex < textureCount; textureIndex++) {
205
- const texture = new Uint8Array(height * width * 4 * 4); // 4 components per texture, 4 sh per component
206
- sh.push(texture);
207
- }
202
+ // sh is an array of uint8array that will be used to create sh textures
203
+ const sh = AllocateShBuffers(textureCount, height * width * 4 * 4);
208
204
  if (data.version === 2) {
209
205
  if (!data.shN.codebook) {
210
206
  throw new Error("Missing codebook in SOG version 2 shN data.");
package/SPLAT/sog.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sog.js","sourceRoot":"","sources":["../../../../dev/loaders/src/SPLAT/sog.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Scene } from \"core/scene\";\r\nimport { type IParsedSplat, type ISogTexturePack, Mode } from \"./splatDefs\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { type AbstractEngine } from \"core/Engines\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\n/**\r\n * Definition of a SOG data file\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface SOGDataFile {\r\n /**\r\n * index 0 is number of splats index 1 is number of components per splat (3 for vec3, 4 for vec4, etc.)\r\n */\r\n shape: number[];\r\n /**\r\n * type of components\r\n */\r\n dtype: string;\r\n /**\r\n * min range of data\r\n */\r\n mins?: number | number[];\r\n /**\r\n * max range of data\r\n */\r\n maxs?: number | number[];\r\n /**\r\n * palette for indexed data (quantized)\r\n */\r\n codebook?: number[]; // Only for version 2\r\n /**\r\n * type of encoding\r\n */\r\n encoding?: string;\r\n /**\r\n * number of bits for quantization (if any)\r\n */\r\n quantization?: number;\r\n /**\r\n * webp file names\r\n */\r\n files: string[];\r\n /**\r\n * SH band count (if applicable)\r\n */\r\n bands?: number;\r\n}\r\n\r\n/**\r\n * Definition of the root SOG data file\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface SOGRootData {\r\n /**\r\n * version of the SOG format\r\n */\r\n version?: number;\r\n /**\r\n * mean positions of the splats\r\n */\r\n means: SOGDataFile;\r\n /**\r\n * scales of the splats\r\n */\r\n scales: SOGDataFile;\r\n /**\r\n * quaternions of the splats\r\n */\r\n quats: SOGDataFile;\r\n /**\r\n * SH0 coefficients of the splats (base color)\r\n */\r\n sh0: SOGDataFile;\r\n /**\r\n * Optional higher order SH coefficients of the splats (lighting information)\r\n */\r\n shN?: SOGDataFile;\r\n /**\r\n * number of splats (optional, can be inferred from means.shape[0])\r\n */\r\n count?: number;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ninterface IWebPImage {\r\n bits: Uint8Array;\r\n width: number;\r\n}\r\nconst SH_C0 = 0.28209479177387814;\r\n\r\nasync function LoadWebpImageData(rootUrlOrData: string | Uint8Array, filename: string, engine: AbstractEngine): Promise<IWebPImage> {\r\n const promise = new Promise<IWebPImage>((resolve, reject) => {\r\n const image = engine.createCanvasImage();\r\n if (!image) {\r\n throw new Error(\"Failed to create ImageBitmap\");\r\n }\r\n image.onload = () => {\r\n try {\r\n // Draw to canvas\r\n const canvas = engine.createCanvas(image.width, image.height);\r\n if (!canvas) {\r\n throw new Error(\"Failed to create canvas\");\r\n }\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n throw new Error(\"Failed to get 2D context\");\r\n }\r\n ctx.drawImage(image, 0, 0);\r\n\r\n // Extract pixel data (RGBA per pixel)\r\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n resolve({ bits: new Uint8Array(imageData.data.buffer), width: imageData.width });\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n }\r\n };\r\n image.onerror = (error) => {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n };\r\n\r\n image.crossOrigin = \"anonymous\"; // To avoid CORS issues\r\n let objectUrl: string | undefined;\r\n if (typeof rootUrlOrData === \"string\") {\r\n // old behavior: URL + filename\r\n if (!filename) {\r\n throw new Error(\"filename is required when using a URL\");\r\n }\r\n image.src = rootUrlOrData + filename;\r\n } else {\r\n // new behavior: Uint8Array\r\n const blob = new Blob([rootUrlOrData as any], { type: \"image/webp\" });\r\n objectUrl = URL.createObjectURL(blob);\r\n image.src = objectUrl;\r\n }\r\n });\r\n return await promise;\r\n}\r\n\r\nasync function ParseSogDatas(data: SOGRootData, imageDataArrays: IWebPImage[], scene: Scene): Promise<IParsedSplat> {\r\n const splatCount = data.count ? data.count : data.means.shape[0];\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n\r\n const position = new Float32Array(buffer);\r\n const scale = new Float32Array(buffer);\r\n const rgba = new Uint8ClampedArray(buffer);\r\n const rot = new Uint8ClampedArray(buffer);\r\n\r\n // Undo the symmetric log transform used at encode time:\r\n const unlog = (n: number) => Math.sign(n) * (Math.exp(Math.abs(n)) - 1);\r\n\r\n const meansl = imageDataArrays[0].bits;\r\n const meansu = imageDataArrays[1].bits;\r\n // Check that data.means.mins is an array\r\n if (!Array.isArray(data.means.mins) || !Array.isArray(data.means.maxs)) {\r\n throw new Error(\"Missing arrays in SOG data.\");\r\n }\r\n\r\n // --- Positions\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const meansMin = data.means.mins[j];\r\n const meansMax = data.means.maxs[j];\r\n const meansup = meansu[index + j];\r\n const meanslow = meansl[index + j];\r\n const q = (meansup << 8) | meanslow;\r\n const n = Scalar.Lerp(meansMin, meansMax, q / 65535);\r\n position[i * 8 + j] = unlog(n);\r\n }\r\n }\r\n\r\n // --- Scales\r\n const scales = imageDataArrays[2].bits;\r\n if (data.version === 2) {\r\n if (!data.scales.codebook) {\r\n throw new Error(\"Missing codebook in SOG version 2 scales data.\");\r\n }\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const sc = data.scales.codebook[scales[index + j]];\r\n const sce = Math.exp(sc);\r\n scale[i * 8 + 3 + j] = sce;\r\n }\r\n }\r\n } else {\r\n if (!Array.isArray(data.scales.mins) || !Array.isArray(data.scales.maxs)) {\r\n throw new Error(\"Missing arrays in SOG scales data.\");\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const sc = scales[index + j];\r\n const lsc = Scalar.Lerp(data.scales.mins[j], data.scales.maxs[j], sc / 255);\r\n const lsce = Math.exp(lsc);\r\n scale[i * 8 + 3 + j] = lsce;\r\n }\r\n }\r\n }\r\n\r\n // --- Colors/SH0\r\n const colors = imageDataArrays[4].bits;\r\n if (data.version === 2) {\r\n if (!data.sh0.codebook) {\r\n throw new Error(\"Missing codebook in SOG version 2 sh0 data.\");\r\n }\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const component = 0.5 + data.sh0.codebook[colors[index + j]] * SH_C0;\r\n rgba[i * 32 + 24 + j] = Math.max(0, Math.min(255, Math.round(255 * component)));\r\n }\r\n rgba[i * 32 + 24 + 3] = colors[index + 3];\r\n }\r\n } else {\r\n if (!Array.isArray(data.sh0.mins) || !Array.isArray(data.sh0.maxs)) {\r\n throw new Error(\"Missing arrays in SOG sh0 data.\");\r\n }\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 4; j++) {\r\n const colorsMin = data.sh0.mins[j];\r\n const colorsMax = data.sh0.maxs[j];\r\n\r\n const colort = colors[index + j];\r\n const c = Scalar.Lerp(colorsMin, colorsMax, colort / 255);\r\n\r\n let csh;\r\n if (j < 3) {\r\n csh = 0.5 + c * SH_C0;\r\n } else {\r\n csh = 1.0 / (1.0 + Math.exp(-c));\r\n }\r\n\r\n rgba[i * 32 + 24 + j] = Math.max(0, Math.min(255, Math.round(255 * csh)));\r\n }\r\n }\r\n }\r\n\r\n // --- Rotations\r\n // Dequantize the stored three components:\r\n const toComp = (c: number) => ((c / 255 - 0.5) * 2.0) / Math.SQRT2;\r\n\r\n const quatArray = imageDataArrays[3].bits;\r\n for (let i = 0; i < splatCount; i++) {\r\n const quatsr = quatArray[i * 4 + 0];\r\n const quatsg = quatArray[i * 4 + 1];\r\n const quatsb = quatArray[i * 4 + 2];\r\n const quatsa = quatArray[i * 4 + 3];\r\n\r\n const a = toComp(quatsr);\r\n const b = toComp(quatsg);\r\n const c = toComp(quatsb);\r\n\r\n const mode = quatsa - 252; // 0..3 (R,G,B,A is one of the four components)\r\n\r\n // Reconstruct the omitted component so that ||q|| = 1 and w.l.o.g. the omitted one is non-negative\r\n const t = a * a + b * b + c * c;\r\n const d = Math.sqrt(Math.max(0, 1 - t));\r\n\r\n // Place components according to mode\r\n let q: [number, number, number, number];\r\n switch (mode) {\r\n case 0:\r\n q = [d, a, b, c];\r\n break; // omitted = x\r\n case 1:\r\n q = [a, d, b, c];\r\n break; // omitted = y\r\n case 2:\r\n q = [a, b, d, c];\r\n break; // omitted = z\r\n case 3:\r\n q = [a, b, c, d];\r\n break; // omitted = w\r\n default:\r\n throw new Error(\"Invalid quaternion mode\");\r\n }\r\n\r\n rot[i * 32 + 28 + 0] = q[0] * 127.5 + 127.5;\r\n rot[i * 32 + 28 + 1] = q[1] * 127.5 + 127.5;\r\n rot[i * 32 + 28 + 2] = q[2] * 127.5 + 127.5;\r\n rot[i * 32 + 28 + 3] = q[3] * 127.5 + 127.5;\r\n }\r\n\r\n // --- SH\r\n if (data.shN) {\r\n const coeffs = data.shN.bands ? (data.shN.bands + 1) ** 2 - 1 : data.shN.shape[1] / 3; // 3 components per coeff\r\n const shDegree = data.shN.bands !== undefined && data.shN.bands !== null ? data.shN.bands : Math.round(Math.sqrt(coeffs + 1) - 1);\r\n const shCentroids = imageDataArrays[5].bits;\r\n const shLabelsData = imageDataArrays[6].bits;\r\n const shCentroidsWidth = imageDataArrays[5].width;\r\n\r\n const shComponentCount = coeffs * 3;\r\n\r\n const textureCount = Math.ceil(shComponentCount / 16); // 4 components can be stored per texture, 4 sh per component\r\n //let shIndexRead = byteOffset;\r\n\r\n // sh is an array of uint8array that will be used to create sh textures\r\n const sh: Uint8Array[] = [];\r\n\r\n const engine = scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n // create array for the number of textures needed.\r\n for (let textureIndex = 0; textureIndex < textureCount; textureIndex++) {\r\n const texture = new Uint8Array(height * width * 4 * 4); // 4 components per texture, 4 sh per component\r\n sh.push(texture);\r\n }\r\n\r\n if (data.version === 2) {\r\n if (!data.shN.codebook) {\r\n throw new Error(\"Missing codebook in SOG version 2 shN data.\");\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n const n = shLabelsData[i * 4 + 0] + (shLabelsData[i * 4 + 1] << 8);\r\n const u = (n % 64) * coeffs;\r\n const v = Math.floor(n / 64);\r\n\r\n for (let k = 0; k < coeffs; k++) {\r\n for (let j = 0; j < 3; j++) {\r\n const shIndexWrite = k * 3 + j;\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n\r\n const shValue = data.shN.codebook[shCentroids[(u + k) * 4 + j + v * shCentroidsWidth * 4]] * 127.5 + 127.5;\r\n shArray[byteIndexInTexture + offsetPerSplat] = Math.max(0, Math.min(255, shValue));\r\n }\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < splatCount; i++) {\r\n const n = shLabelsData[i * 4 + 0] + (shLabelsData[i * 4 + 1] << 8);\r\n const u = (n % 64) * coeffs;\r\n const v = Math.floor(n / 64);\r\n const shMin = data.shN.mins as number;\r\n const shMax = data.shN.maxs as number;\r\n\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < coeffs / 3; k++) {\r\n const shIndexWrite = k * 3 + j;\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n\r\n const shValue = Scalar.Lerp(shMin, shMax, shCentroids[(u + k) * 4 + j + v * shCentroidsWidth * 4] / 255) * 127.5 + 127.5;\r\n shArray[byteIndexInTexture + offsetPerSplat] = Math.max(0, Math.min(255, shValue));\r\n }\r\n }\r\n }\r\n }\r\n return await new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, sh: sh, shDegree: shDegree });\r\n });\r\n }\r\n\r\n return await new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false });\r\n });\r\n}\r\n\r\n/**\r\n * Parse SOG data from either a SOGRootData object (with webp files loaded from rootUrl) or from a Map of filenames to Uint8Array file data (including meta.json)\r\n * @param dataOrFiles Either the SOGRootData or a Map of filenames to Uint8Array file data (including meta.json)\r\n * @param rootUrl Base URL to load webp files from (if dataOrFiles is SOGRootData)\r\n * @param scene The Babylon.js scene\r\n * @returns Parsed data\r\n */\r\nexport async function ParseSogMeta(dataOrFiles: SOGRootData | Map<string, Uint8Array>, rootUrl: string, scene: Scene): Promise<IParsedSplat> {\r\n let data: SOGRootData;\r\n let files: Map<string, Uint8Array> | undefined;\r\n\r\n if (dataOrFiles instanceof Map) {\r\n files = dataOrFiles;\r\n\r\n const metaFile = files.get(\"meta.json\");\r\n if (!metaFile) {\r\n throw new Error(\"meta.json not found in files Map\");\r\n }\r\n\r\n data = JSON.parse(new TextDecoder().decode(metaFile)) as SOGRootData;\r\n } else {\r\n data = dataOrFiles;\r\n }\r\n\r\n // Collect all file names\r\n const urls = [...data.means.files, ...data.scales.files, ...data.quats.files, ...data.sh0.files];\r\n if (data.shN) {\r\n urls.push(...data.shN.files);\r\n }\r\n\r\n // Load webp images in parallel\r\n const imageDataArrays: IWebPImage[] = await Promise.all(\r\n urls.map(async (fileName) => {\r\n if (files && files.has(fileName)) {\r\n // load from in-memory Uint8Array\r\n const fileData = files.get(fileName)!;\r\n return await LoadWebpImageData(fileData, fileName, scene.getEngine());\r\n } else {\r\n // fallback: load from URL\r\n return await LoadWebpImageData(rootUrl, fileName, scene.getEngine());\r\n }\r\n })\r\n );\r\n\r\n return await ParseSogDatas(data, imageDataArrays, scene);\r\n}\r\n\r\nfunction CreateSogTexture(scene: Scene, bits: Uint8Array, width: number, height: number): RawTexture {\r\n const tex = new RawTexture(bits, width, height, Constants.TEXTUREFORMAT_RGBA, scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTURETYPE_UNSIGNED_BYTE);\r\n tex.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n tex.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n return tex;\r\n}\r\n\r\nfunction DecodeSogPositions(data: SOGRootData, meansl: Uint8Array, meansu: Uint8Array, splatCount: number): Float32Array {\r\n const unlog = (n: number) => Math.sign(n) * (Math.exp(Math.abs(n)) - 1);\r\n if (!Array.isArray(data.means.mins) || !Array.isArray(data.means.maxs)) {\r\n throw new Error(\"Missing arrays in SOG data.\");\r\n }\r\n // Stride-4 layout (x,y,z,w) expected by the depth-sort worker and the centers texture.\r\n const positions = new Float32Array(splatCount * 4);\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const q = (meansu[index + j] << 8) | meansl[index + j];\r\n const n = Scalar.Lerp(data.means.mins[j], data.means.maxs[j], q / 65535);\r\n positions[i * 4 + j] = unlog(n);\r\n }\r\n positions[i * 4 + 3] = 1.0;\r\n }\r\n return positions;\r\n}\r\n\r\n/**\r\n * Parse SOG data and produce a set of GPU textures + dequantization parameters.\r\n * The shader will sample these raw RGBA8 textures and reconstruct positions/scales/rotations/colors/SH on the GPU.\r\n * @param dataOrFiles Either the SOGRootData or a Map of filenames to Uint8Array file data (including meta.json)\r\n * @param rootUrl Base URL to load webp files from (if dataOrFiles is SOGRootData)\r\n * @param scene The Babylon.js scene\r\n * @returns Parsed splat info with `sogTextures` populated.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-restricted-types\r\nexport async function ParseSogMetaAsTextures(dataOrFiles: SOGRootData | Map<string, Uint8Array>, rootUrl: string, scene: Scene): Promise<IParsedSplat> {\r\n let data: SOGRootData;\r\n let files: Map<string, Uint8Array> | undefined;\r\n\r\n if (dataOrFiles instanceof Map) {\r\n files = dataOrFiles;\r\n const metaFile = files.get(\"meta.json\");\r\n if (!metaFile) {\r\n throw new Error(\"meta.json not found in files Map\");\r\n }\r\n data = JSON.parse(new TextDecoder().decode(metaFile)) as SOGRootData;\r\n } else {\r\n data = dataOrFiles;\r\n }\r\n\r\n const urls = [...data.means.files, ...data.scales.files, ...data.quats.files, ...data.sh0.files];\r\n if (data.shN) {\r\n urls.push(...data.shN.files);\r\n }\r\n\r\n const images: IWebPImage[] = await Promise.all(\r\n urls.map(async (fileName) => {\r\n if (files && files.has(fileName)) {\r\n return await LoadWebpImageData(files.get(fileName)!, fileName, scene.getEngine());\r\n }\r\n return await LoadWebpImageData(rootUrl, fileName, scene.getEngine());\r\n })\r\n );\r\n\r\n const splatCount = data.count ?? data.means.shape[0];\r\n const engine = scene.getEngine();\r\n const splatTextureWidth = Math.min(splatCount, engine.getCaps().maxTextureSize);\r\n const splatTextureHeight = Math.ceil(splatCount / splatTextureWidth);\r\n\r\n // means_l, means_u, scales, quats, sh0 share the same (w,h)\r\n const meansL = CreateSogTexture(scene, images[0].bits, splatTextureWidth, splatTextureHeight);\r\n const meansU = CreateSogTexture(scene, images[1].bits, splatTextureWidth, splatTextureHeight);\r\n const scales = CreateSogTexture(scene, images[2].bits, splatTextureWidth, splatTextureHeight);\r\n const quats = CreateSogTexture(scene, images[3].bits, splatTextureWidth, splatTextureHeight);\r\n const sh0 = CreateSogTexture(scene, images[4].bits, splatTextureWidth, splatTextureHeight);\r\n\r\n let shCentroids: RawTexture | undefined;\r\n let shLabels: RawTexture | undefined;\r\n let shCoeffCount = 0;\r\n let shDegree = 0;\r\n\r\n if (data.shN && images.length >= 7) {\r\n const centroidsImage = images[5];\r\n const labelsImage = images[6];\r\n const centroidsHeight = centroidsImage.bits.length / 4 / centroidsImage.width;\r\n shCentroids = CreateSogTexture(scene, centroidsImage.bits, centroidsImage.width, centroidsHeight);\r\n const labelsHeight = labelsImage.bits.length / 4 / labelsImage.width;\r\n shLabels = CreateSogTexture(scene, labelsImage.bits, labelsImage.width, labelsHeight);\r\n\r\n shCoeffCount = data.shN.bands ? (data.shN.bands + 1) ** 2 - 1 : data.shN.shape[1] / 3;\r\n shDegree = data.shN.bands ?? Math.round(Math.sqrt(shCoeffCount + 1) - 1);\r\n }\r\n\r\n // Optional codebook packed into a 1D R32F texture: [scales(256) | sh0(256) | shN(256)]\r\n let codebookTexture: RawTexture | undefined;\r\n if (data.version === 2) {\r\n const codebookSize = 256;\r\n const packed = new Float32Array(codebookSize * 3);\r\n if (data.scales.codebook) {\r\n packed.set(data.scales.codebook.slice(0, codebookSize), 0);\r\n }\r\n if (data.sh0.codebook) {\r\n packed.set(data.sh0.codebook.slice(0, codebookSize), codebookSize);\r\n }\r\n if (data.shN?.codebook) {\r\n packed.set(data.shN.codebook.slice(0, codebookSize), codebookSize * 2);\r\n }\r\n codebookTexture = new RawTexture(\r\n packed,\r\n codebookSize * 3,\r\n 1,\r\n Constants.TEXTUREFORMAT_R,\r\n scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n codebookTexture.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n codebookTexture.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n }\r\n\r\n const meansMins = data.means.mins as number[];\r\n const meansMaxs = data.means.maxs as number[];\r\n\r\n const pack: ISogTexturePack = {\r\n version: (data.version === 2 ? 2 : 1) as 1 | 2,\r\n splatCount,\r\n shDegree,\r\n meansTextureL: meansL,\r\n meansTextureU: meansU,\r\n scalesTexture: scales,\r\n quatsTexture: quats,\r\n sh0Texture: sh0,\r\n shCentroidsTexture: shCentroids,\r\n shLabelsTexture: shLabels,\r\n codebookTexture,\r\n meansMin: [meansMins[0], meansMins[1], meansMins[2]],\r\n meansMax: [meansMaxs[0], meansMaxs[1], meansMaxs[2]],\r\n scalesMin: Array.isArray(data.scales.mins) ? [data.scales.mins[0], data.scales.mins[1], data.scales.mins[2]] : undefined,\r\n scalesMax: Array.isArray(data.scales.maxs) ? [data.scales.maxs[0], data.scales.maxs[1], data.scales.maxs[2]] : undefined,\r\n sh0Min: Array.isArray(data.sh0.mins) ? [data.sh0.mins[0], data.sh0.mins[1], data.sh0.mins[2], data.sh0.mins[3]] : undefined,\r\n sh0Max: Array.isArray(data.sh0.maxs) ? [data.sh0.maxs[0], data.sh0.maxs[1], data.sh0.maxs[2], data.sh0.maxs[3]] : undefined,\r\n shnMin: typeof data.shN?.mins === \"number\" ? data.shN.mins : undefined,\r\n shnMax: typeof data.shN?.maxs === \"number\" ? data.shN.maxs : undefined,\r\n shCoeffCount,\r\n positions: DecodeSogPositions(data, images[0].bits, images[1].bits, splatCount),\r\n };\r\n\r\n return { mode: Mode.Splat, data: new ArrayBuffer(0), hasVertexColors: false, shDegree, sogTextures: pack };\r\n}\r\n"]}
1
+ {"version":3,"file":"sog.js","sourceRoot":"","sources":["../../../../dev/loaders/src/SPLAT/sog.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Scene } from \"core/scene\";\r\nimport { type IParsedSplat, type ISogTexturePack, Mode } from \"./splatDefs\";\r\nimport { AllocateShBuffers } from \"core/Meshes/GaussianSplatting/gaussianSplattingMeshBase\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { type AbstractEngine } from \"core/Engines\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\n/**\r\n * Definition of a SOG data file\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface SOGDataFile {\r\n /**\r\n * index 0 is number of splats index 1 is number of components per splat (3 for vec3, 4 for vec4, etc.)\r\n */\r\n shape: number[];\r\n /**\r\n * type of components\r\n */\r\n dtype: string;\r\n /**\r\n * min range of data\r\n */\r\n mins?: number | number[];\r\n /**\r\n * max range of data\r\n */\r\n maxs?: number | number[];\r\n /**\r\n * palette for indexed data (quantized)\r\n */\r\n codebook?: number[]; // Only for version 2\r\n /**\r\n * type of encoding\r\n */\r\n encoding?: string;\r\n /**\r\n * number of bits for quantization (if any)\r\n */\r\n quantization?: number;\r\n /**\r\n * webp file names\r\n */\r\n files: string[];\r\n /**\r\n * SH band count (if applicable)\r\n */\r\n bands?: number;\r\n}\r\n\r\n/**\r\n * Definition of the root SOG data file\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface SOGRootData {\r\n /**\r\n * version of the SOG format\r\n */\r\n version?: number;\r\n /**\r\n * mean positions of the splats\r\n */\r\n means: SOGDataFile;\r\n /**\r\n * scales of the splats\r\n */\r\n scales: SOGDataFile;\r\n /**\r\n * quaternions of the splats\r\n */\r\n quats: SOGDataFile;\r\n /**\r\n * SH0 coefficients of the splats (base color)\r\n */\r\n sh0: SOGDataFile;\r\n /**\r\n * Optional higher order SH coefficients of the splats (lighting information)\r\n */\r\n shN?: SOGDataFile;\r\n /**\r\n * number of splats (optional, can be inferred from means.shape[0])\r\n */\r\n count?: number;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ninterface IWebPImage {\r\n bits: Uint8Array;\r\n width: number;\r\n}\r\nconst SH_C0 = 0.28209479177387814;\r\n\r\nasync function LoadWebpImageData(rootUrlOrData: string | Uint8Array, filename: string, engine: AbstractEngine): Promise<IWebPImage> {\r\n const promise = new Promise<IWebPImage>((resolve, reject) => {\r\n const image = engine.createCanvasImage();\r\n if (!image) {\r\n throw new Error(\"Failed to create ImageBitmap\");\r\n }\r\n image.onload = () => {\r\n try {\r\n // Draw to canvas\r\n const canvas = engine.createCanvas(image.width, image.height);\r\n if (!canvas) {\r\n throw new Error(\"Failed to create canvas\");\r\n }\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n throw new Error(\"Failed to get 2D context\");\r\n }\r\n ctx.drawImage(image, 0, 0);\r\n\r\n // Extract pixel data (RGBA per pixel)\r\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n resolve({ bits: new Uint8Array(imageData.data.buffer), width: imageData.width });\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n }\r\n };\r\n image.onerror = (error) => {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n };\r\n\r\n image.crossOrigin = \"anonymous\"; // To avoid CORS issues\r\n let objectUrl: string | undefined;\r\n if (typeof rootUrlOrData === \"string\") {\r\n // old behavior: URL + filename\r\n if (!filename) {\r\n throw new Error(\"filename is required when using a URL\");\r\n }\r\n image.src = rootUrlOrData + filename;\r\n } else {\r\n // new behavior: Uint8Array\r\n const blob = new Blob([rootUrlOrData as any], { type: \"image/webp\" });\r\n objectUrl = URL.createObjectURL(blob);\r\n image.src = objectUrl;\r\n }\r\n });\r\n return await promise;\r\n}\r\n\r\nasync function ParseSogDatas(data: SOGRootData, imageDataArrays: IWebPImage[], scene: Scene): Promise<IParsedSplat> {\r\n const splatCount = data.count ? data.count : data.means.shape[0];\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n\r\n const position = new Float32Array(buffer);\r\n const scale = new Float32Array(buffer);\r\n const rgba = new Uint8ClampedArray(buffer);\r\n const rot = new Uint8ClampedArray(buffer);\r\n\r\n // Undo the symmetric log transform used at encode time:\r\n const unlog = (n: number) => Math.sign(n) * (Math.exp(Math.abs(n)) - 1);\r\n\r\n const meansl = imageDataArrays[0].bits;\r\n const meansu = imageDataArrays[1].bits;\r\n // Check that data.means.mins is an array\r\n if (!Array.isArray(data.means.mins) || !Array.isArray(data.means.maxs)) {\r\n throw new Error(\"Missing arrays in SOG data.\");\r\n }\r\n\r\n // --- Positions\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const meansMin = data.means.mins[j];\r\n const meansMax = data.means.maxs[j];\r\n const meansup = meansu[index + j];\r\n const meanslow = meansl[index + j];\r\n const q = (meansup << 8) | meanslow;\r\n const n = Scalar.Lerp(meansMin, meansMax, q / 65535);\r\n position[i * 8 + j] = unlog(n);\r\n }\r\n }\r\n\r\n // --- Scales\r\n const scales = imageDataArrays[2].bits;\r\n if (data.version === 2) {\r\n if (!data.scales.codebook) {\r\n throw new Error(\"Missing codebook in SOG version 2 scales data.\");\r\n }\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const sc = data.scales.codebook[scales[index + j]];\r\n const sce = Math.exp(sc);\r\n scale[i * 8 + 3 + j] = sce;\r\n }\r\n }\r\n } else {\r\n if (!Array.isArray(data.scales.mins) || !Array.isArray(data.scales.maxs)) {\r\n throw new Error(\"Missing arrays in SOG scales data.\");\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const sc = scales[index + j];\r\n const lsc = Scalar.Lerp(data.scales.mins[j], data.scales.maxs[j], sc / 255);\r\n const lsce = Math.exp(lsc);\r\n scale[i * 8 + 3 + j] = lsce;\r\n }\r\n }\r\n }\r\n\r\n // --- Colors/SH0\r\n const colors = imageDataArrays[4].bits;\r\n if (data.version === 2) {\r\n if (!data.sh0.codebook) {\r\n throw new Error(\"Missing codebook in SOG version 2 sh0 data.\");\r\n }\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const component = 0.5 + data.sh0.codebook[colors[index + j]] * SH_C0;\r\n rgba[i * 32 + 24 + j] = Math.max(0, Math.min(255, Math.round(255 * component)));\r\n }\r\n rgba[i * 32 + 24 + 3] = colors[index + 3];\r\n }\r\n } else {\r\n if (!Array.isArray(data.sh0.mins) || !Array.isArray(data.sh0.maxs)) {\r\n throw new Error(\"Missing arrays in SOG sh0 data.\");\r\n }\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 4; j++) {\r\n const colorsMin = data.sh0.mins[j];\r\n const colorsMax = data.sh0.maxs[j];\r\n\r\n const colort = colors[index + j];\r\n const c = Scalar.Lerp(colorsMin, colorsMax, colort / 255);\r\n\r\n let csh;\r\n if (j < 3) {\r\n csh = 0.5 + c * SH_C0;\r\n } else {\r\n csh = 1.0 / (1.0 + Math.exp(-c));\r\n }\r\n\r\n rgba[i * 32 + 24 + j] = Math.max(0, Math.min(255, Math.round(255 * csh)));\r\n }\r\n }\r\n }\r\n\r\n // --- Rotations\r\n // Dequantize the stored three components:\r\n const toComp = (c: number) => ((c / 255 - 0.5) * 2.0) / Math.SQRT2;\r\n\r\n const quatArray = imageDataArrays[3].bits;\r\n for (let i = 0; i < splatCount; i++) {\r\n const quatsr = quatArray[i * 4 + 0];\r\n const quatsg = quatArray[i * 4 + 1];\r\n const quatsb = quatArray[i * 4 + 2];\r\n const quatsa = quatArray[i * 4 + 3];\r\n\r\n const a = toComp(quatsr);\r\n const b = toComp(quatsg);\r\n const c = toComp(quatsb);\r\n\r\n const mode = quatsa - 252; // 0..3 (R,G,B,A is one of the four components)\r\n\r\n // Reconstruct the omitted component so that ||q|| = 1 and w.l.o.g. the omitted one is non-negative\r\n const t = a * a + b * b + c * c;\r\n const d = Math.sqrt(Math.max(0, 1 - t));\r\n\r\n // Place components according to mode\r\n let q: [number, number, number, number];\r\n switch (mode) {\r\n case 0:\r\n q = [d, a, b, c];\r\n break; // omitted = x\r\n case 1:\r\n q = [a, d, b, c];\r\n break; // omitted = y\r\n case 2:\r\n q = [a, b, d, c];\r\n break; // omitted = z\r\n case 3:\r\n q = [a, b, c, d];\r\n break; // omitted = w\r\n default:\r\n throw new Error(\"Invalid quaternion mode\");\r\n }\r\n\r\n rot[i * 32 + 28 + 0] = q[0] * 127.5 + 127.5;\r\n rot[i * 32 + 28 + 1] = q[1] * 127.5 + 127.5;\r\n rot[i * 32 + 28 + 2] = q[2] * 127.5 + 127.5;\r\n rot[i * 32 + 28 + 3] = q[3] * 127.5 + 127.5;\r\n }\r\n\r\n // --- SH\r\n if (data.shN) {\r\n const coeffs = data.shN.bands ? (data.shN.bands + 1) ** 2 - 1 : data.shN.shape[1] / 3; // 3 components per coeff\r\n const shDegree = data.shN.bands !== undefined && data.shN.bands !== null ? data.shN.bands : Math.round(Math.sqrt(coeffs + 1) - 1);\r\n const shCentroids = imageDataArrays[5].bits;\r\n const shLabelsData = imageDataArrays[6].bits;\r\n const shCentroidsWidth = imageDataArrays[5].width;\r\n\r\n const shComponentCount = coeffs * 3;\r\n\r\n const textureCount = Math.ceil(shComponentCount / 16); // 4 components can be stored per texture, 4 sh per component\r\n //let shIndexRead = byteOffset;\r\n\r\n const engine = scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n\r\n // sh is an array of uint8array that will be used to create sh textures\r\n const sh = AllocateShBuffers(textureCount, height * width * 4 * 4);\r\n\r\n if (data.version === 2) {\r\n if (!data.shN.codebook) {\r\n throw new Error(\"Missing codebook in SOG version 2 shN data.\");\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n const n = shLabelsData[i * 4 + 0] + (shLabelsData[i * 4 + 1] << 8);\r\n const u = (n % 64) * coeffs;\r\n const v = Math.floor(n / 64);\r\n\r\n for (let k = 0; k < coeffs; k++) {\r\n for (let j = 0; j < 3; j++) {\r\n const shIndexWrite = k * 3 + j;\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n\r\n const shValue = data.shN.codebook[shCentroids[(u + k) * 4 + j + v * shCentroidsWidth * 4]] * 127.5 + 127.5;\r\n shArray[byteIndexInTexture + offsetPerSplat] = Math.max(0, Math.min(255, shValue));\r\n }\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < splatCount; i++) {\r\n const n = shLabelsData[i * 4 + 0] + (shLabelsData[i * 4 + 1] << 8);\r\n const u = (n % 64) * coeffs;\r\n const v = Math.floor(n / 64);\r\n const shMin = data.shN.mins as number;\r\n const shMax = data.shN.maxs as number;\r\n\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < coeffs / 3; k++) {\r\n const shIndexWrite = k * 3 + j;\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n\r\n const shValue = Scalar.Lerp(shMin, shMax, shCentroids[(u + k) * 4 + j + v * shCentroidsWidth * 4] / 255) * 127.5 + 127.5;\r\n shArray[byteIndexInTexture + offsetPerSplat] = Math.max(0, Math.min(255, shValue));\r\n }\r\n }\r\n }\r\n }\r\n return await new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, sh: sh, shDegree: shDegree });\r\n });\r\n }\r\n\r\n return await new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false });\r\n });\r\n}\r\n\r\n/**\r\n * Parse SOG data from either a SOGRootData object (with webp files loaded from rootUrl) or from a Map of filenames to Uint8Array file data (including meta.json)\r\n * @param dataOrFiles Either the SOGRootData or a Map of filenames to Uint8Array file data (including meta.json)\r\n * @param rootUrl Base URL to load webp files from (if dataOrFiles is SOGRootData)\r\n * @param scene The Babylon.js scene\r\n * @returns Parsed data\r\n */\r\nexport async function ParseSogMeta(dataOrFiles: SOGRootData | Map<string, Uint8Array>, rootUrl: string, scene: Scene): Promise<IParsedSplat> {\r\n let data: SOGRootData;\r\n let files: Map<string, Uint8Array> | undefined;\r\n\r\n if (dataOrFiles instanceof Map) {\r\n files = dataOrFiles;\r\n\r\n const metaFile = files.get(\"meta.json\");\r\n if (!metaFile) {\r\n throw new Error(\"meta.json not found in files Map\");\r\n }\r\n\r\n data = JSON.parse(new TextDecoder().decode(metaFile)) as SOGRootData;\r\n } else {\r\n data = dataOrFiles;\r\n }\r\n\r\n // Collect all file names\r\n const urls = [...data.means.files, ...data.scales.files, ...data.quats.files, ...data.sh0.files];\r\n if (data.shN) {\r\n urls.push(...data.shN.files);\r\n }\r\n\r\n // Load webp images in parallel\r\n const imageDataArrays: IWebPImage[] = await Promise.all(\r\n urls.map(async (fileName) => {\r\n if (files && files.has(fileName)) {\r\n // load from in-memory Uint8Array\r\n const fileData = files.get(fileName)!;\r\n return await LoadWebpImageData(fileData, fileName, scene.getEngine());\r\n } else {\r\n // fallback: load from URL\r\n return await LoadWebpImageData(rootUrl, fileName, scene.getEngine());\r\n }\r\n })\r\n );\r\n\r\n return await ParseSogDatas(data, imageDataArrays, scene);\r\n}\r\n\r\nfunction CreateSogTexture(scene: Scene, bits: Uint8Array, width: number, height: number): RawTexture {\r\n const tex = new RawTexture(bits, width, height, Constants.TEXTUREFORMAT_RGBA, scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTURETYPE_UNSIGNED_BYTE);\r\n tex.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n tex.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n return tex;\r\n}\r\n\r\nfunction DecodeSogPositions(data: SOGRootData, meansl: Uint8Array, meansu: Uint8Array, splatCount: number): Float32Array {\r\n const unlog = (n: number) => Math.sign(n) * (Math.exp(Math.abs(n)) - 1);\r\n if (!Array.isArray(data.means.mins) || !Array.isArray(data.means.maxs)) {\r\n throw new Error(\"Missing arrays in SOG data.\");\r\n }\r\n // Stride-4 layout (x,y,z,w) expected by the depth-sort worker and the centers texture.\r\n const positions = new Float32Array(splatCount * 4);\r\n for (let i = 0; i < splatCount; i++) {\r\n const index = i * 4;\r\n for (let j = 0; j < 3; j++) {\r\n const q = (meansu[index + j] << 8) | meansl[index + j];\r\n const n = Scalar.Lerp(data.means.mins[j], data.means.maxs[j], q / 65535);\r\n positions[i * 4 + j] = unlog(n);\r\n }\r\n positions[i * 4 + 3] = 1.0;\r\n }\r\n return positions;\r\n}\r\n\r\n/**\r\n * Parse SOG data and produce a set of GPU textures + dequantization parameters.\r\n * The shader will sample these raw RGBA8 textures and reconstruct positions/scales/rotations/colors/SH on the GPU.\r\n * @param dataOrFiles Either the SOGRootData or a Map of filenames to Uint8Array file data (including meta.json)\r\n * @param rootUrl Base URL to load webp files from (if dataOrFiles is SOGRootData)\r\n * @param scene The Babylon.js scene\r\n * @returns Parsed splat info with `sogTextures` populated.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-restricted-types\r\nexport async function ParseSogMetaAsTextures(dataOrFiles: SOGRootData | Map<string, Uint8Array>, rootUrl: string, scene: Scene): Promise<IParsedSplat> {\r\n let data: SOGRootData;\r\n let files: Map<string, Uint8Array> | undefined;\r\n\r\n if (dataOrFiles instanceof Map) {\r\n files = dataOrFiles;\r\n const metaFile = files.get(\"meta.json\");\r\n if (!metaFile) {\r\n throw new Error(\"meta.json not found in files Map\");\r\n }\r\n data = JSON.parse(new TextDecoder().decode(metaFile)) as SOGRootData;\r\n } else {\r\n data = dataOrFiles;\r\n }\r\n\r\n const urls = [...data.means.files, ...data.scales.files, ...data.quats.files, ...data.sh0.files];\r\n if (data.shN) {\r\n urls.push(...data.shN.files);\r\n }\r\n\r\n const images: IWebPImage[] = await Promise.all(\r\n urls.map(async (fileName) => {\r\n if (files && files.has(fileName)) {\r\n return await LoadWebpImageData(files.get(fileName)!, fileName, scene.getEngine());\r\n }\r\n return await LoadWebpImageData(rootUrl, fileName, scene.getEngine());\r\n })\r\n );\r\n\r\n const splatCount = data.count ?? data.means.shape[0];\r\n const engine = scene.getEngine();\r\n const splatTextureWidth = Math.min(splatCount, engine.getCaps().maxTextureSize);\r\n const splatTextureHeight = Math.ceil(splatCount / splatTextureWidth);\r\n\r\n // means_l, means_u, scales, quats, sh0 share the same (w,h)\r\n const meansL = CreateSogTexture(scene, images[0].bits, splatTextureWidth, splatTextureHeight);\r\n const meansU = CreateSogTexture(scene, images[1].bits, splatTextureWidth, splatTextureHeight);\r\n const scales = CreateSogTexture(scene, images[2].bits, splatTextureWidth, splatTextureHeight);\r\n const quats = CreateSogTexture(scene, images[3].bits, splatTextureWidth, splatTextureHeight);\r\n const sh0 = CreateSogTexture(scene, images[4].bits, splatTextureWidth, splatTextureHeight);\r\n\r\n let shCentroids: RawTexture | undefined;\r\n let shLabels: RawTexture | undefined;\r\n let shCoeffCount = 0;\r\n let shDegree = 0;\r\n\r\n if (data.shN && images.length >= 7) {\r\n const centroidsImage = images[5];\r\n const labelsImage = images[6];\r\n const centroidsHeight = centroidsImage.bits.length / 4 / centroidsImage.width;\r\n shCentroids = CreateSogTexture(scene, centroidsImage.bits, centroidsImage.width, centroidsHeight);\r\n const labelsHeight = labelsImage.bits.length / 4 / labelsImage.width;\r\n shLabels = CreateSogTexture(scene, labelsImage.bits, labelsImage.width, labelsHeight);\r\n\r\n shCoeffCount = data.shN.bands ? (data.shN.bands + 1) ** 2 - 1 : data.shN.shape[1] / 3;\r\n shDegree = data.shN.bands ?? Math.round(Math.sqrt(shCoeffCount + 1) - 1);\r\n }\r\n\r\n // Optional codebook packed into a 1D R32F texture: [scales(256) | sh0(256) | shN(256)]\r\n let codebookTexture: RawTexture | undefined;\r\n if (data.version === 2) {\r\n const codebookSize = 256;\r\n const packed = new Float32Array(codebookSize * 3);\r\n if (data.scales.codebook) {\r\n packed.set(data.scales.codebook.slice(0, codebookSize), 0);\r\n }\r\n if (data.sh0.codebook) {\r\n packed.set(data.sh0.codebook.slice(0, codebookSize), codebookSize);\r\n }\r\n if (data.shN?.codebook) {\r\n packed.set(data.shN.codebook.slice(0, codebookSize), codebookSize * 2);\r\n }\r\n codebookTexture = new RawTexture(\r\n packed,\r\n codebookSize * 3,\r\n 1,\r\n Constants.TEXTUREFORMAT_R,\r\n scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n codebookTexture.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n codebookTexture.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n }\r\n\r\n const meansMins = data.means.mins as number[];\r\n const meansMaxs = data.means.maxs as number[];\r\n\r\n const pack: ISogTexturePack = {\r\n version: (data.version === 2 ? 2 : 1) as 1 | 2,\r\n splatCount,\r\n shDegree,\r\n meansTextureL: meansL,\r\n meansTextureU: meansU,\r\n scalesTexture: scales,\r\n quatsTexture: quats,\r\n sh0Texture: sh0,\r\n shCentroidsTexture: shCentroids,\r\n shLabelsTexture: shLabels,\r\n codebookTexture,\r\n meansMin: [meansMins[0], meansMins[1], meansMins[2]],\r\n meansMax: [meansMaxs[0], meansMaxs[1], meansMaxs[2]],\r\n scalesMin: Array.isArray(data.scales.mins) ? [data.scales.mins[0], data.scales.mins[1], data.scales.mins[2]] : undefined,\r\n scalesMax: Array.isArray(data.scales.maxs) ? [data.scales.maxs[0], data.scales.maxs[1], data.scales.maxs[2]] : undefined,\r\n sh0Min: Array.isArray(data.sh0.mins) ? [data.sh0.mins[0], data.sh0.mins[1], data.sh0.mins[2], data.sh0.mins[3]] : undefined,\r\n sh0Max: Array.isArray(data.sh0.maxs) ? [data.sh0.maxs[0], data.sh0.maxs[1], data.sh0.maxs[2], data.sh0.maxs[3]] : undefined,\r\n shnMin: typeof data.shN?.mins === \"number\" ? data.shN.mins : undefined,\r\n shnMax: typeof data.shN?.maxs === \"number\" ? data.shN.maxs : undefined,\r\n shCoeffCount,\r\n positions: DecodeSogPositions(data, images[0].bits, images[1].bits, splatCount),\r\n };\r\n\r\n return { mode: Mode.Splat, data: new ArrayBuffer(0), hasVertexColors: false, shDegree, sogTextures: pack };\r\n}\r\n"]}
package/SPLAT/spz.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { Scalar } from "@onerjs/core/Maths/math.scalar.js";
3
3
  import { runCoroutineAsync, createYieldingScheduler } from "@onerjs/core/Misc/coroutine.js";
4
4
  import { _LoadScriptModuleAsync } from "@onerjs/core/Misc/tools.internals.js";
5
+ import { AllocateShBuffers } from "@onerjs/core/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js";
5
6
  const _SpzConversionBatchSize = 32768;
6
7
  const _SH_C0 = 0.28209479177387814;
7
8
  // Cached WASM module promise — initialized once, reused across all SPZ loads.
@@ -144,16 +145,11 @@ export function ParseSpz(data, scene, _loadingOptions) {
144
145
  const shComponentCount = shVectorCount * 3;
145
146
  const textureCount = Math.ceil(shComponentCount / 16); // 4 components can be stored per texture, 4 sh per component
146
147
  let shIndexRead = byteOffset;
147
- // sh is an array of uint8array that will be used to create sh textures
148
- const sh = [];
149
148
  const engine = scene.getEngine();
150
149
  const width = engine.getCaps().maxTextureSize;
151
150
  const height = Math.ceil(splatCount / width);
152
- // create array for the number of textures needed.
153
- for (let textureIndex = 0; textureIndex < textureCount; textureIndex++) {
154
- const texture = new Uint8Array(height * width * 4 * 4); // 4 components per texture, 4 sh per component
155
- sh.push(texture);
156
- }
151
+ // sh is an array of uint8array that will be used to create sh textures
152
+ const sh = AllocateShBuffers(textureCount, height * width * 4 * 4);
157
153
  for (let i = 0; i < splatCount; i++) {
158
154
  for (let shIndexWrite = 0; shIndexWrite < shComponentCount; shIndexWrite++) {
159
155
  const shValue = ubuf[shIndexRead++];
@@ -232,10 +228,7 @@ export function* ConvertSpzToSplat(cloud, scene, useCoroutine = false) {
232
228
  const engine = scene.getEngine();
233
229
  const width = engine.getCaps().maxTextureSize;
234
230
  const height = Math.ceil(splatCount / width);
235
- sh = [];
236
- for (let t = 0; t < textureCount; t++) {
237
- sh.push(new Uint8Array(height * width * 4 * 4));
238
- }
231
+ sh = AllocateShBuffers(textureCount, height * width * 4 * 4);
239
232
  // Precompute chunk start/end and hoist texture references out of the per-splat loop
240
233
  chunkStarts = new Int32Array(textureCount);
241
234
  chunkEnds = new Int32Array(textureCount);
package/SPLAT/spz.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"spz.js","sourceRoot":"","sources":["../../../../dev/loaders/src/SPLAT/spz.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/promise-function-async */\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { runCoroutineAsync, createYieldingScheduler, type Coroutine } from \"core/Misc/coroutine\";\r\nimport { _LoadScriptModuleAsync } from \"core/Misc/tools.internals\";\r\nimport { type SPLATLoadingOptions } from \"./splatLoadingOptions\";\r\nimport { Mode, type IParsedSplat } from \"./splatDefs\";\r\nimport { type GaussianCloud, type SpzModule, type SpzExtensionSafeOrbitCameraAdobe } from \"@adobe/spz\";\r\n\r\nconst _SpzConversionBatchSize = 32768;\r\nconst _SH_C0 = 0.28209479177387814;\r\n\r\n// Cached WASM module promise — initialized once, reused across all SPZ loads.\r\nlet _SpzModulePromise: Promise<SpzModule> | null = null;\r\nlet _SpzModuleUrl: string | null = null;\r\n\r\n/**\r\n * Parses SPZ data and returns a promise resolving to an IParsedSplat object.\r\n * @param data The ArrayBuffer containing SPZ data.\r\n * @param scene The Babylon.js scene.\r\n * @param _loadingOptions Options for loading Gaussian Splatting files.\r\n * @returns A promise resolving to the parsed SPZ data.\r\n */\r\nexport function ParseSpz(data: ArrayBuffer, scene: Scene, _loadingOptions: SPLATLoadingOptions): Promise<IParsedSplat> {\r\n const ubuf = new Uint8Array(data);\r\n const ubufu32 = new Uint32Array(data.slice(0, 12)); // Only need ubufu32[0] to [2]\r\n // debug infos\r\n const splatCount = ubufu32[2];\r\n\r\n const shDegree = ubuf[12];\r\n const fractionalBits = ubuf[13];\r\n const flags = ubuf[14];\r\n const reserved = ubuf[15];\r\n const version = ubufu32[1];\r\n\r\n // check magic and version\r\n if (reserved || ubufu32[0] != 0x5053474e || version < 2 || version > 4) {\r\n // reserved must be 0\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Reject, data: new ArrayBuffer(0), hasVertexColors: false });\r\n });\r\n }\r\n\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n\r\n const positionScale = 1.0 / (1 << fractionalBits);\r\n\r\n const int32View = new Int32Array(1);\r\n const uint8View = new Uint8Array(int32View.buffer);\r\n const read24bComponent = function (u8: Uint8Array, offset: number) {\r\n uint8View[0] = u8[offset + 0];\r\n uint8View[1] = u8[offset + 1];\r\n uint8View[2] = u8[offset + 2];\r\n uint8View[3] = u8[offset + 2] & 0x80 ? 0xff : 0x00;\r\n return int32View[0] * positionScale;\r\n };\r\n\r\n let byteOffset = 16;\r\n\r\n const position = new Float32Array(buffer);\r\n const scale = new Float32Array(buffer);\r\n const rgba = new Uint8ClampedArray(buffer);\r\n const rot = new Uint8ClampedArray(buffer);\r\n\r\n // positions\r\n for (let i = 0; i < splatCount; i++) {\r\n position[i * 8 + 0] = read24bComponent(ubuf, byteOffset + 0);\r\n position[i * 8 + 1] = read24bComponent(ubuf, byteOffset + 3);\r\n position[i * 8 + 2] = read24bComponent(ubuf, byteOffset + 6);\r\n byteOffset += 9;\r\n }\r\n\r\n // colors\r\n for (let i = 0; i < splatCount; i++) {\r\n for (let component = 0; component < 3; component++) {\r\n const byteValue = ubuf[byteOffset + splatCount + i * 3 + component];\r\n // 0.15 is hard coded value from spz\r\n // Scale factor for DC color components. To convert to RGB, we should multiply by 0.282, but it can\r\n // be useful to represent base colors that are out of range if the higher spherical harmonics bands\r\n // bring them back into range so we multiply by a smaller value.\r\n const value = (byteValue - 127.5) / (0.15 * 255);\r\n rgba[i * 32 + 24 + component] = Scalar.Clamp((0.5 + _SH_C0 * value) * 255, 0, 255);\r\n }\r\n\r\n rgba[i * 32 + 24 + 3] = ubuf[byteOffset + i];\r\n }\r\n byteOffset += splatCount * 4;\r\n\r\n // scales\r\n for (let i = 0; i < splatCount; i++) {\r\n scale[i * 8 + 3 + 0] = Math.exp(ubuf[byteOffset + 0] / 16.0 - 10.0);\r\n scale[i * 8 + 3 + 1] = Math.exp(ubuf[byteOffset + 1] / 16.0 - 10.0);\r\n scale[i * 8 + 3 + 2] = Math.exp(ubuf[byteOffset + 2] / 16.0 - 10.0);\r\n byteOffset += 3;\r\n }\r\n\r\n // convert quaternion\r\n if (version >= 3) {\r\n /*\r\n In version 3, rotations are represented as the smallest three components of the normalized rotation quaternion, for optimal rotation accuracy.\r\n The largest component can be derived from the others and is not stored. Its index is stored on 2 bits\r\n and each of the smallest three components is encoded as a 10-bit signed integer.\r\n */\r\n const sqrt12 = Math.SQRT1_2;\r\n for (let i = 0; i < splatCount; i++) {\r\n const r = [ubuf[byteOffset + 0], ubuf[byteOffset + 1], ubuf[byteOffset + 2], ubuf[byteOffset + 3]];\r\n\r\n const comp = r[0] + (r[1] << 8) + (r[2] << 16) + (r[3] << 24);\r\n\r\n const cmask = (1 << 9) - 1;\r\n const rotation = [];\r\n const iLargest = comp >>> 30;\r\n let remaining = comp;\r\n let sumSquares = 0;\r\n\r\n for (let i = 3; i >= 0; --i) {\r\n if (i !== iLargest) {\r\n const mag = remaining & cmask;\r\n const negbit = (remaining >>> 9) & 0x1;\r\n remaining = remaining >>> 10;\r\n\r\n rotation[i] = sqrt12 * (mag / cmask);\r\n if (negbit === 1) {\r\n rotation[i] = -rotation[i];\r\n }\r\n\r\n // accumulate the sum of squares\r\n sumSquares += rotation[i] * rotation[i];\r\n }\r\n }\r\n\r\n const square = 1 - sumSquares;\r\n rotation[iLargest] = Math.sqrt(Math.max(square, 0));\r\n\r\n const shuffle = [3, 0, 1, 2]; // shuffle to match the order of the quaternion components in the splat file\r\n for (let j = 0; j < 4; j++) {\r\n rot[i * 32 + 28 + j] = Math.round(127.5 + rotation[shuffle[j]] * 127.5);\r\n }\r\n\r\n byteOffset += 4;\r\n }\r\n } else {\r\n /*\r\n In version 2, rotations are represented as the `(x, y, z)` components of the normalized rotation quaternion. The\r\n `w` component can be derived from the others and is not stored. Each component is encoded as an\r\n 8-bit signed integer.\r\n */\r\n for (let i = 0; i < splatCount; i++) {\r\n const x = ubuf[byteOffset + 0];\r\n const y = ubuf[byteOffset + 1];\r\n const z = ubuf[byteOffset + 2];\r\n const nx = x / 127.5 - 1;\r\n const ny = y / 127.5 - 1;\r\n const nz = z / 127.5 - 1;\r\n rot[i * 32 + 28 + 1] = x;\r\n rot[i * 32 + 28 + 2] = y;\r\n rot[i * 32 + 28 + 3] = z;\r\n const v = 1 - (nx * nx + ny * ny + nz * nz);\r\n rot[i * 32 + 28 + 0] = 127.5 + Math.sqrt(v < 0 ? 0 : v) * 127.5;\r\n\r\n byteOffset += 3;\r\n }\r\n }\r\n\r\n // SH\r\n if (shDegree) {\r\n // shVectorCount is : 3 for degree 1, 8 for degree 2, 15 for degree 3, 24 for degree 4\r\n // number of vec3 vectors needed per splat\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1; // minus 1 because sh0 is color\r\n // number of scalar component values: 3 per vec3\r\n const shComponentCount = shVectorCount * 3;\r\n\r\n const textureCount = Math.ceil(shComponentCount / 16); // 4 components can be stored per texture, 4 sh per component\r\n let shIndexRead = byteOffset;\r\n\r\n // sh is an array of uint8array that will be used to create sh textures\r\n const sh: Uint8Array[] = [];\r\n\r\n const engine = scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n // create array for the number of textures needed.\r\n for (let textureIndex = 0; textureIndex < textureCount; textureIndex++) {\r\n const texture = new Uint8Array(height * width * 4 * 4); // 4 components per texture, 4 sh per component\r\n sh.push(texture);\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n for (let shIndexWrite = 0; shIndexWrite < shComponentCount; shIndexWrite++) {\r\n const shValue = ubuf[shIndexRead++];\r\n\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n shArray[byteIndexInTexture + offsetPerSplat] = shValue;\r\n }\r\n }\r\n\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, sh: sh, shDegree: shDegree, trainedWithAntialiasing: !!flags });\r\n });\r\n }\r\n\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, trainedWithAntialiasing: !!flags });\r\n });\r\n}\r\n\r\n/**\r\n * Returns the initialized spz WASM module loaded from the given URL, loading it on first call.\r\n * @param url URL to the spz WASM ES module (its default export should be a factory function)\r\n * @returns A promise resolving to the initialized spz WASM module\r\n */\r\nexport async function GetSpzModule(url: string): Promise<SpzModule> {\r\n if (_SpzModulePromise && _SpzModuleUrl === url) {\r\n return await _SpzModulePromise;\r\n }\r\n\r\n const spzModulePromise = _LoadScriptModuleAsync(\r\n `import createSpzModule from '${url}';\r\n const module = await createSpzModule();\r\n const returnedValue = module;`\r\n );\r\n\r\n _SpzModuleUrl = url;\r\n _SpzModulePromise = spzModulePromise;\r\n\r\n return await spzModulePromise;\r\n}\r\n\r\n/**\r\n * Converts a GaussianCloud object (from the spz WASM module) into the packed 32-byte-per-splat\r\n * ArrayBuffer and SH texture arrays expected by GaussianSplattingMeshBase.updateData.\r\n *\r\n * Packed layout per splat (32 bytes):\r\n * [0-11] position xyz (float32 x3)\r\n * [12-23] scale xyz (float32 x3)\r\n * [24-27] color RGBA (uint8 x4, colors in [0,255], alpha in [0,255])\r\n * [28-31] quaternion wxyz (uint8 x4, encoded as q * 127.5 + 127.5)\r\n *\r\n * SH coefficients from the cloud (Float32, range ~[-1,1]) are encoded to bytes\r\n * using the SPZ convention (load-spz.cc unquantizeSH): byte = coeff * 128 + 128.\r\n *\r\n * @param cloud The GaussianCloud returned by spz.loadSpzFromBuffer\r\n * @param scene The Babylon.js scene (used to query maxTextureSize for SH textures)\r\n * @param useCoroutine If true, yields periodically to avoid blocking the main thread\r\n * @returns A coroutine returning an IParsedSplat ready to be passed to updateData\r\n */\r\nexport function* ConvertSpzToSplat(cloud: GaussianCloud, scene: Scene, useCoroutine = false): Coroutine<IParsedSplat> {\r\n const splatCount: number = cloud.numPoints;\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32 bytes\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n const fBuffer = new Float32Array(buffer);\r\n const uBuffer = new Uint8Array(buffer);\r\n\r\n const positions: Float32Array = cloud.positions;\r\n const scales: Float32Array = cloud.scales;\r\n const colors: Float32Array = cloud.colors;\r\n const alphas: Float32Array = cloud.alphas;\r\n const rotations: Float32Array = cloud.rotations;\r\n\r\n // Build SH texture arrays upfront so both main and SH data can be written in a single pass\r\n let sh: Uint8Array[] | null = null;\r\n const shDegree: number = cloud.shDegree;\r\n let cloudSh: Float32Array | null = null;\r\n let shComponentCount = 0;\r\n let chunkStarts: Int32Array | null = null;\r\n let chunkEnds: Int32Array | null = null;\r\n let shArrays: Uint8Array[] | null = null;\r\n\r\n if (shDegree > 0 && cloud.sh.length > 0) {\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\r\n shComponentCount = shVectorCount * 3;\r\n const textureCount = Math.ceil(shComponentCount / 16);\r\n\r\n const engine = scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n sh = [];\r\n for (let t = 0; t < textureCount; t++) {\r\n sh.push(new Uint8Array(height * width * 4 * 4));\r\n }\r\n\r\n // Precompute chunk start/end and hoist texture references out of the per-splat loop\r\n chunkStarts = new Int32Array(textureCount);\r\n chunkEnds = new Int32Array(textureCount);\r\n for (let t = 0; t < textureCount; t++) {\r\n chunkStarts[t] = t * 16;\r\n chunkEnds[t] = Math.min((t + 1) * 16, shComponentCount);\r\n }\r\n shArrays = sh;\r\n cloudSh = cloud.sh;\r\n }\r\n\r\n // Single pass: write packed splat data and SH textures together to halve iteration count\r\n for (let i = 0; i < splatCount; i++) {\r\n const fBase = i * 8;\r\n const uBase = i * 32;\r\n const p = i * 3;\r\n const r = i * 4;\r\n\r\n // Position (float32 x3, bytes 0-11)\r\n fBuffer[fBase + 0] = positions[p + 0];\r\n fBuffer[fBase + 1] = positions[p + 1];\r\n fBuffer[fBase + 2] = positions[p + 2];\r\n\r\n // Scale (float32 x3, bytes 12-23) — cloud scales are in log space, convert to linear\r\n fBuffer[fBase + 3] = Math.exp(scales[p + 0]);\r\n fBuffer[fBase + 4] = Math.exp(scales[p + 1]);\r\n fBuffer[fBase + 5] = Math.exp(scales[p + 2]);\r\n\r\n // Color RGB: cloud gives raw SH DC coefficients, convert to [0,255] display value\r\n const c0 = (0.5 + _SH_C0 * colors[p + 0]) * 255;\r\n const c1 = (0.5 + _SH_C0 * colors[p + 1]) * 255;\r\n const c2 = (0.5 + _SH_C0 * colors[p + 2]) * 255;\r\n uBuffer[uBase + 24] = c0 <= 0 ? 0 : c0 >= 255 ? 255 : (c0 + 0.5) | 0;\r\n uBuffer[uBase + 25] = c1 <= 0 ? 0 : c1 >= 255 ? 255 : (c1 + 0.5) | 0;\r\n uBuffer[uBase + 26] = c2 <= 0 ? 0 : c2 >= 255 ? 255 : (c2 + 0.5) | 0;\r\n // Alpha: cloud gives raw logit opacity, apply sigmoid to get [0,255]\r\n uBuffer[uBase + 27] = ((1.0 / (1.0 + Math.exp(-alphas[i]))) * 255 + 0.5) | 0;\r\n\r\n // Rotation: cloud is xyzw, packed buffer expects wxyz\r\n const rw = rotations[r + 3] * 127.5 + 127.5;\r\n const rx = rotations[r + 0] * 127.5 + 127.5;\r\n const ry = rotations[r + 1] * 127.5 + 127.5;\r\n const rz = rotations[r + 2] * 127.5 + 127.5;\r\n uBuffer[uBase + 28] = rw <= 0 ? 0 : rw >= 255 ? 255 : (rw + 0.5) | 0; // w\r\n uBuffer[uBase + 29] = rx <= 0 ? 0 : rx >= 255 ? 255 : (rx + 0.5) | 0; // x\r\n uBuffer[uBase + 30] = ry <= 0 ? 0 : ry >= 255 ? 255 : (ry + 0.5) | 0; // y\r\n uBuffer[uBase + 31] = rz <= 0 ? 0 : rz >= 255 ? 255 : (rz + 0.5) | 0; // z\r\n\r\n // SH: process all texture chunks for this splat in the same iteration\r\n if (cloudSh && shArrays && chunkStarts && chunkEnds) {\r\n const shSplatBase = i * shComponentCount;\r\n const offsetPerSplat = i * 16;\r\n for (let t = 0; t < shArrays.length; t++) {\r\n const shT = shArrays[t];\r\n const chunkStart = chunkStarts[t];\r\n const chunkEnd = chunkEnds[t];\r\n for (let j = chunkStart; j < chunkEnd; j++) {\r\n const v = cloudSh[shSplatBase + j] * 128.0 + 128.0;\r\n shT[offsetPerSplat + j - chunkStart] = v <= 0 ? 0 : v >= 255 ? 255 : (v + 0.5) | 0;\r\n }\r\n }\r\n }\r\n\r\n if (i % _SpzConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n // Extract safe-orbit-camera extension if present\r\n let safeOrbitCameraRadiusMin: number | undefined;\r\n let safeOrbitCameraElevationMinMax: [number, number] | undefined;\r\n if (cloud.extensions) {\r\n for (const ext of cloud.extensions) {\r\n const safeOrbitExt = ext as SpzExtensionSafeOrbitCameraAdobe;\r\n if (safeOrbitExt.safeOrbitRadiusMin !== undefined) {\r\n safeOrbitCameraRadiusMin = safeOrbitExt.safeOrbitRadiusMin;\r\n safeOrbitCameraElevationMinMax = [safeOrbitExt.safeOrbitElevationMin, safeOrbitExt.safeOrbitElevationMax];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n mode: Mode.Splat,\r\n data: buffer,\r\n hasVertexColors: false,\r\n sh: sh !== null ? sh : undefined,\r\n shDegree: shDegree > 0 ? shDegree : undefined,\r\n trainedWithAntialiasing: !!cloud.antialiased,\r\n safeOrbitCameraRadiusMin,\r\n safeOrbitCameraElevationMinMax,\r\n };\r\n}\r\n\r\n/**\r\n * Async version of ConvertSpzToSplat that yields periodically to avoid blocking the main thread.\r\n * @param cloud The GaussianCloud returned by spz.loadSpzFromBuffer\r\n * @param scene The Babylon.js scene\r\n * @returns A promise resolving to an IParsedSplat\r\n */\r\nexport async function ConvertSpzToSplatAsync(cloud: any, scene: Scene): Promise<IParsedSplat> {\r\n return await runCoroutineAsync(ConvertSpzToSplat(cloud, scene, true), createYieldingScheduler());\r\n}\r\n"]}
1
+ {"version":3,"file":"spz.js","sourceRoot":"","sources":["../../../../dev/loaders/src/SPLAT/spz.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/promise-function-async */\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { runCoroutineAsync, createYieldingScheduler, type Coroutine } from \"core/Misc/coroutine\";\r\nimport { _LoadScriptModuleAsync } from \"core/Misc/tools.internals\";\r\nimport { type SPLATLoadingOptions } from \"./splatLoadingOptions\";\r\nimport { Mode, type IParsedSplat } from \"./splatDefs\";\r\nimport { AllocateShBuffers } from \"core/Meshes/GaussianSplatting/gaussianSplattingMeshBase\";\r\nimport { type GaussianCloud, type SpzModule, type SpzExtensionSafeOrbitCameraAdobe } from \"@adobe/spz\";\r\n\r\nconst _SpzConversionBatchSize = 32768;\r\nconst _SH_C0 = 0.28209479177387814;\r\n\r\n// Cached WASM module promise — initialized once, reused across all SPZ loads.\r\nlet _SpzModulePromise: Promise<SpzModule> | null = null;\r\nlet _SpzModuleUrl: string | null = null;\r\n\r\n/**\r\n * Parses SPZ data and returns a promise resolving to an IParsedSplat object.\r\n * @param data The ArrayBuffer containing SPZ data.\r\n * @param scene The Babylon.js scene.\r\n * @param _loadingOptions Options for loading Gaussian Splatting files.\r\n * @returns A promise resolving to the parsed SPZ data.\r\n */\r\nexport function ParseSpz(data: ArrayBuffer, scene: Scene, _loadingOptions: SPLATLoadingOptions): Promise<IParsedSplat> {\r\n const ubuf = new Uint8Array(data);\r\n const ubufu32 = new Uint32Array(data.slice(0, 12)); // Only need ubufu32[0] to [2]\r\n // debug infos\r\n const splatCount = ubufu32[2];\r\n\r\n const shDegree = ubuf[12];\r\n const fractionalBits = ubuf[13];\r\n const flags = ubuf[14];\r\n const reserved = ubuf[15];\r\n const version = ubufu32[1];\r\n\r\n // check magic and version\r\n if (reserved || ubufu32[0] != 0x5053474e || version < 2 || version > 4) {\r\n // reserved must be 0\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Reject, data: new ArrayBuffer(0), hasVertexColors: false });\r\n });\r\n }\r\n\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n\r\n const positionScale = 1.0 / (1 << fractionalBits);\r\n\r\n const int32View = new Int32Array(1);\r\n const uint8View = new Uint8Array(int32View.buffer);\r\n const read24bComponent = function (u8: Uint8Array, offset: number) {\r\n uint8View[0] = u8[offset + 0];\r\n uint8View[1] = u8[offset + 1];\r\n uint8View[2] = u8[offset + 2];\r\n uint8View[3] = u8[offset + 2] & 0x80 ? 0xff : 0x00;\r\n return int32View[0] * positionScale;\r\n };\r\n\r\n let byteOffset = 16;\r\n\r\n const position = new Float32Array(buffer);\r\n const scale = new Float32Array(buffer);\r\n const rgba = new Uint8ClampedArray(buffer);\r\n const rot = new Uint8ClampedArray(buffer);\r\n\r\n // positions\r\n for (let i = 0; i < splatCount; i++) {\r\n position[i * 8 + 0] = read24bComponent(ubuf, byteOffset + 0);\r\n position[i * 8 + 1] = read24bComponent(ubuf, byteOffset + 3);\r\n position[i * 8 + 2] = read24bComponent(ubuf, byteOffset + 6);\r\n byteOffset += 9;\r\n }\r\n\r\n // colors\r\n for (let i = 0; i < splatCount; i++) {\r\n for (let component = 0; component < 3; component++) {\r\n const byteValue = ubuf[byteOffset + splatCount + i * 3 + component];\r\n // 0.15 is hard coded value from spz\r\n // Scale factor for DC color components. To convert to RGB, we should multiply by 0.282, but it can\r\n // be useful to represent base colors that are out of range if the higher spherical harmonics bands\r\n // bring them back into range so we multiply by a smaller value.\r\n const value = (byteValue - 127.5) / (0.15 * 255);\r\n rgba[i * 32 + 24 + component] = Scalar.Clamp((0.5 + _SH_C0 * value) * 255, 0, 255);\r\n }\r\n\r\n rgba[i * 32 + 24 + 3] = ubuf[byteOffset + i];\r\n }\r\n byteOffset += splatCount * 4;\r\n\r\n // scales\r\n for (let i = 0; i < splatCount; i++) {\r\n scale[i * 8 + 3 + 0] = Math.exp(ubuf[byteOffset + 0] / 16.0 - 10.0);\r\n scale[i * 8 + 3 + 1] = Math.exp(ubuf[byteOffset + 1] / 16.0 - 10.0);\r\n scale[i * 8 + 3 + 2] = Math.exp(ubuf[byteOffset + 2] / 16.0 - 10.0);\r\n byteOffset += 3;\r\n }\r\n\r\n // convert quaternion\r\n if (version >= 3) {\r\n /*\r\n In version 3, rotations are represented as the smallest three components of the normalized rotation quaternion, for optimal rotation accuracy.\r\n The largest component can be derived from the others and is not stored. Its index is stored on 2 bits\r\n and each of the smallest three components is encoded as a 10-bit signed integer.\r\n */\r\n const sqrt12 = Math.SQRT1_2;\r\n for (let i = 0; i < splatCount; i++) {\r\n const r = [ubuf[byteOffset + 0], ubuf[byteOffset + 1], ubuf[byteOffset + 2], ubuf[byteOffset + 3]];\r\n\r\n const comp = r[0] + (r[1] << 8) + (r[2] << 16) + (r[3] << 24);\r\n\r\n const cmask = (1 << 9) - 1;\r\n const rotation = [];\r\n const iLargest = comp >>> 30;\r\n let remaining = comp;\r\n let sumSquares = 0;\r\n\r\n for (let i = 3; i >= 0; --i) {\r\n if (i !== iLargest) {\r\n const mag = remaining & cmask;\r\n const negbit = (remaining >>> 9) & 0x1;\r\n remaining = remaining >>> 10;\r\n\r\n rotation[i] = sqrt12 * (mag / cmask);\r\n if (negbit === 1) {\r\n rotation[i] = -rotation[i];\r\n }\r\n\r\n // accumulate the sum of squares\r\n sumSquares += rotation[i] * rotation[i];\r\n }\r\n }\r\n\r\n const square = 1 - sumSquares;\r\n rotation[iLargest] = Math.sqrt(Math.max(square, 0));\r\n\r\n const shuffle = [3, 0, 1, 2]; // shuffle to match the order of the quaternion components in the splat file\r\n for (let j = 0; j < 4; j++) {\r\n rot[i * 32 + 28 + j] = Math.round(127.5 + rotation[shuffle[j]] * 127.5);\r\n }\r\n\r\n byteOffset += 4;\r\n }\r\n } else {\r\n /*\r\n In version 2, rotations are represented as the `(x, y, z)` components of the normalized rotation quaternion. The\r\n `w` component can be derived from the others and is not stored. Each component is encoded as an\r\n 8-bit signed integer.\r\n */\r\n for (let i = 0; i < splatCount; i++) {\r\n const x = ubuf[byteOffset + 0];\r\n const y = ubuf[byteOffset + 1];\r\n const z = ubuf[byteOffset + 2];\r\n const nx = x / 127.5 - 1;\r\n const ny = y / 127.5 - 1;\r\n const nz = z / 127.5 - 1;\r\n rot[i * 32 + 28 + 1] = x;\r\n rot[i * 32 + 28 + 2] = y;\r\n rot[i * 32 + 28 + 3] = z;\r\n const v = 1 - (nx * nx + ny * ny + nz * nz);\r\n rot[i * 32 + 28 + 0] = 127.5 + Math.sqrt(v < 0 ? 0 : v) * 127.5;\r\n\r\n byteOffset += 3;\r\n }\r\n }\r\n\r\n // SH\r\n if (shDegree) {\r\n // shVectorCount is : 3 for degree 1, 8 for degree 2, 15 for degree 3, 24 for degree 4\r\n // number of vec3 vectors needed per splat\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1; // minus 1 because sh0 is color\r\n // number of scalar component values: 3 per vec3\r\n const shComponentCount = shVectorCount * 3;\r\n\r\n const textureCount = Math.ceil(shComponentCount / 16); // 4 components can be stored per texture, 4 sh per component\r\n let shIndexRead = byteOffset;\r\n\r\n const engine = scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n\r\n // sh is an array of uint8array that will be used to create sh textures\r\n const sh = AllocateShBuffers(textureCount, height * width * 4 * 4);\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n for (let shIndexWrite = 0; shIndexWrite < shComponentCount; shIndexWrite++) {\r\n const shValue = ubuf[shIndexRead++];\r\n\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n shArray[byteIndexInTexture + offsetPerSplat] = shValue;\r\n }\r\n }\r\n\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, sh: sh, shDegree: shDegree, trainedWithAntialiasing: !!flags });\r\n });\r\n }\r\n\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, trainedWithAntialiasing: !!flags });\r\n });\r\n}\r\n\r\n/**\r\n * Returns the initialized spz WASM module loaded from the given URL, loading it on first call.\r\n * @param url URL to the spz WASM ES module (its default export should be a factory function)\r\n * @returns A promise resolving to the initialized spz WASM module\r\n */\r\nexport async function GetSpzModule(url: string): Promise<SpzModule> {\r\n if (_SpzModulePromise && _SpzModuleUrl === url) {\r\n return await _SpzModulePromise;\r\n }\r\n\r\n const spzModulePromise = _LoadScriptModuleAsync(\r\n `import createSpzModule from '${url}';\r\n const module = await createSpzModule();\r\n const returnedValue = module;`\r\n );\r\n\r\n _SpzModuleUrl = url;\r\n _SpzModulePromise = spzModulePromise;\r\n\r\n return await spzModulePromise;\r\n}\r\n\r\n/**\r\n * Converts a GaussianCloud object (from the spz WASM module) into the packed 32-byte-per-splat\r\n * ArrayBuffer and SH texture arrays expected by GaussianSplattingMeshBase.updateData.\r\n *\r\n * Packed layout per splat (32 bytes):\r\n * [0-11] position xyz (float32 x3)\r\n * [12-23] scale xyz (float32 x3)\r\n * [24-27] color RGBA (uint8 x4, colors in [0,255], alpha in [0,255])\r\n * [28-31] quaternion wxyz (uint8 x4, encoded as q * 127.5 + 127.5)\r\n *\r\n * SH coefficients from the cloud (Float32, range ~[-1,1]) are encoded to bytes\r\n * using the SPZ convention (load-spz.cc unquantizeSH): byte = coeff * 128 + 128.\r\n *\r\n * @param cloud The GaussianCloud returned by spz.loadSpzFromBuffer\r\n * @param scene The Babylon.js scene (used to query maxTextureSize for SH textures)\r\n * @param useCoroutine If true, yields periodically to avoid blocking the main thread\r\n * @returns A coroutine returning an IParsedSplat ready to be passed to updateData\r\n */\r\nexport function* ConvertSpzToSplat(cloud: GaussianCloud, scene: Scene, useCoroutine = false): Coroutine<IParsedSplat> {\r\n const splatCount: number = cloud.numPoints;\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32 bytes\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n const fBuffer = new Float32Array(buffer);\r\n const uBuffer = new Uint8Array(buffer);\r\n\r\n const positions: Float32Array = cloud.positions;\r\n const scales: Float32Array = cloud.scales;\r\n const colors: Float32Array = cloud.colors;\r\n const alphas: Float32Array = cloud.alphas;\r\n const rotations: Float32Array = cloud.rotations;\r\n\r\n // Build SH texture arrays upfront so both main and SH data can be written in a single pass\r\n let sh: Uint8Array[] | null = null;\r\n const shDegree: number = cloud.shDegree;\r\n let cloudSh: Float32Array | null = null;\r\n let shComponentCount = 0;\r\n let chunkStarts: Int32Array | null = null;\r\n let chunkEnds: Int32Array | null = null;\r\n let shArrays: Uint8Array[] | null = null;\r\n\r\n if (shDegree > 0 && cloud.sh.length > 0) {\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\r\n shComponentCount = shVectorCount * 3;\r\n const textureCount = Math.ceil(shComponentCount / 16);\r\n\r\n const engine = scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n sh = AllocateShBuffers(textureCount, height * width * 4 * 4);\r\n\r\n // Precompute chunk start/end and hoist texture references out of the per-splat loop\r\n chunkStarts = new Int32Array(textureCount);\r\n chunkEnds = new Int32Array(textureCount);\r\n for (let t = 0; t < textureCount; t++) {\r\n chunkStarts[t] = t * 16;\r\n chunkEnds[t] = Math.min((t + 1) * 16, shComponentCount);\r\n }\r\n shArrays = sh;\r\n cloudSh = cloud.sh;\r\n }\r\n\r\n // Single pass: write packed splat data and SH textures together to halve iteration count\r\n for (let i = 0; i < splatCount; i++) {\r\n const fBase = i * 8;\r\n const uBase = i * 32;\r\n const p = i * 3;\r\n const r = i * 4;\r\n\r\n // Position (float32 x3, bytes 0-11)\r\n fBuffer[fBase + 0] = positions[p + 0];\r\n fBuffer[fBase + 1] = positions[p + 1];\r\n fBuffer[fBase + 2] = positions[p + 2];\r\n\r\n // Scale (float32 x3, bytes 12-23) — cloud scales are in log space, convert to linear\r\n fBuffer[fBase + 3] = Math.exp(scales[p + 0]);\r\n fBuffer[fBase + 4] = Math.exp(scales[p + 1]);\r\n fBuffer[fBase + 5] = Math.exp(scales[p + 2]);\r\n\r\n // Color RGB: cloud gives raw SH DC coefficients, convert to [0,255] display value\r\n const c0 = (0.5 + _SH_C0 * colors[p + 0]) * 255;\r\n const c1 = (0.5 + _SH_C0 * colors[p + 1]) * 255;\r\n const c2 = (0.5 + _SH_C0 * colors[p + 2]) * 255;\r\n uBuffer[uBase + 24] = c0 <= 0 ? 0 : c0 >= 255 ? 255 : (c0 + 0.5) | 0;\r\n uBuffer[uBase + 25] = c1 <= 0 ? 0 : c1 >= 255 ? 255 : (c1 + 0.5) | 0;\r\n uBuffer[uBase + 26] = c2 <= 0 ? 0 : c2 >= 255 ? 255 : (c2 + 0.5) | 0;\r\n // Alpha: cloud gives raw logit opacity, apply sigmoid to get [0,255]\r\n uBuffer[uBase + 27] = ((1.0 / (1.0 + Math.exp(-alphas[i]))) * 255 + 0.5) | 0;\r\n\r\n // Rotation: cloud is xyzw, packed buffer expects wxyz\r\n const rw = rotations[r + 3] * 127.5 + 127.5;\r\n const rx = rotations[r + 0] * 127.5 + 127.5;\r\n const ry = rotations[r + 1] * 127.5 + 127.5;\r\n const rz = rotations[r + 2] * 127.5 + 127.5;\r\n uBuffer[uBase + 28] = rw <= 0 ? 0 : rw >= 255 ? 255 : (rw + 0.5) | 0; // w\r\n uBuffer[uBase + 29] = rx <= 0 ? 0 : rx >= 255 ? 255 : (rx + 0.5) | 0; // x\r\n uBuffer[uBase + 30] = ry <= 0 ? 0 : ry >= 255 ? 255 : (ry + 0.5) | 0; // y\r\n uBuffer[uBase + 31] = rz <= 0 ? 0 : rz >= 255 ? 255 : (rz + 0.5) | 0; // z\r\n\r\n // SH: process all texture chunks for this splat in the same iteration\r\n if (cloudSh && shArrays && chunkStarts && chunkEnds) {\r\n const shSplatBase = i * shComponentCount;\r\n const offsetPerSplat = i * 16;\r\n for (let t = 0; t < shArrays.length; t++) {\r\n const shT = shArrays[t];\r\n const chunkStart = chunkStarts[t];\r\n const chunkEnd = chunkEnds[t];\r\n for (let j = chunkStart; j < chunkEnd; j++) {\r\n const v = cloudSh[shSplatBase + j] * 128.0 + 128.0;\r\n shT[offsetPerSplat + j - chunkStart] = v <= 0 ? 0 : v >= 255 ? 255 : (v + 0.5) | 0;\r\n }\r\n }\r\n }\r\n\r\n if (i % _SpzConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n // Extract safe-orbit-camera extension if present\r\n let safeOrbitCameraRadiusMin: number | undefined;\r\n let safeOrbitCameraElevationMinMax: [number, number] | undefined;\r\n if (cloud.extensions) {\r\n for (const ext of cloud.extensions) {\r\n const safeOrbitExt = ext as SpzExtensionSafeOrbitCameraAdobe;\r\n if (safeOrbitExt.safeOrbitRadiusMin !== undefined) {\r\n safeOrbitCameraRadiusMin = safeOrbitExt.safeOrbitRadiusMin;\r\n safeOrbitCameraElevationMinMax = [safeOrbitExt.safeOrbitElevationMin, safeOrbitExt.safeOrbitElevationMax];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n mode: Mode.Splat,\r\n data: buffer,\r\n hasVertexColors: false,\r\n sh: sh !== null ? sh : undefined,\r\n shDegree: shDegree > 0 ? shDegree : undefined,\r\n trainedWithAntialiasing: !!cloud.antialiased,\r\n safeOrbitCameraRadiusMin,\r\n safeOrbitCameraElevationMinMax,\r\n };\r\n}\r\n\r\n/**\r\n * Async version of ConvertSpzToSplat that yields periodically to avoid blocking the main thread.\r\n * @param cloud The GaussianCloud returned by spz.loadSpzFromBuffer\r\n * @param scene The Babylon.js scene\r\n * @returns A promise resolving to an IParsedSplat\r\n */\r\nexport async function ConvertSpzToSplatAsync(cloud: any, scene: Scene): Promise<IParsedSplat> {\r\n return await runCoroutineAsync(ConvertSpzToSplat(cloud, scene, true), createYieldingScheduler());\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onerjs/loaders",
3
- "version": "8.52.4",
3
+ "version": "8.52.5",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -18,10 +18,10 @@
18
18
  "postcompile": "build-tools -c add-js-to-es6"
19
19
  },
20
20
  "devDependencies": {
21
- "@onerjs/core": "8.52.4",
21
+ "@onerjs/core": "8.52.5",
22
22
  "@dev/build-tools": "^1.0.0",
23
23
  "@dev/loaders": "^1.0.0",
24
- "babylonjs-gltf2interface": "^8.52.4"
24
+ "babylonjs-gltf2interface": "^8.52.5"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "@onerjs/core": "^8.0.0",