@babylonjs/loaders 9.12.0 → 9.13.0

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.
Files changed (78) hide show
  1. package/FBX/fbxFileLoader.d.ts +194 -0
  2. package/FBX/fbxFileLoader.js +2440 -0
  3. package/FBX/fbxFileLoader.js.map +1 -0
  4. package/FBX/fbxFileLoader.metadata.d.ts +11 -0
  5. package/FBX/fbxFileLoader.metadata.js +11 -0
  6. package/FBX/fbxFileLoader.metadata.js.map +1 -0
  7. package/FBX/index.d.ts +3 -0
  8. package/FBX/index.js +3 -0
  9. package/FBX/index.js.map +1 -0
  10. package/FBX/interpreter/animation.d.ts +122 -0
  11. package/FBX/interpreter/animation.js +648 -0
  12. package/FBX/interpreter/animation.js.map +1 -0
  13. package/FBX/interpreter/blendShapes.d.ts +44 -0
  14. package/FBX/interpreter/blendShapes.js +192 -0
  15. package/FBX/interpreter/blendShapes.js.map +1 -0
  16. package/FBX/interpreter/connections.d.ts +95 -0
  17. package/FBX/interpreter/connections.js +233 -0
  18. package/FBX/interpreter/connections.js.map +1 -0
  19. package/FBX/interpreter/fbxInterpreter.d.ts +149 -0
  20. package/FBX/interpreter/fbxInterpreter.js +496 -0
  21. package/FBX/interpreter/fbxInterpreter.js.map +1 -0
  22. package/FBX/interpreter/geometry.d.ts +55 -0
  23. package/FBX/interpreter/geometry.js +573 -0
  24. package/FBX/interpreter/geometry.js.map +1 -0
  25. package/FBX/interpreter/materials.d.ts +50 -0
  26. package/FBX/interpreter/materials.js +144 -0
  27. package/FBX/interpreter/materials.js.map +1 -0
  28. package/FBX/interpreter/propertyTemplates.d.ts +22 -0
  29. package/FBX/interpreter/propertyTemplates.js +125 -0
  30. package/FBX/interpreter/propertyTemplates.js.map +1 -0
  31. package/FBX/interpreter/rig.d.ts +20 -0
  32. package/FBX/interpreter/rig.js +259 -0
  33. package/FBX/interpreter/rig.js.map +1 -0
  34. package/FBX/interpreter/sceneDiagnostics.d.ts +14 -0
  35. package/FBX/interpreter/sceneDiagnostics.js +55 -0
  36. package/FBX/interpreter/sceneDiagnostics.js.map +1 -0
  37. package/FBX/interpreter/skeleton.d.ts +93 -0
  38. package/FBX/interpreter/skeleton.js +515 -0
  39. package/FBX/interpreter/skeleton.js.map +1 -0
  40. package/FBX/interpreter/transform.d.ts +21 -0
  41. package/FBX/interpreter/transform.js +92 -0
  42. package/FBX/interpreter/transform.js.map +1 -0
  43. package/FBX/parsers/fbxAsciiParser.d.ts +5 -0
  44. package/FBX/parsers/fbxAsciiParser.js +330 -0
  45. package/FBX/parsers/fbxAsciiParser.js.map +1 -0
  46. package/FBX/parsers/fbxBinaryParser.d.ts +6 -0
  47. package/FBX/parsers/fbxBinaryParser.js +255 -0
  48. package/FBX/parsers/fbxBinaryParser.js.map +1 -0
  49. package/FBX/parsers/zlibInflate.d.ts +7 -0
  50. package/FBX/parsers/zlibInflate.js +350 -0
  51. package/FBX/parsers/zlibInflate.js.map +1 -0
  52. package/FBX/types/fbxTypes.d.ts +54 -0
  53. package/FBX/types/fbxTypes.js +66 -0
  54. package/FBX/types/fbxTypes.js.map +1 -0
  55. package/SPLAT/gaussianSplattingStream.d.ts +404 -0
  56. package/SPLAT/gaussianSplattingStream.js +1159 -0
  57. package/SPLAT/gaussianSplattingStream.js.map +1 -0
  58. package/SPLAT/gaussianSplattingWorkBuffer.d.ts +71 -0
  59. package/SPLAT/gaussianSplattingWorkBuffer.js +249 -0
  60. package/SPLAT/gaussianSplattingWorkBuffer.js.map +1 -0
  61. package/SPLAT/gaussianSplattingWorkBufferShaders.d.ts +25 -0
  62. package/SPLAT/gaussianSplattingWorkBufferShaders.js +255 -0
  63. package/SPLAT/gaussianSplattingWorkBufferShaders.js.map +1 -0
  64. package/SPLAT/index.d.ts +1 -0
  65. package/SPLAT/index.js +1 -0
  66. package/SPLAT/index.js.map +1 -1
  67. package/SPLAT/sog.d.ts +6 -1
  68. package/SPLAT/sog.js +111 -25
  69. package/SPLAT/sog.js.map +1 -1
  70. package/SPLAT/splatFileLoader.d.ts +8 -0
  71. package/SPLAT/splatFileLoader.js +49 -0
  72. package/SPLAT/splatFileLoader.js.map +1 -1
  73. package/dynamic.js +9 -0
  74. package/dynamic.js.map +1 -1
  75. package/index.d.ts +1 -0
  76. package/index.js +1 -0
  77. package/index.js.map +1 -1
  78. package/package.json +3 -3
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 { 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"]}
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 { type Nullable } from \"core/types\";\r\nimport { type Texture } from \"core/Materials/Textures/texture\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n// updateDynamicTexture is a prototype-augmented engine extension; import its side effect so the ImageBitmap\r\n// fast path in LoadSogTextureDirectAsync doesn't hit an undefined method under tree-shaken/pure engine builds.\r\nimport \"core/Engines/Extensions/engine.dynamicTexture\";\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 height: 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, height: imageData.height });\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 CreateSogTextureFromImage(scene: Scene, image: IWebPImage): RawTexture {\r\n return CreateSogTexture(scene, image.bits, image.width, image.height);\r\n}\r\n\r\n/**\r\n * Loads a SOG attribute image straight onto a GPU texture using `createImageBitmap` (decoded off the main\r\n * thread, with `premultiplyAlpha`/`colorSpaceConversion` set to \"none\" so the raw data bytes are preserved)\r\n * and a direct `texImage2D` upload — avoiding the `<img>` + 2D-canvas `getImageData` readback that stalls the\r\n * frame. Falls back to the canvas path when `createImageBitmap` is unavailable or fails. Use only for textures\r\n * whose pixels are never read back on the CPU (scales, quats, sh0, shN); means_l/means_u still go through the\r\n * readback path because their bytes are needed to decode positions for the sort worker.\r\n * @param rootUrlOrData base URL (string) or the raw file bytes (Uint8Array)\r\n * @param filename file name (used only with a URL)\r\n * @param scene hosting scene\r\n * @returns a GPU texture holding the raw image bytes\r\n */\r\nasync function LoadSogTextureDirectAsync(rootUrlOrData: string | Uint8Array, filename: string, scene: Scene): Promise<RawTexture> {\r\n const engine = scene.getEngine();\r\n if (typeof createImageBitmap === \"function\") {\r\n try {\r\n // A typed blob is required: createImageBitmap can fail to decode a typeless blob (and the\r\n // content-type is lost when loading via LoadFileAsync), which would force the slow canvas fallback.\r\n const mimeType = filename.toLowerCase().endsWith(\".png\") ? \"image/png\" : \"image/webp\";\r\n let blob: Blob;\r\n if (typeof rootUrlOrData === \"string\") {\r\n const buffer = (await Tools.LoadFileAsync(rootUrlOrData + filename, true)) as ArrayBuffer;\r\n blob = new Blob([buffer], { type: mimeType });\r\n } else {\r\n blob = new Blob([rootUrlOrData as any], { type: mimeType });\r\n }\r\n const bitmap = await createImageBitmap(blob, { premultiplyAlpha: \"none\", colorSpaceConversion: \"none\" });\r\n try {\r\n const tex = new RawTexture(\r\n null,\r\n bitmap.width,\r\n bitmap.height,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n tex.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n tex.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n const internal = tex.getInternalTexture();\r\n if (internal) {\r\n // invertY=false / premulAlpha=false keep the byte layout identical to the canvas path.\r\n engine.updateDynamicTexture(internal, bitmap, false, false);\r\n }\r\n return tex;\r\n } finally {\r\n bitmap.close();\r\n }\r\n } catch {\r\n // Fall through to the canvas readback path below.\r\n }\r\n }\r\n const image = await LoadWebpImageData(rootUrlOrData, filename, engine);\r\n return CreateSogTextureFromImage(scene, image);\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 * @param computeCpuPositions When true (default), means_l/means_u are read back on the CPU and `pack.positions`\r\n * is decoded for the sort worker / bounding box. Pass false when the caller will instead read the decoded\r\n * centers back from the GPU work buffer — then every attribute (including means) uses the fast direct\r\n * ImageBitmap upload (no `getImageData` readback) and `pack.positions` is left empty.\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, computeCpuPositions = true): 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 // Attribute textures (scales/quats/sh0/shN) are only sampled on the GPU, so they always upload straight\r\n // from a decoded ImageBitmap (no getImageData readback). means_l/means_u additionally need their CPU bytes\r\n // when computeCpuPositions is set (to decode positions for the sort worker) — those go through the\r\n // <img>+canvas path; otherwise means also use the fast direct upload. All loads run in parallel.\r\n const loadMeansImageAsync = async (fileName: string): Promise<IWebPImage> => {\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 const loadGpuTextureAsync = async (fileName: string): Promise<RawTexture> => {\r\n if (files && files.has(fileName)) {\r\n return await LoadSogTextureDirectAsync(files.get(fileName)!, fileName, scene);\r\n }\r\n return await LoadSogTextureDirectAsync(rootUrl, fileName, scene);\r\n };\r\n\r\n const gpuFiles = [...data.scales.files, ...data.quats.files, ...data.sh0.files, ...(data.shN?.files ?? [])];\r\n\r\n let meansL: RawTexture;\r\n let meansU: RawTexture;\r\n let meansWidth: number;\r\n let meansHeight: number;\r\n let meansImages: Nullable<[IWebPImage, IWebPImage]> = null;\r\n let gpuTextures: RawTexture[];\r\n\r\n if (computeCpuPositions) {\r\n const [images, gpu] = await Promise.all([Promise.all(data.means.files.map(loadMeansImageAsync)), Promise.all(gpuFiles.map(loadGpuTextureAsync))]);\r\n meansImages = [images[0], images[1]];\r\n gpuTextures = gpu;\r\n meansL = CreateSogTextureFromImage(scene, images[0]);\r\n meansU = CreateSogTextureFromImage(scene, images[1]);\r\n meansWidth = images[0].width;\r\n meansHeight = images[0].height;\r\n } else {\r\n const [meansTex, gpu] = await Promise.all([Promise.all(data.means.files.map(loadGpuTextureAsync)), Promise.all(gpuFiles.map(loadGpuTextureAsync))]);\r\n gpuTextures = gpu;\r\n meansL = meansTex[0];\r\n meansU = meansTex[1];\r\n const size = (meansL as Texture).getSize();\r\n meansWidth = size.width;\r\n meansHeight = size.height;\r\n }\r\n\r\n const splatCount = data.count ?? data.means.shape[0];\r\n const splatTexelCount = meansWidth * meansHeight;\r\n if (splatTexelCount < splatCount) {\r\n throw new Error(`SOG texture contains ${splatTexelCount} texels, but metadata references ${splatCount} splats.`);\r\n }\r\n\r\n const scales = gpuTextures[0];\r\n const quats = gpuTextures[1];\r\n const sh0 = gpuTextures[2];\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 && gpuTextures.length >= 5) {\r\n shCentroids = gpuTextures[3];\r\n shLabels = gpuTextures[4];\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: meansImages ? DecodeSogPositions(data, meansImages[0].bits, meansImages[1].bits, splatCount) : new Float32Array(0),\r\n };\r\n\r\n return { mode: Mode.Splat, data: new ArrayBuffer(0), hasVertexColors: false, shDegree, sogTextures: pack };\r\n}\r\n"]}
@@ -63,6 +63,14 @@ export declare class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneL
63
63
  * @returns a promise containing the loaded meshes, particles, skeletons and animations
