@onerjs/core 8.56.4 → 9.0.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/Animations/animatable.core.js +36 -0
- package/Animations/animatable.core.js.map +1 -1
- package/Animations/animationGroup.pure.d.ts +61 -1
- package/Animations/animationGroup.pure.js +191 -2
- package/Animations/animationGroup.pure.js.map +1 -1
- package/Animations/index.d.ts +1 -0
- package/Animations/index.js +1 -0
- package/Animations/index.js.map +1 -1
- package/Animations/pure.d.ts +1 -0
- package/Animations/pure.js +1 -0
- package/Animations/pure.js.map +1 -1
- package/Animations/rootMotion.d.ts +560 -0
- package/Animations/rootMotion.js +1709 -0
- package/Animations/rootMotion.js.map +1 -0
- package/Animations/runtimeAnimation.d.ts +57 -0
- package/Animations/runtimeAnimation.js +127 -3
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Cameras/arcRotateCamera.pure.d.ts +2 -0
- package/Cameras/arcRotateCamera.pure.js +2 -0
- package/Cameras/arcRotateCamera.pure.js.map +1 -1
- package/Cameras/targetCamera.pure.d.ts +2 -0
- package/Cameras/targetCamera.pure.js +7 -1
- package/Cameras/targetCamera.pure.js.map +1 -1
- package/Collisions/gpuPicker.js +5 -5
- package/Collisions/gpuPicker.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.query.pure.js +4 -2
- package/Engines/AbstractEngine/abstractEngine.query.pure.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.query.types.d.ts +11 -2
- package/Engines/AbstractEngine/abstractEngine.query.types.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js +1 -0
- package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.pure.js +63 -0
- package/Engines/Extensions/engine.multiRender.pure.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.types.d.ts +13 -0
- package/Engines/Extensions/engine.multiRender.types.js.map +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js +2 -2
- package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js.map +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.types.d.ts +2 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.types.js.map +1 -1
- package/Engines/Extensions/index.d.ts +1 -0
- package/Engines/Extensions/index.js +1 -0
- package/Engines/Extensions/index.js.map +1 -1
- package/Engines/Extensions/pure.d.ts +1 -1
- package/Engines/Extensions/pure.js +1 -1
- package/Engines/Extensions/pure.js.map +1 -1
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js +88 -39
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js.map +1 -1
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.d.ts +20 -2
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +4 -0
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.types.d.ts +13 -0
- package/Engines/WebGPU/Extensions/engine.multiRender.types.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.pure.js +11 -3
- package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/index.d.ts +1 -0
- package/Engines/WebGPU/Extensions/index.js +1 -0
- package/Engines/WebGPU/Extensions/index.js.map +1 -1
- package/Engines/WebGPU/Extensions/pure.d.ts +1 -1
- package/Engines/WebGPU/Extensions/pure.js +1 -1
- package/Engines/WebGPU/Extensions/pure.js.map +1 -1
- package/Engines/WebGPU/webgpuBundleList.d.ts +2 -0
- package/Engines/WebGPU/webgpuBundleList.js +4 -0
- package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +5 -2
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js +3 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +4 -0
- package/Engines/WebGPU/webgpuSnapshotRendering.js +40 -7
- package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.js +2 -2
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.d.ts +2 -0
- package/Engines/WebGPU/webgpuTextureManager.js +286 -13
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +2 -0
- package/Engines/abstractEngine.pure.js +7 -3
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +4 -0
- package/Engines/constants.js +4 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/thinEngine.pure.d.ts +14 -0
- package/Engines/thinEngine.pure.js +48 -12
- package/Engines/thinEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +1 -0
- package/Engines/thinNativeEngine.pure.js +7 -1
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/thinWebGPUEngine.d.ts +4 -0
- package/Engines/thinWebGPUEngine.js +10 -1
- package/Engines/thinWebGPUEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +5 -2
- package/Engines/webgpuEngine.pure.js +48 -13
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js +2 -2
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.d.ts +11 -2
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js +1 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.d.ts +9 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js +6 -8
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.d.ts +9 -0
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js +34 -9
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js +4 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +4 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js +19 -7
- package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +20 -2
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +53 -10
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.d.ts +16 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js +64 -14
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js +64 -16
- package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js.map +1 -1
- package/FlowGraph/flowGraph.d.ts +4 -0
- package/FlowGraph/flowGraph.js +38 -7
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphBlock.js +3 -0
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphConnection.d.ts +7 -0
- package/FlowGraph/flowGraphConnection.js +7 -0
- package/FlowGraph/flowGraphConnection.js.map +1 -1
- package/FlowGraph/flowGraphContext.d.ts +2 -1
- package/FlowGraph/flowGraphContext.js +4 -3
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.d.ts +15 -1
- package/FlowGraph/flowGraphCoordinator.js +47 -16
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphEventBlock.d.ts +5 -0
- package/FlowGraph/flowGraphEventBlock.js +7 -0
- package/FlowGraph/flowGraphEventBlock.js.map +1 -1
- package/FlowGraph/flowGraphHostResolver.d.ts +2 -1
- package/FlowGraph/flowGraphHostResolver.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +60 -2
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FlowGraph/serialization.d.ts +2 -0
- package/FlowGraph/serialization.js +10 -22
- package/FlowGraph/serialization.js.map +1 -1
- package/FlowGraph/typeDefinitions.d.ts +8 -0
- package/FlowGraph/typeDefinitions.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.d.ts +5 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js +8 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.d.ts +87 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js +295 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js.map +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/pure.d.ts +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/pure.js +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +4 -4
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +5 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +13 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/allBlocks.pure.js +2 -0
- package/FrameGraph/Node/Blocks/allBlocks.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/index.d.ts +1 -0
- package/FrameGraph/Node/Blocks/index.js +1 -0
- package/FrameGraph/Node/Blocks/index.js.map +1 -1
- package/FrameGraph/Node/Blocks/inputBlock.pure.js +20 -1
- package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/pure.d.ts +1 -0
- package/FrameGraph/Node/Blocks/pure.js +1 -0
- package/FrameGraph/Node/Blocks/pure.js.map +1 -1
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +4 -2
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +4 -2
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.js +1 -1
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/FrameGraph/Tasks/Layers/selectionOutlineTask.js +1 -0
- package/FrameGraph/Tasks/Layers/selectionOutlineTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/cullObjectsTask.js +5 -1
- package/FrameGraph/Tasks/Misc/cullObjectsTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +1 -0
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.d.ts +69 -0
- package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js +223 -0
- package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +25 -3
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +69 -33
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js +3 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
- package/FrameGraph/frameGraphObjectList.d.ts +6 -1
- package/FrameGraph/frameGraphObjectList.js.map +1 -1
- package/FrameGraph/frameGraphRenderContext.d.ts +3 -1
- package/FrameGraph/frameGraphRenderContext.js +5 -5
- package/FrameGraph/frameGraphRenderContext.js.map +1 -1
- package/FrameGraph/index.d.ts +1 -0
- package/FrameGraph/index.js +1 -0
- package/FrameGraph/index.js.map +1 -1
- package/FrameGraph/pure.d.ts +1 -0
- package/FrameGraph/pure.js +1 -0
- package/FrameGraph/pure.js.map +1 -1
- package/Inputs/scene.inputManager.d.ts +4 -0
- package/Inputs/scene.inputManager.js +50 -8
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +5 -5
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +5 -5
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +26 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +151 -47
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js +5 -5
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +11 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +17 -2
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +2 -2
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +4 -0
- package/Materials/Node/nodeMaterial.pure.js +4 -0
- package/Materials/Node/nodeMaterial.pure.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
- package/Materials/Node/nodeMaterialBuildState.js +25 -3
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.d.ts +2 -0
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +2 -0
- package/Materials/Textures/Procedurals/proceduralTexture.pure.d.ts +13 -14
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js +6 -6
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
- package/Materials/Textures/baseTexture.pure.js +3 -0
- package/Materials/Textures/baseTexture.pure.js.map +1 -1
- package/Materials/Textures/cubeTexture.pure.js +1 -1
- package/Materials/Textures/cubeTexture.pure.js.map +1 -1
- package/Materials/Textures/internalTexture.d.ts +8 -1
- package/Materials/Textures/internalTexture.js +9 -2
- package/Materials/Textures/internalTexture.js.map +1 -1
- package/Materials/Textures/rawTexture2DArray.functions.d.ts +3 -3
- package/Materials/Textures/rawTexture2DArray.functions.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/textureHelper.functions.d.ts +14 -0
- package/Materials/Textures/textureHelper.functions.js +24 -0
- package/Materials/Textures/textureHelper.functions.js.map +1 -1
- package/Materials/ditheredTileFadeMaterialPlugin.d.ts +210 -0
- package/Materials/ditheredTileFadeMaterialPlugin.js +509 -0
- package/Materials/ditheredTileFadeMaterialPlugin.js.map +1 -0
- package/Materials/index.d.ts +1 -0
- package/Materials/index.js +1 -0
- package/Materials/index.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.d.ts +46 -1
- package/Materials/materialHelper.geometryrendering.js +105 -8
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/prepass.defines.d.ts +2 -0
- package/Materials/prepass.defines.js +2 -0
- package/Materials/prepass.defines.js.map +1 -1
- package/Materials/pure.d.ts +1 -0
- package/Materials/pure.js +1 -0
- package/Materials/pure.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +2 -0
- package/Materials/standardMaterial.pure.js +6 -3
- package/Materials/standardMaterial.pure.js.map +1 -1
- package/Meshes/Builders/polygonBuilder.pure.d.ts +4 -0
- package/Meshes/Builders/polygonBuilder.pure.js +4 -1
- package/Meshes/Builders/polygonBuilder.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplatting.functions.d.ts +19 -0
- package/Meshes/GaussianSplatting/gaussianSplatting.functions.js +23 -0
- package/Meshes/GaussianSplatting/gaussianSplatting.functions.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +3 -14
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +20 -24
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +2 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +11 -4
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/abstractMesh.pure.d.ts +18 -0
- package/Meshes/abstractMesh.pure.js +22 -0
- package/Meshes/abstractMesh.pure.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/instancedMesh.pure.d.ts +5 -0
- package/Meshes/instancedMesh.pure.js +12 -0
- package/Meshes/instancedMesh.pure.js.map +1 -1
- package/Meshes/mesh.pure.js +23 -8
- package/Meshes/mesh.pure.js.map +1 -1
- package/Meshes/meshBlendingTag.d.ts +47 -0
- package/Meshes/meshBlendingTag.js +64 -0
- package/Meshes/meshBlendingTag.js.map +1 -0
- package/Meshes/polygonMesh.js +2 -2
- package/Meshes/polygonMesh.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/Misc/fileTools.pure.js +21 -0
- package/Misc/fileTools.pure.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +2 -2
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +2 -0
- package/Particles/gpuParticleSystem.pure.js +89 -28
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/Particles/thinParticleSystem.pure.d.ts +2 -0
- package/Particles/thinParticleSystem.pure.js +84 -19
- package/Particles/thinParticleSystem.pure.js.map +1 -1
- package/Particles/webgl2ParticleSystem.pure.d.ts +1 -0
- package/Particles/webgl2ParticleSystem.pure.js +12 -4
- package/Particles/webgl2ParticleSystem.pure.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js +7 -0
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
- package/PostProcesses/index.d.ts +2 -0
- package/PostProcesses/index.js +2 -0
- package/PostProcesses/index.js.map +1 -1
- package/PostProcesses/meshBlendingBlueNoise.d.ts +15 -0
- package/PostProcesses/meshBlendingBlueNoise.js +77 -0
- package/PostProcesses/meshBlendingBlueNoise.js.map +1 -0
- package/PostProcesses/meshBlendingPostProcess.d.ts +131 -0
- package/PostProcesses/meshBlendingPostProcess.js +315 -0
- package/PostProcesses/meshBlendingPostProcess.js.map +1 -0
- package/PostProcesses/pure.d.ts +2 -0
- package/PostProcesses/pure.js +2 -0
- package/PostProcesses/pure.js.map +1 -1
- package/PostProcesses/thinMeshBlendingPostProcess.d.ts +339 -0
- package/PostProcesses/thinMeshBlendingPostProcess.js +771 -0
- package/PostProcesses/thinMeshBlendingPostProcess.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +6 -6
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +8 -8
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
- package/Rendering/boundingBoxRenderer.pure.js +2 -1
- package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
- package/Rendering/depthRenderer.pure.js +3 -4
- package/Rendering/depthRenderer.pure.js.map +1 -1
- package/Rendering/edgesRenderer.pure.d.ts +4 -2
- package/Rendering/edgesRenderer.pure.js +11 -2
- package/Rendering/edgesRenderer.pure.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +10 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js +20 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +9 -3
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +14 -9
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.d.ts +38 -4
- package/Rendering/geometryBufferRenderer.pure.js +126 -17
- package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +7 -1
- package/Rendering/objectRenderer.js +45 -7
- package/Rendering/objectRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.pure.js +6 -2
- package/Rendering/outlineRenderer.pure.js.map +1 -1
- package/Rendering/renderingManager.d.ts +1 -1
- package/Rendering/renderingManager.js +5 -4
- package/Rendering/renderingManager.js.map +1 -1
- package/Shaders/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
- package/Shaders/ShadersInclude/defaultFragmentAlpha.js +34 -0
- package/Shaders/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
- package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +5 -1
- package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/geometryRenderingFragment.d.ts +5 -0
- package/Shaders/ShadersInclude/geometryRenderingFragment.js +74 -0
- package/Shaders/ShadersInclude/geometryRenderingFragment.js.map +1 -0
- package/Shaders/ShadersInclude/mrtFragmentDeclaration.js +89 -0
- package/Shaders/ShadersInclude/mrtFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js +24 -17
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockPrePass.js +27 -20
- package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js +6 -2
- package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
- package/Shaders/ShadersInclude/prePassDeclaration.js +95 -2
- package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/Shaders/default.fragment.js +31 -40
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/depthOfField.fragment.js +13 -9
- package/Shaders/depthOfField.fragment.js.map +1 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js +16 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js +16 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/Shaders/gaussianSplatting.fragment.js +63 -3
- package/Shaders/gaussianSplatting.fragment.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +80 -0
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/geometry.fragment.js +17 -11
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/gpuRenderParticles.fragment.js +43 -1
- package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
- package/Shaders/gpuRenderParticles.vertex.js +96 -16
- package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
- package/Shaders/meshBlending.fragment.d.ts +5 -0
- package/Shaders/meshBlending.fragment.js +519 -0
- package/Shaders/meshBlending.fragment.js.map +1 -0
- package/Shaders/particles.fragment.js +43 -1
- package/Shaders/particles.fragment.js.map +1 -1
- package/Shaders/particles.vertex.js +84 -3
- package/Shaders/particles.vertex.js.map +1 -1
- package/Shaders/sprites.fragment.js +52 -2
- package/Shaders/sprites.fragment.js.map +1 -1
- package/Shaders/sprites.vertex.js +62 -1
- package/Shaders/sprites.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js +33 -0
- package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.d.ts +6 -0
- package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js +76 -0
- package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/lightFragment.js +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js +18 -0
- package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +11 -25
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +11 -25
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js +5 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +6 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +17 -48
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +15 -2
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -2
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.fragment.js +63 -2
- package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +80 -0
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +37 -2
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/gpuRenderParticles.fragment.js +47 -2
- package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -1
- package/ShadersWGSL/gpuRenderParticles.vertex.js +110 -7
- package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -1
- package/ShadersWGSL/meshBlending.fragment.d.ts +5 -0
- package/ShadersWGSL/meshBlending.fragment.js +576 -0
- package/ShadersWGSL/meshBlending.fragment.js.map +1 -0
- package/ShadersWGSL/openpbr.fragment.js +2 -1
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/particles.fragment.js +45 -1
- package/ShadersWGSL/particles.fragment.js.map +1 -1
- package/ShadersWGSL/particles.vertex.js +86 -4
- package/ShadersWGSL/particles.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +2 -1
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/sprites.fragment.js +56 -2
- package/ShadersWGSL/sprites.fragment.js.map +1 -1
- package/ShadersWGSL/sprites.vertex.js +62 -1
- package/ShadersWGSL/sprites.vertex.js.map +1 -1
- package/Sprites/spriteManager.d.ts +13 -0
- package/Sprites/spriteManager.js +15 -0
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.d.ts +24 -1
- package/Sprites/spriteRenderer.js +368 -50
- package/Sprites/spriteRenderer.js.map +1 -1
- package/Sprites/thinSprite.d.ts +4 -0
- package/Sprites/thinSprite.js +4 -0
- package/Sprites/thinSprite.js.map +1 -1
- package/States/alphaCullingState.d.ts +3 -1
- package/States/alphaCullingState.js +18 -3
- package/States/alphaCullingState.js.map +1 -1
- package/XR/webXRDefaultExperience.d.ts +5 -1
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXREnterExitUI.d.ts +2 -1
- package/XR/webXREnterExitUI.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.d.ts +23 -0
- package/scene.pure.js +35 -0
- package/scene.pure.js.map +1 -1
|
@@ -12,7 +12,7 @@ import { ProceduralTexture } from "../../Materials/Textures/Procedurals/procedur
|
|
|
12
12
|
import { EffectRenderer, EffectWrapper } from "../../Materials/effectRenderer.pure.js";
|
|
13
13
|
import { StorageBuffer } from "../../Buffers/storageBuffer.js";
|
|
14
14
|
import { ComputeShader } from "../../Compute/computeShader.pure.js";
|
|
15
|
-
import {
|
|
15
|
+
import { _IsGaussianSplattingMesh } from "../../Meshes/GaussianSplatting/gaussianSplatting.functions.js";
|
|
16
16
|
// Max frames _renderVoxelGrid waits for splat depth sorts to settle before voxelizing anyway
|
|
17
17
|
// (~3s at 60fps). Bounds the wait so a continuously re-sorting (orbiting) splat can't block it.
|
|
18
18
|
const _MaxSortSettleWaitFrames = 180;
|
|
@@ -27,11 +27,11 @@ function _HasGaussianSplatting(meshes) {
|
|
|
27
27
|
if (!mesh) {
|
|
28
28
|
continue;
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
30
|
+
if (_IsGaussianSplattingMesh(mesh)) {
|
|
31
31
|
return true;
|
|
32
32
|
}
|
|
33
33
|
for (const child of mesh.getChildMeshes()) {
|
|
34
|
-
if (
|
|
34
|
+
if (_IsGaussianSplattingMesh(child)) {
|
|
35
35
|
return true;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -622,7 +622,7 @@ export class _IblShadowsVoxelRenderer {
|
|
|
622
622
|
continue;
|
|
623
623
|
}
|
|
624
624
|
for (const mesh of renderList) {
|
|
625
|
-
if (
|
|
625
|
+
if (_IsGaussianSplattingMesh(mesh) && !mesh._isDepthSortSettled) {
|
|
626
626
|
gsSortPending = true;
|
|
627
627
|
break;
|
|
628
628
|
}
|
|
@@ -758,7 +758,7 @@ export class _IblShadowsVoxelRenderer {
|
|
|
758
758
|
for (let i = 0; i < subMeshes.length; i++) {
|
|
759
759
|
const sm = subMeshes.data[i];
|
|
760
760
|
const effective = sm.getEffectiveMesh();
|
|
761
|
-
if (
|
|
761
|
+
if (_IsGaussianSplattingMesh(effective)) {
|
|
762
762
|
renderGsSplat(sm);
|
|
763
763
|
}
|
|
764
764
|
else {
|
|
@@ -838,7 +838,7 @@ export class _IblShadowsVoxelRenderer {
|
|
|
838
838
|
}
|
|
839
839
|
// Push per-slab uniforms to each GS voxel material in this MRT's render list.
|
|
840
840
|
for (const m of mrt.renderList ?? []) {
|
|
841
|
-
if (
|
|
841
|
+
if (_IsGaussianSplattingMesh(m)) {
|
|
842
842
|
const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);
|
|
843
843
|
if (gsVoxelMat) {
|
|
844
844
|
gsVoxelMat.setMatrix("invWorldScale", this._invWorldScaleMatrix);
|
|
@@ -867,7 +867,7 @@ export class _IblShadowsVoxelRenderer {
|
|
|
867
867
|
if (!mesh) {
|
|
868
868
|
continue;
|
|
869
869
|
}
|
|
870
|
-
if (
|
|
870
|
+
if (_IsGaussianSplattingMesh(mesh)) {
|
|
871
871
|
this._addGsMeshToVoxelRT(mrt, mesh);
|
|
872
872
|
}
|
|
873
873
|
else if (mesh.subMeshes && mesh.subMeshes.length > 0) {
|
|
@@ -876,7 +876,7 @@ export class _IblShadowsVoxelRenderer {
|
|
|
876
876
|
}
|
|
877
877
|
const meshes = mesh.getChildMeshes();
|
|
878
878
|
for (const childMesh of meshes) {
|
|
879
|
-
if (
|
|
879
|
+
if (_IsGaussianSplattingMesh(childMesh)) {
|
|
880
880
|
this._addGsMeshToVoxelRT(mrt, childMesh);
|
|
881
881
|
}
|
|
882
882
|
else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblShadowsVoxelRenderer.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine.pure\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget.pure\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture.pure\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color.pure\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector.pure\";\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\nimport { type Scene } from \"../../scene.pure\";\nimport { type SmartArray } from \"../../Misc/smartArray\";\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable.pure\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture.pure\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer.pure\";\nimport { StorageBuffer } from \"../../Buffers/storageBuffer\";\nimport { ComputeShader } from \"../../Compute/computeShader.pure\";\nimport { type WebGPUEngine } from \"../../Engines/webgpuEngine.pure\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline.pure\";\nimport { type RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { type GaussianSplattingMesh, IsGaussianSplattingClassName } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\nimport { type GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\n\n// Max frames _renderVoxelGrid waits for splat depth sorts to settle before voxelizing anyway\n// (~3s at 60fps). Bounds the wait so a continuously re-sorting (orbiting) splat can't block it.\nconst _MaxSortSettleWaitFrames = 180;\n\n/**\n * Returns true if any of the given meshes (or their children) is a Gaussian splatting mesh.\n * Used to decide whether WebGPU voxelization needs the opacity accumulator buffer + copy pass.\n * @param meshes meshes included in the voxelization\n * @returns whether any included mesh (or child) is a Gaussian splatting mesh\n */\nfunction _HasGaussianSplatting(meshes: Mesh[]): boolean {\n for (const mesh of meshes) {\n if (!mesh) {\n continue;\n }\n if (IsGaussianSplattingClassName(mesh.getClassName())) {\n return true;\n }\n for (const child of mesh.getChildMeshes()) {\n if (IsGaussianSplattingClassName(child.getClassName())) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Voxel-based shadow rendering for IBL's.\n * This should not be instanciated directly, as it is part of a scene component\n * @internal\n * @see https://playground.babylonjs.com/#8R5SSE#222\n */\nexport class _IblShadowsVoxelRenderer {\n // View matrices for the three voxelization axes.\n private static readonly _VOXEL_VIEW_MATRICES = [\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(1, 0, 0), Vector3.Up()),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 1, 0), new Vector3(1, 0, 0)),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 0, 1), Vector3.Up()),\n ];\n\n private _scene: Scene;\n private _engine: Engine;\n\n // WebGPU, single-pass voxelization.\n // See https://playground.babylonjs.com/#XSNYAU#133\n private _voxelGrid: RenderTargetTexture;\n private _voxelGridRT: RenderTargetTexture;\n\n // WebGL voxelization, including tri-planar voxelization.\n private _combinedVoxelGridPT: ProceduralTexture;\n private _voxelGridXaxis: RenderTargetTexture;\n private _voxelGridYaxis: RenderTargetTexture;\n private _voxelGridZaxis: RenderTargetTexture;\n private _voxelMrtsXaxis: MultiRenderTarget[] = [];\n private _voxelMrtsYaxis: MultiRenderTarget[] = [];\n private _voxelMrtsZaxis: MultiRenderTarget[] = [];\n\n private _voxelMaterial: ShaderMaterial;\n\n // WebGPU only: per-voxel opacity accumulator (atomicMax during voxelization, copied to the r8 grid\n // mip 0 by _copyBufferToGridCompute). Used only when Gaussian splats are present; regular-mesh-only\n // voxelization writes the grid directly and skips it.\n private _voxelOpacityBuffer?: StorageBuffer;\n private _copyBufferToGridCompute?: ComputeShader;\n private _useOpacityBuffer = false;\n private _voxelClearColor: Color4 = new Color4(0, 0, 0, 1);\n\n /**\n * Return the voxel grid texture.\n * @returns The voxel grid texture.\n */\n public getVoxelGrid(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGrid;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Return the voxel render target used during voxelization.\n * @returns The voxel render target.\n */\n public getRT(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGridRT;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Observable that triggers when the voxelization is complete\n */\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\n\n private _maxDrawBuffers: number;\n private _renderTargets: RenderTargetTexture[] = [];\n\n /** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */\n private _gsVoxelMaterialCache: Map<number, ShaderMaterial> = new Map();\n\n private _triPlanarVoxelization: boolean = true;\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public get triPlanarVoxelization(): boolean {\n return this._triPlanarVoxelization;\n }\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public set triPlanarVoxelization(enabled: boolean) {\n if (this._engine.isWebGPU) {\n // WebGPU only supports tri-planar voxelization.\n this._triPlanarVoxelization = true;\n return;\n }\n if (this._triPlanarVoxelization === enabled) {\n return;\n }\n this._disposeVoxelTextures();\n this._triPlanarVoxelization = enabled;\n this._createTextures();\n }\n\n private _voxelizationInProgress: boolean = false;\n // Frames spent waiting for shadow-casting splats' depth sort to settle before voxelizing; see\n // _renderVoxelGrid. Capped so a continuously re-sorting (e.g. orbiting) splat can't starve it.\n private _sortSettleWaitFrames: number = 0;\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\n\n /**\n * Set the matrix to use for scaling the world space to voxel space\n * @param matrix The matrix to use for scaling the world space to voxel space\n */\n public setWorldScaleMatrix(matrix: Matrix) {\n this._invWorldScaleMatrix = matrix;\n }\n\n /**\n * @returns Whether voxelization is currently happening.\n */\n public isVoxelizationInProgress(): boolean {\n return this._voxelizationInProgress;\n }\n\n private _voxelResolution: number = 64;\n private _voxelResolutionExp: number = 6;\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public get voxelResolutionExp(): number {\n return this._voxelResolutionExp;\n }\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public set voxelResolutionExp(resolutionExp: number) {\n if (this._voxelResolutionExp === resolutionExp && this._voxelGridZaxis) {\n return;\n }\n this._voxelResolutionExp = Math.round(Math.min(Math.max(resolutionExp, 3), 9));\n this._voxelResolution = Math.pow(2.0, this._voxelResolutionExp);\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _copyMipEffectRenderer: EffectRenderer;\n private _copyMipEffectWrapper: EffectWrapper;\n private _copyMipSourceTexture?: ProceduralTexture;\n private _copyMipLayer = 0;\n private _mipArray: ProceduralTexture[] = [];\n\n /**\n * Instanciates the voxel renderer\n * @param scene Scene to attach to\n * @param iblShadowsRenderPipeline The render pipeline this pass is associated with\n * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n * @param triPlanarVoxelization Whether to use tri-planar voxelization. Only applies to WebGL. Voxelization will take longer but will reduce missing geometry.\n * @returns The voxel renderer\n */\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp: number = 6, triPlanarVoxelization: boolean = true) {\n this._scene = scene;\n this._engine = scene.getEngine() as Engine;\n this._triPlanarVoxelization = this._engine.isWebGPU || triPlanarVoxelization;\n if (!this._engine.getCaps().drawBuffersExtension) {\n Logger.Error(\"Can't do voxel rendering without the draw buffers extension.\");\n }\n\n const isWebGPU = this._engine.isWebGPU;\n // Round down to a power of 2 so it evenly divides the power-of-2 voxel resolution,\n // preventing out-of-bounds layer indices in the last MRT slab.\n // This shader implementation writes up to 16 MRT outputs, so clamp to 16 to keep\n // active draw buffers aligned with declared/written fragment outputs.\n const rawMaxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0;\n const cappedMaxDrawBuffers = Math.min(rawMaxDrawBuffers, 16);\n this._maxDrawBuffers = cappedMaxDrawBuffers >= 1 ? 1 << Math.floor(Math.log2(cappedMaxDrawBuffers)) : 0;\n\n this._copyMipEffectRenderer = new EffectRenderer(this._engine);\n this._copyMipEffectWrapper = new EffectWrapper({\n engine: this._engine,\n fragmentShader: \"copyTexture3DLayerToTexture\",\n useShaderStore: true,\n uniformNames: [\"layerNum\"],\n samplerNames: [\"textureSampler\"],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/copyTexture3DLayerToTexture.fragment\");\n } else {\n await import(\"../../Shaders/copyTexture3DLayerToTexture.fragment\");\n }\n },\n });\n this._copyMipEffectWrapper.onApplyObservable.add(() => {\n const effect = this._copyMipEffectWrapper.effect;\n if (!effect || !this._copyMipSourceTexture) {\n return;\n }\n\n effect.setTexture(\"textureSampler\", this._copyMipSourceTexture);\n effect.setInt(\"layerNum\", this._copyMipLayer);\n });\n\n this.voxelResolutionExp = resolutionExp;\n }\n\n private _generateMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._generateMipMap(i);\n }\n }\n\n private _generateMipMap(lodLevel: number) {\n // Generate a mip map for the given level by triggering the render of the procedural mip texture.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n\n mipTarget.setTexture(\"srcMip\", lodLevel === 1 ? this.getVoxelGrid() : this._mipArray[lodLevel - 2]);\n mipTarget.render();\n }\n\n private _copyMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._copyMipMap(i);\n }\n }\n\n private _copyMipMap(lodLevel: number) {\n // Now, copy this mip into the mip chain of the voxel grid.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n const voxelGrid = this.getVoxelGrid();\n let rt: RenderTargetWrapper;\n if (voxelGrid instanceof RenderTargetTexture && voxelGrid.renderTarget) {\n rt = voxelGrid.renderTarget;\n } else {\n rt = (voxelGrid as any)._rtWrapper;\n }\n if (rt) {\n this._copyMipEffectRenderer.saveStates();\n const previousColorWrite = this._engine.getColorWrite();\n const previousDepthBuffer = this._engine.getDepthBuffer();\n const previousDepthWrite = this._engine.getDepthWrite();\n const previousAlphaMode = this._engine.getAlphaMode();\n this._engine.setColorWrite(true);\n this._engine.setDepthBuffer(false);\n this._engine.setDepthWrite(false);\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\n const bindSize = mipTarget.getSize().width;\n let sourceDepth = mipTarget.getInternalTexture()?.depth;\n sourceDepth = Math.max(1, sourceDepth || bindSize);\n const destinationMipDepth = Math.max(1, this._voxelResolution >> lodLevel);\n const layersToCopy = Math.min(sourceDepth, destinationMipDepth);\n const destinationTexture = rt.texture;\n const previousGenerateMipMaps = destinationTexture?.generateMipMaps;\n\n if (destinationTexture) {\n destinationTexture.generateMipMaps = false;\n }\n\n try {\n // Render to each layer of the voxel grid.\n for (let layer = 0; layer < layersToCopy; layer++) {\n this._engine.bindFramebuffer(rt, 0, bindSize, bindSize, true, lodLevel, layer);\n this._copyMipSourceTexture = mipTarget;\n this._copyMipLayer = layer;\n this._copyMipEffectRenderer.applyEffectWrapper(this._copyMipEffectWrapper);\n this._copyMipEffectRenderer.draw();\n this._engine.unBindFramebuffer(rt, true);\n }\n\n if (!this._engine.isWebGPU) {\n this._engine.unbindAllTextures();\n }\n } finally {\n if (destinationTexture && previousGenerateMipMaps !== undefined) {\n destinationTexture.generateMipMaps = previousGenerateMipMaps;\n }\n this._engine.setAlphaMode(previousAlphaMode);\n this._engine.setDepthWrite(previousDepthWrite);\n this._engine.setDepthBuffer(previousDepthBuffer);\n this._engine.setColorWrite(previousColorWrite);\n }\n\n this._copyMipSourceTexture = undefined;\n this._copyMipEffectRenderer.restoreStates();\n }\n }\n\n private _computeNumberOfSlabs(): number {\n return Math.ceil(this._voxelResolution / this._maxDrawBuffers);\n }\n\n private _createTextures() {\n const isWebGPU = this._engine.isWebGPU;\n const size: TextureSize = {\n width: this._voxelResolution,\n height: this._voxelResolution,\n depth: this._voxelResolution,\n };\n const voxelAxisOptions: RenderTargetTextureOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n };\n\n // We can render up to maxDrawBuffers voxel slices of the grid per render.\n // We call this a slab.\n const numSlabs = this._computeNumberOfSlabs();\n const voxelCombinedOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: true,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblCombineVoxelGrids.fragment\");\n } else {\n await import(\"../../Shaders/iblCombineVoxelGrids.fragment\");\n }\n },\n };\n if (this._engine.isWebGPU) {\n this._voxelGrid = new RenderTargetTexture(\"voxelGrid\", size, this._scene, {\n ...voxelCombinedOptions,\n format: Constants.TEXTUREFORMAT_R,\n creationFlags: Constants.TEXTURE_CREATIONFLAG_STORAGE,\n });\n this._voxelGridRT = new RenderTargetTexture(\n \"voxelGridRT\",\n { width: Math.min(size.width * 2.0, 2048), height: Math.min(size.height * 2.0, 2048) },\n this._scene,\n voxelAxisOptions\n );\n // The opacity accumulator is created lazily, only when a voxelization includes Gaussian\n // splats (see _ensureVoxelOpacityAccumulator).\n } else if (this._triPlanarVoxelization) {\n this._voxelGridXaxis = new RenderTargetTexture(\"voxelGridXaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridYaxis = new RenderTargetTexture(\"voxelGridYaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelAxisOptions);\n this._voxelMrtsXaxis = this._createVoxelMRTs(\"x_axis_\", this._voxelGridXaxis, numSlabs);\n this._voxelMrtsYaxis = this._createVoxelMRTs(\"y_axis_\", this._voxelGridYaxis, numSlabs);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n\n this._combinedVoxelGridPT = new ProceduralTexture(\"combinedVoxelGrid\", size, \"iblCombineVoxelGrids\", this._scene, voxelCombinedOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._combinedVoxelGridPT), 1);\n this._combinedVoxelGridPT.setFloat(\"layer\", 0.0);\n this._combinedVoxelGridPT.setTexture(\"voxelXaxisSampler\", this._voxelGridXaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelYaxisSampler\", this._voxelGridYaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelZaxisSampler\", this._voxelGridZaxis);\n // We will render this only after voxelization is completed for the 3 axes.\n this._combinedVoxelGridPT.autoClear = false;\n this._combinedVoxelGridPT.wrapU = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapV = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapR = Texture.CLAMP_ADDRESSMODE;\n } else {\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelCombinedOptions);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n }\n\n const generateVoxelMipOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblGenerateVoxelMip.fragment\");\n } else {\n await import(\"../../Shaders/iblGenerateVoxelMip.fragment\");\n }\n },\n };\n this._mipArray = new Array(Math.ceil(Math.log2(this._voxelResolution)));\n for (let mipIdx = 1; mipIdx <= this._mipArray.length; mipIdx++) {\n const mipDim = this._voxelResolution >> mipIdx;\n const mipSize: TextureSize = { width: mipDim, height: mipDim, depth: mipDim };\n this._mipArray[mipIdx - 1] = new ProceduralTexture(\"voxelMip\" + mipIdx, mipSize, \"iblGenerateVoxelMip\", this._scene, generateVoxelMipOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._mipArray[mipIdx - 1]), 1);\n\n const mipTarget = this._mipArray[mipIdx - 1];\n mipTarget.autoClear = false;\n mipTarget.wrapU = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapV = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapR = Texture.CLAMP_ADDRESSMODE;\n mipTarget.setTexture(\"srcMip\", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());\n mipTarget.setInt(\"layerNum\", 0);\n }\n\n this._createVoxelMaterials();\n }\n\n /**\n * WebGPU only. Allocates the opacity accumulator buffer and the compute shader that copies it into\n * the r8 grid. Storage textures can't blend or do float atomics, so splats accumulate via atomicMax\n * and this compute pass decodes the result into mip 0.\n */\n private _ensureVoxelOpacityAccumulator(): void {\n if (this._voxelOpacityBuffer) {\n return;\n }\n const res = this._voxelResolution;\n // Packed 4 voxels/u32, so res^3 bytes. res is a power of two >= 8, so res^3 is a multiple of 4.\n this._voxelOpacityBuffer = new StorageBuffer(this._engine as unknown as WebGPUEngine, res * res * res);\n void (async () => {\n await import(\"../../ShadersWGSL/iblCopyVoxelBufferToGrid.compute\");\n this._copyBufferToGridCompute = new ComputeShader(\"iblCopyVoxelBufferToGrid\", this._engine, \"iblCopyVoxelBufferToGrid\", {\n bindingsMapping: {\n voxelOpacityBuffer: { group: 0, binding: 0 },\n voxelGridTarget: { group: 0, binding: 1 },\n },\n });\n })();\n }\n\n /**\n * WebGPU only. Dispatches the compute pass that decodes the per-voxel opacity accumulator buffer\n * into the r8 voxel grid (mip 0). Runs after all voxelization passes and before mip generation.\n */\n private _copyVoxelOpacityBufferToGrid(): void {\n const compute = this._copyBufferToGridCompute;\n if (!compute || !this._voxelOpacityBuffer) {\n return;\n }\n compute.setStorageBuffer(\"voxelOpacityBuffer\", this._voxelOpacityBuffer);\n compute.setStorageTexture(\"voxelGridTarget\", this._voxelGrid);\n // Workgroup size is 4x4x4; cover the whole grid.\n const groups = Math.ceil(this._voxelResolution / 4);\n compute.dispatch(groups, groups, groups);\n }\n\n private _createVoxelMRTs(name: string, voxelRT: RenderTargetTexture, numSlabs: number): MultiRenderTarget[] {\n voxelRT.wrapU = Texture.CLAMP_ADDRESSMODE;\n voxelRT.wrapV = Texture.CLAMP_ADDRESSMODE;\n // 3D texture: clamp the depth (R) axis too. The combine shader samples each grid with the depth\n // coordinate spanning [0,1], so without this it wraps to the opposite face at the boundaries.\n voxelRT.wrapR = Texture.CLAMP_ADDRESSMODE;\n voxelRT.noPrePassRenderer = true;\n const mrtArray: MultiRenderTarget[] = [];\n const targetTypes = new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_3D);\n\n for (let mrtIndex = 0; mrtIndex < numSlabs; mrtIndex++) {\n let layerIndices = new Array(this._maxDrawBuffers).fill(0);\n layerIndices = layerIndices.map((value, index) => mrtIndex * this._maxDrawBuffers + index);\n\n let textureNames = new Array(this._maxDrawBuffers).fill(\"\");\n textureNames = textureNames.map((value, index) => \"voxel_grid_\" + name + (mrtIndex * this._maxDrawBuffers + index));\n\n const mrt = new MultiRenderTarget(\n \"mrt_\" + name + mrtIndex,\n { width: this._voxelResolution, height: this._voxelResolution, depth: this._voxelResolution },\n this._maxDrawBuffers, // number of draw buffers\n this._scene,\n {\n types: new Array(this._maxDrawBuffers).fill(Constants.TEXTURETYPE_UNSIGNED_BYTE),\n samplingModes: new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE),\n generateMipMaps: false,\n targetTypes,\n formats: new Array(this._maxDrawBuffers).fill(Constants.TEXTUREFORMAT_R),\n faceIndex: new Array(this._maxDrawBuffers).fill(0),\n layerIndex: layerIndices,\n layerCounts: new Array(this._maxDrawBuffers).fill(this._voxelResolution),\n generateDepthBuffer: false,\n generateStencilBuffer: false,\n },\n textureNames\n );\n\n mrt.clearColor = new Color4(0, 0, 0, 1);\n mrt.noPrePassRenderer = true;\n for (let i = 0; i < this._maxDrawBuffers; i++) {\n mrt.setInternalTexture(voxelRT.getInternalTexture()!, i);\n }\n\n mrtArray.push(mrt);\n }\n return mrtArray;\n }\n\n private _disposeVoxelTextures() {\n this._stopVoxelization();\n for (let i = 0; i < this._voxelMrtsZaxis.length; i++) {\n if (this._triPlanarVoxelization) {\n this._voxelMrtsXaxis[i].dispose(true);\n this._voxelMrtsYaxis[i].dispose(true);\n }\n this._voxelMrtsZaxis[i].dispose(true);\n }\n if (this._triPlanarVoxelization) {\n this._voxelGridXaxis?.dispose();\n this._voxelGridYaxis?.dispose();\n this._combinedVoxelGridPT?.dispose();\n }\n this._voxelGridZaxis?.dispose();\n for (const mip of this._mipArray) {\n mip.dispose();\n }\n this._voxelMaterial?.dispose();\n this._voxelOpacityBuffer?.dispose();\n this._voxelOpacityBuffer = undefined;\n this._copyBufferToGridCompute = undefined;\n // The recreated _voxelMaterial has no IBL_VOXEL_OPACITY_BUFFER define; reset the flag so\n // updateVoxelGrid re-adds it (its change check would otherwise skip it after a resolution change).\n this._useOpacityBuffer = false;\n this._mipArray = [];\n this._voxelMrtsXaxis = [];\n this._voxelMrtsYaxis = [];\n this._voxelMrtsZaxis = [];\n }\n\n private _createVoxelMaterials(): void {\n const isWebGPU = this._engine.isWebGPU;\n this._voxelMaterial = new ShaderMaterial(\"voxelization\", this._scene, \"iblVoxelGrid\", {\n uniforms: [\"world\", \"viewMatrix\", \"invTransWorld\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\n // WebGPU accumulates non-binary voxel opacity via atomicMax into this storage buffer.\n storageBuffers: isWebGPU ? [\"voxelOpacityBuffer\"] : [],\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/iblVoxelGrid.fragment\"), import(\"../../ShadersWGSL/iblVoxelGrid.vertex\")]);\n } else {\n await Promise.all([import(\"../../Shaders/iblVoxelGrid.fragment\"), import(\"../../Shaders/iblVoxelGrid.vertex\")]);\n }\n },\n });\n\n this._voxelMaterial.cullBackFaces = false;\n this._voxelMaterial.backFaceCulling = false;\n this._voxelMaterial.depthFunction = Constants.ALWAYS;\n }\n\n /**\n * Checks if the voxel renderer is ready to voxelize scene\n * @returns true if the voxel renderer is ready to voxelize scene\n */\n public isReady() {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n\n if (!allReady || this._voxelizationInProgress) {\n return false;\n }\n\n return true;\n }\n\n /**\n * If the MRT's are already in the list of render targets, this will\n * remove them so that they don't get rendered again.\n */\n private _stopVoxelization() {\n // If the MRT's are already in the list of render targets, remove them.\n this._removeVoxelRTs(this._voxelMrtsXaxis);\n this._removeVoxelRTs(this._voxelMrtsYaxis);\n this._removeVoxelRTs(this._voxelMrtsZaxis);\n this._removeVoxelRTs([this._voxelGridRT]);\n }\n\n private _removeVoxelRTs(rts: RenderTargetTexture[]) {\n // const currentRTs = this._scene.customRenderTargets;\n const rtIdx = this._renderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._renderTargets.splice(rtIdx, rts.length);\n } else {\n const rtIdx = this._scene.customRenderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._scene.customRenderTargets.splice(rtIdx, rts.length);\n }\n }\n }\n\n /**\n * Renders voxel grid of scene for IBL shadows\n * @param includedMeshes\n * @param registerAfterRenderObservable Whether to register scene onAfterRender callback (legacy path).\n */\n public updateVoxelGrid(includedMeshes: Mesh[], registerAfterRenderObservable: boolean = true) {\n if (this._voxelizationInProgress) {\n return;\n }\n this._stopVoxelization();\n this._voxelizationInProgress = true;\n\n if (this._engine.isWebGPU) {\n // Route through the opacity accumulator only when Gaussian splats are present (they need\n // non-binary accumulation). Regular-mesh-only voxelization writes the grid directly.\n const useBuffer = _HasGaussianSplatting(includedMeshes);\n if (useBuffer) {\n this._ensureVoxelOpacityAccumulator();\n }\n if (useBuffer !== this._useOpacityBuffer) {\n this._useOpacityBuffer = useBuffer;\n this._voxelMaterial.setDefine(\"IBL_VOXEL_OPACITY_BUFFER\", useBuffer);\n }\n }\n\n if (this._engine.isWebGPU) {\n this._voxelGridRT.renderList = includedMeshes;\n this._addRTsForRender([this._voxelGridRT], includedMeshes, 0);\n } else if (this._triPlanarVoxelization) {\n this._addRTsForRender(this._voxelMrtsXaxis, includedMeshes, 0);\n this._addRTsForRender(this._voxelMrtsYaxis, includedMeshes, 1);\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n } else {\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n }\n if (registerAfterRenderObservable) {\n this._renderVoxelGridBound = this._renderVoxelGrid.bind(this);\n this._scene.onAfterRenderObservable.add(this._renderVoxelGridBound);\n }\n }\n\n /**\n * Advances voxelization work when running in custom render loops (for example FrameGraph tasks)\n * where scene onAfterRender timing may differ from classic pipeline flow.\n */\n public processVoxelization(): void {\n this._renderVoxelGrid();\n }\n\n private _renderVoxelGridBound: () => void;\n\n private _renderVoxelGrid() {\n if (this._voxelizationInProgress) {\n // Wait for shadow-casting GaussianSplatting meshes' depth sort to settle before\n // rasterizing. Voxelization is order-independent — the order splats are drawn never\n // affects the grid — but the GS voxel draw still *indexes* each splat through the\n // `splatIndex` thin-instance buffer, and that buffer is (re)sized, filled and rebound by\n // the sort worker's callback (the same callback that flips `_isDepthSortSettled`). After\n // addPart() merges a splat, `forcedInstanceCount` jumps to the new total synchronously\n // but the index buffer is only finalized when the sort lands; rasterizing in between\n // indexes a stale/mismatched buffer and writes an empty grid (no IBL shadow until a\n // later refresh). Frame-capped so a continuously re-sorting (orbiting) splat still\n // voxelizes eventually rather than blocking forever.\n let gsSortPending = false;\n for (let i = 0; i < this._renderTargets.length && !gsSortPending; i++) {\n const renderList = this._renderTargets[i].renderList;\n if (!renderList) {\n continue;\n }\n for (const mesh of renderList) {\n if (IsGaussianSplattingClassName(mesh.getClassName()) && !(mesh as GaussianSplattingMesh)._isDepthSortSettled) {\n gsSortPending = true;\n break;\n }\n }\n }\n if (gsSortPending && this._sortSettleWaitFrames < _MaxSortSettleWaitFrames) {\n this._sortSettleWaitFrames++;\n return;\n }\n this._sortSettleWaitFrames = 0;\n\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n for (let i = 0; i < this._renderTargets.length; i++) {\n const rttReady = this._renderTargets[i].isReadyForRendering();\n allReady &&= rttReady;\n }\n for (const gsVoxelMat of Array.from(this._gsVoxelMaterialCache.values())) {\n allReady &&= gsVoxelMat.isReady();\n }\n if (!allReady) {\n return;\n }\n\n const copyMipEffect = this._copyMipEffectWrapper.effect;\n if (!copyMipEffect.isReady()) {\n return;\n }\n\n if (this._engine.isWebGPU) {\n if (this._useOpacityBuffer) {\n // The copy compute must be ready before we voxelize, else the grid stays unpopulated.\n if (!this._copyBufferToGridCompute || !this._copyBufferToGridCompute.isReady()) {\n return;\n }\n // Reset the accumulator. clear() is a command-encoder op, so it must run before any\n // render pass opens (here, not mid-render).\n this._voxelOpacityBuffer?.clear();\n } else if (this._voxelGrid && this._voxelGrid.renderTarget) {\n // Direct mode (no splats): regular meshes textureStore into the grid, so clear each\n // layer first.\n for (let layer = 0; layer < this._voxelResolution; layer++) {\n this._engine.bindFramebuffer(this._voxelGrid.renderTarget, 0, undefined, undefined, true, 0, layer);\n this._engine.clear(this._voxelClearColor, true, false, false);\n this._engine.unBindFramebuffer(this._voxelGrid.renderTarget, true);\n }\n }\n }\n\n for (const rt of this._renderTargets) {\n rt.render();\n }\n this._stopVoxelization();\n\n if (this._engine.isWebGPU) {\n if (this._useOpacityBuffer) {\n // Decode the atomically-accumulated opacity buffer into the r8 voxel grid (mip 0).\n this._copyVoxelOpacityBufferToGrid();\n }\n } else if (this._triPlanarVoxelization) {\n this._combinedVoxelGridPT.render();\n }\n this._generateMipMaps();\n this._copyMipMaps();\n this._scene.onAfterRenderObservable.removeCallback(this._renderVoxelGridBound);\n this._voxelizationInProgress = false;\n this.onVoxelizationCompleteObservable.notifyObservers();\n }\n }\n\n /**\n * Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render\n * (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.\n * @param rtt - the render target texture to install the custom render function on\n */\n private _installVoxelMixedCustomRender(rtt: RenderTargetTexture): void {\n const scene = this._scene;\n const engine = scene.getEngine();\n\n const renderGsSplat = (sm: SubMesh): void => {\n const renderingMesh = sm.getRenderingMesh();\n const effectiveMesh = sm.getEffectiveMesh();\n const gsVoxelMaterial = this._gsVoxelMaterialCache.get(effectiveMesh.uniqueId);\n if (!gsVoxelMaterial || !gsVoxelMaterial.isReady()) {\n return;\n }\n\n const drawWrapper = gsVoxelMaterial._getDrawWrapper();\n if (!drawWrapper?.effect) {\n return;\n }\n const effect = drawWrapper.effect;\n\n const batch = renderingMesh._getInstancesRenderList(sm._id, !!sm.getReplacementMesh());\n if (batch.mustReturn) {\n return;\n }\n\n const hardwareInstancedRendering =\n engine.getCaps().instancedArrays && ((batch.visibleInstances[sm._id] !== null && batch.visibleInstances[sm._id] !== undefined) || renderingMesh.hasThinInstances);\n\n const fillMode = sm.getMaterial()?.fillMode ?? Constants.MATERIAL_TriangleFillMode;\n engine.enableEffect(drawWrapper);\n renderingMesh._bind(sm, effect, fillMode);\n gsVoxelMaterial._preBind(drawWrapper);\n gsVoxelMaterial.bind(effectiveMesh.getWorldMatrix(), effectiveMesh, effect);\n // If rotation/scale textures are missing, bind() logged the warning; skip the draw to avoid GPU errors.\n if (!(effectiveMesh as GaussianSplattingMesh).rotationsATexture) {\n gsVoxelMaterial.unbind();\n return;\n }\n if (engine.isWebGPU) {\n // A GSplat is a 3D Gaussian ellipsoid. To approximate its volume in the voxel grid\n // we rasterize three planar cross-section quads — one per principal axis — each\n // spanning the ellipsoid cross-section perpendicular to that axis. A quad rendered\n // edge-on produces zero fragments, so we draw once per world axis: each draw lets\n // computeVoxelSplatWorldPos pick the quad whose normal best aligns with that view,\n // guaranteeing every splat is captured face-on from at least one direction.\n const viewMatrices = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES;\n for (let axisIdx = 0; axisIdx < 3; axisIdx++) {\n effect.setMatrix(\"viewMatrix\", viewMatrices[axisIdx]);\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => {\n effect.setMatrix(\"world\", world);\n });\n }\n } else {\n // Accumulate overlapping splats with a MAX blend equation (dst = max(src, dst)) so each\n // cell keeps the strongest occluder; writing 0.0 into non-slab draw buffers is a no-op.\n // Matches the WebGPU atomicMax path; see the opacity-compositing limitation in\n // iblVoxelOpacityAtomicMax.\n const previousAlphaMode = engine.getAlphaMode();\n engine.setAlphaMode(Constants.ALPHA_MAX, true);\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => effect.setMatrix(\"world\", world));\n engine.setAlphaMode(previousAlphaMode, true);\n }\n gsVoxelMaterial.unbind();\n };\n\n const processBucket = (subMeshes: SmartArray<SubMesh>, enableAlphaMode: boolean): void => {\n for (let i = 0; i < subMeshes.length; i++) {\n const sm = subMeshes.data[i];\n const effective = sm.getEffectiveMesh();\n if (IsGaussianSplattingClassName(effective.getClassName())) {\n renderGsSplat(sm);\n } else {\n sm.render(enableAlphaMode);\n }\n }\n };\n\n rtt.customRenderFunction = (\n opaqueSubMeshes: SmartArray<SubMesh>,\n alphaTestSubMeshes: SmartArray<SubMesh>,\n transparentSubMeshes: SmartArray<SubMesh>,\n depthOnlySubMeshes: SmartArray<SubMesh>\n ): void => {\n if (depthOnlySubMeshes.length) {\n engine.setColorWrite(false);\n processBucket(depthOnlySubMeshes, false);\n engine.setColorWrite(true);\n }\n processBucket(opaqueSubMeshes, false);\n processBucket(alphaTestSubMeshes, false);\n processBucket(transparentSubMeshes, true);\n };\n }\n\n private _addGsMeshToVoxelRT(mrt: RenderTargetTexture, mesh: GaussianSplattingMesh): void {\n let gsVoxelMaterial = this._gsVoxelMaterialCache.get(mesh.uniqueId);\n if (!gsVoxelMaterial) {\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\n if (!gsMaterial) {\n return;\n }\n const shaderLanguage = this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\n gsVoxelMaterial = gsMaterial.makeVoxelRenderingMaterial(this._scene, shaderLanguage, this._maxDrawBuffers, mesh.isCompound);\n this._gsVoxelMaterialCache.set(mesh.uniqueId, gsVoxelMaterial);\n }\n mrt.renderList?.push(mesh as Mesh);\n mrt.setMaterialForRendering(mesh as Mesh, gsVoxelMaterial);\n }\n\n private _addRTsForRender(mrts: RenderTargetTexture[], includedMeshes: Mesh[], axis: number) {\n const slabSize = 1.0 / this._computeNumberOfSlabs();\n const voxelMaterial = this._voxelMaterial;\n\n // We need to update the world scale uniform for every mesh being rendered to the voxel grid.\n for (let mrtIndex = 0; mrtIndex < mrts.length; mrtIndex++) {\n const mrt = mrts[mrtIndex];\n mrt._disableEngineStages = true;\n mrt.useCameraPostProcesses = false;\n mrt.renderParticles = false;\n mrt.renderSprites = false;\n mrt.enableOutlineRendering = false;\n\n const renderBucket = (bucket: SmartArray<SubMesh>) => {\n for (let index = 0; index < bucket.length; index++) {\n const subMesh = bucket.data[index];\n if (subMesh.getMaterial() !== voxelMaterial) {\n continue;\n }\n subMesh.render(false);\n }\n };\n\n mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n renderBucket(depthOnlySubMeshes);\n renderBucket(opaqueSubMeshes);\n renderBucket(alphaTestSubMeshes);\n renderBucket(transparentSubMeshes);\n };\n\n mrt.renderList = [];\n const nearPlane = mrtIndex * slabSize;\n const farPlane = (mrtIndex + 1) * slabSize;\n const stepSize = slabSize / this._maxDrawBuffers;\n\n const viewMatrix = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES[axis];\n mrt.onBeforeRenderObservable.clear();\n mrt.onBeforeRenderObservable.add(() => {\n voxelMaterial.setMatrix(\"viewMatrix\", viewMatrix);\n voxelMaterial.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n voxelMaterial.setFloat(\"nearPlane\", nearPlane);\n voxelMaterial.setFloat(\"farPlane\", farPlane);\n voxelMaterial.setFloat(\"stepSize\", stepSize);\n if (this._engine.isWebGPU) {\n this._voxelMaterial.useVertexPulling = true;\n this._voxelMaterial.setTexture(\"voxel_storage\", this.getVoxelGrid());\n if (this._voxelOpacityBuffer) {\n this._voxelMaterial.setStorageBuffer(\"voxelOpacityBuffer\", this._voxelOpacityBuffer);\n }\n }\n // Push per-slab uniforms to each GS voxel material in this MRT's render list.\n for (const m of mrt.renderList ?? []) {\n if (IsGaussianSplattingClassName(m.getClassName())) {\n const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);\n if (gsVoxelMat) {\n gsVoxelMat.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n if (this._engine.isWebGPU) {\n // WGSL GS voxel shader uses the same viewMatrix approach as WebGL; the per-axis viewMatrix is set per-draw in renderGsSplat.\n gsVoxelMat.setTexture(\"voxel_storage\", this.getVoxelGrid());\n if (this._voxelOpacityBuffer) {\n gsVoxelMat.setStorageBuffer(\"voxelOpacityBuffer\", this._voxelOpacityBuffer);\n }\n } else {\n gsVoxelMat.setMatrix(\"viewMatrix\", viewMatrix);\n gsVoxelMat.setFloat(\"nearPlane\", nearPlane);\n gsVoxelMat.setFloat(\"farPlane\", farPlane);\n gsVoxelMat.setFloat(\"stepSize\", stepSize);\n }\n }\n }\n }\n });\n\n // Set this material on every mesh in the scene (for this RT)\n if (includedMeshes.length === 0) {\n return;\n }\n for (const mesh of includedMeshes) {\n if (!mesh) {\n continue;\n }\n if (IsGaussianSplattingClassName(mesh.getClassName())) {\n this._addGsMeshToVoxelRT(mrt, mesh as GaussianSplattingMesh);\n } else if (mesh.subMeshes && mesh.subMeshes.length > 0) {\n mrt.renderList?.push(mesh);\n mrt.setMaterialForRendering(mesh, voxelMaterial);\n }\n const meshes = mesh.getChildMeshes();\n for (const childMesh of meshes) {\n if (IsGaussianSplattingClassName(childMesh.getClassName())) {\n this._addGsMeshToVoxelRT(mrt, childMesh as GaussianSplattingMesh);\n } else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {\n mrt.renderList?.push(childMesh);\n mrt.setMaterialForRendering(childMesh, voxelMaterial);\n }\n }\n }\n\n this._installVoxelMixedCustomRender(mrt);\n }\n\n this._renderTargets = this._renderTargets.concat(mrts);\n }\n\n /**\n * Called by the pipeline to resize resources.\n */\n public resize() {}\n\n /**\n * Disposes the voxel renderer and associated resources\n */\n public dispose() {\n this._disposeVoxelTextures();\n for (const mat of Array.from(this._gsVoxelMaterialCache.values())) {\n mat.dispose();\n }\n this._gsVoxelMaterialCache.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"iblShadowsVoxelRenderer.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine.pure\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget.pure\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture.pure\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color.pure\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector.pure\";\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\nimport { type Scene } from \"../../scene.pure\";\nimport { type SmartArray } from \"../../Misc/smartArray\";\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable.pure\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture.pure\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer.pure\";\nimport { StorageBuffer } from \"../../Buffers/storageBuffer\";\nimport { ComputeShader } from \"../../Compute/computeShader.pure\";\nimport { type WebGPUEngine } from \"../../Engines/webgpuEngine.pure\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline.pure\";\nimport { type RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\nimport { _IsGaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplatting.functions\";\nimport { type GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\n\n// Max frames _renderVoxelGrid waits for splat depth sorts to settle before voxelizing anyway\n// (~3s at 60fps). Bounds the wait so a continuously re-sorting (orbiting) splat can't block it.\nconst _MaxSortSettleWaitFrames = 180;\n\n/**\n * Returns true if any of the given meshes (or their children) is a Gaussian splatting mesh.\n * Used to decide whether WebGPU voxelization needs the opacity accumulator buffer + copy pass.\n * @param meshes meshes included in the voxelization\n * @returns whether any included mesh (or child) is a Gaussian splatting mesh\n */\nfunction _HasGaussianSplatting(meshes: Mesh[]): boolean {\n for (const mesh of meshes) {\n if (!mesh) {\n continue;\n }\n if (_IsGaussianSplattingMesh(mesh)) {\n return true;\n }\n for (const child of mesh.getChildMeshes()) {\n if (_IsGaussianSplattingMesh(child)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Voxel-based shadow rendering for IBL's.\n * This should not be instanciated directly, as it is part of a scene component\n * @internal\n * @see https://playground.babylonjs.com/#8R5SSE#222\n */\nexport class _IblShadowsVoxelRenderer {\n // View matrices for the three voxelization axes.\n private static readonly _VOXEL_VIEW_MATRICES = [\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(1, 0, 0), Vector3.Up()),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 1, 0), new Vector3(1, 0, 0)),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 0, 1), Vector3.Up()),\n ];\n\n private _scene: Scene;\n private _engine: Engine;\n\n // WebGPU, single-pass voxelization.\n // See https://playground.babylonjs.com/#XSNYAU#133\n private _voxelGrid: RenderTargetTexture;\n private _voxelGridRT: RenderTargetTexture;\n\n // WebGL voxelization, including tri-planar voxelization.\n private _combinedVoxelGridPT: ProceduralTexture;\n private _voxelGridXaxis: RenderTargetTexture;\n private _voxelGridYaxis: RenderTargetTexture;\n private _voxelGridZaxis: RenderTargetTexture;\n private _voxelMrtsXaxis: MultiRenderTarget[] = [];\n private _voxelMrtsYaxis: MultiRenderTarget[] = [];\n private _voxelMrtsZaxis: MultiRenderTarget[] = [];\n\n private _voxelMaterial: ShaderMaterial;\n\n // WebGPU only: per-voxel opacity accumulator (atomicMax during voxelization, copied to the r8 grid\n // mip 0 by _copyBufferToGridCompute). Used only when Gaussian splats are present; regular-mesh-only\n // voxelization writes the grid directly and skips it.\n private _voxelOpacityBuffer?: StorageBuffer;\n private _copyBufferToGridCompute?: ComputeShader;\n private _useOpacityBuffer = false;\n private _voxelClearColor: Color4 = new Color4(0, 0, 0, 1);\n\n /**\n * Return the voxel grid texture.\n * @returns The voxel grid texture.\n */\n public getVoxelGrid(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGrid;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Return the voxel render target used during voxelization.\n * @returns The voxel render target.\n */\n public getRT(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGridRT;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Observable that triggers when the voxelization is complete\n */\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\n\n private _maxDrawBuffers: number;\n private _renderTargets: RenderTargetTexture[] = [];\n\n /** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */\n private _gsVoxelMaterialCache: Map<number, ShaderMaterial> = new Map();\n\n private _triPlanarVoxelization: boolean = true;\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public get triPlanarVoxelization(): boolean {\n return this._triPlanarVoxelization;\n }\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public set triPlanarVoxelization(enabled: boolean) {\n if (this._engine.isWebGPU) {\n // WebGPU only supports tri-planar voxelization.\n this._triPlanarVoxelization = true;\n return;\n }\n if (this._triPlanarVoxelization === enabled) {\n return;\n }\n this._disposeVoxelTextures();\n this._triPlanarVoxelization = enabled;\n this._createTextures();\n }\n\n private _voxelizationInProgress: boolean = false;\n // Frames spent waiting for shadow-casting splats' depth sort to settle before voxelizing; see\n // _renderVoxelGrid. Capped so a continuously re-sorting (e.g. orbiting) splat can't starve it.\n private _sortSettleWaitFrames: number = 0;\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\n\n /**\n * Set the matrix to use for scaling the world space to voxel space\n * @param matrix The matrix to use for scaling the world space to voxel space\n */\n public setWorldScaleMatrix(matrix: Matrix) {\n this._invWorldScaleMatrix = matrix;\n }\n\n /**\n * @returns Whether voxelization is currently happening.\n */\n public isVoxelizationInProgress(): boolean {\n return this._voxelizationInProgress;\n }\n\n private _voxelResolution: number = 64;\n private _voxelResolutionExp: number = 6;\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public get voxelResolutionExp(): number {\n return this._voxelResolutionExp;\n }\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public set voxelResolutionExp(resolutionExp: number) {\n if (this._voxelResolutionExp === resolutionExp && this._voxelGridZaxis) {\n return;\n }\n this._voxelResolutionExp = Math.round(Math.min(Math.max(resolutionExp, 3), 9));\n this._voxelResolution = Math.pow(2.0, this._voxelResolutionExp);\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _copyMipEffectRenderer: EffectRenderer;\n private _copyMipEffectWrapper: EffectWrapper;\n private _copyMipSourceTexture?: ProceduralTexture;\n private _copyMipLayer = 0;\n private _mipArray: ProceduralTexture[] = [];\n\n /**\n * Instanciates the voxel renderer\n * @param scene Scene to attach to\n * @param iblShadowsRenderPipeline The render pipeline this pass is associated with\n * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n * @param triPlanarVoxelization Whether to use tri-planar voxelization. Only applies to WebGL. Voxelization will take longer but will reduce missing geometry.\n * @returns The voxel renderer\n */\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp: number = 6, triPlanarVoxelization: boolean = true) {\n this._scene = scene;\n this._engine = scene.getEngine() as Engine;\n this._triPlanarVoxelization = this._engine.isWebGPU || triPlanarVoxelization;\n if (!this._engine.getCaps().drawBuffersExtension) {\n Logger.Error(\"Can't do voxel rendering without the draw buffers extension.\");\n }\n\n const isWebGPU = this._engine.isWebGPU;\n // Round down to a power of 2 so it evenly divides the power-of-2 voxel resolution,\n // preventing out-of-bounds layer indices in the last MRT slab.\n // This shader implementation writes up to 16 MRT outputs, so clamp to 16 to keep\n // active draw buffers aligned with declared/written fragment outputs.\n const rawMaxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0;\n const cappedMaxDrawBuffers = Math.min(rawMaxDrawBuffers, 16);\n this._maxDrawBuffers = cappedMaxDrawBuffers >= 1 ? 1 << Math.floor(Math.log2(cappedMaxDrawBuffers)) : 0;\n\n this._copyMipEffectRenderer = new EffectRenderer(this._engine);\n this._copyMipEffectWrapper = new EffectWrapper({\n engine: this._engine,\n fragmentShader: \"copyTexture3DLayerToTexture\",\n useShaderStore: true,\n uniformNames: [\"layerNum\"],\n samplerNames: [\"textureSampler\"],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/copyTexture3DLayerToTexture.fragment\");\n } else {\n await import(\"../../Shaders/copyTexture3DLayerToTexture.fragment\");\n }\n },\n });\n this._copyMipEffectWrapper.onApplyObservable.add(() => {\n const effect = this._copyMipEffectWrapper.effect;\n if (!effect || !this._copyMipSourceTexture) {\n return;\n }\n\n effect.setTexture(\"textureSampler\", this._copyMipSourceTexture);\n effect.setInt(\"layerNum\", this._copyMipLayer);\n });\n\n this.voxelResolutionExp = resolutionExp;\n }\n\n private _generateMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._generateMipMap(i);\n }\n }\n\n private _generateMipMap(lodLevel: number) {\n // Generate a mip map for the given level by triggering the render of the procedural mip texture.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n\n mipTarget.setTexture(\"srcMip\", lodLevel === 1 ? this.getVoxelGrid() : this._mipArray[lodLevel - 2]);\n mipTarget.render();\n }\n\n private _copyMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._copyMipMap(i);\n }\n }\n\n private _copyMipMap(lodLevel: number) {\n // Now, copy this mip into the mip chain of the voxel grid.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n const voxelGrid = this.getVoxelGrid();\n let rt: RenderTargetWrapper;\n if (voxelGrid instanceof RenderTargetTexture && voxelGrid.renderTarget) {\n rt = voxelGrid.renderTarget;\n } else {\n rt = (voxelGrid as any)._rtWrapper;\n }\n if (rt) {\n this._copyMipEffectRenderer.saveStates();\n const previousColorWrite = this._engine.getColorWrite();\n const previousDepthBuffer = this._engine.getDepthBuffer();\n const previousDepthWrite = this._engine.getDepthWrite();\n const previousAlphaMode = this._engine.getAlphaMode();\n this._engine.setColorWrite(true);\n this._engine.setDepthBuffer(false);\n this._engine.setDepthWrite(false);\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\n const bindSize = mipTarget.getSize().width;\n let sourceDepth = mipTarget.getInternalTexture()?.depth;\n sourceDepth = Math.max(1, sourceDepth || bindSize);\n const destinationMipDepth = Math.max(1, this._voxelResolution >> lodLevel);\n const layersToCopy = Math.min(sourceDepth, destinationMipDepth);\n const destinationTexture = rt.texture;\n const previousGenerateMipMaps = destinationTexture?.generateMipMaps;\n\n if (destinationTexture) {\n destinationTexture.generateMipMaps = false;\n }\n\n try {\n // Render to each layer of the voxel grid.\n for (let layer = 0; layer < layersToCopy; layer++) {\n this._engine.bindFramebuffer(rt, 0, bindSize, bindSize, true, lodLevel, layer);\n this._copyMipSourceTexture = mipTarget;\n this._copyMipLayer = layer;\n this._copyMipEffectRenderer.applyEffectWrapper(this._copyMipEffectWrapper);\n this._copyMipEffectRenderer.draw();\n this._engine.unBindFramebuffer(rt, true);\n }\n\n if (!this._engine.isWebGPU) {\n this._engine.unbindAllTextures();\n }\n } finally {\n if (destinationTexture && previousGenerateMipMaps !== undefined) {\n destinationTexture.generateMipMaps = previousGenerateMipMaps;\n }\n this._engine.setAlphaMode(previousAlphaMode);\n this._engine.setDepthWrite(previousDepthWrite);\n this._engine.setDepthBuffer(previousDepthBuffer);\n this._engine.setColorWrite(previousColorWrite);\n }\n\n this._copyMipSourceTexture = undefined;\n this._copyMipEffectRenderer.restoreStates();\n }\n }\n\n private _computeNumberOfSlabs(): number {\n return Math.ceil(this._voxelResolution / this._maxDrawBuffers);\n }\n\n private _createTextures() {\n const isWebGPU = this._engine.isWebGPU;\n const size: TextureSize = {\n width: this._voxelResolution,\n height: this._voxelResolution,\n depth: this._voxelResolution,\n };\n const voxelAxisOptions: RenderTargetTextureOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n };\n\n // We can render up to maxDrawBuffers voxel slices of the grid per render.\n // We call this a slab.\n const numSlabs = this._computeNumberOfSlabs();\n const voxelCombinedOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: true,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblCombineVoxelGrids.fragment\");\n } else {\n await import(\"../../Shaders/iblCombineVoxelGrids.fragment\");\n }\n },\n };\n if (this._engine.isWebGPU) {\n this._voxelGrid = new RenderTargetTexture(\"voxelGrid\", size, this._scene, {\n ...voxelCombinedOptions,\n format: Constants.TEXTUREFORMAT_R,\n creationFlags: Constants.TEXTURE_CREATIONFLAG_STORAGE,\n });\n this._voxelGridRT = new RenderTargetTexture(\n \"voxelGridRT\",\n { width: Math.min(size.width * 2.0, 2048), height: Math.min(size.height * 2.0, 2048) },\n this._scene,\n voxelAxisOptions\n );\n // The opacity accumulator is created lazily, only when a voxelization includes Gaussian\n // splats (see _ensureVoxelOpacityAccumulator).\n } else if (this._triPlanarVoxelization) {\n this._voxelGridXaxis = new RenderTargetTexture(\"voxelGridXaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridYaxis = new RenderTargetTexture(\"voxelGridYaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelAxisOptions);\n this._voxelMrtsXaxis = this._createVoxelMRTs(\"x_axis_\", this._voxelGridXaxis, numSlabs);\n this._voxelMrtsYaxis = this._createVoxelMRTs(\"y_axis_\", this._voxelGridYaxis, numSlabs);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n\n this._combinedVoxelGridPT = new ProceduralTexture(\"combinedVoxelGrid\", size, \"iblCombineVoxelGrids\", this._scene, voxelCombinedOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._combinedVoxelGridPT), 1);\n this._combinedVoxelGridPT.setFloat(\"layer\", 0.0);\n this._combinedVoxelGridPT.setTexture(\"voxelXaxisSampler\", this._voxelGridXaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelYaxisSampler\", this._voxelGridYaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelZaxisSampler\", this._voxelGridZaxis);\n // We will render this only after voxelization is completed for the 3 axes.\n this._combinedVoxelGridPT.autoClear = false;\n this._combinedVoxelGridPT.wrapU = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapV = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapR = Texture.CLAMP_ADDRESSMODE;\n } else {\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelCombinedOptions);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n }\n\n const generateVoxelMipOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblGenerateVoxelMip.fragment\");\n } else {\n await import(\"../../Shaders/iblGenerateVoxelMip.fragment\");\n }\n },\n };\n this._mipArray = new Array(Math.ceil(Math.log2(this._voxelResolution)));\n for (let mipIdx = 1; mipIdx <= this._mipArray.length; mipIdx++) {\n const mipDim = this._voxelResolution >> mipIdx;\n const mipSize: TextureSize = { width: mipDim, height: mipDim, depth: mipDim };\n this._mipArray[mipIdx - 1] = new ProceduralTexture(\"voxelMip\" + mipIdx, mipSize, \"iblGenerateVoxelMip\", this._scene, generateVoxelMipOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._mipArray[mipIdx - 1]), 1);\n\n const mipTarget = this._mipArray[mipIdx - 1];\n mipTarget.autoClear = false;\n mipTarget.wrapU = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapV = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapR = Texture.CLAMP_ADDRESSMODE;\n mipTarget.setTexture(\"srcMip\", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());\n mipTarget.setInt(\"layerNum\", 0);\n }\n\n this._createVoxelMaterials();\n }\n\n /**\n * WebGPU only. Allocates the opacity accumulator buffer and the compute shader that copies it into\n * the r8 grid. Storage textures can't blend or do float atomics, so splats accumulate via atomicMax\n * and this compute pass decodes the result into mip 0.\n */\n private _ensureVoxelOpacityAccumulator(): void {\n if (this._voxelOpacityBuffer) {\n return;\n }\n const res = this._voxelResolution;\n // Packed 4 voxels/u32, so res^3 bytes. res is a power of two >= 8, so res^3 is a multiple of 4.\n this._voxelOpacityBuffer = new StorageBuffer(this._engine as unknown as WebGPUEngine, res * res * res);\n void (async () => {\n await import(\"../../ShadersWGSL/iblCopyVoxelBufferToGrid.compute\");\n this._copyBufferToGridCompute = new ComputeShader(\"iblCopyVoxelBufferToGrid\", this._engine, \"iblCopyVoxelBufferToGrid\", {\n bindingsMapping: {\n voxelOpacityBuffer: { group: 0, binding: 0 },\n voxelGridTarget: { group: 0, binding: 1 },\n },\n });\n })();\n }\n\n /**\n * WebGPU only. Dispatches the compute pass that decodes the per-voxel opacity accumulator buffer\n * into the r8 voxel grid (mip 0). Runs after all voxelization passes and before mip generation.\n */\n private _copyVoxelOpacityBufferToGrid(): void {\n const compute = this._copyBufferToGridCompute;\n if (!compute || !this._voxelOpacityBuffer) {\n return;\n }\n compute.setStorageBuffer(\"voxelOpacityBuffer\", this._voxelOpacityBuffer);\n compute.setStorageTexture(\"voxelGridTarget\", this._voxelGrid);\n // Workgroup size is 4x4x4; cover the whole grid.\n const groups = Math.ceil(this._voxelResolution / 4);\n compute.dispatch(groups, groups, groups);\n }\n\n private _createVoxelMRTs(name: string, voxelRT: RenderTargetTexture, numSlabs: number): MultiRenderTarget[] {\n voxelRT.wrapU = Texture.CLAMP_ADDRESSMODE;\n voxelRT.wrapV = Texture.CLAMP_ADDRESSMODE;\n // 3D texture: clamp the depth (R) axis too. The combine shader samples each grid with the depth\n // coordinate spanning [0,1], so without this it wraps to the opposite face at the boundaries.\n voxelRT.wrapR = Texture.CLAMP_ADDRESSMODE;\n voxelRT.noPrePassRenderer = true;\n const mrtArray: MultiRenderTarget[] = [];\n const targetTypes = new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_3D);\n\n for (let mrtIndex = 0; mrtIndex < numSlabs; mrtIndex++) {\n let layerIndices = new Array(this._maxDrawBuffers).fill(0);\n layerIndices = layerIndices.map((value, index) => mrtIndex * this._maxDrawBuffers + index);\n\n let textureNames = new Array(this._maxDrawBuffers).fill(\"\");\n textureNames = textureNames.map((value, index) => \"voxel_grid_\" + name + (mrtIndex * this._maxDrawBuffers + index));\n\n const mrt = new MultiRenderTarget(\n \"mrt_\" + name + mrtIndex,\n { width: this._voxelResolution, height: this._voxelResolution, depth: this._voxelResolution },\n this._maxDrawBuffers, // number of draw buffers\n this._scene,\n {\n types: new Array(this._maxDrawBuffers).fill(Constants.TEXTURETYPE_UNSIGNED_BYTE),\n samplingModes: new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE),\n generateMipMaps: false,\n targetTypes,\n formats: new Array(this._maxDrawBuffers).fill(Constants.TEXTUREFORMAT_R),\n faceIndex: new Array(this._maxDrawBuffers).fill(0),\n layerIndex: layerIndices,\n layerCounts: new Array(this._maxDrawBuffers).fill(this._voxelResolution),\n generateDepthBuffer: false,\n generateStencilBuffer: false,\n },\n textureNames\n );\n\n mrt.clearColor = new Color4(0, 0, 0, 1);\n mrt.noPrePassRenderer = true;\n for (let i = 0; i < this._maxDrawBuffers; i++) {\n mrt.setInternalTexture(voxelRT.getInternalTexture()!, i);\n }\n\n mrtArray.push(mrt);\n }\n return mrtArray;\n }\n\n private _disposeVoxelTextures() {\n this._stopVoxelization();\n for (let i = 0; i < this._voxelMrtsZaxis.length; i++) {\n if (this._triPlanarVoxelization) {\n this._voxelMrtsXaxis[i].dispose(true);\n this._voxelMrtsYaxis[i].dispose(true);\n }\n this._voxelMrtsZaxis[i].dispose(true);\n }\n if (this._triPlanarVoxelization) {\n this._voxelGridXaxis?.dispose();\n this._voxelGridYaxis?.dispose();\n this._combinedVoxelGridPT?.dispose();\n }\n this._voxelGridZaxis?.dispose();\n for (const mip of this._mipArray) {\n mip.dispose();\n }\n this._voxelMaterial?.dispose();\n this._voxelOpacityBuffer?.dispose();\n this._voxelOpacityBuffer = undefined;\n this._copyBufferToGridCompute = undefined;\n // The recreated _voxelMaterial has no IBL_VOXEL_OPACITY_BUFFER define; reset the flag so\n // updateVoxelGrid re-adds it (its change check would otherwise skip it after a resolution change).\n this._useOpacityBuffer = false;\n this._mipArray = [];\n this._voxelMrtsXaxis = [];\n this._voxelMrtsYaxis = [];\n this._voxelMrtsZaxis = [];\n }\n\n private _createVoxelMaterials(): void {\n const isWebGPU = this._engine.isWebGPU;\n this._voxelMaterial = new ShaderMaterial(\"voxelization\", this._scene, \"iblVoxelGrid\", {\n uniforms: [\"world\", \"viewMatrix\", \"invTransWorld\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\n // WebGPU accumulates non-binary voxel opacity via atomicMax into this storage buffer.\n storageBuffers: isWebGPU ? [\"voxelOpacityBuffer\"] : [],\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/iblVoxelGrid.fragment\"), import(\"../../ShadersWGSL/iblVoxelGrid.vertex\")]);\n } else {\n await Promise.all([import(\"../../Shaders/iblVoxelGrid.fragment\"), import(\"../../Shaders/iblVoxelGrid.vertex\")]);\n }\n },\n });\n\n this._voxelMaterial.cullBackFaces = false;\n this._voxelMaterial.backFaceCulling = false;\n this._voxelMaterial.depthFunction = Constants.ALWAYS;\n }\n\n /**\n * Checks if the voxel renderer is ready to voxelize scene\n * @returns true if the voxel renderer is ready to voxelize scene\n */\n public isReady() {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n\n if (!allReady || this._voxelizationInProgress) {\n return false;\n }\n\n return true;\n }\n\n /**\n * If the MRT's are already in the list of render targets, this will\n * remove them so that they don't get rendered again.\n */\n private _stopVoxelization() {\n // If the MRT's are already in the list of render targets, remove them.\n this._removeVoxelRTs(this._voxelMrtsXaxis);\n this._removeVoxelRTs(this._voxelMrtsYaxis);\n this._removeVoxelRTs(this._voxelMrtsZaxis);\n this._removeVoxelRTs([this._voxelGridRT]);\n }\n\n private _removeVoxelRTs(rts: RenderTargetTexture[]) {\n // const currentRTs = this._scene.customRenderTargets;\n const rtIdx = this._renderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._renderTargets.splice(rtIdx, rts.length);\n } else {\n const rtIdx = this._scene.customRenderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._scene.customRenderTargets.splice(rtIdx, rts.length);\n }\n }\n }\n\n /**\n * Renders voxel grid of scene for IBL shadows\n * @param includedMeshes\n * @param registerAfterRenderObservable Whether to register scene onAfterRender callback (legacy path).\n */\n public updateVoxelGrid(includedMeshes: Mesh[], registerAfterRenderObservable: boolean = true) {\n if (this._voxelizationInProgress) {\n return;\n }\n this._stopVoxelization();\n this._voxelizationInProgress = true;\n\n if (this._engine.isWebGPU) {\n // Route through the opacity accumulator only when Gaussian splats are present (they need\n // non-binary accumulation). Regular-mesh-only voxelization writes the grid directly.\n const useBuffer = _HasGaussianSplatting(includedMeshes);\n if (useBuffer) {\n this._ensureVoxelOpacityAccumulator();\n }\n if (useBuffer !== this._useOpacityBuffer) {\n this._useOpacityBuffer = useBuffer;\n this._voxelMaterial.setDefine(\"IBL_VOXEL_OPACITY_BUFFER\", useBuffer);\n }\n }\n\n if (this._engine.isWebGPU) {\n this._voxelGridRT.renderList = includedMeshes;\n this._addRTsForRender([this._voxelGridRT], includedMeshes, 0);\n } else if (this._triPlanarVoxelization) {\n this._addRTsForRender(this._voxelMrtsXaxis, includedMeshes, 0);\n this._addRTsForRender(this._voxelMrtsYaxis, includedMeshes, 1);\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n } else {\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n }\n if (registerAfterRenderObservable) {\n this._renderVoxelGridBound = this._renderVoxelGrid.bind(this);\n this._scene.onAfterRenderObservable.add(this._renderVoxelGridBound);\n }\n }\n\n /**\n * Advances voxelization work when running in custom render loops (for example FrameGraph tasks)\n * where scene onAfterRender timing may differ from classic pipeline flow.\n */\n public processVoxelization(): void {\n this._renderVoxelGrid();\n }\n\n private _renderVoxelGridBound: () => void;\n\n private _renderVoxelGrid() {\n if (this._voxelizationInProgress) {\n // Wait for shadow-casting GaussianSplatting meshes' depth sort to settle before\n // rasterizing. Voxelization is order-independent — the order splats are drawn never\n // affects the grid — but the GS voxel draw still *indexes* each splat through the\n // `splatIndex` thin-instance buffer, and that buffer is (re)sized, filled and rebound by\n // the sort worker's callback (the same callback that flips `_isDepthSortSettled`). After\n // addPart() merges a splat, `forcedInstanceCount` jumps to the new total synchronously\n // but the index buffer is only finalized when the sort lands; rasterizing in between\n // indexes a stale/mismatched buffer and writes an empty grid (no IBL shadow until a\n // later refresh). Frame-capped so a continuously re-sorting (orbiting) splat still\n // voxelizes eventually rather than blocking forever.\n let gsSortPending = false;\n for (let i = 0; i < this._renderTargets.length && !gsSortPending; i++) {\n const renderList = this._renderTargets[i].renderList;\n if (!renderList) {\n continue;\n }\n for (const mesh of renderList) {\n if (_IsGaussianSplattingMesh(mesh) && !(mesh as GaussianSplattingMesh)._isDepthSortSettled) {\n gsSortPending = true;\n break;\n }\n }\n }\n if (gsSortPending && this._sortSettleWaitFrames < _MaxSortSettleWaitFrames) {\n this._sortSettleWaitFrames++;\n return;\n }\n this._sortSettleWaitFrames = 0;\n\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n for (let i = 0; i < this._renderTargets.length; i++) {\n const rttReady = this._renderTargets[i].isReadyForRendering();\n allReady &&= rttReady;\n }\n for (const gsVoxelMat of Array.from(this._gsVoxelMaterialCache.values())) {\n allReady &&= gsVoxelMat.isReady();\n }\n if (!allReady) {\n return;\n }\n\n const copyMipEffect = this._copyMipEffectWrapper.effect;\n if (!copyMipEffect.isReady()) {\n return;\n }\n\n if (this._engine.isWebGPU) {\n if (this._useOpacityBuffer) {\n // The copy compute must be ready before we voxelize, else the grid stays unpopulated.\n if (!this._copyBufferToGridCompute || !this._copyBufferToGridCompute.isReady()) {\n return;\n }\n // Reset the accumulator. clear() is a command-encoder op, so it must run before any\n // render pass opens (here, not mid-render).\n this._voxelOpacityBuffer?.clear();\n } else if (this._voxelGrid && this._voxelGrid.renderTarget) {\n // Direct mode (no splats): regular meshes textureStore into the grid, so clear each\n // layer first.\n for (let layer = 0; layer < this._voxelResolution; layer++) {\n this._engine.bindFramebuffer(this._voxelGrid.renderTarget, 0, undefined, undefined, true, 0, layer);\n this._engine.clear(this._voxelClearColor, true, false, false);\n this._engine.unBindFramebuffer(this._voxelGrid.renderTarget, true);\n }\n }\n }\n\n for (const rt of this._renderTargets) {\n rt.render();\n }\n this._stopVoxelization();\n\n if (this._engine.isWebGPU) {\n if (this._useOpacityBuffer) {\n // Decode the atomically-accumulated opacity buffer into the r8 voxel grid (mip 0).\n this._copyVoxelOpacityBufferToGrid();\n }\n } else if (this._triPlanarVoxelization) {\n this._combinedVoxelGridPT.render();\n }\n this._generateMipMaps();\n this._copyMipMaps();\n this._scene.onAfterRenderObservable.removeCallback(this._renderVoxelGridBound);\n this._voxelizationInProgress = false;\n this.onVoxelizationCompleteObservable.notifyObservers();\n }\n }\n\n /**\n * Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render\n * (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.\n * @param rtt - the render target texture to install the custom render function on\n */\n private _installVoxelMixedCustomRender(rtt: RenderTargetTexture): void {\n const scene = this._scene;\n const engine = scene.getEngine();\n\n const renderGsSplat = (sm: SubMesh): void => {\n const renderingMesh = sm.getRenderingMesh();\n const effectiveMesh = sm.getEffectiveMesh();\n const gsVoxelMaterial = this._gsVoxelMaterialCache.get(effectiveMesh.uniqueId);\n if (!gsVoxelMaterial || !gsVoxelMaterial.isReady()) {\n return;\n }\n\n const drawWrapper = gsVoxelMaterial._getDrawWrapper();\n if (!drawWrapper?.effect) {\n return;\n }\n const effect = drawWrapper.effect;\n\n const batch = renderingMesh._getInstancesRenderList(sm._id, !!sm.getReplacementMesh());\n if (batch.mustReturn) {\n return;\n }\n\n const hardwareInstancedRendering =\n engine.getCaps().instancedArrays && ((batch.visibleInstances[sm._id] !== null && batch.visibleInstances[sm._id] !== undefined) || renderingMesh.hasThinInstances);\n\n const fillMode = sm.getMaterial()?.fillMode ?? Constants.MATERIAL_TriangleFillMode;\n engine.enableEffect(drawWrapper);\n renderingMesh._bind(sm, effect, fillMode);\n gsVoxelMaterial._preBind(drawWrapper);\n gsVoxelMaterial.bind(effectiveMesh.getWorldMatrix(), effectiveMesh, effect);\n // If rotation/scale textures are missing, bind() logged the warning; skip the draw to avoid GPU errors.\n if (!(effectiveMesh as GaussianSplattingMesh).rotationsATexture) {\n gsVoxelMaterial.unbind();\n return;\n }\n if (engine.isWebGPU) {\n // A GSplat is a 3D Gaussian ellipsoid. To approximate its volume in the voxel grid\n // we rasterize three planar cross-section quads — one per principal axis — each\n // spanning the ellipsoid cross-section perpendicular to that axis. A quad rendered\n // edge-on produces zero fragments, so we draw once per world axis: each draw lets\n // computeVoxelSplatWorldPos pick the quad whose normal best aligns with that view,\n // guaranteeing every splat is captured face-on from at least one direction.\n const viewMatrices = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES;\n for (let axisIdx = 0; axisIdx < 3; axisIdx++) {\n effect.setMatrix(\"viewMatrix\", viewMatrices[axisIdx]);\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => {\n effect.setMatrix(\"world\", world);\n });\n }\n } else {\n // Accumulate overlapping splats with a MAX blend equation (dst = max(src, dst)) so each\n // cell keeps the strongest occluder; writing 0.0 into non-slab draw buffers is a no-op.\n // Matches the WebGPU atomicMax path; see the opacity-compositing limitation in\n // iblVoxelOpacityAtomicMax.\n const previousAlphaMode = engine.getAlphaMode();\n engine.setAlphaMode(Constants.ALPHA_MAX, true);\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => effect.setMatrix(\"world\", world));\n engine.setAlphaMode(previousAlphaMode, true);\n }\n gsVoxelMaterial.unbind();\n };\n\n const processBucket = (subMeshes: SmartArray<SubMesh>, enableAlphaMode: boolean): void => {\n for (let i = 0; i < subMeshes.length; i++) {\n const sm = subMeshes.data[i];\n const effective = sm.getEffectiveMesh();\n if (_IsGaussianSplattingMesh(effective)) {\n renderGsSplat(sm);\n } else {\n sm.render(enableAlphaMode);\n }\n }\n };\n\n rtt.customRenderFunction = (\n opaqueSubMeshes: SmartArray<SubMesh>,\n alphaTestSubMeshes: SmartArray<SubMesh>,\n transparentSubMeshes: SmartArray<SubMesh>,\n depthOnlySubMeshes: SmartArray<SubMesh>\n ): void => {\n if (depthOnlySubMeshes.length) {\n engine.setColorWrite(false);\n processBucket(depthOnlySubMeshes, false);\n engine.setColorWrite(true);\n }\n processBucket(opaqueSubMeshes, false);\n processBucket(alphaTestSubMeshes, false);\n processBucket(transparentSubMeshes, true);\n };\n }\n\n private _addGsMeshToVoxelRT(mrt: RenderTargetTexture, mesh: GaussianSplattingMesh): void {\n let gsVoxelMaterial = this._gsVoxelMaterialCache.get(mesh.uniqueId);\n if (!gsVoxelMaterial) {\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\n if (!gsMaterial) {\n return;\n }\n const shaderLanguage = this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\n gsVoxelMaterial = gsMaterial.makeVoxelRenderingMaterial(this._scene, shaderLanguage, this._maxDrawBuffers, mesh.isCompound);\n this._gsVoxelMaterialCache.set(mesh.uniqueId, gsVoxelMaterial);\n }\n mrt.renderList?.push(mesh as Mesh);\n mrt.setMaterialForRendering(mesh as Mesh, gsVoxelMaterial);\n }\n\n private _addRTsForRender(mrts: RenderTargetTexture[], includedMeshes: Mesh[], axis: number) {\n const slabSize = 1.0 / this._computeNumberOfSlabs();\n const voxelMaterial = this._voxelMaterial;\n\n // We need to update the world scale uniform for every mesh being rendered to the voxel grid.\n for (let mrtIndex = 0; mrtIndex < mrts.length; mrtIndex++) {\n const mrt = mrts[mrtIndex];\n mrt._disableEngineStages = true;\n mrt.useCameraPostProcesses = false;\n mrt.renderParticles = false;\n mrt.renderSprites = false;\n mrt.enableOutlineRendering = false;\n\n const renderBucket = (bucket: SmartArray<SubMesh>) => {\n for (let index = 0; index < bucket.length; index++) {\n const subMesh = bucket.data[index];\n if (subMesh.getMaterial() !== voxelMaterial) {\n continue;\n }\n subMesh.render(false);\n }\n };\n\n mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n renderBucket(depthOnlySubMeshes);\n renderBucket(opaqueSubMeshes);\n renderBucket(alphaTestSubMeshes);\n renderBucket(transparentSubMeshes);\n };\n\n mrt.renderList = [];\n const nearPlane = mrtIndex * slabSize;\n const farPlane = (mrtIndex + 1) * slabSize;\n const stepSize = slabSize / this._maxDrawBuffers;\n\n const viewMatrix = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES[axis];\n mrt.onBeforeRenderObservable.clear();\n mrt.onBeforeRenderObservable.add(() => {\n voxelMaterial.setMatrix(\"viewMatrix\", viewMatrix);\n voxelMaterial.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n voxelMaterial.setFloat(\"nearPlane\", nearPlane);\n voxelMaterial.setFloat(\"farPlane\", farPlane);\n voxelMaterial.setFloat(\"stepSize\", stepSize);\n if (this._engine.isWebGPU) {\n this._voxelMaterial.useVertexPulling = true;\n this._voxelMaterial.setTexture(\"voxel_storage\", this.getVoxelGrid());\n if (this._voxelOpacityBuffer) {\n this._voxelMaterial.setStorageBuffer(\"voxelOpacityBuffer\", this._voxelOpacityBuffer);\n }\n }\n // Push per-slab uniforms to each GS voxel material in this MRT's render list.\n for (const m of mrt.renderList ?? []) {\n if (_IsGaussianSplattingMesh(m)) {\n const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);\n if (gsVoxelMat) {\n gsVoxelMat.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n if (this._engine.isWebGPU) {\n // WGSL GS voxel shader uses the same viewMatrix approach as WebGL; the per-axis viewMatrix is set per-draw in renderGsSplat.\n gsVoxelMat.setTexture(\"voxel_storage\", this.getVoxelGrid());\n if (this._voxelOpacityBuffer) {\n gsVoxelMat.setStorageBuffer(\"voxelOpacityBuffer\", this._voxelOpacityBuffer);\n }\n } else {\n gsVoxelMat.setMatrix(\"viewMatrix\", viewMatrix);\n gsVoxelMat.setFloat(\"nearPlane\", nearPlane);\n gsVoxelMat.setFloat(\"farPlane\", farPlane);\n gsVoxelMat.setFloat(\"stepSize\", stepSize);\n }\n }\n }\n }\n });\n\n // Set this material on every mesh in the scene (for this RT)\n if (includedMeshes.length === 0) {\n return;\n }\n for (const mesh of includedMeshes) {\n if (!mesh) {\n continue;\n }\n if (_IsGaussianSplattingMesh(mesh)) {\n this._addGsMeshToVoxelRT(mrt, mesh as GaussianSplattingMesh);\n } else if (mesh.subMeshes && mesh.subMeshes.length > 0) {\n mrt.renderList?.push(mesh);\n mrt.setMaterialForRendering(mesh, voxelMaterial);\n }\n const meshes = mesh.getChildMeshes();\n for (const childMesh of meshes) {\n if (_IsGaussianSplattingMesh(childMesh)) {\n this._addGsMeshToVoxelRT(mrt, childMesh as GaussianSplattingMesh);\n } else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {\n mrt.renderList?.push(childMesh);\n mrt.setMaterialForRendering(childMesh, voxelMaterial);\n }\n }\n }\n\n this._installVoxelMixedCustomRender(mrt);\n }\n\n this._renderTargets = this._renderTargets.concat(mrts);\n }\n\n /**\n * Called by the pipeline to resize resources.\n */\n public resize() {}\n\n /**\n * Disposes the voxel renderer and associated resources\n */\n public dispose() {\n this._disposeVoxelTextures();\n for (const mat of Array.from(this._gsVoxelMaterialCache.values())) {\n mat.dispose();\n }\n this._gsVoxelMaterialCache.clear();\n }\n}\n"]}
|
|
@@ -7,6 +7,7 @@ import { SmartArray } from "../Misc/smartArray.js";
|
|
|
7
7
|
import { SceneComponentConstants } from "../sceneComponent.js";
|
|
8
8
|
import { BoundingBox } from "../Culling/boundingBox.js";
|
|
9
9
|
import { Material } from "../Materials/material.pure.js";
|
|
10
|
+
import { MaterialHelperGeometryRendering } from "../Materials/materialHelper.geometryrendering.js";
|
|
10
11
|
import { ShaderMaterial } from "../Materials/shaderMaterial.pure.js";
|
|
11
12
|
import { Color3 } from "../Maths/math.color.pure.js";
|
|
12
13
|
import { Observable } from "../Misc/observable.pure.js";
|
|
@@ -256,7 +257,7 @@ export class BoundingBoxRenderer {
|
|
|
256
257
|
* @param renderingGroupId defines the rendering group to render
|
|
257
258
|
*/
|
|
258
259
|
render(renderingGroupId) {
|
|
259
|
-
if (this.renderList.length === 0 || !this.enabled) {
|
|
260
|
+
if (this.renderList.length === 0 || !this.enabled || !MaterialHelperGeometryRendering._BindColorAttachments(this.scene.getEngine())) {
|
|
260
261
|
return;
|
|
261
262
|
}
|
|
262
263
|
if (this._useInstances) {
|