@babylonjs/core 7.36.0 → 7.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Collisions/gpuPicker.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/Extensions/engine.rawTexture.d.ts +8 -8
- package/Engines/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.rawTexture.d.ts +9 -9
- package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/WebGPU/webgpuConstants.d.ts +6 -0
- package/Engines/WebGPU/webgpuConstants.js +6 -0
- package/Engines/WebGPU/webgpuConstants.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.js +18 -0
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +6 -0
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/abstractEngine.d.ts +1 -1
- package/Engines/abstractEngine.js +4 -4
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +17 -1
- package/Engines/constants.js +17 -1
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +31 -1
- package/Engines/engine.js +17 -1
- package/Engines/engine.js.map +1 -1
- package/Engines/engineCapabilities.d.ts +2 -0
- package/Engines/engineCapabilities.js.map +1 -1
- package/Engines/nativeEngine.js +1 -0
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.d.ts +2 -2
- package/Engines/nullEngine.js +3 -2
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.functions.d.ts +4 -0
- package/Engines/thinEngine.functions.js +17 -0
- package/Engines/thinEngine.functions.js.map +1 -1
- package/Engines/thinEngine.js +39 -9
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Helpers/environmentHelper.js.map +1 -1
- package/Layers/effectLayer.d.ts +1 -1
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.d.ts +1 -1
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.d.ts +1 -1
- package/Layers/highlightLayer.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Textures/MultiviewRenderTarget.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/colorGradingTexture.js.map +1 -1
- package/Materials/Textures/mirrorTexture.js.map +1 -1
- package/Materials/Textures/multiRenderTarget.js.map +1 -1
- package/Materials/Textures/rawCubeTexture.d.ts +2 -2
- package/Materials/Textures/rawCubeTexture.js +2 -2
- package/Materials/Textures/rawCubeTexture.js.map +1 -1
- package/Materials/Textures/rawTexture.js.map +1 -1
- package/Materials/Textures/rawTexture2DArray.d.ts +1 -1
- package/Materials/Textures/rawTexture2DArray.js +1 -1
- package/Materials/Textures/rawTexture2DArray.js.map +1 -1
- package/Materials/Textures/rawTexture3D.d.ts +1 -1
- package/Materials/Textures/rawTexture3D.js +1 -1
- package/Materials/Textures/rawTexture3D.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/drawWrapper.d.ts +6 -1
- package/Materials/drawWrapper.js +18 -2
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effect.d.ts +6 -1
- package/Materials/effect.functions.d.ts +5 -0
- package/Materials/effect.functions.js +19 -0
- package/Materials/effect.functions.js.map +1 -1
- package/Materials/effect.js +22 -20
- package/Materials/effect.js.map +1 -1
- package/Materials/effect.webgl.functions.js +12 -4
- package/Materials/effect.webgl.functions.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +2 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +5 -3
- package/Meshes/abstractMesh.js +9 -7
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/subMesh.d.ts +5 -3
- package/Meshes/subMesh.js +9 -7
- package/Meshes/subMesh.js.map +1 -1
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
- package/Misc/dds.d.ts +1 -1
- package/Misc/dds.js.map +1 -1
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/observable.d.ts +1 -3
- package/Misc/observable.js +7 -7
- package/Misc/observable.js.map +1 -1
- package/Misc/screenshotTools.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +3 -0
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Misc/textureTools.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
- package/PostProcesses/bloomMergePostProcess.js.map +1 -1
- package/PostProcesses/blurPostProcess.js.map +1 -1
- package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
- package/PostProcesses/circleOfConfusionPostProcess.js.map +1 -1
- package/PostProcesses/convolutionPostProcess.js.map +1 -1
- package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
- package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
- package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
- package/PostProcesses/fxaaPostProcess.js.map +1 -1
- package/PostProcesses/grainPostProcess.js.map +1 -1
- package/PostProcesses/highlightsPostProcess.d.ts +1 -1
- package/PostProcesses/highlightsPostProcess.js +1 -1
- package/PostProcesses/highlightsPostProcess.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/motionBlurPostProcess.js.map +1 -1
- package/PostProcesses/passPostProcess.js.map +1 -1
- package/PostProcesses/postProcess.d.ts +1 -1
- package/PostProcesses/postProcess.js.map +1 -1
- package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
- package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
- package/PostProcesses/sharpenPostProcess.js.map +1 -1
- package/PostProcesses/subSurfaceScatteringPostProcess.js.map +1 -1
- package/PostProcesses/tonemapPostProcess.d.ts +1 -1
- package/PostProcesses/tonemapPostProcess.js +1 -1
- package/PostProcesses/tonemapPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
- package/Rendering/prePassRenderer.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { _processShaderCode, createAndPreparePipelineContext } from "./effect.functions.js";
|
|
2
|
-
import { _executeWhenRenderingStateIsCompiled, _preparePipelineContext, createPipelineContext, getStateObject } from "../Engines/thinEngine.functions.js";
|
|
1
|
+
import { _processShaderCode, _retryWithInterval, createAndPreparePipelineContext } from "./effect.functions.js";
|
|
2
|
+
import { _executeWhenRenderingStateIsCompiled, _isRenderingStateCompiled, _preparePipelineContext, createPipelineContext, getStateObject } from "../Engines/thinEngine.functions.js";
|
|
3
3
|
import { _getGlobalDefines } from "../Engines/abstractEngine.functions.js";
|
|
4
4
|
import { ShaderStore } from "../Engines/shaderStore.js";
|
|
5
|
+
import { WebGL2ShaderProcessor } from "../Engines/WebGL/webGL2ShaderProcessors.js";
|
|
5
6
|
/**
|
|
6
7
|
* Generate a pipeline context from the provided options
|
|
7
8
|
* Note - at the moment only WebGL is supported
|
|
@@ -26,7 +27,8 @@ export async function generatePipelineContext(options, context, createPipelineCo
|
|
|
26
27
|
break;
|
|
27
28
|
case "WEBGL2":
|
|
28
29
|
default:
|
|
29
|
-
|
|
30
|
+
// default to WebGL2, which is included in the package. Avoid async-load the default.
|
|
31
|
+
processor = new WebGL2ShaderProcessor();
|
|
30
32
|
break;
|
|
31
33
|
}
|
|
32
34
|
}
|
|
@@ -67,7 +69,13 @@ export async function generatePipelineContext(options, context, createPipelineCo
|
|
|
67
69
|
transformFeedbackVaryings: null,
|
|
68
70
|
...options.extendedCreatePipelineOptions,
|
|
69
71
|
}, createPipelineContextInjection, _preparePipelineContext, _executeWhenRenderingStateIsCompiled);
|
|
70
|
-
resolve
|
|
72
|
+
// the default behavior so far. If not async or no request to wait for isReady, resolve immediately
|
|
73
|
+
if (!options.waitForIsReady || !pipeline.isAsync) {
|
|
74
|
+
resolve(pipeline);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
_retryWithInterval(() => _isRenderingStateCompiled(pipeline, context), () => resolve(pipeline), () => reject(new Error("Timeout while waiting for pipeline to be ready")));
|
|
78
|
+
}
|
|
71
79
|
}
|
|
72
80
|
catch (e) {
|
|
73
81
|
reject(e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect.webgl.functions.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effect.webgl.functions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"effect.webgl.functions.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effect.webgl.functions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { IPipelineGenerationOptions } from \"./effect.functions\";\r\nimport { _processShaderCode, _retryWithInterval, createAndPreparePipelineContext } from \"./effect.functions\";\r\nimport type { IPipelineContext } from \"core/Engines/IPipelineContext\";\r\nimport { _executeWhenRenderingStateIsCompiled, _isRenderingStateCompiled, _preparePipelineContext, createPipelineContext, getStateObject } from \"core/Engines/thinEngine.functions\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { _getGlobalDefines } from \"core/Engines/abstractEngine.functions\";\r\nimport type { ProcessingOptions } from \"core/Engines/Processors/shaderProcessingOptions\";\r\nimport { ShaderStore } from \"core/Engines/shaderStore\";\r\nimport { WebGL2ShaderProcessor } from \"core/Engines/WebGL/webGL2ShaderProcessors\";\r\n\r\n/**\r\n * Generate a pipeline context from the provided options\r\n * Note - at the moment only WebGL is supported\r\n * @param options the options to be used when generating the pipeline\r\n * @param context the context to be used when creating the pipeline\r\n * @param createPipelineContextInjection the function to create the pipeline context\r\n * @param _preparePipelineContextInjection the function to prepare the pipeline context\r\n * @returns a promise that resolves to the pipeline context\r\n */\r\nexport async function generatePipelineContext(\r\n options: IPipelineGenerationOptions,\r\n context: WebGL2RenderingContext | WebGLRenderingContext,\r\n createPipelineContextInjection: typeof AbstractEngine.prototype.createPipelineContext = createPipelineContext.bind(null, context),\r\n _preparePipelineContextInjection: typeof AbstractEngine.prototype._preparePipelineContext = _preparePipelineContext\r\n): Promise<IPipelineContext> {\r\n // make sure the state object exists\r\n getStateObject(context);\r\n const platformName = options.platformName || \"WEBGL2\";\r\n let processor = options.extendedProcessingOptions?.processor;\r\n const language = options.shaderLanguage || ShaderLanguage.GLSL;\r\n // auto-populate the processor if not provided\r\n // Note - async but can be synchronous if we load all dependencies at the start\r\n if (!processor) {\r\n switch (platformName) {\r\n case \"WEBGL1\":\r\n processor = new (await import(\"core/Engines/WebGL/webGLShaderProcessors\")).WebGLShaderProcessor();\r\n break;\r\n case \"WEBGL2\":\r\n default:\r\n // default to WebGL2, which is included in the package. Avoid async-load the default.\r\n processor = new WebGL2ShaderProcessor();\r\n break;\r\n }\r\n }\r\n const shaderDef: any = options.shaderNameOrContent;\r\n const vertex = shaderDef.vertex || shaderDef.vertexSource || shaderDef;\r\n const fragment = shaderDef.fragment || shaderDef.fragmentSource || shaderDef;\r\n const globalDefines = _getGlobalDefines()?.split(\"\\n\") || [];\r\n const defines = [...(options.defines || []), ...(options.addGlobalDefines ? globalDefines : [])];\r\n const key = options.key?.replace(/\\r/g, \"\").replace(/\\n/g, \"|\") || vertex + \"+\" + fragment + \"@\" + defines.join(\"|\");\r\n // defaults, extended with optionally provided options\r\n const processorOptions: ProcessingOptions = {\r\n defines,\r\n indexParameters: undefined,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: true,\r\n processor,\r\n supportsUniformBuffers: false,\r\n shadersRepository: ShaderStore.GetShadersRepository(language),\r\n includesShadersStore: ShaderStore.GetIncludesShadersStore(language),\r\n version: platformName === \"WEBGL2\" ? \"200\" : \"100\",\r\n platformName,\r\n processingContext: null,\r\n isNDCHalfZRange: false,\r\n useReverseDepthBuffer: false,\r\n ...options.extendedProcessingOptions,\r\n };\r\n return new Promise((resolve, reject) => {\r\n try {\r\n _processShaderCode(\r\n processorOptions,\r\n shaderDef,\r\n undefined,\r\n function (vertexCode, fragmentCode) {\r\n try {\r\n const pipeline = createAndPreparePipelineContext(\r\n {\r\n name: key,\r\n vertex: vertexCode,\r\n fragment: fragmentCode,\r\n context,\r\n defines: defines.length ? defines.join(\"\\n\") : null,\r\n shaderProcessingContext: options.extendedProcessingOptions?.processingContext || null,\r\n transformFeedbackVaryings: null,\r\n ...options.extendedCreatePipelineOptions,\r\n },\r\n createPipelineContextInjection,\r\n _preparePipelineContext,\r\n _executeWhenRenderingStateIsCompiled\r\n );\r\n // the default behavior so far. If not async or no request to wait for isReady, resolve immediately\r\n if (!options.waitForIsReady || !pipeline.isAsync) {\r\n resolve(pipeline);\r\n } else {\r\n _retryWithInterval(\r\n () => _isRenderingStateCompiled(pipeline, context),\r\n () => resolve(pipeline),\r\n () => reject(new Error(\"Timeout while waiting for pipeline to be ready\"))\r\n );\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n },\r\n language\r\n );\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n"]}
|
|
@@ -195,7 +195,8 @@ export declare class GaussianSplattingMesh extends Mesh {
|
|
|
195
195
|
* @returns true when ready
|
|
196
196
|
*/
|
|
197
197
|
isReady(completeCheck?: boolean): boolean;
|
|
198
|
-
|
|
198
|
+
/** @internal */
|
|
199
|
+
_postToWorker(forced?: boolean): void;
|
|
199
200
|
/**
|
|
200
201
|
* 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
|
|
201
202
|
* @param subMesh defines the subMesh to render
|
|
@@ -234,6 +234,7 @@ export class GaussianSplattingMesh extends Mesh {
|
|
|
234
234
|
}
|
|
235
235
|
return true;
|
|
236
236
|
}
|
|
237
|
+
/** @internal */
|
|
237
238
|
_postToWorker(forced = false) {
|
|
238
239
|
const frameId = this.getScene().getFrameId();
|
|
239
240
|
if ((forced || frameId !== this._frameIdLastUpdate) && this._worker && this._scene.activeCamera && this._canPostToWorker) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplattingMesh.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { SubMesh } from \"../subMesh\";\r\nimport type { AbstractMesh } from \"../abstractMesh\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Quaternion } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport \"core/Meshes/thinInstanceMesh\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { ToHalfFloat } from \"core/Misc/textureTools\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { runCoroutineSync, runCoroutineAsync, createYieldingScheduler, type Coroutine } from \"core/Misc/coroutine\";\r\n\r\ninterface DelayedTextureUpdate {\r\n covA: Uint16Array;\r\n covB: Uint16Array;\r\n colors: Uint8Array;\r\n centers: Float32Array;\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\n// @internal\r\ninterface CompressedPLYChunk {\r\n min: Vector3;\r\n max: Vector3;\r\n minScale: Vector3;\r\n maxScale: Vector3;\r\n}\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 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\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/**\r\n * Class used to render a gaussian splatting mesh\r\n */\r\nexport class GaussianSplattingMesh extends Mesh {\r\n private _vertexCount = 0;\r\n private _worker: Nullable<Worker> = null;\r\n private _frameIdLastUpdate = -1;\r\n private _modelViewMatrix = Matrix.Identity();\r\n private _depthMix: BigInt64Array;\r\n private _canPostToWorker = true;\r\n private _readyToDisplay = false;\r\n private _covariancesATexture: Nullable<BaseTexture> = null;\r\n private _covariancesBTexture: Nullable<BaseTexture> = null;\r\n private _centersTexture: Nullable<BaseTexture> = null;\r\n private _colorsTexture: Nullable<BaseTexture> = null;\r\n private _splatPositions: Nullable<Float32Array> = null;\r\n private _splatIndex: Nullable<Float32Array> = null;\r\n //@ts-expect-error\r\n private _covariancesA: Nullable<Uint16Array> = null;\r\n //@ts-expect-error\r\n private _covariancesB: Nullable<Uint16Array> = null;\r\n //@ts-expect-error\r\n private _colors: Nullable<Uint8Array> = null;\r\n private readonly _keepInRam: boolean = false;\r\n\r\n private _delayedTextureUpdate: Nullable<DelayedTextureUpdate> = null;\r\n private _oldDirection = new Vector3();\r\n private _useRGBACovariants = false;\r\n private _material: Nullable<Material> = null;\r\n\r\n private _tmpCovariances = [0, 0, 0, 0, 0, 0];\r\n private _sortIsDirty = false;\r\n\r\n private static _RowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // Vector3 position, Vector3 scale, 1 u8 quaternion, 1 color with alpha\r\n private static _SH_C0 = 0.28209479177387814;\r\n // batch size between 2 yield calls. This value is a tradeoff between updates overhead and framerate hiccups\r\n // This step is faster the PLY conversion. So batch size can be bigger\r\n private static _SplatBatchSize = 327680;\r\n // batch size between 2 yield calls during the PLY to splat conversion.\r\n private static _PlyConversionBatchSize = 32768;\r\n\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 * set rendering material\r\n */\r\n public override set material(value: Material) {\r\n this._material = value;\r\n this._material.backFaceCulling = true;\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 /**\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 const vertexData = new VertexData();\r\n\r\n // Use an intanced quad or triangle. Triangle might be a bit faster because of less shader invocation but I didn't see any difference.\r\n // Keeping both and use triangle for now.\r\n // for quad, use following lines\r\n //vertexData.positions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0];\r\n //vertexData.indices = [0, 1, 2, 0, 2, 3];\r\n vertexData.positions = [-3, -2, 0, 3, -2, 0, 0, 4, 0];\r\n vertexData.indices = [0, 1, 2];\r\n vertexData.applyToMesh(this);\r\n\r\n this.subMeshes = [];\r\n // for quad, use following line\r\n //new SubMesh(0, 0, 4, 0, 6, this);\r\n new SubMesh(0, 0, 3, 0, 3, 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.loadFileAsync(url);\r\n }\r\n this._material = new GaussianSplattingMaterial(this.name + \"_material\", this._scene);\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns \"GaussianSplattingMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMesh\";\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices (splats) within the mesh\r\n * @returns the total number of vertices\r\n */\r\n public override getTotalVertices(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns true when ready\r\n */\r\n public override isReady(completeCheck = false): boolean {\r\n if (!super.isReady(completeCheck, true)) {\r\n return false;\r\n }\r\n\r\n if (!this._readyToDisplay) {\r\n // mesh is ready when worker has done at least 1 sorting\r\n this._postToWorker(true);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n protected _postToWorker(forced = false): void {\r\n const frameId = this.getScene().getFrameId();\r\n if ((forced || frameId !== this._frameIdLastUpdate) && this._worker && this._scene.activeCamera && this._canPostToWorker) {\r\n const cameraMatrix = this._scene.activeCamera.getViewMatrix();\r\n this.getWorldMatrix().multiplyToRef(cameraMatrix, this._modelViewMatrix);\r\n cameraMatrix.invertToRef(TmpVectors.Matrix[0]);\r\n this.getWorldMatrix().multiplyToRef(TmpVectors.Matrix[0], TmpVectors.Matrix[1]);\r\n Vector3.TransformNormalToRef(Vector3.Forward(this._scene.useRightHandedSystem), TmpVectors.Matrix[1], TmpVectors.Vector3[2]);\r\n TmpVectors.Vector3[2].normalize();\r\n\r\n const dot = Vector3.Dot(TmpVectors.Vector3[2], this._oldDirection);\r\n if (forced || Math.abs(dot - 1) >= 0.01) {\r\n this._oldDirection.copyFrom(TmpVectors.Vector3[2]);\r\n this._frameIdLastUpdate = frameId;\r\n this._canPostToWorker = false;\r\n this._worker.postMessage({ view: this._modelViewMatrix.m, depthMix: this._depthMix, useRightHandedSystem: this._scene.useRightHandedSystem }, [\r\n this._depthMix.buffer,\r\n ]);\r\n }\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 return super.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n\r\n private static _TypeNameToEnum(name: string): PLYType {\r\n switch (name) {\r\n case \"float\":\r\n return PLYType.FLOAT;\r\n case \"int\":\r\n return PLYType.INT;\r\n break;\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 }\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 }\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 for (const prop of filtered) {\r\n if (prop.startsWith(\"property \")) {\r\n const [, typeName, name] = prop.split(\" \");\r\n\r\n const value = GaussianSplattingMesh._ValueNameToEnum(name);\r\n const type = GaussianSplattingMesh._TypeNameToEnum(typeName);\r\n if (chunkMode == ElementMode.Chunk) {\r\n chunkProperties.push({ value, type, offset: rowChunkOffset });\r\n rowChunkOffset += offsets[typeName];\r\n } else if (chunkMode == ElementMode.Vertex) {\r\n vertexProperties.push({ value, type, offset: rowVertexOffset });\r\n rowVertexOffset += offsets[typeName];\r\n }\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 }\r\n }\r\n }\r\n\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n const buffer = new ArrayBuffer(GaussianSplattingMesh._RowOutputLength * vertexCount);\r\n\r\n 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 };\r\n }\r\n private static _GetCompressedChunks(header: PLYHeader, offset: { value: number }): Array<CompressedPLYChunk> | null {\r\n if (!header.chunkCount) {\r\n return null;\r\n }\r\n const dataView = header.dataView;\r\n const compressedChunks = new Array<CompressedPLYChunk>(header.chunkCount);\r\n for (let i = 0; i < header.chunkCount; i++) {\r\n const currentChunk = { min: new Vector3(), max: new Vector3(), minScale: new Vector3(), maxScale: new Vector3() };\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 }\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<CompressedPLYChunk> | null, offset: { value: number }): void {\r\n const q = TmpVectors.Quaternion[0];\r\n const temp3 = TmpVectors.Vector3[0];\r\n\r\n const rowOutputLength = GaussianSplattingMesh._RowOutputLength;\r\n const buffer = header.buffer;\r\n const dataView = header.dataView;\r\n const position = new Float32Array(buffer, index * rowOutputLength, 3);\r\n const scale = new Float32Array(buffer, index * rowOutputLength + 12, 3);\r\n const rgba = new Uint8ClampedArray(buffer, index * rowOutputLength + 24, 4);\r\n const rot = new Uint8ClampedArray(buffer, index * rowOutputLength + 28, 4);\r\n 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 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 r0 = q.w;\r\n r1 = q.z;\r\n r2 = q.y;\r\n r3 = q.x;\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 unpack8888(value, rgba);\r\n break;\r\n case PLYValue.X:\r\n position[0] = value;\r\n break;\r\n case PLYValue.Y:\r\n position[1] = value;\r\n break;\r\n case PLYValue.Z:\r\n position[2] = value;\r\n break;\r\n case PLYValue.SCALE_0:\r\n scale[0] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_1:\r\n scale[1] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_2:\r\n scale[2] = Math.exp(value);\r\n break;\r\n case PLYValue.DIFFUSE_RED:\r\n rgba[0] = value;\r\n break;\r\n case PLYValue.DIFFUSE_GREEN:\r\n rgba[1] = value;\r\n break;\r\n case PLYValue.DIFFUSE_BLUE:\r\n rgba[2] = value;\r\n break;\r\n case PLYValue.F_DC_0:\r\n rgba[0] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_1:\r\n rgba[1] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_2:\r\n rgba[2] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_3:\r\n rgba[3] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.OPACITY:\r\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\r\n break;\r\n case PLYValue.ROT_0:\r\n r0 = value;\r\n break;\r\n case PLYValue.ROT_1:\r\n r1 = value;\r\n break;\r\n case PLYValue.ROT_2:\r\n r2 = value;\r\n break;\r\n case PLYValue.ROT_3:\r\n r3 = value;\r\n break;\r\n }\r\n }\r\n\r\n q.set(r1, r2, r3, r0);\r\n q.normalize();\r\n rot[0] = q.w * 128 + 128;\r\n rot[1] = q.x * 128 + 128;\r\n rot[2] = q.y * 128 + 128;\r\n rot[3] = q.z * 128 + 128;\r\n offset.value += header.rowVertexLength;\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\r\n */\r\n public static *ConvertPLYToSplat(data: ArrayBuffer, useCoroutine = false) {\r\n const header = GaussianSplattingMesh.ParseHeader(data);\r\n if (!header) {\r\n return data;\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMesh._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMesh._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMesh._PlyConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n return header.buffer;\r\n }\r\n\r\n /**\r\n * Converts a .ply data array buffer to splat\r\n * if data array buffer is not ply, returns the original buffer\r\n * @param data the .ply data to load\r\n * @returns the loaded splat buffer\r\n */\r\n public static async ConvertPLYToSplatAsync(data: ArrayBuffer) {\r\n return runCoroutineAsync(GaussianSplattingMesh.ConvertPLYToSplat(data, true), createYieldingScheduler());\r\n }\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 loadDataAsync(data: ArrayBuffer): Promise<void> {\r\n return this.updateDataAsync(data);\r\n }\r\n\r\n /**\r\n * Loads a .splat Gaussian or .ply Splatting file asynchronously\r\n * @param url path to the splat file to load\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 loadFileAsync(url: string): Promise<void> {\r\n return Tools.LoadFileAsync(url, true).then(async (plyBuffer) => {\r\n GaussianSplattingMesh.ConvertPLYToSplatAsync(plyBuffer).then((splatsData) => {\r\n this.updateDataAsync(splatsData);\r\n });\r\n });\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\r\n this._covariancesATexture = null;\r\n this._covariancesBTexture = null;\r\n this._centersTexture = null;\r\n this._colorsTexture = null;\r\n\r\n this._worker?.terminate();\r\n this._worker = null;\r\n\r\n super.dispose(doNotRecurse, true);\r\n }\r\n\r\n private _copyTextures(source: GaussianSplattingMesh): void {\r\n this._covariancesATexture = source.covariancesATexture?.clone()!;\r\n this._covariancesBTexture = source.covariancesBTexture?.clone()!;\r\n this._centersTexture = source.centersTexture?.clone()!;\r\n this._colorsTexture = source.colorsTexture?.clone()!;\r\n }\r\n\r\n /**\r\n * Returns a new Mesh object generated from the current mesh properties.\r\n * @param name is a string, the name given to the new mesh\r\n * @returns a new Gaussian Splatting Mesh\r\n */\r\n public override clone(name: string = \"\"): GaussianSplattingMesh {\r\n const newGS = new GaussianSplattingMesh(name, undefined, this.getScene());\r\n newGS._copySource(this);\r\n newGS.makeGeometryUnique();\r\n newGS._vertexCount = this._vertexCount;\r\n newGS._copyTextures(this);\r\n newGS._modelViewMatrix = Matrix.Identity();\r\n newGS._splatPositions = this._splatPositions;\r\n newGS._readyToDisplay = false;\r\n newGS._instanciateWorker();\r\n\r\n const binfo = this.getBoundingInfo();\r\n newGS.getBoundingInfo().reConstruct(binfo.minimum, binfo.maximum, this.getWorldMatrix());\r\n\r\n newGS.forcedInstanceCount = newGS._vertexCount;\r\n newGS.setEnabled(true);\r\n return newGS;\r\n }\r\n\r\n private static _CreateWorker = function (self: Worker) {\r\n let vertexCount = 0;\r\n let positions: Float32Array;\r\n let depthMix: BigInt64Array;\r\n let indices: Uint32Array;\r\n let floatMix: Float32Array;\r\n\r\n self.onmessage = (e: any) => {\r\n // updated on init\r\n if (e.data.positions) {\r\n positions = e.data.positions;\r\n vertexCount = e.data.vertexCount;\r\n }\r\n // udpate on view changed\r\n else {\r\n const viewProj = e.data.view;\r\n if (!positions || !viewProj) {\r\n // Sanity check, it shouldn't happen!\r\n throw new Error(\"positions or view 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 < vertexCount; j++) {\r\n indices[2 * j] = j;\r\n }\r\n\r\n let depthFactor = -1;\r\n if (e.data.useRightHandedSystem) {\r\n depthFactor = 1;\r\n }\r\n\r\n for (let j = 0; j < vertexCount; j++) {\r\n floatMix[2 * j + 1] = 10000 + (viewProj[2] * positions[4 * j + 0] + viewProj[6] * positions[4 * j + 1] + viewProj[10] * positions[4 * j + 2]) * depthFactor;\r\n }\r\n\r\n depthMix.sort();\r\n\r\n self.postMessage({ depthMix }, [depthMix.buffer]);\r\n }\r\n };\r\n };\r\n\r\n private _makeSplat(\r\n sourceIndex: number,\r\n destinationIndex: 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 ): 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 * sourceIndex + 0];\r\n const y = -fBuffer[8 * sourceIndex + 1];\r\n const z = fBuffer[8 * sourceIndex + 2];\r\n\r\n this._splatPositions![4 * sourceIndex + 0] = x;\r\n this._splatPositions![4 * sourceIndex + 1] = y;\r\n this._splatPositions![4 * sourceIndex + 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 * sourceIndex + 28 + 1] - 128) / 128,\r\n (uBuffer[32 * sourceIndex + 28 + 2] - 128) / 128,\r\n (uBuffer[32 * sourceIndex + 28 + 3] - 128) / 128,\r\n -(uBuffer[32 * sourceIndex + 28 + 0] - 128) / 128\r\n );\r\n quaternion.toRotationMatrix(matrixRotation);\r\n\r\n Matrix.ScalingToRef(fBuffer[8 * sourceIndex + 3 + 0] * 2, fBuffer[8 * sourceIndex + 3 + 1] * 2, fBuffer[8 * sourceIndex + 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 * sourceIndex + 3] = factor;\r\n const transform = factor;\r\n\r\n covA[destinationIndex * 4 + 0] = ToHalfFloat(covariances[0] / transform);\r\n covA[destinationIndex * 4 + 1] = ToHalfFloat(covariances[1] / transform);\r\n covA[destinationIndex * 4 + 2] = ToHalfFloat(covariances[2] / transform);\r\n covA[destinationIndex * 4 + 3] = ToHalfFloat(covariances[3] / transform);\r\n covB[destinationIndex * covBSItemSize + 0] = ToHalfFloat(covariances[4] / transform);\r\n covB[destinationIndex * covBSItemSize + 1] = ToHalfFloat(covariances[5] / transform);\r\n\r\n // colors\r\n colorArray[destinationIndex * 4 + 0] = uBuffer[32 * sourceIndex + 24 + 0];\r\n colorArray[destinationIndex * 4 + 1] = uBuffer[32 * sourceIndex + 24 + 1];\r\n colorArray[destinationIndex * 4 + 2] = uBuffer[32 * sourceIndex + 24 + 2];\r\n colorArray[destinationIndex * 4 + 3] = uBuffer[32 * sourceIndex + 24 + 3];\r\n }\r\n\r\n private _updateTextures(covA: Uint16Array, covB: Uint16Array, colorArray: 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 createTextureFromDataF16 = (data: Uint16Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_HALF_FLOAT);\r\n };\r\n\r\n if (this._keepInRam) {\r\n this._covariancesA = covA;\r\n this._covariancesB = covB;\r\n this._colors = colorArray;\r\n }\r\n if (this._covariancesATexture) {\r\n this._delayedTextureUpdate = { covA: covA, covB: covB, colors: colorArray, centers: this._splatPositions! };\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 } else {\r\n this._covariancesATexture = createTextureFromDataF16(covA, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._covariancesBTexture = createTextureFromDataF16(\r\n covB,\r\n textureSize.x,\r\n textureSize.y,\r\n this._useRGBACovariants ? Constants.TEXTUREFORMAT_RGBA : Constants.TEXTUREFORMAT_RG\r\n );\r\n this._centersTexture = createTextureFromData(this._splatPositions!, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._colorsTexture = createTextureFromDataU8(colorArray, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._instanciateWorker();\r\n }\r\n }\r\n\r\n private *_updateData(data: ArrayBuffer, isAsync: boolean): Coroutine<void> {\r\n // if a covariance texture is present, then it's not a creation but an update\r\n if (!this._covariancesATexture) {\r\n this._readyToDisplay = false;\r\n }\r\n\r\n // Parse the data\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n const vertexCount = uBuffer.length / GaussianSplattingMesh._RowOutputLength;\r\n if (vertexCount != this._vertexCount) {\r\n this._updateSplatIndexBuffer(vertexCount);\r\n }\r\n this._vertexCount = vertexCount;\r\n\r\n const textureSize = this._getTextureSize(vertexCount);\r\n const textureLength = textureSize.x * textureSize.y;\r\n const lineCountUpdate = GaussianSplattingMesh.ProgressiveUpdateAmount ?? textureSize.y;\r\n const textureLengthPerUpdate = textureSize.x * lineCountUpdate;\r\n\r\n this._splatPositions = new Float32Array(4 * textureLength);\r\n const covA = new Uint16Array(textureLength * 4);\r\n const covB = new Uint16Array((this._useRGBACovariants ? 4 : 2) * textureLength);\r\n const colorArray = new Uint8Array(textureLength * 4);\r\n\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n if (GaussianSplattingMesh.ProgressiveUpdateAmount) {\r\n // create textures with not filled-yet array, then update directly portions of it\r\n this._updateTextures(covA, covB, colorArray);\r\n this.setEnabled(true);\r\n\r\n const partCount = Math.ceil(textureSize.y / lineCountUpdate);\r\n for (let partIndex = 0; partIndex < partCount; partIndex++) {\r\n const updateLine = partIndex * lineCountUpdate;\r\n const splatIndexBase = updateLine * textureSize.x;\r\n for (let i = 0; i < textureLengthPerUpdate; i++) {\r\n this._makeSplat(splatIndexBase + i, splatIndexBase + i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum);\r\n }\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, updateLine, Math.min(lineCountUpdate, textureSize.y - updateLine));\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n // sort will be dirty here as just finished filled positions will not be sorted\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const vertexCount = this._vertexCount;\r\n this._worker!.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n this._sortIsDirty = true;\r\n } else {\r\n for (let i = 0; i < vertexCount; i++) {\r\n this._makeSplat(i, i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum);\r\n if (isAsync && i % GaussianSplattingMesh._SplatBatchSize === 0) {\r\n yield;\r\n }\r\n }\r\n // textures\r\n this._updateTextures(covA, covB, colorArray);\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n }\r\n this._postToWorker(true);\r\n }\r\n\r\n /**\r\n * Update asynchronously the buffer\r\n * @param data array buffer containing center, color, orientation and scale of splats\r\n * @returns a promise\r\n */\r\n public async updateDataAsync(data: ArrayBuffer): Promise<void> {\r\n return runCoroutineAsync(this._updateData(data, true), 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 */\r\n public updateData(data: ArrayBuffer): void {\r\n runCoroutineSync(this._updateData(data, false));\r\n }\r\n\r\n // in case size is different\r\n private _updateSplatIndexBuffer(vertexCount: number): void {\r\n if (!this._splatIndex || vertexCount > this._splatIndex.length) {\r\n this._splatIndex = new Float32Array(vertexCount);\r\n\r\n this.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 1, false);\r\n }\r\n this.forcedInstanceCount = vertexCount;\r\n }\r\n\r\n private _updateSubTextures(centers: Float32Array, covA: Uint16Array, covB: Uint16Array, colors: Uint8Array, lineStart: number, lineCount: number): void {\r\n const updateTextureFromData = (texture: BaseTexture, data: Float32Array, 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 const updateTextureFromDataU8 = (texture: BaseTexture, data: Uint8Array, 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 const updateTextureFromDataF16 = (texture: BaseTexture, data: Uint16Array, width: number, lineStart: number, lineCount: number) => {\r\n (this.getEngine() as ThinEngine).updateTextureData(texture.getInternalTexture()!, data, 0, lineStart, width, lineCount, 0, 0, false);\r\n };\r\n\r\n const textureSize = this._getTextureSize(this._vertexCount);\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n const texelStart = lineStart * textureSize.x;\r\n const texelCount = lineCount * textureSize.x;\r\n const covAView = new Uint16Array(covA.buffer, texelStart * 4 * Uint16Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n const covBView = new Uint16Array(covB.buffer, texelStart * covBSItemSize * Uint16Array.BYTES_PER_ELEMENT, texelCount * covBSItemSize);\r\n const colorsView = new Uint8Array(colors.buffer, texelStart * 4, texelCount * 4);\r\n const centersView = new Float32Array(centers.buffer, texelStart * 4 * Float32Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n updateTextureFromDataF16(this._covariancesATexture!, covAView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromDataF16(this._covariancesBTexture!, covBView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._centersTexture!, centersView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromDataU8(this._colorsTexture!, colorsView, textureSize.x, lineStart, lineCount);\r\n }\r\n private _instanciateWorker(): void {\r\n if (!this._vertexCount) {\r\n return;\r\n }\r\n this._updateSplatIndexBuffer(this._vertexCount);\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMesh._CreateWorker.toString(), \")(self)\"], {\r\n type: \"application/javascript\",\r\n })\r\n )\r\n );\r\n\r\n this._depthMix = new BigInt64Array(this._vertexCount);\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const vertexCount = this._vertexCount;\r\n\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n\r\n this._worker.onmessage = (e) => {\r\n this._depthMix = e.data.depthMix;\r\n const indexMix = new Uint32Array(e.data.depthMix.buffer);\r\n if (this._splatIndex) {\r\n for (let j = 0; j < this._vertexCount; j++) {\r\n this._splatIndex[j] = indexMix[2 * j];\r\n }\r\n }\r\n if (this._delayedTextureUpdate) {\r\n const textureSize = this._getTextureSize(vertexCount);\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 );\r\n this._delayedTextureUpdate = null;\r\n }\r\n this.thinInstanceBufferUpdated(\"splatIndex\");\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n // sort is dirty when GS is visible for progressive update with a this message arriving but positions were partially filled\r\n // another update needs to be kicked. The kick can't happen just when the position buffer is ready because _canPostToWorker might be false.\r\n if (this._sortIsDirty) {\r\n this._postToWorker(true);\r\n this._sortIsDirty = false;\r\n }\r\n };\r\n }\r\n\r\n private _getTextureSize(length: number): Vector2 {\r\n const engine = this._scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n\r\n let height = 1;\r\n\r\n if (engine.version === 1 && !engine.isWebGPU) {\r\n while (width * height < length) {\r\n height *= 2;\r\n }\r\n } else {\r\n height = Math.ceil(length / width);\r\n }\r\n\r\n if (height > width) {\r\n Logger.Error(\"GaussianSplatting texture size: (\" + width + \", \" + height + \"), maxTextureSize: \" + width);\r\n height = width;\r\n }\r\n\r\n return new Vector2(width, height);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"gaussianSplattingMesh.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { SubMesh } from \"../subMesh\";\r\nimport type { AbstractMesh } from \"../abstractMesh\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Quaternion } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport \"core/Meshes/thinInstanceMesh\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { ToHalfFloat } from \"core/Misc/textureTools\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { runCoroutineSync, runCoroutineAsync, createYieldingScheduler, type Coroutine } from \"core/Misc/coroutine\";\r\n\r\ninterface DelayedTextureUpdate {\r\n covA: Uint16Array;\r\n covB: Uint16Array;\r\n colors: Uint8Array;\r\n centers: Float32Array;\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\n// @internal\r\ninterface CompressedPLYChunk {\r\n min: Vector3;\r\n max: Vector3;\r\n minScale: Vector3;\r\n maxScale: Vector3;\r\n}\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 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\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/**\r\n * Class used to render a gaussian splatting mesh\r\n */\r\nexport class GaussianSplattingMesh extends Mesh {\r\n private _vertexCount = 0;\r\n private _worker: Nullable<Worker> = null;\r\n private _frameIdLastUpdate = -1;\r\n private _modelViewMatrix = Matrix.Identity();\r\n private _depthMix: BigInt64Array;\r\n private _canPostToWorker = true;\r\n private _readyToDisplay = false;\r\n private _covariancesATexture: Nullable<BaseTexture> = null;\r\n private _covariancesBTexture: Nullable<BaseTexture> = null;\r\n private _centersTexture: Nullable<BaseTexture> = null;\r\n private _colorsTexture: Nullable<BaseTexture> = null;\r\n private _splatPositions: Nullable<Float32Array> = null;\r\n private _splatIndex: Nullable<Float32Array> = null;\r\n //@ts-expect-error\r\n private _covariancesA: Nullable<Uint16Array> = null;\r\n //@ts-expect-error\r\n private _covariancesB: Nullable<Uint16Array> = null;\r\n //@ts-expect-error\r\n private _colors: Nullable<Uint8Array> = null;\r\n private readonly _keepInRam: boolean = false;\r\n\r\n private _delayedTextureUpdate: Nullable<DelayedTextureUpdate> = null;\r\n private _oldDirection = new Vector3();\r\n private _useRGBACovariants = false;\r\n private _material: Nullable<Material> = null;\r\n\r\n private _tmpCovariances = [0, 0, 0, 0, 0, 0];\r\n private _sortIsDirty = false;\r\n\r\n private static _RowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // Vector3 position, Vector3 scale, 1 u8 quaternion, 1 color with alpha\r\n private static _SH_C0 = 0.28209479177387814;\r\n // batch size between 2 yield calls. This value is a tradeoff between updates overhead and framerate hiccups\r\n // This step is faster the PLY conversion. So batch size can be bigger\r\n private static _SplatBatchSize = 327680;\r\n // batch size between 2 yield calls during the PLY to splat conversion.\r\n private static _PlyConversionBatchSize = 32768;\r\n\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 * set rendering material\r\n */\r\n public override set material(value: Material) {\r\n this._material = value;\r\n this._material.backFaceCulling = true;\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 /**\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 const vertexData = new VertexData();\r\n\r\n // Use an intanced quad or triangle. Triangle might be a bit faster because of less shader invocation but I didn't see any difference.\r\n // Keeping both and use triangle for now.\r\n // for quad, use following lines\r\n //vertexData.positions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0];\r\n //vertexData.indices = [0, 1, 2, 0, 2, 3];\r\n vertexData.positions = [-3, -2, 0, 3, -2, 0, 0, 4, 0];\r\n vertexData.indices = [0, 1, 2];\r\n vertexData.applyToMesh(this);\r\n\r\n this.subMeshes = [];\r\n // for quad, use following line\r\n //new SubMesh(0, 0, 4, 0, 6, this);\r\n new SubMesh(0, 0, 3, 0, 3, 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.loadFileAsync(url);\r\n }\r\n this._material = new GaussianSplattingMaterial(this.name + \"_material\", this._scene);\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns \"GaussianSplattingMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMesh\";\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices (splats) within the mesh\r\n * @returns the total number of vertices\r\n */\r\n public override getTotalVertices(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns true when ready\r\n */\r\n public override isReady(completeCheck = false): boolean {\r\n if (!super.isReady(completeCheck, true)) {\r\n return false;\r\n }\r\n\r\n if (!this._readyToDisplay) {\r\n // mesh is ready when worker has done at least 1 sorting\r\n this._postToWorker(true);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _postToWorker(forced = false): void {\r\n const frameId = this.getScene().getFrameId();\r\n if ((forced || frameId !== this._frameIdLastUpdate) && this._worker && this._scene.activeCamera && this._canPostToWorker) {\r\n const cameraMatrix = this._scene.activeCamera.getViewMatrix();\r\n this.getWorldMatrix().multiplyToRef(cameraMatrix, this._modelViewMatrix);\r\n cameraMatrix.invertToRef(TmpVectors.Matrix[0]);\r\n this.getWorldMatrix().multiplyToRef(TmpVectors.Matrix[0], TmpVectors.Matrix[1]);\r\n Vector3.TransformNormalToRef(Vector3.Forward(this._scene.useRightHandedSystem), TmpVectors.Matrix[1], TmpVectors.Vector3[2]);\r\n TmpVectors.Vector3[2].normalize();\r\n\r\n const dot = Vector3.Dot(TmpVectors.Vector3[2], this._oldDirection);\r\n if (forced || Math.abs(dot - 1) >= 0.01) {\r\n this._oldDirection.copyFrom(TmpVectors.Vector3[2]);\r\n this._frameIdLastUpdate = frameId;\r\n this._canPostToWorker = false;\r\n this._worker.postMessage({ view: this._modelViewMatrix.m, depthMix: this._depthMix, useRightHandedSystem: this._scene.useRightHandedSystem }, [\r\n this._depthMix.buffer,\r\n ]);\r\n }\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 return super.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n\r\n private static _TypeNameToEnum(name: string): PLYType {\r\n switch (name) {\r\n case \"float\":\r\n return PLYType.FLOAT;\r\n case \"int\":\r\n return PLYType.INT;\r\n break;\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 }\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 }\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 for (const prop of filtered) {\r\n if (prop.startsWith(\"property \")) {\r\n const [, typeName, name] = prop.split(\" \");\r\n\r\n const value = GaussianSplattingMesh._ValueNameToEnum(name);\r\n const type = GaussianSplattingMesh._TypeNameToEnum(typeName);\r\n if (chunkMode == ElementMode.Chunk) {\r\n chunkProperties.push({ value, type, offset: rowChunkOffset });\r\n rowChunkOffset += offsets[typeName];\r\n } else if (chunkMode == ElementMode.Vertex) {\r\n vertexProperties.push({ value, type, offset: rowVertexOffset });\r\n rowVertexOffset += offsets[typeName];\r\n }\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 }\r\n }\r\n }\r\n\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n const buffer = new ArrayBuffer(GaussianSplattingMesh._RowOutputLength * vertexCount);\r\n\r\n 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 };\r\n }\r\n private static _GetCompressedChunks(header: PLYHeader, offset: { value: number }): Array<CompressedPLYChunk> | null {\r\n if (!header.chunkCount) {\r\n return null;\r\n }\r\n const dataView = header.dataView;\r\n const compressedChunks = new Array<CompressedPLYChunk>(header.chunkCount);\r\n for (let i = 0; i < header.chunkCount; i++) {\r\n const currentChunk = { min: new Vector3(), max: new Vector3(), minScale: new Vector3(), maxScale: new Vector3() };\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 }\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<CompressedPLYChunk> | null, offset: { value: number }): void {\r\n const q = TmpVectors.Quaternion[0];\r\n const temp3 = TmpVectors.Vector3[0];\r\n\r\n const rowOutputLength = GaussianSplattingMesh._RowOutputLength;\r\n const buffer = header.buffer;\r\n const dataView = header.dataView;\r\n const position = new Float32Array(buffer, index * rowOutputLength, 3);\r\n const scale = new Float32Array(buffer, index * rowOutputLength + 12, 3);\r\n const rgba = new Uint8ClampedArray(buffer, index * rowOutputLength + 24, 4);\r\n const rot = new Uint8ClampedArray(buffer, index * rowOutputLength + 28, 4);\r\n 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 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 r0 = q.w;\r\n r1 = q.z;\r\n r2 = q.y;\r\n r3 = q.x;\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 unpack8888(value, rgba);\r\n break;\r\n case PLYValue.X:\r\n position[0] = value;\r\n break;\r\n case PLYValue.Y:\r\n position[1] = value;\r\n break;\r\n case PLYValue.Z:\r\n position[2] = value;\r\n break;\r\n case PLYValue.SCALE_0:\r\n scale[0] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_1:\r\n scale[1] = Math.exp(value);\r\n break;\r\n case PLYValue.SCALE_2:\r\n scale[2] = Math.exp(value);\r\n break;\r\n case PLYValue.DIFFUSE_RED:\r\n rgba[0] = value;\r\n break;\r\n case PLYValue.DIFFUSE_GREEN:\r\n rgba[1] = value;\r\n break;\r\n case PLYValue.DIFFUSE_BLUE:\r\n rgba[2] = value;\r\n break;\r\n case PLYValue.F_DC_0:\r\n rgba[0] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_1:\r\n rgba[1] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_2:\r\n rgba[2] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.F_DC_3:\r\n rgba[3] = (0.5 + GaussianSplattingMesh._SH_C0 * value) * 255;\r\n break;\r\n case PLYValue.OPACITY:\r\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\r\n break;\r\n case PLYValue.ROT_0:\r\n r0 = value;\r\n break;\r\n case PLYValue.ROT_1:\r\n r1 = value;\r\n break;\r\n case PLYValue.ROT_2:\r\n r2 = value;\r\n break;\r\n case PLYValue.ROT_3:\r\n r3 = value;\r\n break;\r\n }\r\n }\r\n\r\n q.set(r1, r2, r3, r0);\r\n q.normalize();\r\n rot[0] = q.w * 128 + 128;\r\n rot[1] = q.x * 128 + 128;\r\n rot[2] = q.y * 128 + 128;\r\n rot[3] = q.z * 128 + 128;\r\n offset.value += header.rowVertexLength;\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\r\n */\r\n public static *ConvertPLYToSplat(data: ArrayBuffer, useCoroutine = false) {\r\n const header = GaussianSplattingMesh.ParseHeader(data);\r\n if (!header) {\r\n return data;\r\n }\r\n\r\n const offset = { value: 0 };\r\n const compressedChunks = GaussianSplattingMesh._GetCompressedChunks(header, offset);\r\n\r\n for (let i = 0; i < header.vertexCount; i++) {\r\n GaussianSplattingMesh._GetSplat(header, i, compressedChunks, offset);\r\n if (i % GaussianSplattingMesh._PlyConversionBatchSize === 0 && useCoroutine) {\r\n yield;\r\n }\r\n }\r\n\r\n return header.buffer;\r\n }\r\n\r\n /**\r\n * Converts a .ply data array buffer to splat\r\n * if data array buffer is not ply, returns the original buffer\r\n * @param data the .ply data to load\r\n * @returns the loaded splat buffer\r\n */\r\n public static async ConvertPLYToSplatAsync(data: ArrayBuffer) {\r\n return runCoroutineAsync(GaussianSplattingMesh.ConvertPLYToSplat(data, true), createYieldingScheduler());\r\n }\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 loadDataAsync(data: ArrayBuffer): Promise<void> {\r\n return this.updateDataAsync(data);\r\n }\r\n\r\n /**\r\n * Loads a .splat Gaussian or .ply Splatting file asynchronously\r\n * @param url path to the splat file to load\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 loadFileAsync(url: string): Promise<void> {\r\n return Tools.LoadFileAsync(url, true).then(async (plyBuffer) => {\r\n GaussianSplattingMesh.ConvertPLYToSplatAsync(plyBuffer).then((splatsData) => {\r\n this.updateDataAsync(splatsData);\r\n });\r\n });\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\r\n this._covariancesATexture = null;\r\n this._covariancesBTexture = null;\r\n this._centersTexture = null;\r\n this._colorsTexture = null;\r\n\r\n this._worker?.terminate();\r\n this._worker = null;\r\n\r\n super.dispose(doNotRecurse, true);\r\n }\r\n\r\n private _copyTextures(source: GaussianSplattingMesh): void {\r\n this._covariancesATexture = source.covariancesATexture?.clone()!;\r\n this._covariancesBTexture = source.covariancesBTexture?.clone()!;\r\n this._centersTexture = source.centersTexture?.clone()!;\r\n this._colorsTexture = source.colorsTexture?.clone()!;\r\n }\r\n\r\n /**\r\n * Returns a new Mesh object generated from the current mesh properties.\r\n * @param name is a string, the name given to the new mesh\r\n * @returns a new Gaussian Splatting Mesh\r\n */\r\n public override clone(name: string = \"\"): GaussianSplattingMesh {\r\n const newGS = new GaussianSplattingMesh(name, undefined, this.getScene());\r\n newGS._copySource(this);\r\n newGS.makeGeometryUnique();\r\n newGS._vertexCount = this._vertexCount;\r\n newGS._copyTextures(this);\r\n newGS._modelViewMatrix = Matrix.Identity();\r\n newGS._splatPositions = this._splatPositions;\r\n newGS._readyToDisplay = false;\r\n newGS._instanciateWorker();\r\n\r\n const binfo = this.getBoundingInfo();\r\n newGS.getBoundingInfo().reConstruct(binfo.minimum, binfo.maximum, this.getWorldMatrix());\r\n\r\n newGS.forcedInstanceCount = newGS._vertexCount;\r\n newGS.setEnabled(true);\r\n return newGS;\r\n }\r\n\r\n private static _CreateWorker = function (self: Worker) {\r\n let vertexCount = 0;\r\n let positions: Float32Array;\r\n let depthMix: BigInt64Array;\r\n let indices: Uint32Array;\r\n let floatMix: Float32Array;\r\n\r\n self.onmessage = (e: any) => {\r\n // updated on init\r\n if (e.data.positions) {\r\n positions = e.data.positions;\r\n vertexCount = e.data.vertexCount;\r\n }\r\n // udpate on view changed\r\n else {\r\n const viewProj = e.data.view;\r\n if (!positions || !viewProj) {\r\n // Sanity check, it shouldn't happen!\r\n throw new Error(\"positions or view 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 < vertexCount; j++) {\r\n indices[2 * j] = j;\r\n }\r\n\r\n let depthFactor = -1;\r\n if (e.data.useRightHandedSystem) {\r\n depthFactor = 1;\r\n }\r\n\r\n for (let j = 0; j < vertexCount; j++) {\r\n floatMix[2 * j + 1] = 10000 + (viewProj[2] * positions[4 * j + 0] + viewProj[6] * positions[4 * j + 1] + viewProj[10] * positions[4 * j + 2]) * depthFactor;\r\n }\r\n\r\n depthMix.sort();\r\n\r\n self.postMessage({ depthMix }, [depthMix.buffer]);\r\n }\r\n };\r\n };\r\n\r\n private _makeSplat(\r\n sourceIndex: number,\r\n destinationIndex: 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 ): 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 * sourceIndex + 0];\r\n const y = -fBuffer[8 * sourceIndex + 1];\r\n const z = fBuffer[8 * sourceIndex + 2];\r\n\r\n this._splatPositions![4 * sourceIndex + 0] = x;\r\n this._splatPositions![4 * sourceIndex + 1] = y;\r\n this._splatPositions![4 * sourceIndex + 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 * sourceIndex + 28 + 1] - 128) / 128,\r\n (uBuffer[32 * sourceIndex + 28 + 2] - 128) / 128,\r\n (uBuffer[32 * sourceIndex + 28 + 3] - 128) / 128,\r\n -(uBuffer[32 * sourceIndex + 28 + 0] - 128) / 128\r\n );\r\n quaternion.toRotationMatrix(matrixRotation);\r\n\r\n Matrix.ScalingToRef(fBuffer[8 * sourceIndex + 3 + 0] * 2, fBuffer[8 * sourceIndex + 3 + 1] * 2, fBuffer[8 * sourceIndex + 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 * sourceIndex + 3] = factor;\r\n const transform = factor;\r\n\r\n covA[destinationIndex * 4 + 0] = ToHalfFloat(covariances[0] / transform);\r\n covA[destinationIndex * 4 + 1] = ToHalfFloat(covariances[1] / transform);\r\n covA[destinationIndex * 4 + 2] = ToHalfFloat(covariances[2] / transform);\r\n covA[destinationIndex * 4 + 3] = ToHalfFloat(covariances[3] / transform);\r\n covB[destinationIndex * covBSItemSize + 0] = ToHalfFloat(covariances[4] / transform);\r\n covB[destinationIndex * covBSItemSize + 1] = ToHalfFloat(covariances[5] / transform);\r\n\r\n // colors\r\n colorArray[destinationIndex * 4 + 0] = uBuffer[32 * sourceIndex + 24 + 0];\r\n colorArray[destinationIndex * 4 + 1] = uBuffer[32 * sourceIndex + 24 + 1];\r\n colorArray[destinationIndex * 4 + 2] = uBuffer[32 * sourceIndex + 24 + 2];\r\n colorArray[destinationIndex * 4 + 3] = uBuffer[32 * sourceIndex + 24 + 3];\r\n }\r\n\r\n private _updateTextures(covA: Uint16Array, covB: Uint16Array, colorArray: 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 createTextureFromDataF16 = (data: Uint16Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_HALF_FLOAT);\r\n };\r\n\r\n if (this._keepInRam) {\r\n this._covariancesA = covA;\r\n this._covariancesB = covB;\r\n this._colors = colorArray;\r\n }\r\n if (this._covariancesATexture) {\r\n this._delayedTextureUpdate = { covA: covA, covB: covB, colors: colorArray, centers: this._splatPositions! };\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 } else {\r\n this._covariancesATexture = createTextureFromDataF16(covA, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._covariancesBTexture = createTextureFromDataF16(\r\n covB,\r\n textureSize.x,\r\n textureSize.y,\r\n this._useRGBACovariants ? Constants.TEXTUREFORMAT_RGBA : Constants.TEXTUREFORMAT_RG\r\n );\r\n this._centersTexture = createTextureFromData(this._splatPositions!, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._colorsTexture = createTextureFromDataU8(colorArray, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._instanciateWorker();\r\n }\r\n }\r\n\r\n private *_updateData(data: ArrayBuffer, isAsync: boolean): Coroutine<void> {\r\n // if a covariance texture is present, then it's not a creation but an update\r\n if (!this._covariancesATexture) {\r\n this._readyToDisplay = false;\r\n }\r\n\r\n // Parse the data\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n const vertexCount = uBuffer.length / GaussianSplattingMesh._RowOutputLength;\r\n if (vertexCount != this._vertexCount) {\r\n this._updateSplatIndexBuffer(vertexCount);\r\n }\r\n this._vertexCount = vertexCount;\r\n\r\n const textureSize = this._getTextureSize(vertexCount);\r\n const textureLength = textureSize.x * textureSize.y;\r\n const lineCountUpdate = GaussianSplattingMesh.ProgressiveUpdateAmount ?? textureSize.y;\r\n const textureLengthPerUpdate = textureSize.x * lineCountUpdate;\r\n\r\n this._splatPositions = new Float32Array(4 * textureLength);\r\n const covA = new Uint16Array(textureLength * 4);\r\n const covB = new Uint16Array((this._useRGBACovariants ? 4 : 2) * textureLength);\r\n const colorArray = new Uint8Array(textureLength * 4);\r\n\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n if (GaussianSplattingMesh.ProgressiveUpdateAmount) {\r\n // create textures with not filled-yet array, then update directly portions of it\r\n this._updateTextures(covA, covB, colorArray);\r\n this.setEnabled(true);\r\n\r\n const partCount = Math.ceil(textureSize.y / lineCountUpdate);\r\n for (let partIndex = 0; partIndex < partCount; partIndex++) {\r\n const updateLine = partIndex * lineCountUpdate;\r\n const splatIndexBase = updateLine * textureSize.x;\r\n for (let i = 0; i < textureLengthPerUpdate; i++) {\r\n this._makeSplat(splatIndexBase + i, splatIndexBase + i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum);\r\n }\r\n this._updateSubTextures(this._splatPositions, covA, covB, colorArray, updateLine, Math.min(lineCountUpdate, textureSize.y - updateLine));\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n // sort will be dirty here as just finished filled positions will not be sorted\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const vertexCount = this._vertexCount;\r\n this._worker!.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n this._sortIsDirty = true;\r\n } else {\r\n for (let i = 0; i < vertexCount; i++) {\r\n this._makeSplat(i, i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum);\r\n if (isAsync && i % GaussianSplattingMesh._SplatBatchSize === 0) {\r\n yield;\r\n }\r\n }\r\n // textures\r\n this._updateTextures(covA, covB, colorArray);\r\n // Update the binfo\r\n this.getBoundingInfo().reConstruct(minimum, maximum, this.getWorldMatrix());\r\n this.setEnabled(true);\r\n }\r\n this._postToWorker(true);\r\n }\r\n\r\n /**\r\n * Update asynchronously the buffer\r\n * @param data array buffer containing center, color, orientation and scale of splats\r\n * @returns a promise\r\n */\r\n public async updateDataAsync(data: ArrayBuffer): Promise<void> {\r\n return runCoroutineAsync(this._updateData(data, true), 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 */\r\n public updateData(data: ArrayBuffer): void {\r\n runCoroutineSync(this._updateData(data, false));\r\n }\r\n\r\n // in case size is different\r\n private _updateSplatIndexBuffer(vertexCount: number): void {\r\n if (!this._splatIndex || vertexCount > this._splatIndex.length) {\r\n this._splatIndex = new Float32Array(vertexCount);\r\n\r\n this.thinInstanceSetBuffer(\"splatIndex\", this._splatIndex, 1, false);\r\n }\r\n this.forcedInstanceCount = vertexCount;\r\n }\r\n\r\n private _updateSubTextures(centers: Float32Array, covA: Uint16Array, covB: Uint16Array, colors: Uint8Array, lineStart: number, lineCount: number): void {\r\n const updateTextureFromData = (texture: BaseTexture, data: Float32Array, 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 const updateTextureFromDataU8 = (texture: BaseTexture, data: Uint8Array, 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 const updateTextureFromDataF16 = (texture: BaseTexture, data: Uint16Array, width: number, lineStart: number, lineCount: number) => {\r\n (this.getEngine() as ThinEngine).updateTextureData(texture.getInternalTexture()!, data, 0, lineStart, width, lineCount, 0, 0, false);\r\n };\r\n\r\n const textureSize = this._getTextureSize(this._vertexCount);\r\n const covBSItemSize = this._useRGBACovariants ? 4 : 2;\r\n const texelStart = lineStart * textureSize.x;\r\n const texelCount = lineCount * textureSize.x;\r\n const covAView = new Uint16Array(covA.buffer, texelStart * 4 * Uint16Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n const covBView = new Uint16Array(covB.buffer, texelStart * covBSItemSize * Uint16Array.BYTES_PER_ELEMENT, texelCount * covBSItemSize);\r\n const colorsView = new Uint8Array(colors.buffer, texelStart * 4, texelCount * 4);\r\n const centersView = new Float32Array(centers.buffer, texelStart * 4 * Float32Array.BYTES_PER_ELEMENT, texelCount * 4);\r\n updateTextureFromDataF16(this._covariancesATexture!, covAView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromDataF16(this._covariancesBTexture!, covBView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromData(this._centersTexture!, centersView, textureSize.x, lineStart, lineCount);\r\n updateTextureFromDataU8(this._colorsTexture!, colorsView, textureSize.x, lineStart, lineCount);\r\n }\r\n private _instanciateWorker(): void {\r\n if (!this._vertexCount) {\r\n return;\r\n }\r\n this._updateSplatIndexBuffer(this._vertexCount);\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMesh._CreateWorker.toString(), \")(self)\"], {\r\n type: \"application/javascript\",\r\n })\r\n )\r\n );\r\n\r\n this._depthMix = new BigInt64Array(this._vertexCount);\r\n const positions = Float32Array.from(this._splatPositions!);\r\n const vertexCount = this._vertexCount;\r\n\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n\r\n this._worker.onmessage = (e) => {\r\n this._depthMix = e.data.depthMix;\r\n const indexMix = new Uint32Array(e.data.depthMix.buffer);\r\n if (this._splatIndex) {\r\n for (let j = 0; j < this._vertexCount; j++) {\r\n this._splatIndex[j] = indexMix[2 * j];\r\n }\r\n }\r\n if (this._delayedTextureUpdate) {\r\n const textureSize = this._getTextureSize(vertexCount);\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 );\r\n this._delayedTextureUpdate = null;\r\n }\r\n this.thinInstanceBufferUpdated(\"splatIndex\");\r\n this._canPostToWorker = true;\r\n this._readyToDisplay = true;\r\n // sort is dirty when GS is visible for progressive update with a this message arriving but positions were partially filled\r\n // another update needs to be kicked. The kick can't happen just when the position buffer is ready because _canPostToWorker might be false.\r\n if (this._sortIsDirty) {\r\n this._postToWorker(true);\r\n this._sortIsDirty = false;\r\n }\r\n };\r\n }\r\n\r\n private _getTextureSize(length: number): Vector2 {\r\n const engine = this._scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n\r\n let height = 1;\r\n\r\n if (engine.version === 1 && !engine.isWebGPU) {\r\n while (width * height < length) {\r\n height *= 2;\r\n }\r\n } else {\r\n height = Math.ceil(length / width);\r\n }\r\n\r\n if (height > width) {\r\n Logger.Error(\"GaussianSplatting texture size: (\" + width + \", \" + height + \"), maxTextureSize: \" + width);\r\n height = width;\r\n }\r\n\r\n return new Vector2(width, height);\r\n }\r\n}\r\n"]}
|
package/Meshes/abstractMesh.d.ts
CHANGED
|
@@ -614,8 +614,9 @@ export declare abstract class AbstractMesh extends TransformNode implements IDis
|
|
|
614
614
|
/**
|
|
615
615
|
* Resets the draw wrappers cache for all submeshes of this abstract mesh
|
|
616
616
|
* @param passId If provided, releases only the draw wrapper corresponding to this render pass id
|
|
617
|
+
* @param immediate If true, the effect will be released immediately, otherwise it will be released at the next frame
|
|
617
618
|
*/
|
|
618
|
-
resetDrawCache(passId?: number): void;
|
|
619
|
+
resetDrawCache(passId?: number, immediate?: boolean): void;
|
|
619
620
|
/**
|
|
620
621
|
* Returns true if the mesh is blocked. Implemented by child classes
|
|
621
622
|
*/
|
|
@@ -966,10 +967,11 @@ export declare abstract class AbstractMesh extends TransformNode implements IDis
|
|
|
966
967
|
*/
|
|
967
968
|
clone(name: string, newParent: Nullable<Node>, doNotCloneChildren?: boolean): Nullable<AbstractMesh>;
|
|
968
969
|
/**
|
|
969
|
-
* Disposes all the submeshes of the current
|
|
970
|
+
* Disposes all the submeshes of the current mesh
|
|
971
|
+
* @param immediate should dispose the effects immediately or not
|
|
970
972
|
* @returns the current mesh
|
|
971
973
|
*/
|
|
972
|
-
releaseSubMeshes(): AbstractMesh;
|
|
974
|
+
releaseSubMeshes(immediate?: boolean): AbstractMesh;
|
|
973
975
|
/**
|
|
974
976
|
* Releases resources associated with this abstract mesh.
|
|
975
977
|
* @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
|
package/Meshes/abstractMesh.js
CHANGED
|
@@ -409,7 +409,7 @@ export class AbstractMesh extends TransformNode {
|
|
|
409
409
|
if (!this.subMeshes) {
|
|
410
410
|
return;
|
|
411
411
|
}
|
|
412
|
-
this.resetDrawCache();
|
|
412
|
+
this.resetDrawCache(undefined, value == null);
|
|
413
413
|
this._unBindEffect();
|
|
414
414
|
}
|
|
415
415
|
/**
|
|
@@ -969,13 +969,14 @@ export class AbstractMesh extends TransformNode {
|
|
|
969
969
|
/**
|
|
970
970
|
* Resets the draw wrappers cache for all submeshes of this abstract mesh
|
|
971
971
|
* @param passId If provided, releases only the draw wrapper corresponding to this render pass id
|
|
972
|
+
* @param immediate If true, the effect will be released immediately, otherwise it will be released at the next frame
|
|
972
973
|
*/
|
|
973
|
-
resetDrawCache(passId) {
|
|
974
|
+
resetDrawCache(passId, immediate = false) {
|
|
974
975
|
if (!this.subMeshes) {
|
|
975
976
|
return;
|
|
976
977
|
}
|
|
977
978
|
for (const subMesh of this.subMeshes) {
|
|
978
|
-
subMesh.resetDrawCache(passId);
|
|
979
|
+
subMesh.resetDrawCache(passId, immediate);
|
|
979
980
|
}
|
|
980
981
|
}
|
|
981
982
|
// Methods
|
|
@@ -1702,13 +1703,14 @@ export class AbstractMesh extends TransformNode {
|
|
|
1702
1703
|
return null;
|
|
1703
1704
|
}
|
|
1704
1705
|
/**
|
|
1705
|
-
* Disposes all the submeshes of the current
|
|
1706
|
+
* Disposes all the submeshes of the current mesh
|
|
1707
|
+
* @param immediate should dispose the effects immediately or not
|
|
1706
1708
|
* @returns the current mesh
|
|
1707
1709
|
*/
|
|
1708
|
-
releaseSubMeshes() {
|
|
1710
|
+
releaseSubMeshes(immediate = false) {
|
|
1709
1711
|
if (this.subMeshes) {
|
|
1710
1712
|
while (this.subMeshes.length) {
|
|
1711
|
-
this.subMeshes[0].dispose();
|
|
1713
|
+
this.subMeshes[0].dispose(immediate);
|
|
1712
1714
|
}
|
|
1713
1715
|
}
|
|
1714
1716
|
else {
|
|
@@ -1787,7 +1789,7 @@ export class AbstractMesh extends TransformNode {
|
|
|
1787
1789
|
});
|
|
1788
1790
|
// SubMeshes
|
|
1789
1791
|
if (this.getClassName() !== "InstancedMesh" || this.getClassName() !== "InstancedLinesMesh") {
|
|
1790
|
-
this.releaseSubMeshes();
|
|
1792
|
+
this.releaseSubMeshes(true);
|
|
1791
1793
|
}
|
|
1792
1794
|
// Query
|
|
1793
1795
|
const engine = scene.getEngine();
|