@babylonjs/core 8.48.0 → 8.48.1

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 (80) hide show
  1. package/Audio/analyser.js.map +1 -1
  2. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js.map +1 -1
  3. package/Buffers/buffer.align.js +3 -3
  4. package/Buffers/buffer.align.js.map +1 -1
  5. package/Buffers/bufferUtils.d.ts +7 -0
  6. package/Buffers/bufferUtils.js +31 -13
  7. package/Buffers/bufferUtils.js.map +1 -1
  8. package/Engines/Extensions/engine.dynamicBuffer.js +3 -3
  9. package/Engines/Extensions/engine.dynamicBuffer.js.map +1 -1
  10. package/Engines/Native/nativeDataStream.d.ts +1 -1
  11. package/Engines/Native/nativeDataStream.js.map +1 -1
  12. package/Engines/Native/nativeInterfaces.d.ts +4 -4
  13. package/Engines/Native/nativeInterfaces.js.map +1 -1
  14. package/Engines/WebGPU/Extensions/engine.rawTexture.d.ts +13 -1
  15. package/Engines/WebGPU/Extensions/engine.rawTexture.js +26 -8
  16. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  17. package/Engines/WebGPU/webgpuTextureManager.d.ts +2 -1
  18. package/Engines/WebGPU/webgpuTextureManager.js +19 -6
  19. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  20. package/Engines/abstractEngine.d.ts +4 -2
  21. package/Engines/abstractEngine.functions.d.ts +1 -1
  22. package/Engines/abstractEngine.functions.js +8 -8
  23. package/Engines/abstractEngine.functions.js.map +1 -1
  24. package/Engines/abstractEngine.js +6 -4
  25. package/Engines/abstractEngine.js.map +1 -1
  26. package/Engines/engine.d.ts +12 -0
  27. package/Engines/thinNativeEngine.js +1 -1
  28. package/Engines/thinNativeEngine.js.map +1 -1
  29. package/Engines/thinWebGPUEngine.js +3 -0
  30. package/Engines/thinWebGPUEngine.js.map +1 -1
  31. package/Engines/webgpuEngine.js +18 -18
  32. package/Engines/webgpuEngine.js.map +1 -1
  33. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  34. package/Materials/Background/backgroundMaterial.d.ts +16 -8
  35. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +14 -1
  36. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  37. package/Materials/Node/nodeMaterial.d.ts +16 -8
  38. package/Materials/PBR/openpbrMaterial.d.ts +16 -8
  39. package/Materials/PBR/pbrBaseMaterial.d.ts +16 -8
  40. package/Materials/Textures/Loaders/EXR/exrLoader.compression.rle.d.ts +1 -1
  41. package/Materials/Textures/Loaders/EXR/exrLoader.compression.rle.js.map +1 -1
  42. package/Materials/Textures/Loaders/EXR/exrLoader.core.d.ts +1 -1
  43. package/Materials/Textures/Loaders/EXR/exrLoader.core.js.map +1 -1
  44. package/Materials/Textures/internalTexture.d.ts +6 -0
  45. package/Materials/Textures/internalTexture.js +24 -2
  46. package/Materials/Textures/internalTexture.js.map +1 -1
  47. package/Materials/Textures/rawTexture.d.ts +8 -1
  48. package/Materials/Textures/rawTexture.js +12 -3
  49. package/Materials/Textures/rawTexture.js.map +1 -1
  50. package/Materials/Textures/rawTexture2DArray.d.ts +8 -1
  51. package/Materials/Textures/rawTexture2DArray.js +14 -3
  52. package/Materials/Textures/rawTexture2DArray.js.map +1 -1
  53. package/Materials/imageProcessing.d.ts +47 -8
  54. package/Materials/standardMaterial.d.ts +16 -8
  55. package/Meshes/Builders/shapeBuilder.d.ts +4 -0
  56. package/Meshes/Builders/shapeBuilder.js +12 -9
  57. package/Meshes/Builders/shapeBuilder.js.map +1 -1
  58. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +68 -4
  59. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +343 -26
  60. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  61. package/Misc/dds.js.map +1 -1
  62. package/Misc/environmentTextureTools.js +3 -1
  63. package/Misc/environmentTextureTools.js.map +1 -1
  64. package/Misc/fileTools.js +9 -1
  65. package/Misc/fileTools.js.map +1 -1
  66. package/Physics/v1/physicsImpostor.d.ts +2 -2
  67. package/Physics/v1/physicsImpostor.js.map +1 -1
  68. package/Shaders/ShadersInclude/gaussianSplatting.js +16 -3
  69. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  70. package/Shaders/gaussianSplatting.vertex.js +17 -4
  71. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  72. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +11 -1
  73. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  74. package/ShadersWGSL/gaussianSplatting.vertex.js +17 -4
  75. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  76. package/XR/native/nativeXRFrame.d.ts +1 -1
  77. package/XR/native/nativeXRFrame.js.map +1 -1
  78. package/package.json +1 -1
  79. package/types.d.ts +1 -1
  80. package/types.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingMesh.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { SubMesh } from \"../subMesh\";\r\nimport type { AbstractMesh } from \"../abstractMesh\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Quaternion } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport \"core/Meshes/thinInstanceMesh\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { ToHalfFloat } from \"core/Misc/textureTools\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { runCoroutineSync, runCoroutineAsync, createYieldingScheduler, type Coroutine } from \"core/Misc/coroutine\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { ImportMeshAsync } from \"core/Loading/sceneLoader\";\r\nimport type { INative } from \"core/Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\ninterface IDelayedTextureUpdate {\r\n covA: Uint16Array;\r\n covB: Uint16Array;\r\n colors: Uint8Array;\r\n centers: Float32Array;\r\n sh?: Uint8Array[];\r\n}\r\ninterface IUpdateOptions {\r\n flipY?: boolean;\r\n}\r\n\r\n// @internal\r\nconst UnpackUnorm = (value: number, bits: number) => {\r\n const t = (1 << bits) - 1;\r\n return (value & t) / t;\r\n};\r\n\r\n// @internal\r\nconst Unpack111011 = (value: number, result: Vector3) => {\r\n result.x = UnpackUnorm(value >>> 21, 11);\r\n result.y = UnpackUnorm(value >>> 11, 10);\r\n result.z = UnpackUnorm(value, 11);\r\n};\r\n\r\n// @internal\r\nconst Unpack8888 = (value: number, result: Uint8ClampedArray) => {\r\n result[0] = UnpackUnorm(value >>> 24, 8) * 255;\r\n result[1] = UnpackUnorm(value >>> 16, 8) * 255;\r\n result[2] = UnpackUnorm(value >>> 8, 8) * 255;\r\n result[3] = UnpackUnorm(value, 8) * 255;\r\n};\r\n\r\n// @internal\r\n// unpack quaternion with 2,10,10,10 format (largest element, 3x10bit element)\r\nconst UnpackRot = (value: number, result: Quaternion) => {\r\n const norm = 1.0 / (Math.sqrt(2) * 0.5);\r\n const a = (UnpackUnorm(value >>> 20, 10) - 0.5) * norm;\r\n const b = (UnpackUnorm(value >>> 10, 10) - 0.5) * norm;\r\n const c = (UnpackUnorm(value, 10) - 0.5) * norm;\r\n const m = Math.sqrt(1.0 - (a * a + b * b + c * c));\r\n\r\n switch (value >>> 30) {\r\n case 0:\r\n result.set(m, a, b, c);\r\n break;\r\n case 1:\r\n result.set(a, m, b, c);\r\n break;\r\n case 2:\r\n result.set(a, b, m, c);\r\n break;\r\n case 3:\r\n result.set(a, b, c, m);\r\n break;\r\n }\r\n};\r\n\r\ninterface ICompressedPLYChunk {\r\n min: Vector3;\r\n max: Vector3;\r\n minScale: Vector3;\r\n maxScale: Vector3;\r\n minColor: Vector3;\r\n maxColor: Vector3;\r\n}\r\n\r\n/**\r\n * To support multiple camera rendering, rendered mesh is separated from the GaussianSplattingMesh itself.\r\n * The GS mesh serves as a proxy and a different mesh is rendered for each camera. This hot switch is done\r\n * in the render() function. Each camera has a corresponding ICameraViewInfo object. The key is the camera unique id.\r\n * ICameraViewInfo and the rendered mesh are created in method `_postToWorker`\r\n * Mesh are disabled to not let the scene render them directly.\r\n * ICameraViewInfo are sorted per last frame id update to prioritize the less recently updated ones.\r\n * There is 1 web worker per GaussianSplattingMesh to avoid too many copies between main thread and workers.\r\n * So, only one sort is being done at a time per GaussianSplattingMesh. If multiple cameras need an update,\r\n * they will be processed one by one in subsequent frames.\r\n */\r\ninterface ICameraViewInfo {\r\n camera: Camera;\r\n cameraDirection: Vector3;\r\n mesh: Mesh;\r\n frameIdLastUpdate: number;\r\n splatIndexBufferSet: boolean;\r\n}\r\n/**\r\n * Representation of the types\r\n */\r\nconst enum PLYType {\r\n FLOAT,\r\n INT,\r\n UINT,\r\n DOUBLE,\r\n UCHAR,\r\n UNDEFINED,\r\n}\r\n\r\n/**\r\n * Usage types of the PLY values\r\n */\r\nconst enum PLYValue {\r\n MIN_X,\r\n MIN_Y,\r\n MIN_Z,\r\n MAX_X,\r\n MAX_Y,\r\n MAX_Z,\r\n\r\n MIN_SCALE_X,\r\n MIN_SCALE_Y,\r\n MIN_SCALE_Z,\r\n\r\n MAX_SCALE_X,\r\n MAX_SCALE_Y,\r\n MAX_SCALE_Z,\r\n\r\n PACKED_POSITION,\r\n PACKED_ROTATION,\r\n PACKED_SCALE,\r\n PACKED_COLOR,\r\n X,\r\n Y,\r\n Z,\r\n SCALE_0,\r\n SCALE_1,\r\n SCALE_2,\r\n\r\n DIFFUSE_RED,\r\n DIFFUSE_GREEN,\r\n DIFFUSE_BLUE,\r\n OPACITY,\r\n\r\n F_DC_0,\r\n F_DC_1,\r\n F_DC_2,\r\n F_DC_3,\r\n\r\n ROT_0,\r\n ROT_1,\r\n ROT_2,\r\n ROT_3,\r\n\r\n MIN_COLOR_R,\r\n MIN_COLOR_G,\r\n MIN_COLOR_B,\r\n\r\n MAX_COLOR_R,\r\n MAX_COLOR_G,\r\n MAX_COLOR_B,\r\n\r\n SH_0,\r\n SH_1,\r\n SH_2,\r\n SH_3,\r\n SH_4,\r\n SH_5,\r\n SH_6,\r\n SH_7,\r\n SH_8,\r\n SH_9,\r\n SH_10,\r\n SH_11,\r\n SH_12,\r\n SH_13,\r\n SH_14,\r\n SH_15,\r\n SH_16,\r\n SH_17,\r\n SH_18,\r\n SH_19,\r\n SH_20,\r\n SH_21,\r\n SH_22,\r\n SH_23,\r\n SH_24,\r\n SH_25,\r\n SH_26,\r\n SH_27,\r\n SH_28,\r\n SH_29,\r\n SH_30,\r\n SH_31,\r\n SH_32,\r\n SH_33,\r\n SH_34,\r\n SH_35,\r\n SH_36,\r\n SH_37,\r\n SH_38,\r\n SH_39,\r\n SH_40,\r\n SH_41,\r\n SH_42,\r\n SH_43,\r\n SH_44,\r\n\r\n UNDEFINED,\r\n}\r\n\r\n/**\r\n * Property field found in PLY header\r\n */\r\nexport type PlyProperty = {\r\n /**\r\n * Value usage\r\n */\r\n value: PLYValue;\r\n /**\r\n * Value type\r\n */\r\n type: PLYType;\r\n /**\r\n * offset in byte from te beginning of the splat\r\n */\r\n offset: number;\r\n};\r\n\r\n/**\r\n * meta info on Splat file\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface PLYHeader {\r\n /**\r\n * number of splats\r\n */\r\n vertexCount: number;\r\n /**\r\n * number of spatial chunks for compressed ply\r\n */\r\n chunkCount: number;\r\n /**\r\n * length in bytes of the vertex info\r\n */\r\n rowVertexLength: number;\r\n /**\r\n * length in bytes of the chunk\r\n */\r\n rowChunkLength: number;\r\n /**\r\n * array listing properties per vertex\r\n */\r\n vertexProperties: PlyProperty[];\r\n /**\r\n * array listing properties per chunk\r\n */\r\n chunkProperties: PlyProperty[];\r\n /**\r\n * data view for parsing chunks and vertices\r\n */\r\n dataView: DataView;\r\n /**\r\n * buffer for the data view\r\n */\r\n buffer: ArrayBuffer;\r\n /**\r\n * degree of SH coefficients\r\n */\r\n shDegree: number;\r\n /**\r\n * number of coefficient per splat\r\n */\r\n shCoefficientCount: number;\r\n /**\r\n * buffer for SH coefficients\r\n */\r\n shBuffer: ArrayBuffer | null;\r\n}\r\n/**\r\n * Class used to render a gaussian splatting mesh\r\n */\r\nexport class GaussianSplattingMesh extends Mesh {\r\n private _vertexCount = 0;\r\n private _worker: Nullable<Worker> = null;\r\n private _modelViewProjectionMatrix = Matrix.Identity();\r\n private _depthMix: BigInt64Array;\r\n private _canPostToWorker = true;\r\n private _readyToDisplay = false;\r\n private _covariancesATexture: Nullable<BaseTexture> = null;\r\n private _covariancesBTexture: Nullable<BaseTexture> = null;\r\n private _centersTexture: Nullable<BaseTexture> = null;\r\n private _colorsTexture: Nullable<BaseTexture> = null;\r\n private _splatPositions: Nullable<Float32Array> = null;\r\n private _splatIndex: Nullable<Float32Array> = null;\r\n private _shTextures: Nullable<BaseTexture[]> = null;\r\n private _splatsData: Nullable<ArrayBuffer> = null;\r\n private readonly _keepInRam: boolean = false;\r\n\r\n private _delayedTextureUpdate: Nullable<IDelayedTextureUpdate> = null;\r\n private _useRGBACovariants = false;\r\n private _material: Nullable<Material> = null;\r\n\r\n private _tmpCovariances = [0, 0, 0, 0, 0, 0];\r\n private _sortIsDirty = false;\r\n\r\n private static _RowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // Vector3 position, Vector3 scale, 1 u8 quaternion, 1 color with alpha\r\n private static _SH_C0 = 0.28209479177387814;\r\n // batch size between 2 yield calls. This value is a tradeoff between updates overhead and framerate hiccups\r\n // This step is faster the PLY conversion. So batch size can be bigger\r\n private static _SplatBatchSize = 327680;\r\n // batch size between 2 yield calls during the PLY to splat conversion.\r\n private static _PlyConversionBatchSize = 32768;\r\n private _shDegree = 0;\r\n\r\n private static readonly _BatchSize = 16; // 16 splats per instance\r\n private _cameraViewInfos = new Map<number, ICameraViewInfo>();\r\n\r\n private static readonly _DefaultViewUpdateThreshold = 1e-4;\r\n\r\n /**\r\n * Cosine value of the angle threshold to update view dependent splat sorting. Default is 0.0001.\r\n */\r\n public viewUpdateThreshold: number = GaussianSplattingMesh._DefaultViewUpdateThreshold;\r\n\r\n protected _disableDepthSort = false;\r\n /**\r\n * If true, disables depth sorting of the splats (default: false)\r\n */\r\n public get disableDepthSort() {\r\n return this._disableDepthSort;\r\n }\r\n public set disableDepthSort(value: boolean) {\r\n if (!this._disableDepthSort && value) {\r\n this._worker?.terminate();\r\n this._worker = null;\r\n this._disableDepthSort = true;\r\n } else if (this._disableDepthSort && !value) {\r\n this._disableDepthSort = false;\r\n this._sortIsDirty = true;\r\n this._instanciateWorker();\r\n }\r\n }\r\n\r\n /**\r\n * View direction factor used to compute the SH view direction in the shader.\r\n * @deprecated Not used anymore for SH rendering\r\n */\r\n public get viewDirectionFactor() {\r\n return Vector3.OneReadOnly;\r\n }\r\n\r\n /**\r\n * SH degree. 0 = no sh (default). 1 = 3 parameters. 2 = 8 parameters. 3 = 15 parameters.\r\n */\r\n public get shDegree() {\r\n return this._shDegree;\r\n }\r\n\r\n /**\r\n * Number of splats in the mesh\r\n */\r\n public get splatCount() {\r\n return this._splatIndex?.length;\r\n }\r\n\r\n /**\r\n * returns the splats data array buffer that contains in order : postions (3 floats), size (3 floats), color (4 bytes), orientation quaternion (4 bytes)\r\n */\r\n public get splatsData() {\r\n return this._splatsData;\r\n }\r\n\r\n /**\r\n * Set the number of batch (a batch is 16384 splats) after which a display update is performed\r\n * A value of 0 (default) means display update will not happens before splat is ready.\r\n */\r\n public static ProgressiveUpdateAmount = 0;\r\n\r\n /**\r\n * Gets the covariancesA texture\r\n */\r\n public get covariancesATexture() {\r\n return this._covariancesATexture;\r\n }\r\n\r\n /**\r\n * Gets the covariancesB texture\r\n */\r\n public get covariancesBTexture() {\r\n return this._covariancesBTexture;\r\n }\r\n\r\n /**\r\n * Gets the centers texture\r\n */\r\n public get centersTexture() {\r\n return this._centersTexture;\r\n }\r\n\r\n /**\r\n * Gets the colors texture\r\n */\r\n public get colorsTexture() {\r\n return this._colorsTexture;\r\n }\r\n\r\n /**\r\n * Gets the SH textures\r\n */\r\n public get shTextures() {\r\n return this._shTextures;\r\n }\r\n\r\n /**\r\n * Gets the kernel size\r\n * Documentation and mathematical explanations here:\r\n * https://github.com/graphdeco-inria/gaussian-splatting/issues/294#issuecomment-1772688093\r\n * https://github.com/autonomousvision/mip-splatting/issues/18#issuecomment-1929388931\r\n */\r\n public get kernelSize() {\r\n return this._material instanceof GaussianSplattingMaterial ? this._material.kernelSize : 0;\r\n }\r\n\r\n /**\r\n * Get the compensation state\r\n */\r\n public get compensation() {\r\n return this._material instanceof GaussianSplattingMaterial ? this._material.compensation : false;\r\n }\r\n\r\n private _loadingPromise: Promise<void> | null = null;\r\n\r\n /**\r\n * set rendering material\r\n */\r\n public override set material(value: Material) {\r\n this._material = value;\r\n this._material.backFaceCulling = false;\r\n this._material.cullBackFaces = false;\r\n value.resetDrawCache();\r\n }\r\n\r\n /**\r\n * get rendering material\r\n */\r\n public override get material(): Nullable<Material> {\r\n return this._material;\r\n }\r\n\r\n private static _MakeSplatGeometryForMesh(mesh: Mesh): void {\r\n const vertexData = new VertexData();\r\n const originPositions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0];\r\n const originIndices = [0, 1, 2, 0, 2, 3];\r\n const positions = [];\r\n const indices = [];\r\n for (let i = 0; i < GaussianSplattingMesh._BatchSize; i++) {\r\n for (let j = 0; j < 12; j++) {\r\n if (j == 2 || j == 5 || j == 8 || j == 11) {\r\n positions.push(i); // local splat index\r\n } else {\r\n positions.push(originPositions[j]);\r\n }\r\n }\r\n indices.push(originIndices.map((v) => v + i * 4));\r\n }\r\n\r\n vertexData.positions = positions;\r\n vertexData.indices = indices.flat();\r\n\r\n vertexData.applyToMesh(mesh);\r\n }\r\n\r\n /**\r\n * Creates a new gaussian splatting mesh\r\n * @param name defines the name of the mesh\r\n * @param url defines the url to load from (optional)\r\n * @param scene defines the hosting scene (optional)\r\n * @param keepInRam keep datas in ram for editing purpose\r\n */\r\n constructor(name: string, url: Nullable<string> = null, scene: Nullable<Scene> = null, keepInRam: boolean = false) {\r\n super(name, scene);\r\n\r\n this.subMeshes = [];\r\n new SubMesh(0, 0, 4 * GaussianSplattingMesh._BatchSize, 0, 6 * GaussianSplattingMesh._BatchSize, this);\r\n\r\n this.setEnabled(false);\r\n // webGL2 and webGPU support for RG texture with float16 is fine. not webGL1\r\n this._useRGBACovariants = !this.getEngine().isWebGPU && this.getEngine().version === 1.0;\r\n\r\n this._keepInRam = keepInRam;\r\n if (url) {\r\n this._loadingPromise = this.loadFileAsync(url);\r\n }\r\n const gaussianSplattingMaterial = new GaussianSplattingMaterial(this.name + \"_material\", this._scene);\r\n gaussianSplattingMaterial.setSourceMesh(this);\r\n this._material = gaussianSplattingMaterial;\r\n\r\n // delete meshes created for cameras on camera removal\r\n this._scene.onCameraRemovedObservable.add((camera: Camera) => {\r\n const cameraId = camera.uniqueId;\r\n // delete mesh for this camera\r\n if (this._cameraViewInfos.has(cameraId)) {\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n cameraViewInfos?.mesh.dispose();\r\n this._cameraViewInfos.delete(cameraId);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get the loading promise when loading the mesh from a URL in the constructor\r\n * @returns constructor loading promise or null if no URL was provided\r\n */\r\n public getLoadingPromise(): Promise<void> | null {\r\n return this._loadingPromise;\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns \"GaussianSplattingMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMesh\";\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices (splats) within the mesh\r\n * @returns the total number of vertices\r\n */\r\n public override getTotalVertices(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns true when ready\r\n */\r\n public override isReady(completeCheck = false): boolean {\r\n if (!super.isReady(completeCheck, true)) {\r\n return false;\r\n }\r\n\r\n if (!this._readyToDisplay) {\r\n // mesh is ready when worker has done at least 1 sorting\r\n this._postToWorker(true);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public _getCameraDirection(camera: Camera): Vector3 {\r\n const cameraViewMatrix = camera.getViewMatrix();\r\n const cameraProjectionMatrix = camera.getProjectionMatrix();\r\n const cameraViewProjectionMatrix = TmpVectors.Matrix[0];\r\n cameraViewMatrix.multiplyToRef(cameraProjectionMatrix, cameraViewProjectionMatrix);\r\n this.getWorldMatrix().multiplyToRef(cameraViewProjectionMatrix, this._modelViewProjectionMatrix);\r\n\r\n // return vector used to compute distance to camera\r\n const localDirection = TmpVectors.Vector3[1];\r\n localDirection.set(this._modelViewProjectionMatrix.m[8], this._modelViewProjectionMatrix.m[9], this._modelViewProjectionMatrix.m[10]);\r\n localDirection.normalize();\r\n\r\n return localDirection;\r\n }\r\n\r\n /** @internal */\r\n public _postToWorker(forced = false): void {\r\n const scene = this._scene;\r\n const frameId = scene.getFrameId();\r\n // force update or at least frame update for camera is outdated\r\n let outdated = false;\r\n this._cameraViewInfos.forEach((cameraViewInfos) => {\r\n if (cameraViewInfos.frameIdLastUpdate !== frameId) {\r\n outdated = true;\r\n }\r\n });\r\n\r\n // array of cameras used for rendering\r\n const cameras = this._scene.activeCameras?.length ? this._scene.activeCameras : [this._scene.activeCamera!];\r\n // list view infos for active cameras\r\n const activeViewInfos: ICameraViewInfo[] = [];\r\n cameras.forEach((camera) => {\r\n if (!camera) {\r\n return;\r\n }\r\n const cameraId = camera.uniqueId;\r\n\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n if (cameraViewInfos) {\r\n activeViewInfos.push(cameraViewInfos);\r\n } else {\r\n // mesh doesn't exist yet for this camera\r\n const cameraMesh = new Mesh(this.name + \"_cameraMesh_\" + cameraId, this._scene);\r\n // not visible with inspector or the scene graph\r\n cameraMesh.reservedDataStore = { hidden: true };\r\n cameraMesh.setEnabled(false);\r\n cameraMesh.material = this.material;\r\n GaussianSplattingMesh._MakeSplatGeometryForMesh(cameraMesh);\r\n\r\n const newViewInfos: ICameraViewInfo = {\r\n camera: camera,\r\n cameraDirection: new Vector3(0, 0, 0),\r\n mesh: cameraMesh,\r\n frameIdLastUpdate: frameId,\r\n splatIndexBufferSet: false,\r\n };\r\n activeViewInfos.push(newViewInfos);\r\n this._cameraViewInfos.set(cameraId, newViewInfos);\r\n }\r\n });\r\n // sort view infos by last updated frame id: first item is the least recently updated\r\n activeViewInfos.sort((a, b) => a.frameIdLastUpdate - b.frameIdLastUpdate);\r\n\r\n const hasSortFunction = this._worker || (_native && _native.sortSplats) || this._disableDepthSort;\r\n if ((forced || outdated) && hasSortFunction && (this._scene.activeCameras?.length || this._scene.activeCamera) && this._canPostToWorker) {\r\n // view infos sorted by least recent updated frame id\r\n activeViewInfos.forEach((cameraViewInfos) => {\r\n const camera = cameraViewInfos.camera;\r\n const cameraDirection = this._getCameraDirection(camera);\r\n\r\n const previousCameraDirection = cameraViewInfos.cameraDirection;\r\n const dot = Vector3.Dot(cameraDirection, previousCameraDirection);\r\n if ((forced || Math.abs(dot - 1) >= this.viewUpdateThreshold) && this._canPostToWorker) {\r\n cameraViewInfos.cameraDirection.copyFrom(cameraDirection);\r\n cameraViewInfos.frameIdLastUpdate = frameId;\r\n this._canPostToWorker = false;\r\n if (this._worker) {\r\n this._worker!.postMessage(\r\n {\r\n modelViewProjection: this._modelViewProjectionMatrix.m,\r\n depthMix: this._depthMix,\r\n cameraId: camera.uniqueId,\r\n },\r\n [this._depthMix.buffer]\r\n );\r\n } else if (_native && _native.sortSplats) {\r\n _native.sortSplats(this._modelViewProjectionMatrix, this._splatPositions!, this._splatIndex!, this._scene.useRightHandedSystem);\r\n if (cameraViewInfos.splatIndexBufferSet) {\r\n cameraViewInfos.mesh.thinInstanceBufferUpdated(\"splatIndex\");\r\n } else {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n cameraViewInfos.splatIndexBufferSet = true;\r\n }\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n }\r\n }\r\n });\r\n } else if (this._disableDepthSort) {\r\n activeViewInfos.forEach((cameraViewInfos) => {\r\n if (!cameraViewInfos.splatIndexBufferSet) {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n cameraViewInfos.splatIndexBufferSet = true;\r\n }\r\n });\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n }\r\n }\r\n /**\r\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\r\n * @param subMesh defines the subMesh to render\r\n * @param enableAlphaMode defines if alpha mode can be changed\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\r\n * @returns the current mesh\r\n */\r\n public override render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh {\r\n this._postToWorker();\r\n\r\n // geometry used for shadows, bind the first found in the camera view infos\r\n if (!this._geometry && this._cameraViewInfos.size) {\r\n this._geometry = this._cameraViewInfos.values().next().value.mesh.geometry;\r\n }\r\n\r\n const cameraId = this._scene.activeCamera!.uniqueId;\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n if (!cameraViewInfos || !cameraViewInfos.splatIndexBufferSet) {\r\n return this;\r\n }\r\n\r\n const mesh = cameraViewInfos.mesh;\r\n mesh.getWorldMatrix().copyFrom(this.getWorldMatrix());\r\n return mesh.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n\r\n private static _TypeNameToEnum(name: string): PLYType {\r\n switch (name) {\r\n case \"float\":\r\n return PLYType.FLOAT;\r\n case \"int\":\r\n return PLYType.INT;\r\n case \"uint\":\r\n return PLYType.UINT;\r\n case \"double\":\r\n return PLYType.DOUBLE;\r\n case \"uchar\":\r\n return PLYType.UCHAR;\r\n }\r\n return PLYType.UNDEFINED;\r\n }\r\n\r\n private static _ValueNameToEnum(name: string): PLYValue {\r\n switch (name) {\r\n case \"min_x\":\r\n return PLYValue.MIN_X;\r\n case \"min_y\":\r\n return PLYValue.MIN_Y;\r\n case \"min_z\":\r\n return PLYValue.MIN_Z;\r\n case \"max_x\":\r\n return PLYValue.MAX_X;\r\n case \"max_y\":\r\n return PLYValue.MAX_Y;\r\n case \"max_z\":\r\n return PLYValue.MAX_Z;\r\n case \"min_scale_x\":\r\n return PLYValue.MIN_SCALE_X;\r\n case \"min_scale_y\":\r\n return PLYValue.MIN_SCALE_Y;\r\n case \"min_scale_z\":\r\n return PLYValue.MIN_SCALE_Z;\r\n case \"max_scale_x\":\r\n return PLYValue.MAX_SCALE_X;\r\n case \"max_scale_y\":\r\n return PLYValue.MAX_SCALE_Y;\r\n case \"max_scale_z\":\r\n return PLYValue.MAX_SCALE_Z;\r\n case \"packed_position\":\r\n return PLYValue.PACKED_POSITION;\r\n case \"packed_rotation\":\r\n return PLYValue.PACKED_ROTATION;\r\n case \"packed_scale\":\r\n return PLYValue.PACKED_SCALE;\r\n case \"packed_color\":\r\n return PLYValue.PACKED_COLOR;\r\n case \"x\":\r\n return PLYValue.X;\r\n case \"y\":\r\n return PLYValue.Y;\r\n case \"z\":\r\n return PLYValue.Z;\r\n case \"scale_0\":\r\n return PLYValue.SCALE_0;\r\n case \"scale_1\":\r\n return PLYValue.SCALE_1;\r\n case \"scale_2\":\r\n return PLYValue.SCALE_2;\r\n case \"diffuse_red\":\r\n case \"red\":\r\n return PLYValue.DIFFUSE_RED;\r\n case \"diffuse_green\":\r\n case \"green\":\r\n return PLYValue.DIFFUSE_GREEN;\r\n case \"diffuse_blue\":\r\n case \"blue\":\r\n return PLYValue.DIFFUSE_BLUE;\r\n case \"f_dc_0\":\r\n return PLYValue.F_DC_0;\r\n case \"f_dc_1\":\r\n return PLYValue.F_DC_1;\r\n case \"f_dc_2\":\r\n return PLYValue.F_DC_2;\r\n case \"f_dc_3\":\r\n return PLYValue.F_DC_3;\r\n case \"opacity\":\r\n return PLYValue.OPACITY;\r\n case \"rot_0\":\r\n return PLYValue.ROT_0;\r\n case \"rot_1\":\r\n return PLYValue.ROT_1;\r\n case \"rot_2\":\r\n return PLYValue.ROT_2;\r\n case \"rot_3\":\r\n return PLYValue.ROT_3;\r\n case \"min_r\":\r\n return PLYValue.MIN_COLOR_R;\r\n case \"min_g\":\r\n return PLYValue.MIN_COLOR_G;\r\n case \"min_b\":\r\n return PLYValue.MIN_COLOR_B;\r\n case \"max_r\":\r\n return PLYValue.MAX_COLOR_R;\r\n case \"max_g\":\r\n return PLYValue.MAX_COLOR_G;\r\n case \"max_b\":\r\n return PLYValue.MAX_COLOR_B;\r\n case \"f_rest_0\":\r\n return PLYValue.SH_0;\r\n case \"f_rest_1\":\r\n return PLYValue.SH_1;\r\n case \"f_rest_2\":\r\n return PLYValue.SH_2;\r\n case \"f_rest_3\":\r\n return PLYValue.SH_3;\r\n case \"f_rest_4\":\r\n return PLYValue.SH_4;\r\n case \"f_rest_5\":\r\n return PLYValue.SH_5;\r\n case \"f_rest_6\":\r\n return PLYValue.SH_6;\r\n case \"f_rest_7\":\r\n return PLYValue.SH_7;\r\n case \"f_rest_8\":\r\n return PLYValue.SH_8;\r\n case \"f_rest_9\":\r\n return PLYValue.SH_9;\r\n case \"f_rest_10\":\r\n return PLYValue.SH_10;\r\n case \"f_rest_11\":\r\n return PLYValue.SH_11;\r\n case \"f_rest_12\":\r\n return PLYValue.SH_12;\r\n case \"f_rest_13\":\r\n return PLYValue.SH_13;\r\n case \"f_rest_14\":\r\n return PLYValue.SH_14;\r\n case \"f_rest_15\":\r\n return PLYValue.SH_15;\r\n case \"f_rest_16\":\r\n return PLYValue.SH_16;\r\n case \"f_rest_17\":\r\n return PLYValue.SH_17;\r\n case \"f_rest_18\":\r\n return PLYValue.SH_18;\r\n case \"f_rest_19\":\r\n return PLYValue.SH_19;\r\n case \"f_rest_20\":\r\n return PLYValue.SH_20;\r\n case \"f_rest_21\":\r\n return PLYValue.SH_21;\r\n case \"f_rest_22\":\r\n return PLYValue.SH_22;\r\n case \"f_rest_23\":\r\n return PLYValue.SH_23;\r\n case \"f_rest_24\":\r\n return PLYValue.SH_24;\r\n case \"f_rest_25\":\r\n return PLYValue.SH_25;\r\n case \"f_rest_26\":\r\n return PLYValue.SH_26;\r\n case \"f_rest_27\":\r\n return PLYValue.SH_27;\r\n case \"f_rest_28\":\r\n return PLYValue.SH_28;\r\n case \"f_rest_29\":\r\n return PLYValue.SH_29;\r\n case \"f_rest_30\":\r\n return PLYValue.SH_30;\r\n case \"f_rest_31\":\r\n return PLYValue.SH_31;\r\n case \"f_rest_32\":\r\n return PLYValue.SH_32;\r\n case \"f_rest_33\":\r\n return PLYValue.SH_33;\r\n case \"f_rest_34\":\r\n return PLYValue.SH_34;\r\n case \"f_rest_35\":\r\n return PLYValue.SH_35;\r\n case \"f_rest_36\":\r\n return PLYValue.SH_36;\r\n case \"f_rest_37\":\r\n return PLYValue.SH_37;\r\n case \"f_rest_38\":\r\n return PLYValue.SH_38;\r\n case \"f_rest_39\":\r\n return PLYValue.SH_39;\r\n case \"f_rest_40\":\r\n return PLYValue.SH_40;\r\n case \"f_rest_41\":\r\n return PLYValue.SH_41;\r\n case \"f_rest_42\":\r\n return PLYValue.SH_42;\r\n case \"f_rest_43\":\r\n return PLYValue.SH_43;\r\n case \"f_rest_44\":\r\n return PLYValue.SH_44;\r\n }\r\n\r\n return PLYValue.UNDEFINED;\r\n }\r\n /**\r\n * Parse a PLY file header and returns metas infos on splats and chunks\r\n * @param data the loaded buffer\r\n * @returns a PLYHeader\r\n */\r\n static ParseHeader(data: ArrayBuffer): PLYHeader | null {\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 null;\r\n }\r\n const vertexCount = parseInt(/element vertex (\\d+)\\n/.exec(header)![1]);\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 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 const enum ElementMode {\r\n Vertex = 0,\r\n Chunk = 1,\r\n SH = 2,\r\n Unused = 3,\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 let shDegree = 0;\r\n for (const prop of filtered) {\r\n if (prop.startsWith(\"property \")) {\r\n const [, typeName, name] = prop.split(\" \");\r\n\r\n const value = GaussianSplattingMesh._ValueNameToEnum(name);\r\n if (value != PLYValue.UNDEFINED) {\r\n // SH degree 1,2 or 3 for 9, 24 or 45 values\r\n if (value >= PLYValue.SH_44) {\r\n shDegree = 3;\r\n } else if (value >= PLYValue.SH_24) {\r\n shDegree = Math.max(shDegree, 2);\r\n } else if (value >= PLYValue.SH_8) {\r\n shDegree = Math.max(shDegree, 1);\r\n }\r\n }\r\n const type = GaussianSplattingMesh._TypeNameToEnum(typeName);\r\n if (chunkMode == ElementMode.Chunk) {\r\n chunkProperties.push({ value, type, offset: rowChunkOffset });\r\n rowChunkOffset += offsets[typeName];\r\n } else if (chunkMode == ElementMode.Vertex) {\r\n vertexProperties.push({ value, type, offset: rowVertexOffset });\r\n rowVertexOffset += offsets[typeName];\r\n } else if (chunkMode == ElementMode.SH) {\r\n // SH doesn't count for vertex row size but its properties are used to retrieve SH\r\n vertexProperties.push({ value, type, offset: rowVertexOffset });\r\n }\r\n\r\n if (!offsets[typeName]) {\r\n Logger.Warn(`Unsupported property type: ${typeName}.`);\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 {\r\n chunkMode = ElementMode.Unused;\r\n }\r\n }\r\n }\r\n\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n const buffer = new ArrayBuffer(GaussianSplattingMesh._RowOutputLength * vertexCount);\r\n\r\n let shBuffer = null;\r\n let shCoefficientCount = 0;\r\n if (shDegree) {\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\r\n shCoefficientCount = shVectorCount * 3;\r\n shBuffer = new ArrayBuffer(shCoefficientCount * vertexCount);\r\n }\r\n\r\n return {\r\n vertexCount: vertexCount,\r\n chunkCount: chunkCount,\r\n rowVertexLength: rowVertexOffset,\r\n rowChunkLength: rowChunkOffset,\r\n vertexProperties: vertexProperties,\r\n chunkProperties: chunkProperties,\r\n dataView: dataView,\r\n buffer: buffer,\r\n shDegree: shDegree,\r\n shCoefficientCount: shCoefficientCount,\r\n shBuffer: shBuffer,\r\n };\r\n }\r\n private static _GetCompressedChunks(header: PLYHeader, offset: { value: number }): Array<ICompressedPLYChunk> | null {\r\n if (!header.chunkCount) {\r\n return null;\r\n }\r\n const dataView = header.dataView;\r\n const compressedChunks = new Array<ICompressedPLYChunk>(header.chunkCount);\r\n for (let i = 0; i < header.chunkCount; i++) {\r\n const currentChunk = {\r\n min: new Vector3(),\r\n max: new Vector3(),\r\n minScale: new Vector3(),\r\n maxScale: new Vector3(),\r\n minColor: new Vector3(0, 0, 0),\r\n maxColor: new Vector3(1, 1, 1),\r\n };\r\n compressedChunks[i] = currentChunk;\r\n for (let propertyIndex = 0; propertyIndex < header.chunkProperties.length; propertyIndex++) {\r\n const property = header.chunkProperties[propertyIndex];\r\n let value;\r\n switch (property.type) {\r\n case PLYType.FLOAT:\r\n value = dataView.getFloat32(property.offset + offset.value, true);\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n switch (property.value) {\r\n case PLYValue.MIN_X:\r\n currentChunk.min.x = value;\r\n break;\r\n case PLYValue.MIN_Y:\r\n currentChunk.min.y = value;\r\n break;\r\n case PLYValue.MIN_Z:\r\n currentChunk.min.z = value;\r\n break;\r\n case PLYValue.MAX_X:\r\n currentChunk.max.x = value;\r\n break;\r\n case PLYValue.MAX_Y:\r\n currentChunk.max.y = value;\r\n break;\r\n case PLYValue.MAX_Z:\r\n currentChunk.max.z = value;\r\n break;\r\n case PLYValue.MIN_SCALE_X:\r\n currentChunk.minScale.x = value;\r\n break;\r\n case PLYValue.MIN_SCALE_Y:\r\n currentChunk.minScale.y = value;\r\n break;\r\n case PLYValue.MIN_SCALE_Z:\r\n currentChunk.minScale.z = value;\r\n break;\r\n case PLYValue.MAX_SCALE_X:\r\n currentChunk.maxScale.x = value;\r\n break;\r\n case PLYValue.MAX_SCALE_Y:\r\n currentChunk.maxScale.y = value;\r\n break;\r\n case PLYValue.MAX_SCALE_Z:\r\n currentChunk.maxScale.z = value;\r\n break;\r\n case PLYValue.MIN_COLOR_R:\r\n currentChunk.minColor.x = value;\r\n break;\r\n case PLYValue.MIN_COLOR_G:\r\n currentChunk.minColor.y = value;\r\n break;\r\n case PLYValue.MIN_COLOR_B:\r\n currentChunk.minColor.z = value;\r\n break;\r\n case PLYValue.MAX_COLOR_R:\r\n currentChunk.maxColor.x = value;\r\n break;\r\n case PLYValue.MAX_COLOR_G:\r\n currentChunk.maxColor.y = value;\r\n break;\r\n case PLYValue.MAX_COLOR_B:\r\n currentChunk.maxColor.z = value;\r\n break;\r\n }\r\n }\r\n offset.value += header.rowChunkLength;\r\n }\r\n return compressedChunks;\r\n }\r\n\r\n private static _GetSplat(header: PLYHeader, index: number, compressedChunks: Array<ICompressedPLYChunk> | null, offset: { value: number }): void {\r\n const q = TmpVectors.Quaternion[0];\r\n const temp3 = TmpVectors.Vector3[0];\r\n\r\n const rowOutputLength = GaussianSplattingMesh._RowOutputLength;\r\n const buffer = header.buffer;\r\n const dataView = header.dataView;\r\n const position = new Float32Array(buffer, index * rowOutputLength, 3);\r\n const scale = new Float32Array(buffer, index * rowOutputLength + 12, 3);\r\n const rgba = new Uint8ClampedArray(buffer, index * rowOutputLength + 24, 4);\r\n const rot = new Uint8ClampedArray(buffer, index * rowOutputLength + 28, 4);\r\n let sh = null;\r\n if (header.shBuffer) {\r\n sh = new Uint8ClampedArray(header.shBuffer, index * header.shCoefficientCount, header.shCoefficientCount);\r\n }\r\n const chunkIndex = index >> 8;\r\n let r0: number = 255;\r\n let r1: number = 0;\r\n let r2: number = 0;\r\n let r3: number = 0;\r\n\r\n const plySH = [];\r\n\r\n for (let propertyIndex = 0; propertyIndex < header.vertexProperties.length; propertyIndex++) {\r\n const property = header.vertexProperties[propertyIndex];\r\n let value;\r\n switch (property.type) {\r\n case PLYType.FLOAT:\r\n value = dataView.getFloat32(offset.value + property.offset, true);\r\n break;\r\n case PLYType.INT:\r\n value = dataView.getInt32(offset.value + property.offset, true);\r\n break;\r\n case PLYType.UINT:\r\n value = dataView.getUint32(offset.value + property.offset, true);\r\n break;\r\n case PLYType.DOUBLE:\r\n value = dataView.getFloat64(offset.value + property.offset, true);\r\n break;\r\n case PLYType.UCHAR:\r\n value = dataView.getUint8(offset.value + property.offset);\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n switch (property.value) {\r\n case PLYValue.PACKED_POSITION:\r\n {\r\n const compressedChunk = compressedChunks![chunkIndex];\r\n Unpack111011(value, temp3);\r\n position[0] = Scalar.Lerp(compressedChunk.min.x, compressedChunk.max.x, temp3.x);\r\n position[1] = Scalar.Lerp(compressedChunk.min.y, compressedChunk.max.y, temp3.y);\r\n position[2] = Scalar.Lerp(compressedChunk.min.z, compressedChunk.max.z, temp3.z);\r\n }\r\n break;\r\n case PLYValue.PACKED_ROTATION:\r\n {\r\n UnpackRot(value, q);\r\n\r\n r0 = q.x;\r\n r1 = q.y;\r\n r2 = q.z;\r\n r3 = q.w;\r\n }\r\n break;\r\n case PLYValue.PACKED_SCALE:\r\n {\r\n const compressedChunk = compressedChunks![chunkIndex];\r\n Unpack111011(value, temp3);\r\n scale[0] = Math.exp(Scalar.Lerp(compressedChunk.minScale.x, compressedChunk.maxScale.x, temp3.x));\r\n scale[1] = Math.exp(Scalar.Lerp(compressedChunk.minScale.y, compressedChunk.maxScale.y, temp3.y));\r\n scale[2] = Math.exp(Scalar.Lerp(compressedChunk.minScale.z, compressedChunk.maxScale.z, temp3.z));\r\n }\r\n break;\r\n case PLYValue.PACKED_COLOR:\r\n {\r\n const compressedChunk = compressedChunks![chunkIndex];\r\n Unpack8888(value, rgba);\r\n rgba[0] = Scalar.Lerp(compressedChunk.minColor.x, compressedChunk.maxColor.x, rgba[0] / 255) * 255;\r\n rgba[1] = Scalar.Lerp(compressedChunk.minColor.y, compressedChunk.maxColor.y, rgba[1] / 255) * 255;\r\n rgba[2] = Scalar.Lerp(compressedChunk.minColor.z, compressedChunk.maxColor.z, rgba[2] / 255) * 255;\r\n }\r\n break;\r\n case PLYValue.X:\r\n position[0] = value;\r\n break;\r\n case PLYValue.Y:\r\n position[1] = value;\r\n break;\r\n case PLYValue.Z:\r\n position[2] = value;\r\n break;\r\n case PLYValue.SCALE_0:\r\n scale[0] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_1:\r\n scale[1] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_2:\r\n scale[2] = Math.exp(value);\r\n break;\r\n case PLYValue.DIFFUSE_RED:\r\n rgba[0] = value;\r\n break;\r\n case PLYValue.DIFFUSE_GREEN:\r\n rgba[1] = value;\r\n break;\r\n case PLYValue.DIFFUSE_BLUE:\r\n rgba[2] = value;\r\n break;\r\n case PLYValue.F_DC_0:\r\n rgba[0] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_1:\r\n rgba[1] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_2:\r\n rgba[2] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_3:\r\n rgba[3] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.OPACITY:\r\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\r\n break;\r\n case PLYValue.ROT_0:\r\n r0 = value;\r\n break;\r\n case PLYValue.ROT_1:\r\n r1 = value;\r\n break;\r\n case PLYValue.ROT_2:\r\n r2 = value;\r\n break;\r\n case PLYValue.ROT_3:\r\n r3 = value;\r\n break;\r\n }\r\n if (sh && property.value >= PLYValue.SH_0 && property.value <= PLYValue.SH_44) {\r\n const shIndex = property.value - PLYValue.SH_0;\r\n if (property.type == PLYType.UCHAR && header.chunkCount) {\r\n // compressed ply. dataView points to beginning of vertex\r\n // could be improved with a direct copy instead of a per SH index computation + copy\r\n const compressedValue = dataView.getUint8(\r\n header.rowChunkLength * header.chunkCount + header.vertexCount * header.rowVertexLength + index * header.shCoefficientCount + shIndex\r\n );\r\n // compressed .ply SH import : https://github.com/playcanvas/engine/blob/fda3f0368b45d7381f0b5a1722bd2056128eaebe/src/scene/gsplat/gsplat-compressed-data.js#L88C81-L88C98\r\n plySH[shIndex] = (compressedValue * (8 / 255) - 4) * 127.5 + 127.5;\r\n } else {\r\n const clampedValue = Scalar.Clamp(value * 127.5 + 127.5, 0, 255);\r\n plySH[shIndex] = clampedValue;\r\n }\r\n }\r\n }\r\n\r\n if (sh) {\r\n const shDim = header.shDegree == 1 ? 3 : header.shDegree == 2 ? 8 : 15;\r\n for (let j = 0; j < shDim; j++) {\r\n sh[j * 3 + 0] = plySH[j];\r\n sh[j * 3 + 1] = plySH[j + shDim];\r\n sh[j * 3 + 2] = plySH[j + shDim * 2];\r\n }\r\n }\r\n\r\n q.set(r1, r2, r3, r0);\r\n q.normalize();\r\n rot[0] = q.w * 127.5 + 127.5;\r\n rot[1] = q.x * 127.5 + 127.5;\r\n rot[2] = q.y * 127.5 + 127.5;\r\n rot[3] = q.z * 127.5 + 127.5;\r\n offset.value += header.rowVertexLength;\r\n }\r\n\r\n /**\r\n * Converts a .ply data with SH coefficients 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 * @param useCoroutine use coroutine and yield\r\n * @returns the loaded splat buffer and optional array of sh coefficients\r\n */\r\n public static *ConvertPLYWithSHToSplat(data: ArrayBuffer, useCoroutine = false) {\r\n const header = GaussianSplattingMesh.ParseHeader(data);\r\n if (!header) {\r\n return { buffer: data };\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMesh._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMesh._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMesh._PlyConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n let sh = null;\r\n // make SH texture buffers\r\n if (header.shDegree && header.shBuffer) {\r\n const textureCount = Math.ceil(header.shCoefficientCount / 16); // 4 components can be stored per texture, 4 sh per component\r\n let shIndexRead = 0;\r\n const ubuf = new Uint8Array(header.shBuffer);\r\n\r\n // sh is an array of uint8array that will be used to create sh textures\r\n sh = [];\r\n\r\n const splatCount = header.vertexCount;\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (engine) {\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n // create array for the number of textures needed.\r\n for (let textureIndex = 0; textureIndex < textureCount; textureIndex++) {\r\n const texture = new Uint8Array(height * width * 4 * 4); // 4 components per texture, 4 sh per component\r\n sh.push(texture);\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n for (let shIndexWrite = 0; shIndexWrite < header.shCoefficientCount; shIndexWrite++) {\r\n const shValue = ubuf[shIndexRead++];\r\n\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n shArray[byteIndexInTexture + offsetPerSplat] = shValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { buffer: header.buffer, sh: sh };\r\n }\r\n\r\n /**\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 * @param useCoroutine use coroutine and yield\r\n * @returns the loaded splat buffer without SH coefficient, whether ply contains or not SH.\r\n */\r\n public static *ConvertPLYToSplat(data: ArrayBuffer, useCoroutine = false) {\r\n const header = GaussianSplattingMesh.ParseHeader(data);\r\n if (!header) {\r\n return data;\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMesh._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMesh._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMesh._PlyConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n return header.buffer;\r\n }\r\n\r\n /**\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 public static async ConvertPLYToSplatAsync(data: ArrayBuffer) {\r\n return await runCoroutineAsync(GaussianSplattingMesh.ConvertPLYToSplat(data, true), createYieldingScheduler());\r\n }\r\n\r\n /**\r\n * Converts a .ply with SH 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 with SH\r\n */\r\n public static async ConvertPLYWithSHToSplatAsync(data: ArrayBuffer) {\r\n return await runCoroutineAsync(GaussianSplattingMesh.ConvertPLYWithSHToSplat(data, true), createYieldingScheduler());\r\n }\r\n /**\r\n * Loads a .splat Gaussian Splatting array buffer asynchronously\r\n * @param data arraybuffer containing splat file\r\n * @returns a promise that resolves when the operation is complete\r\n */\r\n\r\n public async loadDataAsync(data: ArrayBuffer): Promise<void> {\r\n return await this.updateDataAsync(data);\r\n }\r\n\r\n /**\r\n * Loads a Gaussian or Splatting file asynchronously\r\n * @param url path to the splat file to load\r\n * @param scene optional scene it belongs to\r\n * @returns a promise that resolves when the operation is complete\r\n * @deprecated Please use SceneLoader.ImportMeshAsync instead\r\n */\r\n public async loadFileAsync(url: string, scene?: Scene): Promise<void> {\r\n await ImportMeshAsync(url, (scene || EngineStore.LastCreatedScene)!, { pluginOptions: { splat: { gaussianSplattingMesh: this } } });\r\n }\r\n\r\n /**\r\n * Releases resources associated with this mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n */\r\n public override dispose(doNotRecurse?: boolean): void {\r\n this._covariancesATexture?.dispose();\r\n this._covariancesBTexture?.dispose();\r\n this._centersTexture?.dispose();\r\n this._colorsTexture?.dispose();\r\n if (this._shTextures) {\r\n for (const shTexture of this._shTextures) {\r\n shTexture.dispose();\r\n }\r\n }\r\n\r\n this._covariancesATexture = null;\r\n this._covariancesBTexture = null;\r\n this._centersTexture = null;\r\n this._colorsTexture = null;\r\n this._shTextures = null;\r\n\r\n this._worker?.terminate();\r\n this._worker = null;\r\n\r\n // delete meshes created for each camera\r\n this._cameraViewInfos.forEach((cameraViewInfo) => {\r\n cameraViewInfo.mesh.dispose();\r\n });\r\n\r\n super.dispose(doNotRecurse, true);\r\n }\r\n\r\n private _copyTextures(source: GaussianSplattingMesh): void {\r\n this._covariancesATexture = source.covariancesATexture?.clone()!;\r\n this._covariancesBTexture = source.covariancesBTexture?.clone()!;\r\n this._centersTexture = source.centersTexture?.clone()!;\r\n this._colorsTexture = source.colorsTexture?.clone()!;\r\n if (source._shTextures) {\r\n this._shTextures = [];\r\n for (const shTexture of this._shTextures) {\r\n this._shTextures?.push(shTexture.clone()!);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns a new Mesh object generated from the current mesh properties.\r\n * @param name is a string, the name given to the new mesh\r\n * @returns a new Gaussian Splatting Mesh\r\n */\r\n public override clone(name: string = \"\"): GaussianSplattingMesh {\r\n const newGS = new GaussianSplattingMesh(name, undefined, this.getScene());\r\n newGS._copySource(this);\r\n newGS.makeGeometryUnique();\r\n newGS._vertexCount = this._vertexCount;\r\n newGS._copyTextures(this);\r\n newGS._modelViewProjectionMatrix = Matrix.Identity();\r\n newGS._splatPositions = this._splatPositions;\r\n newGS._readyToDisplay = false;\r\n newGS._disableDepthSort = this._disableDepthSort;\r\n newGS._instanciateWorker();\r\n\r\n const binfo = this.getBoundingInfo();\r\n newGS.getBoundingInfo().reConstruct(binfo.minimum, binfo.maximum, this.getWorldMatrix());\r\n\r\n newGS.forcedInstanceCount = this.forcedInstanceCount;\r\n newGS.setEnabled(true);\r\n return newGS;\r\n }\r\n\r\n private static _CreateWorker = function (self: Worker) {\r\n let positions: Float32Array;\r\n let depthMix: BigInt64Array;\r\n let indices: Uint32Array;\r\n let floatMix: Float32Array;\r\n\r\n self.onmessage = (e: any) => {\r\n // updated on init\r\n if (e.data.positions) {\r\n positions = e.data.positions;\r\n }\r\n // udpate on view changed\r\n else {\r\n const cameraId = e.data.cameraId;\r\n const modelViewProjection = e.data.modelViewProjection;\r\n\r\n const vertexCountPadded = (positions.length / 4 + 15) & ~0xf;\r\n if (!positions || !modelViewProjection) {\r\n // Sanity check, it shouldn't happen!\r\n throw new Error(\"positions or modelViewProjection matrix is not defined!\");\r\n }\r\n\r\n depthMix = e.data.depthMix;\r\n indices = new Uint32Array(depthMix.buffer);\r\n floatMix = new Float32Array(depthMix.buffer);\r\n\r\n // Sort\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n indices[2 * j] = j;\r\n }\r\n\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n floatMix[2 * j + 1] =\r\n 10000 - (modelViewProjection[2] * positions[4 * j + 0] + modelViewProjection[6] * positions[4 * j + 1] + modelViewProjection[10] * positions[4 * j + 2]);\r\n }\r\n\r\n depthMix.sort();\r\n\r\n self.postMessage({ depthMix, cameraId }, [depthMix.buffer]);\r\n }\r\n };\r\n };\r\n\r\n private _makeEmptySplat(index: number, covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array): void {\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n this._splatPositions![4 * index + 0] = 0;\r\n this._splatPositions![4 * index + 1] = 0;\r\n this._splatPositions![4 * index + 2] = 0;\r\n\r\n covA[index * 4 + 0] = ToHalfFloat(0);\r\n covA[index * 4 + 1] = ToHalfFloat(0);\r\n covA[index * 4 + 2] = ToHalfFloat(0);\r\n covA[index * 4 + 3] = ToHalfFloat(0);\r\n covB[index * covBSItemSize + 0] = ToHalfFloat(0);\r\n covB[index * covBSItemSize + 1] = ToHalfFloat(0);\r\n colorArray[index * 4 + 3] = 0;\r\n }\r\n\r\n private _makeSplat(\r\n index: number,\r\n fBuffer: Float32Array,\r\n uBuffer: Uint8Array,\r\n covA: Uint16Array,\r\n covB: Uint16Array,\r\n colorArray: Uint8Array,\r\n minimum: Vector3,\r\n maximum: Vector3,\r\n options: IUpdateOptions\r\n ): void {\r\n const matrixRotation = TmpVectors.Matrix[0];\r\n const matrixScale = TmpVectors.Matrix[1];\r\n const quaternion = TmpVectors.Quaternion[0];\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n\r\n const x = fBuffer[8 * index + 0];\r\n const y = fBuffer[8 * index + 1] * (options.flipY ? -1 : 1);\r\n const z = fBuffer[8 * index + 2];\r\n\r\n this._splatPositions![4 * index + 0] = x;\r\n this._splatPositions![4 * index + 1] = y;\r\n this._splatPositions![4 * index + 2] = z;\r\n\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n\r\n quaternion.set(\r\n (uBuffer[32 * index + 28 + 1] - 127.5) / 127.5,\r\n (uBuffer[32 * index + 28 + 2] - 127.5) / 127.5,\r\n (uBuffer[32 * index + 28 + 3] - 127.5) / 127.5,\r\n -(uBuffer[32 * index + 28 + 0] - 127.5) / 127.5\r\n );\r\n quaternion.normalize();\r\n quaternion.toRotationMatrix(matrixRotation);\r\n\r\n Matrix.ScalingToRef(fBuffer[8 * index + 3 + 0] * 2, fBuffer[8 * index + 3 + 1] * 2, fBuffer[8 * index + 3 + 2] * 2, matrixScale);\r\n\r\n const m = matrixRotation.multiplyToRef(matrixScale, TmpVectors.Matrix[0]).m;\r\n\r\n const covariances = this._tmpCovariances;\r\n covariances[0] = m[0] * m[0] + m[1] * m[1] + m[2] * m[2];\r\n covariances[1] = m[0] * m[4] + m[1] * m[5] + m[2] * m[6];\r\n covariances[2] = m[0] * m[8] + m[1] * m[9] + m[2] * m[10];\r\n covariances[3] = m[4] * m[4] + m[5] * m[5] + m[6] * m[6];\r\n covariances[4] = m[4] * m[8] + m[5] * m[9] + m[6] * m[10];\r\n covariances[5] = m[8] * m[8] + m[9] * m[9] + m[10] * m[10];\r\n\r\n // normalize covA, covB\r\n let factor = -10000;\r\n for (let covIndex = 0; covIndex < 6; covIndex++) {\r\n factor = Math.max(factor, Math.abs(covariances[covIndex]));\r\n }\r\n\r\n this._splatPositions![4 * index + 3] = factor;\r\n const transform = factor;\r\n\r\n covA[index * 4 + 0] = ToHalfFloat(covariances[0] / transform);\r\n covA[index * 4 + 1] = ToHalfFloat(covariances[1] / transform);\r\n covA[index * 4 + 2] = ToHalfFloat(covariances[2] / transform);\r\n covA[index * 4 + 3] = ToHalfFloat(covariances[3] / transform);\r\n covB[index * covBSItemSize + 0] = ToHalfFloat(covariances[4] / transform);\r\n covB[index * covBSItemSize + 1] = ToHalfFloat(covariances[5] / transform);\r\n\r\n // colors\r\n colorArray[index * 4 + 0] = uBuffer[32 * index + 24 + 0];\r\n colorArray[index * 4 + 1] = uBuffer[32 * index + 24 + 1];\r\n colorArray[index * 4 + 2] = uBuffer[32 * index + 24 + 2];\r\n colorArray[index * 4 + 3] = uBuffer[32 * index + 24 + 3];\r\n }\r\n\r\n private _updateTextures(covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, sh?: Uint8Array[]): void {\r\n const textureSize = this._getTextureSize(this._vertexCount);\r\n // Update the textures\r\n const createTextureFromData = (data: Float32Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_FLOAT);\r\n };\r\n\r\n const createTextureFromDataU8 = (data: Uint8Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_UNSIGNED_BYTE);\r\n };\r\n\r\n const createTextureFromDataU32 = (data: Uint32Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTURETYPE_UNSIGNED_INTEGER);\r\n };\r\n\r\n const createTextureFromDataF16 = (data: Uint16Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_HALF_FLOAT);\r\n };\r\n\r\n if (this._covariancesATexture) {\r\n this._delayedTextureUpdate = { covA: covA, covB: covB, colors: colorArray, centers: this._splatPositions!, sh: sh };\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const vertexCount = this._vertexCount;\r\n if (this._worker) {\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n }\r\n\r\n this._postToWorker(true);\r\n } else {\r\n this._covariancesATexture = createTextureFromDataF16(covA, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._covariancesBTexture = createTextureFromDataF16(\r\n covB,\r\n textureSize.x,\r\n textureSize.y,\r\n this._useRGBACovariants ? Constants.TEXTUREFORMAT_RGBA : Constants.TEXTUREFORMAT_RG\r\n );\r\n this._centersTexture = createTextureFromData(this._splatPositions!, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._colorsTexture = createTextureFromDataU8(colorArray, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n if (sh) {\r\n this._shTextures = [];\r\n for (const shData of sh) {\r\n const buffer = new Uint32Array(shData.buffer);\r\n const shTexture = createTextureFromDataU32(buffer, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA_INTEGER);\r\n shTexture.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n shTexture.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._shTextures!.push(shTexture);\r\n }\r\n }\r\n this._instanciateWorker();\r\n }\r\n }\r\n\r\n private *_updateData(data: ArrayBuffer, isAsync: boolean, sh?: Uint8Array[], options: IUpdateOptions = { flipY: false }): Coroutine<void> {\r\n // if a covariance texture is present, then it's not a creation but an update\r\n if (!this._covariancesATexture) {\r\n this._readyToDisplay = false;\r\n }\r\n\r\n // Parse the data\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n if (this._keepInRam) {\r\n this._splatsData = data;\r\n // keep sh in ram too ?\r\n }\r\n\r\n const vertexCount = uBuffer.length / GaussianSplattingMesh._RowOutputLength;\r\n if (vertexCount != this._vertexCount) {\r\n this._updateSplatIndexBuffer(vertexCount);\r\n }\r\n this._vertexCount = vertexCount;\r\n // degree == 1 for 1 texture (3 terms), 2 for 2 textures(8 terms) and 3 for 3 textures (15 terms)\r\n this._shDegree = sh ? sh.length : 0;\r\n\r\n const textureSize = this._getTextureSize(vertexCount);\r\n const textureLength = textureSize.x * textureSize.y;\r\n const lineCountUpdate = GaussianSplattingMesh.ProgressiveUpdateAmount ?? textureSize.y;\r\n const textureLengthPerUpdate = textureSize.x * lineCountUpdate;\r\n\r\n this._splatPositions = new Float32Array(4 * textureLength);\r\n const covA = new Uint16Array(textureLength * 4);\r\n const covB = new Uint16Array((this._useRGBACovariants ? 4 : 2) * textureLength);\r\n const colorArray = new Uint8Array(textureLength * 4);\r\n\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n if (GaussianSplattingMesh.ProgressiveUpdateAmount) {\r\n // create textures with not filled-yet array, then update directly portions of it\r\n this._updateTextures(covA, covB, colorArray, sh);\r\n this.setEnabled(true);\r\n\r\n const partCount = Math.ceil(textureSize.y / lineCountUpdate);\r\n for (let partIndex = 0; partIndex < partCount; partIndex++) {\r\n const updateLine = partIndex * lineCountUpdate;\r\n const splatIndexBase = updateLine * textureSize.x;\r\n for (let i = 0; i < textureLengthPerUpdate; i++) {\r\n this._makeSplat(splatIndexBase + i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, options);\r\n }\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, updateLine, Math.min(lineCountUpdate, textureSize.y - updateLine));\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n // sort will be dirty here as just finished filled positions will not be sorted\r\n const positions = Float32Array.from(this._splatPositions);\r\n const vertexCount = this._vertexCount;\r\n if (this._worker) {\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n }\r\n this._sortIsDirty = true;\r\n } else {\r\n const paddedVertexCount = (vertexCount + 15) & ~0xf;\r\n for (let i = 0; i < vertexCount; i++) {\r\n this._makeSplat(i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, options);\r\n if (isAsync && i % GaussianSplattingMesh._SplatBatchSize === 0) {\r\n yield;\r\n }\r\n }\r\n // pad the rest\r\n for (let i = vertexCount; i < paddedVertexCount; i++) {\r\n this._makeEmptySplat(i, covA, covB, colorArray);\r\n }\r\n // textures\r\n this._updateTextures(covA, covB, colorArray, sh);\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n this._sortIsDirty = true;\r\n }\r\n this._postToWorker(true);\r\n }\r\n\r\n /**\r\n * Update asynchronously the buffer\r\n * @param data array buffer containing center, color, orientation and scale of splats\r\n * @param sh optional array of uint8 array for SH data\r\n * @returns a promise\r\n */\r\n public async updateDataAsync(data: ArrayBuffer, sh?: Uint8Array[]): Promise<void> {\r\n return await runCoroutineAsync(this._updateData(data, true, sh), createYieldingScheduler());\r\n }\r\n\r\n /**\r\n * @experimental\r\n * Update data from GS (position, orientation, color, scaling)\r\n * @param data array that contain all the datas\r\n * @param sh optional array of uint8 array for SH data\r\n * @param options optional informations on how to treat data\r\n */\r\n public updateData(data: ArrayBuffer, sh?: Uint8Array[], options: IUpdateOptions = { flipY: true }): void {\r\n runCoroutineSync(this._updateData(data, false, sh, options));\r\n }\r\n\r\n /**\r\n * Refreshes the bounding info, taking into account all the thin instances defined\r\n * @returns the current Gaussian Splatting\r\n */\r\n public override refreshBoundingInfo(): Mesh {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n return this;\r\n }\r\n\r\n // in case size is different\r\n private _updateSplatIndexBuffer(vertexCount: number): void {\r\n const paddedVertexCount = (vertexCount + 15) & ~0xf;\r\n if (!this._splatIndex || vertexCount > this._splatIndex.length) {\r\n this._splatIndex = new Float32Array(paddedVertexCount);\r\n for (let i = 0; i < paddedVertexCount; i++) {\r\n this._splatIndex[i] = i;\r\n }\r\n\r\n // update meshes for knowns cameras\r\n this._cameraViewInfos.forEach((cameraViewInfos) => {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n });\r\n }\r\n this.forcedInstanceCount = paddedVertexCount >> 4;\r\n }\r\n\r\n private _updateSubTextures(centers: Float32Array, covA: Uint16Array, covB: Uint16Array, colors: Uint8Array, lineStart: number, lineCount: number, sh?: Uint8Array[]): void {\r\n const updateTextureFromData = (texture: BaseTexture, data: ArrayBufferView, width: number, lineStart: number, lineCount: number) => {\r\n (this.getEngine() as ThinEngine).updateTextureData(texture.getInternalTexture()!, data, 0, lineStart, width, lineCount, 0, 0, false);\r\n };\r\n\r\n const textureSize = this._getTextureSize(this._vertexCount);\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n const texelStart = lineStart * textureSize.x;\r\n const texelCount = lineCount * textureSize.x;\r\n const covAView = new Uint16Array(covA.buffer, texelStart * 4 * Uint16Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n const covBView = new Uint16Array(covB.buffer, texelStart * covBSItemSize * Uint16Array.BYTES_PER_ELEMENT, texelCount * covBSItemSize);\r\n const colorsView = new Uint8Array(colors.buffer, texelStart * 4, texelCount * 4);\r\n const centersView = new Float32Array(centers.buffer, texelStart * 4 * Float32Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n updateTextureFromData(this._covariancesATexture!, covAView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._covariancesBTexture!, covBView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._centersTexture!, centersView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._colorsTexture!, colorsView, textureSize.x, lineStart, lineCount);\r\n if (sh) {\r\n for (let i = 0; i < sh.length; i++) {\r\n const componentCount = 4;\r\n const shView = new Uint32Array(sh[i].buffer, texelStart * componentCount * 4, texelCount * componentCount);\r\n updateTextureFromData(this._shTextures![i], shView, textureSize.x, lineStart, lineCount);\r\n }\r\n }\r\n }\r\n private _instanciateWorker(): void {\r\n if (!this._vertexCount) {\r\n return;\r\n }\r\n if (this._disableDepthSort) {\r\n return;\r\n }\r\n this._updateSplatIndexBuffer(this._vertexCount);\r\n\r\n // no worker in native\r\n if (_native) {\r\n return;\r\n }\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMesh._CreateWorker.toString(), \")(self)\"], {\r\n type: \"application/javascript\",\r\n })\r\n )\r\n );\r\n\r\n const vertexCountPadded = (this._vertexCount + 15) & ~0xf;\r\n this._depthMix = new BigInt64Array(vertexCountPadded);\r\n const positions = Float32Array.from(this._splatPositions!);\r\n\r\n this._worker.postMessage({ positions }, [positions.buffer]);\r\n\r\n this._worker.onmessage = (e) => {\r\n this._depthMix = e.data.depthMix;\r\n const cameraId = e.data.cameraId;\r\n\r\n const indexMix = new Uint32Array(e.data.depthMix.buffer);\r\n if (this._splatIndex) {\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n this._splatIndex[j] = indexMix[2 * j];\r\n }\r\n }\r\n if (this._delayedTextureUpdate) {\r\n const textureSize = this._getTextureSize(vertexCountPadded);\r\n this._updateSubTextures(\r\n this._delayedTextureUpdate.centers,\r\n this._delayedTextureUpdate.covA,\r\n this._delayedTextureUpdate.covB,\r\n this._delayedTextureUpdate.colors,\r\n 0,\r\n textureSize.y,\r\n this._delayedTextureUpdate.sh\r\n );\r\n this._delayedTextureUpdate = null;\r\n }\r\n\r\n // get mesh for camera and update its instance buffer\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n if (cameraViewInfos) {\r\n if (cameraViewInfos.splatIndexBufferSet) {\r\n cameraViewInfos.mesh.thinInstanceBufferUpdated(\"splatIndex\");\r\n } else {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n cameraViewInfos.splatIndexBufferSet = true;\r\n }\r\n }\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n // sort is dirty when GS is visible for progressive update with a this message arriving but positions were partially filled\r\n // another update needs to be kicked. The kick can't happen just when the position buffer is ready because _canPostToWorker might be false.\r\n if (this._sortIsDirty) {\r\n this._postToWorker(true);\r\n this._sortIsDirty = false;\r\n }\r\n };\r\n }\r\n\r\n private _getTextureSize(length: number): Vector2 {\r\n const engine = this._scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n\r\n let height = 1;\r\n\r\n if (engine.version === 1 && !engine.isWebGPU) {\r\n while (width * height < length) {\r\n height *= 2;\r\n }\r\n } else {\r\n height = Math.ceil(length / width);\r\n }\r\n\r\n if (height > width) {\r\n Logger.Error(\"GaussianSplatting texture size: (\" + width + \", \" + height + \"), maxTextureSize: \" + width);\r\n height = width;\r\n }\r\n\r\n return new Vector2(width, height);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingMesh.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { SubMesh } from \"../subMesh\";\r\nimport type { AbstractMesh } from \"../abstractMesh\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Quaternion } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport \"core/Meshes/thinInstanceMesh\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { ToHalfFloat } from \"core/Misc/textureTools\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { runCoroutineSync, runCoroutineAsync, createYieldingScheduler, type Coroutine } from \"core/Misc/coroutine\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { ImportMeshAsync } from \"core/Loading/sceneLoader\";\r\nimport type { INative } from \"core/Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\ninterface IDelayedTextureUpdate {\r\n covA: Uint16Array;\r\n covB: Uint16Array;\r\n colors: Uint8Array;\r\n centers: Float32Array;\r\n sh?: Uint8Array[];\r\n partIndices?: Uint8Array;\r\n}\r\ninterface IUpdateOptions {\r\n flipY?: boolean;\r\n}\r\n\r\n// @internal\r\nconst UnpackUnorm = (value: number, bits: number) => {\r\n const t = (1 << bits) - 1;\r\n return (value & t) / t;\r\n};\r\n\r\n// @internal\r\nconst Unpack111011 = (value: number, result: Vector3) => {\r\n result.x = UnpackUnorm(value >>> 21, 11);\r\n result.y = UnpackUnorm(value >>> 11, 10);\r\n result.z = UnpackUnorm(value, 11);\r\n};\r\n\r\n// @internal\r\nconst Unpack8888 = (value: number, result: Uint8ClampedArray) => {\r\n result[0] = UnpackUnorm(value >>> 24, 8) * 255;\r\n result[1] = UnpackUnorm(value >>> 16, 8) * 255;\r\n result[2] = UnpackUnorm(value >>> 8, 8) * 255;\r\n result[3] = UnpackUnorm(value, 8) * 255;\r\n};\r\n\r\n// @internal\r\n// unpack quaternion with 2,10,10,10 format (largest element, 3x10bit element)\r\nconst UnpackRot = (value: number, result: Quaternion) => {\r\n const norm = 1.0 / (Math.sqrt(2) * 0.5);\r\n const a = (UnpackUnorm(value >>> 20, 10) - 0.5) * norm;\r\n const b = (UnpackUnorm(value >>> 10, 10) - 0.5) * norm;\r\n const c = (UnpackUnorm(value, 10) - 0.5) * norm;\r\n const m = Math.sqrt(1.0 - (a * a + b * b + c * c));\r\n\r\n switch (value >>> 30) {\r\n case 0:\r\n result.set(m, a, b, c);\r\n break;\r\n case 1:\r\n result.set(a, m, b, c);\r\n break;\r\n case 2:\r\n result.set(a, b, m, c);\r\n break;\r\n case 3:\r\n result.set(a, b, c, m);\r\n break;\r\n }\r\n};\r\n\r\ninterface ICompressedPLYChunk {\r\n min: Vector3;\r\n max: Vector3;\r\n minScale: Vector3;\r\n maxScale: Vector3;\r\n minColor: Vector3;\r\n maxColor: Vector3;\r\n}\r\n\r\n/**\r\n * To support multiple camera rendering, rendered mesh is separated from the GaussianSplattingMesh itself.\r\n * The GS mesh serves as a proxy and a different mesh is rendered for each camera. This hot switch is done\r\n * in the render() function. Each camera has a corresponding ICameraViewInfo object. The key is the camera unique id.\r\n * ICameraViewInfo and the rendered mesh are created in method `_postToWorker`\r\n * Mesh are disabled to not let the scene render them directly.\r\n * ICameraViewInfo are sorted per last frame id update to prioritize the less recently updated ones.\r\n * There is 1 web worker per GaussianSplattingMesh to avoid too many copies between main thread and workers.\r\n * So, only one sort is being done at a time per GaussianSplattingMesh. If multiple cameras need an update,\r\n * they will be processed one by one in subsequent frames.\r\n */\r\ninterface ICameraViewInfo {\r\n camera: Camera;\r\n cameraDirection: Vector3;\r\n mesh: Mesh;\r\n frameIdLastUpdate: number;\r\n splatIndexBufferSet: boolean;\r\n}\r\n/**\r\n * Representation of the types\r\n */\r\nconst enum PLYType {\r\n FLOAT,\r\n INT,\r\n UINT,\r\n DOUBLE,\r\n UCHAR,\r\n UNDEFINED,\r\n}\r\n\r\n/**\r\n * Usage types of the PLY values\r\n */\r\nconst enum PLYValue {\r\n MIN_X,\r\n MIN_Y,\r\n MIN_Z,\r\n MAX_X,\r\n MAX_Y,\r\n MAX_Z,\r\n\r\n MIN_SCALE_X,\r\n MIN_SCALE_Y,\r\n MIN_SCALE_Z,\r\n\r\n MAX_SCALE_X,\r\n MAX_SCALE_Y,\r\n MAX_SCALE_Z,\r\n\r\n PACKED_POSITION,\r\n PACKED_ROTATION,\r\n PACKED_SCALE,\r\n PACKED_COLOR,\r\n X,\r\n Y,\r\n Z,\r\n SCALE_0,\r\n SCALE_1,\r\n SCALE_2,\r\n\r\n DIFFUSE_RED,\r\n DIFFUSE_GREEN,\r\n DIFFUSE_BLUE,\r\n OPACITY,\r\n\r\n F_DC_0,\r\n F_DC_1,\r\n F_DC_2,\r\n F_DC_3,\r\n\r\n ROT_0,\r\n ROT_1,\r\n ROT_2,\r\n ROT_3,\r\n\r\n MIN_COLOR_R,\r\n MIN_COLOR_G,\r\n MIN_COLOR_B,\r\n\r\n MAX_COLOR_R,\r\n MAX_COLOR_G,\r\n MAX_COLOR_B,\r\n\r\n SH_0,\r\n SH_1,\r\n SH_2,\r\n SH_3,\r\n SH_4,\r\n SH_5,\r\n SH_6,\r\n SH_7,\r\n SH_8,\r\n SH_9,\r\n SH_10,\r\n SH_11,\r\n SH_12,\r\n SH_13,\r\n SH_14,\r\n SH_15,\r\n SH_16,\r\n SH_17,\r\n SH_18,\r\n SH_19,\r\n SH_20,\r\n SH_21,\r\n SH_22,\r\n SH_23,\r\n SH_24,\r\n SH_25,\r\n SH_26,\r\n SH_27,\r\n SH_28,\r\n SH_29,\r\n SH_30,\r\n SH_31,\r\n SH_32,\r\n SH_33,\r\n SH_34,\r\n SH_35,\r\n SH_36,\r\n SH_37,\r\n SH_38,\r\n SH_39,\r\n SH_40,\r\n SH_41,\r\n SH_42,\r\n SH_43,\r\n SH_44,\r\n\r\n UNDEFINED,\r\n}\r\n\r\n/**\r\n * Property field found in PLY header\r\n */\r\nexport type PlyProperty = {\r\n /**\r\n * Value usage\r\n */\r\n value: PLYValue;\r\n /**\r\n * Value type\r\n */\r\n type: PLYType;\r\n /**\r\n * offset in byte from te beginning of the splat\r\n */\r\n offset: number;\r\n};\r\n\r\n/**\r\n * meta info on Splat file\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface PLYHeader {\r\n /**\r\n * number of splats\r\n */\r\n vertexCount: number;\r\n /**\r\n * number of spatial chunks for compressed ply\r\n */\r\n chunkCount: number;\r\n /**\r\n * length in bytes of the vertex info\r\n */\r\n rowVertexLength: number;\r\n /**\r\n * length in bytes of the chunk\r\n */\r\n rowChunkLength: number;\r\n /**\r\n * array listing properties per vertex\r\n */\r\n vertexProperties: PlyProperty[];\r\n /**\r\n * array listing properties per chunk\r\n */\r\n chunkProperties: PlyProperty[];\r\n /**\r\n * data view for parsing chunks and vertices\r\n */\r\n dataView: DataView;\r\n /**\r\n * buffer for the data view\r\n */\r\n buffer: ArrayBuffer;\r\n /**\r\n * degree of SH coefficients\r\n */\r\n shDegree: number;\r\n /**\r\n * number of coefficient per splat\r\n */\r\n shCoefficientCount: number;\r\n /**\r\n * buffer for SH coefficients\r\n */\r\n shBuffer: ArrayBuffer | null;\r\n}\r\n/**\r\n * Class used to render a gaussian splatting mesh\r\n */\r\nexport class GaussianSplattingMesh extends Mesh {\r\n private _vertexCount = 0;\r\n private _worker: Nullable<Worker> = null;\r\n private _modelViewProjectionMatrix = Matrix.Identity();\r\n private _viewProjectionMatrix = Matrix.Identity();\r\n private _depthMix: BigInt64Array;\r\n private _canPostToWorker = true;\r\n private _readyToDisplay = false;\r\n private _covariancesATexture: Nullable<BaseTexture> = null;\r\n private _covariancesBTexture: Nullable<BaseTexture> = null;\r\n private _centersTexture: Nullable<BaseTexture> = null;\r\n private _colorsTexture: Nullable<BaseTexture> = null;\r\n private _splatPositions: Nullable<Float32Array> = null;\r\n private _splatIndex: Nullable<Float32Array> = null;\r\n private _shTextures: Nullable<BaseTexture[]> = null;\r\n private _splatsData: Nullable<ArrayBuffer> = null;\r\n private _shData: Nullable<Uint8Array[]> = null;\r\n private _partIndicesTexture: Nullable<BaseTexture> = null;\r\n private _partIndices: Nullable<Uint8Array> = null;\r\n private _partMatrices: Matrix[] = [];\r\n private _textureSize: Vector2 = new Vector2(0, 0);\r\n private readonly _keepInRam: boolean = false;\r\n\r\n private _delayedTextureUpdate: Nullable<IDelayedTextureUpdate> = null;\r\n private _useRGBACovariants = false;\r\n private _material: Nullable<Material> = null;\r\n\r\n private _tmpCovariances = [0, 0, 0, 0, 0, 0];\r\n private _sortIsDirty = false;\r\n\r\n private static _RowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // Vector3 position, Vector3 scale, 1 u8 quaternion, 1 color with alpha\r\n private static _SH_C0 = 0.28209479177387814;\r\n // batch size between 2 yield calls. This value is a tradeoff between updates overhead and framerate hiccups\r\n // This step is faster the PLY conversion. So batch size can be bigger\r\n private static _SplatBatchSize = 327680;\r\n // batch size between 2 yield calls during the PLY to splat conversion.\r\n private static _PlyConversionBatchSize = 32768;\r\n private _shDegree = 0;\r\n\r\n private static readonly _BatchSize = 16; // 16 splats per instance\r\n private _cameraViewInfos = new Map<number, ICameraViewInfo>();\r\n\r\n private static readonly _DefaultViewUpdateThreshold = 1e-4;\r\n\r\n /**\r\n * Cosine value of the angle threshold to update view dependent splat sorting. Default is 0.0001.\r\n */\r\n public viewUpdateThreshold: number = GaussianSplattingMesh._DefaultViewUpdateThreshold;\r\n\r\n protected _disableDepthSort = false;\r\n /**\r\n * If true, disables depth sorting of the splats (default: false)\r\n */\r\n public get disableDepthSort() {\r\n return this._disableDepthSort;\r\n }\r\n public set disableDepthSort(value: boolean) {\r\n if (!this._disableDepthSort && value) {\r\n this._worker?.terminate();\r\n this._worker = null;\r\n this._disableDepthSort = true;\r\n } else if (this._disableDepthSort && !value) {\r\n this._disableDepthSort = false;\r\n this._sortIsDirty = true;\r\n this._instanciateWorker();\r\n }\r\n }\r\n\r\n /**\r\n * View direction factor used to compute the SH view direction in the shader.\r\n * @deprecated Not used anymore for SH rendering\r\n */\r\n public get viewDirectionFactor() {\r\n return Vector3.OneReadOnly;\r\n }\r\n\r\n /**\r\n * SH degree. 0 = no sh (default). 1 = 3 parameters. 2 = 8 parameters. 3 = 15 parameters.\r\n */\r\n public get shDegree() {\r\n return this._shDegree;\r\n }\r\n\r\n /**\r\n * Number of splats in the mesh\r\n */\r\n public get splatCount() {\r\n return this._splatIndex?.length;\r\n }\r\n\r\n /**\r\n * returns the splats data array buffer that contains in order : postions (3 floats), size (3 floats), color (4 bytes), orientation quaternion (4 bytes)\r\n */\r\n public get splatsData() {\r\n return this._splatsData;\r\n }\r\n\r\n /**\r\n * returns the SH data arrays\r\n */\r\n public get shData() {\r\n return this._shData;\r\n }\r\n\r\n /**\r\n * True when this mesh is a compound that regroups multiple Gaussian splatting parts.\r\n */\r\n public get isCompound() {\r\n return this._partMatrices.length > 0;\r\n }\r\n\r\n /**\r\n * returns the part indices array\r\n */\r\n public get partIndices() {\r\n return this._partIndices;\r\n }\r\n\r\n /**\r\n * Gets the part indices texture, if the mesh is a compound\r\n */\r\n public get partIndicesTexture() {\r\n return this._partIndicesTexture;\r\n }\r\n\r\n /**\r\n * Set the number of batch (a batch is 16384 splats) after which a display update is performed\r\n * A value of 0 (default) means display update will not happens before splat is ready.\r\n */\r\n public static ProgressiveUpdateAmount = 0;\r\n\r\n /**\r\n * Gets the covariancesA texture\r\n */\r\n public get covariancesATexture() {\r\n return this._covariancesATexture;\r\n }\r\n\r\n /**\r\n * Gets the covariancesB texture\r\n */\r\n public get covariancesBTexture() {\r\n return this._covariancesBTexture;\r\n }\r\n\r\n /**\r\n * Gets the centers texture\r\n */\r\n public get centersTexture() {\r\n return this._centersTexture;\r\n }\r\n\r\n /**\r\n * Gets the colors texture\r\n */\r\n public get colorsTexture() {\r\n return this._colorsTexture;\r\n }\r\n\r\n /**\r\n * Gets the SH textures\r\n */\r\n public get shTextures() {\r\n return this._shTextures;\r\n }\r\n\r\n /**\r\n * Gets the kernel size\r\n * Documentation and mathematical explanations here:\r\n * https://github.com/graphdeco-inria/gaussian-splatting/issues/294#issuecomment-1772688093\r\n * https://github.com/autonomousvision/mip-splatting/issues/18#issuecomment-1929388931\r\n */\r\n public get kernelSize() {\r\n return this._material instanceof GaussianSplattingMaterial ? this._material.kernelSize : 0;\r\n }\r\n\r\n /**\r\n * Get the compensation state\r\n */\r\n public get compensation() {\r\n return this._material instanceof GaussianSplattingMaterial ? this._material.compensation : false;\r\n }\r\n\r\n private _loadingPromise: Promise<void> | null = null;\r\n\r\n /**\r\n * set rendering material\r\n */\r\n public override set material(value: Material) {\r\n this._material = value;\r\n this._material.backFaceCulling = false;\r\n this._material.cullBackFaces = false;\r\n value.resetDrawCache();\r\n }\r\n\r\n /**\r\n * get rendering material\r\n */\r\n public override get material(): Nullable<Material> {\r\n return this._material;\r\n }\r\n\r\n private static _MakeSplatGeometryForMesh(mesh: Mesh): void {\r\n const vertexData = new VertexData();\r\n const originPositions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0];\r\n const originIndices = [0, 1, 2, 0, 2, 3];\r\n const positions = [];\r\n const indices = [];\r\n for (let i = 0; i < GaussianSplattingMesh._BatchSize; i++) {\r\n for (let j = 0; j < 12; j++) {\r\n if (j == 2 || j == 5 || j == 8 || j == 11) {\r\n positions.push(i); // local splat index\r\n } else {\r\n positions.push(originPositions[j]);\r\n }\r\n }\r\n indices.push(originIndices.map((v) => v + i * 4));\r\n }\r\n\r\n vertexData.positions = positions;\r\n vertexData.indices = indices.flat();\r\n\r\n vertexData.applyToMesh(mesh);\r\n }\r\n\r\n /**\r\n * Creates a new gaussian splatting mesh\r\n * @param name defines the name of the mesh\r\n * @param url defines the url to load from (optional)\r\n * @param scene defines the hosting scene (optional)\r\n * @param keepInRam keep datas in ram for editing purpose\r\n */\r\n constructor(name: string, url: Nullable<string> = null, scene: Nullable<Scene> = null, keepInRam: boolean = false) {\r\n super(name, scene);\r\n\r\n this.subMeshes = [];\r\n new SubMesh(0, 0, 4 * GaussianSplattingMesh._BatchSize, 0, 6 * GaussianSplattingMesh._BatchSize, this);\r\n\r\n this.setEnabled(false);\r\n // webGL2 and webGPU support for RG texture with float16 is fine. not webGL1\r\n this._useRGBACovariants = !this.getEngine().isWebGPU && this.getEngine().version === 1.0;\r\n\r\n this._keepInRam = keepInRam;\r\n if (url) {\r\n this._loadingPromise = this.loadFileAsync(url);\r\n }\r\n const gaussianSplattingMaterial = new GaussianSplattingMaterial(this.name + \"_material\", this._scene);\r\n gaussianSplattingMaterial.setSourceMesh(this);\r\n this._material = gaussianSplattingMaterial;\r\n\r\n // delete meshes created for cameras on camera removal\r\n this._scene.onCameraRemovedObservable.add((camera: Camera) => {\r\n const cameraId = camera.uniqueId;\r\n // delete mesh for this camera\r\n if (this._cameraViewInfos.has(cameraId)) {\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n cameraViewInfos?.mesh.dispose();\r\n this._cameraViewInfos.delete(cameraId);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get the loading promise when loading the mesh from a URL in the constructor\r\n * @returns constructor loading promise or null if no URL was provided\r\n */\r\n public getLoadingPromise(): Promise<void> | null {\r\n return this._loadingPromise;\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns \"GaussianSplattingMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMesh\";\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices (splats) within the mesh\r\n * @returns the total number of vertices\r\n */\r\n public override getTotalVertices(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns true when ready\r\n */\r\n public override isReady(completeCheck = false): boolean {\r\n if (!super.isReady(completeCheck, true)) {\r\n return false;\r\n }\r\n\r\n if (!this._readyToDisplay) {\r\n // mesh is ready when worker has done at least 1 sorting\r\n this._postToWorker(true);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public _getCameraDirection(camera: Camera): Vector3 {\r\n const cameraViewMatrix = camera.getViewMatrix();\r\n const cameraProjectionMatrix = camera.getProjectionMatrix();\r\n const cameraViewProjectionMatrix = TmpVectors.Matrix[0];\r\n cameraViewMatrix.multiplyToRef(cameraProjectionMatrix, cameraViewProjectionMatrix);\r\n this._viewProjectionMatrix.copyFrom(cameraViewProjectionMatrix);\r\n\r\n const modelViewMatrix = TmpVectors.Matrix[1];\r\n this.getWorldMatrix().multiplyToRef(cameraViewMatrix, modelViewMatrix);\r\n modelViewMatrix.multiplyToRef(cameraProjectionMatrix, this._modelViewProjectionMatrix);\r\n\r\n // return vector used to compute distance to camera\r\n const localDirection = TmpVectors.Vector3[1];\r\n localDirection.set(modelViewMatrix.m[2], modelViewMatrix.m[6], modelViewMatrix.m[10]);\r\n localDirection.normalize();\r\n\r\n return localDirection;\r\n }\r\n\r\n /** @internal */\r\n public _postToWorker(forced = false): void {\r\n const scene = this._scene;\r\n const frameId = scene.getFrameId();\r\n // force update or at least frame update for camera is outdated\r\n let outdated = false;\r\n this._cameraViewInfos.forEach((cameraViewInfos) => {\r\n if (cameraViewInfos.frameIdLastUpdate !== frameId) {\r\n outdated = true;\r\n }\r\n });\r\n\r\n // array of cameras used for rendering\r\n const cameras = this._scene.activeCameras?.length ? this._scene.activeCameras : [this._scene.activeCamera!];\r\n // list view infos for active cameras\r\n const activeViewInfos: ICameraViewInfo[] = [];\r\n cameras.forEach((camera) => {\r\n if (!camera) {\r\n return;\r\n }\r\n const cameraId = camera.uniqueId;\r\n\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n if (cameraViewInfos) {\r\n activeViewInfos.push(cameraViewInfos);\r\n } else {\r\n // mesh doesn't exist yet for this camera\r\n const cameraMesh = new Mesh(this.name + \"_cameraMesh_\" + cameraId, this._scene);\r\n // not visible with inspector or the scene graph\r\n cameraMesh.reservedDataStore = { hidden: true };\r\n cameraMesh.setEnabled(false);\r\n cameraMesh.material = this.material;\r\n GaussianSplattingMesh._MakeSplatGeometryForMesh(cameraMesh);\r\n\r\n const newViewInfos: ICameraViewInfo = {\r\n camera: camera,\r\n cameraDirection: new Vector3(0, 0, 0),\r\n mesh: cameraMesh,\r\n frameIdLastUpdate: frameId,\r\n splatIndexBufferSet: false,\r\n };\r\n activeViewInfos.push(newViewInfos);\r\n this._cameraViewInfos.set(cameraId, newViewInfos);\r\n }\r\n });\r\n // sort view infos by last updated frame id: first item is the least recently updated\r\n activeViewInfos.sort((a, b) => a.frameIdLastUpdate - b.frameIdLastUpdate);\r\n\r\n const hasSortFunction = this._worker || (_native && _native.sortSplats) || this._disableDepthSort;\r\n if ((forced || outdated) && hasSortFunction && (this._scene.activeCameras?.length || this._scene.activeCamera) && this._canPostToWorker) {\r\n // view infos sorted by least recent updated frame id\r\n activeViewInfos.forEach((cameraViewInfos) => {\r\n const camera = cameraViewInfos.camera;\r\n const cameraDirection = this._getCameraDirection(camera);\r\n\r\n const previousCameraDirection = cameraViewInfos.cameraDirection;\r\n const dot = Vector3.Dot(cameraDirection, previousCameraDirection);\r\n if ((forced || Math.abs(dot - 1) >= this.viewUpdateThreshold) && this._canPostToWorker) {\r\n cameraViewInfos.cameraDirection.copyFrom(cameraDirection);\r\n cameraViewInfos.frameIdLastUpdate = frameId;\r\n this._canPostToWorker = false;\r\n if (this._worker) {\r\n this._worker!.postMessage(\r\n {\r\n modelViewProjection: this._modelViewProjectionMatrix.m,\r\n viewProjection: this._viewProjectionMatrix.m,\r\n depthMix: this._depthMix,\r\n cameraId: camera.uniqueId,\r\n },\r\n [this._depthMix.buffer]\r\n );\r\n } else if (_native && _native.sortSplats) {\r\n _native.sortSplats(this._modelViewProjectionMatrix, this._splatPositions!, this._splatIndex!, this._scene.useRightHandedSystem);\r\n if (cameraViewInfos.splatIndexBufferSet) {\r\n cameraViewInfos.mesh.thinInstanceBufferUpdated(\"splatIndex\");\r\n } else {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n cameraViewInfos.splatIndexBufferSet = true;\r\n }\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n }\r\n }\r\n });\r\n } else if (this._disableDepthSort) {\r\n activeViewInfos.forEach((cameraViewInfos) => {\r\n if (!cameraViewInfos.splatIndexBufferSet) {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n cameraViewInfos.splatIndexBufferSet = true;\r\n }\r\n });\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n }\r\n }\r\n /**\r\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\r\n * @param subMesh defines the subMesh to render\r\n * @param enableAlphaMode defines if alpha mode can be changed\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\r\n * @returns the current mesh\r\n */\r\n public override render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh {\r\n this._postToWorker();\r\n\r\n // geometry used for shadows, bind the first found in the camera view infos\r\n if (!this._geometry && this._cameraViewInfos.size) {\r\n this._geometry = this._cameraViewInfos.values().next().value.mesh.geometry;\r\n }\r\n\r\n const cameraId = this._scene.activeCamera!.uniqueId;\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n if (!cameraViewInfos || !cameraViewInfos.splatIndexBufferSet) {\r\n return this;\r\n }\r\n\r\n const mesh = cameraViewInfos.mesh;\r\n mesh.getWorldMatrix().copyFrom(this.getWorldMatrix());\r\n return mesh.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n\r\n private static _TypeNameToEnum(name: string): PLYType {\r\n switch (name) {\r\n case \"float\":\r\n return PLYType.FLOAT;\r\n case \"int\":\r\n return PLYType.INT;\r\n case \"uint\":\r\n return PLYType.UINT;\r\n case \"double\":\r\n return PLYType.DOUBLE;\r\n case \"uchar\":\r\n return PLYType.UCHAR;\r\n }\r\n return PLYType.UNDEFINED;\r\n }\r\n\r\n private static _ValueNameToEnum(name: string): PLYValue {\r\n switch (name) {\r\n case \"min_x\":\r\n return PLYValue.MIN_X;\r\n case \"min_y\":\r\n return PLYValue.MIN_Y;\r\n case \"min_z\":\r\n return PLYValue.MIN_Z;\r\n case \"max_x\":\r\n return PLYValue.MAX_X;\r\n case \"max_y\":\r\n return PLYValue.MAX_Y;\r\n case \"max_z\":\r\n return PLYValue.MAX_Z;\r\n case \"min_scale_x\":\r\n return PLYValue.MIN_SCALE_X;\r\n case \"min_scale_y\":\r\n return PLYValue.MIN_SCALE_Y;\r\n case \"min_scale_z\":\r\n return PLYValue.MIN_SCALE_Z;\r\n case \"max_scale_x\":\r\n return PLYValue.MAX_SCALE_X;\r\n case \"max_scale_y\":\r\n return PLYValue.MAX_SCALE_Y;\r\n case \"max_scale_z\":\r\n return PLYValue.MAX_SCALE_Z;\r\n case \"packed_position\":\r\n return PLYValue.PACKED_POSITION;\r\n case \"packed_rotation\":\r\n return PLYValue.PACKED_ROTATION;\r\n case \"packed_scale\":\r\n return PLYValue.PACKED_SCALE;\r\n case \"packed_color\":\r\n return PLYValue.PACKED_COLOR;\r\n case \"x\":\r\n return PLYValue.X;\r\n case \"y\":\r\n return PLYValue.Y;\r\n case \"z\":\r\n return PLYValue.Z;\r\n case \"scale_0\":\r\n return PLYValue.SCALE_0;\r\n case \"scale_1\":\r\n return PLYValue.SCALE_1;\r\n case \"scale_2\":\r\n return PLYValue.SCALE_2;\r\n case \"diffuse_red\":\r\n case \"red\":\r\n return PLYValue.DIFFUSE_RED;\r\n case \"diffuse_green\":\r\n case \"green\":\r\n return PLYValue.DIFFUSE_GREEN;\r\n case \"diffuse_blue\":\r\n case \"blue\":\r\n return PLYValue.DIFFUSE_BLUE;\r\n case \"f_dc_0\":\r\n return PLYValue.F_DC_0;\r\n case \"f_dc_1\":\r\n return PLYValue.F_DC_1;\r\n case \"f_dc_2\":\r\n return PLYValue.F_DC_2;\r\n case \"f_dc_3\":\r\n return PLYValue.F_DC_3;\r\n case \"opacity\":\r\n return PLYValue.OPACITY;\r\n case \"rot_0\":\r\n return PLYValue.ROT_0;\r\n case \"rot_1\":\r\n return PLYValue.ROT_1;\r\n case \"rot_2\":\r\n return PLYValue.ROT_2;\r\n case \"rot_3\":\r\n return PLYValue.ROT_3;\r\n case \"min_r\":\r\n return PLYValue.MIN_COLOR_R;\r\n case \"min_g\":\r\n return PLYValue.MIN_COLOR_G;\r\n case \"min_b\":\r\n return PLYValue.MIN_COLOR_B;\r\n case \"max_r\":\r\n return PLYValue.MAX_COLOR_R;\r\n case \"max_g\":\r\n return PLYValue.MAX_COLOR_G;\r\n case \"max_b\":\r\n return PLYValue.MAX_COLOR_B;\r\n case \"f_rest_0\":\r\n return PLYValue.SH_0;\r\n case \"f_rest_1\":\r\n return PLYValue.SH_1;\r\n case \"f_rest_2\":\r\n return PLYValue.SH_2;\r\n case \"f_rest_3\":\r\n return PLYValue.SH_3;\r\n case \"f_rest_4\":\r\n return PLYValue.SH_4;\r\n case \"f_rest_5\":\r\n return PLYValue.SH_5;\r\n case \"f_rest_6\":\r\n return PLYValue.SH_6;\r\n case \"f_rest_7\":\r\n return PLYValue.SH_7;\r\n case \"f_rest_8\":\r\n return PLYValue.SH_8;\r\n case \"f_rest_9\":\r\n return PLYValue.SH_9;\r\n case \"f_rest_10\":\r\n return PLYValue.SH_10;\r\n case \"f_rest_11\":\r\n return PLYValue.SH_11;\r\n case \"f_rest_12\":\r\n return PLYValue.SH_12;\r\n case \"f_rest_13\":\r\n return PLYValue.SH_13;\r\n case \"f_rest_14\":\r\n return PLYValue.SH_14;\r\n case \"f_rest_15\":\r\n return PLYValue.SH_15;\r\n case \"f_rest_16\":\r\n return PLYValue.SH_16;\r\n case \"f_rest_17\":\r\n return PLYValue.SH_17;\r\n case \"f_rest_18\":\r\n return PLYValue.SH_18;\r\n case \"f_rest_19\":\r\n return PLYValue.SH_19;\r\n case \"f_rest_20\":\r\n return PLYValue.SH_20;\r\n case \"f_rest_21\":\r\n return PLYValue.SH_21;\r\n case \"f_rest_22\":\r\n return PLYValue.SH_22;\r\n case \"f_rest_23\":\r\n return PLYValue.SH_23;\r\n case \"f_rest_24\":\r\n return PLYValue.SH_24;\r\n case \"f_rest_25\":\r\n return PLYValue.SH_25;\r\n case \"f_rest_26\":\r\n return PLYValue.SH_26;\r\n case \"f_rest_27\":\r\n return PLYValue.SH_27;\r\n case \"f_rest_28\":\r\n return PLYValue.SH_28;\r\n case \"f_rest_29\":\r\n return PLYValue.SH_29;\r\n case \"f_rest_30\":\r\n return PLYValue.SH_30;\r\n case \"f_rest_31\":\r\n return PLYValue.SH_31;\r\n case \"f_rest_32\":\r\n return PLYValue.SH_32;\r\n case \"f_rest_33\":\r\n return PLYValue.SH_33;\r\n case \"f_rest_34\":\r\n return PLYValue.SH_34;\r\n case \"f_rest_35\":\r\n return PLYValue.SH_35;\r\n case \"f_rest_36\":\r\n return PLYValue.SH_36;\r\n case \"f_rest_37\":\r\n return PLYValue.SH_37;\r\n case \"f_rest_38\":\r\n return PLYValue.SH_38;\r\n case \"f_rest_39\":\r\n return PLYValue.SH_39;\r\n case \"f_rest_40\":\r\n return PLYValue.SH_40;\r\n case \"f_rest_41\":\r\n return PLYValue.SH_41;\r\n case \"f_rest_42\":\r\n return PLYValue.SH_42;\r\n case \"f_rest_43\":\r\n return PLYValue.SH_43;\r\n case \"f_rest_44\":\r\n return PLYValue.SH_44;\r\n }\r\n\r\n return PLYValue.UNDEFINED;\r\n }\r\n /**\r\n * Parse a PLY file header and returns metas infos on splats and chunks\r\n * @param data the loaded buffer\r\n * @returns a PLYHeader\r\n */\r\n static ParseHeader(data: ArrayBuffer): PLYHeader | null {\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 null;\r\n }\r\n const vertexCount = parseInt(/element vertex (\\d+)\\n/.exec(header)![1]);\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 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 const enum ElementMode {\r\n Vertex = 0,\r\n Chunk = 1,\r\n SH = 2,\r\n Unused = 3,\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 let shDegree = 0;\r\n for (const prop of filtered) {\r\n if (prop.startsWith(\"property \")) {\r\n const [, typeName, name] = prop.split(\" \");\r\n\r\n const value = GaussianSplattingMesh._ValueNameToEnum(name);\r\n if (value != PLYValue.UNDEFINED) {\r\n // SH degree 1,2 or 3 for 9, 24 or 45 values\r\n if (value >= PLYValue.SH_44) {\r\n shDegree = 3;\r\n } else if (value >= PLYValue.SH_24) {\r\n shDegree = Math.max(shDegree, 2);\r\n } else if (value >= PLYValue.SH_8) {\r\n shDegree = Math.max(shDegree, 1);\r\n }\r\n }\r\n const type = GaussianSplattingMesh._TypeNameToEnum(typeName);\r\n if (chunkMode == ElementMode.Chunk) {\r\n chunkProperties.push({ value, type, offset: rowChunkOffset });\r\n rowChunkOffset += offsets[typeName];\r\n } else if (chunkMode == ElementMode.Vertex) {\r\n vertexProperties.push({ value, type, offset: rowVertexOffset });\r\n rowVertexOffset += offsets[typeName];\r\n } else if (chunkMode == ElementMode.SH) {\r\n // SH doesn't count for vertex row size but its properties are used to retrieve SH\r\n vertexProperties.push({ value, type, offset: rowVertexOffset });\r\n }\r\n\r\n if (!offsets[typeName]) {\r\n Logger.Warn(`Unsupported property type: ${typeName}.`);\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 {\r\n chunkMode = ElementMode.Unused;\r\n }\r\n }\r\n }\r\n\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n const buffer = new ArrayBuffer(GaussianSplattingMesh._RowOutputLength * vertexCount);\r\n\r\n let shBuffer = null;\r\n let shCoefficientCount = 0;\r\n if (shDegree) {\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\r\n shCoefficientCount = shVectorCount * 3;\r\n shBuffer = new ArrayBuffer(shCoefficientCount * vertexCount);\r\n }\r\n\r\n return {\r\n vertexCount: vertexCount,\r\n chunkCount: chunkCount,\r\n rowVertexLength: rowVertexOffset,\r\n rowChunkLength: rowChunkOffset,\r\n vertexProperties: vertexProperties,\r\n chunkProperties: chunkProperties,\r\n dataView: dataView,\r\n buffer: buffer,\r\n shDegree: shDegree,\r\n shCoefficientCount: shCoefficientCount,\r\n shBuffer: shBuffer,\r\n };\r\n }\r\n private static _GetCompressedChunks(header: PLYHeader, offset: { value: number }): Array<ICompressedPLYChunk> | null {\r\n if (!header.chunkCount) {\r\n return null;\r\n }\r\n const dataView = header.dataView;\r\n const compressedChunks = new Array<ICompressedPLYChunk>(header.chunkCount);\r\n for (let i = 0; i < header.chunkCount; i++) {\r\n const currentChunk = {\r\n min: new Vector3(),\r\n max: new Vector3(),\r\n minScale: new Vector3(),\r\n maxScale: new Vector3(),\r\n minColor: new Vector3(0, 0, 0),\r\n maxColor: new Vector3(1, 1, 1),\r\n };\r\n compressedChunks[i] = currentChunk;\r\n for (let propertyIndex = 0; propertyIndex < header.chunkProperties.length; propertyIndex++) {\r\n const property = header.chunkProperties[propertyIndex];\r\n let value;\r\n switch (property.type) {\r\n case PLYType.FLOAT:\r\n value = dataView.getFloat32(property.offset + offset.value, true);\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n switch (property.value) {\r\n case PLYValue.MIN_X:\r\n currentChunk.min.x = value;\r\n break;\r\n case PLYValue.MIN_Y:\r\n currentChunk.min.y = value;\r\n break;\r\n case PLYValue.MIN_Z:\r\n currentChunk.min.z = value;\r\n break;\r\n case PLYValue.MAX_X:\r\n currentChunk.max.x = value;\r\n break;\r\n case PLYValue.MAX_Y:\r\n currentChunk.max.y = value;\r\n break;\r\n case PLYValue.MAX_Z:\r\n currentChunk.max.z = value;\r\n break;\r\n case PLYValue.MIN_SCALE_X:\r\n currentChunk.minScale.x = value;\r\n break;\r\n case PLYValue.MIN_SCALE_Y:\r\n currentChunk.minScale.y = value;\r\n break;\r\n case PLYValue.MIN_SCALE_Z:\r\n currentChunk.minScale.z = value;\r\n break;\r\n case PLYValue.MAX_SCALE_X:\r\n currentChunk.maxScale.x = value;\r\n break;\r\n case PLYValue.MAX_SCALE_Y:\r\n currentChunk.maxScale.y = value;\r\n break;\r\n case PLYValue.MAX_SCALE_Z:\r\n currentChunk.maxScale.z = value;\r\n break;\r\n case PLYValue.MIN_COLOR_R:\r\n currentChunk.minColor.x = value;\r\n break;\r\n case PLYValue.MIN_COLOR_G:\r\n currentChunk.minColor.y = value;\r\n break;\r\n case PLYValue.MIN_COLOR_B:\r\n currentChunk.minColor.z = value;\r\n break;\r\n case PLYValue.MAX_COLOR_R:\r\n currentChunk.maxColor.x = value;\r\n break;\r\n case PLYValue.MAX_COLOR_G:\r\n currentChunk.maxColor.y = value;\r\n break;\r\n case PLYValue.MAX_COLOR_B:\r\n currentChunk.maxColor.z = value;\r\n break;\r\n }\r\n }\r\n offset.value += header.rowChunkLength;\r\n }\r\n return compressedChunks;\r\n }\r\n\r\n private static _GetSplat(header: PLYHeader, index: number, compressedChunks: Array<ICompressedPLYChunk> | null, offset: { value: number }): void {\r\n const q = TmpVectors.Quaternion[0];\r\n const temp3 = TmpVectors.Vector3[0];\r\n\r\n const rowOutputLength = GaussianSplattingMesh._RowOutputLength;\r\n const buffer = header.buffer;\r\n const dataView = header.dataView;\r\n const position = new Float32Array(buffer, index * rowOutputLength, 3);\r\n const scale = new Float32Array(buffer, index * rowOutputLength + 12, 3);\r\n const rgba = new Uint8ClampedArray(buffer, index * rowOutputLength + 24, 4);\r\n const rot = new Uint8ClampedArray(buffer, index * rowOutputLength + 28, 4);\r\n let sh = null;\r\n if (header.shBuffer) {\r\n sh = new Uint8ClampedArray(header.shBuffer, index * header.shCoefficientCount, header.shCoefficientCount);\r\n }\r\n const chunkIndex = index >> 8;\r\n let r0: number = 255;\r\n let r1: number = 0;\r\n let r2: number = 0;\r\n let r3: number = 0;\r\n\r\n const plySH = [];\r\n\r\n for (let propertyIndex = 0; propertyIndex < header.vertexProperties.length; propertyIndex++) {\r\n const property = header.vertexProperties[propertyIndex];\r\n let value;\r\n switch (property.type) {\r\n case PLYType.FLOAT:\r\n value = dataView.getFloat32(offset.value + property.offset, true);\r\n break;\r\n case PLYType.INT:\r\n value = dataView.getInt32(offset.value + property.offset, true);\r\n break;\r\n case PLYType.UINT:\r\n value = dataView.getUint32(offset.value + property.offset, true);\r\n break;\r\n case PLYType.DOUBLE:\r\n value = dataView.getFloat64(offset.value + property.offset, true);\r\n break;\r\n case PLYType.UCHAR:\r\n value = dataView.getUint8(offset.value + property.offset);\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n switch (property.value) {\r\n case PLYValue.PACKED_POSITION:\r\n {\r\n const compressedChunk = compressedChunks![chunkIndex];\r\n Unpack111011(value, temp3);\r\n position[0] = Scalar.Lerp(compressedChunk.min.x, compressedChunk.max.x, temp3.x);\r\n position[1] = Scalar.Lerp(compressedChunk.min.y, compressedChunk.max.y, temp3.y);\r\n position[2] = Scalar.Lerp(compressedChunk.min.z, compressedChunk.max.z, temp3.z);\r\n }\r\n break;\r\n case PLYValue.PACKED_ROTATION:\r\n {\r\n UnpackRot(value, q);\r\n\r\n r0 = q.x;\r\n r1 = q.y;\r\n r2 = q.z;\r\n r3 = q.w;\r\n }\r\n break;\r\n case PLYValue.PACKED_SCALE:\r\n {\r\n const compressedChunk = compressedChunks![chunkIndex];\r\n Unpack111011(value, temp3);\r\n scale[0] = Math.exp(Scalar.Lerp(compressedChunk.minScale.x, compressedChunk.maxScale.x, temp3.x));\r\n scale[1] = Math.exp(Scalar.Lerp(compressedChunk.minScale.y, compressedChunk.maxScale.y, temp3.y));\r\n scale[2] = Math.exp(Scalar.Lerp(compressedChunk.minScale.z, compressedChunk.maxScale.z, temp3.z));\r\n }\r\n break;\r\n case PLYValue.PACKED_COLOR:\r\n {\r\n const compressedChunk = compressedChunks![chunkIndex];\r\n Unpack8888(value, rgba);\r\n rgba[0] = Scalar.Lerp(compressedChunk.minColor.x, compressedChunk.maxColor.x, rgba[0] / 255) * 255;\r\n rgba[1] = Scalar.Lerp(compressedChunk.minColor.y, compressedChunk.maxColor.y, rgba[1] / 255) * 255;\r\n rgba[2] = Scalar.Lerp(compressedChunk.minColor.z, compressedChunk.maxColor.z, rgba[2] / 255) * 255;\r\n }\r\n break;\r\n case PLYValue.X:\r\n position[0] = value;\r\n break;\r\n case PLYValue.Y:\r\n position[1] = value;\r\n break;\r\n case PLYValue.Z:\r\n position[2] = value;\r\n break;\r\n case PLYValue.SCALE_0:\r\n scale[0] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_1:\r\n scale[1] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_2:\r\n scale[2] = Math.exp(value);\r\n break;\r\n case PLYValue.DIFFUSE_RED:\r\n rgba[0] = value;\r\n break;\r\n case PLYValue.DIFFUSE_GREEN:\r\n rgba[1] = value;\r\n break;\r\n case PLYValue.DIFFUSE_BLUE:\r\n rgba[2] = value;\r\n break;\r\n case PLYValue.F_DC_0:\r\n rgba[0] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_1:\r\n rgba[1] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_2:\r\n rgba[2] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_3:\r\n rgba[3] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.OPACITY:\r\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\r\n break;\r\n case PLYValue.ROT_0:\r\n r0 = value;\r\n break;\r\n case PLYValue.ROT_1:\r\n r1 = value;\r\n break;\r\n case PLYValue.ROT_2:\r\n r2 = value;\r\n break;\r\n case PLYValue.ROT_3:\r\n r3 = value;\r\n break;\r\n }\r\n if (sh && property.value >= PLYValue.SH_0 && property.value <= PLYValue.SH_44) {\r\n const shIndex = property.value - PLYValue.SH_0;\r\n if (property.type == PLYType.UCHAR && header.chunkCount) {\r\n // compressed ply. dataView points to beginning of vertex\r\n // could be improved with a direct copy instead of a per SH index computation + copy\r\n const compressedValue = dataView.getUint8(\r\n header.rowChunkLength * header.chunkCount + header.vertexCount * header.rowVertexLength + index * header.shCoefficientCount + shIndex\r\n );\r\n // compressed .ply SH import : https://github.com/playcanvas/engine/blob/fda3f0368b45d7381f0b5a1722bd2056128eaebe/src/scene/gsplat/gsplat-compressed-data.js#L88C81-L88C98\r\n plySH[shIndex] = (compressedValue * (8 / 255) - 4) * 127.5 + 127.5;\r\n } else {\r\n const clampedValue = Scalar.Clamp(value * 127.5 + 127.5, 0, 255);\r\n plySH[shIndex] = clampedValue;\r\n }\r\n }\r\n }\r\n\r\n if (sh) {\r\n const shDim = header.shDegree == 1 ? 3 : header.shDegree == 2 ? 8 : 15;\r\n for (let j = 0; j < shDim; j++) {\r\n sh[j * 3 + 0] = plySH[j];\r\n sh[j * 3 + 1] = plySH[j + shDim];\r\n sh[j * 3 + 2] = plySH[j + shDim * 2];\r\n }\r\n }\r\n\r\n q.set(r1, r2, r3, r0);\r\n q.normalize();\r\n rot[0] = q.w * 127.5 + 127.5;\r\n rot[1] = q.x * 127.5 + 127.5;\r\n rot[2] = q.y * 127.5 + 127.5;\r\n rot[3] = q.z * 127.5 + 127.5;\r\n offset.value += header.rowVertexLength;\r\n }\r\n\r\n /**\r\n * Converts a .ply data with SH coefficients 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 * @param useCoroutine use coroutine and yield\r\n * @returns the loaded splat buffer and optional array of sh coefficients\r\n */\r\n public static *ConvertPLYWithSHToSplat(data: ArrayBuffer, useCoroutine = false) {\r\n const header = GaussianSplattingMesh.ParseHeader(data);\r\n if (!header) {\r\n return { buffer: data };\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMesh._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMesh._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMesh._PlyConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n let sh = null;\r\n // make SH texture buffers\r\n if (header.shDegree && header.shBuffer) {\r\n const textureCount = Math.ceil(header.shCoefficientCount / 16); // 4 components can be stored per texture, 4 sh per component\r\n let shIndexRead = 0;\r\n const ubuf = new Uint8Array(header.shBuffer);\r\n\r\n // sh is an array of uint8array that will be used to create sh textures\r\n sh = [];\r\n\r\n const splatCount = header.vertexCount;\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (engine) {\r\n const width = engine.getCaps().maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n // create array for the number of textures needed.\r\n for (let textureIndex = 0; textureIndex < textureCount; textureIndex++) {\r\n const texture = new Uint8Array(height * width * 4 * 4); // 4 components per texture, 4 sh per component\r\n sh.push(texture);\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n for (let shIndexWrite = 0; shIndexWrite < header.shCoefficientCount; shIndexWrite++) {\r\n const shValue = ubuf[shIndexRead++];\r\n\r\n const textureIndex = Math.floor(shIndexWrite / 16);\r\n const shArray = sh[textureIndex];\r\n\r\n const byteIndexInTexture = shIndexWrite % 16; // [0..15]\r\n const offsetPerSplat = i * 16; // 16 sh values per texture per splat.\r\n shArray[byteIndexInTexture + offsetPerSplat] = shValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { buffer: header.buffer, sh: sh };\r\n }\r\n\r\n /**\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 * @param useCoroutine use coroutine and yield\r\n * @returns the loaded splat buffer without SH coefficient, whether ply contains or not SH.\r\n */\r\n public static *ConvertPLYToSplat(data: ArrayBuffer, useCoroutine = false) {\r\n const header = GaussianSplattingMesh.ParseHeader(data);\r\n if (!header) {\r\n return data;\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMesh._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMesh._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMesh._PlyConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n return header.buffer;\r\n }\r\n\r\n /**\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 public static async ConvertPLYToSplatAsync(data: ArrayBuffer) {\r\n return await runCoroutineAsync(GaussianSplattingMesh.ConvertPLYToSplat(data, true), createYieldingScheduler());\r\n }\r\n\r\n /**\r\n * Converts a .ply with SH 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 with SH\r\n */\r\n public static async ConvertPLYWithSHToSplatAsync(data: ArrayBuffer) {\r\n return await runCoroutineAsync(GaussianSplattingMesh.ConvertPLYWithSHToSplat(data, true), createYieldingScheduler());\r\n }\r\n /**\r\n * Loads a .splat Gaussian Splatting array buffer asynchronously\r\n * @param data arraybuffer containing splat file\r\n * @returns a promise that resolves when the operation is complete\r\n */\r\n\r\n public async loadDataAsync(data: ArrayBuffer): Promise<void> {\r\n return await this.updateDataAsync(data);\r\n }\r\n\r\n /**\r\n * Loads a Gaussian or Splatting file asynchronously\r\n * @param url path to the splat file to load\r\n * @param scene optional scene it belongs to\r\n * @returns a promise that resolves when the operation is complete\r\n * @deprecated Please use SceneLoader.ImportMeshAsync instead\r\n */\r\n public async loadFileAsync(url: string, scene?: Scene): Promise<void> {\r\n await ImportMeshAsync(url, (scene || EngineStore.LastCreatedScene)!, { pluginOptions: { splat: { gaussianSplattingMesh: this } } });\r\n }\r\n\r\n /**\r\n * Releases resources associated with this mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n */\r\n public override dispose(doNotRecurse?: boolean): void {\r\n this._covariancesATexture?.dispose();\r\n this._covariancesBTexture?.dispose();\r\n this._centersTexture?.dispose();\r\n this._colorsTexture?.dispose();\r\n if (this._shTextures) {\r\n for (const shTexture of this._shTextures) {\r\n shTexture.dispose();\r\n }\r\n }\r\n if (this._partIndicesTexture) {\r\n this._partIndicesTexture.dispose();\r\n }\r\n\r\n this._covariancesATexture = null;\r\n this._covariancesBTexture = null;\r\n this._centersTexture = null;\r\n this._colorsTexture = null;\r\n this._shTextures = null;\r\n this._partIndicesTexture = null;\r\n this._partMatrices = [];\r\n\r\n this._worker?.terminate();\r\n this._worker = null;\r\n\r\n // delete meshes created for each camera\r\n this._cameraViewInfos.forEach((cameraViewInfo) => {\r\n cameraViewInfo.mesh.dispose();\r\n });\r\n\r\n super.dispose(doNotRecurse, true);\r\n }\r\n\r\n private _copyTextures(source: GaussianSplattingMesh): void {\r\n this._covariancesATexture = source.covariancesATexture?.clone()!;\r\n this._covariancesBTexture = source.covariancesBTexture?.clone()!;\r\n this._centersTexture = source.centersTexture?.clone()!;\r\n this._colorsTexture = source.colorsTexture?.clone()!;\r\n this._partIndicesTexture = source._partIndicesTexture?.clone()!;\r\n if (source._shTextures) {\r\n this._shTextures = [];\r\n for (const shTexture of source._shTextures) {\r\n this._shTextures?.push(shTexture.clone()!);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns a new Mesh object generated from the current mesh properties.\r\n * @param name is a string, the name given to the new mesh\r\n * @returns a new Gaussian Splatting Mesh\r\n */\r\n public override clone(name: string = \"\"): GaussianSplattingMesh {\r\n const newGS = new GaussianSplattingMesh(name, undefined, this.getScene());\r\n newGS._copySource(this);\r\n newGS.makeGeometryUnique();\r\n newGS._vertexCount = this._vertexCount;\r\n newGS._copyTextures(this);\r\n newGS._modelViewProjectionMatrix = Matrix.Identity();\r\n newGS._viewProjectionMatrix = Matrix.Identity();\r\n newGS._splatPositions = this._splatPositions;\r\n newGS._readyToDisplay = false;\r\n newGS._disableDepthSort = this._disableDepthSort;\r\n newGS._partMatrices = this._partMatrices.map((m) => m.clone());\r\n newGS._instanciateWorker();\r\n\r\n const binfo = this.getBoundingInfo();\r\n newGS.getBoundingInfo().reConstruct(binfo.minimum, binfo.maximum, this.getWorldMatrix());\r\n\r\n newGS.forcedInstanceCount = this.forcedInstanceCount;\r\n newGS.setEnabled(true);\r\n return newGS;\r\n }\r\n\r\n private static _CreateWorker = function (self: Worker) {\r\n let positions: Float32Array;\r\n let depthMix: BigInt64Array;\r\n let indices: Uint32Array;\r\n let floatMix: Float32Array;\r\n let partIndices: Uint8Array;\r\n let partMatrices: Float32Array[];\r\n\r\n function multiplyMatrices(matrix1: Float32Array, matrix2: Float32Array): Float32Array {\r\n const result = new Float32Array(16);\r\n for (let i = 0; i < 4; i++) {\r\n for (let j = 0; j < 4; j++) {\r\n for (let k = 0; k < 4; k++) {\r\n result[j * 4 + i] += matrix1[k * 4 + i] * matrix2[j * 4 + k];\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n self.onmessage = (e: any) => {\r\n // updated on init\r\n if (e.data.positions) {\r\n positions = e.data.positions;\r\n }\r\n // update on rig node changed\r\n else if (e.data.partMatrices) {\r\n partMatrices = e.data.partMatrices;\r\n }\r\n // update on rig node indices changed\r\n else if (e.data.partIndices !== undefined) {\r\n partIndices = e.data.partIndices;\r\n }\r\n // update on view changed\r\n else {\r\n const cameraId = e.data.cameraId;\r\n const globalModelViewProjection = e.data.modelViewProjection;\r\n const viewProjection = e.data.viewProjection;\r\n\r\n const vertexCountPadded = (positions.length / 4 + 15) & ~0xf;\r\n if (!positions || !globalModelViewProjection) {\r\n // Sanity check, it shouldn't happen!\r\n throw new Error(\"positions or modelViewProjection matrix is not defined!\");\r\n }\r\n\r\n depthMix = e.data.depthMix;\r\n indices = new Uint32Array(depthMix.buffer);\r\n floatMix = new Float32Array(depthMix.buffer);\r\n\r\n // Sort\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n indices[2 * j] = j;\r\n }\r\n\r\n let depthFactor = -1;\r\n if (e.data.useRightHandedSystem) {\r\n depthFactor = 1;\r\n }\r\n\r\n if (partMatrices && partIndices) {\r\n // If there are rig node matrices, we use them instead of the global model view proj\r\n\r\n // Precompute modelViewProj for each rig node\r\n const modelViewProjs = partMatrices.map((model) => multiplyMatrices(viewProjection, model));\r\n\r\n // NB: For performance reasons, we assume that part indices are valid\r\n const length = partIndices.length;\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n // NB: We need this 'min' because vertex array is padded, not partIndices\r\n const partIndex = partIndices[Math.min(j, length - 1)];\r\n const mvp = modelViewProjs[partIndex];\r\n floatMix[2 * j + 1] = 10000 + (mvp[2] * positions[4 * j + 0] + mvp[6] * positions[4 * j + 1] + mvp[10] * positions[4 * j + 2] + mvp[14]) * depthFactor;\r\n }\r\n } else {\r\n // If there are no rig node matrices, we use the global model view proj\r\n const mvp = globalModelViewProjection;\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n floatMix[2 * j + 1] = 10000 + (mvp[2] * positions[4 * j + 0] + mvp[6] * positions[4 * j + 1] + mvp[10] * positions[4 * j + 2] + mvp[14]) * depthFactor;\r\n }\r\n }\r\n\r\n depthMix.sort();\r\n\r\n self.postMessage({ depthMix, cameraId }, [depthMix.buffer]);\r\n }\r\n };\r\n };\r\n\r\n private _makeEmptySplat(index: number, covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array): void {\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n this._splatPositions![4 * index + 0] = 0;\r\n this._splatPositions![4 * index + 1] = 0;\r\n this._splatPositions![4 * index + 2] = 0;\r\n\r\n covA[index * 4 + 0] = ToHalfFloat(0);\r\n covA[index * 4 + 1] = ToHalfFloat(0);\r\n covA[index * 4 + 2] = ToHalfFloat(0);\r\n covA[index * 4 + 3] = ToHalfFloat(0);\r\n covB[index * covBSItemSize + 0] = ToHalfFloat(0);\r\n covB[index * covBSItemSize + 1] = ToHalfFloat(0);\r\n colorArray[index * 4 + 3] = 0;\r\n }\r\n\r\n private _makeSplat(\r\n index: number,\r\n fBuffer: Float32Array,\r\n uBuffer: Uint8Array,\r\n covA: Uint16Array,\r\n covB: Uint16Array,\r\n colorArray: Uint8Array,\r\n minimum: Vector3,\r\n maximum: Vector3,\r\n options: IUpdateOptions\r\n ): void {\r\n const matrixRotation = TmpVectors.Matrix[0];\r\n const matrixScale = TmpVectors.Matrix[1];\r\n const quaternion = TmpVectors.Quaternion[0];\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n\r\n const x = fBuffer[8 * index + 0];\r\n const y = fBuffer[8 * index + 1] * (options.flipY ? -1 : 1);\r\n const z = fBuffer[8 * index + 2];\r\n\r\n this._splatPositions![4 * index + 0] = x;\r\n this._splatPositions![4 * index + 1] = y;\r\n this._splatPositions![4 * index + 2] = z;\r\n\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n\r\n quaternion.set(\r\n (uBuffer[32 * index + 28 + 1] - 127.5) / 127.5,\r\n (uBuffer[32 * index + 28 + 2] - 127.5) / 127.5,\r\n (uBuffer[32 * index + 28 + 3] - 127.5) / 127.5,\r\n -(uBuffer[32 * index + 28 + 0] - 127.5) / 127.5\r\n );\r\n quaternion.normalize();\r\n quaternion.toRotationMatrix(matrixRotation);\r\n\r\n Matrix.ScalingToRef(fBuffer[8 * index + 3 + 0] * 2, fBuffer[8 * index + 3 + 1] * 2, fBuffer[8 * index + 3 + 2] * 2, matrixScale);\r\n\r\n const m = matrixRotation.multiplyToRef(matrixScale, TmpVectors.Matrix[0]).m;\r\n\r\n const covariances = this._tmpCovariances;\r\n covariances[0] = m[0] * m[0] + m[1] * m[1] + m[2] * m[2];\r\n covariances[1] = m[0] * m[4] + m[1] * m[5] + m[2] * m[6];\r\n covariances[2] = m[0] * m[8] + m[1] * m[9] + m[2] * m[10];\r\n covariances[3] = m[4] * m[4] + m[5] * m[5] + m[6] * m[6];\r\n covariances[4] = m[4] * m[8] + m[5] * m[9] + m[6] * m[10];\r\n covariances[5] = m[8] * m[8] + m[9] * m[9] + m[10] * m[10];\r\n\r\n // normalize covA, covB\r\n let factor = -10000;\r\n for (let covIndex = 0; covIndex < 6; covIndex++) {\r\n factor = Math.max(factor, Math.abs(covariances[covIndex]));\r\n }\r\n\r\n this._splatPositions![4 * index + 3] = factor;\r\n const transform = factor;\r\n\r\n covA[index * 4 + 0] = ToHalfFloat(covariances[0] / transform);\r\n covA[index * 4 + 1] = ToHalfFloat(covariances[1] / transform);\r\n covA[index * 4 + 2] = ToHalfFloat(covariances[2] / transform);\r\n covA[index * 4 + 3] = ToHalfFloat(covariances[3] / transform);\r\n covB[index * covBSItemSize + 0] = ToHalfFloat(covariances[4] / transform);\r\n covB[index * covBSItemSize + 1] = ToHalfFloat(covariances[5] / transform);\r\n\r\n // colors\r\n colorArray[index * 4 + 0] = uBuffer[32 * index + 24 + 0];\r\n colorArray[index * 4 + 1] = uBuffer[32 * index + 24 + 1];\r\n colorArray[index * 4 + 2] = uBuffer[32 * index + 24 + 2];\r\n colorArray[index * 4 + 3] = uBuffer[32 * index + 24 + 3];\r\n }\r\n\r\n // NB: partIndices is assumed to be padded to a round texture size\r\n private _updateTextures(covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, sh?: Uint8Array[], partIndices?: Uint8Array): void {\r\n const textureSize = this._getTextureSize(this._vertexCount);\r\n // Update the textures\r\n const createTextureFromData = (data: Float32Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_FLOAT);\r\n };\r\n\r\n const createTextureFromDataU8 = (data: Uint8Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_UNSIGNED_BYTE);\r\n };\r\n\r\n const createTextureFromDataU32 = (data: Uint32Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTURETYPE_UNSIGNED_INTEGER);\r\n };\r\n\r\n const createTextureFromDataF16 = (data: Uint16Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_HALF_FLOAT);\r\n };\r\n\r\n const firstTime = this._covariancesATexture === null;\r\n const textureSizeChanged = this._textureSize.y < textureSize.y;\r\n\r\n if (!firstTime && !textureSizeChanged) {\r\n this._delayedTextureUpdate = { covA, covB, colors: colorArray, centers: this._splatPositions!, sh, partIndices };\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const vertexCount = this._vertexCount;\r\n if (this._worker) {\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n }\r\n\r\n // Handle SH textures in update path - create if they don't exist\r\n if (sh && !this._shTextures) {\r\n this._shTextures = [];\r\n for (const shData of sh) {\r\n const buffer = new Uint32Array(shData.buffer);\r\n const shTexture = createTextureFromDataU32(buffer, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA_INTEGER);\r\n shTexture.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n shTexture.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._shTextures!.push(shTexture);\r\n }\r\n }\r\n\r\n // Handle compound data, if any\r\n if (partIndices && !this._partIndicesTexture) {\r\n const buffer = new Uint8Array(partIndices);\r\n this._partIndicesTexture = createTextureFromDataU8(buffer, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RED);\r\n this._partIndicesTexture.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._partIndicesTexture.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n }\r\n if (this._worker) {\r\n this._worker.postMessage({ partIndices: partIndices ?? null });\r\n }\r\n\r\n this._postToWorker(true);\r\n } else {\r\n this._textureSize = textureSize;\r\n this._covariancesATexture = createTextureFromDataF16(covA, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._covariancesBTexture = createTextureFromDataF16(\r\n covB,\r\n textureSize.x,\r\n textureSize.y,\r\n this._useRGBACovariants ? Constants.TEXTUREFORMAT_RGBA : Constants.TEXTUREFORMAT_RG\r\n );\r\n this._centersTexture = createTextureFromData(this._splatPositions!, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._colorsTexture = createTextureFromDataU8(colorArray, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n\r\n if (sh) {\r\n this._shTextures = [];\r\n for (const shData of sh) {\r\n const buffer = new Uint32Array(shData.buffer);\r\n const shTexture = createTextureFromDataU32(buffer, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA_INTEGER);\r\n shTexture.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n shTexture.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._shTextures!.push(shTexture);\r\n }\r\n }\r\n\r\n if (partIndices) {\r\n const buffer = new Uint8Array(partIndices);\r\n this._partIndicesTexture = createTextureFromDataU8(buffer, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RED);\r\n this._partIndicesTexture.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._partIndicesTexture.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n }\r\n\r\n if (firstTime) {\r\n this._instanciateWorker();\r\n } else {\r\n if (this._worker) {\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const vertexCount = this._vertexCount;\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n this._worker.postMessage({ partIndices: partIndices ?? null });\r\n }\r\n this._postToWorker(true);\r\n }\r\n }\r\n }\r\n\r\n private *_updateData(data: ArrayBuffer, isAsync: boolean, sh?: Uint8Array[], partIndices?: Uint8Array, options: IUpdateOptions = { flipY: false }): Coroutine<void> {\r\n // if a covariance texture is present, then it's not a creation but an update\r\n if (!this._covariancesATexture) {\r\n this._readyToDisplay = false;\r\n }\r\n\r\n // Parse the data\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n if (this._keepInRam) {\r\n this._splatsData = data;\r\n this._shData = sh ? sh.map((arr) => new Uint8Array(arr)) : null;\r\n }\r\n\r\n const vertexCount = uBuffer.length / GaussianSplattingMesh._RowOutputLength;\r\n if (vertexCount != this._vertexCount) {\r\n this._updateSplatIndexBuffer(vertexCount);\r\n }\r\n this._vertexCount = vertexCount;\r\n // degree == 1 for 1 texture (3 terms), 2 for 2 textures(8 terms) and 3 for 3 textures (15 terms)\r\n this._shDegree = sh ? sh.length : 0;\r\n\r\n const textureSize = this._getTextureSize(vertexCount);\r\n const textureLength = textureSize.x * textureSize.y;\r\n const lineCountUpdate = GaussianSplattingMesh.ProgressiveUpdateAmount ?? textureSize.y;\r\n const textureLengthPerUpdate = textureSize.x * lineCountUpdate;\r\n\r\n this._splatPositions = new Float32Array(4 * textureLength);\r\n const covA = new Uint16Array(textureLength * 4);\r\n const covB = new Uint16Array((this._useRGBACovariants ? 4 : 2) * textureLength);\r\n const colorArray = new Uint8Array(textureLength * 4);\r\n\r\n // Ensure that partMatrices.length is at least the maximum part index + 1\r\n if (partIndices) {\r\n // We always keep part indices in RAM because they are needed for sorting\r\n this._partIndices = new Uint8Array(textureLength);\r\n this._partIndices.set(partIndices);\r\n\r\n let maxPartIndex = -1;\r\n for (let i = 0; i < partIndices.length; i++) {\r\n maxPartIndex = Math.max(maxPartIndex, partIndices[i]);\r\n }\r\n this._ensureMinimumPartMatricesLength(maxPartIndex + 1);\r\n }\r\n\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n if (GaussianSplattingMesh.ProgressiveUpdateAmount) {\r\n // create textures with not filled-yet array, then update directly portions of it\r\n this._updateTextures(covA, covB, colorArray, sh, this._partIndices ? this._partIndices : undefined);\r\n this.setEnabled(true);\r\n\r\n const partCount = Math.ceil(textureSize.y / lineCountUpdate);\r\n for (let partIndex = 0; partIndex < partCount; partIndex++) {\r\n const updateLine = partIndex * lineCountUpdate;\r\n const splatIndexBase = updateLine * textureSize.x;\r\n for (let i = 0; i < textureLengthPerUpdate; i++) {\r\n this._makeSplat(splatIndexBase + i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, options);\r\n }\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, updateLine, Math.min(lineCountUpdate, textureSize.y - updateLine));\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n // sort will be dirty here as just finished filled positions will not be sorted\r\n const positions = Float32Array.from(this._splatPositions);\r\n const vertexCount = this._vertexCount;\r\n if (this._worker) {\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n this._worker.postMessage({ partIndices });\r\n }\r\n this._sortIsDirty = true;\r\n } else {\r\n const paddedVertexCount = (vertexCount + 15) & ~0xf;\r\n for (let i = 0; i < vertexCount; i++) {\r\n this._makeSplat(i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, options);\r\n if (isAsync && i % GaussianSplattingMesh._SplatBatchSize === 0) {\r\n yield;\r\n }\r\n }\r\n // pad the rest\r\n for (let i = vertexCount; i < paddedVertexCount; i++) {\r\n this._makeEmptySplat(i, covA, covB, colorArray);\r\n }\r\n // textures\r\n this._updateTextures(covA, covB, colorArray, sh, this._partIndices ? this._partIndices : undefined);\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n this._sortIsDirty = true;\r\n }\r\n this._postToWorker(true);\r\n }\r\n\r\n /**\r\n * Update asynchronously the buffer\r\n * @param data array buffer containing center, color, orientation and scale of splats\r\n * @param sh optional array of uint8 array for SH data\r\n * @param partIndices optional array of uint8 for rig node indices\r\n * @returns a promise\r\n */\r\n public async updateDataAsync(data: ArrayBuffer, sh?: Uint8Array[], partIndices?: Uint8Array): Promise<void> {\r\n return await runCoroutineAsync(this._updateData(data, true, sh, partIndices), createYieldingScheduler());\r\n }\r\n\r\n /**\r\n * @experimental\r\n * Update data from GS (position, orientation, color, scaling)\r\n * @param data array that contain all the datas\r\n * @param sh optional array of uint8 array for SH data\r\n * @param options optional informations on how to treat data (needs to be 3rd for backward compatibility)\r\n * @param partIndices optional array of uint8 for rig node indices\r\n */\r\n public updateData(data: ArrayBuffer, sh?: Uint8Array[], options: IUpdateOptions = { flipY: true }, partIndices?: Uint8Array): void {\r\n runCoroutineSync(this._updateData(data, false, sh, partIndices, options));\r\n }\r\n\r\n /**\r\n * Refreshes the bounding info, taking into account all the thin instances defined\r\n * @returns the current Gaussian Splatting\r\n */\r\n public override refreshBoundingInfo(): Mesh {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n return this;\r\n }\r\n\r\n // in case size is different\r\n private _updateSplatIndexBuffer(vertexCount: number): void {\r\n const paddedVertexCount = (vertexCount + 15) & ~0xf;\r\n if (!this._splatIndex || vertexCount > this._splatIndex.length) {\r\n this._splatIndex = new Float32Array(paddedVertexCount);\r\n for (let i = 0; i < paddedVertexCount; i++) {\r\n this._splatIndex[i] = i;\r\n }\r\n\r\n // update meshes for knowns cameras\r\n this._cameraViewInfos.forEach((cameraViewInfos) => {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n });\r\n }\r\n\r\n // Update depthMix\r\n if ((!this._depthMix || vertexCount > this._depthMix.length) && !_native) {\r\n this._depthMix = new BigInt64Array(paddedVertexCount);\r\n }\r\n\r\n this.forcedInstanceCount = paddedVertexCount >> 4;\r\n }\r\n\r\n private _updateSubTextures(\r\n centers: Float32Array,\r\n covA: Uint16Array,\r\n covB: Uint16Array,\r\n colors: Uint8Array,\r\n lineStart: number,\r\n lineCount: number,\r\n sh?: Uint8Array[],\r\n partIndices?: Uint8Array\r\n ): void {\r\n const updateTextureFromData = (texture: BaseTexture, data: ArrayBufferView, width: number, lineStart: number, lineCount: number) => {\r\n (this.getEngine() as ThinEngine).updateTextureData(texture.getInternalTexture()!, data, 0, lineStart, width, lineCount, 0, 0, false);\r\n };\r\n\r\n const textureSize = this._getTextureSize(this._vertexCount);\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n const texelStart = lineStart * textureSize.x;\r\n const texelCount = lineCount * textureSize.x;\r\n const covAView = new Uint16Array(covA.buffer, texelStart * 4 * Uint16Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n const covBView = new Uint16Array(covB.buffer, texelStart * covBSItemSize * Uint16Array.BYTES_PER_ELEMENT, texelCount * covBSItemSize);\r\n const colorsView = new Uint8Array(colors.buffer, texelStart * 4, texelCount * 4);\r\n const centersView = new Float32Array(centers.buffer, texelStart * 4 * Float32Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n updateTextureFromData(this._covariancesATexture!, covAView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._covariancesBTexture!, covBView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._centersTexture!, centersView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._colorsTexture!, colorsView, textureSize.x, lineStart, lineCount);\r\n if (sh) {\r\n for (let i = 0; i < sh.length; i++) {\r\n const componentCount = 4;\r\n const shView = new Uint32Array(sh[i].buffer, texelStart * componentCount * 4, texelCount * componentCount);\r\n updateTextureFromData(this._shTextures![i], shView, textureSize.x, lineStart, lineCount);\r\n }\r\n }\r\n if (partIndices && this._partIndicesTexture) {\r\n const partIndicesView = new Uint8Array(partIndices.buffer, texelStart, texelCount);\r\n updateTextureFromData(this._partIndicesTexture, partIndicesView, textureSize.x, lineStart, lineCount);\r\n }\r\n }\r\n private _instanciateWorker(): void {\r\n if (!this._vertexCount) {\r\n return;\r\n }\r\n if (this._disableDepthSort) {\r\n return;\r\n }\r\n this._updateSplatIndexBuffer(this._vertexCount);\r\n\r\n // no worker in native\r\n if (_native) {\r\n return;\r\n }\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMesh._CreateWorker.toString(), \")(self)\"], {\r\n type: \"application/javascript\",\r\n })\r\n )\r\n );\r\n\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const partIndices = this._partIndices ? new Uint8Array(this._partIndices) : null;\r\n const partMatrices = this._partMatrices.map((matrix) => new Float32Array(matrix.m));\r\n\r\n this._worker.postMessage({ positions }, [positions.buffer]);\r\n this._worker.postMessage({ partIndices });\r\n this._worker.postMessage({ partMatrices });\r\n\r\n this._worker.onmessage = (e) => {\r\n // Recompute vertexCountPadded in case _vertexCount has changed since the last update\r\n const vertexCountPadded = (this._vertexCount + 15) & ~0xf;\r\n\r\n // If the vertex count changed, we discard this result and trigger a new sort\r\n if (e.data.depthMix.length != vertexCountPadded) {\r\n this._canPostToWorker = true;\r\n this._postToWorker(true);\r\n this._sortIsDirty = false;\r\n return;\r\n }\r\n\r\n this._depthMix = e.data.depthMix;\r\n const cameraId = e.data.cameraId;\r\n\r\n const indexMix = new Uint32Array(e.data.depthMix.buffer);\r\n if (this._splatIndex) {\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n this._splatIndex[j] = indexMix[2 * j];\r\n }\r\n }\r\n if (this._delayedTextureUpdate) {\r\n const textureSize = this._getTextureSize(vertexCountPadded);\r\n this._updateSubTextures(\r\n this._delayedTextureUpdate.centers,\r\n this._delayedTextureUpdate.covA,\r\n this._delayedTextureUpdate.covB,\r\n this._delayedTextureUpdate.colors,\r\n 0,\r\n textureSize.y,\r\n this._delayedTextureUpdate.sh,\r\n this._delayedTextureUpdate.partIndices\r\n );\r\n this._delayedTextureUpdate = null;\r\n }\r\n\r\n // get mesh for camera and update its instance buffer\r\n const cameraViewInfos = this._cameraViewInfos.get(cameraId);\r\n if (cameraViewInfos) {\r\n if (cameraViewInfos.splatIndexBufferSet) {\r\n cameraViewInfos.mesh.thinInstanceBufferUpdated(\"splatIndex\");\r\n } else {\r\n cameraViewInfos.mesh.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 16, false);\r\n cameraViewInfos.splatIndexBufferSet = true;\r\n }\r\n }\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n // sort is dirty when GS is visible for progressive update with a this message arriving but positions were partially filled\r\n // another update needs to be kicked. The kick can't happen just when the position buffer is ready because _canPostToWorker might be false.\r\n if (this._sortIsDirty) {\r\n this._postToWorker(true);\r\n this._sortIsDirty = false;\r\n }\r\n };\r\n }\r\n\r\n private _getTextureSize(length: number): Vector2 {\r\n const engine = this._scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n\r\n let height = 1;\r\n\r\n if (engine.version === 1 && !engine.isWebGPU) {\r\n while (width * height < length) {\r\n height *= 2;\r\n }\r\n } else {\r\n height = Math.ceil(length / width);\r\n }\r\n\r\n if (height > width) {\r\n Logger.Error(\"GaussianSplatting texture size: (\" + width + \", \" + height + \"), maxTextureSize: \" + width);\r\n height = width;\r\n }\r\n\r\n return new Vector2(width, height);\r\n }\r\n\r\n /**\r\n * Gets the number of parts in the compound\r\n * @returns the number of parts in the compound, or 0 if the mesh is not a compound\r\n */\r\n public get partCount(): number {\r\n return this._partMatrices.length;\r\n }\r\n\r\n /**\r\n * Sets the world matrix for a specific part of the compound (if this mesh is a compound).\r\n * This will trigger a re-sort of the mesh.\r\n * @param partIndex index of the part, that must be between 0 and partCount - 1\r\n * @param worldMatrix the world matrix to set\r\n */\r\n public setWorldMatrixForPart(partIndex: number, worldMatrix: Matrix): void {\r\n this._partMatrices[partIndex].copyFrom(worldMatrix);\r\n if (this._worker) {\r\n this._worker.postMessage({ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)) });\r\n }\r\n this._postToWorker(true);\r\n }\r\n\r\n /**\r\n * Gets the world matrix for a specific part of the compound (if this mesh is a compound).\r\n * @param partIndex index of the part, that must be between 0 and partCount - 1\r\n * @returns the world matrix for the part, or the current world matrix of the mesh if the mesh is not a compound\r\n */\r\n public getWorldMatrixForPart(partIndex: number): Matrix {\r\n return this._partMatrices[partIndex] ?? this.getWorldMatrix();\r\n }\r\n\r\n /**\r\n * Ensure that the part world matrix array is at least the given length.\r\n * NB: This length is used as reference for the number of parts in the compound.\r\n * Newly inserted parts are initialized with the current world matrix of the mesh.\r\n * @param length - The minimum length to ensure\r\n */\r\n private _ensureMinimumPartMatricesLength(length: number): void {\r\n if (this._partMatrices.length < length) {\r\n this._resizePartMatrices(length);\r\n }\r\n }\r\n\r\n /**\r\n * This sets the number of parts in the compound.\r\n * Warning: This must be consistent with the indices used in the partIndices texture.\r\n * Newly inserted parts are initialized with the current world matrix of the mesh.\r\n * @param length - The length to resize to\r\n */\r\n private _resizePartMatrices(length: number): void {\r\n if (this._partMatrices.length == length) {\r\n return;\r\n } else if (this._partMatrices.length > length) {\r\n this._partMatrices = this._partMatrices.slice(0, length);\r\n } else {\r\n this.computeWorldMatrix(true);\r\n const defaultMatrix = this.getWorldMatrix();\r\n while (this._partMatrices.length < length) {\r\n this._partMatrices.push(defaultMatrix.clone());\r\n }\r\n }\r\n\r\n if (this._worker) {\r\n this._worker.postMessage({ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)) });\r\n }\r\n this._postToWorker(true);\r\n }\r\n\r\n /**\r\n * Add another mesh to this mesh, as a new part. This makes the current mesh a compound, if not already.\r\n * NB: The current mesh needs to be loaded with keepInRam: true.\r\n * @param other - The other mesh to add. This must be loaded with keepInRam: true.\r\n * @param disposeOther - Whether to dispose the other mesh after adding it to the current mesh.\r\n * @returns a placeholder mesh that can be used to manipulate the part transform\r\n */\r\n public addPart(other: GaussianSplattingMesh, disposeOther: boolean = true): Mesh {\r\n const splatCountA = this._vertexCount;\r\n const splatsDataA = splatCountA == 0 ? new ArrayBuffer(0) : this.splatsData;\r\n const shDataA = this.shData;\r\n\r\n const splatCountB = other._vertexCount;\r\n const splatsDataB = other.splatsData;\r\n const shDataB = other.shData;\r\n\r\n const mergedShDataLength = Math.max(shDataA?.length || 0, shDataB?.length || 0);\r\n const hasMergedShData = shDataA !== null && shDataB !== null;\r\n\r\n // Sanity checks\r\n if (!splatsDataA) {\r\n throw new Error(`To call addPart(), the current mesh must be loaded with keepInRam: true`);\r\n }\r\n const expectedSplatsDataSizeA = splatCountA * GaussianSplattingMesh._RowOutputLength;\r\n if (splatsDataA.byteLength !== expectedSplatsDataSizeA) {\r\n throw new Error(`splatsDataA size (${splatsDataA.byteLength}) does not match expected size (${expectedSplatsDataSizeA})`);\r\n }\r\n if (!splatsDataB) {\r\n throw new Error(`To call addPart(), the other mesh must be loaded with keepInRam: true`);\r\n }\r\n const expectedSplatsDataSizeB = splatCountB * GaussianSplattingMesh._RowOutputLength;\r\n if (splatsDataB.byteLength !== expectedSplatsDataSizeB) {\r\n throw new Error(`splatsDataB size (${splatsDataB.byteLength}) does not match expected size (${expectedSplatsDataSizeB})`);\r\n }\r\n if (other.partIndices) {\r\n throw new Error(`To call addPart(), the other mesh must not be a compound`);\r\n }\r\n\r\n // Concatenate splatsData (ArrayBuffer)\r\n const mergedSplatsData = new Uint8Array(splatsDataA.byteLength + splatsDataB.byteLength);\r\n mergedSplatsData.set(new Uint8Array(splatsDataA), 0);\r\n mergedSplatsData.set(new Uint8Array(splatsDataB), splatsDataA.byteLength);\r\n\r\n let mergedShData: Uint8Array[] | undefined = undefined;\r\n if (hasMergedShData) {\r\n // Note: We need to calculate the texture size and pad accordingly\r\n // Each SH texture texel stores 16 bytes (4 RGBA uint32 components)\r\n const bytesPerTexel = 16;\r\n const totalSplatCount = splatCountA + splatCountB;\r\n\r\n mergedShData = [];\r\n for (let i = 0; i < mergedShDataLength; i++) {\r\n const mergedShDataItem = new Uint8Array(totalSplatCount * bytesPerTexel);\r\n if (i < (shDataA?.length ?? 0)) {\r\n mergedShDataItem.set(shDataA![i], 0);\r\n }\r\n if (i < (shDataB?.length ?? 0)) {\r\n const byteOffset = bytesPerTexel * splatCountA;\r\n mergedShDataItem.set(shDataB![i], byteOffset);\r\n }\r\n mergedShData.push(mergedShDataItem);\r\n }\r\n }\r\n\r\n // Concatenate partIndices (Uint8Array)\r\n let newPartIndex = this.partCount;\r\n let partIndicesA = this.partIndices;\r\n if (!partIndicesA) {\r\n partIndicesA = new Uint8Array(splatCountA);\r\n newPartIndex = splatCountA > 0 ? 1 : 0;\r\n //newPartIndex = 1;\r\n }\r\n if (partIndicesA.length < splatCountA) {\r\n throw new Error(`partIndices length (${partIndicesA.length}) should be at least vertexCount (${splatCountA}) in the current mesh`);\r\n }\r\n const partIndicesB = new Uint8Array(splatCountB).fill(newPartIndex);\r\n const mergedPartIndices = new Uint8Array(splatCountA + splatCountB);\r\n mergedPartIndices.set(partIndicesA.slice(0, splatCountA), 0);\r\n mergedPartIndices.set(partIndicesB, splatCountA);\r\n\r\n this.updateData(mergedSplatsData.buffer, mergedShData, { flipY: false }, mergedPartIndices);\r\n\r\n // Merge part matrices (TODO)\r\n const partWorldMatrix = other.getWorldMatrix();\r\n this.setWorldMatrixForPart(newPartIndex, partWorldMatrix);\r\n\r\n // Create a placeholder mesh to manipulate the part transform\r\n // Remove splats from the original mesh\r\n if (disposeOther) {\r\n other.dispose();\r\n }\r\n const placeholderMesh = new Mesh(other.name, this.getScene());\r\n\r\n placeholderMesh.onAfterWorldMatrixUpdateObservable.add(() => {\r\n this.setWorldMatrixForPart(newPartIndex, placeholderMesh.getWorldMatrix());\r\n });\r\n\r\n // Directly set the world matrix using freezeWorldMatrix\r\n const quaternion = new Quaternion();\r\n partWorldMatrix.decompose(placeholderMesh.scaling, quaternion, placeholderMesh.position);\r\n placeholderMesh.rotationQuaternion = quaternion;\r\n placeholderMesh.computeWorldMatrix(true);\r\n placeholderMesh.metadata = { partIndex: newPartIndex };\r\n\r\n return placeholderMesh;\r\n }\r\n}\r\n"]}