64
64
  */
65
65
  importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string, _onProgress?: (event: ISceneLoaderProgressEvent) => void, _fileName?: string): Promise<ISceneLoaderAsyncResult>;
66
+ /**
67
+ * Detects a PlayCanvas-style `lod-meta.json` payload and, if found, creates a streaming mesh for it.
68
+ * @param scene hosting scene
69
+ * @param data loaded file data
70
+ * @param rootUrl root url the metadata's relative paths resolve against
71
+ * @returns the streaming mesh, or null when the data is not SOG LOD metadata
72
+ */
73
+ private _tryCreateLODStream;
66
74
  private static _BuildPointCloud;
67
75
  private static _BuildMesh;
68
76
  private _unzipWithFFlateAsync;
@@ -3,6 +3,7 @@
3
3
  import { RegisterSceneLoaderPlugin, } from "@babylonjs/core/Loading/sceneLoader.js";
4
4
  import { SPLATFileLoaderMetadata } from "./splatFileLoader.metadata.js";
5
5
  import { GaussianSplattingMesh } from "@babylonjs/core/Meshes/GaussianSplatting/gaussianSplattingMesh.js";
6
+ import { GaussianSplattingStream } from "./gaussianSplattingStream.js";
6
7
  import { AssetContainer } from "@babylonjs/core/assetContainer.js";
7
8
  import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
8
9
  import { Logger } from "@babylonjs/core/Misc/logger.js";
