@onerjs/core 9.0.2 → 9.0.4
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/Buffers/buffer.pure.js +4 -0
- package/Buffers/buffer.pure.js.map +1 -1
- package/Cameras/camera.pure.d.ts +14 -0
- package/Cameras/camera.pure.js +15 -0
- package/Cameras/camera.pure.js.map +1 -1
- package/Compute/computeShader.pure.d.ts +2 -1
- package/Compute/computeShader.pure.js +29 -10
- package/Compute/computeShader.pure.js.map +1 -1
- package/Culling/ray.core.js +22 -9
- package/Culling/ray.core.js.map +1 -1
- package/Engines/IDrawContext.d.ts +2 -0
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +55 -4
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativeRenderTargetWrapper.d.ts +1 -0
- package/Engines/Native/nativeRenderTargetWrapper.js +5 -1
- package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
- package/Engines/Processors/shaderCodeInliner.d.ts +2 -0
- package/Engines/Processors/shaderCodeInliner.js +251 -6
- package/Engines/Processors/shaderCodeInliner.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +10 -1
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.debugging.pure.js +12 -0
- package/Engines/WebGPU/Extensions/engine.debugging.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +0 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.pure.js +5 -0
- package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +7 -0
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheTextureView.d.ts +1 -1
- package/Engines/WebGPU/webgpuCacheTextureView.js +20 -8
- package/Engines/WebGPU/webgpuCacheTextureView.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +2 -0
- package/Engines/WebGPU/webgpuDrawContext.js +6 -0
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -3
- package/Engines/WebGPU/webgpuQuerySet.js +23 -9
- package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
- package/Engines/WebGPU/webgpuRenderPassCommandStream.d.ts +156 -0
- package/Engines/WebGPU/webgpuRenderPassCommandStream.js +323 -0
- package/Engines/WebGPU/webgpuRenderPassCommandStream.js.map +1 -0
- package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +4 -3
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/WebGPU/webgpuTimestampQuery.d.ts +3 -1
- package/Engines/WebGPU/webgpuTimestampQuery.js +9 -6
- package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +2 -0
- package/Engines/abstractEngine.pure.js +14 -5
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +6 -0
- package/Engines/constants.js +6 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +198 -24
- package/Engines/pure.d.ts +1 -0
- package/Engines/pure.js +1 -0
- package/Engines/pure.js.map +1 -1
- package/Engines/renderCommandBatcher.pure.d.ts +16 -0
- package/Engines/renderCommandBatcher.pure.js +24 -0
- package/Engines/renderCommandBatcher.pure.js.map +1 -0
- package/Engines/thinEngine.functions.js +3 -2
- package/Engines/thinEngine.functions.js.map +1 -1
- package/Engines/thinEngine.pure.js +18 -2
- package/Engines/thinEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +10 -7
- package/Engines/thinNativeEngine.pure.js +117 -46
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/thinWebGPUEngine.d.ts +8 -0
- package/Engines/thinWebGPUEngine.js +11 -0
- package/Engines/thinWebGPUEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +60 -1
- package/Engines/webgpuEngine.pure.js +238 -42
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.d.ts +5 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js +8 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.d.ts +77 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js +141 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.d.ts +5 -3
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js +38 -7
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/index.d.ts +1 -0
- package/FlowGraph/Blocks/Event/index.js +1 -0
- package/FlowGraph/Blocks/Event/index.js.map +1 -1
- package/FlowGraph/Blocks/Event/pure.d.ts +1 -0
- package/FlowGraph/Blocks/Event/pure.js +1 -0
- package/FlowGraph/Blocks/Event/pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/allBlocks.pure.js +2 -0
- package/FlowGraph/Blocks/allBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockFactory.js +2 -0
- package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +1 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js +1 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
- package/FlowGraph/flowGraph.d.ts +12 -1
- package/FlowGraph/flowGraph.js +38 -0
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.d.ts +44 -0
- package/FlowGraph/flowGraphCoordinator.js +141 -0
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphDataConnection.pure.js +41 -14
- package/FlowGraph/flowGraphDataConnection.pure.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +105 -5
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FlowGraph/flowGraphSoundAssets.d.ts +40 -0
- package/FlowGraph/flowGraphSoundAssets.js +33 -0
- package/FlowGraph/flowGraphSoundAssets.js.map +1 -0
- package/FlowGraph/index.d.ts +1 -0
- package/FlowGraph/index.js +1 -0
- package/FlowGraph/index.js.map +1 -1
- package/FlowGraph/pure.d.ts +1 -0
- package/FlowGraph/pure.js +1 -0
- package/FlowGraph/pure.js.map +1 -1
- package/FlowGraph/serialization.d.ts +8 -0
- package/FlowGraph/serialization.js +31 -12
- package/FlowGraph/serialization.js.map +1 -1
- package/FlowGraph/typeDefinitions.d.ts +25 -0
- package/FlowGraph/typeDefinitions.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/taaTask.js +2 -0
- package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -1
- package/Instrumentation/engineInstrumentation.d.ts +1 -0
- package/Instrumentation/engineInstrumentation.js +25 -6
- package/Instrumentation/engineInstrumentation.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.pure.js +2 -0
- package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.d.ts +36 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.js +202 -27
- package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
- package/Lights/directionalLight.pure.d.ts +24 -10
- package/Lights/directionalLight.pure.js +29 -11
- package/Lights/directionalLight.pure.js.map +1 -1
- package/Loading/sceneLoader.d.ts +1 -1
- package/Loading/sceneLoader.js +1 -1
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +4 -4
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.pure.js +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.pure.js +4 -0
- package/Materials/Node/Blocks/Input/inputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.d.ts +9 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +23 -3
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.js +1 -1
- package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +9 -0
- package/Materials/PBR/pbrBaseMaterial.pure.js +60 -1
- package/Materials/PBR/pbrBaseMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +11 -0
- package/Materials/PBR/pbrBaseSimpleMaterial.js +21 -2
- package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
- package/Materials/PBR/pbrMaterial.pure.d.ts +12 -0
- package/Materials/PBR/pbrMaterial.pure.js +23 -3
- package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -0
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +10 -0
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.d.ts +5 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js +7 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js.map +1 -1
- package/Materials/Textures/HTML/htmlInteractionManager.d.ts +9 -3
- package/Materials/Textures/HTML/htmlInteractionManager.js +64 -5
- package/Materials/Textures/HTML/htmlInteractionManager.js.map +1 -1
- package/Materials/Textures/HTML/htmlTexture.d.ts +11 -11
- package/Materials/Textures/HTML/htmlTexture.js +106 -65
- package/Materials/Textures/HTML/htmlTexture.js.map +1 -1
- package/Materials/Textures/Loaders/internalTextureLoader.d.ts +2 -1
- package/Materials/Textures/Loaders/internalTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.d.ts +2 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js +4 -50
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js +10 -0
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
- package/Materials/Textures/dynamicTexture.pure.js +6 -0
- package/Materials/Textures/dynamicTexture.pure.js.map +1 -1
- package/Materials/Textures/ktx2encoderTypes.d.ts +51 -0
- package/Materials/Textures/ktx2encoderTypes.js +2 -0
- package/Materials/Textures/ktx2encoderTypes.js.map +1 -0
- package/Materials/Textures/renderTargetTexture.pure.js +10 -2
- package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
- package/Materials/Textures/textureMerger.d.ts +11 -0
- package/Materials/Textures/textureMerger.js +34 -19
- package/Materials/Textures/textureMerger.js.map +1 -1
- package/Materials/Textures/textureProcessor.d.ts +145 -0
- package/Materials/Textures/textureProcessor.js +445 -45
- package/Materials/Textures/textureProcessor.js.map +1 -1
- package/Materials/Textures/textureSampling.functions.d.ts +41 -0
- package/Materials/Textures/textureSampling.functions.js +82 -0
- package/Materials/Textures/textureSampling.functions.js.map +1 -0
- package/Materials/drawWrapper.d.ts +8 -0
- package/Materials/drawWrapper.js +19 -0
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effect.pure.d.ts +6 -0
- package/Materials/effect.pure.js +28 -6
- package/Materials/effect.pure.js.map +1 -1
- package/Materials/effect.webgl.functions.pure.js +1 -1
- package/Materials/effect.webgl.functions.pure.js.map +1 -1
- package/Materials/material.pure.d.ts +5 -0
- package/Materials/material.pure.js +9 -2
- package/Materials/material.pure.js.map +1 -1
- package/Materials/materialFlags.d.ts +6 -0
- package/Materials/materialFlags.js +14 -0
- package/Materials/materialFlags.js.map +1 -1
- package/Materials/materialHelper.functions.d.ts +2 -1
- package/Materials/materialHelper.functions.js +36 -2
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.js +19 -16
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/materialPluginManager.pure.js +12 -8
- package/Materials/materialPluginManager.pure.js.map +1 -1
- package/Materials/prePassConfiguration.js +19 -16
- package/Materials/prePassConfiguration.js.map +1 -1
- package/Materials/shaderMaterial.pure.js +19 -6
- package/Materials/shaderMaterial.pure.js.map +1 -1
- package/Materials/shadowDepthWrapper.d.ts +6 -0
- package/Materials/shadowDepthWrapper.js +17 -0
- package/Materials/shadowDepthWrapper.js.map +1 -1
- package/Meshes/Compression/dracoCodec.d.ts +14 -0
- package/Meshes/Compression/dracoCodec.js +22 -0
- package/Meshes/Compression/dracoCodec.js.map +1 -1
- package/Meshes/Compression/dracoDecoder.d.ts +1 -0
- package/Meshes/Compression/dracoDecoder.js +27 -0
- package/Meshes/Compression/dracoDecoder.js.map +1 -1
- package/Meshes/Compression/dracoEncoder.d.ts +1 -0
- package/Meshes/Compression/dracoEncoder.js +8 -0
- package/Meshes/Compression/dracoEncoder.js.map +1 -1
- package/Meshes/Compression/meshoptCompression.d.ts +1 -0
- package/Meshes/Compression/meshoptCompression.js +9 -0
- package/Meshes/Compression/meshoptCompression.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.d.ts +415 -0
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js +912 -0
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +3 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +40 -9
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +112 -8
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +696 -74
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/abstractMesh.pure.js +12 -4
- package/Meshes/abstractMesh.pure.js.map +1 -1
- package/Meshes/geometry.d.ts +5 -0
- package/Meshes/geometry.js +25 -0
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/index.d.ts +1 -0
- package/Meshes/index.js +1 -0
- package/Meshes/index.js.map +1 -1
- package/Meshes/mesh.pure.d.ts +7 -0
- package/Meshes/mesh.pure.js +18 -13
- package/Meshes/mesh.pure.js.map +1 -1
- package/Meshes/pure.d.ts +1 -0
- package/Meshes/pure.js +1 -0
- package/Meshes/pure.js.map +1 -1
- package/Meshes/subMesh.pure.d.ts +3 -0
- package/Meshes/subMesh.pure.js +26 -0
- package/Meshes/subMesh.pure.js.map +1 -1
- package/Meshes/thinInstanceMesh.pure.js +5 -3
- package/Meshes/thinInstanceMesh.pure.js.map +1 -1
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/khronosTextureContainer2.d.ts +3 -2
- package/Misc/khronosTextureContainer2.js +24 -6
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/khronosTextureContainer2Encoder.d.ts +166 -0
- package/Misc/khronosTextureContainer2Encoder.js +556 -0
- package/Misc/khronosTextureContainer2Encoder.js.map +1 -0
- package/Misc/khronosTextureContainer2EncoderWorker.d.ts +61 -0
- package/Misc/khronosTextureContainer2EncoderWorker.js +55 -0
- package/Misc/khronosTextureContainer2EncoderWorker.js.map +1 -0
- package/Misc/pure.d.ts +1 -0
- package/Misc/pure.js +1 -0
- package/Misc/pure.js.map +1 -1
- package/Misc/textureFormat.functions.d.ts +6 -0
- package/Misc/textureFormat.functions.js +54 -0
- package/Misc/textureFormat.functions.js.map +1 -0
- package/Misc/textureTools.d.ts +6 -2
- package/Misc/textureTools.js +100 -42
- package/Misc/textureTools.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/Node/Blocks/systemBlock.pure.d.ts +1 -1
- package/Particles/Node/Blocks/systemBlock.pure.js +6 -3
- package/Particles/Node/Blocks/systemBlock.pure.js.map +1 -1
- package/Particles/computeShaderParticleSystem.pure.js +5 -0
- package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +2 -0
- package/Particles/gpuParticleSystem.pure.js +25 -1
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/Particles/solidParticle.d.ts +5 -0
- package/Particles/solidParticle.js +5 -0
- package/Particles/solidParticle.js.map +1 -1
- package/Particles/solidParticleSystem.d.ts +10 -0
- package/Particles/solidParticleSystem.js +72 -13
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.pure.js +4 -0
- package/Particles/thinParticleSystem.pure.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.d.ts +27 -6
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js +60 -5
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js.map +1 -1
- package/PostProcesses/thinTAAPostProcess.d.ts +1 -0
- package/PostProcesses/thinTAAPostProcess.js +17 -1
- package/PostProcesses/thinTAAPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.d.ts +2 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js +6 -5
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js.map +1 -1
- package/Rendering/boundingBoxRenderer.pure.js +2 -3
- package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.js +8 -2
- package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +1 -0
- package/Rendering/objectRenderer.js +14 -0
- package/Rendering/objectRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/bumpVertex.js +1 -1
- package/Shaders/ShadersInclude/bumpVertex.js.map +1 -1
- package/Shaders/ShadersInclude/bumpVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +5 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +2 -2
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +6 -0
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockNormalFinal.js +9 -0
- package/Shaders/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance.js +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +7 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrIBLFunctions.js +12 -0
- package/Shaders/ShadersInclude/pbrIBLFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js +3 -0
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
- package/Shaders/geometry.vertex.js +6 -6
- package/Shaders/geometry.vertex.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/Shaders/lod.fragment.js +15 -2
- package/Shaders/lod.fragment.js.map +1 -1
- package/Shaders/lod3D.fragment.js +15 -2
- package/Shaders/lod3D.fragment.js.map +1 -1
- package/Shaders/lodCube.fragment.js +15 -2
- package/Shaders/lodCube.fragment.js.map +1 -1
- package/Shaders/openpbr.vertex.js +2 -0
- package/Shaders/openpbr.vertex.js.map +1 -1
- package/Shaders/pbr.fragment.js +12 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +2 -0
- package/Shaders/pbr.vertex.js.map +1 -1
- package/Shaders/textureMerger.fragment.js +28 -0
- package/Shaders/textureMerger.fragment.js.map +1 -1
- package/Shaders/textureProcessor.fragment.js +26 -4
- package/Shaders/textureProcessor.fragment.js.map +1 -1
- package/Shaders/volumetricLightScattering.fragment.js +1 -1
- package/Shaders/volumetricLightScattering.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertex.js +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/helperFunctions.js +2 -2
- package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +44 -2
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +17 -3
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +12 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js +9 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js +8 -0
- package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertex.js +2 -2
- package/ShadersWGSL/ShadersInclude/prePassVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +3 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js +16 -0
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +4 -4
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/default.vertex.js +1 -1
- package/ShadersWGSL/default.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/ShadersWGSL/gsSortCount.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortCount.compute.js +19 -0
- package/ShadersWGSL/gsSortCount.compute.js.map +1 -0
- package/ShadersWGSL/gsSortKeys.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortKeys.compute.js +49 -0
- package/ShadersWGSL/gsSortKeys.compute.js.map +1 -0
- package/ShadersWGSL/gsSortOutput.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortOutput.compute.js +28 -0
- package/ShadersWGSL/gsSortOutput.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScanLocal.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScanLocal.compute.js +23 -0
- package/ShadersWGSL/gsSortScanLocal.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScanSums.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScanSums.compute.js +19 -0
- package/ShadersWGSL/gsSortScanSums.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScatter.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScatter.compute.js +33 -0
- package/ShadersWGSL/gsSortScatter.compute.js.map +1 -0
- package/ShadersWGSL/lod.fragment.js +14 -2
- package/ShadersWGSL/lod.fragment.js.map +1 -1
- package/ShadersWGSL/lod3D.fragment.js +14 -2
- package/ShadersWGSL/lod3D.fragment.js.map +1 -1
- package/ShadersWGSL/lodCube.fragment.js +14 -2
- package/ShadersWGSL/lodCube.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.vertex.js +3 -1
- package/ShadersWGSL/openpbr.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +11 -0
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.vertex.js +3 -1
- package/ShadersWGSL/pbr.vertex.js.map +1 -1
- package/ShadersWGSL/textureMerger.fragment.js +40 -4
- package/ShadersWGSL/textureMerger.fragment.js.map +1 -1
- package/ShadersWGSL/textureProcessor.fragment.js +26 -4
- package/ShadersWGSL/textureProcessor.fragment.js.map +1 -1
- package/Sprites/spriteRenderer.js +15 -5
- package/Sprites/spriteRenderer.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.d.ts +23 -1
- package/scene.pure.js +83 -1
- package/scene.pure.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaussianSplattingGpuSorter.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine.pure\";\r\nimport { type WebGPUEngine } from \"core/Engines/webgpuEngine.pure\";\r\nimport { type WebGPUHardwareTexture } from \"core/Engines/WebGPU/webgpuHardwareTexture\";\r\nimport { type Matrix } from \"core/Maths/math.vector.pure\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture.pure\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { ComputeShader } from \"core/Compute/computeShader.pure\";\r\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\r\nimport { Buffer, type VertexBuffer } from \"core/Buffers/buffer.pure\";\r\nimport { type ComputeBindingMapping } from \"core/Engines/Extensions/engine.computeShader.pure\";\r\nimport { RegisterEnginesWebGPUExtensionsEngineComputeShader } from \"core/Engines/WebGPU/Extensions/engine.computeShader.pure\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nconst WorkgroupSize = 256;\r\n// One workgroup sorts a block of WorkgroupSize threads x 4 contiguous keys. Must match the gsSort*.compute.fx shaders.\r\nconst SortBlockSize = 1024;\r\nconst RadixBits = 4;\r\nconst RadixBins = 16;\r\n// One scan chunk covers 1024 histogram entries (16 bins x 64 blocks). The top-level scan handles at most 256 chunks.\r\nconst BlocksPerScanChunk = 64;\r\nconst MaxScanChunks = 256;\r\nconst MaxSortKeyCount = SortBlockSize * BlocksPerScanChunk * MaxScanChunks;\r\nconst MaxDispatchGroupsPerDimension = 65535;\r\n// Source indices travel as float32 in the vertex buffer, so they must stay exactly representable.\r\nconst MaxFloatExactSplatCount = 1 << 24;\r\nconst DefaultMaxStorageBufferSize = 134217728;\r\nconst MinKeyBits = 8;\r\nconst MaxKeyBits = 24;\r\nconst DefaultKeyBits = 16;\r\nconst ParamsByteSize = 80;\r\nconst PassParamsByteSize = 16;\r\nconst MinCapacity = 16;\r\nconst MinDepthRange = 1e-12;\r\n\r\n/**\r\n * Anything exposing a Babylon.js column-major 4x4 matrix array (a Matrix, for instance).\r\n */\r\nexport type GaussianSplattingGpuSortMatrix = Pick<Matrix, \"m\">;\r\n\r\n/**\r\n * Inputs describing the splat data the GPU sorter reads. The sorter only reads textures: it never owns them.\r\n */\r\nexport interface IGaussianSplattingGpuSortSource {\r\n /**\r\n * Number of splats in the mesh (the value used as the \"empty splat\" index padding the sorted output).\r\n */\r\n vertexCount: number;\r\n /**\r\n * Width in texels of the data textures (splat index i lives at texel (i % width, floor(i / width))).\r\n */\r\n textureWidth: number;\r\n /**\r\n * RGBA32F texture whose xyz hold the splat centers. For SOG data, the RGBA8 \"means low\" texture.\r\n */\r\n centersTexture: BaseTexture;\r\n /**\r\n * SOG (quantized means) inputs. When set, centers are decoded like the Gaussian Splatting vertex shader does.\r\n */\r\n sog?: {\r\n /**\r\n * RGBA8 \"means high\" texture.\r\n */\r\n meansHighTexture: BaseTexture;\r\n /**\r\n * Quantization range minimum (xyz) of the log-encoded means.\r\n */\r\n meansMin: ArrayLike<number>;\r\n /**\r\n * Quantization range maximum (xyz) of the log-encoded means.\r\n */\r\n meansMax: ArrayLike<number>;\r\n };\r\n /**\r\n * Compound meshes: R8 texture (same layout as the centers) holding each splat's part index. Used together with {@link GaussianSplattingGpuSorter.setPartMatrices}.\r\n */\r\n partIndicesTexture?: BaseTexture;\r\n /**\r\n * Optional local-space bounding box minimum of the splat centers, used to derive the depth range when none is given to {@link GaussianSplattingGpuSorter.sort}.\r\n * Not needed for SOG data (derived from the means range).\r\n */\r\n boundsMin?: ArrayLike<number>;\r\n /**\r\n * Optional local-space bounding box maximum of the splat centers.\r\n */\r\n boundsMax?: ArrayLike<number>;\r\n}\r\n\r\n/**\r\n * Options of {@link GaussianSplattingGpuSorter.sort}.\r\n */\r\nexport interface IGaussianSplattingGpuSortOptions {\r\n /**\r\n * Whether the scene is right-handed. Matches the CPU sort worker: the depth is negated so larger always means farther.\r\n */\r\n rightHanded?: boolean;\r\n /**\r\n * World position of the camera. When omitted, the translation of the view matrix is used, which is equivalent.\r\n */\r\n cameraPosition?: ArrayLike<number>;\r\n /**\r\n * Depth interval covering every active splat, in the sign-adjusted depth space (larger = farther). The 2^keyBits sort keys span this interval,\r\n * so a tight interval improves the precision. When omitted, it is derived from the source bounds.\r\n */\r\n depthRange?: { min: number; max: number };\r\n}\r\n\r\n/**\r\n * Number of keys bits clamped to the supported range.\r\n * @param keyBits requested number of sort key bits\r\n * @returns the clamped, integral number of key bits\r\n * @internal\r\n */\r\nexport function _ClampGpuSortKeyBits(keyBits: number): number {\r\n return Math.min(MaxKeyBits, Math.max(MinKeyBits, Math.round(keyBits)));\r\n}\r\n\r\n/**\r\n * Number of radix passes needed to sort keys of a given size.\r\n * @param keyBits number of bits of the sort keys\r\n * @returns the number of 4-bit radix passes\r\n * @internal\r\n */\r\nexport function _GetGpuSortPassCount(keyBits: number): number {\r\n return Math.ceil(_ClampGpuSortKeyBits(keyBits) / RadixBits);\r\n}\r\n\r\n/**\r\n * Count of output slots: the active count rounded up to a multiple of 16 (16 splats per instance), at least 16.\r\n * @param activeCount number of splats to render\r\n * @returns the padded count\r\n * @internal\r\n */\r\nexport function _GetGpuSortPaddedCount(activeCount: number): number {\r\n return Math.max((activeCount + 15) & ~15, 16);\r\n}\r\n\r\n/**\r\n * Packs flat `[start0, count0, start1, count1, ...]` splat intervals for the key shader. Each GPU entry is `(exclusive prefix of the counts, start)`.\r\n * Empty intervals are dropped and intervals are clamped to `[0, vertexCount)`.\r\n * @param intervals flat source-splat intervals (start, count pairs)\r\n * @param vertexCount number of splats in the mesh\r\n * @returns the packed entries, the number of entries and the total number of active splats\r\n * @internal\r\n */\r\nexport function _PackGpuSortIntervals(intervals: ArrayLike<number>, vertexCount: number): { data: Uint32Array; count: number; total: number } {\r\n const data = new Uint32Array(Math.max(intervals.length & ~1, 2));\r\n let count = 0;\r\n let total = 0;\r\n for (let i = 0; i + 1 < intervals.length; i += 2) {\r\n const start = Math.min(Math.max(intervals[i], 0), vertexCount);\r\n const length = Math.min(Math.max(intervals[i + 1], 0), vertexCount - start);\r\n if (length > 0) {\r\n data[count * 2] = total;\r\n data[count * 2 + 1] = start;\r\n count++;\r\n total += length;\r\n }\r\n }\r\n return { data, count, total };\r\n}\r\n\r\n/**\r\n * Computes the coefficients of the depth of a splat center: `depth = dot(coef.xyz, center) + coef.w`, in the same space and sign convention as the CPU sort worker\r\n * (the signed distance along the camera forward axis, negated in right-handed scenes, so a larger value is farther).\r\n * @param world world matrix (array of 16 numbers) transforming the splat center\r\n * @param view view matrix (array of 16 numbers)\r\n * @param depthSign 1 for left-handed scenes, -1 for right-handed scenes\r\n * @param cameraPosition world camera position, or null to use the view matrix translation\r\n * @param out receives the 4 coefficients\r\n * @param offset index of the first coefficient in out\r\n * @param worldOffset index of the first element of the world matrix in world (defaults to 0), so a matrix can be read from a flat array without creating a view\r\n * @internal\r\n */\r\nexport function _ComputeGpuSortDepthCoefficients(\r\n world: ArrayLike<number>,\r\n view: ArrayLike<number>,\r\n depthSign: number,\r\n cameraPosition: Nullable<ArrayLike<number>>,\r\n out: Float32Array,\r\n offset: number,\r\n worldOffset = 0\r\n): void {\r\n const fx = view[2];\r\n const fy = view[6];\r\n const fz = view[10];\r\n const w = worldOffset;\r\n out[offset] = (fx * world[w] + fy * world[w + 1] + fz * world[w + 2]) * depthSign;\r\n out[offset + 1] = (fx * world[w + 4] + fy * world[w + 5] + fz * world[w + 6]) * depthSign;\r\n out[offset + 2] = (fx * world[w + 8] + fy * world[w + 9] + fz * world[w + 10]) * depthSign;\r\n const translation = fx * world[w + 12] + fy * world[w + 13] + fz * world[w + 14];\r\n const d = cameraPosition ? translation - (fx * cameraPosition[0] + fy * cameraPosition[1] + fz * cameraPosition[2]) : translation + view[14];\r\n out[offset + 3] = d * depthSign;\r\n}\r\n\r\n/**\r\n * Computes the interval of depths reached by the points of a box, for one or several sets of depth coefficients.\r\n * @param coefficients depth coefficients (4 per set)\r\n * @param setCount number of coefficient sets\r\n * @param boundsMin box minimum (xyz)\r\n * @param boundsMax box maximum (xyz)\r\n * @param result optional object receiving the interval, to avoid an allocation when called every frame\r\n * @returns the min and max depths (the result object when provided)\r\n * @internal\r\n */\r\nexport function _ComputeGpuSortDepthRange(\r\n coefficients: ArrayLike<number>,\r\n setCount: number,\r\n boundsMin: ArrayLike<number>,\r\n boundsMax: ArrayLike<number>,\r\n result: { min: number; max: number } = { min: 0, max: 0 }\r\n): { min: number; max: number } {\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (let set = 0; set < setCount; set++) {\r\n let setMin = coefficients[set * 4 + 3];\r\n let setMax = setMin;\r\n for (let axis = 0; axis < 3; axis++) {\r\n const a = coefficients[set * 4 + axis] * boundsMin[axis];\r\n const b = coefficients[set * 4 + axis] * boundsMax[axis];\r\n setMin += Math.min(a, b);\r\n setMax += Math.max(a, b);\r\n }\r\n min = Math.min(min, setMin);\r\n max = Math.max(max, setMax);\r\n }\r\n result.min = min;\r\n result.max = max;\r\n return result;\r\n}\r\n\r\n/**\r\n * Scale converting a depth distance to a sort key: `key = (depthMax - depth) * scale`, so the farthest splat gets key 0 (sorted first).\r\n * @param depthMin smallest depth\r\n * @param depthMax largest depth\r\n * @param keyBits number of bits of the sort keys\r\n * @returns the scale, 0 when the depth range is degenerate (all keys are 0, like the CPU worker)\r\n * @internal\r\n */\r\nexport function _ComputeGpuSortKeyScale(depthMin: number, depthMax: number, keyBits: number): number {\r\n const range = depthMax - depthMin;\r\n return range > MinDepthRange ? (Math.pow(2, _ClampGpuSortKeyBits(keyBits)) - 1) / range : 0;\r\n}\r\n\r\n/**\r\n * Inverse of the SOG means log-transform, applied to a quantization range bound.\r\n * @param value log-encoded value\r\n * @returns the decoded value\r\n * @internal\r\n */\r\nexport function _DecodeGpuSortSogMean(value: number): number {\r\n return Math.sign(value) * (Math.exp(Math.abs(value)) - 1);\r\n}\r\n\r\n/**\r\n * Gets the number of splats a GPU sorter can handle on an engine: limited by the maximum storage buffer binding size (4 bytes per splat),\r\n * and by 2^24 so that source indices are exactly representable as float32 in the instanced vertex buffer.\r\n * @param engine the engine\r\n * @returns the maximum number of splats (a multiple of 16)\r\n */\r\nexport function GetGaussianSplattingGpuSorterMaxSplatCount(engine: AbstractEngine): number {\r\n const limits = (engine as WebGPUEngine).currentLimits;\r\n const maxBytes = limits\r\n ? Math.min(limits.maxStorageBufferBindingSize ?? DefaultMaxStorageBufferSize, limits.maxBufferSize ?? DefaultMaxStorageBufferSize)\r\n : DefaultMaxStorageBufferSize;\r\n return Math.min(MaxFloatExactSplatCount, MaxSortKeyCount, Math.floor(maxBytes / Float32Array.BYTES_PER_ELEMENT) & ~15);\r\n}\r\n\r\nfunction _RoundUp16(value: number): number {\r\n return (Math.ceil(value) + 15) & ~15;\r\n}\r\n\r\n/**\r\n * Per-view GPU buffer receiving a sorted splat index list. It can be bound as the four instanced `splatIndex0` ... `splatIndex3` vertex attributes\r\n * of the Gaussian Splatting vertex shader (16 splats per instance), in place of the CPU-uploaded index buffer.\r\n *\r\n * Create it with {@link GaussianSplattingGpuSorter.createOutput}. After each successful sort, if {@link buffersVersion} changed,\r\n * the vertex buffers were recreated (the output grew) and must be bound again.\r\n */\r\nexport class GaussianSplattingGpuSortOutput {\r\n private _engine: WebGPUEngine;\r\n private _label: string;\r\n private _storageBuffer: Nullable<StorageBuffer> = null;\r\n private _vertexBuffers: VertexBuffer[] = [];\r\n private _wrapper: Nullable<Buffer> = null;\r\n private _capacity = 0;\r\n private _buffersVersion = 0;\r\n /** @internal */\r\n public _sortedPaddedCount = 0;\r\n /** @internal */\r\n public _paramsBuffer: StorageBuffer;\r\n /** @internal */\r\n public _coefsBuffer: Nullable<StorageBuffer> = null;\r\n /** @internal */\r\n public _coefsCapacity = 0;\r\n /** @internal */\r\n public _keysCs: Nullable<ComputeShader> = null;\r\n /** @internal */\r\n public _keysCsSog = false;\r\n /** @internal */\r\n public _keysCsCompound = false;\r\n /** @internal Texture views used by the keys context, which may change without replacing their BaseTexture objects. */\r\n public _keysCsCentersView: Nullable<GPUTextureView> = null;\r\n /** @internal */\r\n public _keysCsMeansHighView: Nullable<GPUTextureView> = null;\r\n /** @internal */\r\n public _keysCsPartIndicesView: Nullable<GPUTextureView> = null;\r\n /** @internal */\r\n public _outputCs: ComputeShader;\r\n /** @internal Sorter binding version the compute shaders of this output were last bound with. */\r\n public _boundSorterVersion = -1;\r\n /** @internal Buffers version of the output storage buffer the output shader was last bound with. */\r\n public _boundBuffersVersion = -1;\r\n /** @internal */\r\n public _boundCoefsBuffer: Nullable<StorageBuffer> = null;\r\n /** @internal */\r\n public _boundKeysCs: Nullable<ComputeShader> = null;\r\n /** @internal */\r\n public _lastSortError = false;\r\n /** @internal */\r\n public _onDisposed: Nullable<() => void> = null;\r\n private _disposed = false;\r\n\r\n /**\r\n * @param engine the WebGPU engine\r\n * @param label debug label\r\n * @internal\r\n */\r\n constructor(engine: WebGPUEngine, label: string) {\r\n this._engine = engine;\r\n this._label = label;\r\n this._paramsBuffer = new StorageBuffer(engine, ParamsByteSize, Constants.BUFFER_CREATIONFLAG_READWRITE, label + \"_params\");\r\n this._outputCs = new ComputeShader(label + \"_output\", engine, \"gsSortOutput\", {\r\n bindingsMapping: { params: { group: 0, binding: 0 }, vals: { group: 0, binding: 1 }, indexOut: { group: 0, binding: 2 } },\r\n });\r\n }\r\n\r\n /**\r\n * The buffer holding the sorted splat indices as float32 (back-to-front), padded to a multiple of 16 with the empty splat index.\r\n */\r\n public get buffer(): Nullable<StorageBuffer> {\r\n return this._storageBuffer;\r\n }\r\n\r\n /**\r\n * The 4 instanced vertex buffers `splatIndex0` ... `splatIndex3` (vec4 each, stride 16 floats) viewing {@link buffer}.\r\n */\r\n public get vertexBuffers(): readonly VertexBuffer[] {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Number of output slots written by the last successful sort: a multiple of 16 (0 before the first successful sort).\r\n */\r\n public get paddedCount(): number {\r\n return this._sortedPaddedCount;\r\n }\r\n\r\n /**\r\n * Number of instances to draw (16 splats per instance) after the last successful sort.\r\n */\r\n public get instanceCount(): number {\r\n return this._sortedPaddedCount >> 4;\r\n }\r\n\r\n /**\r\n * Incremented each time the underlying buffer and vertex buffers are recreated.\r\n */\r\n public get buffersVersion(): number {\r\n return this._buffersVersion;\r\n }\r\n\r\n /**\r\n * Creates (or grows) the GPU buffer so it can hold the given number of slots.\r\n * @param paddedCount number of slots\r\n * @param maxCapacity maximum capacity allowed by the device limits\r\n * @internal\r\n */\r\n public _ensureCapacity(paddedCount: number, maxCapacity: number): void {\r\n if (this._storageBuffer && this._capacity >= paddedCount) {\r\n return;\r\n }\r\n\r\n const capacity = Math.max(paddedCount, Math.min(_RoundUp16(this._capacity * 1.5), maxCapacity));\r\n this._releaseBuffers();\r\n this._capacity = capacity;\r\n this._storageBuffer = new StorageBuffer(\r\n this._engine,\r\n capacity * Float32Array.BYTES_PER_ELEMENT,\r\n Constants.BUFFER_CREATIONFLAG_VERTEX | Constants.BUFFER_CREATIONFLAG_READWRITE,\r\n this._label + \"_indices\"\r\n );\r\n // The wrapper does not own the GPU buffer: it is released through the StorageBuffer only.\r\n this._wrapper = new Buffer(this._engine, this._storageBuffer.getBuffer(), false, 16, true, true);\r\n for (let i = 0; i < 4; i++) {\r\n this._vertexBuffers.push(this._wrapper.createVertexBuffer(\"splatIndex\" + i, i * 4, 4));\r\n }\r\n this._buffersVersion++;\r\n }\r\n\r\n /**\r\n * Releases the GPU resources.\r\n */\r\n public dispose(): void {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this._disposed = true;\r\n this._onDisposed?.();\r\n this._onDisposed = null;\r\n this._releaseBuffers();\r\n this._paramsBuffer.dispose();\r\n this._coefsBuffer?.dispose();\r\n this._coefsBuffer = null;\r\n this._keysCs = null;\r\n }\r\n\r\n private _releaseBuffers(): void {\r\n for (const vertexBuffer of this._vertexBuffers) {\r\n vertexBuffer.dispose();\r\n }\r\n this._vertexBuffers = [];\r\n // A device restoration rebuilds the wrapper with its own buffer, which is no longer the storage buffer and must be released.\r\n if (this._wrapper && this._wrapper.getBuffer() !== this._storageBuffer?.getBuffer()) {\r\n this._wrapper.dispose();\r\n }\r\n this._wrapper = null;\r\n this._storageBuffer?.dispose();\r\n this._storageBuffer = null;\r\n }\r\n}\r\n\r\nfunction _Dispatch(cs: ComputeShader, groups: number): boolean {\r\n const dispatched =\r\n groups <= MaxDispatchGroupsPerDimension\r\n ? cs.dispatch(Math.max(groups, 1), 1, 1)\r\n : cs.dispatch(MaxDispatchGroupsPerDimension, Math.ceil(groups / MaxDispatchGroupsPerDimension), 1);\r\n if (dispatched) {\r\n // The context check leaves this set when rebinding reuses the same resources.\r\n cs.triggerContextRebuild = false;\r\n }\r\n return dispatched;\r\n}\r\n\r\nfunction _IsShaderReady(cs: ComputeShader): boolean {\r\n if (cs.fastMode) {\r\n return true;\r\n }\r\n if (!cs.isReady()) {\r\n return false;\r\n }\r\n cs.fastMode = true;\r\n // Binding setters mark the context dirty, but fastMode skips that check. Rebuild it on the first dispatch after each rebind.\r\n cs.triggerContextRebuild = true;\r\n return true;\r\n}\r\n\r\n/**\r\n * WebGPU compute depth sorter for Gaussian Splatting. It reproduces the ordering of the CPU sort worker (back-to-front counting sort) entirely on the GPU,\r\n * and writes the sorted splat indices in a vertex buffer ready to be used as the instanced `splatIndex` attributes ({@link GaussianSplattingGpuSortOutput}).\r\n *\r\n * Pipeline of a sort (all dispatches are enqueued on the engine's command encoder, without any CPU readback):\r\n * 1. keys: for each active splat, compute the view depth and quantize it to a `keyBits`-bit key (farthest = smallest). Supports splat intervals,\r\n * compound parts (per-part matrices) and SOG decoded means.\r\n * 2. a stable LSD radix sort with 4-bit digits, `ceil(keyBits / 4)` passes of count, scan (2 levels) and scatter. No subgroup operation is required.\r\n * 3. output: writes the sorted indices as float32, padding to a multiple of 16 with `vertexCount`.\r\n *\r\n * Usage constraints:\r\n * - {@link sort} ends the current render pass: call it outside of any render pass (e.g. in `onBeforeRenderObservable` / `onBeforeCameraRenderObservable`).\r\n * - Uniform-like data is written with queue writes, which take effect before the whole frame's commands. So call {@link sort} at most once per output and per frame, and do not\r\n * change the source, the intervals or the part matrices between two sorts of the same frame.\r\n * - If the textures given to {@link setSource} are recreated, call {@link setSource} again.\r\n * - The compute shaders and the WebGPU compute engine extension are loaded by {@link GaussianSplattingGpuSorter.LoadDependenciesAsync}: await it before the first {@link sort}.\r\n * Until it has completed, {@link sort} returns false without enqueuing anything.\r\n * @experimental\r\n */\r\nexport class GaussianSplattingGpuSorter {\r\n private static _DependenciesReady = false;\r\n private static _DependenciesPromise: Nullable<Promise<void>> = null;\r\n\r\n private readonly _engine: WebGPUEngine;\r\n private readonly _name: string;\r\n private readonly _keyBits: number;\r\n private readonly _passCount: number;\r\n private readonly _maxSplatCount: number;\r\n private readonly _maxIntervalCount: number;\r\n\r\n private _vertexCount = 0;\r\n private _textureWidth = 0;\r\n private _centersTexture: Nullable<BaseTexture> = null;\r\n private _meansHighTexture: Nullable<BaseTexture> = null;\r\n private _partIndicesTexture: Nullable<BaseTexture> = null;\r\n private readonly _meansMin = new Float32Array(4);\r\n private readonly _meansMax = new Float32Array(4);\r\n private _boundsMin: Nullable<Float32Array> = null;\r\n private _boundsMax: Nullable<Float32Array> = null;\r\n\r\n private _partMatrices: Nullable<Float32Array> = null;\r\n private _partCount = 0;\r\n\r\n private _rawIntervals: Nullable<Uint32Array> = null;\r\n private _packedIntervals: Nullable<Uint32Array> = null;\r\n private _intervalCount = 0;\r\n private _intervalsDirty = true;\r\n private _intervalsValid = true;\r\n private _activeCount = 0;\r\n\r\n // Incremented whenever a buffer or texture bound to the compute shaders is created, replaced or released, so the shaders are only rebound when needed.\r\n private _bindingsVersion = 0;\r\n private _sortShadersBoundVersion = -1;\r\n private _capacity = 0;\r\n private _keysA: Nullable<StorageBuffer> = null;\r\n private _keysB: Nullable<StorageBuffer> = null;\r\n private _valsA: Nullable<StorageBuffer> = null;\r\n private _valsB: Nullable<StorageBuffer> = null;\r\n private _sumTable: Nullable<StorageBuffer> = null;\r\n private _intervalsBuffer: Nullable<StorageBuffer> = null;\r\n private _intervalsCapacity = 0;\r\n private readonly _chunkSums: StorageBuffer;\r\n private readonly _passParams: StorageBuffer[] = [];\r\n private _passParamsActiveCount = -1;\r\n private readonly _passData = new Uint32Array(4);\r\n\r\n private readonly _countCs: ComputeShader[] = [];\r\n private readonly _scatterCs: ComputeShader[] = [];\r\n private readonly _scanLocalCs: ComputeShader;\r\n private readonly _scanSumsCs: ComputeShader;\r\n\r\n private readonly _paramsData = new ArrayBuffer(ParamsByteSize);\r\n private readonly _paramsU32 = new Uint32Array(this._paramsData);\r\n private readonly _paramsF32 = new Float32Array(this._paramsData);\r\n private _coefs = new Float32Array(4);\r\n private readonly _depthRange = { min: 0, max: 0 };\r\n\r\n private readonly _outputs: GaussianSplattingGpuSortOutput[] = [];\r\n private _disposed = false;\r\n\r\n /**\r\n * Whether GPU sorting is available on an engine: a WebGPU engine with compute shader support.\r\n * @param engine the engine\r\n * @returns true if a {@link GaussianSplattingGpuSorter} can be created\r\n */\r\n public static IsSupported(engine: AbstractEngine): boolean {\r\n return !!engine && engine.isWebGPU && !!engine.getCaps().supportComputeShaders;\r\n }\r\n\r\n /**\r\n * Gets the maximum number of splats the sorter can sort on an engine.\r\n * @param engine the engine\r\n * @returns the maximum splat count\r\n */\r\n public static GetMaxSupportedSplatCount(engine: AbstractEngine): number {\r\n return GetGaussianSplattingGpuSorterMaxSplatCount(engine);\r\n }\r\n\r\n /**\r\n * Registers the WebGPU compute engine extension and loads the compute shaders of the sorter. The result is cached: calling it again returns the same promise.\r\n * It must have completed before the first {@link sort} (which returns false until then). If loading fails, the promise rejects and the next call retries.\r\n * @returns a promise resolved when the dependencies are ready\r\n */\r\n public static async LoadDependenciesAsync(): Promise<void> {\r\n if (GaussianSplattingGpuSorter._DependenciesReady) {\r\n return;\r\n }\r\n GaussianSplattingGpuSorter._DependenciesPromise ??= (async () => {\r\n try {\r\n RegisterEnginesWebGPUExtensionsEngineComputeShader();\r\n await Promise.all([\r\n import(\"../../ShadersWGSL/gsSortKeys.compute\"),\r\n import(\"../../ShadersWGSL/gsSortCount.compute\"),\r\n import(\"../../ShadersWGSL/gsSortScanLocal.compute\"),\r\n import(\"../../ShadersWGSL/gsSortScanSums.compute\"),\r\n import(\"../../ShadersWGSL/gsSortScatter.compute\"),\r\n import(\"../../ShadersWGSL/gsSortOutput.compute\"),\r\n ]);\r\n GaussianSplattingGpuSorter._DependenciesReady = true;\r\n } catch (e) {\r\n GaussianSplattingGpuSorter._DependenciesPromise = null;\r\n throw e;\r\n }\r\n })();\r\n await GaussianSplattingGpuSorter._DependenciesPromise;\r\n }\r\n\r\n /**\r\n * Creates a GPU sorter. Shaders are compiled asynchronously: {@link sort} returns false until they are ready.\r\n * Await {@link GaussianSplattingGpuSorter.LoadDependenciesAsync} before the first {@link sort}.\r\n * @param engine the WebGPU engine\r\n * @param name debug name\r\n * @param keyBits number of bits of the depth sort keys (8 to 24, default 16). Each 4 bits cost one radix pass; 16 bits is enough for most scenes.\r\n */\r\n constructor(engine: AbstractEngine, name = \"GaussianSplattingGpuSorter\", keyBits = DefaultKeyBits) {\r\n if (!GaussianSplattingGpuSorter.IsSupported(engine)) {\r\n throw new Error(\"GaussianSplattingGpuSorter requires a WebGPU engine with compute shader support.\");\r\n }\r\n // ComputeShader creates its compute context on construction, so the engine extension must be registered first.\r\n RegisterEnginesWebGPUExtensionsEngineComputeShader();\r\n this._engine = engine as WebGPUEngine;\r\n this._name = name;\r\n this._keyBits = _ClampGpuSortKeyBits(keyBits);\r\n this._passCount = _GetGpuSortPassCount(this._keyBits);\r\n this._maxSplatCount = GetGaussianSplattingGpuSorterMaxSplatCount(engine);\r\n const limits = this._engine.currentLimits;\r\n this._maxIntervalCount = Math.floor(\r\n Math.min(limits?.maxStorageBufferBindingSize ?? DefaultMaxStorageBufferSize, limits?.maxBufferSize ?? DefaultMaxStorageBufferSize) / (2 * Uint32Array.BYTES_PER_ELEMENT)\r\n );\r\n\r\n const passBindings: ComputeBindingMapping = { params: { group: 0, binding: 0 } };\r\n this._chunkSums = new StorageBuffer(this._engine, MaxScanChunks * Uint32Array.BYTES_PER_ELEMENT, Constants.BUFFER_CREATIONFLAG_READWRITE, name + \"_chunkSums\");\r\n for (let pass = 0; pass < this._passCount; pass++) {\r\n this._passParams.push(new StorageBuffer(this._engine, PassParamsByteSize, Constants.BUFFER_CREATIONFLAG_READWRITE, name + \"_passParams\" + pass));\r\n this._countCs.push(\r\n new ComputeShader(name + \"_count\" + pass, engine, \"gsSortCount\", {\r\n bindingsMapping: { ...passBindings, keysIn: { group: 0, binding: 1 }, sumTable: { group: 0, binding: 2 } },\r\n })\r\n );\r\n this._scatterCs.push(\r\n new ComputeShader(name + \"_scatter\" + pass, engine, \"gsSortScatter\", {\r\n bindingsMapping: {\r\n ...passBindings,\r\n keysIn: { group: 0, binding: 1 },\r\n valsIn: { group: 0, binding: 2 },\r\n keysOut: { group: 0, binding: 3 },\r\n valsOut: { group: 0, binding: 4 },\r\n sumTable: { group: 0, binding: 5 },\r\n chunkSums: { group: 0, binding: 6 },\r\n },\r\n })\r\n );\r\n }\r\n this._scanLocalCs = new ComputeShader(name + \"_scanLocal\", engine, \"gsSortScanLocal\", {\r\n bindingsMapping: { ...passBindings, sumTable: { group: 0, binding: 1 }, chunkSums: { group: 0, binding: 2 } },\r\n });\r\n this._scanSumsCs = new ComputeShader(name + \"_scanSums\", engine, \"gsSortScanSums\", { bindingsMapping: { ...passBindings, chunkSums: { group: 0, binding: 1 } } });\r\n }\r\n\r\n /**\r\n * Number of splats rendered after applying the intervals (the number of keys sorted).\r\n */\r\n public get activeCount(): number {\r\n return this._activeCount;\r\n }\r\n\r\n /**\r\n * Number of output slots (activeCount rounded up to a multiple of 16).\r\n */\r\n public get paddedCount(): number {\r\n return _GetGpuSortPaddedCount(this._activeCount);\r\n }\r\n\r\n /**\r\n * Number of bits of the depth sort keys.\r\n */\r\n public get keyBits(): number {\r\n return this._keyBits;\r\n }\r\n\r\n /**\r\n * Sets the splat data to sort.\r\n * @param source the source textures and layout\r\n * @returns false (and logs an error) if the source or active interval count exceeds {@link GaussianSplattingGpuSorter.GetMaxSupportedSplatCount}\r\n */\r\n public setSource(source: IGaussianSplattingGpuSortSource): boolean {\r\n if (source.vertexCount > this._maxSplatCount) {\r\n Logger.Error(`${this._name}: ${source.vertexCount} splats exceeds the GPU sorter limit of ${this._maxSplatCount}.`);\r\n return false;\r\n }\r\n this._vertexCount = source.vertexCount;\r\n this._textureWidth = source.textureWidth;\r\n this._bindingsVersion++;\r\n this._centersTexture = source.centersTexture;\r\n this._partIndicesTexture = source.partIndicesTexture ?? null;\r\n this._meansHighTexture = source.sog?.meansHighTexture ?? null;\r\n this._boundsMin = null;\r\n this._boundsMax = null;\r\n if (source.sog) {\r\n this._meansMin.fill(0);\r\n this._meansMax.fill(0);\r\n this._boundsMin = new Float32Array(3);\r\n this._boundsMax = new Float32Array(3);\r\n for (let i = 0; i < 3; i++) {\r\n this._meansMin[i] = source.sog.meansMin[i];\r\n this._meansMax[i] = source.sog.meansMax[i];\r\n this._boundsMin[i] = _DecodeGpuSortSogMean(source.sog.meansMin[i]);\r\n this._boundsMax[i] = _DecodeGpuSortSogMean(source.sog.meansMax[i]);\r\n }\r\n } else if (source.boundsMin && source.boundsMax) {\r\n this._boundsMin = Float32Array.from(source.boundsMin);\r\n this._boundsMax = Float32Array.from(source.boundsMax);\r\n }\r\n return this._refreshIntervals();\r\n }\r\n\r\n /**\r\n * Sets the transform of each part of a compound mesh. Used instead of the world matrix given to {@link sort} when a part indices texture was set in {@link setSource}.\r\n * The matrices are copied: call this again when they change.\r\n * @param matrices one matrix per part, or a flat array of 16 floats per part, or null for a non-compound mesh\r\n */\r\n public setPartMatrices(matrices: Nullable<ReadonlyArray<GaussianSplattingGpuSortMatrix> | ArrayLike<number>>): void {\r\n if (!matrices || matrices.length === 0) {\r\n this._partCount = 0;\r\n return;\r\n }\r\n const isFlat = typeof matrices[0] === \"number\";\r\n const count = isFlat ? Math.floor(matrices.length / 16) : matrices.length;\r\n if (!this._partMatrices || this._partMatrices.length < count * 16) {\r\n this._partMatrices = new Float32Array(count * 16);\r\n }\r\n for (let i = 0; i < count; i++) {\r\n for (let j = 0; j < 16; j++) {\r\n this._partMatrices[i * 16 + j] = isFlat ? (matrices as ArrayLike<number>)[i * 16 + j] : (matrices as ReadonlyArray<GaussianSplattingGpuSortMatrix>)[i].m[j];\r\n }\r\n }\r\n this._partCount = count;\r\n }\r\n\r\n /**\r\n * Restricts the sort to ranges of source splats, like the CPU worker's `intervals` message.\r\n * @param intervals flat `[start0, count0, start1, count1, ...]` (start, COUNT pairs), or null to sort every splat\r\n * @returns false (and logs an error) if the packed intervals or padded active count exceed the scan or device storage-buffer limits.\r\n * Overlapping intervals count each occurrence. Sorting is disabled until valid intervals or a valid source are set.\r\n */\r\n public setIntervals(intervals: Nullable<ArrayLike<number>>): boolean {\r\n this._rawIntervals = intervals ? Uint32Array.from(intervals) : null;\r\n return this._refreshIntervals();\r\n }\r\n\r\n /**\r\n * Creates an output receiving the sorted indices of one view. Use one output per camera that is sorted independently.\r\n * @returns the new output\r\n */\r\n public createOutput(): GaussianSplattingGpuSortOutput {\r\n if (!this._intervalsValid) {\r\n throw new Error(`${this._name}: cannot create an output for unsupported active intervals.`);\r\n }\r\n const output = new GaussianSplattingGpuSortOutput(this._engine, this._name + \"_out\" + this._outputs.length);\r\n output._ensureCapacity(this.paddedCount, this._maxSplatCount);\r\n this._outputs.push(output);\r\n output._onDisposed = () => {\r\n const index = this._outputs.indexOf(output);\r\n if (index >= 0) {\r\n this._outputs.splice(index, 1);\r\n }\r\n };\r\n return output;\r\n }\r\n\r\n /**\r\n * Enqueues the sort of the active splats for a view. Call it outside of any render pass, once per output and per frame.\r\n * @param output the output receiving the sorted indices\r\n * @param worldMatrix world matrix of the mesh (ignored for compound meshes, which use the part matrices)\r\n * @param viewMatrix view matrix of the camera\r\n * @param options handedness, camera position and depth range\r\n * @returns false if nothing was enqueued (unsupported active intervals, shaders still compiling, no source, or no depth range), true otherwise\r\n */\r\n public sort(\r\n output: GaussianSplattingGpuSortOutput,\r\n worldMatrix: GaussianSplattingGpuSortMatrix,\r\n viewMatrix: GaussianSplattingGpuSortMatrix,\r\n options?: IGaussianSplattingGpuSortOptions\r\n ): boolean {\r\n if (this._disposed || !this._intervalsValid || !this._centersTexture || !GaussianSplattingGpuSorter._DependenciesReady) {\r\n return false;\r\n }\r\n const sog = !!this._meansHighTexture;\r\n const compound = !!this._partIndicesTexture && this._partCount > 0 && !!this._partMatrices;\r\n const coefCount = compound ? this._partCount : 1;\r\n const activeCount = this._activeCount;\r\n const paddedCount = this.paddedCount;\r\n\r\n this._ensureCapacity(Math.max(activeCount, MinCapacity));\r\n output._ensureCapacity(paddedCount, this._maxSplatCount);\r\n this._ensureIntervalsBuffer();\r\n this._ensureCoefsBuffer(output, coefCount);\r\n const keysCs = this._getKeysComputeShader(output, sog, compound);\r\n this._bindResources(output, keysCs, sog, compound);\r\n\r\n if (!this._isReady(keysCs, output)) {\r\n return false;\r\n }\r\n\r\n const depthSign = options?.rightHanded ? -1 : 1;\r\n const cameraPosition = options?.cameraPosition ?? null;\r\n if (this._coefs.length < coefCount * 4) {\r\n this._coefs = new Float32Array(coefCount * 4);\r\n }\r\n if (compound) {\r\n const partMatrices = this._partMatrices!;\r\n for (let i = 0; i < coefCount; i++) {\r\n _ComputeGpuSortDepthCoefficients(partMatrices, viewMatrix.m, depthSign, cameraPosition, this._coefs, i * 4, i * 16);\r\n }\r\n } else {\r\n _ComputeGpuSortDepthCoefficients(worldMatrix.m, viewMatrix.m, depthSign, cameraPosition, this._coefs, 0);\r\n }\r\n\r\n let range = options?.depthRange;\r\n if (!range && this._boundsMin && this._boundsMax) {\r\n range = _ComputeGpuSortDepthRange(this._coefs, coefCount, this._boundsMin, this._boundsMax, this._depthRange);\r\n }\r\n if (!range) {\r\n if (!output._lastSortError) {\r\n Logger.Error(`${this._name}: no depth range available. Provide options.depthRange or source bounds.`);\r\n output._lastSortError = true;\r\n }\r\n return false;\r\n }\r\n output._lastSortError = false;\r\n\r\n this._writeParams(output, coefCount, range.min, range.max);\r\n output._coefsBuffer!.update(this._coefs, 0, coefCount * 4 * Float32Array.BYTES_PER_ELEMENT);\r\n this._writeIntervals();\r\n this._writePassParams(activeCount);\r\n\r\n if (activeCount > 0 && !this._dispatchSort(keysCs, activeCount)) {\r\n return false;\r\n }\r\n if (!_Dispatch(output._outputCs, Math.ceil(paddedCount / WorkgroupSize))) {\r\n return false;\r\n }\r\n output._sortedPaddedCount = paddedCount;\r\n return true;\r\n }\r\n\r\n /**\r\n * Releases all the GPU resources, including the outputs created by {@link createOutput}.\r\n */\r\n public dispose(): void {\r\n this._disposed = true;\r\n const outputs = this._outputs.slice();\r\n for (const output of outputs) {\r\n output.dispose();\r\n }\r\n this._outputs.length = 0;\r\n this._releaseSortBuffers();\r\n this._intervalsBuffer?.dispose();\r\n this._intervalsBuffer = null;\r\n this._chunkSums.dispose();\r\n for (const buffer of this._passParams) {\r\n buffer.dispose();\r\n }\r\n this._passParams.length = 0;\r\n this._centersTexture = null;\r\n this._meansHighTexture = null;\r\n this._partIndicesTexture = null;\r\n }\r\n\r\n private _refreshIntervals(): boolean {\r\n if (this._rawIntervals) {\r\n const packed = _PackGpuSortIntervals(this._rawIntervals, this._vertexCount);\r\n this._packedIntervals = packed.data;\r\n this._intervalCount = packed.count;\r\n this._activeCount = packed.total;\r\n } else {\r\n this._packedIntervals = null;\r\n this._intervalCount = 0;\r\n this._activeCount = this._vertexCount;\r\n }\r\n this._intervalsDirty = true;\r\n this._intervalsValid = this._activeCount <= this._maxSplatCount && this.paddedCount <= this._maxSplatCount;\r\n if (!this._intervalsValid) {\r\n Logger.Error(`${this._name}: ${this._activeCount} active splats exceeds the GPU sorter limit of ${this._maxSplatCount}.`);\r\n }\r\n if (Math.max(this._intervalCount, 2) > this._maxIntervalCount) {\r\n this._intervalsValid = false;\r\n Logger.Error(`${this._name}: ${this._intervalCount} intervals exceeds the GPU sorter limit of ${this._maxIntervalCount}.`);\r\n }\r\n return this._intervalsValid;\r\n }\r\n\r\n private _releaseSortBuffers(): void {\r\n this._keysA?.dispose();\r\n this._keysB?.dispose();\r\n this._valsA?.dispose();\r\n this._valsB?.dispose();\r\n this._sumTable?.dispose();\r\n this._keysA = this._keysB = this._valsA = this._valsB = this._sumTable = null;\r\n this._capacity = 0;\r\n this._passParamsActiveCount = -1;\r\n this._bindingsVersion++;\r\n }\r\n\r\n private _ensureCapacity(needed: number): void {\r\n if (this._keysA && this._capacity >= needed) {\r\n return;\r\n }\r\n const capacity = Math.max(needed, Math.min(Math.ceil(this._capacity * 1.5), this._maxSplatCount));\r\n this._releaseSortBuffers();\r\n this._capacity = capacity;\r\n // Rounded to 4 elements: the scatter pass reads the keys and values as vec4u\r\n const bytes = _RoundUp16(capacity) * Uint32Array.BYTES_PER_ELEMENT;\r\n const create = (label: string, size: number) => new StorageBuffer(this._engine, size, Constants.BUFFER_CREATIONFLAG_READWRITE, this._name + label);\r\n this._keysA = create(\"_keysA\", bytes);\r\n this._keysB = create(\"_keysB\", bytes);\r\n this._valsA = create(\"_valsA\", bytes);\r\n this._valsB = create(\"_valsB\", bytes);\r\n this._sumTable = create(\"_sumTable\", RadixBins * Math.ceil(capacity / SortBlockSize) * Uint32Array.BYTES_PER_ELEMENT);\r\n }\r\n\r\n private _ensureIntervalsBuffer(): void {\r\n const entries = Math.max(this._intervalCount, 2);\r\n if (this._intervalsBuffer && this._intervalsCapacity >= entries) {\r\n return;\r\n }\r\n this._intervalsBuffer?.dispose();\r\n this._intervalsCapacity = Math.max(entries, Math.min(Math.ceil(this._intervalsCapacity * 1.5), this._maxIntervalCount));\r\n this._intervalsBuffer = new StorageBuffer(\r\n this._engine,\r\n this._intervalsCapacity * 2 * Uint32Array.BYTES_PER_ELEMENT,\r\n Constants.BUFFER_CREATIONFLAG_READWRITE,\r\n this._name + \"_intervals\"\r\n );\r\n this._intervalsDirty = true;\r\n this._bindingsVersion++;\r\n }\r\n\r\n private _ensureCoefsBuffer(output: GaussianSplattingGpuSortOutput, coefCount: number): void {\r\n if (output._coefsBuffer && output._coefsCapacity >= coefCount) {\r\n return;\r\n }\r\n output._coefsBuffer?.dispose();\r\n output._coefsCapacity = Math.max(coefCount, 1);\r\n output._coefsBuffer = new StorageBuffer(\r\n this._engine,\r\n output._coefsCapacity * 4 * Float32Array.BYTES_PER_ELEMENT,\r\n Constants.BUFFER_CREATIONFLAG_READWRITE,\r\n this._name + \"_coefs\"\r\n );\r\n }\r\n\r\n private _getKeysComputeShader(output: GaussianSplattingGpuSortOutput, sog: boolean, compound: boolean): ComputeShader {\r\n const centersView = (this._centersTexture?.getInternalTexture()?._hardwareTexture as Nullable<WebGPUHardwareTexture>)?.view ?? null;\r\n const meansHighView = sog ? ((this._meansHighTexture?.getInternalTexture()?._hardwareTexture as Nullable<WebGPUHardwareTexture>)?.view ?? null) : null;\r\n const partIndicesView = compound ? ((this._partIndicesTexture?.getInternalTexture()?._hardwareTexture as Nullable<WebGPUHardwareTexture>)?.view ?? null) : null;\r\n if (\r\n !output._keysCs ||\r\n output._keysCsSog !== sog ||\r\n output._keysCsCompound !== compound ||\r\n output._keysCsCentersView !== centersView ||\r\n output._keysCsMeansHighView !== meansHighView ||\r\n output._keysCsPartIndicesView !== partIndicesView\r\n ) {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n params: { group: 0, binding: 0 },\r\n intervals: { group: 0, binding: 1 },\r\n coefs: { group: 0, binding: 2 },\r\n keys: { group: 0, binding: 3 },\r\n vals: { group: 0, binding: 4 },\r\n centersTexture: { group: 0, binding: 5 },\r\n };\r\n const defines: string[] = [];\r\n if (sog) {\r\n bindingsMapping.meansUTexture = { group: 0, binding: 6 };\r\n defines.push(\"#define USE_SOG\");\r\n }\r\n if (compound) {\r\n bindingsMapping.partIndicesTexture = { group: 0, binding: 7 };\r\n defines.push(\"#define COMPOUND\");\r\n }\r\n const key = `${sog ? \"S\" : \"\"}${compound ? \"C\" : \"\"}`;\r\n output._keysCs = new ComputeShader(this._name + \"_keys\" + key, this._engine, \"gsSortKeys\", { bindingsMapping, defines, useExplicitComputePipelineLayout: true });\r\n output._keysCsSog = sog;\r\n output._keysCsCompound = compound;\r\n output._keysCsCentersView = centersView;\r\n output._keysCsMeansHighView = meansHighView;\r\n output._keysCsPartIndicesView = partIndicesView;\r\n }\r\n return output._keysCs;\r\n }\r\n\r\n // Binds the resources of the shaders. The setters allocate a binding each call, so a shader is only bound again when one of its resources changed.\r\n private _bindResources(output: GaussianSplattingGpuSortOutput, keysCs: ComputeShader, sog: boolean, compound: boolean): void {\r\n if (this._sortShadersBoundVersion !== this._bindingsVersion) {\r\n this._sortShadersBoundVersion = this._bindingsVersion;\r\n this._bindSortShaders();\r\n }\r\n\r\n if (\r\n output._boundSorterVersion === this._bindingsVersion &&\r\n output._boundBuffersVersion === output.buffersVersion &&\r\n output._boundCoefsBuffer === output._coefsBuffer &&\r\n output._boundKeysCs === keysCs\r\n ) {\r\n return;\r\n }\r\n output._boundSorterVersion = this._bindingsVersion;\r\n output._boundBuffersVersion = output.buffersVersion;\r\n output._boundCoefsBuffer = output._coefsBuffer;\r\n output._boundKeysCs = keysCs;\r\n\r\n keysCs.fastMode = false;\r\n output._outputCs.fastMode = false;\r\n keysCs.setStorageBuffer(\"params\", output._paramsBuffer);\r\n keysCs.setStorageBuffer(\"intervals\", this._intervalsBuffer!);\r\n keysCs.setStorageBuffer(\"coefs\", output._coefsBuffer!);\r\n keysCs.setStorageBuffer(\"keys\", this._keysA!);\r\n keysCs.setStorageBuffer(\"vals\", this._valsA!);\r\n keysCs.setTexture(\"centersTexture\", this._centersTexture!, false);\r\n if (sog) {\r\n keysCs.setTexture(\"meansUTexture\", this._meansHighTexture!, false);\r\n }\r\n if (compound) {\r\n keysCs.setTexture(\"partIndicesTexture\", this._partIndicesTexture!, false);\r\n }\r\n\r\n // After the radix passes, the sorted values are in valsA for an even number of passes (the passes ping-pong between A and B), valsB otherwise.\r\n output._outputCs.setStorageBuffer(\"params\", output._paramsBuffer);\r\n output._outputCs.setStorageBuffer(\"vals\", (this._passCount & 1) === 0 ? this._valsA! : this._valsB!);\r\n output._outputCs.setStorageBuffer(\"indexOut\", output.buffer!);\r\n }\r\n\r\n // The ping-pong buffers of each radix pass are the same for every view: pass 0 reads A and writes B, pass 1 reads B and writes A, and so on.\r\n private _bindSortShaders(): void {\r\n let keysIn = this._keysA!;\r\n let valsIn = this._valsA!;\r\n let keysOut = this._keysB!;\r\n let valsOut = this._valsB!;\r\n for (let pass = 0; pass < this._passCount; pass++) {\r\n const params = this._passParams[pass];\r\n const count = this._countCs[pass];\r\n count.fastMode = false;\r\n count.setStorageBuffer(\"params\", params);\r\n count.setStorageBuffer(\"keysIn\", keysIn);\r\n count.setStorageBuffer(\"sumTable\", this._sumTable!);\r\n const scatter = this._scatterCs[pass];\r\n scatter.fastMode = false;\r\n scatter.setStorageBuffer(\"params\", params);\r\n scatter.setStorageBuffer(\"keysIn\", keysIn);\r\n scatter.setStorageBuffer(\"valsIn\", valsIn);\r\n scatter.setStorageBuffer(\"keysOut\", keysOut);\r\n scatter.setStorageBuffer(\"valsOut\", valsOut);\r\n scatter.setStorageBuffer(\"sumTable\", this._sumTable!);\r\n scatter.setStorageBuffer(\"chunkSums\", this._chunkSums);\r\n const keysTemp = keysIn;\r\n keysIn = keysOut;\r\n keysOut = keysTemp;\r\n const valsTemp = valsIn;\r\n valsIn = valsOut;\r\n valsOut = valsTemp;\r\n }\r\n\r\n this._scanLocalCs.fastMode = false;\r\n this._scanSumsCs.fastMode = false;\r\n this._scanLocalCs.setStorageBuffer(\"params\", this._passParams[0]);\r\n this._scanLocalCs.setStorageBuffer(\"sumTable\", this._sumTable!);\r\n this._scanLocalCs.setStorageBuffer(\"chunkSums\", this._chunkSums);\r\n this._scanSumsCs.setStorageBuffer(\"params\", this._passParams[0]);\r\n this._scanSumsCs.setStorageBuffer(\"chunkSums\", this._chunkSums);\r\n }\r\n\r\n private _isReady(keysCs: ComputeShader, output: GaussianSplattingGpuSortOutput): boolean {\r\n let ready = _IsShaderReady(keysCs) && _IsShaderReady(output._outputCs) && _IsShaderReady(this._scanLocalCs) && _IsShaderReady(this._scanSumsCs);\r\n for (let pass = 0; pass < this._passCount && ready; pass++) {\r\n ready = _IsShaderReady(this._countCs[pass]) && _IsShaderReady(this._scatterCs[pass]);\r\n }\r\n return ready;\r\n }\r\n\r\n private _writeParams(output: GaussianSplattingGpuSortOutput, coefCount: number, depthMin: number, depthMax: number): void {\r\n const u32 = this._paramsU32;\r\n const f32 = this._paramsF32;\r\n u32[0] = this._activeCount;\r\n u32[1] = this._vertexCount;\r\n u32[2] = this.paddedCount;\r\n u32[3] = this._textureWidth;\r\n u32[4] = coefCount;\r\n u32[5] = this._intervalCount;\r\n f32[6] = depthMax;\r\n f32[7] = _ComputeGpuSortKeyScale(depthMin, depthMax, this._keyBits);\r\n f32[8] = Math.pow(2, this._keyBits) - 1;\r\n f32[9] = f32[10] = f32[11] = 0;\r\n f32.set(this._meansMin, 12);\r\n f32.set(this._meansMax, 16);\r\n output._paramsBuffer.update(this._paramsData);\r\n }\r\n\r\n private _writeIntervals(): void {\r\n if (!this._intervalsDirty) {\r\n return;\r\n }\r\n this._intervalsDirty = false;\r\n if (this._packedIntervals && this._intervalCount > 0) {\r\n this._intervalsBuffer!.update(this._packedIntervals, 0, this._intervalCount * 2 * Uint32Array.BYTES_PER_ELEMENT);\r\n }\r\n }\r\n\r\n private _writePassParams(activeCount: number): void {\r\n if (this._passParamsActiveCount === activeCount) {\r\n return;\r\n }\r\n this._passParamsActiveCount = activeCount;\r\n const numBlocks = Math.ceil(activeCount / SortBlockSize);\r\n const chunkCount = Math.ceil(numBlocks / BlocksPerScanChunk);\r\n for (let pass = 0; pass < this._passCount; pass++) {\r\n this._passData[0] = activeCount;\r\n this._passData[1] = numBlocks;\r\n this._passData[2] = pass * RadixBits;\r\n this._passData[3] = chunkCount;\r\n this._passParams[pass].update(this._passData);\r\n }\r\n }\r\n\r\n private _dispatchSort(keysCs: ComputeShader, activeCount: number): boolean {\r\n const numBlocks = Math.ceil(activeCount / SortBlockSize);\r\n const chunkCount = Math.ceil(numBlocks / BlocksPerScanChunk);\r\n if (!_Dispatch(keysCs, Math.ceil(activeCount / WorkgroupSize))) {\r\n return false;\r\n }\r\n for (let pass = 0; pass < this._passCount; pass++) {\r\n _Dispatch(this._countCs[pass], numBlocks);\r\n _Dispatch(this._scanLocalCs, chunkCount);\r\n _Dispatch(this._scanSumsCs, 1);\r\n _Dispatch(this._scatterCs[pass], numBlocks);\r\n }\r\n return true;\r\n }\r\n}\r\n"]}
|
|
@@ -397,6 +397,7 @@ export declare class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
397
397
|
*/
|
|
398
398
|
get pointSplattingDepthRenderMode(): boolean;
|
|
399
399
|
set pointSplattingDepthRenderMode(value: boolean);
|
|
400
|
+
private _leaveGpuSortForPointSplatting;
|
|
400
401
|
/**
|
|
401
402
|
* Counters of the most recent point-splatting compute frame, or null when compute has no available result.
|
|
402
403
|
* Individual render passes may still use the classic path for unsupported configurations.
|
|
@@ -452,6 +453,8 @@ export declare class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
452
453
|
* Outside of a rebuild the base-class behaviour is used unchanged.
|
|
453
454
|
*/
|
|
454
455
|
protected _instantiateWorker(): void;
|
|
456
|
+
protected _getGpuSortPartIndicesTexture(): Nullable<BaseTexture>;
|
|
457
|
+
protected _getGpuSortPartMatrices(): Nullable<ReadonlyArray<Matrix>>;
|
|
455
458
|
/**
|
|
456
459
|
* Ensures the part-index GPU texture exists at the start of an incremental update.
|
|
457
460
|
* Called before the sub-texture upload so the correct texture is available for the first batch.
|
|
@@ -210,11 +210,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
210
210
|
* @returns true when ready
|
|
211
211
|
*/
|
|
212
212
|
isReady(completeCheck = false) {
|
|
213
|
-
|
|
214
|
-
if (proxy) {
|
|
215
|
-
proxy.computeWorldMatrix(true);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
213
|
+
this._syncPartProxyWorldMatrices();
|
|
218
214
|
return super.isReady(completeCheck);
|
|
219
215
|
}
|
|
220
216
|
/**
|
|
@@ -416,6 +412,9 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
416
412
|
const controller = value ? this._ensurePointController() : this._pointController;
|
|
417
413
|
if (controller) {
|
|
418
414
|
controller.colorRenderMode = value;
|
|
415
|
+
if (value && controller.colorRenderMode) {
|
|
416
|
+
this._leaveGpuSortForPointSplatting();
|
|
417
|
+
}
|
|
419
418
|
}
|
|
420
419
|
}
|
|
421
420
|
/**
|
|
@@ -439,8 +438,16 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
439
438
|
const controller = value ? this._ensurePointController() : this._pointController;
|
|
440
439
|
if (controller) {
|
|
441
440
|
controller.depthRenderMode = value;
|
|
441
|
+
if (value && controller.depthRenderMode) {
|
|
442
|
+
this._leaveGpuSortForPointSplatting();
|
|
443
|
+
}
|
|
442
444
|
}
|
|
443
445
|
}
|
|
446
|
+
// The GPU sort is dispatched before the scene renders and cannot serve a classic pass (e.g. the DepthRenderer) that needs sorted splats
|
|
447
|
+
// while another pass of the same mesh uses point splatting: such a mesh sorts on the CPU worker, which can answer any pass.
|
|
448
|
+
_leaveGpuSortForPointSplatting() {
|
|
449
|
+
this._switchToWorkerSort();
|
|
450
|
+
}
|
|
444
451
|
/**
|
|
445
452
|
* Counters of the most recent point-splatting compute frame, or null when compute has no available result.
|
|
446
453
|
* Individual render passes may still use the classic path for unsupported configurations.
|
|
@@ -519,13 +526,20 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
519
526
|
* Outside of a rebuild the base-class behaviour is used unchanged.
|
|
520
527
|
*/
|
|
521
528
|
_instantiateWorker() {
|
|
522
|
-
if (this._rebuilding && this._worker) {
|
|
529
|
+
if (this._rebuilding && this._worker && !this._isGpuSortActive) {
|
|
523
530
|
// Worker already exists and is kept alive; just resize the splat-index buffer.
|
|
524
531
|
this._updateSplatIndexBuffer(this._vertexCount);
|
|
525
532
|
return;
|
|
526
533
|
}
|
|
527
534
|
super._instantiateWorker();
|
|
528
535
|
}
|
|
536
|
+
_getGpuSortPartIndicesTexture() {
|
|
537
|
+
// Same condition as isCompound: without part matrices the mesh renders as a regular one.
|
|
538
|
+
return this._partMatrices.length > 0 ? this._partIndicesTexture : null;
|
|
539
|
+
}
|
|
540
|
+
_getGpuSortPartMatrices() {
|
|
541
|
+
return this._partMatrices;
|
|
542
|
+
}
|
|
529
543
|
/**
|
|
530
544
|
* Ensures the part-index GPU texture exists at the start of an incremental update.
|
|
531
545
|
* Called before the sub-texture upload so the correct texture is available for the first batch.
|
|
@@ -540,6 +554,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
540
554
|
*/
|
|
541
555
|
_notifyWorkerNewData() {
|
|
542
556
|
super._notifyWorkerNewData();
|
|
557
|
+
this._markGpuSourceDirty();
|
|
543
558
|
if (this._worker) {
|
|
544
559
|
this._worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_INDICES, partIndices: this._partIndices ?? null });
|
|
545
560
|
}
|
|
@@ -738,6 +753,9 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
738
753
|
*/
|
|
739
754
|
setWorldMatrixForPart(partIndex, worldMatrix) {
|
|
740
755
|
if (this._partMatrices.length <= partIndex) {
|
|
756
|
+
if (this._partMatrices.length === 0) {
|
|
757
|
+
this._markGpuSourceDirty();
|
|
758
|
+
}
|
|
741
759
|
this.computeWorldMatrix(true);
|
|
742
760
|
const defaultMatrix = this.getWorldMatrix();
|
|
743
761
|
while (this._partMatrices.length <= partIndex) {
|
|
@@ -761,6 +779,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
761
779
|
partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)),
|
|
762
780
|
});
|
|
763
781
|
}
|
|
782
|
+
this._markGpuPartMatricesDirty();
|
|
764
783
|
this._postToWorker(true);
|
|
765
784
|
}
|
|
766
785
|
}
|
|
@@ -889,8 +908,9 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
889
908
|
this._partIndicesTexture = source._partIndicesTexture?.clone();
|
|
890
909
|
}
|
|
891
910
|
_onUpdateTextures(textureSize) {
|
|
911
|
+
this._markGpuSourceDirty();
|
|
892
912
|
const createTextureFromDataU8 = (data, width, height, format) => {
|
|
893
|
-
return new RawTexture(data, width, height, format, this._scene, false, false, 1, 0);
|
|
913
|
+
return new RawTexture(data, width, height, format, this._scene, false, false, 1, 0, 2);
|
|
894
914
|
};
|
|
895
915
|
// Keep the part indices texture in sync with _partIndices whenever textures are rebuilt.
|
|
896
916
|
// The old "only create if absent" logic left the texture stale after a second addPart/addParts
|
|
@@ -927,6 +947,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
927
947
|
const texelCount = lineCount * textureSize.x;
|
|
928
948
|
const partIndicesView = new Uint8Array(partIndices.buffer, texelStart, texelCount);
|
|
929
949
|
this._updateTextureFromData(this._partIndicesTexture, partIndicesView, textureSize.x, lineStart, lineCount);
|
|
950
|
+
this._markGpuSourceDirty();
|
|
930
951
|
if (this._worker) {
|
|
931
952
|
this._worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_INDICES, partIndices: partIndices });
|
|
932
953
|
}
|
|
@@ -946,9 +967,10 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
946
967
|
return;
|
|
947
968
|
}
|
|
948
969
|
const buffer = new Uint8Array(this._partIndices);
|
|
949
|
-
this._partIndicesTexture = new RawTexture(buffer, textureSize.x, textureSize.y, 6, this._scene, false, false, 1, 0);
|
|
970
|
+
this._partIndicesTexture = new RawTexture(buffer, textureSize.x, textureSize.y, 6, this._scene, false, false, 1, 0, 2);
|
|
950
971
|
this._partIndicesTexture.wrapU = 0;
|
|
951
972
|
this._partIndicesTexture.wrapV = 0;
|
|
973
|
+
this._markGpuSourceDirty();
|
|
952
974
|
if (this._worker) {
|
|
953
975
|
this._worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_INDICES, partIndices: partIndices ?? null });
|
|
954
976
|
}
|
|
@@ -1336,7 +1358,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
1336
1358
|
}
|
|
1337
1359
|
while (this._shTextures.length < sh.length) {
|
|
1338
1360
|
const idx = this._shTextures.length;
|
|
1339
|
-
const shTexture = new RawTexture(null, textureSize.x, textureSize.y, 11, this._scene, false, false, 1, 7);
|
|
1361
|
+
const shTexture = new RawTexture(null, textureSize.x, textureSize.y, 11, this._scene, false, false, 1, 7, 2);
|
|
1340
1362
|
shTexture.wrapU = 0;
|
|
1341
1363
|
shTexture.wrapV = 0;
|
|
1342
1364
|
this._shTextures.push(shTexture);
|
|
@@ -1414,6 +1436,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
1414
1436
|
partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)),
|
|
1415
1437
|
});
|
|
1416
1438
|
}
|
|
1439
|
+
this._markGpuPartMatricesDirty();
|
|
1417
1440
|
this._canPostToWorker = true;
|
|
1418
1441
|
// A streaming compound renders the active-range UNION (a part carries an override), so a newly
|
|
1419
1442
|
// added static part must be folded into that union now — otherwise it stays out of the sorted
|
|
@@ -1534,6 +1557,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
1534
1557
|
this._worker.terminate();
|
|
1535
1558
|
this._worker = null;
|
|
1536
1559
|
}
|
|
1560
|
+
this._markGpuSourceDirty();
|
|
1537
1561
|
// Dispose GPU textures and null them so _updateTextures sees firstTime=true and allocates fresh ones.
|
|
1538
1562
|
// For a streaming atlas the four data textures are attachments of _mrtAtlas — dispose the MRT, not each.
|
|
1539
1563
|
if (this._mrtAtlas) {
|
|
@@ -1745,6 +1769,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
1745
1769
|
command: GaussianSplattingSortWorkerCommand.PART_MATRICES,
|
|
1746
1770
|
partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)),
|
|
1747
1771
|
});
|
|
1772
|
+
this._markGpuPartMatricesDirty();
|
|
1748
1773
|
this._postToWorker(true);
|
|
1749
1774
|
this.onPartCountChangedObservable.notifyObservers(this.partCount);
|
|
1750
1775
|
}
|
|
@@ -1843,6 +1868,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
1843
1868
|
command: GaussianSplattingSortWorkerCommand.PART_MATRICES,
|
|
1844
1869
|
partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)),
|
|
1845
1870
|
});
|
|
1871
|
+
this._markGpuPartMatricesDirty();
|
|
1846
1872
|
this._canPostToWorker = true;
|
|
1847
1873
|
this._postToWorker(true);
|
|
1848
1874
|
}
|
|
@@ -1928,6 +1954,8 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
1928
1954
|
// allocates covariance B as RGBA. Harmless/no-op if a streaming part was already reserved.
|
|
1929
1955
|
this._useMrtAtlas = true;
|
|
1930
1956
|
this._useRGBACovariants = true;
|
|
1957
|
+
// Streaming decodes into a render-target atlas that the GPU sorter doesn't read yet: use the worker.
|
|
1958
|
+
this._switchToWorkerSort();
|
|
1931
1959
|
// Higher-order SH: convert the SH textures to render-targetable integer MRTs so the stream can bake SH into
|
|
1932
1960
|
// its region, and set the compound's SH degree so the draw path lights the decoded splats. Sized for the
|
|
1933
1961
|
// MAX SH texture count across parts (a later higher-degree part grows it; lower-degree parts neutral-fill).
|
|
@@ -2115,6 +2143,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
2115
2143
|
serializationObject.type = this.getClassName();
|
|
2116
2144
|
serializationObject.keepInRam = this._keepInRam;
|
|
2117
2145
|
serializationObject.disableDepthSort = this._disableDepthSort;
|
|
2146
|
+
serializationObject.useGpuSort = this.useGpuSort;
|
|
2118
2147
|
serializationObject.viewUpdateThreshold = this.viewUpdateThreshold;
|
|
2119
2148
|
serializationObject._flipY = this._flipY;
|
|
2120
2149
|
serializationObject.pointSplattingScale = this._pointScale;
|
|
@@ -2149,6 +2178,8 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
2149
2178
|
static _ParseInternal(parsedMesh, scene, ctor) {
|
|
2150
2179
|
const mesh = new ctor(parsedMesh.name, null, scene, parsedMesh.keepInRam);
|
|
2151
2180
|
mesh.disableDepthSort = parsedMesh.disableDepthSort ?? false;
|
|
2181
|
+
// Read when the sort is instantiated by updateData, so it must be restored first.
|
|
2182
|
+
mesh.useGpuSort = parsedMesh.useGpuSort ?? null;
|
|
2152
2183
|
mesh.viewUpdateThreshold = parsedMesh.viewUpdateThreshold ?? GaussianSplattingMeshBase._DefaultViewUpdateThreshold;
|
|
2153
2184
|
let splatsData = parsedMesh.splatsData;
|
|
2154
2185
|
if (typeof splatsData === "string") {
|