@onerjs/core 8.47.9 → 8.48.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingMeshBase.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMeshBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Scene } from \"core/scene\";\r\nimport { type DeepImmutable, 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, type Quaternion } from \"core/Maths/math.vector\";\r\n\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 { type Effect } from \"core/Materials/effect\";\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\nconst IsNative = typeof _native !== \"undefined\";\r\nconst Native = IsNative ? _native : null;\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 /** @internal When set, skips reprocessing splats [0, previousVertexCount) and copies from cached arrays instead. */\r\n previousVertexCount?: number;\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 GaussianSplattingMeshBase. 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/**\r\n * Base class for Gaussian Splatting meshes. Contains all single-cloud rendering logic.\r\n * @internal Use GaussianSplattingMesh instead; this class is an internal implementation detail.\r\n */\r\nexport class GaussianSplattingMeshBase extends Mesh {\r\n /** @internal */\r\n public _vertexCount = 0;\r\n protected _worker: Nullable<Worker> = null;\r\n private _modelViewProjectionMatrix = Matrix.Identity();\r\n private _depthMix: BigInt64Array;\r\n protected _canPostToWorker = true;\r\n private _readyToDisplay = false;\r\n protected _covariancesATexture: Nullable<BaseTexture> = null;\r\n protected _covariancesBTexture: Nullable<BaseTexture> = null;\r\n protected _centersTexture: Nullable<BaseTexture> = null;\r\n protected _colorsTexture: Nullable<BaseTexture> = null;\r\n protected _splatPositions: Nullable<Float32Array> = null;\r\n private _splatIndex: Nullable<Float32Array> = null;\r\n protected _shTextures: Nullable<BaseTexture[]> = null;\r\n /** @internal */\r\n public _splatsData: Nullable<ArrayBuffer> = null;\r\n /** @internal */\r\n public _shData: Nullable<Uint8Array[]> = null;\r\n private _textureSize: Vector2 = new Vector2(0, 0);\r\n protected readonly _keepInRam: boolean = false;\r\n protected _alwaysRetainSplatsData: boolean = false;\r\n\r\n private _delayedTextureUpdate: Nullable<IDelayedTextureUpdate> = null;\r\n protected _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 // Cached bounding box for incremental addPart updates (O(1) vs O(N) scan of positions)\r\n protected _cachedBoundingMin: Nullable<Vector3> = null;\r\n protected _cachedBoundingMax: Nullable<Vector3> = null;\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 /** @internal */\r\n public _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 = GaussianSplattingMeshBase._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._instantiateWorker();\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 * Value is clamped between 0 and the maximum degree available from loaded data.\r\n */\r\n public get shDegree() {\r\n return this._shDegree;\r\n }\r\n\r\n public set shDegree(value: number) {\r\n const maxDegree = this._shTextures?.length ?? 0;\r\n const clamped = Math.max(0, Math.min(Math.round(value), maxDegree));\r\n if (this._shDegree === clamped) {\r\n return;\r\n }\r\n this._shDegree = clamped;\r\n this.material?.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Maximum SH degree available from the loaded data.\r\n */\r\n public get maxShDegree() {\r\n return this._shTextures?.length ?? 0;\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 * Only available if the mesh was created with keepInRam: true\r\n */\r\n public get splatsData() {\r\n return this._keepInRam ? this._splatsData : null;\r\n }\r\n\r\n /**\r\n * returns the SH data arrays\r\n * Only available if the mesh was created with keepInRam: true\r\n */\r\n public get shData() {\r\n return this._keepInRam ? this._shData : null;\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 < GaussianSplattingMeshBase._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 * GaussianSplattingMeshBase._BatchSize, 0, 6 * GaussianSplattingMeshBase._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 // Cast is safe: GaussianSplattingMeshBase is @internal; all concrete instances are GaussianSplattingMesh.\r\n gaussianSplattingMaterial.setSourceMesh(this as any);\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 \"GaussianSplattingMeshBase\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMeshBase\";\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\r\n const modelMatrix = this.getWorldMatrix();\r\n const modelViewMatrix = TmpVectors.Matrix[1];\r\n modelMatrix.multiplyToRef(cameraViewMatrix, modelViewMatrix);\r\n modelMatrix.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(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 if (cameraMesh.material && cameraMesh.material instanceof GaussianSplattingMaterial) {\r\n const gsMaterial = cameraMesh.material as GaussianSplattingMaterial;\r\n // GaussianSplattingMaterial source mesh may not have been set yet.\r\n // This happens for cloned resources from asset containers for instance,\r\n // where material is cloned before mesh.\r\n if (!gsMaterial.getSourceMesh()) {\r\n // Cast is safe: see constructor comment above.\r\n gsMaterial.setSourceMesh(this as any);\r\n }\r\n }\r\n GaussianSplattingMeshBase._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?.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 const cameraViewMatrix = camera.getViewMatrix();\r\n this._worker.postMessage(\r\n {\r\n worldMatrix: this.getWorldMatrix().m,\r\n cameraForward: [cameraViewMatrix.m[2], cameraViewMatrix.m[6], cameraViewMatrix.m[10]],\r\n cameraPosition: [camera.globalPosition.x, camera.globalPosition.y, camera.globalPosition.z],\r\n depthMix: this._depthMix,\r\n cameraId: camera.uniqueId,\r\n },\r\n [this._depthMix.buffer]\r\n );\r\n } else if (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 if (this.onBeforeRenderObservable) {\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n }\r\n const mesh = cameraViewInfos.mesh;\r\n mesh.getWorldMatrix().copyFrom(this.getWorldMatrix());\r\n\r\n // Propagate render pass material overrides (e.g., GPU picking) to the inner camera mesh.\r\n // When this mesh is rendered into a RenderTargetTexture with a material override (via setMaterialForRendering),\r\n // the override is set on this proxy mesh but needs to be applied to the actual camera mesh that does the rendering.\r\n const engine = this._scene.getEngine();\r\n const renderPassId = engine.currentRenderPassId;\r\n const renderPassMaterial = this.getMaterialForRenderPass(renderPassId);\r\n if (renderPassMaterial) {\r\n mesh.setMaterialForRenderPass(renderPassId, renderPassMaterial);\r\n }\r\n\r\n const ret = mesh.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n\r\n // Clean up the temporary override to avoid affecting other render passes\r\n if (renderPassMaterial) {\r\n mesh.setMaterialForRenderPass(renderPassId, undefined);\r\n }\r\n\r\n if (this.onAfterRenderObservable) {\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n }\r\n return ret;\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 = GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase._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(GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase._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 + GaussianSplattingMeshBase._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_1:\r\n rgba[1] = (0.5 + GaussianSplattingMeshBase._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_2:\r\n rgba[2] = (0.5 + GaussianSplattingMeshBase._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_3:\r\n rgba[3] = (0.5 + GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase.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 = GaussianSplattingMeshBase._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMeshBase._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase.ParseHeader(data);\r\n if (!header) {\r\n return data;\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMeshBase._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMeshBase._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMeshBase._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(GaussianSplattingMeshBase.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(GaussianSplattingMeshBase.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 this._cachedBoundingMin = null;\r\n this._cachedBoundingMax = null;\r\n // Note: _splatsData and _shData are intentionally kept alive after dispose.\r\n // They serve as the source reference for the compound API (addPart/removePart)\r\n // when this mesh is held by a GaussianSplattingPartProxyMesh.compoundSplatMesh.\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 protected _copyTextures(source: GaussianSplattingMeshBase): 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 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 = \"\"): GaussianSplattingMeshBase {\r\n const newGS = new GaussianSplattingMeshBase(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._instantiateWorker();\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 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 globalWorldMatrix = e.data.worldMatrix;\r\n const cameraForward = e.data.cameraForward;\r\n const cameraPosition = e.data.cameraPosition;\r\n\r\n const vertexCountPadded = (positions.length / 4 + 15) & ~0xf;\r\n if (!positions || !cameraForward) {\r\n // Sanity check, it shouldn't happen!\r\n throw new Error(\"positions or camera info 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 // depth = dot(cameraForward, worldPos - cameraPos)\r\n const camDot = cameraForward[0] * cameraPosition[0] + cameraForward[1] * cameraPosition[1] + cameraForward[2] * cameraPosition[2];\r\n\r\n const computeDepthCoeffs = (m: Float32Array): number[] => {\r\n return [\r\n cameraForward[0] * m[0] + cameraForward[1] * m[1] + cameraForward[2] * m[2],\r\n cameraForward[0] * m[4] + cameraForward[1] * m[5] + cameraForward[2] * m[6],\r\n cameraForward[0] * m[8] + cameraForward[1] * m[9] + cameraForward[2] * m[10],\r\n cameraForward[0] * m[12] + cameraForward[1] * m[13] + cameraForward[2] * m[14] - camDot,\r\n ];\r\n };\r\n\r\n if (partMatrices && partIndices) {\r\n // Precompute depth coefficients for each rig node\r\n const depthCoeffs = partMatrices.map((m) => computeDepthCoeffs(m));\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 coeff = depthCoeffs[partIndex];\r\n floatMix[2 * j + 1] = coeff[0] * positions[4 * j + 0] + coeff[1] * positions[4 * j + 1] + coeff[2] * positions[4 * j + 2] + coeff[3];\r\n // instead of using minus to sort back to front, we use bitwise not operator to invert the order of indices\r\n // might not be faster but a minus sign implies a reference value that may not be enough and will decrease floatting precision\r\n indices[2 * j + 1] = ~indices[2 * j + 1];\r\n }\r\n } else {\r\n // Compute depth coefficients from global world matrix\r\n const [a, b, c, d] = computeDepthCoeffs(globalWorldMatrix);\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n floatMix[2 * j + 1] = a * positions[4 * j + 0] + b * positions[4 * j + 1] + c * positions[4 * j + 2] + d;\r\n indices[2 * j + 1] = ~indices[2 * j + 1];\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 protected _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 /**\r\n * Processes a single splat from the source buffer (at srcIndex) and writes the result into\r\n * the destination texture arrays at dstIndex. This decoupling allows addPart to feed multiple\r\n * independent source buffers into a single set of destination arrays without merging them first.\r\n * @param dstIndex - destination splat index (into _splatPositions, covA, covB, colorArray)\r\n * @param fBuffer - float32 view of the source .splat buffer\r\n * @param uBuffer - uint8 view of the source .splat buffer\r\n * @param covA - destination covariancesA array\r\n * @param covB - destination covariancesB array\r\n * @param colorArray - destination color array\r\n * @param minimum - accumulated bounding minimum (updated in-place)\r\n * @param maximum - accumulated bounding maximum (updated in-place)\r\n * @param flipY - whether to negate the Y position\r\n * @param srcIndex - source splat index (defaults to dstIndex when omitted)\r\n */\r\n protected _makeSplat(\r\n dstIndex: 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 flipY: boolean,\r\n srcIndex: number = dstIndex\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 * srcIndex + 0];\r\n const y = fBuffer[8 * srcIndex + 1] * (flipY ? -1 : 1);\r\n const z = fBuffer[8 * srcIndex + 2];\r\n\r\n this._splatPositions![4 * dstIndex + 0] = x;\r\n this._splatPositions![4 * dstIndex + 1] = y;\r\n this._splatPositions![4 * dstIndex + 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 * srcIndex + 28 + 1] - 127.5) / 127.5,\r\n (uBuffer[32 * srcIndex + 28 + 2] - 127.5) / 127.5,\r\n (uBuffer[32 * srcIndex + 28 + 3] - 127.5) / 127.5,\r\n -(uBuffer[32 * srcIndex + 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 * srcIndex + 3 + 0] * 2, fBuffer[8 * srcIndex + 3 + 1] * 2, fBuffer[8 * srcIndex + 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 * dstIndex + 3] = factor;\r\n const transform = factor;\r\n\r\n covA[dstIndex * 4 + 0] = ToHalfFloat(covariances[0] / transform);\r\n covA[dstIndex * 4 + 1] = ToHalfFloat(covariances[1] / transform);\r\n covA[dstIndex * 4 + 2] = ToHalfFloat(covariances[2] / transform);\r\n covA[dstIndex * 4 + 3] = ToHalfFloat(covariances[3] / transform);\r\n covB[dstIndex * covBSItemSize + 0] = ToHalfFloat(covariances[4] / transform);\r\n covB[dstIndex * covBSItemSize + 1] = ToHalfFloat(covariances[5] / transform);\r\n\r\n // colors\r\n colorArray[dstIndex * 4 + 0] = uBuffer[32 * srcIndex + 24 + 0];\r\n colorArray[dstIndex * 4 + 1] = uBuffer[32 * srcIndex + 24 + 1];\r\n colorArray[dstIndex * 4 + 2] = uBuffer[32 * srcIndex + 24 + 2];\r\n colorArray[dstIndex * 4 + 3] = uBuffer[32 * srcIndex + 24 + 3];\r\n }\r\n\r\n protected _onUpdateTextures(_textureSize: Vector2) {}\r\n\r\n /**\r\n * Called when part index data is received during a data load. Override to store and manage\r\n * part index state (e.g. allocating the padded Uint8Array).\r\n * No-op in the base class.\r\n * @param _partIndices - the raw part indices passed in by the caller\r\n * @param _textureLength - the padded texture length (width × height) to allocate into\r\n */\r\n protected _onIndexDataReceived(_partIndices: Uint8Array, _textureLength: number): void {}\r\n\r\n /**\r\n * Called at the start of an incremental texture update, before any splats are processed.\r\n * Override to perform incremental-specific setup, such as ensuring the part-index GPU texture\r\n * exists before the sub-texture upload begins.\r\n * No-op in the base class.\r\n * @param _textureSize - current texture dimensions\r\n */\r\n protected _onIncrementalUpdateStart(_textureSize: Vector2): void {}\r\n\r\n /**\r\n * Whether this mesh is in compound mode (has at least one part added via addPart).\r\n * Returns `false` in the base class; overridden to return `true` in the compound subclass.\r\n * Consumed by the material and depth renderer to toggle compound-specific shader paths.\r\n * @internal\r\n */\r\n public get isCompound(): boolean {\r\n return false;\r\n }\r\n\r\n protected _setDelayedTextureUpdate(covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, sh?: Uint8Array[]): void {\r\n this._delayedTextureUpdate = { covA, covB, colors: colorArray, centers: this._splatPositions!, sh };\r\n }\r\n\r\n // NB: partIndices is assumed to be padded to a round texture size\r\n protected _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 const firstTime = this._covariancesATexture === null;\r\n const textureSizeChanged = this._textureSize.y != textureSize.y;\r\n\r\n if (!firstTime && !textureSizeChanged) {\r\n this._setDelayedTextureUpdate(covA, covB, colorArray, 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 // 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 this._onUpdateTextures(textureSize);\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 this._onUpdateTextures(textureSize);\r\n\r\n if (firstTime) {\r\n this._instantiateWorker();\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 }\r\n this._postToWorker(true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks whether the GPU textures can be incrementally updated for a new addPart operation,\r\n * avoiding a full texture re-upload for existing splats.\r\n * Requires that the GPU textures already exist and the texture height won't change.\r\n * @param previousVertexCount - The number of splats previously committed to GPU\r\n * @param vertexCount - The new total number of splats\r\n * @returns true when only the new splat region needs to be uploaded\r\n */\r\n protected _canReuseCachedData(previousVertexCount: number, vertexCount: number): boolean {\r\n if (previousVertexCount <= 0 || previousVertexCount > vertexCount) {\r\n return false;\r\n }\r\n if (this._splatPositions === null || this._cachedBoundingMin === null || this._cachedBoundingMax === null) {\r\n return false;\r\n }\r\n if (this._covariancesATexture === null) {\r\n return false;\r\n }\r\n // Can only do an incremental GPU update if texture height doesn't need to grow\r\n const newTextureSize = this._getTextureSize(vertexCount);\r\n return newTextureSize.y === this._textureSize.y;\r\n }\r\n\r\n /**\r\n * Posts updated positions to the sort worker and marks the sort as dirty.\r\n * Called after processing new splats so the worker can re-sort with the complete position set.\r\n * Subclasses (e.g. compound) may override to additionally post part-index data.\r\n */\r\n protected _notifyWorkerNewData(): void {\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 }\r\n this._sortIsDirty = true;\r\n }\r\n\r\n private *_updateData(\r\n data: ArrayBuffer,\r\n isAsync: boolean,\r\n sh?: Uint8Array[],\r\n partIndices?: Uint8Array,\r\n { flipY = false, previousVertexCount = 0 }: IUpdateOptions = {}\r\n ): Coroutine<void> {\r\n if (!this._covariancesATexture) {\r\n this._readyToDisplay = false;\r\n }\r\n\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n // Optionally store the raw splat buffer as an ArrayBuffer. This is the source reference\r\n // used by _addPartsInternal when a full texture rebuild is needed. Use uBuffer.buffer as\r\n // the canonical backing store — it is always a tightly packed ArrayBuffer containing\r\n // exactly the bytes we processed, avoiding issues with ArrayBufferView.byteOffset.\r\n if (this._keepInRam || this._alwaysRetainSplatsData) {\r\n this._splatsData = uBuffer.buffer;\r\n this._shData = sh ? sh.map((arr) => new Uint8Array(arr)) : null;\r\n } else {\r\n this._splatsData = null;\r\n this._shData = null;\r\n }\r\n\r\n const vertexCount = uBuffer.length / GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase.ProgressiveUpdateAmount ?? textureSize.y;\r\n\r\n // Delegate part index storage to subclasses (e.g. GaussianSplattingMesh compound mode).\r\n if (partIndices) {\r\n this._onIndexDataReceived(partIndices, textureLength);\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 const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n const covA = new Uint16Array(textureLength * 4);\r\n const covB = new Uint16Array(covBSItemSize * textureLength);\r\n const colorArray = new Uint8Array(textureLength * 4);\r\n\r\n // Incremental path: only upload the rows that contain new splats, leaving the already-committed\r\n // GPU region untouched. Falls through to the full-rebuild path when textures don't exist yet\r\n // or the texture height needs to grow.\r\n const incremental = this._canReuseCachedData(previousVertexCount, vertexCount);\r\n\r\n // The first texture line/texel that must be (re-)processed and uploaded.\r\n // For a full rebuild this is 0. For an incremental update it is the row boundary just before\r\n // previousVertexCount so that any partial old row is re-processed as a complete row.\r\n const firstNewLine = incremental ? Math.floor(previousVertexCount / textureSize.x) : 0;\r\n const firstNewTexel = firstNewLine * textureSize.x;\r\n\r\n // Preserve old positions before replacing the array (incremental only)\r\n const oldPositions = this._splatPositions;\r\n this._splatPositions = new Float32Array(4 * textureLength);\r\n\r\n if (incremental) {\r\n this._splatPositions.set(oldPositions!.subarray(0, previousVertexCount * 4));\r\n minimum.copyFrom(this._cachedBoundingMin!);\r\n maximum.copyFrom(this._cachedBoundingMax!);\r\n // Let subclasses handle any incremental-specific setup (e.g. ensuring part-index textures)\r\n this._onIncrementalUpdateStart(textureSize);\r\n }\r\n\r\n if (GaussianSplattingMeshBase.ProgressiveUpdateAmount) {\r\n // Full rebuild: create GPU textures upfront with empty data; the loop fills them in batches via _updateSubTextures\r\n if (!incremental) {\r\n this._updateTextures(covA, covB, colorArray, sh);\r\n }\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 batchEndLine = Math.min(updateLine + lineCountUpdate, textureSize.y);\r\n\r\n // Skip batches that lie entirely within the already-committed GPU region\r\n if (batchEndLine <= firstNewLine) {\r\n continue;\r\n }\r\n\r\n // Clip upload start to firstNewLine to avoid overwriting committed data with zeros\r\n const uploadStartLine = Math.max(updateLine, firstNewLine);\r\n const uploadStartTexel = uploadStartLine * textureSize.x;\r\n const batchEndTexel = batchEndLine * textureSize.x;\r\n\r\n for (let splatIdx = uploadStartTexel; splatIdx < batchEndTexel; splatIdx++) {\r\n if (splatIdx < vertexCount) {\r\n this._makeSplat(splatIdx, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, flipY);\r\n } else {\r\n this._makeEmptySplat(splatIdx, covA, covB, colorArray);\r\n }\r\n }\r\n\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, uploadStartLine, batchEndLine - uploadStartLine, sh);\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n this._notifyWorkerNewData();\r\n } else {\r\n // Process splats from firstNewTexel: re-processes the partial old row (incremental) or processes everything from 0 (full rebuild)\r\n for (let i = firstNewTexel; i < vertexCount; i++) {\r\n this._makeSplat(i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, flipY);\r\n if (isAsync && i % GaussianSplattingMeshBase._SplatBatchSize === 0) {\r\n yield;\r\n }\r\n }\r\n\r\n // Incremental pads the full texture; full rebuild pads only to the next 16-splat boundary\r\n const paddedEnd = incremental ? textureLength : (vertexCount + 15) & ~0xf;\r\n for (let i = vertexCount; i < paddedEnd; i++) {\r\n this._makeEmptySplat(i, covA, covB, colorArray);\r\n }\r\n\r\n if (incremental) {\r\n // Partial upload: only rows from firstNewLine onwards; existing rows stay on GPU\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, firstNewLine, textureSize.y - firstNewLine, sh);\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n this._notifyWorkerNewData();\r\n } else {\r\n // Full upload: create or replace all GPU textures\r\n this._updateTextures(covA, covB, colorArray, sh);\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n this._sortIsDirty = true;\r\n }\r\n }\r\n\r\n // Cache bounding box for the next incremental addPart call\r\n this._cachedBoundingMin = minimum.clone();\r\n this._cachedBoundingMax = maximum.clone();\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 protected _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) && !IsNative) {\r\n this._depthMix = new BigInt64Array(paddedVertexCount);\r\n }\r\n\r\n this.forcedInstanceCount = Math.max(paddedVertexCount >> 4, 1);\r\n }\r\n\r\n protected _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 protected _updateSubTextures(centers: Float32Array, covA: Uint16Array, covB: Uint16Array, colors: Uint8Array, lineStart: number, lineCount: number, sh?: Uint8Array[]): void {\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 this._updateTextureFromData(this._covariancesATexture!, covAView, textureSize.x, lineStart, lineCount);\r\n this._updateTextureFromData(this._covariancesBTexture!, covBView, textureSize.x, lineStart, lineCount);\r\n this._updateTextureFromData(this._centersTexture!, centersView, textureSize.x, lineStart, lineCount);\r\n this._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 this._updateTextureFromData(this._shTextures![i], shView, textureSize.x, lineStart, lineCount);\r\n }\r\n }\r\n }\r\n\r\n protected _instantiateWorker(): 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 (IsNative) {\r\n return;\r\n }\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n // Reset the posting gate so the new worker can immediately receive sort requests.\r\n // If the previous worker was terminated mid-sort it would never have set _canPostToWorker\r\n // back to true, leaving the sort permanently frozen on the new worker.\r\n this._canPostToWorker = true;\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMeshBase._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\r\n this._worker.postMessage({ positions }, [positions.buffer]);\r\n this._onWorkerCreated(this._worker!);\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 );\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 protected _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 * Called after the sort worker has been created and the initial positions message has been sent.\r\n * Override in subclasses to post any additional setup messages the worker needs (e.g. group\r\n * indices, per-part matrices, etc.).\r\n * @param _worker the newly created worker\r\n */\r\n protected _onWorkerCreated(_worker: Worker): void {}\r\n\r\n /**\r\n * Called by the material to bind any extra shader uniforms that are specific to this mesh type.\r\n * The base implementation is a no-op; override in subclasses to bind additional data.\r\n * @param _effect the shader effect that is being bound\r\n * @internal\r\n */\r\n public bindExtraEffectUniforms(_effect: Effect): void {}\r\n\r\n /**\r\n * Processes all splats from a source GaussianSplattingMesh directly into the destination\r\n * texture arrays starting at dstOffset. This is the core of the texture-direct compound API:\r\n * no merged CPU buffer is ever created; each source mesh is written straight into its region.\r\n *\r\n * @param source - The source mesh whose splats are appended\r\n * @param dstOffset - The destination splat index at which writing starts\r\n * @param covA - Destination covA array (full texture size)\r\n * @param covB - Destination covB array (full texture size)\r\n * @param colorArray - Destination color array (full texture size)\r\n * @param sh - Destination SH arrays (full texture size), or undefined\r\n * @param minimum - Accumulated bounding min (updated in-place)\r\n * @param maximum - Accumulated bounding max (updated in-place)\r\n * @internal Use GaussianSplattingMesh.addPart instead\r\n */\r\n protected _appendSourceToArrays(\r\n source: GaussianSplattingMeshBase,\r\n dstOffset: number,\r\n covA: Uint16Array,\r\n covB: Uint16Array,\r\n colorArray: Uint8Array,\r\n sh: Uint8Array[] | undefined,\r\n minimum: Vector3,\r\n maximum: Vector3\r\n ): void {\r\n const srcCount = source._vertexCount;\r\n const bytesPerTexel = 16;\r\n const srcRaw = source._splatsData;\r\n if (!srcRaw || srcCount === 0) {\r\n return;\r\n }\r\n // _splatsData is typed as ArrayBuffer but callers may have stored a TypedArray before this\r\n // guard was added. Extract the underlying ArrayBuffer so Float32Array reinterprets bytes\r\n // correctly instead of value-converting each element.\r\n const srcBuffer: ArrayBuffer = srcRaw instanceof ArrayBuffer ? srcRaw : ((srcRaw as unknown as ArrayBufferView).buffer as ArrayBuffer);\r\n const uBuffer = new Uint8Array(srcBuffer);\r\n const fBuffer = new Float32Array(srcBuffer);\r\n\r\n for (let i = 0; i < srcCount; i++) {\r\n this._makeSplat(dstOffset + i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, false, i);\r\n }\r\n\r\n // Copy SH data if both source and destination have it\r\n if (sh && source._shData) {\r\n for (let texIdx = 0; texIdx < sh.length; texIdx++) {\r\n if (texIdx < source._shData.length) {\r\n sh[texIdx].set(source._shData[texIdx].subarray(0, srcCount * bytesPerTexel), dstOffset * bytesPerTexel);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Modifies the splats according to the passed transformation matrix.\r\n * @param transform defines the transform matrix to use\r\n * @returns the current mesh\r\n */\r\n public override bakeTransformIntoVertices(transform: DeepImmutable<Matrix>): Mesh {\r\n const arrayBuffer = this.splatsData;\r\n if (!arrayBuffer) {\r\n Logger.Error(\"Cannot bake transform into vertices if splatsData is not kept in RAM\");\r\n return this;\r\n }\r\n\r\n // Check for uniform scaling\r\n const m = transform.m;\r\n const scaleX = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);\r\n const scaleY = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]);\r\n const scaleZ = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]);\r\n const epsilon = 0.001;\r\n if (Math.abs(scaleX - scaleY) > epsilon || Math.abs(scaleX - scaleZ) > epsilon) {\r\n Logger.Error(\"Gaussian Splatting bakeTransformIntoVertices does not support non-uniform scaling\");\r\n return this;\r\n }\r\n\r\n const uBuffer = new Uint8Array(arrayBuffer);\r\n const fBuffer = new Float32Array(arrayBuffer);\r\n\r\n const temp = TmpVectors.Vector3[0];\r\n let index: number;\r\n const quaternion = TmpVectors.Quaternion[0];\r\n const transformedQuaternion = TmpVectors.Quaternion[1];\r\n transform.decompose(temp, transformedQuaternion, temp);\r\n for (index = 0; index < this._vertexCount; index++) {\r\n const floatIndex = index * 8; // 8 floats per splat (center.x, center.y, center.z, scale.x, scale.y, scale.z, ...)\r\n Vector3.TransformCoordinatesFromFloatsToRef(fBuffer[floatIndex], fBuffer[floatIndex + 1], fBuffer[floatIndex + 2], transform, temp);\r\n fBuffer[floatIndex] = temp.x;\r\n fBuffer[floatIndex + 1] = temp.y;\r\n fBuffer[floatIndex + 2] = temp.z;\r\n\r\n // Apply uniform scaling to splat scales\r\n fBuffer[floatIndex + 3] *= scaleX;\r\n fBuffer[floatIndex + 4] *= scaleX;\r\n fBuffer[floatIndex + 5] *= scaleX;\r\n\r\n // Unpack quaternion from uint8array (matching _GetSplat packing convention)\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\r\n // If there is a negative scaling, we need to flip the quaternion to keep the correct handedness\r\n if (this.scaling.x < 0) {\r\n quaternion.x = -quaternion.x;\r\n quaternion.w = -quaternion.w;\r\n }\r\n if (this.scaling.y < 0) {\r\n quaternion.y = -quaternion.y;\r\n quaternion.w = -quaternion.w;\r\n }\r\n if (this.scaling.z < 0) {\r\n quaternion.z = -quaternion.z;\r\n quaternion.w = -quaternion.w;\r\n }\r\n\r\n // Transform the quaternion\r\n transformedQuaternion.multiplyToRef(quaternion, quaternion);\r\n quaternion.normalize();\r\n\r\n // Pack quaternion back to uint8array (matching _GetSplat packing convention)\r\n uBuffer[32 * index + 28 + 0] = Math.round(quaternion.w * 127.5 + 127.5);\r\n uBuffer[32 * index + 28 + 1] = Math.round(quaternion.x * 127.5 + 127.5);\r\n uBuffer[32 * index + 28 + 2] = Math.round(quaternion.y * 127.5 + 127.5);\r\n uBuffer[32 * index + 28 + 3] = Math.round(quaternion.z * 127.5 + 127.5);\r\n }\r\n\r\n this.updateData(arrayBuffer, this.shData ?? undefined, { flipY: false });\r\n\r\n return this;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingMeshBase.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMeshBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Scene } from \"core/scene\";\r\nimport { type DeepImmutable, 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, type Quaternion } from \"core/Maths/math.vector\";\r\n\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 { type Effect } from \"core/Materials/effect\";\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\nconst IsNative = typeof _native !== \"undefined\";\r\nconst Native = IsNative ? _native : null;\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 /** @internal When set, skips reprocessing splats [0, previousVertexCount) and copies from cached arrays instead. */\r\n previousVertexCount?: number;\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 GaussianSplattingMeshBase. 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/**\r\n * Base class for Gaussian Splatting meshes. Contains all single-cloud rendering logic.\r\n * @internal Use GaussianSplattingMesh instead; this class is an internal implementation detail.\r\n */\r\nexport class GaussianSplattingMeshBase extends Mesh {\r\n /** @internal */\r\n public _vertexCount = 0;\r\n protected _worker: Nullable<Worker> = null;\r\n private _modelViewProjectionMatrix = Matrix.Identity();\r\n private _depthMix: BigInt64Array;\r\n protected _canPostToWorker = true;\r\n private _readyToDisplay = false;\r\n protected _covariancesATexture: Nullable<BaseTexture> = null;\r\n protected _covariancesBTexture: Nullable<BaseTexture> = null;\r\n protected _centersTexture: Nullable<BaseTexture> = null;\r\n protected _colorsTexture: Nullable<BaseTexture> = null;\r\n protected _splatPositions: Nullable<Float32Array> = null;\r\n private _splatIndex: Nullable<Float32Array> = null;\r\n protected _shTextures: Nullable<BaseTexture[]> = null;\r\n /** @internal */\r\n public _splatsData: Nullable<ArrayBuffer> = null;\r\n /** @internal */\r\n public _shData: Nullable<Uint8Array[]> = null;\r\n private _textureSize: Vector2 = new Vector2(0, 0);\r\n protected readonly _keepInRam: boolean = false;\r\n protected _alwaysRetainSplatsData: boolean = false;\r\n\r\n private _delayedTextureUpdate: Nullable<IDelayedTextureUpdate> = null;\r\n protected _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 // Cached bounding box for incremental addPart updates (O(1) vs O(N) scan of positions)\r\n protected _cachedBoundingMin: Nullable<Vector3> = null;\r\n protected _cachedBoundingMax: Nullable<Vector3> = null;\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 /** @internal */\r\n public _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 = GaussianSplattingMeshBase._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._instantiateWorker();\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 * Value is clamped between 0 and the maximum degree available from loaded data.\r\n */\r\n public get shDegree() {\r\n return this._shDegree;\r\n }\r\n\r\n public set shDegree(value: number) {\r\n const maxDegree = this._shTextures?.length ?? 0;\r\n const clamped = Math.max(0, Math.min(Math.round(value), maxDegree));\r\n if (this._shDegree === clamped) {\r\n return;\r\n }\r\n this._shDegree = clamped;\r\n this.material?.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Maximum SH degree available from the loaded data.\r\n */\r\n public get maxShDegree() {\r\n return this._shTextures?.length ?? 0;\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 * Only available if the mesh was created with keepInRam: true\r\n */\r\n public get splatsData() {\r\n return this._keepInRam ? this._splatsData : null;\r\n }\r\n\r\n /**\r\n * returns the SH data arrays\r\n * Only available if the mesh was created with keepInRam: true\r\n */\r\n public get shData() {\r\n return this._keepInRam ? this._shData : null;\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 < GaussianSplattingMeshBase._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 * GaussianSplattingMeshBase._BatchSize, 0, 6 * GaussianSplattingMeshBase._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 // Cast is safe: GaussianSplattingMeshBase is @internal; all concrete instances are GaussianSplattingMesh.\r\n gaussianSplattingMaterial.setSourceMesh(this as any);\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 \"GaussianSplattingMeshBase\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMeshBase\";\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\r\n const modelMatrix = this.getWorldMatrix();\r\n const modelViewMatrix = TmpVectors.Matrix[1];\r\n modelMatrix.multiplyToRef(cameraViewMatrix, modelViewMatrix);\r\n modelMatrix.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(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 if (cameraMesh.material && cameraMesh.material instanceof GaussianSplattingMaterial) {\r\n const gsMaterial = cameraMesh.material as GaussianSplattingMaterial;\r\n // GaussianSplattingMaterial source mesh may not have been set yet.\r\n // This happens for cloned resources from asset containers for instance,\r\n // where material is cloned before mesh.\r\n if (!gsMaterial.getSourceMesh()) {\r\n // Cast is safe: see constructor comment above.\r\n gsMaterial.setSourceMesh(this as any);\r\n }\r\n }\r\n GaussianSplattingMeshBase._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?.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 const cameraViewMatrix = camera.getViewMatrix();\r\n this._worker.postMessage(\r\n {\r\n worldMatrix: this.getWorldMatrix().m,\r\n cameraForward: [cameraViewMatrix.m[2], cameraViewMatrix.m[6], cameraViewMatrix.m[10]],\r\n cameraPosition: [camera.globalPosition.x, camera.globalPosition.y, camera.globalPosition.z],\r\n depthMix: this._depthMix,\r\n cameraId: camera.uniqueId,\r\n },\r\n [this._depthMix.buffer]\r\n );\r\n } else if (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 if (this.onBeforeRenderObservable) {\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n }\r\n const mesh = cameraViewInfos.mesh;\r\n mesh.getWorldMatrix().copyFrom(this.getWorldMatrix());\r\n\r\n // Propagate render pass material overrides (e.g., GPU picking) to the inner camera mesh.\r\n // When this mesh is rendered into a RenderTargetTexture with a material override (via setMaterialForRendering),\r\n // the override is set on this proxy mesh but needs to be applied to the actual camera mesh that does the rendering.\r\n const engine = this._scene.getEngine();\r\n const renderPassId = engine.currentRenderPassId;\r\n const renderPassMaterial = this.getMaterialForRenderPass(renderPassId);\r\n if (renderPassMaterial) {\r\n mesh.setMaterialForRenderPass(renderPassId, renderPassMaterial);\r\n }\r\n\r\n const ret = mesh.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n\r\n // Clean up the temporary override to avoid affecting other render passes\r\n if (renderPassMaterial) {\r\n mesh.setMaterialForRenderPass(renderPassId, undefined);\r\n }\r\n\r\n if (this.onAfterRenderObservable) {\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n }\r\n return ret;\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 = GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase._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(GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase._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 + GaussianSplattingMeshBase._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_1:\r\n rgba[1] = (0.5 + GaussianSplattingMeshBase._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_2:\r\n rgba[2] = (0.5 + GaussianSplattingMeshBase._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_3:\r\n rgba[3] = (0.5 + GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase.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 = GaussianSplattingMeshBase._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMeshBase._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase.ParseHeader(data);\r\n if (!header) {\r\n return data;\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMeshBase._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMeshBase._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMeshBase._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(GaussianSplattingMeshBase.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(GaussianSplattingMeshBase.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 this._cachedBoundingMin = null;\r\n this._cachedBoundingMax = null;\r\n // Note: _splatsData and _shData are intentionally kept alive after dispose.\r\n // They serve as the source reference for the compound API (addPart/removePart)\r\n // when this mesh is held by a GaussianSplattingPartProxyMesh.compoundSplatMesh.\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 protected _copyTextures(source: GaussianSplattingMeshBase): 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 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 = \"\"): GaussianSplattingMeshBase {\r\n const newGS = new GaussianSplattingMeshBase(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._instantiateWorker();\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 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 globalWorldMatrix = e.data.worldMatrix;\r\n const cameraForward = e.data.cameraForward;\r\n const cameraPosition = e.data.cameraPosition;\r\n\r\n depthMix = e.data.depthMix;\r\n\r\n if (!positions || !cameraForward) {\r\n // Sort request arrived before positions were initialized — return the buffer unchanged so the main thread can unlock _canPostToWorker.\r\n self.postMessage({ depthMix, cameraId }, [depthMix.buffer]);\r\n return;\r\n }\r\n\r\n const vertexCountPadded = (positions.length / 4 + 15) & ~0xf;\r\n\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 // depth = dot(cameraForward, worldPos - cameraPos)\r\n const camDot = cameraForward[0] * cameraPosition[0] + cameraForward[1] * cameraPosition[1] + cameraForward[2] * cameraPosition[2];\r\n\r\n const computeDepthCoeffs = (m: Float32Array): number[] => {\r\n return [\r\n cameraForward[0] * m[0] + cameraForward[1] * m[1] + cameraForward[2] * m[2],\r\n cameraForward[0] * m[4] + cameraForward[1] * m[5] + cameraForward[2] * m[6],\r\n cameraForward[0] * m[8] + cameraForward[1] * m[9] + cameraForward[2] * m[10],\r\n cameraForward[0] * m[12] + cameraForward[1] * m[13] + cameraForward[2] * m[14] - camDot,\r\n ];\r\n };\r\n\r\n try {\r\n if (partMatrices && partIndices) {\r\n // Precompute depth coefficients for each rig node\r\n const depthCoeffs = partMatrices.map((m) => computeDepthCoeffs(m));\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 coeff = depthCoeffs[partIndex];\r\n floatMix[2 * j + 1] = coeff[0] * positions[4 * j + 0] + coeff[1] * positions[4 * j + 1] + coeff[2] * positions[4 * j + 2] + coeff[3];\r\n // instead of using minus to sort back to front, we use bitwise not operator to invert the order of indices\r\n // might not be faster but a minus sign implies a reference value that may not be enough and will decrease floatting precision\r\n indices[2 * j + 1] = ~indices[2 * j + 1];\r\n }\r\n } else {\r\n // Compute depth coefficients from global world matrix\r\n const [a, b, c, d] = computeDepthCoeffs(globalWorldMatrix);\r\n for (let j = 0; j < vertexCountPadded; j++) {\r\n floatMix[2 * j + 1] = a * positions[4 * j + 0] + b * positions[4 * j + 1] + c * positions[4 * j + 2] + d;\r\n indices[2 * j + 1] = ~indices[2 * j + 1];\r\n }\r\n }\r\n\r\n depthMix.sort();\r\n } catch (sortError) {\r\n // Transient data inconsistency (e.g. partIndices/partMatrices mismatch during addPart/removePart rebuild).\r\n // Return the buffer unsorted so the main thread can unlock _canPostToWorker and retry next frame.\r\n // Logger is unavailable inside the worker — console is the only option.\r\n // eslint-disable-next-line no-console\r\n console.error(\"Gaussian splat sort worker encountered an error (will retry next frame):\", sortError);\r\n }\r\n\r\n self.postMessage({ depthMix, cameraId }, [depthMix.buffer]);\r\n }\r\n };\r\n };\r\n\r\n protected _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 /**\r\n * Processes a single splat from the source buffer (at srcIndex) and writes the result into\r\n * the destination texture arrays at dstIndex. This decoupling allows addPart to feed multiple\r\n * independent source buffers into a single set of destination arrays without merging them first.\r\n * @param dstIndex - destination splat index (into _splatPositions, covA, covB, colorArray)\r\n * @param fBuffer - float32 view of the source .splat buffer\r\n * @param uBuffer - uint8 view of the source .splat buffer\r\n * @param covA - destination covariancesA array\r\n * @param covB - destination covariancesB array\r\n * @param colorArray - destination color array\r\n * @param minimum - accumulated bounding minimum (updated in-place)\r\n * @param maximum - accumulated bounding maximum (updated in-place)\r\n * @param flipY - whether to negate the Y position\r\n * @param srcIndex - source splat index (defaults to dstIndex when omitted)\r\n */\r\n protected _makeSplat(\r\n dstIndex: 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 flipY: boolean,\r\n srcIndex: number = dstIndex\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 * srcIndex + 0];\r\n const y = fBuffer[8 * srcIndex + 1] * (flipY ? -1 : 1);\r\n const z = fBuffer[8 * srcIndex + 2];\r\n\r\n this._splatPositions![4 * dstIndex + 0] = x;\r\n this._splatPositions![4 * dstIndex + 1] = y;\r\n this._splatPositions![4 * dstIndex + 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 * srcIndex + 28 + 1] - 127.5) / 127.5,\r\n (uBuffer[32 * srcIndex + 28 + 2] - 127.5) / 127.5,\r\n (uBuffer[32 * srcIndex + 28 + 3] - 127.5) / 127.5,\r\n -(uBuffer[32 * srcIndex + 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 * srcIndex + 3 + 0] * 2, fBuffer[8 * srcIndex + 3 + 1] * 2, fBuffer[8 * srcIndex + 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 * dstIndex + 3] = factor;\r\n const transform = factor;\r\n\r\n covA[dstIndex * 4 + 0] = ToHalfFloat(covariances[0] / transform);\r\n covA[dstIndex * 4 + 1] = ToHalfFloat(covariances[1] / transform);\r\n covA[dstIndex * 4 + 2] = ToHalfFloat(covariances[2] / transform);\r\n covA[dstIndex * 4 + 3] = ToHalfFloat(covariances[3] / transform);\r\n covB[dstIndex * covBSItemSize + 0] = ToHalfFloat(covariances[4] / transform);\r\n covB[dstIndex * covBSItemSize + 1] = ToHalfFloat(covariances[5] / transform);\r\n\r\n // colors\r\n colorArray[dstIndex * 4 + 0] = uBuffer[32 * srcIndex + 24 + 0];\r\n colorArray[dstIndex * 4 + 1] = uBuffer[32 * srcIndex + 24 + 1];\r\n colorArray[dstIndex * 4 + 2] = uBuffer[32 * srcIndex + 24 + 2];\r\n colorArray[dstIndex * 4 + 3] = uBuffer[32 * srcIndex + 24 + 3];\r\n }\r\n\r\n protected _onUpdateTextures(_textureSize: Vector2) {}\r\n\r\n /**\r\n * Called when part index data is received during a data load. Override to store and manage\r\n * part index state (e.g. allocating the padded Uint8Array).\r\n * No-op in the base class.\r\n * @param _partIndices - the raw part indices passed in by the caller\r\n * @param _textureLength - the padded texture length (width × height) to allocate into\r\n */\r\n protected _onIndexDataReceived(_partIndices: Uint8Array, _textureLength: number): void {}\r\n\r\n /**\r\n * Called at the start of an incremental texture update, before any splats are processed.\r\n * Override to perform incremental-specific setup, such as ensuring the part-index GPU texture\r\n * exists before the sub-texture upload begins.\r\n * No-op in the base class.\r\n * @param _textureSize - current texture dimensions\r\n */\r\n protected _onIncrementalUpdateStart(_textureSize: Vector2): void {}\r\n\r\n /**\r\n * Whether this mesh is in compound mode (has at least one part added via addPart).\r\n * Returns `false` in the base class; overridden to return `true` in the compound subclass.\r\n * Consumed by the material and depth renderer to toggle compound-specific shader paths.\r\n * @internal\r\n */\r\n public get isCompound(): boolean {\r\n return false;\r\n }\r\n\r\n protected _setDelayedTextureUpdate(covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, sh?: Uint8Array[]): void {\r\n this._delayedTextureUpdate = { covA, covB, colors: colorArray, centers: this._splatPositions!, sh };\r\n }\r\n\r\n // NB: partIndices is assumed to be padded to a round texture size\r\n protected _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 const firstTime = this._covariancesATexture === null;\r\n const textureSizeChanged = this._textureSize.y != textureSize.y;\r\n\r\n if (!firstTime && !textureSizeChanged) {\r\n this._setDelayedTextureUpdate(covA, covB, colorArray, 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 // 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 this._onUpdateTextures(textureSize);\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 this._onUpdateTextures(textureSize);\r\n\r\n if (firstTime) {\r\n this._instantiateWorker();\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 }\r\n this._postToWorker(true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks whether the GPU textures can be incrementally updated for a new addPart operation,\r\n * avoiding a full texture re-upload for existing splats.\r\n * Requires that the GPU textures already exist and the texture height won't change.\r\n * @param previousVertexCount - The number of splats previously committed to GPU\r\n * @param vertexCount - The new total number of splats\r\n * @returns true when only the new splat region needs to be uploaded\r\n */\r\n protected _canReuseCachedData(previousVertexCount: number, vertexCount: number): boolean {\r\n if (previousVertexCount <= 0 || previousVertexCount > vertexCount) {\r\n return false;\r\n }\r\n if (this._splatPositions === null || this._cachedBoundingMin === null || this._cachedBoundingMax === null) {\r\n return false;\r\n }\r\n if (this._covariancesATexture === null) {\r\n return false;\r\n }\r\n // Can only do an incremental GPU update if texture height doesn't need to grow\r\n const newTextureSize = this._getTextureSize(vertexCount);\r\n return newTextureSize.y === this._textureSize.y;\r\n }\r\n\r\n /**\r\n * Posts updated positions to the sort worker and marks the sort as dirty.\r\n * Called after processing new splats so the worker can re-sort with the complete position set.\r\n * Subclasses (e.g. compound) may override to additionally post part-index data.\r\n */\r\n protected _notifyWorkerNewData(): void {\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 }\r\n this._sortIsDirty = true;\r\n }\r\n\r\n private *_updateData(\r\n data: ArrayBuffer,\r\n isAsync: boolean,\r\n sh?: Uint8Array[],\r\n partIndices?: Uint8Array,\r\n { flipY = false, previousVertexCount = 0 }: IUpdateOptions = {}\r\n ): Coroutine<void> {\r\n if (!this._covariancesATexture) {\r\n this._readyToDisplay = false;\r\n }\r\n\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n // Optionally store the raw splat buffer as an ArrayBuffer. This is the source reference\r\n // used by _addPartsInternal when a full texture rebuild is needed. Use uBuffer.buffer as\r\n // the canonical backing store — it is always a tightly packed ArrayBuffer containing\r\n // exactly the bytes we processed, avoiding issues with ArrayBufferView.byteOffset.\r\n if (this._keepInRam || this._alwaysRetainSplatsData) {\r\n this._splatsData = uBuffer.buffer;\r\n this._shData = sh ? sh.map((arr) => new Uint8Array(arr)) : null;\r\n } else {\r\n this._splatsData = null;\r\n this._shData = null;\r\n }\r\n\r\n const vertexCount = uBuffer.length / GaussianSplattingMeshBase._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 = GaussianSplattingMeshBase.ProgressiveUpdateAmount ?? textureSize.y;\r\n\r\n // Delegate part index storage to subclasses (e.g. GaussianSplattingMesh compound mode).\r\n if (partIndices) {\r\n this._onIndexDataReceived(partIndices, textureLength);\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 const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n const covA = new Uint16Array(textureLength * 4);\r\n const covB = new Uint16Array(covBSItemSize * textureLength);\r\n const colorArray = new Uint8Array(textureLength * 4);\r\n\r\n // Incremental path: only upload the rows that contain new splats, leaving the already-committed\r\n // GPU region untouched. Falls through to the full-rebuild path when textures don't exist yet\r\n // or the texture height needs to grow.\r\n const incremental = this._canReuseCachedData(previousVertexCount, vertexCount);\r\n\r\n // The first texture line/texel that must be (re-)processed and uploaded.\r\n // For a full rebuild this is 0. For an incremental update it is the row boundary just before\r\n // previousVertexCount so that any partial old row is re-processed as a complete row.\r\n const firstNewLine = incremental ? Math.floor(previousVertexCount / textureSize.x) : 0;\r\n const firstNewTexel = firstNewLine * textureSize.x;\r\n\r\n // Preserve old positions before replacing the array (incremental only)\r\n const oldPositions = this._splatPositions;\r\n this._splatPositions = new Float32Array(4 * textureLength);\r\n\r\n if (incremental) {\r\n this._splatPositions.set(oldPositions!.subarray(0, previousVertexCount * 4));\r\n minimum.copyFrom(this._cachedBoundingMin!);\r\n maximum.copyFrom(this._cachedBoundingMax!);\r\n // Let subclasses handle any incremental-specific setup (e.g. ensuring part-index textures)\r\n this._onIncrementalUpdateStart(textureSize);\r\n }\r\n\r\n if (GaussianSplattingMeshBase.ProgressiveUpdateAmount) {\r\n // Full rebuild: create GPU textures upfront with empty data; the loop fills them in batches via _updateSubTextures\r\n if (!incremental) {\r\n this._updateTextures(covA, covB, colorArray, sh);\r\n }\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 batchEndLine = Math.min(updateLine + lineCountUpdate, textureSize.y);\r\n\r\n // Skip batches that lie entirely within the already-committed GPU region\r\n if (batchEndLine <= firstNewLine) {\r\n continue;\r\n }\r\n\r\n // Clip upload start to firstNewLine to avoid overwriting committed data with zeros\r\n const uploadStartLine = Math.max(updateLine, firstNewLine);\r\n const uploadStartTexel = uploadStartLine * textureSize.x;\r\n const batchEndTexel = batchEndLine * textureSize.x;\r\n\r\n for (let splatIdx = uploadStartTexel; splatIdx < batchEndTexel; splatIdx++) {\r\n if (splatIdx < vertexCount) {\r\n this._makeSplat(splatIdx, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, flipY);\r\n } else {\r\n this._makeEmptySplat(splatIdx, covA, covB, colorArray);\r\n }\r\n }\r\n\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, uploadStartLine, batchEndLine - uploadStartLine, sh);\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n this._notifyWorkerNewData();\r\n } else {\r\n // Process splats from firstNewTexel: re-processes the partial old row (incremental) or processes everything from 0 (full rebuild)\r\n for (let i = firstNewTexel; i < vertexCount; i++) {\r\n this._makeSplat(i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, flipY);\r\n if (isAsync && i % GaussianSplattingMeshBase._SplatBatchSize === 0) {\r\n yield;\r\n }\r\n }\r\n\r\n // Incremental pads the full texture; full rebuild pads only to the next 16-splat boundary\r\n const paddedEnd = incremental ? textureLength : (vertexCount + 15) & ~0xf;\r\n for (let i = vertexCount; i < paddedEnd; i++) {\r\n this._makeEmptySplat(i, covA, covB, colorArray);\r\n }\r\n\r\n if (incremental) {\r\n // Partial upload: only rows from firstNewLine onwards; existing rows stay on GPU\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, firstNewLine, textureSize.y - firstNewLine, sh);\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n this._notifyWorkerNewData();\r\n } else {\r\n // Full upload: create or replace all GPU textures\r\n this._updateTextures(covA, covB, colorArray, sh);\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n this._sortIsDirty = true;\r\n }\r\n }\r\n\r\n // Cache bounding box for the next incremental addPart call\r\n this._cachedBoundingMin = minimum.clone();\r\n this._cachedBoundingMax = maximum.clone();\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 protected _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) && !IsNative) {\r\n this._depthMix = new BigInt64Array(paddedVertexCount);\r\n }\r\n\r\n this.forcedInstanceCount = Math.max(paddedVertexCount >> 4, 1);\r\n }\r\n\r\n protected _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 protected _updateSubTextures(centers: Float32Array, covA: Uint16Array, covB: Uint16Array, colors: Uint8Array, lineStart: number, lineCount: number, sh?: Uint8Array[]): void {\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 this._updateTextureFromData(this._covariancesATexture!, covAView, textureSize.x, lineStart, lineCount);\r\n this._updateTextureFromData(this._covariancesBTexture!, covBView, textureSize.x, lineStart, lineCount);\r\n this._updateTextureFromData(this._centersTexture!, centersView, textureSize.x, lineStart, lineCount);\r\n this._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 this._updateTextureFromData(this._shTextures![i], shView, textureSize.x, lineStart, lineCount);\r\n }\r\n }\r\n }\r\n\r\n protected _instantiateWorker(): 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 (IsNative) {\r\n return;\r\n }\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n // Reset the posting gate so the new worker can immediately receive sort requests.\r\n // If the previous worker was terminated mid-sort it would never have set _canPostToWorker\r\n // back to true, leaving the sort permanently frozen on the new worker.\r\n this._canPostToWorker = true;\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMeshBase._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\r\n this._worker.postMessage({ positions }, [positions.buffer]);\r\n this._onWorkerCreated(this._worker!);\r\n\r\n this._worker.onerror = () => {\r\n // If the worker throws an unhandled error, unlock the posting gate so the next frame can retry the sort.\r\n this._canPostToWorker = true;\r\n };\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 );\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 protected _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 * Called after the sort worker has been created and the initial positions message has been sent.\r\n * Override in subclasses to post any additional setup messages the worker needs (e.g. group\r\n * indices, per-part matrices, etc.).\r\n * @param _worker the newly created worker\r\n */\r\n protected _onWorkerCreated(_worker: Worker): void {}\r\n\r\n /**\r\n * Called by the material to bind any extra shader uniforms that are specific to this mesh type.\r\n * The base implementation is a no-op; override in subclasses to bind additional data.\r\n * @param _effect the shader effect that is being bound\r\n * @internal\r\n */\r\n public bindExtraEffectUniforms(_effect: Effect): void {}\r\n\r\n /**\r\n * Processes all splats from a source GaussianSplattingMesh directly into the destination\r\n * texture arrays starting at dstOffset. This is the core of the texture-direct compound API:\r\n * no merged CPU buffer is ever created; each source mesh is written straight into its region.\r\n *\r\n * @param source - The source mesh whose splats are appended\r\n * @param dstOffset - The destination splat index at which writing starts\r\n * @param covA - Destination covA array (full texture size)\r\n * @param covB - Destination covB array (full texture size)\r\n * @param colorArray - Destination color array (full texture size)\r\n * @param sh - Destination SH arrays (full texture size), or undefined\r\n * @param minimum - Accumulated bounding min (updated in-place)\r\n * @param maximum - Accumulated bounding max (updated in-place)\r\n * @internal Use GaussianSplattingMesh.addPart instead\r\n */\r\n protected _appendSourceToArrays(\r\n source: GaussianSplattingMeshBase,\r\n dstOffset: number,\r\n covA: Uint16Array,\r\n covB: Uint16Array,\r\n colorArray: Uint8Array,\r\n sh: Uint8Array[] | undefined,\r\n minimum: Vector3,\r\n maximum: Vector3\r\n ): void {\r\n const srcCount = source._vertexCount;\r\n const bytesPerTexel = 16;\r\n const srcRaw = source._splatsData;\r\n if (!srcRaw || srcCount === 0) {\r\n return;\r\n }\r\n // _splatsData is typed as ArrayBuffer but callers may have stored a TypedArray before this\r\n // guard was added. Extract the underlying ArrayBuffer so Float32Array reinterprets bytes\r\n // correctly instead of value-converting each element.\r\n const srcBuffer: ArrayBuffer = srcRaw instanceof ArrayBuffer ? srcRaw : ((srcRaw as unknown as ArrayBufferView).buffer as ArrayBuffer);\r\n const uBuffer = new Uint8Array(srcBuffer);\r\n const fBuffer = new Float32Array(srcBuffer);\r\n\r\n for (let i = 0; i < srcCount; i++) {\r\n this._makeSplat(dstOffset + i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, false, i);\r\n }\r\n\r\n // Copy SH data if both source and destination have it\r\n if (sh && source._shData) {\r\n for (let texIdx = 0; texIdx < sh.length; texIdx++) {\r\n if (texIdx < source._shData.length) {\r\n sh[texIdx].set(source._shData[texIdx].subarray(0, srcCount * bytesPerTexel), dstOffset * bytesPerTexel);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Modifies the splats according to the passed transformation matrix.\r\n * @param transform defines the transform matrix to use\r\n * @returns the current mesh\r\n */\r\n public override bakeTransformIntoVertices(transform: DeepImmutable<Matrix>): Mesh {\r\n const arrayBuffer = this.splatsData;\r\n if (!arrayBuffer) {\r\n Logger.Error(\"Cannot bake transform into vertices if splatsData is not kept in RAM\");\r\n return this;\r\n }\r\n\r\n // Check for uniform scaling\r\n const m = transform.m;\r\n const scaleX = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);\r\n const scaleY = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]);\r\n const scaleZ = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]);\r\n const epsilon = 0.001;\r\n if (Math.abs(scaleX - scaleY) > epsilon || Math.abs(scaleX - scaleZ) > epsilon) {\r\n Logger.Error(\"Gaussian Splatting bakeTransformIntoVertices does not support non-uniform scaling\");\r\n return this;\r\n }\r\n\r\n const uBuffer = new Uint8Array(arrayBuffer);\r\n const fBuffer = new Float32Array(arrayBuffer);\r\n\r\n const temp = TmpVectors.Vector3[0];\r\n let index: number;\r\n const quaternion = TmpVectors.Quaternion[0];\r\n const transformedQuaternion = TmpVectors.Quaternion[1];\r\n transform.decompose(temp, transformedQuaternion, temp);\r\n for (index = 0; index < this._vertexCount; index++) {\r\n const floatIndex = index * 8; // 8 floats per splat (center.x, center.y, center.z, scale.x, scale.y, scale.z, ...)\r\n Vector3.TransformCoordinatesFromFloatsToRef(fBuffer[floatIndex], fBuffer[floatIndex + 1], fBuffer[floatIndex + 2], transform, temp);\r\n fBuffer[floatIndex] = temp.x;\r\n fBuffer[floatIndex + 1] = temp.y;\r\n fBuffer[floatIndex + 2] = temp.z;\r\n\r\n // Apply uniform scaling to splat scales\r\n fBuffer[floatIndex + 3] *= scaleX;\r\n fBuffer[floatIndex + 4] *= scaleX;\r\n fBuffer[floatIndex + 5] *= scaleX;\r\n\r\n // Unpack quaternion from uint8array (matching _GetSplat packing convention)\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\r\n // If there is a negative scaling, we need to flip the quaternion to keep the correct handedness\r\n if (this.scaling.x < 0) {\r\n quaternion.x = -quaternion.x;\r\n quaternion.w = -quaternion.w;\r\n }\r\n if (this.scaling.y < 0) {\r\n quaternion.y = -quaternion.y;\r\n quaternion.w = -quaternion.w;\r\n }\r\n if (this.scaling.z < 0) {\r\n quaternion.z = -quaternion.z;\r\n quaternion.w = -quaternion.w;\r\n }\r\n\r\n // Transform the quaternion\r\n transformedQuaternion.multiplyToRef(quaternion, quaternion);\r\n quaternion.normalize();\r\n\r\n // Pack quaternion back to uint8array (matching _GetSplat packing convention)\r\n uBuffer[32 * index + 28 + 0] = Math.round(quaternion.w * 127.5 + 127.5);\r\n uBuffer[32 * index + 28 + 1] = Math.round(quaternion.x * 127.5 + 127.5);\r\n uBuffer[32 * index + 28 + 2] = Math.round(quaternion.y * 127.5 + 127.5);\r\n uBuffer[32 * index + 28 + 3] = Math.round(quaternion.z * 127.5 + 127.5);\r\n }\r\n\r\n this.updateData(arrayBuffer, this.shData ?? undefined, { flipY: false });\r\n\r\n return this;\r\n }\r\n}\r\n"]}