@@ -51,6 +52,19 @@ export class SPLATFileLoader {
51
52
  * @returns a promise containing the loaded meshes, particles, skeletons and animations
52
53
  */
53
54
  async importMeshAsync(meshesNames, scene, data, rootUrl, _onProgress, _fileName) {
55
+ const lodStream = this._tryCreateLODStream(scene, data, rootUrl);
56
+ if (lodStream) {
57
+ return {
58
+ meshes: [lodStream],
59
+ particleSystems: [],
60
+ skeletons: [],
61
+ animationGroups: [],
62
+ transformNodes: [],
63
+ geometries: [],
64
+ lights: [],
65
+ spriteManagers: [],
66
+ };
67
+ }
54
68
  // eslint-disable-next-line github/no-then
55
69
  return await this._parseAsync(meshesNames, scene, data, rootUrl).then((meshes) => {
56
70
  return {
@@ -65,6 +79,41 @@ export class SPLATFileLoader {
65
79
  };
66
80
  });
67
81
  }
82
+ /**
83
+ * Detects a PlayCanvas-style `lod-meta.json` payload and, if found, creates a streaming mesh for it.
84
+ * @param scene hosting scene
85
+ * @param data loaded file data
86
+ * @param rootUrl root url the metadata's relative paths resolve against
87
+ * @returns the streaming mesh, or null when the data is not SOG LOD metadata
88
+ */
89
+ _tryCreateLODStream(scene, data, rootUrl) {
90
+ if (typeof data !== "string") {
91
+ return null;
92
+ }
93
+ let parsed;
94
+ try {
95
+ parsed = JSON.parse(data);
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ if (!GaussianSplattingStream.IsLODMetadata(parsed)) {
101
+ return null;
102
+ }
103
+ const previousBlockEntityCollection = scene._blockEntityCollection;
104
+ scene._blockEntityCollection = !!this._assetContainer;
105
+ try {
106
+ const stream = new GaussianSplattingStream("GaussianSplattingStream", parsed, rootUrl, scene, {
107
+ deflateURL: this._loadingOptions.deflateURL,
108
+ fflate: this._loadingOptions.fflate,
109
+ });
110
+ stream._parentContainer = this._assetContainer;
111
+ return stream;
112
+ }
113
+ finally {
114
+ scene._blockEntityCollection = previousBlockEntityCollection;
115
+ }
116
+ }
68
117
  static _BuildPointCloud(pointcloud, data) {
69
118
  if (!data.byteLength) {
70
119
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"splatFileLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/SPLAT/splatFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/promise-function-async*/\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport {\r\n type ISceneLoaderPluginAsync,\r\n type ISceneLoaderPluginFactory,\r\n type ISceneLoaderAsyncResult,\r\n type ISceneLoaderProgressEvent,\r\n type SceneLoaderPluginOptions,\r\n RegisterSceneLoaderPlugin,\r\n} from \"core/Loading/sceneLoader\";\r\nimport { SPLATFileLoaderMetadata } from \"./splatFileLoader.metadata\";\r\nimport { GaussianSplattingMesh } from \"core/Meshes/GaussianSplatting/gaussianSplattingMesh\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { PointsCloudSystem } from \"core/Particles/pointsCloudSystem\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\r\nimport { type SPLATLoadingOptions } from \"./splatLoadingOptions\";\r\nimport { type GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { ConvertSpzToSplatAsync, GetSpzModule, ParseSpz } from \"./spz\";\r\nimport { Mode, type IParsedSplat } from \"./splatDefs\";\r\nimport { ParseSogMeta, ParseSogMetaAsTextures, type SOGRootData } from \"./sog\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type ArcRotateCamera } from \"core/Cameras/arcRotateCamera\";\r\n\r\ndeclare module \"core/Loading/sceneLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface SceneLoaderPluginOptions {\r\n /**\r\n * Defines options for the splat loader.\r\n */\r\n [SPLATFileLoaderMetadata.name]: Partial<SPLATLoadingOptions>;\r\n }\r\n}\r\n\r\n// FFlate access\r\ndeclare const fflate: any;\r\n\r\n/**\r\n * @experimental\r\n * SPLAT file type loader.\r\n * This is a babylon scene loader plugin.\r\n */\r\nexport class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public readonly name = SPLATFileLoaderMetadata.name;\r\n\r\n private _assetContainer: Nullable<AssetContainer> = null;\r\n\r\n private readonly _loadingOptions: Readonly<SPLATLoadingOptions>;\r\n /**\r\n * Defines the extensions the splat loader is able to load.\r\n * force data to come in as an ArrayBuffer\r\n */\r\n public readonly extensions = SPLATFileLoaderMetadata.extensions;\r\n\r\n /**\r\n * Creates loader for gaussian splatting files\r\n * @param loadingOptions options for loading and parsing splat and PLY files.\r\n */\r\n constructor(loadingOptions: Partial<Readonly<SPLATLoadingOptions>> = {}) {\r\n this._loadingOptions = { ...SPLATFileLoader._DefaultLoadingOptions, ...loadingOptions };\r\n }\r\n\r\n private static readonly _DefaultLoadingOptions = {\r\n keepInRam: false,\r\n flipY: false,\r\n needsRotationScaleTextures: false,\r\n spzLibraryUrl: typeof WebAssembly === \"object\" ? \"https://unpkg.com/@adobe/spz@0.2.2/dist/spz.js\" : undefined,\r\n } as const satisfies SPLATLoadingOptions;\r\n\r\n /** @internal */\r\n createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync {\r\n return new SPLATFileLoader(options[SPLATFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * Imports from the loaded gaussian splatting data and adds them to the scene\r\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene the scene the meshes should be added to\r\n * @param data the gaussian splatting data to load\r\n * @param rootUrl root url to load from\r\n * @param _onProgress callback called while file is loading\r\n * @param _fileName Defines the name of the file to load\r\n * @returns a promise containing the loaded meshes, particles, skeletons and animations\r\n */\r\n public async importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n _onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n _fileName?: string\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n // eslint-disable-next-line github/no-then\r\n return await this._parseAsync(meshesNames, scene, data, rootUrl).then((meshes) => {\r\n return {\r\n meshes: meshes,\r\n particleSystems: [],\r\n skeletons: [],\r\n animationGroups: [],\r\n transformNodes: [],\r\n geometries: [],\r\n lights: [],\r\n spriteManagers: [],\r\n };\r\n });\r\n }\r\n\r\n private static _BuildPointCloud(pointcloud: PointsCloudSystem, data: ArrayBuffer): boolean {\r\n if (!data.byteLength) {\r\n return false;\r\n }\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(data);\r\n\r\n // parsed array contains room for position(3floats), normal(3floats), color (4b), quantized quaternion (4b)\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const vertexCount = uBuffer.length / rowLength;\r\n\r\n const pointcloudfunc = function (particle: any, i: number) {\r\n const x = fBuffer[8 * i + 0];\r\n const y = fBuffer[8 * i + 1];\r\n const z = fBuffer[8 * i + 2];\r\n particle.position = new Vector3(x, y, z);\r\n\r\n const r = uBuffer[rowLength * i + 24 + 0] / 255;\r\n const g = uBuffer[rowLength * i + 24 + 1] / 255;\r\n const b = uBuffer[rowLength * i + 24 + 2] / 255;\r\n particle.color = new Color4(r, g, b, 1);\r\n };\r\n\r\n pointcloud.addPoints(vertexCount, pointcloudfunc);\r\n return true;\r\n }\r\n\r\n private static _BuildMesh(scene: Scene, parsedPLY: IParsedSplat): Mesh {\r\n const mesh = new Mesh(\"PLYMesh\", scene);\r\n\r\n const uBuffer = new Uint8Array(parsedPLY.data);\r\n const fBuffer = new Float32Array(parsedPLY.data);\r\n\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const vertexCount = uBuffer.length / rowLength;\r\n\r\n const positions = [];\r\n\r\n const vertexData = new VertexData();\r\n for (let i = 0; i < vertexCount; i++) {\r\n const x = fBuffer[8 * i + 0];\r\n const y = fBuffer[8 * i + 1];\r\n const z = fBuffer[8 * i + 2];\r\n positions.push(x, y, z);\r\n }\r\n\r\n if (parsedPLY.hasVertexColors) {\r\n const colors = new Float32Array(vertexCount * 4);\r\n for (let i = 0; i < vertexCount; i++) {\r\n const r = uBuffer[rowLength * i + 24 + 0] / 255;\r\n const g = uBuffer[rowLength * i + 24 + 1] / 255;\r\n const b = uBuffer[rowLength * i + 24 + 2] / 255;\r\n colors[i * 4 + 0] = r;\r\n colors[i * 4 + 1] = g;\r\n colors[i * 4 + 2] = b;\r\n colors[i * 4 + 3] = 1;\r\n }\r\n vertexData.colors = colors;\r\n }\r\n\r\n vertexData.positions = positions;\r\n vertexData.indices = parsedPLY.faces!;\r\n\r\n vertexData.applyToMesh(mesh);\r\n return mesh;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax, @typescript-eslint/naming-convention\r\n private async _unzipWithFFlateAsync(data: Uint8Array): Promise<Map<string, Uint8Array>> {\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n let fflate = this._loadingOptions.fflate as typeof import(\"fflate\");\r\n // ensure fflate is loaded\r\n if (!fflate) {\r\n if (typeof (window as any).fflate === \"undefined\") {\r\n await Tools.LoadScriptAsync(this._loadingOptions.deflateURL ?? \"https://unpkg.com/fflate/umd/index.js\");\r\n }\r\n fflate = (window as any).fflate as typeof fflate;\r\n }\r\n\r\n const { unzipSync } = fflate;\r\n\r\n const unzipped = unzipSync(data) as Record<string, Uint8Array>; // { [filename: string]: Uint8Array }\r\n\r\n const files = new Map<string, Uint8Array>();\r\n for (const [name, content] of Object.entries(unzipped)) {\r\n files.set(name, content);\r\n }\r\n return files;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _parseAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string): Promise<Array<AbstractMesh>> {\r\n const babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\r\n\r\n const makeGSFromParsedSOG = (parsedSOG: IParsedSplat) => {\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n const gaussianSplatting =\r\n this._loadingOptions.gaussianSplattingMesh ??\r\n new GaussianSplattingMesh(\"GaussianSplatting\", null, scene, this._loadingOptions.keepInRam, this._loadingOptions.needsRotationScaleTextures);\r\n gaussianSplatting._parentContainer = this._assetContainer;\r\n babylonMeshesArray.push(gaussianSplatting);\r\n if (parsedSOG.sogTextures) {\r\n gaussianSplatting.setSogTextureData(parsedSOG.sogTextures);\r\n } else {\r\n gaussianSplatting.updateData(parsedSOG.data, parsedSOG.sh, { flipY: false }, undefined, parsedSOG.shDegree);\r\n }\r\n gaussianSplatting.scaling.y *= -1;\r\n gaussianSplatting.computeWorldMatrix(true);\r\n scene._blockEntityCollection = false;\r\n };\r\n\r\n const engine = scene.getEngine();\r\n let useSogTextures = this._loadingOptions.useSogTextures;\r\n if (useSogTextures && !engine.isWebGPU && engine.version < 2) {\r\n Logger.Warn(\"SPLATFileLoader: useSogTextures requires WebGL2 or WebGPU. Falling back to CPU path.\");\r\n useSogTextures = false;\r\n }\r\n const sogParser = useSogTextures ? ParseSogMetaAsTextures : ParseSogMeta;\r\n\r\n // check if data is json string\r\n if (typeof data === \"string\") {\r\n const dataSOG = JSON.parse(data) as SOGRootData;\r\n if (dataSOG && dataSOG.means && dataSOG.scales && dataSOG.quats && dataSOG.sh0) {\r\n return new Promise((resolve, reject) => {\r\n sogParser(dataSOG, rootUrl, scene)\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n .then((parsedSOG) => {\r\n makeGSFromParsedSOG(parsedSOG);\r\n resolve(babylonMeshesArray);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((e) => {\r\n reject(new Error(\"Failed to parse SOG data.\", { cause: e }));\r\n });\r\n });\r\n }\r\n }\r\n\r\n const u8 = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\r\n // ZIP signature check for SOG\r\n if (u8[0] === 0x50 && u8[1] === 0x4b) {\r\n return new Promise((resolve, reject) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this._unzipWithFFlateAsync(u8).then((files) => {\r\n sogParser(files, rootUrl, scene)\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n .then((parsedSOG) => {\r\n makeGSFromParsedSOG(parsedSOG);\r\n resolve(babylonMeshesArray);\r\n }) // eslint-disable-next-line github/no-then\r\n .catch((e) => {\r\n reject(new Error(\"Failed to parse SOG zip data.\", { cause: e }));\r\n });\r\n });\r\n });\r\n }\r\n\r\n const handlePLY = (resolve: (value: AbstractMesh[]) => void) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SPLATFileLoader._ConvertPLYToSplat(data as ArrayBuffer).then(async (parsedPLY) => {\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n switch (parsedPLY.mode) {\r\n case Mode.Splat:\r\n {\r\n const gaussianSplatting =\r\n this._loadingOptions.gaussianSplattingMesh ??\r\n new GaussianSplattingMesh(\"GaussianSplatting\", null, scene, this._loadingOptions.keepInRam, this._loadingOptions.needsRotationScaleTextures);\r\n gaussianSplatting._parentContainer = this._assetContainer;\r\n babylonMeshesArray.push(gaussianSplatting);\r\n gaussianSplatting.updateData(parsedPLY.data, parsedPLY.sh, { flipY: false }, undefined, parsedPLY.shDegree);\r\n gaussianSplatting.scaling.y *= -1.0;\r\n\r\n if (parsedPLY.chirality === \"RightHanded\") {\r\n gaussianSplatting.scaling.y *= -1.0;\r\n }\r\n\r\n switch (parsedPLY.upAxis) {\r\n case \"X\":\r\n gaussianSplatting.rotation = new Vector3(0, 0, Math.PI / 2);\r\n break;\r\n case \"Y\":\r\n gaussianSplatting.rotation = new Vector3(0, 0, Math.PI);\r\n break;\r\n case \"Z\":\r\n gaussianSplatting.rotation = new Vector3(-Math.PI / 2, Math.PI, 0);\r\n break;\r\n }\r\n gaussianSplatting.computeWorldMatrix(true);\r\n }\r\n break;\r\n case Mode.PointCloud:\r\n {\r\n const pointcloud = new PointsCloudSystem(\"PointCloud\", 1, scene);\r\n if (SPLATFileLoader._BuildPointCloud(pointcloud, parsedPLY.data)) {\r\n // eslint-disable-next-line github/no-then\r\n await pointcloud.buildMeshAsync().then((mesh) => {\r\n babylonMeshesArray.push(mesh);\r\n });\r\n } else {\r\n pointcloud.dispose();\r\n }\r\n }\r\n break;\r\n case Mode.Mesh:\r\n {\r\n if (parsedPLY.faces) {\r\n babylonMeshesArray.push(SPLATFileLoader._BuildMesh(scene, parsedPLY));\r\n } else {\r\n throw new Error(\"PLY mesh doesn't contain face informations.\");\r\n }\r\n }\r\n break;\r\n default:\r\n throw new Error(\"Unsupported Splat mode\");\r\n }\r\n scene._blockEntityCollection = false;\r\n this.applyAutoCameraLimits(parsedPLY, scene);\r\n resolve(babylonMeshesArray);\r\n });\r\n };\r\n\r\n // Check for gzip (before SPZ V4) and NGSP (SPZ V4+) magic bytes to detect SPZ format\r\n const isGZipped = u8[0] === 0x1f && u8[1] === 0x8b;\r\n const isNGSP = u8[0] === 0x4e && u8[1] === 0x47 && u8[2] === 0x53 && u8[3] === 0x50;\r\n if (!isGZipped && !isNGSP) {\r\n return new Promise((resolve) => {\r\n handlePLY(resolve);\r\n });\r\n }\r\n\r\n const applyParsedSPZ = (parsedSPZ: IParsedSplat, resolve: (meshes: typeof babylonMeshesArray) => void) => {\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n const gaussianSplatting =\r\n this._loadingOptions.gaussianSplattingMesh ??\r\n new GaussianSplattingMesh(\"GaussianSplatting\", null, scene, this._loadingOptions.keepInRam, this._loadingOptions.needsRotationScaleTextures);\r\n if (parsedSPZ.trainedWithAntialiasing) {\r\n const gsMaterial = gaussianSplatting.material as GaussianSplattingMaterial;\r\n gsMaterial.kernelSize = 0.1;\r\n gsMaterial.compensation = true;\r\n }\r\n gaussianSplatting._parentContainer = this._assetContainer;\r\n babylonMeshesArray.push(gaussianSplatting);\r\n gaussianSplatting.updateData(parsedSPZ.data, parsedSPZ.sh, { flipY: false }, undefined, parsedSPZ.shDegree);\r\n if (!this._loadingOptions.flipY) {\r\n gaussianSplatting.scaling.y *= -1.0;\r\n gaussianSplatting.computeWorldMatrix(true);\r\n }\r\n scene._blockEntityCollection = false;\r\n this.applyAutoCameraLimits(parsedSPZ, scene);\r\n resolve(babylonMeshesArray);\r\n };\r\n\r\n if (this._loadingOptions.spzLibraryUrl) {\r\n // WASM path: load spz module from URL, pass raw gzip data directly\r\n // eslint-disable-next-line github/no-then\r\n return GetSpzModule(this._loadingOptions.spzLibraryUrl).then((spz) => {\r\n const cloud = spz.loadSpzFromBuffer(new Uint8Array(data), { to: spz.CoordinateSystem.RUB });\r\n // eslint-disable-next-line github/no-then\r\n return ConvertSpzToSplatAsync(cloud, scene).then((parsedSPZ) => {\r\n return new Promise<AbstractMesh[]>((resolve) => {\r\n applyParsedSPZ(parsedSPZ, resolve);\r\n });\r\n });\r\n });\r\n }\r\n\r\n // NGSP (SPZ V4+) requires WASM — the native fallback only handles legacy gzip formats\r\n if (isNGSP) {\r\n return Promise.reject(\r\n new Error(\r\n \"SPZ V4+ files (NGSP format) are not supported by the native fallback loader. \" +\r\n \"Please provide a valid 'spzLibraryUrl' in the loading options to use the WASM-based SPZ library, \" +\r\n \"or ensure WebAssembly is available in your environment.\"\r\n )\r\n );\r\n }\r\n\r\n // Manual path: decompress gzip, then parse with the built-in SPZ parser\r\n const readableStream = new ReadableStream({\r\n start(controller) {\r\n controller.enqueue(new Uint8Array(data));\r\n controller.close();\r\n },\r\n });\r\n const decompressionStream = new DecompressionStream(\"gzip\");\r\n const decompressedStream = readableStream.pipeThrough(decompressionStream);\r\n\r\n return new Promise((resolve) => {\r\n new Response(decompressedStream)\r\n .arrayBuffer()\r\n // eslint-disable-next-line github/no-then\r\n .then((buffer) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n ParseSpz(buffer, scene, this._loadingOptions).then((parsedSPZ) => {\r\n applyParsedSPZ(parsedSPZ, resolve);\r\n });\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(() => {\r\n handlePLY(resolve);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Applies camera limits based on parsed meta data\r\n * @param meta parsed splat meta data\r\n * @param scene\r\n */\r\n private applyAutoCameraLimits(meta: IParsedSplat, scene: Scene): void {\r\n if (this._loadingOptions.disableAutoCameraLimits) {\r\n return;\r\n }\r\n if ((meta.safeOrbitCameraRadiusMin !== undefined || meta.safeOrbitCameraElevationMinMax !== undefined) && scene.activeCamera?.getClassName() === \"ArcRotateCamera\") {\r\n const arcCam = scene.activeCamera as ArcRotateCamera;\r\n if (meta.safeOrbitCameraElevationMinMax) {\r\n arcCam.lowerBetaLimit = Math.PI * 0.5 - meta.safeOrbitCameraElevationMinMax[1];\r\n arcCam.upperBetaLimit = Math.PI * 0.5 - meta.safeOrbitCameraElevationMinMax[0];\r\n }\r\n\r\n if (meta.safeOrbitCameraRadiusMin) {\r\n arcCam.lowerRadiusLimit = meta.safeOrbitCameraRadiusMin;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @returns The loaded asset container\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string): Promise<AssetContainer> {\r\n const container = new AssetContainer(scene);\r\n this._assetContainer = container;\r\n\r\n return (\r\n this.importMeshAsync(null, scene, data, rootUrl)\r\n // eslint-disable-next-line github/no-then\r\n .then((result) => {\r\n for (const mesh of result.meshes) {\r\n container.meshes.push(mesh);\r\n }\r\n // mesh material will be null before 1st rendered frame.\r\n this._assetContainer = null;\r\n return container;\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((ex) => {\r\n this._assetContainer = null;\r\n throw ex;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Imports all objects from the loaded OBJ data and adds them to the scene\r\n * @param scene the scene the objects should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise which completes when objects have been loaded to the scene\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public loadAsync(scene: Scene, data: string, rootUrl: string): Promise<void> {\r\n //Get the 3D model\r\n // eslint-disable-next-line github/no-then\r\n return this.importMeshAsync(null, scene, data, rootUrl).then(() => {\r\n // return void\r\n });\r\n }\r\n\r\n /**\r\n * Code from https://github.com/dylanebert/gsplat.js/blob/main/src/loaders/PLYLoader.ts Under MIT license\r\n * Converts a .ply data array buffer to splat\r\n * if data array buffer is not ply, returns the original buffer\r\n * @param data the .ply data to load\r\n * @returns the loaded splat buffer\r\n */\r\n private static _ConvertPLYToSplat(data: ArrayBuffer): Promise<IParsedSplat> {\r\n const ubuf = new Uint8Array(data);\r\n const header = new TextDecoder().decode(ubuf.slice(0, 1024 * 10));\r\n const headerEnd = \"end_header\\n\";\r\n const headerEndIndex = header.indexOf(headerEnd);\r\n if (headerEndIndex < 0 || !header) {\r\n // standard splat\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: data, rawSplat: true });\r\n });\r\n }\r\n\r\n const vertexCount = parseInt(/element vertex (\\d+)\\n/.exec(header)![1]);\r\n const faceElement = /element face (\\d+)\\n/.exec(header);\r\n let faceCount = 0;\r\n if (faceElement) {\r\n faceCount = parseInt(faceElement[1]);\r\n }\r\n const chunkElement = /element chunk (\\d+)\\n/.exec(header);\r\n let chunkCount = 0;\r\n if (chunkElement) {\r\n chunkCount = parseInt(chunkElement[1]);\r\n }\r\n\r\n let rowVertexOffset = 0;\r\n let rowChunkOffset = 0;\r\n const offsets: Record<string, number> = {\r\n double: 8,\r\n int: 4,\r\n uint: 4,\r\n float: 4,\r\n short: 2,\r\n ushort: 2,\r\n uchar: 1,\r\n list: 0,\r\n };\r\n\r\n type PlyProperty = {\r\n name: string;\r\n type: string;\r\n offset: number;\r\n };\r\n\r\n const ElementMode: Record<string, number> = {\r\n Vertex: 0,\r\n Chunk: 1,\r\n SH: 2,\r\n Float_Tuple: 3,\r\n Float: 4,\r\n Uchar: 5,\r\n };\r\n\r\n let chunkMode = ElementMode.Chunk;\r\n const vertexProperties: PlyProperty[] = [];\r\n const chunkProperties: PlyProperty[] = [];\r\n const filtered = header.slice(0, headerEndIndex).split(\"\\n\");\r\n const metaData: Partial<IParsedSplat> = {};\r\n for (const prop of filtered) {\r\n if (prop.startsWith(\"property \")) {\r\n const [, type, name] = prop.split(\" \");\r\n\r\n if (chunkMode == ElementMode.Chunk) {\r\n chunkProperties.push({ name, type, offset: rowChunkOffset });\r\n rowChunkOffset += offsets[type];\r\n } else if (chunkMode == ElementMode.Vertex) {\r\n vertexProperties.push({ name, type, offset: rowVertexOffset });\r\n rowVertexOffset += offsets[type];\r\n } else if (chunkMode == ElementMode.SH) {\r\n vertexProperties.push({ name, type, offset: rowVertexOffset });\r\n } else if (chunkMode == ElementMode.Float_Tuple) {\r\n const view = new DataView(data, rowChunkOffset, offsets.float * 2);\r\n metaData.safeOrbitCameraElevationMinMax = [view.getFloat32(0, true), view.getFloat32(4, true)];\r\n } else if (chunkMode == ElementMode.Float) {\r\n const view = new DataView(data, rowChunkOffset, offsets.float);\r\n metaData.safeOrbitCameraRadiusMin = view.getFloat32(0, true);\r\n } else if (chunkMode == ElementMode.Uchar) {\r\n const view = new DataView(data, rowChunkOffset, offsets.uchar);\r\n if (name == \"up_axis\") {\r\n metaData.upAxis = view.getUint8(0) == 0 ? \"X\" : view.getUint8(0) == 1 ? \"Y\" : \"Z\";\r\n } else if (name == \"chirality\") {\r\n metaData.chirality = view.getUint8(0) == 0 ? \"LeftHanded\" : \"RightHanded\";\r\n }\r\n }\r\n\r\n if (!offsets[type]) {\r\n Logger.Warn(`Unsupported property type: ${type}.`);\r\n }\r\n } else if (prop.startsWith(\"element \")) {\r\n const [, type] = prop.split(\" \");\r\n if (type == \"chunk\") {\r\n chunkMode = ElementMode.Chunk;\r\n } else if (type == \"vertex\") {\r\n chunkMode = ElementMode.Vertex;\r\n } else if (type == \"sh\") {\r\n chunkMode = ElementMode.SH;\r\n } else if (type == \"safe_orbit_camera_elevation_min_max_radians\") {\r\n chunkMode = ElementMode.Float_Tuple;\r\n } else if (type == \"safe_orbit_camera_radius_min\") {\r\n chunkMode = ElementMode.Float;\r\n } else if (type == \"up_axis\" || type == \"chirality\") {\r\n chunkMode = ElementMode.Uchar;\r\n }\r\n }\r\n }\r\n\r\n const rowVertexLength = rowVertexOffset;\r\n const rowChunkLength = rowChunkOffset;\r\n\r\n // eslint-disable-next-line github/no-then\r\n return (GaussianSplattingMesh.ConvertPLYWithSHToSplatAsync(data) as any).then(async (splatsData: any) => {\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n let offset = rowChunkLength * chunkCount + rowVertexLength * vertexCount;\r\n // faces\r\n const faces: number[] = [];\r\n if (faceCount) {\r\n for (let i = 0; i < faceCount; i++) {\r\n const faceVertexCount = dataView.getUint8(offset);\r\n if (faceVertexCount != 3) {\r\n continue; // only support triangles\r\n }\r\n offset += 1;\r\n\r\n for (let j = 0; j < faceVertexCount; j++) {\r\n const vertexIndex = dataView.getUint32(offset + (2 - j) * 4, true); // change face winding\r\n faces.push(vertexIndex);\r\n }\r\n offset += 12;\r\n }\r\n }\r\n\r\n // early exit for chunked/quantized ply\r\n if (chunkCount) {\r\n return await new Promise((resolve) => {\r\n resolve({\r\n mode: Mode.Splat,\r\n data: splatsData.buffer,\r\n sh: splatsData.sh,\r\n shDegree: splatsData.shDegree,\r\n faces: faces,\r\n hasVertexColors: false,\r\n compressed: true,\r\n rawSplat: false,\r\n });\r\n });\r\n }\r\n // count available properties. if all necessary are present then it's a splat. Otherwise, it's a point cloud\r\n // if faces are found, then it's a standard mesh\r\n let propertyCount = 0;\r\n let propertyColorCount = 0;\r\n const splatProperties = [\"x\", \"y\", \"z\", \"scale_0\", \"scale_1\", \"scale_2\", \"opacity\", \"rot_0\", \"rot_1\", \"rot_2\", \"rot_3\"];\r\n const splatColorProperties = [\"red\", \"green\", \"blue\", \"f_dc_0\", \"f_dc_1\", \"f_dc_2\"];\r\n for (let propertyIndex = 0; propertyIndex < vertexProperties.length; propertyIndex++) {\r\n const property = vertexProperties[propertyIndex];\r\n if (splatProperties.includes(property.name)) {\r\n propertyCount++;\r\n }\r\n if (splatColorProperties.includes(property.name)) {\r\n propertyColorCount++;\r\n }\r\n }\r\n const hasMandatoryProperties = propertyCount == splatProperties.length && propertyColorCount == 3;\r\n const currentMode = faceCount ? Mode.Mesh : hasMandatoryProperties ? Mode.Splat : Mode.PointCloud;\r\n // parsed ready ready to be used as a splat\r\n return await new Promise((resolve) => {\r\n resolve({\r\n ...metaData,\r\n mode: currentMode,\r\n data: splatsData.buffer,\r\n sh: splatsData.sh,\r\n shDegree: splatsData.shDegree,\r\n faces: faces,\r\n hasVertexColors: !!propertyColorCount,\r\n compressed: false,\r\n rawSplat: false,\r\n });\r\n });\r\n });\r\n }\r\n}\r\n\r\n// Add this loader into the register plugin\r\nRegisterSceneLoaderPlugin(new SPLATFileLoader());\r\n"]}
1
+ {"version":3,"file":"splatFileLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/SPLAT/splatFileLoader.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,yDAAyD;AACzD,OAAO,EAMH,yBAAyB,GAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAoB,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAgBxC;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAexB;;;OAGG;IACH,YAAY,iBAAyD,EAAE;QAlBvE;;WAEG;QACa,SAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC;QAE5C,oBAAe,GAA6B,IAAI,CAAC;QAGzD;;;WAGG;QACa,eAAU,GAAG,uBAAuB,CAAC,UAAU,CAAC;QAO5D,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,eAAe,CAAC,sBAAsB,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5F,CAAC;IASD,gBAAgB;IAChB,YAAY,CAAC,OAAiC;QAC1C,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,eAAe,CACxB,WAAgB,EAChB,KAAY,EACZ,IAAS,EACT,OAAe,EACf,WAAwD,EACxD,SAAkB;QAElB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,SAAS,EAAE,CAAC;YACZ,OAAO;gBACH,MAAM,EAAE,CAAC,SAAS,CAAC;gBACnB,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,EAAE;gBACb,eAAe,EAAE,EAAE;gBACnB,cAAc,EAAE,EAAE;gBAClB,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;gBACV,cAAc,EAAE,EAAE;aACrB,CAAC;QACN,CAAC;QAED,0CAA0C;QAC1C,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7E,OAAO;gBACH,MAAM,EAAE,MAAM;gBACd,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,EAAE;gBACb,eAAe,EAAE,EAAE;gBACnB,cAAc,EAAE,EAAE;gBAClB,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;gBACV,cAAc,EAAE,EAAE;aACrB,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACK,mBAAmB,CAAC,KAAY,EAAE,IAAS,EAAE,OAAe;QAChE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,6BAA6B,GAAG,KAAK,CAAC,sBAAsB,CAAC;QACnE,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QACtD,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,uBAAuB,CAAC,yBAAyB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC1F,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU;gBAC3C,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;YAC/C,OAAO,MAAM,CAAC;QAClB,CAAC;gBAAS,CAAC;YACP,KAAK,CAAC,sBAAsB,GAAG,6BAA6B,CAAC;QACjE,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,UAA6B,EAAE,IAAiB;QAC5E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QAEvC,2GAA2G;QAC3G,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAE/C,MAAM,cAAc,GAAG,UAAU,QAAa,EAAE,CAAS;YACrD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,QAAQ,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAEzC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAChD,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAChD,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAChD,QAAQ,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,KAAY,EAAE,SAAuB;QAC3D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEjD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAE/C,MAAM,SAAS,GAAG,EAAE,CAAC;QAErB,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAChD,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAChD,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAChD,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAC/B,CAAC;QAED,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;QACjC,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,KAAM,CAAC;QAEtC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,iIAAiI;IACzH,KAAK,CAAC,qBAAqB,CAAC,IAAgB;QAChD,6DAA6D;QAC7D,aAAa;QACb,IAAI,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAiC,CAAC;QACpE,0BAA0B;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,IAAI,OAAQ,MAAc,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChD,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,IAAI,uCAAuC,CAAC,CAAC;YAC5G,CAAC;YACD,MAAM,GAAI,MAAc,CAAC,MAAuB,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAE7B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAA+B,CAAC,CAAC,qCAAqC;QAErG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,2FAA2F;IACnF,WAAW,CAAC,WAAgB,EAAE,KAAY,EAAE,IAAS,EAAE,OAAe;QAC1E,MAAM,kBAAkB,GAAgB,EAAE,CAAC,CAAC,sBAAsB;QAElE,MAAM,mBAAmB,GAAG,CAAC,SAAuB,EAAE,EAAE;YACpD,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;YACtD,MAAM,iBAAiB,GACnB,IAAI,CAAC,eAAe,CAAC,qBAAqB;gBAC1C,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;YACjJ,iBAAiB,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;YAC1D,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC3C,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gBACxB,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACJ,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChH,CAAC;YACD,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAClC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC3C,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACzC,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;QACzD,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;YACpG,cAAc,GAAG,KAAK,CAAC;QAC3B,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,YAAY,CAAC;QAEzE,+BAA+B;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;YAChD,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACnC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;wBAC9B,mFAAmF;yBAClF,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;wBAChB,mBAAmB,CAAC,SAAS,CAAC,CAAC;wBAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC;oBAChC,CAAC,CAAC;wBACF,0CAA0C;yBACzC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;wBACT,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACjE,CAAC,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,YAAY,WAAW,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,8BAA8B;QAC9B,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACnC,mFAAmF;gBACnF,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC1C,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;wBAC5B,mFAAmF;yBAClF,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;wBAChB,mBAAmB,CAAC,SAAS,CAAC,CAAC;wBAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC,0CAA0C;yBAC5C,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;wBACT,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACrE,CAAC,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,OAAwC,EAAE,EAAE;YAC3D,mFAAmF;YACnF,eAAe,CAAC,kBAAkB,CAAC,IAAmB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC7E,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;gBACtD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrB;wBACI,CAAC;4BACG,MAAM,iBAAiB,GACnB,IAAI,CAAC,eAAe,CAAC,qBAAqB;gCAC1C,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;4BACjJ,iBAAiB,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;4BAC1D,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;4BAC3C,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;4BAC5G,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;4BAEpC,IAAI,SAAS,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;gCACxC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;4BACxC,CAAC;4BAED,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC;gCACvB,KAAK,GAAG;oCACJ,iBAAiB,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oCAC5D,MAAM;gCACV,KAAK,GAAG;oCACJ,iBAAiB,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;oCACxD,MAAM;gCACV,KAAK,GAAG;oCACJ,iBAAiB,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oCACnE,MAAM;4BACd,CAAC;4BACD,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;wBAC/C,CAAC;wBACD,MAAM;oBACV;wBACI,CAAC;4BACG,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;4BACjE,IAAI,eAAe,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gCAC/D,0CAA0C;gCAC1C,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oCAC5C,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gCAClC,CAAC,CAAC,CAAC;4BACP,CAAC;iCAAM,CAAC;gCACJ,UAAU,CAAC,OAAO,EAAE,CAAC;4BACzB,CAAC;wBACL,CAAC;wBACD,MAAM;oBACV;wBACI,CAAC;4BACG,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gCAClB,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;4BAC1E,CAAC;iCAAM,CAAC;gCACJ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;4BACnE,CAAC;wBACL,CAAC;wBACD,MAAM;oBACV;wBACI,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAClD,CAAC;gBACD,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACrC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC7C,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,qFAAqF;QACrF,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACnD,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACpF,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3B,SAAS,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,SAAuB,EAAE,OAAoD,EAAE,EAAE;YACrG,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;YACtD,MAAM,iBAAiB,GACnB,IAAI,CAAC,eAAe,CAAC,qBAAqB;gBAC1C,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;YACjJ,IAAI,SAAS,CAAC,uBAAuB,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAqC,CAAC;gBAC3E,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC;gBAC5B,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;YACnC,CAAC;YACD,iBAAiB,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;YAC1D,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC3C,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC5G,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC9B,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;YACD,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC;YACrC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;YACrC,mEAAmE;YACnE,0CAA0C;YAC1C,OAAO,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjE,MAAM,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC5F,0CAA0C;gBAC1C,OAAO,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;oBAC3D,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;wBAC3C,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACvC,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC;QAED,sFAAsF;QACtF,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,KAAK,CACL,+EAA+E;gBAC3E,mGAAmG;gBACnG,yDAAyD,CAChE,CACJ,CAAC;QACN,CAAC;QAED,wEAAwE;QACxE,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;YACtC,KAAK,CAAC,UAAU;gBACZ,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzC,UAAU,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;SACJ,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,kBAAkB,GAAG,cAAc,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;QAE3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,QAAQ,CAAC,kBAAkB,CAAC;iBAC3B,WAAW,EAAE;gBACd,0CAA0C;iBACzC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACb,mFAAmF;gBACnF,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;oBAC7D,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;gBACF,0CAA0C;iBACzC,KAAK,CAAC,GAAG,EAAE;gBACR,SAAS,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACK,qBAAqB,CAAC,IAAkB,EAAE,KAAY;QAC1D,IAAI,IAAI,CAAC,eAAe,CAAC,uBAAuB,EAAE,CAAC;YAC/C,OAAO;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,wBAAwB,KAAK,SAAS,IAAI,IAAI,CAAC,8BAA8B,KAAK,SAAS,CAAC,IAAI,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,CAAC;YACjK,MAAM,MAAM,GAAG,KAAK,CAAC,YAA+B,CAAC;YACrD,IAAI,IAAI,CAAC,8BAA8B,EAAE,CAAC;gBACtC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;gBAC/E,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;YACnF,CAAC;YAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC;YAC5D,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,gDAAgD;IACzC,uBAAuB,CAAC,KAAY,EAAE,IAAY,EAAE,OAAe;QACtE,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,OAAO,CACH,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;YAC5C,0CAA0C;aACzC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACb,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC/B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;YACD,wDAAwD;YACxD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC;YACF,0CAA0C;aACzC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;YACV,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,MAAM,EAAE,CAAC;QACb,CAAC,CAAC,CACT,CAAC;IACN,CAAC;IAED;;;;;;OAMG;IACH,2FAA2F;IACpF,SAAS,CAAC,KAAY,EAAE,IAAY,EAAE,OAAe;QACxD,kBAAkB;QAClB,0CAA0C;QAC1C,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9D,cAAc;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,kBAAkB,CAAC,IAAiB;QAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,cAAc,CAAC;QACjC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,iBAAiB;YACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3B,OAAO,CAAC,EAAE,IAAI,oBAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,WAAW,EAAE,CAAC;YACd,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,YAAY,EAAE,CAAC;YACf,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,MAAM,OAAO,GAA2B;YACpC,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;SACV,CAAC;QAQF,MAAM,WAAW,GAA2B;YACxC,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,EAAE,EAAE,CAAC;YACL,WAAW,EAAE,CAAC;YACd,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;SACX,CAAC;QAEF,IAAI,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;QAClC,MAAM,gBAAgB,GAAkB,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAkB,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEvC,IAAI,SAAS,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBACjC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;oBAC7D,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;qBAAM,IAAI,SAAS,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;oBACzC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;oBAC/D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,SAAS,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;oBACrC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;gBACnE,CAAC;qBAAM,IAAI,SAAS,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;oBAC9C,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACnE,QAAQ,CAAC,8BAA8B,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBACnG,CAAC;qBAAM,IAAI,SAAS,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC/D,QAAQ,CAAC,wBAAwB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACjE,CAAC;qBAAM,IAAI,SAAS,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC/D,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;wBACpB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBACtF,CAAC;yBAAM,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;wBAC7B,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC9E,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;gBACvD,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;oBAClB,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;gBAClC,CAAC;qBAAM,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC1B,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;gBACnC,CAAC;qBAAM,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;oBACtB,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;gBAC/B,CAAC;qBAAM,IAAI,IAAI,IAAI,6CAA6C,EAAE,CAAC;oBAC/D,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC;gBACxC,CAAC;qBAAM,IAAI,IAAI,IAAI,8BAA8B,EAAE,CAAC;oBAChD,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;gBAClC,CAAC;qBAAM,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;oBAClD,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;gBAClC,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,eAAe,GAAG,eAAe,CAAC;QACxC,MAAM,cAAc,GAAG,cAAc,CAAC;QAEtC,0CAA0C;QAC1C,OAAQ,qBAAqB,CAAC,4BAA4B,CAAC,IAAI,CAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAe,EAAE,EAAE;YACpG,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,MAAM,GAAG,cAAc,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,CAAC;YACzE,QAAQ;YACR,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,SAAS,EAAE,CAAC;gBACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjC,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAClD,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;wBACvB,SAAS,CAAC,yBAAyB;oBACvC,CAAC;oBACD,MAAM,IAAI,CAAC,CAAC;oBAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,sBAAsB;wBAC1F,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC5B,CAAC;oBACD,MAAM,IAAI,EAAE,CAAC;gBACjB,CAAC;YACL,CAAC;YAED,uCAAuC;YACvC,IAAI,UAAU,EAAE,CAAC;gBACb,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACjC,OAAO,CAAC;wBACJ,IAAI,oBAAY;wBAChB,IAAI,EAAE,UAAU,CAAC,MAAM;wBACvB,EAAE,EAAE,UAAU,CAAC,EAAE;wBACjB,QAAQ,EAAE,UAAU,CAAC,QAAQ;wBAC7B,KAAK,EAAE,KAAK;wBACZ,eAAe,EAAE,KAAK;wBACtB,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,KAAK;qBAClB,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;YACP,CAAC;YACD,4GAA4G;YAC5G,gDAAgD;YAChD,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAC3B,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACxH,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACpF,KAAK,IAAI,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;gBACnF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;gBACjD,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,aAAa,EAAE,CAAC;gBACpB,CAAC;gBACD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/C,kBAAkB,EAAE,CAAC;gBACzB,CAAC;YACL,CAAC;YACD,MAAM,sBAAsB,GAAG,aAAa,IAAI,eAAe,CAAC,MAAM,IAAI,kBAAkB,IAAI,CAAC,CAAC;YAClG,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,mBAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,oBAAY,CAAC,wBAAgB,CAAC;YAClG,2CAA2C;YAC3C,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACjC,OAAO,CAAC;oBACJ,GAAG,QAAQ;oBACX,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,UAAU,CAAC,MAAM;oBACvB,EAAE,EAAE,UAAU,CAAC,EAAE;oBACjB,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,KAAK,EAAE,KAAK;oBACZ,eAAe,EAAE,CAAC,CAAC,kBAAkB;oBACrC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,KAAK;iBAClB,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;;AA3oBuB,sCAAsB,GAAG;IAC7C,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,KAAK;IACZ,0BAA0B,EAAE,KAAK;IACjC,aAAa,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,SAAS;CACzE,AALM,CAKL;AAyoB7C,2CAA2C;AAC3C,yBAAyB,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/promise-function-async*/\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport {\r\n type ISceneLoaderPluginAsync,\r\n type ISceneLoaderPluginFactory,\r\n type ISceneLoaderAsyncResult,\r\n type ISceneLoaderProgressEvent,\r\n type SceneLoaderPluginOptions,\r\n RegisterSceneLoaderPlugin,\r\n} from \"core/Loading/sceneLoader\";\r\nimport { SPLATFileLoaderMetadata } from \"./splatFileLoader.metadata\";\r\nimport { GaussianSplattingMesh } from \"core/Meshes/GaussianSplatting/gaussianSplattingMesh\";\r\nimport { GaussianSplattingStream } from \"./gaussianSplattingStream\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { PointsCloudSystem } from \"core/Particles/pointsCloudSystem\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\r\nimport { type SPLATLoadingOptions } from \"./splatLoadingOptions\";\r\nimport { type GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { ConvertSpzToSplatAsync, GetSpzModule, ParseSpz } from \"./spz\";\r\nimport { Mode, type IParsedSplat } from \"./splatDefs\";\r\nimport { ParseSogMeta, ParseSogMetaAsTextures, type SOGRootData } from \"./sog\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type ArcRotateCamera } from \"core/Cameras/arcRotateCamera\";\r\n\r\ndeclare module \"core/Loading/sceneLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface SceneLoaderPluginOptions {\r\n /**\r\n * Defines options for the splat loader.\r\n */\r\n [SPLATFileLoaderMetadata.name]: Partial<SPLATLoadingOptions>;\r\n }\r\n}\r\n\r\n// FFlate access\r\ndeclare const fflate: any;\r\n\r\n/**\r\n * @experimental\r\n * SPLAT file type loader.\r\n * This is a babylon scene loader plugin.\r\n */\r\nexport class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public readonly name = SPLATFileLoaderMetadata.name;\r\n\r\n private _assetContainer: Nullable<AssetContainer> = null;\r\n\r\n private readonly _loadingOptions: Readonly<SPLATLoadingOptions>;\r\n /**\r\n * Defines the extensions the splat loader is able to load.\r\n * force data to come in as an ArrayBuffer\r\n */\r\n public readonly extensions = SPLATFileLoaderMetadata.extensions;\r\n\r\n /**\r\n * Creates loader for gaussian splatting files\r\n * @param loadingOptions options for loading and parsing splat and PLY files.\r\n */\r\n constructor(loadingOptions: Partial<Readonly<SPLATLoadingOptions>> = {}) {\r\n this._loadingOptions = { ...SPLATFileLoader._DefaultLoadingOptions, ...loadingOptions };\r\n }\r\n\r\n private static readonly _DefaultLoadingOptions = {\r\n keepInRam: false,\r\n flipY: false,\r\n needsRotationScaleTextures: false,\r\n spzLibraryUrl: typeof WebAssembly === \"object\" ? \"https://unpkg.com/@adobe/spz@0.2.2/dist/spz.js\" : undefined,\r\n } as const satisfies SPLATLoadingOptions;\r\n\r\n /** @internal */\r\n createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync {\r\n return new SPLATFileLoader(options[SPLATFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * Imports from the loaded gaussian splatting data and adds them to the scene\r\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene the scene the meshes should be added to\r\n * @param data the gaussian splatting data to load\r\n * @param rootUrl root url to load from\r\n * @param _onProgress callback called while file is loading\r\n * @param _fileName Defines the name of the file to load\r\n * @returns a promise containing the loaded meshes, particles, skeletons and animations\r\n */\r\n public async importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n _onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n _fileName?: string\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n const lodStream = this._tryCreateLODStream(scene, data, rootUrl);\r\n if (lodStream) {\r\n return {\r\n meshes: [lodStream],\r\n particleSystems: [],\r\n skeletons: [],\r\n animationGroups: [],\r\n transformNodes: [],\r\n geometries: [],\r\n lights: [],\r\n spriteManagers: [],\r\n };\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return await this._parseAsync(meshesNames, scene, data, rootUrl).then((meshes) => {\r\n return {\r\n meshes: meshes,\r\n particleSystems: [],\r\n skeletons: [],\r\n animationGroups: [],\r\n transformNodes: [],\r\n geometries: [],\r\n lights: [],\r\n spriteManagers: [],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Detects a PlayCanvas-style `lod-meta.json` payload and, if found, creates a streaming mesh for it.\r\n * @param scene hosting scene\r\n * @param data loaded file data\r\n * @param rootUrl root url the metadata's relative paths resolve against\r\n * @returns the streaming mesh, or null when the data is not SOG LOD metadata\r\n */\r\n private _tryCreateLODStream(scene: Scene, data: any, rootUrl: string): Nullable<GaussianSplattingStream> {\r\n if (typeof data !== \"string\") {\r\n return null;\r\n }\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(data);\r\n } catch {\r\n return null;\r\n }\r\n if (!GaussianSplattingStream.IsLODMetadata(parsed)) {\r\n return null;\r\n }\r\n\r\n const previousBlockEntityCollection = scene._blockEntityCollection;\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n try {\r\n const stream = new GaussianSplattingStream(\"GaussianSplattingStream\", parsed, rootUrl, scene, {\r\n deflateURL: this._loadingOptions.deflateURL,\r\n fflate: this._loadingOptions.fflate,\r\n });\r\n stream._parentContainer = this._assetContainer;\r\n return stream;\r\n } finally {\r\n scene._blockEntityCollection = previousBlockEntityCollection;\r\n }\r\n }\r\n\r\n private static _BuildPointCloud(pointcloud: PointsCloudSystem, data: ArrayBuffer): boolean {\r\n if (!data.byteLength) {\r\n return false;\r\n }\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(data);\r\n\r\n // parsed array contains room for position(3floats), normal(3floats), color (4b), quantized quaternion (4b)\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const vertexCount = uBuffer.length / rowLength;\r\n\r\n const pointcloudfunc = function (particle: any, i: number) {\r\n const x = fBuffer[8 * i + 0];\r\n const y = fBuffer[8 * i + 1];\r\n const z = fBuffer[8 * i + 2];\r\n particle.position = new Vector3(x, y, z);\r\n\r\n const r = uBuffer[rowLength * i + 24 + 0] / 255;\r\n const g = uBuffer[rowLength * i + 24 + 1] / 255;\r\n const b = uBuffer[rowLength * i + 24 + 2] / 255;\r\n particle.color = new Color4(r, g, b, 1);\r\n };\r\n\r\n pointcloud.addPoints(vertexCount, pointcloudfunc);\r\n return true;\r\n }\r\n\r\n private static _BuildMesh(scene: Scene, parsedPLY: IParsedSplat): Mesh {\r\n const mesh = new Mesh(\"PLYMesh\", scene);\r\n\r\n const uBuffer = new Uint8Array(parsedPLY.data);\r\n const fBuffer = new Float32Array(parsedPLY.data);\r\n\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const vertexCount = uBuffer.length / rowLength;\r\n\r\n const positions = [];\r\n\r\n const vertexData = new VertexData();\r\n for (let i = 0; i < vertexCount; i++) {\r\n const x = fBuffer[8 * i + 0];\r\n const y = fBuffer[8 * i + 1];\r\n const z = fBuffer[8 * i + 2];\r\n positions.push(x, y, z);\r\n }\r\n\r\n if (parsedPLY.hasVertexColors) {\r\n const colors = new Float32Array(vertexCount * 4);\r\n for (let i = 0; i < vertexCount; i++) {\r\n const r = uBuffer[rowLength * i + 24 + 0] / 255;\r\n const g = uBuffer[rowLength * i + 24 + 1] / 255;\r\n const b = uBuffer[rowLength * i + 24 + 2] / 255;\r\n colors[i * 4 + 0] = r;\r\n colors[i * 4 + 1] = g;\r\n colors[i * 4 + 2] = b;\r\n colors[i * 4 + 3] = 1;\r\n }\r\n vertexData.colors = colors;\r\n }\r\n\r\n vertexData.positions = positions;\r\n vertexData.indices = parsedPLY.faces!;\r\n\r\n vertexData.applyToMesh(mesh);\r\n return mesh;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax, @typescript-eslint/naming-convention\r\n private async _unzipWithFFlateAsync(data: Uint8Array): Promise<Map<string, Uint8Array>> {\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n let fflate = this._loadingOptions.fflate as typeof import(\"fflate\");\r\n // ensure fflate is loaded\r\n if (!fflate) {\r\n if (typeof (window as any).fflate === \"undefined\") {\r\n await Tools.LoadScriptAsync(this._loadingOptions.deflateURL ?? \"https://unpkg.com/fflate/umd/index.js\");\r\n }\r\n fflate = (window as any).fflate as typeof fflate;\r\n }\r\n\r\n const { unzipSync } = fflate;\r\n\r\n const unzipped = unzipSync(data) as Record<string, Uint8Array>; // { [filename: string]: Uint8Array }\r\n\r\n const files = new Map<string, Uint8Array>();\r\n for (const [name, content] of Object.entries(unzipped)) {\r\n files.set(name, content);\r\n }\r\n return files;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _parseAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string): Promise<Array<AbstractMesh>> {\r\n const babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\r\n\r\n const makeGSFromParsedSOG = (parsedSOG: IParsedSplat) => {\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n const gaussianSplatting =\r\n this._loadingOptions.gaussianSplattingMesh ??\r\n new GaussianSplattingMesh(\"GaussianSplatting\", null, scene, this._loadingOptions.keepInRam, this._loadingOptions.needsRotationScaleTextures);\r\n gaussianSplatting._parentContainer = this._assetContainer;\r\n babylonMeshesArray.push(gaussianSplatting);\r\n if (parsedSOG.sogTextures) {\r\n gaussianSplatting.setSogTextureData(parsedSOG.sogTextures);\r\n } else {\r\n gaussianSplatting.updateData(parsedSOG.data, parsedSOG.sh, { flipY: false }, undefined, parsedSOG.shDegree);\r\n }\r\n gaussianSplatting.scaling.y *= -1;\r\n gaussianSplatting.computeWorldMatrix(true);\r\n scene._blockEntityCollection = false;\r\n };\r\n\r\n const engine = scene.getEngine();\r\n let useSogTextures = this._loadingOptions.useSogTextures;\r\n if (useSogTextures && !engine.isWebGPU && engine.version < 2) {\r\n Logger.Warn(\"SPLATFileLoader: useSogTextures requires WebGL2 or WebGPU. Falling back to CPU path.\");\r\n useSogTextures = false;\r\n }\r\n const sogParser = useSogTextures ? ParseSogMetaAsTextures : ParseSogMeta;\r\n\r\n // check if data is json string\r\n if (typeof data === \"string\") {\r\n const dataSOG = JSON.parse(data) as SOGRootData;\r\n if (dataSOG && dataSOG.means && dataSOG.scales && dataSOG.quats && dataSOG.sh0) {\r\n return new Promise((resolve, reject) => {\r\n sogParser(dataSOG, rootUrl, scene)\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n .then((parsedSOG) => {\r\n makeGSFromParsedSOG(parsedSOG);\r\n resolve(babylonMeshesArray);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((e) => {\r\n reject(new Error(\"Failed to parse SOG data.\", { cause: e }));\r\n });\r\n });\r\n }\r\n }\r\n\r\n const u8 = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\r\n // ZIP signature check for SOG\r\n if (u8[0] === 0x50 && u8[1] === 0x4b) {\r\n return new Promise((resolve, reject) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this._unzipWithFFlateAsync(u8).then((files) => {\r\n sogParser(files, rootUrl, scene)\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n .then((parsedSOG) => {\r\n makeGSFromParsedSOG(parsedSOG);\r\n resolve(babylonMeshesArray);\r\n }) // eslint-disable-next-line github/no-then\r\n .catch((e) => {\r\n reject(new Error(\"Failed to parse SOG zip data.\", { cause: e }));\r\n });\r\n });\r\n });\r\n }\r\n\r\n const handlePLY = (resolve: (value: AbstractMesh[]) => void) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SPLATFileLoader._ConvertPLYToSplat(data as ArrayBuffer).then(async (parsedPLY) => {\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n switch (parsedPLY.mode) {\r\n case Mode.Splat:\r\n {\r\n const gaussianSplatting =\r\n this._loadingOptions.gaussianSplattingMesh ??\r\n new GaussianSplattingMesh(\"GaussianSplatting\", null, scene, this._loadingOptions.keepInRam, this._loadingOptions.needsRotationScaleTextures);\r\n gaussianSplatting._parentContainer = this._assetContainer;\r\n babylonMeshesArray.push(gaussianSplatting);\r\n gaussianSplatting.updateData(parsedPLY.data, parsedPLY.sh, { flipY: false }, undefined, parsedPLY.shDegree);\r\n gaussianSplatting.scaling.y *= -1.0;\r\n\r\n if (parsedPLY.chirality === \"RightHanded\") {\r\n gaussianSplatting.scaling.y *= -1.0;\r\n }\r\n\r\n switch (parsedPLY.upAxis) {\r\n case \"X\":\r\n gaussianSplatting.rotation = new Vector3(0, 0, Math.PI / 2);\r\n break;\r\n case \"Y\":\r\n gaussianSplatting.rotation = new Vector3(0, 0, Math.PI);\r\n break;\r\n case \"Z\":\r\n gaussianSplatting.rotation = new Vector3(-Math.PI / 2, Math.PI, 0);\r\n break;\r\n }\r\n gaussianSplatting.computeWorldMatrix(true);\r\n }\r\n break;\r\n case Mode.PointCloud:\r\n {\r\n const pointcloud = new PointsCloudSystem(\"PointCloud\", 1, scene);\r\n if (SPLATFileLoader._BuildPointCloud(pointcloud, parsedPLY.data)) {\r\n // eslint-disable-next-line github/no-then\r\n await pointcloud.buildMeshAsync().then((mesh) => {\r\n babylonMeshesArray.push(mesh);\r\n });\r\n } else {\r\n pointcloud.dispose();\r\n }\r\n }\r\n break;\r\n case Mode.Mesh:\r\n {\r\n if (parsedPLY.faces) {\r\n babylonMeshesArray.push(SPLATFileLoader._BuildMesh(scene, parsedPLY));\r\n } else {\r\n throw new Error(\"PLY mesh doesn't contain face informations.\");\r\n }\r\n }\r\n break;\r\n default:\r\n throw new Error(\"Unsupported Splat mode\");\r\n }\r\n scene._blockEntityCollection = false;\r\n this.applyAutoCameraLimits(parsedPLY, scene);\r\n resolve(babylonMeshesArray);\r\n });\r\n };\r\n\r\n // Check for gzip (before SPZ V4) and NGSP (SPZ V4+) magic bytes to detect SPZ format\r\n const isGZipped = u8[0] === 0x1f && u8[1] === 0x8b;\r\n const isNGSP = u8[0] === 0x4e && u8[1] === 0x47 && u8[2] === 0x53 && u8[3] === 0x50;\r\n if (!isGZipped && !isNGSP) {\r\n return new Promise((resolve) => {\r\n handlePLY(resolve);\r\n });\r\n }\r\n\r\n const applyParsedSPZ = (parsedSPZ: IParsedSplat, resolve: (meshes: typeof babylonMeshesArray) => void) => {\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n const gaussianSplatting =\r\n this._loadingOptions.gaussianSplattingMesh ??\r\n new GaussianSplattingMesh(\"GaussianSplatting\", null, scene, this._loadingOptions.keepInRam, this._loadingOptions.needsRotationScaleTextures);\r\n if (parsedSPZ.trainedWithAntialiasing) {\r\n const gsMaterial = gaussianSplatting.material as GaussianSplattingMaterial;\r\n gsMaterial.kernelSize = 0.1;\r\n gsMaterial.compensation = true;\r\n }\r\n gaussianSplatting._parentContainer = this._assetContainer;\r\n babylonMeshesArray.push(gaussianSplatting);\r\n gaussianSplatting.updateData(parsedSPZ.data, parsedSPZ.sh, { flipY: false }, undefined, parsedSPZ.shDegree);\r\n if (!this._loadingOptions.flipY) {\r\n gaussianSplatting.scaling.y *= -1.0;\r\n gaussianSplatting.computeWorldMatrix(true);\r\n }\r\n scene._blockEntityCollection = false;\r\n this.applyAutoCameraLimits(parsedSPZ, scene);\r\n resolve(babylonMeshesArray);\r\n };\r\n\r\n if (this._loadingOptions.spzLibraryUrl) {\r\n // WASM path: load spz module from URL, pass raw gzip data directly\r\n // eslint-disable-next-line github/no-then\r\n return GetSpzModule(this._loadingOptions.spzLibraryUrl).then((spz) => {\r\n const cloud = spz.loadSpzFromBuffer(new Uint8Array(data), { to: spz.CoordinateSystem.RUB });\r\n // eslint-disable-next-line github/no-then\r\n return ConvertSpzToSplatAsync(cloud, scene).then((parsedSPZ) => {\r\n return new Promise<AbstractMesh[]>((resolve) => {\r\n applyParsedSPZ(parsedSPZ, resolve);\r\n });\r\n });\r\n });\r\n }\r\n\r\n // NGSP (SPZ V4+) requires WASM — the native fallback only handles legacy gzip formats\r\n if (isNGSP) {\r\n return Promise.reject(\r\n new Error(\r\n \"SPZ V4+ files (NGSP format) are not supported by the native fallback loader. \" +\r\n \"Please provide a valid 'spzLibraryUrl' in the loading options to use the WASM-based SPZ library, \" +\r\n \"or ensure WebAssembly is available in your environment.\"\r\n )\r\n );\r\n }\r\n\r\n // Manual path: decompress gzip, then parse with the built-in SPZ parser\r\n const readableStream = new ReadableStream({\r\n start(controller) {\r\n controller.enqueue(new Uint8Array(data));\r\n controller.close();\r\n },\r\n });\r\n const decompressionStream = new DecompressionStream(\"gzip\");\r\n const decompressedStream = readableStream.pipeThrough(decompressionStream);\r\n\r\n return new Promise((resolve) => {\r\n new Response(decompressedStream)\r\n .arrayBuffer()\r\n // eslint-disable-next-line github/no-then\r\n .then((buffer) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n ParseSpz(buffer, scene, this._loadingOptions).then((parsedSPZ) => {\r\n applyParsedSPZ(parsedSPZ, resolve);\r\n });\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(() => {\r\n handlePLY(resolve);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Applies camera limits based on parsed meta data\r\n * @param meta parsed splat meta data\r\n * @param scene\r\n */\r\n private applyAutoCameraLimits(meta: IParsedSplat, scene: Scene): void {\r\n if (this._loadingOptions.disableAutoCameraLimits) {\r\n return;\r\n }\r\n if ((meta.safeOrbitCameraRadiusMin !== undefined || meta.safeOrbitCameraElevationMinMax !== undefined) && scene.activeCamera?.getClassName() === \"ArcRotateCamera\") {\r\n const arcCam = scene.activeCamera as ArcRotateCamera;\r\n if (meta.safeOrbitCameraElevationMinMax) {\r\n arcCam.lowerBetaLimit = Math.PI * 0.5 - meta.safeOrbitCameraElevationMinMax[1];\r\n arcCam.upperBetaLimit = Math.PI * 0.5 - meta.safeOrbitCameraElevationMinMax[0];\r\n }\r\n\r\n if (meta.safeOrbitCameraRadiusMin) {\r\n arcCam.lowerRadiusLimit = meta.safeOrbitCameraRadiusMin;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @returns The loaded asset container\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string): Promise<AssetContainer> {\r\n const container = new AssetContainer(scene);\r\n this._assetContainer = container;\r\n\r\n return (\r\n this.importMeshAsync(null, scene, data, rootUrl)\r\n // eslint-disable-next-line github/no-then\r\n .then((result) => {\r\n for (const mesh of result.meshes) {\r\n container.meshes.push(mesh);\r\n }\r\n // mesh material will be null before 1st rendered frame.\r\n this._assetContainer = null;\r\n return container;\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((ex) => {\r\n this._assetContainer = null;\r\n throw ex;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Imports all objects from the loaded OBJ data and adds them to the scene\r\n * @param scene the scene the objects should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise which completes when objects have been loaded to the scene\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public loadAsync(scene: Scene, data: string, rootUrl: string): Promise<void> {\r\n //Get the 3D model\r\n // eslint-disable-next-line github/no-then\r\n return this.importMeshAsync(null, scene, data, rootUrl).then(() => {\r\n // return void\r\n });\r\n }\r\n\r\n /**\r\n * Code from https://github.com/dylanebert/gsplat.js/blob/main/src/loaders/PLYLoader.ts Under MIT license\r\n * Converts a .ply data array buffer to splat\r\n * if data array buffer is not ply, returns the original buffer\r\n * @param data the .ply data to load\r\n * @returns the loaded splat buffer\r\n */\r\n private static _ConvertPLYToSplat(data: ArrayBuffer): Promise<IParsedSplat> {\r\n const ubuf = new Uint8Array(data);\r\n const header = new TextDecoder().decode(ubuf.slice(0, 1024 * 10));\r\n const headerEnd = \"end_header\\n\";\r\n const headerEndIndex = header.indexOf(headerEnd);\r\n if (headerEndIndex < 0 || !header) {\r\n // standard splat\r\n return new Promise((resolve) => {\r\n resolve({ mode: Mode.Splat, data: data, rawSplat: true });\r\n });\r\n }\r\n\r\n const vertexCount = parseInt(/element vertex (\\d+)\\n/.exec(header)![1]);\r\n const faceElement = /element face (\\d+)\\n/.exec(header);\r\n let faceCount = 0;\r\n if (faceElement) {\r\n faceCount = parseInt(faceElement[1]);\r\n }\r\n const chunkElement = /element chunk (\\d+)\\n/.exec(header);\r\n let chunkCount = 0;\r\n if (chunkElement) {\r\n chunkCount = parseInt(chunkElement[1]);\r\n }\r\n\r\n let rowVertexOffset = 0;\r\n let rowChunkOffset = 0;\r\n const offsets: Record<string, number> = {\r\n double: 8,\r\n int: 4,\r\n uint: 4,\r\n float: 4,\r\n short: 2,\r\n ushort: 2,\r\n uchar: 1,\r\n list: 0,\r\n };\r\n\r\n type PlyProperty = {\r\n name: string;\r\n type: string;\r\n offset: number;\r\n };\r\n\r\n const ElementMode: Record<string, number> = {\r\n Vertex: 0,\r\n Chunk: 1,\r\n SH: 2,\r\n Float_Tuple: 3,\r\n Float: 4,\r\n Uchar: 5,\r\n };\r\n\r\n let chunkMode = ElementMode.Chunk;\r\n const vertexProperties: PlyProperty[] = [];\r\n const chunkProperties: PlyProperty[] = [];\r\n const filtered = header.slice(0, headerEndIndex).split(\"\\n\");\r\n const metaData: Partial<IParsedSplat> = {};\r\n for (const prop of filtered) {\r\n if (prop.startsWith(\"property \")) {\r\n const [, type, name] = prop.split(\" \");\r\n\r\n if (chunkMode == ElementMode.Chunk) {\r\n chunkProperties.push({ name, type, offset: rowChunkOffset });\r\n rowChunkOffset += offsets[type];\r\n } else if (chunkMode == ElementMode.Vertex) {\r\n vertexProperties.push({ name, type, offset: rowVertexOffset });\r\n rowVertexOffset += offsets[type];\r\n } else if (chunkMode == ElementMode.SH) {\r\n vertexProperties.push({ name, type, offset: rowVertexOffset });\r\n } else if (chunkMode == ElementMode.Float_Tuple) {\r\n const view = new DataView(data, rowChunkOffset, offsets.float * 2);\r\n metaData.safeOrbitCameraElevationMinMax = [view.getFloat32(0, true), view.getFloat32(4, true)];\r\n } else if (chunkMode == ElementMode.Float) {\r\n const view = new DataView(data, rowChunkOffset, offsets.float);\r\n metaData.safeOrbitCameraRadiusMin = view.getFloat32(0, true);\r\n } else if (chunkMode == ElementMode.Uchar) {\r\n const view = new DataView(data, rowChunkOffset, offsets.uchar);\r\n if (name == \"up_axis\") {\r\n metaData.upAxis = view.getUint8(0) == 0 ? \"X\" : view.getUint8(0) == 1 ? \"Y\" : \"Z\";\r\n } else if (name == \"chirality\") {\r\n metaData.chirality = view.getUint8(0) == 0 ? \"LeftHanded\" : \"RightHanded\";\r\n }\r\n }\r\n\r\n if (!offsets[type]) {\r\n Logger.Warn(`Unsupported property type: ${type}.`);\r\n }\r\n } else if (prop.startsWith(\"element \")) {\r\n const [, type] = prop.split(\" \");\r\n if (type == \"chunk\") {\r\n chunkMode = ElementMode.Chunk;\r\n } else if (type == \"vertex\") {\r\n chunkMode = ElementMode.Vertex;\r\n } else if (type == \"sh\") {\r\n chunkMode = ElementMode.SH;\r\n } else if (type == \"safe_orbit_camera_elevation_min_max_radians\") {\r\n chunkMode = ElementMode.Float_Tuple;\r\n } else if (type == \"safe_orbit_camera_radius_min\") {\r\n chunkMode = ElementMode.Float;\r\n } else if (type == \"up_axis\" || type == \"chirality\") {\r\n chunkMode = ElementMode.Uchar;\r\n }\r\n }\r\n }\r\n\r\n const rowVertexLength = rowVertexOffset;\r\n const rowChunkLength = rowChunkOffset;\r\n\r\n // eslint-disable-next-line github/no-then\r\n return (GaussianSplattingMesh.ConvertPLYWithSHToSplatAsync(data) as any).then(async (splatsData: any) => {\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n let offset = rowChunkLength * chunkCount + rowVertexLength * vertexCount;\r\n // faces\r\n const faces: number[] = [];\r\n if (faceCount) {\r\n for (let i = 0; i < faceCount; i++) {\r\n const faceVertexCount = dataView.getUint8(offset);\r\n if (faceVertexCount != 3) {\r\n continue; // only support triangles\r\n }\r\n offset += 1;\r\n\r\n for (let j = 0; j < faceVertexCount; j++) {\r\n const vertexIndex = dataView.getUint32(offset + (2 - j) * 4, true); // change face winding\r\n faces.push(vertexIndex);\r\n }\r\n offset += 12;\r\n }\r\n }\r\n\r\n // early exit for chunked/quantized ply\r\n if (chunkCount) {\r\n return await new Promise((resolve) => {\r\n resolve({\r\n mode: Mode.Splat,\r\n data: splatsData.buffer,\r\n sh: splatsData.sh,\r\n shDegree: splatsData.shDegree,\r\n faces: faces,\r\n hasVertexColors: false,\r\n compressed: true,\r\n rawSplat: false,\r\n });\r\n });\r\n }\r\n // count available properties. if all necessary are present then it's a splat. Otherwise, it's a point cloud\r\n // if faces are found, then it's a standard mesh\r\n let propertyCount = 0;\r\n let propertyColorCount = 0;\r\n const splatProperties = [\"x\", \"y\", \"z\", \"scale_0\", \"scale_1\", \"scale_2\", \"opacity\", \"rot_0\", \"rot_1\", \"rot_2\", \"rot_3\"];\r\n const splatColorProperties = [\"red\", \"green\", \"blue\", \"f_dc_0\", \"f_dc_1\", \"f_dc_2\"];\r\n for (let propertyIndex = 0; propertyIndex < vertexProperties.length; propertyIndex++) {\r\n const property = vertexProperties[propertyIndex];\r\n if (splatProperties.includes(property.name)) {\r\n propertyCount++;\r\n }\r\n if (splatColorProperties.includes(property.name)) {\r\n propertyColorCount++;\r\n }\r\n }\r\n const hasMandatoryProperties = propertyCount == splatProperties.length && propertyColorCount == 3;\r\n const currentMode = faceCount ? Mode.Mesh : hasMandatoryProperties ? Mode.Splat : Mode.PointCloud;\r\n // parsed ready ready to be used as a splat\r\n return await new Promise((resolve) => {\r\n resolve({\r\n ...metaData,\r\n mode: currentMode,\r\n data: splatsData.buffer,\r\n sh: splatsData.sh,\r\n shDegree: splatsData.shDegree,\r\n faces: faces,\r\n hasVertexColors: !!propertyColorCount,\r\n compressed: false,\r\n rawSplat: false,\r\n });\r\n });\r\n });\r\n }\r\n}\r\n\r\n// Add this loader into the register plugin\r\nRegisterSceneLoaderPlugin(new SPLATFileLoader());\r\n"]}