@onerjs/core 8.56.4 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +13 -2
- 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/Native/nativeHardwareTexture.d.ts +8 -1
- package/Engines/Native/nativeHardwareTexture.js +7 -0
- package/Engines/Native/nativeHardwareTexture.js.map +1 -1
- package/Engines/Native/nativeHelpers.js +56 -1
- package/Engines/Native/nativeHelpers.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +37 -8
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativeRenderTargetWrapper.d.ts +40 -0
- package/Engines/Native/nativeRenderTargetWrapper.js +265 -5
- package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
- package/Engines/Processors/shaderCodeCursor.d.ts +1 -0
- package/Engines/Processors/shaderCodeCursor.js +40 -3
- package/Engines/Processors/shaderCodeCursor.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/engine.renderTarget.pure.js +1 -0
- package/Engines/WebGPU/Extensions/engine.renderTarget.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 +17 -1
- package/Engines/abstractEngine.pure.js +17 -5
- 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/engine.pure.d.ts +0 -1
- package/Engines/engine.pure.js +0 -7
- package/Engines/engine.pure.js.map +1 -1
- package/Engines/nativeEngine.pure.js +1 -1
- package/Engines/nativeEngine.pure.js.map +1 -1
- package/Engines/thinEngine.pure.d.ts +15 -0
- package/Engines/thinEngine.pure.js +61 -14
- package/Engines/thinEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +218 -17
- package/Engines/thinNativeEngine.pure.js +1438 -165
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/thinWebGPUEngine.d.ts +4 -0
- package/Engines/thinWebGPUEngine.js +16 -2
- package/Engines/thinWebGPUEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +17 -3
- package/Engines/webgpuEngine.pure.js +56 -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/Transformers/flowGraphJsonPointerParserBlock.pure.d.ts +10 -0
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js +24 -12
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.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/Data/flowGraphGetPropertyBlock.pure.d.ts +7 -0
- package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.js +43 -0
- package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.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 +18 -4
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +24 -6
- 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/flowGraphInterpolationBlock.pure.js +3 -3
- package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +20 -2
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +85 -25
- 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/ControlFlow/flowGraphCancelDelayBlock.pure.d.ts +12 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +8 -0
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js +4 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.d.ts +12 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.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/Blocks/Execution/flowGraphSetPropertyBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js +14 -2
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.d.ts +5 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js +23 -8
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js.map +1 -1
- package/FlowGraph/CustomTypes/flowGraphInteger.pure.d.ts +5 -0
- package/FlowGraph/CustomTypes/flowGraphInteger.pure.js +7 -0
- package/FlowGraph/CustomTypes/flowGraphInteger.pure.js.map +1 -1
- package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +10 -0
- package/FlowGraph/CustomTypes/flowGraphMatrix.js +14 -0
- package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
- package/FlowGraph/flowGraph.d.ts +6 -1
- package/FlowGraph/flowGraph.js +41 -9
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphAnimationHelpers.d.ts +24 -0
- package/FlowGraph/flowGraphAnimationHelpers.js +21 -0
- package/FlowGraph/flowGraphAnimationHelpers.js.map +1 -0
- 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 +5 -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/flowGraphValidator.js +0 -4
- package/FlowGraph/flowGraphValidator.js.map +1 -1
- package/FlowGraph/index.d.ts +2 -0
- package/FlowGraph/index.js +2 -0
- package/FlowGraph/index.js.map +1 -1
- package/FlowGraph/pure.d.ts +2 -0
- package/FlowGraph/pure.js +2 -0
- package/FlowGraph/pure.js.map +1 -1
- package/FlowGraph/serialization.d.ts +4 -2
- package/FlowGraph/serialization.js +12 -24
- package/FlowGraph/serialization.js.map +1 -1
- package/FlowGraph/typeDefinitions.d.ts +9 -1
- 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/Textures/minMaxReducerBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js +4 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.d.ts +54 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js +155 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js.map +1 -0
- package/FrameGraph/Node/Blocks/Textures/pure.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Textures/pure.js +1 -0
- package/FrameGraph/Node/Blocks/Textures/pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/allBlocks.pure.js +4 -0
- package/FrameGraph/Node/Blocks/allBlocks.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/index.d.ts +2 -0
- package/FrameGraph/Node/Blocks/index.js +2 -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 +2 -0
- package/FrameGraph/Node/Blocks/pure.js +2 -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/Misc/minMaxReducerTask.d.ts +62 -0
- package/FrameGraph/Tasks/Misc/minMaxReducerTask.js +159 -0
- package/FrameGraph/Tasks/Misc/minMaxReducerTask.js.map +1 -0
- 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 +72 -34
- 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/frameGraph.d.ts +4 -0
- package/FrameGraph/frameGraph.js +14 -0
- package/FrameGraph/frameGraph.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 +2 -0
- package/FrameGraph/index.js +2 -0
- package/FrameGraph/index.js.map +1 -1
- package/FrameGraph/pure.d.ts +2 -0
- package/FrameGraph/pure.js +2 -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/Lights/Clustered/clusteredLightingSceneComponent.pure.d.ts +5 -0
- package/Lights/Clustered/clusteredLightingSceneComponent.pure.js +22 -1
- package/Lights/Clustered/clusteredLightingSceneComponent.pure.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.js +7 -3
- package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.d.ts +7 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js +8 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.d.ts +54 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js +81 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.d.ts +7 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js +8 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.d.ts +60 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js +90 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +31 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +103 -5
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +6 -6
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +26 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +153 -49
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.d.ts +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js +4 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.d.ts +83 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js +191 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.d.ts +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js +4 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.d.ts +62 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js +125 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js +5 -5
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/pure.d.ts +4 -0
- package/Materials/GaussianSplatting/pure.js +4 -0
- package/Materials/GaussianSplatting/pure.js.map +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.d.ts +1 -0
- package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.js +12 -0
- package/Materials/Node/Blocks/Dual/imageSourceBlock.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 +14 -14
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js +37 -13
- 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/mirrorTexture.pure.js +3 -1
- package/Materials/Textures/mirrorTexture.pure.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/texture.pure.js +1 -1
- package/Materials/Textures/texture.pure.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/effectRenderer.pure.d.ts +4 -0
- package/Materials/effectRenderer.pure.js +3 -2
- package/Materials/effectRenderer.pure.js.map +1 -1
- package/Materials/index.d.ts +5 -0
- package/Materials/index.js +5 -0
- package/Materials/index.js.map +1 -1
- package/Materials/material.pure.js +25 -12
- package/Materials/material.pure.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 +5 -0
- package/Materials/pure.js +5 -0
- package/Materials/pure.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +10 -0
- package/Materials/standardMaterial.pure.js +30 -5
- package/Materials/standardMaterial.pure.js.map +1 -1
- package/Meshes/Builders/polygonBuilder.pure.d.ts +4 -0
- package/Meshes/Builders/polygonBuilder.pure.js +3 -0
- package/Meshes/Builders/polygonBuilder.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.d.ts +8 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.js +11 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.d.ts +231 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js +1212 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.d.ts +14 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js +15 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.d.ts +285 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js +812 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js.map +1 -0
- 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.d.ts +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +2 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +163 -14
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +239 -24
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +34 -4
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +125 -25
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/pure.d.ts +2 -0
- package/Meshes/GaussianSplatting/pure.js +2 -0
- package/Meshes/GaussianSplatting/pure.js.map +1 -1
- package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js +25 -11
- package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js.map +1 -1
- package/Meshes/abstractMesh.pure.d.ts +30 -0
- package/Meshes/abstractMesh.pure.js +54 -0
- package/Meshes/abstractMesh.pure.js.map +1 -1
- package/Meshes/index.d.ts +2 -0
- package/Meshes/index.js +2 -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 +2 -0
- package/Meshes/pure.js +2 -0
- package/Meshes/pure.js.map +1 -1
- package/Meshes/subMesh.pure.d.ts +11 -2
- package/Meshes/subMesh.pure.js +20 -5
- package/Meshes/subMesh.pure.js.map +1 -1
- package/Meshes/thinInstanceMesh.pure.js +1 -0
- package/Meshes/thinInstanceMesh.pure.js.map +1 -1
- package/Misc/andOrNotEvaluator.js +4 -0
- package/Misc/andOrNotEvaluator.js.map +1 -1
- package/Misc/fileTools.pure.js +21 -0
- package/Misc/fileTools.pure.js.map +1 -1
- package/Misc/minMaxReducer.pure.d.ts +6 -0
- package/Misc/minMaxReducer.pure.js +10 -0
- package/Misc/minMaxReducer.pure.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +2 -2
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Misc/thinMinMaxReducer.d.ts +19 -2
- package/Misc/thinMinMaxReducer.js +74 -21
- package/Misc/thinMinMaxReducer.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js +19 -7
- package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js.map +1 -1
- package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js +3 -2
- package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +4 -0
- package/Particles/gpuParticleSystem.pure.js +101 -32
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/Particles/particle.js +3 -2
- package/Particles/particle.js.map +1 -1
- package/Particles/solidParticleSystem.js +7 -1
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.function.d.ts +6 -0
- package/Particles/thinParticleSystem.function.js +144 -88
- package/Particles/thinParticleSystem.function.js.map +1 -1
- package/Particles/thinParticleSystem.pure.d.ts +8 -0
- package/Particles/thinParticleSystem.pure.js +154 -28
- 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/Physics/v2/ragdoll.d.ts +2 -4
- package/Physics/v2/ragdoll.js +11 -4
- package/Physics/v2/ragdoll.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.d.ts +12 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +50 -25
- 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.d.ts +9 -0
- package/Rendering/depthRenderer.pure.js +15 -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 +14 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js +26 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +13 -3
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +22 -9
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -0
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.d.ts +38 -4
- package/Rendering/geometryBufferRenderer.pure.js +130 -18
- 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/prePassRenderer.pure.js +3 -3
- package/Rendering/prePassRenderer.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/gaussianSplatting.js +3 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- 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/lightsFragmentFunctions.js +27 -3
- package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/mrtFragmentDeclaration.js +89 -0
- package/Shaders/ShadersInclude/mrtFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/oitDeclaration.js +1 -1
- package/Shaders/ShadersInclude/oitDeclaration.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/minmaxRedux.fragment.js +6 -1
- package/Shaders/minmaxRedux.fragment.js.map +1 -1
- 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/gaussianPointSplatting.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js +65 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js +17 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +6 -78
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js +2 -2
- package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.js +79 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.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/lightsFragmentFunctions.js +27 -3
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.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/gaussianPointSplattingBlit.fragment.d.ts +5 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js +22 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js.map +1 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.vertex.d.ts +5 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js +19 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js.map +1 -0
- package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.d.ts +5 -0
- package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js +21 -0
- package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js.map +1 -0
- package/ShadersWGSL/gaussianSplatting.fragment.js +63 -2
- package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +82 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +2 -1
- package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +37 -2
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/gpsHiZBuild.compute.d.ts +5 -0
- package/ShadersWGSL/gpsHiZBuild.compute.js +16 -0
- package/ShadersWGSL/gpsHiZBuild.compute.js.map +1 -0
- package/ShadersWGSL/gpsPartition.compute.d.ts +5 -0
- package/ShadersWGSL/gpsPartition.compute.js +27 -0
- package/ShadersWGSL/gpsPartition.compute.js.map +1 -0
- package/ShadersWGSL/gpsPreprocess.compute.d.ts +5 -0
- package/ShadersWGSL/gpsPreprocess.compute.js +86 -0
- package/ShadersWGSL/gpsPreprocess.compute.js.map +1 -0
- package/ShadersWGSL/gpsResolve.compute.d.ts +5 -0
- package/ShadersWGSL/gpsResolve.compute.js +41 -0
- package/ShadersWGSL/gpsResolve.compute.js.map +1 -0
- package/ShadersWGSL/gpsScanAdd.compute.d.ts +5 -0
- package/ShadersWGSL/gpsScanAdd.compute.js +22 -0
- package/ShadersWGSL/gpsScanAdd.compute.js.map +1 -0
- package/ShadersWGSL/gpsScanBlocks.compute.d.ts +5 -0
- package/ShadersWGSL/gpsScanBlocks.compute.js +23 -0
- package/ShadersWGSL/gpsScanBlocks.compute.js.map +1 -0
- package/ShadersWGSL/gpsScanSums.compute.d.ts +5 -0
- package/ShadersWGSL/gpsScanSums.compute.js +30 -0
- package/ShadersWGSL/gpsScanSums.compute.js.map +1 -0
- package/ShadersWGSL/gpsSplat.compute.d.ts +5 -0
- package/ShadersWGSL/gpsSplat.compute.js +37 -0
- package/ShadersWGSL/gpsSplat.compute.js.map +1 -0
- 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/minmaxRedux.fragment.js +20 -3
- package/ShadersWGSL/minmaxRedux.fragment.js.map +1 -1
- 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/features/WebXRSpaceWarp.pure.js +2 -1
- package/XR/features/WebXRSpaceWarp.pure.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/assetContainer.d.ts +1 -0
- package/assetContainer.js +5 -1
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.d.ts +36 -2
- package/scene.pure.js +63 -4
- package/scene.pure.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinMeshBlendingPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinMeshBlendingPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer.pure\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine.pure\";\r\nimport { type EffectWrapperCreationOptions } from \"../Materials/effectRenderer\";\r\nimport { type RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { type Camera } from \"../Cameras/camera.pure\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Matrix } from \"../Maths/math.vector.pure\";\r\nimport { _IsMeshBlendingSupported } from \"../Meshes/meshBlendingTag\";\r\nimport { _CreateMeshBlendBlueNoiseTexture } from \"./meshBlendingBlueNoise\";\r\n\r\n/**\r\n * Quality level used by mesh blending.\r\n *\r\n * Each value selects a separate compile-time shader variant. Medium is the default.\r\n */\r\nexport enum MeshBlendQuality {\r\n /** Three search directions with the lowest refinement and exact-boundary sample counts, using sRGB color interpolation. */\r\n Low = 0,\r\n /** Three search directions with balanced refinement and exact-boundary sample counts, using OKLab color interpolation. */\r\n Medium = 1,\r\n /** Three search directions with OKLab interpolation, full rotation, close-neighbor fallback, tiny-object protection, and multi-target blending. */\r\n High = 2,\r\n /** Eight search directions with OKLab interpolation and the largest radial and exact-boundary sample counts. */\r\n Cinematic = 3,\r\n}\r\n\r\n/**\r\n * Debug visualization produced by mesh blending.\r\n */\r\nexport enum MeshBlendDebugMode {\r\n /** Render the blended scene color. */\r\n Off = 0,\r\n /** Visualize the packed group and radius-class tag. */\r\n PackedTag = 1,\r\n /** Visualize the refined candidate direction and normalized boundary distance. */\r\n CandidateDirectionDistance = 2,\r\n /** Visualize the selected radius class and the resulting seam fade. */\r\n SeamFade = 3,\r\n /** Visualize why a candidate was accepted or rejected by contact validation. */\r\n RejectionReason = 4,\r\n /** Visualize the approximate amount of shader work performed by each pixel. */\r\n StageWork = 5,\r\n /** Visualize target continuation success, fallback use, and rejection. */\r\n Continuation = 6,\r\n /** Visualize the effective-radius reduction applied to thin projected objects. */\r\n TinyObject = 7,\r\n /** Visualize primary-only and secondary-target selections at multi-mesh junctions. */\r\n MultiTarget = 8,\r\n /** Visualize the farther, boundary-plus-one, boundary-plus-two, and constructed target-color samples. */\r\n TargetColor = 9,\r\n /** Visualize the fade attenuation applied by the base-color shadow-transfer heuristic. Neutral when no base-color texture is provided. */\r\n ShadowAttenuation = 10,\r\n /** Visualize the active color-interpolation mode after target-color construction. */\r\n ColorInterpolation = 11,\r\n /** Visualize the reconstructed world position. */\r\n WorldPosition = 12,\r\n}\r\n\r\n/**\r\n * Depth representation consumed by mesh blending.\r\n */\r\nexport enum MeshBlendDepthType {\r\n /** Signed camera-space Z written by the geometry renderer's view-depth output. */\r\n View = 0,\r\n /** Hardware depth in the normalized screen-depth range. */\r\n Screen = 1,\r\n}\r\n\r\n/**\r\n * Radius values associated with one mesh-blending radius class.\r\n */\r\nexport interface IMeshBlendRadiusDefinition {\r\n /** Authored blend radius in Babylon world units. */\r\n worldRadius: number;\r\n /** Minimum search radius in physical render-target pixels. */\r\n minimumProjectedRadius: number;\r\n}\r\n\r\n/**\r\n * The four radius definitions indexed by the packed mesh-blending radius class.\r\n */\r\nexport type MeshBlendRadiusDefinitions = readonly [IMeshBlendRadiusDefinition, IMeshBlendRadiusDefinition, IMeshBlendRadiusDefinition, IMeshBlendRadiusDefinition];\r\n\r\nconst _MeshBlendingEffectWrapperOwners = new WeakMap<ThinMeshBlendingPostProcess, object>();\r\n\r\n/**\r\n * Checks whether a thin mesh-blending wrapper is already exclusively owned.\r\n * @param wrapper Wrapper to check.\r\n * @returns Whether the wrapper already has an owner.\r\n * @internal\r\n */\r\nexport function _IsMeshBlendingEffectWrapperOwned(wrapper: ThinMeshBlendingPostProcess): boolean {\r\n return _MeshBlendingEffectWrapperOwners.has(wrapper);\r\n}\r\n\r\n/**\r\n * Claims exclusive ownership of a thin mesh-blending wrapper.\r\n * @param wrapper Wrapper to claim.\r\n * @param owner Owner claiming the wrapper.\r\n * @internal\r\n */\r\nexport function _ClaimMeshBlendingEffectWrapper(wrapper: ThinMeshBlendingPostProcess, owner: object): void {\r\n if (_MeshBlendingEffectWrapperOwners.has(wrapper)) {\r\n throw new Error(\"ThinMeshBlendingPostProcess is already attached to another owner\");\r\n }\r\n _MeshBlendingEffectWrapperOwners.set(wrapper, owner);\r\n}\r\n\r\n/**\r\n * Releases exclusive ownership of a thin mesh-blending wrapper.\r\n * @param wrapper Wrapper to release.\r\n * @param owner Owner releasing the wrapper.\r\n * @internal\r\n */\r\nexport function _ReleaseMeshBlendingEffectWrapper(wrapper: ThinMeshBlendingPostProcess, owner: object): void {\r\n if (_MeshBlendingEffectWrapperOwners.get(wrapper) === owner) {\r\n _MeshBlendingEffectWrapperOwners.delete(wrapper);\r\n }\r\n}\r\n\r\nfunction _ValidateWorldRadius(value: number): void {\r\n if (!Number.isFinite(value) || value < 0) {\r\n throw new RangeError(\"Mesh-blending world radii must be finite non-negative numbers.\");\r\n }\r\n}\r\n\r\nfunction _ValidateMinimumProjectedRadius(value: number): void {\r\n if (!Number.isFinite(value) || value < 0) {\r\n throw new RangeError(\"Mesh-blending minimum projected radii must be finite non-negative numbers.\");\r\n }\r\n}\r\n\r\nfunction _CreateValidatedRadiusDefinition(worldRadius: number, minimumProjectedRadius: number): IMeshBlendRadiusDefinition {\r\n let validatedWorldRadius = 0;\r\n let validatedMinimumProjectedRadius = 0;\r\n const definition = {} as IMeshBlendRadiusDefinition;\r\n\r\n Object.defineProperties(definition, {\r\n worldRadius: {\r\n enumerable: true,\r\n get: () => validatedWorldRadius,\r\n set: (value: number) => {\r\n _ValidateWorldRadius(value);\r\n validatedWorldRadius = value;\r\n },\r\n },\r\n minimumProjectedRadius: {\r\n enumerable: true,\r\n get: () => validatedMinimumProjectedRadius,\r\n set: (value: number) => {\r\n _ValidateMinimumProjectedRadius(value);\r\n validatedMinimumProjectedRadius = value;\r\n },\r\n },\r\n });\r\n definition.worldRadius = worldRadius;\r\n definition.minimumProjectedRadius = minimumProjectedRadius;\r\n return definition;\r\n}\r\n\r\n/**\r\n * Configurable mesh-blending values shared by the classic and frame-graph wrappers.\r\n */\r\nexport interface IMeshBlendConfiguration {\r\n /** Compile-time quality variant. */\r\n quality?: MeshBlendQuality;\r\n /** Radius definitions indexed by packed radius class. Exactly four definitions are required. */\r\n radiusClasses?: readonly [IMeshBlendRadiusDefinition, IMeshBlendRadiusDefinition, IMeshBlendRadiusDefinition, IMeshBlendRadiusDefinition];\r\n /** Contact-slope narrowing factor. A value of 1 disables narrowing. */\r\n slopeFactor?: number;\r\n /** Representation stored in the depth texture. */\r\n depthType?: MeshBlendDepthType;\r\n /** Debug visualization to compile into the shader. Off renders the final blended result. */\r\n debugMode?: MeshBlendDebugMode;\r\n}\r\n\r\n/**\r\n * Options used to create a thin mesh-blending post process.\r\n */\r\nexport interface IThinMeshBlendingPostProcessOptions extends EffectWrapperCreationOptions, IMeshBlendConfiguration {}\r\n\r\n/**\r\n * Creates a new set of default mesh-blending radius definitions.\r\n * @returns Four independently mutable radius definitions ordered from small to extra large.\r\n */\r\nexport function CreateDefaultMeshBlendRadiusDefinitions(): MeshBlendRadiusDefinitions {\r\n return Object.freeze([\r\n _CreateValidatedRadiusDefinition(0.06, 1.5),\r\n _CreateValidatedRadiusDefinition(0.1, 3),\r\n _CreateValidatedRadiusDefinition(0.2, 3),\r\n _CreateValidatedRadiusDefinition(0.3, 5),\r\n ]) as MeshBlendRadiusDefinitions;\r\n}\r\n\r\ninterface IMeshBlendQualitySettings {\r\n directionCount: number;\r\n radialSampleCount: number;\r\n directionRefinementSampleCount: number;\r\n directionRefinementStepCount: number;\r\n exactEdgeSampleCount: number;\r\n radiusScale: number;\r\n fullRandomRotation: boolean;\r\n searchJitterFactor: number;\r\n immediateFourNeighborFallback: boolean;\r\n tinyObjectSafeguard: boolean;\r\n multiTargetSecondaryBlend: boolean;\r\n colorInterpolation: \"sRGB\" | \"OKLab\";\r\n}\r\n\r\ntype MeshBlendColorTuple = readonly [number, number, number];\r\n\r\nfunction _MeshBlendLinearToSrgbChannel(value: number): number {\r\n return value <= 0.0031308 ? value * 12.92 : 1.055 * Math.pow(value, 1 / 2.4) - 0.055;\r\n}\r\n\r\nfunction _MeshBlendSrgbToLinearChannel(value: number): number {\r\n return value <= 0.04045 ? value / 12.92 : Math.pow((value + 0.055) / 1.055, 2.4);\r\n}\r\n\r\n/**\r\n * Converts linear sRGB to Babylon mesh-blending OKLab coordinates.\r\n * @param color Linear sRGB color. HDR components are preserved.\r\n * @returns OKLab coordinates.\r\n * @see https://bottosson.github.io/posts/oklab/\r\n * @internal\r\n */\r\nexport function _LinearSrgbToMeshBlendOklab(color: MeshBlendColorTuple): [number, number, number] {\r\n const long = 0.4122214708 * color[0] + 0.5363325363 * color[1] + 0.0514459929 * color[2];\r\n const medium = 0.2119034982 * color[0] + 0.6806995451 * color[1] + 0.1073969566 * color[2];\r\n const short = 0.0883024619 * color[0] + 0.2817188376 * color[1] + 0.6299787005 * color[2];\r\n const longRoot = Math.cbrt(long);\r\n const mediumRoot = Math.cbrt(medium);\r\n const shortRoot = Math.cbrt(short);\r\n\r\n return [\r\n 0.2104542553 * longRoot + 0.793617785 * mediumRoot - 0.0040720468 * shortRoot,\r\n 1.9779984951 * longRoot - 2.428592205 * mediumRoot + 0.4505937099 * shortRoot,\r\n 0.0259040371 * longRoot + 0.7827717662 * mediumRoot - 0.808675766 * shortRoot,\r\n ];\r\n}\r\n\r\n/**\r\n * Converts Babylon mesh-blending OKLab coordinates to linear sRGB.\r\n * @param color OKLab coordinates.\r\n * @returns Linear sRGB color without gamut or HDR clamping.\r\n * @see https://bottosson.github.io/posts/oklab/\r\n * @internal\r\n */\r\nexport function _MeshBlendOklabToLinearSrgb(color: MeshBlendColorTuple): [number, number, number] {\r\n const longRoot = color[0] + 0.3963377774 * color[1] + 0.2158037573 * color[2];\r\n const mediumRoot = color[0] - 0.1055613458 * color[1] - 0.0638541728 * color[2];\r\n const shortRoot = color[0] - 0.0894841775 * color[1] - 1.291485548 * color[2];\r\n const long = longRoot * longRoot * longRoot;\r\n const medium = mediumRoot * mediumRoot * mediumRoot;\r\n const short = shortRoot * shortRoot * shortRoot;\r\n\r\n return [\r\n 4.0767416621 * long - 3.3077115913 * medium + 0.2309699292 * short,\r\n -1.2684380046 * long + 2.6097574011 * medium - 0.3413193965 * short,\r\n -0.0041960863 * long - 0.7034186147 * medium + 1.707614701 * short,\r\n ];\r\n}\r\n\r\n/**\r\n * Interpolates two linear SceneColor values using the selected mesh-blending quality policy.\r\n * @param current Current linear SceneColor.\r\n * @param target Target linear SceneColor.\r\n * @param amount Interpolation amount.\r\n * @param quality Mesh-blending quality that selects sRGB or OKLab interpolation.\r\n * @returns Interpolated linear SceneColor without HDR clamping.\r\n * @internal\r\n */\r\nexport function _InterpolateMeshBlendColor(current: MeshBlendColorTuple, target: MeshBlendColorTuple, amount: number, quality: MeshBlendQuality): [number, number, number] {\r\n const settings = _GetMeshBlendQualitySettings(quality);\r\n let currentColor: MeshBlendColorTuple;\r\n let targetColor: MeshBlendColorTuple;\r\n\r\n if (settings.colorInterpolation === \"sRGB\") {\r\n currentColor = [_MeshBlendLinearToSrgbChannel(current[0]), _MeshBlendLinearToSrgbChannel(current[1]), _MeshBlendLinearToSrgbChannel(current[2])];\r\n targetColor = [_MeshBlendLinearToSrgbChannel(target[0]), _MeshBlendLinearToSrgbChannel(target[1]), _MeshBlendLinearToSrgbChannel(target[2])];\r\n return [\r\n _MeshBlendSrgbToLinearChannel(currentColor[0] + (targetColor[0] - currentColor[0]) * amount),\r\n _MeshBlendSrgbToLinearChannel(currentColor[1] + (targetColor[1] - currentColor[1]) * amount),\r\n _MeshBlendSrgbToLinearChannel(currentColor[2] + (targetColor[2] - currentColor[2]) * amount),\r\n ];\r\n }\r\n\r\n currentColor = _LinearSrgbToMeshBlendOklab(current);\r\n targetColor = _LinearSrgbToMeshBlendOklab(target);\r\n return _MeshBlendOklabToLinearSrgb([\r\n currentColor[0] + (targetColor[0] - currentColor[0]) * amount,\r\n currentColor[1] + (targetColor[1] - currentColor[1]) * amount,\r\n currentColor[2] + (targetColor[2] - currentColor[2]) * amount,\r\n ]);\r\n}\r\n\r\nconst _MeshBlendQualitySettings: readonly Readonly<IMeshBlendQualitySettings>[] = [\r\n {\r\n directionCount: 3,\r\n radialSampleCount: 2,\r\n directionRefinementSampleCount: 1,\r\n directionRefinementStepCount: 2,\r\n exactEdgeSampleCount: 5,\r\n radiusScale: 0.5,\r\n fullRandomRotation: false,\r\n searchJitterFactor: 0.5,\r\n immediateFourNeighborFallback: false,\r\n tinyObjectSafeguard: false,\r\n multiTargetSecondaryBlend: false,\r\n colorInterpolation: \"sRGB\",\r\n },\r\n {\r\n directionCount: 3,\r\n radialSampleCount: 3,\r\n directionRefinementSampleCount: 2,\r\n directionRefinementStepCount: 4,\r\n exactEdgeSampleCount: 8,\r\n radiusScale: 0.9,\r\n fullRandomRotation: false,\r\n searchJitterFactor: 0.5,\r\n immediateFourNeighborFallback: false,\r\n tinyObjectSafeguard: false,\r\n multiTargetSecondaryBlend: false,\r\n colorInterpolation: \"OKLab\",\r\n },\r\n {\r\n directionCount: 3,\r\n radialSampleCount: 3,\r\n directionRefinementSampleCount: 3,\r\n directionRefinementStepCount: 5,\r\n exactEdgeSampleCount: 10,\r\n radiusScale: 1,\r\n fullRandomRotation: true,\r\n searchJitterFactor: 0.5,\r\n immediateFourNeighborFallback: true,\r\n tinyObjectSafeguard: true,\r\n multiTargetSecondaryBlend: true,\r\n colorInterpolation: \"OKLab\",\r\n },\r\n {\r\n directionCount: 8,\r\n radialSampleCount: 6,\r\n directionRefinementSampleCount: 4,\r\n directionRefinementStepCount: 5,\r\n exactEdgeSampleCount: 50,\r\n radiusScale: 0.95,\r\n fullRandomRotation: true,\r\n searchJitterFactor: 1,\r\n immediateFourNeighborFallback: true,\r\n tinyObjectSafeguard: true,\r\n multiTargetSecondaryBlend: true,\r\n colorInterpolation: \"OKLab\",\r\n },\r\n];\r\n\r\n/**\r\n * Gets the complete quality settings used to compile a mesh-blending shader variant.\r\n * @param quality Quality to inspect.\r\n * @returns The immutable settings for the quality.\r\n * @internal\r\n */\r\nexport function _GetMeshBlendQualitySettings(quality: MeshBlendQuality): Readonly<IMeshBlendQualitySettings> {\r\n const settings = _MeshBlendQualitySettings[quality];\r\n if (!settings || !Number.isInteger(quality)) {\r\n throw new RangeError(\"Mesh-blending quality must be Low, Medium, High, or Cinematic.\");\r\n }\r\n return settings;\r\n}\r\n\r\n/**\r\n * Gets the radius scale used by a mesh-blending quality level.\r\n * @param quality Quality to convert.\r\n * @returns The radius scale applied after projection and the minimum-pixel floor.\r\n * @internal\r\n */\r\nexport function _GetMeshBlendQualityRadiusScale(quality: MeshBlendQuality): number {\r\n return _GetMeshBlendQualitySettings(quality).radiusScale;\r\n}\r\n\r\n/**\r\n * Projects a world-space mesh-blending radius to physical render-target pixels.\r\n * @param worldRadius Radius in Babylon world units.\r\n * @param viewDepth Positive distance from the camera.\r\n * @param renderTargetHeight Physical render-target height.\r\n * @param projectionYScale Absolute Y scale from the projection matrix.\r\n * @param isOrthographic Whether the projection is orthographic.\r\n * @returns The projected radius in physical pixels.\r\n * @internal\r\n */\r\nexport function _ProjectMeshBlendWorldRadiusToPixels(\r\n worldRadius: number,\r\n viewDepth: number,\r\n renderTargetHeight: number,\r\n projectionYScale: number,\r\n isOrthographic: boolean\r\n): number {\r\n const projectionScale = 0.5 * renderTargetHeight * Math.abs(projectionYScale);\r\n return worldRadius * (isOrthographic ? projectionScale : projectionScale / Math.max(Math.abs(viewDepth), 1e-5));\r\n}\r\n\r\n/**\r\n * Calculates the final mesh-blending search radius.\r\n * @param definition Radius-class definition.\r\n * @param viewDepth Positive distance from the camera.\r\n * @param renderTargetHeight Physical render-target height.\r\n * @param projectionYScale Absolute Y scale from the projection matrix.\r\n * @param isOrthographic Whether the projection is orthographic.\r\n * @param quality Quality whose radius scale is applied.\r\n * @returns The final radius in physical pixels.\r\n * @internal\r\n */\r\nexport function _CalculateMeshBlendSearchRadius(\r\n definition: IMeshBlendRadiusDefinition,\r\n viewDepth: number,\r\n renderTargetHeight: number,\r\n projectionYScale: number,\r\n isOrthographic: boolean,\r\n quality: MeshBlendQuality\r\n): number {\r\n const projectedRadius = _ProjectMeshBlendWorldRadiusToPixels(definition.worldRadius, viewDepth, renderTargetHeight, projectionYScale, isOrthographic);\r\n const scaledRadius = Math.max(projectedRadius, definition.minimumProjectedRadius) * _GetMeshBlendQualityRadiusScale(quality);\r\n return scaledRadius > 0 ? Math.max(1, scaledRadius) : 0;\r\n}\r\n\r\n/**\r\n * Calculates the mesh-blending fade for a candidate boundary.\r\n * @param distancePixels Distance from the current pixel center to the target pixel center.\r\n * @param searchRadiusPixels Effective search radius in physical pixels.\r\n * @returns Blend weight in the range 0 through 0.5.\r\n * @internal\r\n */\r\nexport function _CalculateMeshBlendFade(distancePixels: number, searchRadiusPixels: number): number {\r\n const boundaryDistance = Math.max(distancePixels - 0.5, 0);\r\n const normalizedDistance = Math.min(Math.max(boundaryDistance / Math.max(searchRadiusPixels, 0.00001), 0), 1);\r\n const inverseDistance = 1 - normalizedDistance;\r\n const fade = inverseDistance * inverseDistance + (inverseDistance - inverseDistance * inverseDistance) * Math.min(Math.max(inverseDistance - 0.75, 0), 1);\r\n return fade * 0.5;\r\n}\r\n\r\n/**\r\n * Converts a physical-pixel radius back to the represented world-space radius.\r\n * @param radiusPixels Radius in physical render-target pixels.\r\n * @param viewDepth Positive distance from the camera.\r\n * @param renderTargetHeight Physical render-target height.\r\n * @param projectionYScale Absolute Y scale from the projection matrix.\r\n * @param isOrthographic Whether the projection is orthographic.\r\n * @returns The represented radius in Babylon world units.\r\n * @internal\r\n */\r\nexport function _CalculateMeshBlendEffectiveWorldRadius(\r\n radiusPixels: number,\r\n viewDepth: number,\r\n renderTargetHeight: number,\r\n projectionYScale: number,\r\n isOrthographic: boolean\r\n): number {\r\n const projectionScale = Math.max(0.5 * renderTargetHeight * Math.abs(projectionYScale), 1e-5);\r\n return radiusPixels * (isOrthographic ? 1 / projectionScale : Math.max(Math.abs(viewDepth), 1e-5) / projectionScale);\r\n}\r\n\r\n/**\r\n * Calculates the contact-slope radius multiplier.\r\n * @param oppositeFacing Cosine-domain alignment of the two surface spans.\r\n * @param slopeFactor User-configurable narrowing factor.\r\n * @returns A multiplier in the range [0.25, 1].\r\n * @internal\r\n */\r\nexport function _CalculateMeshBlendSlopeScale(oppositeFacing: number, slopeFactor: number): number {\r\n if (slopeFactor <= 1) {\r\n return 1;\r\n }\r\n return 0.25 + 0.75 * Math.pow(Math.max(0, Math.min(oppositeFacing, 1)), slopeFactor - 1);\r\n}\r\n\r\n/**\r\n * Gets the compile-time shader define for a mesh-blending quality.\r\n * @param quality Quality to convert.\r\n * @returns The quality define.\r\n * @internal\r\n */\r\nexport function _GetMeshBlendQualityDefine(quality: MeshBlendQuality): string {\r\n switch (quality) {\r\n case MeshBlendQuality.Low:\r\n return \"#define MESH_BLEND_QUALITY_LOW\";\r\n case MeshBlendQuality.Medium:\r\n return \"#define MESH_BLEND_QUALITY_MEDIUM\";\r\n case MeshBlendQuality.High:\r\n return \"#define MESH_BLEND_QUALITY_HIGH\";\r\n case MeshBlendQuality.Cinematic:\r\n return \"#define MESH_BLEND_QUALITY_CINEMATIC\";\r\n default:\r\n throw new RangeError(\"Mesh-blending quality must be Low, Medium, High, or Cinematic.\");\r\n }\r\n}\r\n\r\n/**\r\n * Gets all compile-time defines for a mesh-blending quality variant.\r\n * @param quality Quality to convert.\r\n * @returns Newline-separated shader defines containing all quality-specific constants and feature switches.\r\n * @internal\r\n */\r\nexport function _GetMeshBlendQualityDefines(quality: MeshBlendQuality): string {\r\n const settings = _GetMeshBlendQualitySettings(quality);\r\n const defines = [\r\n _GetMeshBlendQualityDefine(quality),\r\n `#define MESH_BLEND_DIRECTION_COUNT ${settings.directionCount}`,\r\n `#define MESH_BLEND_RADIAL_SAMPLE_COUNT ${settings.radialSampleCount}`,\r\n `#define MESH_BLEND_DIRECTION_REFINEMENT_SAMPLE_COUNT ${settings.directionRefinementSampleCount}`,\r\n `#define MESH_BLEND_DIRECTION_REFINEMENT_STEP_COUNT ${settings.directionRefinementStepCount}`,\r\n `#define MESH_BLEND_EXACT_EDGE_SAMPLE_COUNT ${settings.exactEdgeSampleCount}`,\r\n `#define MESH_BLEND_RADIUS_SCALE ${settings.radiusScale.toFixed(2)}`,\r\n `#define MESH_BLEND_JITTER_FACTOR ${settings.searchJitterFactor.toFixed(2)}`,\r\n ];\r\n\r\n if (settings.fullRandomRotation) {\r\n defines.push(\"#define MESH_BLEND_FULL_RANDOM_ROTATION\");\r\n }\r\n if (settings.immediateFourNeighborFallback) {\r\n defines.push(\"#define MESH_BLEND_FOUR_NEIGHBOR_FALLBACK\");\r\n }\r\n if (settings.tinyObjectSafeguard) {\r\n defines.push(\"#define MESH_BLEND_TINY_OBJECT_SAFEGUARD\");\r\n }\r\n if (settings.multiTargetSecondaryBlend) {\r\n defines.push(\"#define MESH_BLEND_MULTI_TARGET_SECONDARY_BLEND\");\r\n }\r\n defines.push(settings.colorInterpolation === \"sRGB\" ? \"#define MESH_BLEND_COLOR_INTERPOLATION_SRGB\" : \"#define MESH_BLEND_COLOR_INTERPOLATION_OKLAB\");\r\n\r\n return defines.join(\"\\n\");\r\n}\r\n\r\nfunction _ValidateDebugMode(value: MeshBlendDebugMode): void {\r\n if (value < MeshBlendDebugMode.Off || value > MeshBlendDebugMode.WorldPosition || !Number.isInteger(value)) {\r\n throw new RangeError(\r\n \"Mesh-blending debug mode must be Off, PackedTag, CandidateDirectionDistance, SeamFade, RejectionReason, StageWork, Continuation, TinyObject, MultiTarget, TargetColor, ShadowAttenuation, ColorInterpolation, or WorldPosition.\"\r\n );\r\n }\r\n}\r\n\r\nfunction _ValidateDepthType(value: MeshBlendDepthType): void {\r\n if (value !== MeshBlendDepthType.View && value !== MeshBlendDepthType.Screen) {\r\n throw new RangeError(\"Mesh-blending depthType must be View or Screen.\");\r\n }\r\n}\r\n\r\nfunction _NormalizeDefines(defines: Nullable<string | string[]>): string {\r\n return Array.isArray(defines) ? defines.join(\"\\n\") : (defines ?? \"\");\r\n}\r\n\r\nfunction _BuildMeshBlendDefines(quality: MeshBlendQuality, debugMode: MeshBlendDebugMode, depthType: MeshBlendDepthType, hasBaseColorTexture: boolean, customDefines = \"\"): string {\r\n _ValidateDebugMode(debugMode);\r\n _ValidateDepthType(depthType);\r\n\r\n const defines = customDefines ? [customDefines, _GetMeshBlendQualityDefines(quality)] : [_GetMeshBlendQualityDefines(quality)];\r\n\r\n if (debugMode !== MeshBlendDebugMode.Off) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_ENABLED\");\r\n }\r\n\r\n if (debugMode === MeshBlendDebugMode.PackedTag) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_PACKED_TAG\");\r\n } else if (debugMode === MeshBlendDebugMode.CandidateDirectionDistance) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_CANDIDATE_DIRECTION_DISTANCE\");\r\n } else if (debugMode === MeshBlendDebugMode.SeamFade) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_SEAM_FADE\");\r\n } else if (debugMode === MeshBlendDebugMode.RejectionReason) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_REJECTION_REASON\");\r\n } else if (debugMode === MeshBlendDebugMode.StageWork) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_STAGE_WORK\");\r\n } else if (debugMode === MeshBlendDebugMode.Continuation) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_CONTINUATION\");\r\n } else if (debugMode === MeshBlendDebugMode.TinyObject) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_TINY_OBJECT\");\r\n } else if (debugMode === MeshBlendDebugMode.MultiTarget) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_MULTI_TARGET\");\r\n } else if (debugMode === MeshBlendDebugMode.TargetColor) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_TARGET_COLOR\");\r\n } else if (debugMode === MeshBlendDebugMode.ShadowAttenuation) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_SHADOW_ATTENUATION\");\r\n } else if (debugMode === MeshBlendDebugMode.ColorInterpolation) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_COLOR_INTERPOLATION\");\r\n } else if (debugMode === MeshBlendDebugMode.WorldPosition) {\r\n defines.push(\"#define MESH_BLEND_DEBUG_WORLD_POSITION\");\r\n }\r\n\r\n if (depthType === MeshBlendDepthType.Screen) {\r\n defines.push(\"#define MESH_BLEND_DEPTH_SCREEN\");\r\n }\r\n if (hasBaseColorTexture) {\r\n defines.push(\"#define MESH_BLEND_SHADOW_ESTIMATION\");\r\n }\r\n\r\n return defines.join(\"\\n\");\r\n}\r\n\r\nfunction _ValidateRadiusDefinition(definition: IMeshBlendRadiusDefinition): void {\r\n _ValidateWorldRadius(definition.worldRadius);\r\n _ValidateMinimumProjectedRadius(definition.minimumProjectedRadius);\r\n}\r\n\r\n/**\r\n * Validates mesh-blending configuration without mutating an effect.\r\n * @param options Configuration to validate.\r\n * @internal\r\n */\r\nexport function _ValidateMeshBlendConfiguration(options?: IMeshBlendConfiguration): void {\r\n if (!options) {\r\n return;\r\n }\r\n if (options.quality !== undefined) {\r\n _GetMeshBlendQualitySettings(options.quality);\r\n }\r\n if (options.debugMode !== undefined) {\r\n _ValidateDebugMode(options.debugMode);\r\n }\r\n if (options.depthType !== undefined) {\r\n _ValidateDepthType(options.depthType);\r\n }\r\n if (options.radiusClasses) {\r\n if (options.radiusClasses.length !== 4) {\r\n throw new RangeError(\"Mesh-blending radiusClasses must contain exactly four radius definitions.\");\r\n }\r\n for (const definition of options.radiusClasses) {\r\n _ValidateRadiusDefinition(definition);\r\n }\r\n }\r\n if (options.slopeFactor !== undefined && (!Number.isFinite(options.slopeFactor) || options.slopeFactor < 1)) {\r\n throw new RangeError(\"Mesh-blending slopeFactor must be a finite number greater than or equal to 1.\");\r\n }\r\n}\r\n\r\nfunction _CopyRadiusDefinitions(target: MeshBlendRadiusDefinitions, source: IMeshBlendConfiguration[\"radiusClasses\"]): void {\r\n if (!source || source.length !== 4) {\r\n throw new RangeError(\"Mesh blending requires exactly four radius definitions.\");\r\n }\r\n\r\n for (const definition of source) {\r\n _ValidateRadiusDefinition(definition);\r\n }\r\n for (let index = 0; index < 4; index++) {\r\n target[index]!.worldRadius = source[index]!.worldRadius;\r\n target[index]!.minimumProjectedRadius = source[index]!.minimumProjectedRadius;\r\n }\r\n}\r\n\r\n/**\r\n * Shared WebGL2 and WebGPU effect wrapper used to visually blend SceneColor across validated contacts between opaque or alpha-tested meshes.\r\n *\r\n * The effect does not modify geometry, depth, normals, collisions, or shadows. Transparent rendering is caller-controlled;\r\n * overlapping transparent surfaces can make SceneColor inconsistent with the single-layer geometry inputs. Meshes opt in\r\n * with a packed tag whose group is in the range 1..63; group 0 disables blending. Surfaces in the same nonzero group are\r\n * treated as one logical object and do not blend with one another. The four radius classes combine an authored world-space\r\n * radius with a minimum radius measured in physical render-target pixels.\r\n *\r\n * Perspective and orthographic cameras are supported. Search noise is spatially stable and never varies by frame.\r\n * Optional base-color input enables shadow estimation; without it, the related sampler and shader work are compiled out.\r\n * The effect does not require or implement TAA.\r\n */\r\nexport class ThinMeshBlendingPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader URL.\r\n */\r\n public static readonly FragmentUrl = \"meshBlending\";\r\n\r\n /**\r\n * The list of uniforms used by the effect.\r\n */\r\n public static readonly Uniforms = [\"projection\", \"inverseProjection\", \"inverseView\", \"blendWorldRadii\", \"minimumProjectedRadii\", \"meshBlendIsOrthographic\", \"slopeFactor\"];\r\n\r\n /**\r\n * The list of samplers used by the effect.\r\n */\r\n public static readonly Samplers = [\"meshBlendTagSampler\", \"meshBlendDepthSampler\", \"meshBlendBaseColorSampler\", \"meshBlendBlueNoiseSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/meshBlending.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/meshBlending.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * The four configurable radius definitions indexed by packed radius class.\r\n *\r\n * Both values are projected against the active camera and the physical depth-texture height.\r\n */\r\n public readonly radiusClasses = CreateDefaultMeshBlendRadiusDefinitions();\r\n\r\n /**\r\n * Camera used to project radii and reconstruct view-space positions.\r\n */\r\n public camera: Nullable<Camera> = null;\r\n\r\n private _slopeFactor = 2;\r\n\r\n /**\r\n * Contact-slope narrowing factor. A value of 1 disables narrowing.\r\n */\r\n public get slopeFactor(): number {\r\n return this._slopeFactor;\r\n }\r\n\r\n public set slopeFactor(value: number) {\r\n if (!Number.isFinite(value) || value < 1) {\r\n throw new RangeError(\"Mesh-blending slopeFactor must be a finite number greater than or equal to 1.\");\r\n }\r\n this._slopeFactor = value;\r\n }\r\n\r\n private readonly _stableBlueNoiseTexture: RawTexture;\r\n private readonly _customDefines: string;\r\n private _quality = MeshBlendQuality.Medium;\r\n private _debugMode = MeshBlendDebugMode.Off;\r\n private _depthType = MeshBlendDepthType.View;\r\n private _hasBaseColorTexture = false;\r\n private readonly _inverseProjection = new Matrix();\r\n private readonly _inverseView = new Matrix();\r\n private _cachedProjection: Nullable<Matrix> = null;\r\n private _cachedView: Nullable<Matrix> = null;\r\n private _projectionUpdateFlag = -1;\r\n private _viewUpdateFlag = -1;\r\n\r\n /**\r\n * Gets the compile-time quality variant.\r\n */\r\n public get quality(): MeshBlendQuality {\r\n return this._quality;\r\n }\r\n\r\n public set quality(value: MeshBlendQuality) {\r\n if (this._quality === value) {\r\n return;\r\n }\r\n _GetMeshBlendQualitySettings(value);\r\n this._quality = value;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Gets the compiled debug visualization.\r\n */\r\n public get debugMode(): MeshBlendDebugMode {\r\n return this._debugMode;\r\n }\r\n\r\n public set debugMode(value: MeshBlendDebugMode) {\r\n if (this._debugMode === value) {\r\n return;\r\n }\r\n _ValidateDebugMode(value);\r\n this._debugMode = value;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Gets the representation stored in the bound depth texture.\r\n */\r\n public get depthType(): MeshBlendDepthType {\r\n return this._depthType;\r\n }\r\n\r\n public set depthType(value: MeshBlendDepthType) {\r\n _ValidateDepthType(value);\r\n if (this._depthType === value) {\r\n return;\r\n }\r\n this._depthType = value;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Whether a base-color texture is bound and shadow estimation should be compiled.\r\n * @internal\r\n */\r\n public get hasBaseColorTexture(): boolean {\r\n return this._hasBaseColorTexture;\r\n }\r\n\r\n public set hasBaseColorTexture(value: boolean) {\r\n if (this._hasBaseColorTexture === value) {\r\n return;\r\n }\r\n this._hasBaseColorTexture = value;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Constructs a mesh-blending post process.\r\n * @param name Name of the effect.\r\n * @param engine Engine used to render the effect.\r\n * @param options Options used to configure the effect.\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: IThinMeshBlendingPostProcessOptions) {\r\n const resolvedEngine = engine || EngineStore.LastCreatedEngine!;\r\n if (!_IsMeshBlendingSupported(resolvedEngine)) {\r\n throw new Error(\"ThinMeshBlendingPostProcess requires WebGL2 or WebGPU\");\r\n }\r\n const quality = options?.quality ?? MeshBlendQuality.Medium;\r\n const debugMode = options?.debugMode ?? MeshBlendDebugMode.Off;\r\n const depthType = options?.depthType ?? MeshBlendDepthType.View;\r\n const customDefines = _NormalizeDefines(options?.defines ?? null);\r\n _ValidateMeshBlendConfiguration(options);\r\n\r\n super({\r\n ...options,\r\n name,\r\n engine: resolvedEngine,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinMeshBlendingPostProcess.FragmentUrl,\r\n uniforms: ThinMeshBlendingPostProcess.Uniforms,\r\n samplers: ThinMeshBlendingPostProcess.Samplers,\r\n defines: _BuildMeshBlendDefines(quality, debugMode, depthType, false, customDefines),\r\n });\r\n\r\n this._customDefines = customDefines;\r\n this._applyConfiguration(options);\r\n this._stableBlueNoiseTexture = _CreateMeshBlendBlueNoiseTexture(resolvedEngine);\r\n }\r\n\r\n /**\r\n * Applies shared mesh-blending configuration.\r\n * @param options Values to apply. Omitted values retain their current settings.\r\n */\r\n public configure(options?: IMeshBlendConfiguration): void {\r\n const definesChanged = this._applyConfiguration(options);\r\n if (definesChanged) {\r\n this._updateEffectDefines();\r\n }\r\n }\r\n\r\n private _applyConfiguration(options?: IMeshBlendConfiguration): boolean {\r\n if (!options) {\r\n return false;\r\n }\r\n _ValidateMeshBlendConfiguration(options);\r\n\r\n const previousQuality = this._quality;\r\n const previousDebugMode = this._debugMode;\r\n const previousDepthType = this._depthType;\r\n\r\n if (options.radiusClasses) {\r\n _CopyRadiusDefinitions(this.radiusClasses, options.radiusClasses);\r\n }\r\n if (options.slopeFactor !== undefined) {\r\n this.slopeFactor = options.slopeFactor;\r\n }\r\n if (options.depthType !== undefined) {\r\n _ValidateDepthType(options.depthType);\r\n this._depthType = options.depthType;\r\n }\r\n const quality = options.quality ?? this._quality;\r\n const debugMode = options.debugMode ?? this._debugMode;\r\n _GetMeshBlendQualitySettings(quality);\r\n _ValidateDebugMode(debugMode);\r\n this._quality = quality;\r\n this._debugMode = debugMode;\r\n return previousQuality !== quality || previousDebugMode !== debugMode || previousDepthType !== this._depthType;\r\n }\r\n\r\n public override bind(noDefaultBindings = false): void {\r\n super.bind(noDefaultBindings);\r\n\r\n if (!this.camera) {\r\n throw new Error(\"ThinMeshBlendingPostProcess: camera is required before binding.\");\r\n }\r\n\r\n const effect = this._drawWrapper.effect!;\r\n const projection = this._updateInverseProjection();\r\n for (const definition of this.radiusClasses) {\r\n _ValidateRadiusDefinition(definition);\r\n }\r\n\r\n effect.setMatrix(\"projection\", projection);\r\n effect.setMatrix(\"inverseProjection\", this._inverseProjection);\r\n if (this._debugMode === MeshBlendDebugMode.WorldPosition) {\r\n const view = this.camera.getViewMatrix();\r\n if (this._cachedView !== view || this._viewUpdateFlag !== view.updateFlag) {\r\n view.invertToRef(this._inverseView);\r\n this._cachedView = view;\r\n this._viewUpdateFlag = view.updateFlag;\r\n }\r\n effect.setMatrix(\"inverseView\", this._inverseView);\r\n }\r\n effect.setFloat4(\r\n \"blendWorldRadii\",\r\n this.radiusClasses[0].worldRadius,\r\n this.radiusClasses[1].worldRadius,\r\n this.radiusClasses[2].worldRadius,\r\n this.radiusClasses[3].worldRadius\r\n );\r\n effect.setFloat4(\r\n \"minimumProjectedRadii\",\r\n this.radiusClasses[0].minimumProjectedRadius,\r\n this.radiusClasses[1].minimumProjectedRadius,\r\n this.radiusClasses[2].minimumProjectedRadius,\r\n this.radiusClasses[3].minimumProjectedRadius\r\n );\r\n effect.setFloat(\"meshBlendIsOrthographic\", this.camera.mode === Constants.ORTHOGRAPHIC_CAMERA ? 1 : 0);\r\n effect.setFloat(\"slopeFactor\", this._slopeFactor);\r\n effect.setTexture(\"meshBlendBlueNoiseSampler\", this._stableBlueNoiseTexture);\r\n }\r\n\r\n private _updateInverseProjection(): Matrix {\r\n const projection = this.camera!.getProjectionMatrix();\r\n if (this._cachedProjection !== projection || this._projectionUpdateFlag !== projection.updateFlag) {\r\n projection.invertToRef(this._inverseProjection);\r\n this._cachedProjection = projection;\r\n this._projectionUpdateFlag = projection.updateFlag;\r\n }\r\n return projection;\r\n }\r\n\r\n public override dispose(): void {\r\n this._stableBlueNoiseTexture.dispose();\r\n super.dispose();\r\n }\r\n\r\n private _updateEffectDefines(): void {\r\n this.updateEffect(_BuildMeshBlendDefines(this._quality, this._debugMode, this._depthType, this._hasBaseColorTexture, this._customDefines));\r\n }\r\n}\r\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { EngineStore } from "../../Engines/engineStore.js";
|
|
4
4
|
import { Matrix, Vector3, Vector4, Quaternion } from "../../Maths/math.vector.pure.js";
|
|
5
|
-
import {
|
|
5
|
+
import { _IsGaussianSplattingMesh } from "../../Meshes/GaussianSplatting/gaussianSplatting.functions.js";
|
|
6
6
|
import { Texture } from "../../Materials/Textures/texture.pure.js";
|
|
7
7
|
import { Logger } from "../../Misc/logger.js";
|
|
8
8
|
import { _IblShadowsVoxelRenderer } from "./iblShadowsVoxelRenderer.pure.js";
|
|
@@ -349,7 +349,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
|
|
|
349
349
|
for (const m of mesh) {
|
|
350
350
|
if (m && this._shadowCastingMeshes.indexOf(m) === -1) {
|
|
351
351
|
this._shadowCastingMeshes.push(m);
|
|
352
|
-
if (
|
|
352
|
+
if (_IsGaussianSplattingMesh(m)) {
|
|
353
353
|
m.needsRotationScaleTextures = true;
|
|
354
354
|
}
|
|
355
355
|
}
|
|
@@ -358,7 +358,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
|
|
|
358
358
|
else {
|
|
359
359
|
if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {
|
|
360
360
|
this._shadowCastingMeshes.push(mesh);
|
|
361
|
-
if (
|
|
361
|
+
if (_IsGaussianSplattingMesh(mesh)) {
|
|
362
362
|
mesh.needsRotationScaleTextures = true;
|
|
363
363
|
}
|
|
364
364
|
}
|
|
@@ -375,7 +375,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
|
|
|
375
375
|
const index = this._shadowCastingMeshes.indexOf(m);
|
|
376
376
|
if (index !== -1) {
|
|
377
377
|
this._shadowCastingMeshes.splice(index, 1);
|
|
378
|
-
if (
|
|
378
|
+
if (_IsGaussianSplattingMesh(m)) {
|
|
379
379
|
m.needsRotationScaleTextures = false;
|
|
380
380
|
}
|
|
381
381
|
}
|
|
@@ -385,7 +385,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
|
|
|
385
385
|
const index = this._shadowCastingMeshes.indexOf(mesh);
|
|
386
386
|
if (index !== -1) {
|
|
387
387
|
this._shadowCastingMeshes.splice(index, 1);
|
|
388
|
-
if (
|
|
388
|
+
if (_IsGaussianSplattingMesh(mesh)) {
|
|
389
389
|
mesh.needsRotationScaleTextures = false;
|
|
390
390
|
}
|
|
391
391
|
}
|
|
@@ -396,7 +396,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
|
|
|
396
396
|
*/
|
|
397
397
|
clearShadowCastingMeshes() {
|
|
398
398
|
for (const m of this._shadowCastingMeshes) {
|
|
399
|
-
if (
|
|
399
|
+
if (_IsGaussianSplattingMesh(m)) {
|
|
400
400
|
m.needsRotationScaleTextures = false;
|
|
401
401
|
}
|
|
402
402
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblShadowsRenderPipeline.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector.pure\";\r\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\r\nimport { type GaussianSplattingMesh, IsGaussianSplattingClassName } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer.pure\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\nimport { type WebGPUEngine } from \"../../Engines/webgpuEngine.pure\";\r\nimport { PostProcess, type PostProcessOptions } from \"../../PostProcesses/postProcess.pure\";\r\nimport { _IblShadowsSpatialBlurPass } from \"./iblShadowsSpatialBlurPass\";\r\nimport { _IblShadowsAccumulationPass } from \"./iblShadowsAccumulationPass\";\r\nimport { PostProcessRenderPipeline } from \"../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"core/PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport { type Camera } from \"core/Cameras/camera.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer, type IGeometryBufferTextureTypeAndFormat } from \"core/Rendering/geometryBufferRenderer.pure\";\r\nimport { RegisterGeometryBufferRendererSceneComponent } from \"core/Rendering/geometryBufferRendererSceneComponent.pure\";\r\nimport { IblCdfGenerator } from \"core/Rendering/iblCdfGenerator\";\r\nimport { RegisterIblCdfGeneratorSceneComponent } from \"core/Rendering/iblCdfGeneratorSceneComponent.pure\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RawTexture3D } from \"core/Materials/Textures/rawTexture3D\";\r\nimport { IBLShadowsPluginMaterial } from \"./iblShadowsPluginMaterial.pure\";\r\nimport { IsIBLShadowsReceiverCompatible } from \"./iblShadowsMaterialCompatibility.pure\";\r\nimport { type Material } from \"core/Materials/material.pure\";\r\nimport { Observable } from \"core/Misc/observable.pure\";\r\nimport { Tools } from \"../../Misc/tools.pure\";\r\n\r\ninterface IIblShadowsSettings {\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n resolutionExp?: number;\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass. Higher\r\n * values will result in better quality, more stable shadows but are more expensive to compute.\r\n */\r\n sampleDirections?: number;\r\n\r\n /**\r\n * How dark the shadows are. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n shadowOpacity?: number;\r\n\r\n /**\r\n * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.\r\n */\r\n envRotation?: number;\r\n\r\n /**\r\n * A factor that controls how long the shadows remain in the scene.\r\n * 0.0 is no persistence, 1.0 is full persistence.\r\n * This value applies only while the camera is moving. Once stationary, the pipeline\r\n * increases remanence automatically to help the shadows converge.\r\n */\r\n shadowRemanence?: number;\r\n\r\n /**\r\n * Render the voxel grid from 3 different axis. This will result in better quality shadows with fewer\r\n * bits of missing geometry.\r\n */\r\n triPlanarVoxelization?: boolean;\r\n\r\n /**\r\n * A size multiplier for the internal shadow render targets (default 1.0). A value of 1.0 represents full-resolution.\r\n * Scaling this below 1.0 will result in blurry shadows and potentially more artifacts but\r\n * could help increase performance on less powerful GPU's.\r\n */\r\n shadowRenderSizeFactor?: number;\r\n\r\n /**\r\n * Separate control for the opacity of the voxel shadows.\r\n */\r\n voxelShadowOpacity?: number;\r\n\r\n /**\r\n * Include screen-space shadows in the IBL shadow pipeline. This adds sharp shadows to small details\r\n * but only applies close to a shadow-casting object.\r\n */\r\n ssShadowsEnabled?: boolean;\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n ssShadowSampleCount?: number;\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples\r\n * in pixels.\r\n */\r\n ssShadowStride?: number;\r\n\r\n /**\r\n * A scale for the maximum distance a screen-space shadow can be cast in world-space.\r\n * The maximum distance that screen-space shadows cast is derived from the voxel size\r\n * and this value so shouldn't need to change if you scale your scene.\r\n */\r\n ssShadowDistanceScale?: number;\r\n\r\n /**\r\n * Screen-space shadow thickness scale. This value controls the assumed thickness of\r\n * on-screen surfaces in world-space. It scales with the size of the shadow-casting\r\n * region so shouldn't need to change if you scale your scene.\r\n */\r\n ssShadowThicknessScale?: number;\r\n\r\n /**\r\n * Maximum number of translucent voxels a shadow ray roulettes through before it is treated as\r\n * unoccluded (default 16). Higher values converge more accurately through thick translucent volumes\r\n * (e.g. dense Gaussian splats) at extra cost. Opaque voxels always block on first contact.\r\n */\r\n maxVoxelRouletteTests?: number;\r\n}\r\n\r\n/**\r\n * Voxel-based shadow rendering for IBL's.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n */\r\nexport class IblShadowsRenderPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The scene that this pipeline is attached to\r\n */\r\n public scene: Scene;\r\n\r\n private _allowDebugPasses: boolean = false;\r\n private _debugPasses: { pass: PostProcess; enabled: boolean }[] = [];\r\n\r\n private _geometryBufferRenderer: GeometryBufferRenderer;\r\n\r\n private _shadowCastingMeshes: Mesh[] = [];\r\n\r\n private _voxelRenderer: _IblShadowsVoxelRenderer;\r\n private _voxelTracingPass: _IblShadowsVoxelTracingPass;\r\n private _spatialBlurPass: _IblShadowsSpatialBlurPass;\r\n private _accumulationPass: _IblShadowsAccumulationPass;\r\n private _noiseTexture: Texture;\r\n /**\r\n * Raw texture to be used before final data is available.\r\n * @internal\r\n */\r\n public _dummyTexture2d: RawTexture;\r\n private _dummyTexture3d: RawTexture3D;\r\n private _shadowOpacity: number = 0.8;\r\n private _enabled: boolean = true;\r\n private _coloredShadows: boolean = false;\r\n private _materialsWithRenderPlugin: Material[] = [];\r\n\r\n /**\r\n * Observable that triggers when the shadow renderer is ready\r\n */\r\n public onShadowTextureReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when a new IBL is set and the importance sampling is ready\r\n */\r\n public onNewIblReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when the voxelization is complete\r\n */\r\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * The current world-space size of that the voxel grid covers in the scene.\r\n */\r\n public voxelGridSize: number = 1.0;\r\n\r\n /**\r\n * Reset the shadow accumulation. This has a similar affect to lowering the remanence for a single frame.\r\n * This is useful when making a sudden change to the IBL.\r\n */\r\n public resetAccumulation(): void {\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get shadowOpacity(): number {\r\n return this._shadowOpacity;\r\n }\r\n\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Render the shadows in color rather than black and white.\r\n * This is slightly more expensive than black and white shadows but can be much\r\n * more accurate when the strongest lights in the IBL are non-white.\r\n */\r\n public get coloredShadows(): boolean {\r\n return this._coloredShadows;\r\n }\r\n\r\n public set coloredShadows(value: boolean) {\r\n this._coloredShadows = value;\r\n this._voxelTracingPass.coloredShadows = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n private _renderSizeFactor: number = 1.0;\r\n\r\n /**\r\n * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.\r\n */\r\n public get shadowRenderSizeFactor(): number {\r\n return this._renderSizeFactor;\r\n }\r\n\r\n public set shadowRenderSizeFactor(value: number) {\r\n this._renderSizeFactor = Math.max(Math.min(value, 1.0), 0.0);\r\n this._voxelTracingPass.resize(value);\r\n this._spatialBlurPass.resize(value);\r\n this._accumulationPass.resize(value);\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get voxelShadowOpacity() {\r\n return this._voxelTracingPass?.voxelShadowOpacity;\r\n }\r\n\r\n public set voxelShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.voxelShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * Maximum number of translucent voxels a shadow ray roulettes through before it is treated as\r\n * unoccluded. Higher values converge more accurately at extra cost. Opaque voxels always block.\r\n */\r\n public get maxVoxelRouletteTests(): number {\r\n return this._voxelTracingPass?.maxVoxelRouletteTests;\r\n }\r\n\r\n public set maxVoxelRouletteTests(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.maxVoxelRouletteTests = value;\r\n }\r\n\r\n /**\r\n * How dark the screen-space shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._voxelTracingPass?.ssShadowOpacity;\r\n }\r\n\r\n public set ssShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.ssShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public get ssShadowSampleCount(): number {\r\n return this._voxelTracingPass?.sssSamples;\r\n }\r\n\r\n public set ssShadowSampleCount(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples\r\n * in pixels.\r\n */\r\n public get ssShadowStride(): number {\r\n return this._voxelTracingPass?.sssStride;\r\n }\r\n\r\n public set ssShadowStride(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.sssStride = value;\r\n }\r\n\r\n private _sssMaxDistScale: number;\r\n\r\n /**\r\n * A scale for the maximum distance a screen-space shadow can be cast in world-space.\r\n * The maximum distance that screen-space shadows cast is derived from the voxel size\r\n * and this value so shouldn't need to change if you scale your scene\r\n */\r\n public get ssShadowDistanceScale(): number {\r\n return this._sssMaxDistScale;\r\n }\r\n\r\n public set ssShadowDistanceScale(value: number) {\r\n this._sssMaxDistScale = value;\r\n this._updateSsShadowParams();\r\n }\r\n\r\n private _sssThicknessScale: number;\r\n\r\n /**\r\n * Screen-space shadow thickness scale. This value controls the assumed thickness of\r\n * on-screen surfaces in world-space. It scales with the size of the shadow-casting\r\n * region so shouldn't need to change if you scale your scene.\r\n */\r\n public get ssShadowThicknessScale(): number {\r\n return this._sssThicknessScale;\r\n }\r\n\r\n public set ssShadowThicknessScale(value: number) {\r\n this._sssThicknessScale = value;\r\n this._updateSsShadowParams();\r\n }\r\n\r\n /**\r\n * Returns the texture containing the voxel grid data\r\n * @returns The texture containing the voxel grid data\r\n * @internal\r\n */\r\n public _getVoxelGridTexture(): Texture {\r\n const tex = this._voxelRenderer?.getVoxelGrid();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture3d;\r\n }\r\n\r\n /**\r\n * Returns the noise texture.\r\n * @returns The noise texture.\r\n * @internal\r\n */\r\n public _getNoiseTexture(): Texture {\r\n const tex = this._noiseTexture;\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the voxel-tracing texture.\r\n * @returns The voxel-tracing texture.\r\n * @internal\r\n */\r\n public _getVoxelTracingTexture(): Texture {\r\n const tex = this._voxelTracingPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the spatial blur texture.\r\n * @returns The spatial blur texture.\r\n * @internal\r\n */\r\n public _getSpatialBlurTexture(): Texture {\r\n const tex = this._spatialBlurPass.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the accumulated shadow texture.\r\n * @returns The accumulated shadow texture.\r\n * @internal\r\n */\r\n public _getAccumulatedTexture(): Texture {\r\n const tex = this._accumulationPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n private _gbufferDebugPass: PostProcess;\r\n private _gbufferDebugEnabled: boolean = false;\r\n private _gBufferDebugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Turn on or off the debug view of the G-Buffer. This will display only the targets\r\n * of the g-buffer that are used by the shadow pipeline.\r\n */\r\n public get gbufferDebugEnabled(): boolean {\r\n return this._gbufferDebugEnabled;\r\n }\r\n\r\n public set gbufferDebugEnabled(enabled: boolean) {\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable G-Buffer debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._gbufferDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n } else {\r\n this._disableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public get cdfDebugEnabled(): boolean {\r\n return this.scene.iblCdfGenerator ? this.scene.iblCdfGenerator.debugEnabled : false;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public set cdfDebugEnabled(enabled: boolean) {\r\n if (!this.scene.iblCdfGenerator) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable importance sampling debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this.scene.iblCdfGenerator.debugEnabled) {\r\n return;\r\n }\r\n this.scene.iblCdfGenerator.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this.scene.iblCdfGenerator.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this.scene.iblCdfGenerator.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for just the shadow samples taken this frame.\r\n */\r\n public get voxelTracingDebugEnabled(): boolean {\r\n return this._voxelTracingPass?.debugEnabled;\r\n }\r\n\r\n public set voxelTracingDebugEnabled(enabled: boolean) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel tracing debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._voxelTracingPass.debugEnabled) {\r\n return;\r\n }\r\n this._voxelTracingPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the spatial blur pass\r\n */\r\n public get spatialBlurPassDebugEnabled(): boolean {\r\n return this._spatialBlurPass.debugEnabled;\r\n }\r\n\r\n public set spatialBlurPassDebugEnabled(enabled: boolean) {\r\n if (!this._spatialBlurPass) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable spatial blur debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._spatialBlurPass.debugEnabled) {\r\n return;\r\n }\r\n this._spatialBlurPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the shadows accumulated over time.\r\n */\r\n public get accumulationPassDebugEnabled(): boolean {\r\n return this._accumulationPass?.debugEnabled;\r\n }\r\n\r\n public set accumulationPassDebugEnabled(enabled: boolean) {\r\n if (!this._accumulationPass) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable accumulation pass debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._accumulationPass.debugEnabled) {\r\n return;\r\n }\r\n this._accumulationPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Add a mesh to be used for shadow-casting in the IBL shadow pipeline.\r\n * These meshes will be written to the voxel grid.\r\n * @param mesh A mesh or list of meshes that you want to cast shadows\r\n */\r\n public addShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n if (m && this._shadowCastingMeshes.indexOf(m) === -1) {\r\n this._shadowCastingMeshes.push(m);\r\n if (IsGaussianSplattingClassName(m.getClassName())) {\r\n (m as GaussianSplattingMesh).needsRotationScaleTextures = true;\r\n }\r\n }\r\n }\r\n } else {\r\n if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {\r\n this._shadowCastingMeshes.push(mesh);\r\n if (IsGaussianSplattingClassName(mesh.getClassName())) {\r\n (mesh as GaussianSplattingMesh).needsRotationScaleTextures = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the shadow-casting list. The mesh will no longer be written\r\n * to the voxel grid and will not cast shadows.\r\n * @param mesh The mesh or list of meshes that you don't want to cast shadows.\r\n */\r\n public removeShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n const index = this._shadowCastingMeshes.indexOf(m);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n if (IsGaussianSplattingClassName(m.getClassName())) {\r\n (m as GaussianSplattingMesh).needsRotationScaleTextures = false;\r\n }\r\n }\r\n }\r\n } else {\r\n const index = this._shadowCastingMeshes.indexOf(mesh);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n if (IsGaussianSplattingClassName(mesh.getClassName())) {\r\n (mesh as GaussianSplattingMesh).needsRotationScaleTextures = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the list of shadow-casting meshes. This will remove all meshes from the list\r\n */\r\n public clearShadowCastingMeshes(): void {\r\n for (const m of this._shadowCastingMeshes) {\r\n if (IsGaussianSplattingClassName(m.getClassName())) {\r\n (m as GaussianSplattingMesh).needsRotationScaleTextures = false;\r\n }\r\n }\r\n this._shadowCastingMeshes.length = 0;\r\n }\r\n\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n public get resolutionExp() {\r\n return this._voxelRenderer.voxelResolutionExp;\r\n }\r\n\r\n public set resolutionExp(newResolution: number) {\r\n if (newResolution === this._voxelRenderer.voxelResolutionExp) {\r\n return;\r\n }\r\n if (this._voxelRenderer.isVoxelizationInProgress()) {\r\n Logger.Warn(\"Can't change the resolution of the voxel grid while voxelization is in progress.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelResolutionExp = Math.max(1, Math.min(newResolution, 8));\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public get sampleDirections() {\r\n return this._voxelTracingPass?.sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public set sampleDirections(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public get shadowRemanence(): number {\r\n return this._accumulationPass?.remanence;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public set shadowRemanence(value: number) {\r\n if (!this._accumulationPass) {\r\n return;\r\n }\r\n this._accumulationPass.remanence = value;\r\n }\r\n\r\n /**\r\n * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.\r\n */\r\n public get envRotation() {\r\n return this._voxelTracingPass?.envRotation;\r\n }\r\n\r\n /**\r\n * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.\r\n */\r\n public set envRotation(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.envRotation = value;\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public get allowDebugPasses(): boolean {\r\n return this._allowDebugPasses;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public set allowDebugPasses(value: boolean) {\r\n if (this._allowDebugPasses === value) {\r\n return;\r\n }\r\n this._allowDebugPasses = value;\r\n if (value && this.scene.iblCdfGenerator) {\r\n if (this.scene.iblCdfGenerator.isReady()) {\r\n this._createDebugPasses();\r\n } else {\r\n this.scene.iblCdfGenerator.onGeneratedObservable.addOnce(() => {\r\n this._createDebugPasses();\r\n });\r\n }\r\n } else {\r\n this._disposeDebugPasses();\r\n }\r\n }\r\n\r\n /**\r\n * Support test.\r\n */\r\n public static get IsSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine._features.supportIBLShadows;\r\n }\r\n\r\n /**\r\n * Toggle the shadow tracing on or off\r\n * @param enabled Toggle the shadow tracing on or off\r\n */\r\n public toggleShadow(enabled: boolean) {\r\n this._enabled = enabled;\r\n this._voxelTracingPass.enabled = enabled;\r\n this._spatialBlurPass.enabled = enabled;\r\n this._accumulationPass.enabled = enabled;\r\n for (const mat of this._materialsWithRenderPlugin) {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(IBLShadowsPluginMaterial.Name) as IBLShadowsPluginMaterial;\r\n plugin.isEnabled = enabled;\r\n }\r\n }\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Trigger the scene to be re-voxelized. This should be run when any shadow-casters have been added, removed or moved.\r\n */\r\n public updateVoxelization() {\r\n if (this._shadowCastingMeshes.length === 0) {\r\n Logger.Warn(\"IBL Shadows: updateVoxelization called with no shadow-casting meshes to voxelize.\");\r\n return;\r\n }\r\n this._voxelRenderer.updateVoxelGrid(this._shadowCastingMeshes);\r\n this._voxelRenderer.onVoxelizationCompleteObservable.addOnce(() => {\r\n this.onVoxelizationCompleteObservable.notifyObservers();\r\n });\r\n this._updateSsShadowParams();\r\n }\r\n\r\n /**\r\n * Trigger the scene bounds of shadow-casters to be calculated. This is the world size that the voxel grid will cover and will always be a cube.\r\n */\r\n public updateSceneBounds() {\r\n const bounds: { min: Vector3; max: Vector3 } = {\r\n min: new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),\r\n max: new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE),\r\n };\r\n for (const mesh of this._shadowCastingMeshes) {\r\n const localBounds = mesh.getHierarchyBoundingVectors(true);\r\n bounds.min = Vector3.Minimize(bounds.min, localBounds.min);\r\n bounds.max = Vector3.Maximize(bounds.max, localBounds.max);\r\n }\r\n\r\n if (this._shadowCastingMeshes.length === 0) {\r\n Logger.Warn(\"IBL Shadows: updateSceneBounds called with no shadow-casting meshes.\");\r\n this.voxelGridSize = 1.0;\r\n return;\r\n }\r\n // If no visible geometry contributed, bounds stay at sentinel values. Keep the\r\n // last valid invWorldScale and return silently — this is expected when all parts\r\n // are temporarily hidden (e.g. while switching between displayed models).\r\n if (bounds.min.x > bounds.max.x) {\r\n return;\r\n }\r\n const size = bounds.max.subtract(bounds.min);\r\n this.voxelGridSize = Math.max(size.x, size.y, size.z);\r\n if (!isFinite(this.voxelGridSize) || this.voxelGridSize === 0) {\r\n Logger.Warn(\"IBL Shadows: Scene size is invalid. Can't update bounds.\");\r\n this.voxelGridSize = 1.0;\r\n return;\r\n }\r\n const halfSize = this.voxelGridSize / 2.0;\r\n const centre = bounds.max.add(bounds.min).multiplyByFloats(-0.5, -0.5, -0.5);\r\n const invWorldScaleMatrix = Matrix.Compose(new Vector3(1.0 / halfSize, 1.0 / halfSize, 1.0 / halfSize), new Quaternion(), new Vector3(0, 0, 0));\r\n const invTranslationMatrix = Matrix.Compose(new Vector3(1.0, 1.0, 1.0), new Quaternion(), centre);\r\n invTranslationMatrix.multiplyToRef(invWorldScaleMatrix, invWorldScaleMatrix);\r\n this._voxelTracingPass.setWorldScaleMatrix(invWorldScaleMatrix);\r\n this._voxelRenderer.setWorldScaleMatrix(invWorldScaleMatrix);\r\n // Set world scale for spatial blur.\r\n this._spatialBlurPass.setWorldScale(halfSize * 2.0);\r\n this._updateSsShadowParams();\r\n }\r\n\r\n /**\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param options Options to configure the pipeline\r\n * @param cameras Cameras to apply the pipeline to.\r\n */\r\n constructor(name: string, scene: Scene, options: Partial<IIblShadowsSettings> = {}, cameras?: Camera[]) {\r\n super(scene.getEngine(), name);\r\n this.scene = scene;\r\n RegisterGeometryBufferRendererSceneComponent(GeometryBufferRenderer);\r\n RegisterIblCdfGeneratorSceneComponent(IblCdfGenerator);\r\n this._cameras = cameras || [scene.activeCamera!];\r\n // Create the dummy textures to be used when the pipeline is not ready\r\n const blackPixels = new Uint8Array([0, 0, 0, 255]);\r\n this._dummyTexture2d = new RawTexture(blackPixels, 1, 1, Constants.TEXTUREFORMAT_RGBA, scene, false);\r\n this._dummyTexture3d = new RawTexture3D(blackPixels, 1, 1, 1, Constants.TEXTUREFORMAT_RGBA, scene, false);\r\n\r\n // Setup the geometry buffer target formats\r\n const textureTypesAndFormats: { [key: number]: IGeometryBufferTextureTypeAndFormat } = {};\r\n textureTypesAndFormats[GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.POSITION_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.NORMAL_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n const geometryBufferRenderer = scene.enableGeometryBufferRenderer(undefined, Constants.TEXTUREFORMAT_DEPTH32_FLOAT, textureTypesAndFormats);\r\n if (!geometryBufferRenderer) {\r\n Logger.Error(\"Geometry buffer renderer is required for IBL shadows to work.\");\r\n return;\r\n }\r\n this._geometryBufferRenderer = geometryBufferRenderer;\r\n this._geometryBufferRenderer.enableScreenspaceDepth = true;\r\n this._geometryBufferRenderer.enableVelocityLinear = true;\r\n this._geometryBufferRenderer.enablePosition = true;\r\n this._geometryBufferRenderer.enableNormal = true;\r\n this._geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n this.scene.enableIblCdfGenerator();\r\n this.shadowOpacity = options.shadowOpacity ?? 0.8;\r\n this._voxelRenderer = new _IblShadowsVoxelRenderer(\r\n this.scene,\r\n this,\r\n options ? options.resolutionExp : 6,\r\n options.triPlanarVoxelization !== undefined ? options.triPlanarVoxelization : true\r\n );\r\n this._voxelTracingPass = new _IblShadowsVoxelTracingPass(this.scene, this);\r\n this._spatialBlurPass = new _IblShadowsSpatialBlurPass(this.scene, this);\r\n this._accumulationPass = new _IblShadowsAccumulationPass(this.scene, this);\r\n this._accumulationPass.onReadyObservable.addOnce(() => {\r\n this.onShadowTextureReadyObservable.notifyObservers();\r\n });\r\n this.sampleDirections = options.sampleDirections || 2;\r\n this.voxelShadowOpacity = options.voxelShadowOpacity ?? 1.0;\r\n this.envRotation = options.envRotation ?? 0.0;\r\n this.shadowRenderSizeFactor = options.shadowRenderSizeFactor || 1.0;\r\n this.ssShadowOpacity = options.ssShadowsEnabled === undefined || options.ssShadowsEnabled ? 1.0 : 0.0;\r\n this.ssShadowDistanceScale = options.ssShadowDistanceScale || 1.25;\r\n this.ssShadowSampleCount = options.ssShadowSampleCount || 16;\r\n this.ssShadowStride = options.ssShadowStride || 8;\r\n this.ssShadowThicknessScale = options.ssShadowThicknessScale || 1.0;\r\n this.shadowRemanence = options.shadowRemanence ?? 0.75;\r\n this.maxVoxelRouletteTests = options.maxVoxelRouletteTests ?? 16;\r\n this._noiseTexture = new Texture(\r\n Tools.GetAssetUrl(\"https://assets.babylonjs.com/core/blue_noise/blue_noise_rgb.png\"),\r\n this.scene,\r\n false,\r\n true,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this.scene.onActiveCameraChanged.add(this._listenForCameraChanges.bind(this));\r\n this.scene.onBeforeRenderObservable.add(this._updateBeforeRender.bind(this));\r\n\r\n this._listenForCameraChanges();\r\n this.scene.getEngine().onResizeObservable.add(this._handleResize.bind(this));\r\n\r\n // Assigning the shadow texture to the materials needs to be done after the RT's are created.\r\n if (this.scene.iblCdfGenerator) {\r\n this.scene.iblCdfGenerator.onGeneratedObservable.add(() => {\r\n this._setPluginParameters();\r\n this.onNewIblReadyObservable.notifyObservers();\r\n });\r\n }\r\n }\r\n\r\n private _handleResize() {\r\n this._voxelRenderer.resize();\r\n this._voxelTracingPass.resize(this.shadowRenderSizeFactor);\r\n this._spatialBlurPass.resize(this.shadowRenderSizeFactor);\r\n this._accumulationPass.resize(this.shadowRenderSizeFactor);\r\n this._setPluginParameters();\r\n }\r\n\r\n private _getGBufferDebugPass(): PostProcess {\r\n if (this._gbufferDebugPass) {\r\n return this._gbufferDebugPass;\r\n }\r\n const isWebGPU = this.engine.isWebGPU;\r\n const textureNames: string[] = [\"depthSampler\", \"normalSampler\", \"positionSampler\", \"velocitySampler\"];\r\n\r\n const options: PostProcessOptions = {\r\n width: this.scene.getEngine().getRenderWidth(),\r\n height: this.scene.getEngine().getRenderHeight(),\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine: this.scene.getEngine(),\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n uniforms: [\"sizeParams\"],\r\n samplers: textureNames,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowGBufferDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowGBufferDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._gbufferDebugPass = new PostProcess(\"iblShadowGBufferDebug\", \"iblShadowGBufferDebug\", options);\r\n if (this.engine.isWebGPU) {\r\n this._gbufferDebugPass.samples = (this.engine as WebGPUEngine).currentSampleCount ?? 1;\r\n }\r\n this._gbufferDebugPass.autoClear = false;\r\n this._gbufferDebugPass.onApplyObservable.add((effect) => {\r\n const depthIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE);\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[depthIndex]);\r\n const normalIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE);\r\n effect.setTexture(\"normalSampler\", this._geometryBufferRenderer.getGBuffer().textures[normalIndex]);\r\n const positionIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n effect.setTexture(\"positionSampler\", this._geometryBufferRenderer.getGBuffer().textures[positionIndex]);\r\n const velocityIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n effect.setTexture(\"velocitySampler\", this._geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n effect.setVector4(\"sizeParams\", this._gBufferDebugSizeParams);\r\n if (this.scene.activeCamera) {\r\n effect.setFloat(\"maxDepth\", this.scene.activeCamera.maxZ);\r\n }\r\n });\r\n return this._gbufferDebugPass;\r\n }\r\n\r\n private _createDebugPasses() {\r\n if (this.scene.iblCdfGenerator) {\r\n this._debugPasses = [{ pass: this.scene.iblCdfGenerator.getDebugPassPP(), enabled: this.cdfDebugEnabled }];\r\n } else {\r\n this._debugPasses = [];\r\n }\r\n\r\n this._debugPasses.push(\r\n { pass: this._voxelTracingPass.getDebugPassPP(), enabled: this.voxelTracingDebugEnabled },\r\n { pass: this._spatialBlurPass.getDebugPassPP(), enabled: this.spatialBlurPassDebugEnabled },\r\n { pass: this._accumulationPass.getDebugPassPP(), enabled: this.accumulationPassDebugEnabled },\r\n { pass: this._getGBufferDebugPass(), enabled: this.gbufferDebugEnabled }\r\n );\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) {\r\n continue;\r\n }\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n this._debugPasses[i].pass.name,\r\n () => {\r\n return this._debugPasses[i].pass;\r\n },\r\n true\r\n )\r\n );\r\n }\r\n const cameras = this.cameras.slice();\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this.scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this.name, cameras);\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) {\r\n continue;\r\n }\r\n if (this._debugPasses[i].enabled) {\r\n this._enableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n } else {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n }\r\n }\r\n }\r\n\r\n private _disposeEffectPasses() {\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this._disposeDebugPasses();\r\n this._reset();\r\n }\r\n\r\n private _disposeDebugPasses() {\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n this._debugPasses[i].pass.dispose();\r\n }\r\n this._debugPasses = [];\r\n }\r\n\r\n private _updateDebugPasses() {\r\n let count = 0;\r\n if (this._gbufferDebugEnabled) {\r\n count++;\r\n }\r\n if (this.cdfDebugEnabled) {\r\n count++;\r\n }\r\n if (this.voxelTracingDebugEnabled) {\r\n count++;\r\n }\r\n if (this.spatialBlurPassDebugEnabled) {\r\n count++;\r\n }\r\n if (this.accumulationPassDebugEnabled) {\r\n count++;\r\n }\r\n\r\n const rows = Math.ceil(Math.sqrt(count));\r\n const cols = Math.ceil(count / rows);\r\n const width = 1.0 / cols;\r\n const height = 1.0 / rows;\r\n let x: number = 0;\r\n let y: number = 0;\r\n if (this.gbufferDebugEnabled) {\r\n this._gBufferDebugSizeParams.set(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n\r\n if (this.cdfDebugEnabled && this.scene.iblCdfGenerator) {\r\n this.scene.iblCdfGenerator.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.voxelTracingDebugEnabled) {\r\n this._voxelTracingPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.spatialBlurPassDebugEnabled) {\r\n this._spatialBlurPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.accumulationPassDebugEnabled) {\r\n this._accumulationPass.setDebugDisplayParams(x, y, cols, rows);\r\n }\r\n }\r\n\r\n /**\r\n * Update the SS shadow max distance and thickness based on the voxel grid size and resolution.\r\n * The max distance should be just a little larger than the world size of a single voxel.\r\n */\r\n private _updateSsShadowParams(): void {\r\n this._voxelTracingPass.sssMaxDist = (this._sssMaxDistScale * this.voxelGridSize) / (1 << this.resolutionExp);\r\n this._voxelTracingPass.sssThickness = this._sssThicknessScale * 0.005 * this.voxelGridSize;\r\n }\r\n\r\n /**\r\n * Apply the shadows to a material or array of materials. If no material is provided, all\r\n * materials in the scene will be added.\r\n * @param material Material that will be affected by the shadows. If not provided, all materials of the scene will be affected.\r\n */\r\n public addShadowReceivingMaterial(material?: Material | Material[]) {\r\n if (material) {\r\n if (Array.isArray(material)) {\r\n for (const m of material) {\r\n this._addShadowSupportToMaterial(m);\r\n }\r\n } else {\r\n this._addShadowSupportToMaterial(material);\r\n }\r\n } else {\r\n for (const mat of this.scene.materials) {\r\n this._addShadowSupportToMaterial(mat);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a material from the list of materials that receive shadows. If no material\r\n * is provided, all materials in the scene will be removed.\r\n * @param material The material or array of materials that will no longer receive shadows\r\n */\r\n public removeShadowReceivingMaterial(material: Material | Material[]) {\r\n if (Array.isArray(material)) {\r\n for (const m of material) {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(m);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = m.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n } else {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(material);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = material.pluginManager!.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the list of materials that receive shadows. This will remove all materials from the list\r\n */\r\n public clearShadowReceivingMaterials() {\r\n for (const mat of this._materialsWithRenderPlugin) {\r\n const plugin = mat.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (plugin) {\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n this._materialsWithRenderPlugin.length = 0;\r\n }\r\n\r\n protected _addShadowSupportToMaterial(material: Material) {\r\n if (!IsIBLShadowsReceiverCompatible(material)) {\r\n return;\r\n }\r\n let plugin = material.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (!plugin) {\r\n plugin = new IBLShadowsPluginMaterial(material);\r\n }\r\n if (this._materialsWithRenderPlugin.indexOf(material) !== -1) {\r\n return;\r\n }\r\n\r\n if (this._enabled) {\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n }\r\n\r\n plugin.isEnabled = this._enabled;\r\n plugin.isColored = this._coloredShadows;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enabled) {\r\n return;\r\n }\r\n\r\n for (const mat of this._materialsWithRenderPlugin) {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n plugin.isColored = this._coloredShadows;\r\n }\r\n }\r\n }\r\n\r\n private _updateBeforeRender() {\r\n this._updateDebugPasses();\r\n }\r\n\r\n private _listenForCameraChanges() {\r\n // We want to listen for camera changes and change settings while the camera is moving.\r\n this.scene.activeCamera?.onViewMatrixChangedObservable.add(() => {\r\n this._accumulationPass.isMoving = true;\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the IBL shadow pipeline is ready to render shadows\r\n * @returns true if the IBL shadow pipeline is ready to render the shadows\r\n */\r\n public isReady() {\r\n return (\r\n this._noiseTexture.isReady() &&\r\n this._voxelRenderer.isReady() &&\r\n this.scene.iblCdfGenerator &&\r\n this.scene.iblCdfGenerator.isReady() &&\r\n (!this._voxelTracingPass || this._voxelTracingPass.isReady()) &&\r\n (!this._spatialBlurPass || this._spatialBlurPass.isReady()) &&\r\n (!this._accumulationPass || this._accumulationPass.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"IBLShadowsRenderPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"IBLShadowsRenderPipeline\";\r\n }\r\n\r\n /**\r\n * Disposes the IBL shadow pipeline and associated resources\r\n */\r\n public override dispose() {\r\n const materials = this._materialsWithRenderPlugin.splice(0);\r\n for (const mat of materials) {\r\n this.removeShadowReceivingMaterial(mat);\r\n }\r\n this._disposeEffectPasses();\r\n this._noiseTexture.dispose();\r\n this._voxelRenderer.dispose();\r\n this._voxelTracingPass.dispose();\r\n this._spatialBlurPass.dispose();\r\n this._accumulationPass.dispose();\r\n this._dummyTexture2d.dispose();\r\n this._dummyTexture3d.dispose();\r\n this.onNewIblReadyObservable.clear();\r\n this.onShadowTextureReadyObservable.clear();\r\n this.onVoxelizationCompleteObservable.clear();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"iblShadowsRenderPipeline.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector.pure\";\r\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\r\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { _IsGaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplatting.functions\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer.pure\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\nimport { type WebGPUEngine } from \"../../Engines/webgpuEngine.pure\";\r\nimport { PostProcess, type PostProcessOptions } from \"../../PostProcesses/postProcess.pure\";\r\nimport { _IblShadowsSpatialBlurPass } from \"./iblShadowsSpatialBlurPass\";\r\nimport { _IblShadowsAccumulationPass } from \"./iblShadowsAccumulationPass\";\r\nimport { PostProcessRenderPipeline } from \"../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"core/PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport { type Camera } from \"core/Cameras/camera.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer, type IGeometryBufferTextureTypeAndFormat } from \"core/Rendering/geometryBufferRenderer.pure\";\r\nimport { RegisterGeometryBufferRendererSceneComponent } from \"core/Rendering/geometryBufferRendererSceneComponent.pure\";\r\nimport { IblCdfGenerator } from \"core/Rendering/iblCdfGenerator\";\r\nimport { RegisterIblCdfGeneratorSceneComponent } from \"core/Rendering/iblCdfGeneratorSceneComponent.pure\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RawTexture3D } from \"core/Materials/Textures/rawTexture3D\";\r\nimport { IBLShadowsPluginMaterial } from \"./iblShadowsPluginMaterial.pure\";\r\nimport { IsIBLShadowsReceiverCompatible } from \"./iblShadowsMaterialCompatibility.pure\";\r\nimport { type Material } from \"core/Materials/material.pure\";\r\nimport { Observable } from \"core/Misc/observable.pure\";\r\nimport { Tools } from \"../../Misc/tools.pure\";\r\n\r\ninterface IIblShadowsSettings {\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n resolutionExp?: number;\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass. Higher\r\n * values will result in better quality, more stable shadows but are more expensive to compute.\r\n */\r\n sampleDirections?: number;\r\n\r\n /**\r\n * How dark the shadows are. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n shadowOpacity?: number;\r\n\r\n /**\r\n * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.\r\n */\r\n envRotation?: number;\r\n\r\n /**\r\n * A factor that controls how long the shadows remain in the scene.\r\n * 0.0 is no persistence, 1.0 is full persistence.\r\n * This value applies only while the camera is moving. Once stationary, the pipeline\r\n * increases remanence automatically to help the shadows converge.\r\n */\r\n shadowRemanence?: number;\r\n\r\n /**\r\n * Render the voxel grid from 3 different axis. This will result in better quality shadows with fewer\r\n * bits of missing geometry.\r\n */\r\n triPlanarVoxelization?: boolean;\r\n\r\n /**\r\n * A size multiplier for the internal shadow render targets (default 1.0). A value of 1.0 represents full-resolution.\r\n * Scaling this below 1.0 will result in blurry shadows and potentially more artifacts but\r\n * could help increase performance on less powerful GPU's.\r\n */\r\n shadowRenderSizeFactor?: number;\r\n\r\n /**\r\n * Separate control for the opacity of the voxel shadows.\r\n */\r\n voxelShadowOpacity?: number;\r\n\r\n /**\r\n * Include screen-space shadows in the IBL shadow pipeline. This adds sharp shadows to small details\r\n * but only applies close to a shadow-casting object.\r\n */\r\n ssShadowsEnabled?: boolean;\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n ssShadowSampleCount?: number;\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples\r\n * in pixels.\r\n */\r\n ssShadowStride?: number;\r\n\r\n /**\r\n * A scale for the maximum distance a screen-space shadow can be cast in world-space.\r\n * The maximum distance that screen-space shadows cast is derived from the voxel size\r\n * and this value so shouldn't need to change if you scale your scene.\r\n */\r\n ssShadowDistanceScale?: number;\r\n\r\n /**\r\n * Screen-space shadow thickness scale. This value controls the assumed thickness of\r\n * on-screen surfaces in world-space. It scales with the size of the shadow-casting\r\n * region so shouldn't need to change if you scale your scene.\r\n */\r\n ssShadowThicknessScale?: number;\r\n\r\n /**\r\n * Maximum number of translucent voxels a shadow ray roulettes through before it is treated as\r\n * unoccluded (default 16). Higher values converge more accurately through thick translucent volumes\r\n * (e.g. dense Gaussian splats) at extra cost. Opaque voxels always block on first contact.\r\n */\r\n maxVoxelRouletteTests?: number;\r\n}\r\n\r\n/**\r\n * Voxel-based shadow rendering for IBL's.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n */\r\nexport class IblShadowsRenderPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The scene that this pipeline is attached to\r\n */\r\n public scene: Scene;\r\n\r\n private _allowDebugPasses: boolean = false;\r\n private _debugPasses: { pass: PostProcess; enabled: boolean }[] = [];\r\n\r\n private _geometryBufferRenderer: GeometryBufferRenderer;\r\n\r\n private _shadowCastingMeshes: Mesh[] = [];\r\n\r\n private _voxelRenderer: _IblShadowsVoxelRenderer;\r\n private _voxelTracingPass: _IblShadowsVoxelTracingPass;\r\n private _spatialBlurPass: _IblShadowsSpatialBlurPass;\r\n private _accumulationPass: _IblShadowsAccumulationPass;\r\n private _noiseTexture: Texture;\r\n /**\r\n * Raw texture to be used before final data is available.\r\n * @internal\r\n */\r\n public _dummyTexture2d: RawTexture;\r\n private _dummyTexture3d: RawTexture3D;\r\n private _shadowOpacity: number = 0.8;\r\n private _enabled: boolean = true;\r\n private _coloredShadows: boolean = false;\r\n private _materialsWithRenderPlugin: Material[] = [];\r\n\r\n /**\r\n * Observable that triggers when the shadow renderer is ready\r\n */\r\n public onShadowTextureReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when a new IBL is set and the importance sampling is ready\r\n */\r\n public onNewIblReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when the voxelization is complete\r\n */\r\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * The current world-space size of that the voxel grid covers in the scene.\r\n */\r\n public voxelGridSize: number = 1.0;\r\n\r\n /**\r\n * Reset the shadow accumulation. This has a similar affect to lowering the remanence for a single frame.\r\n * This is useful when making a sudden change to the IBL.\r\n */\r\n public resetAccumulation(): void {\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get shadowOpacity(): number {\r\n return this._shadowOpacity;\r\n }\r\n\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Render the shadows in color rather than black and white.\r\n * This is slightly more expensive than black and white shadows but can be much\r\n * more accurate when the strongest lights in the IBL are non-white.\r\n */\r\n public get coloredShadows(): boolean {\r\n return this._coloredShadows;\r\n }\r\n\r\n public set coloredShadows(value: boolean) {\r\n this._coloredShadows = value;\r\n this._voxelTracingPass.coloredShadows = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n private _renderSizeFactor: number = 1.0;\r\n\r\n /**\r\n * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.\r\n */\r\n public get shadowRenderSizeFactor(): number {\r\n return this._renderSizeFactor;\r\n }\r\n\r\n public set shadowRenderSizeFactor(value: number) {\r\n this._renderSizeFactor = Math.max(Math.min(value, 1.0), 0.0);\r\n this._voxelTracingPass.resize(value);\r\n this._spatialBlurPass.resize(value);\r\n this._accumulationPass.resize(value);\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get voxelShadowOpacity() {\r\n return this._voxelTracingPass?.voxelShadowOpacity;\r\n }\r\n\r\n public set voxelShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.voxelShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * Maximum number of translucent voxels a shadow ray roulettes through before it is treated as\r\n * unoccluded. Higher values converge more accurately at extra cost. Opaque voxels always block.\r\n */\r\n public get maxVoxelRouletteTests(): number {\r\n return this._voxelTracingPass?.maxVoxelRouletteTests;\r\n }\r\n\r\n public set maxVoxelRouletteTests(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.maxVoxelRouletteTests = value;\r\n }\r\n\r\n /**\r\n * How dark the screen-space shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._voxelTracingPass?.ssShadowOpacity;\r\n }\r\n\r\n public set ssShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.ssShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public get ssShadowSampleCount(): number {\r\n return this._voxelTracingPass?.sssSamples;\r\n }\r\n\r\n public set ssShadowSampleCount(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples\r\n * in pixels.\r\n */\r\n public get ssShadowStride(): number {\r\n return this._voxelTracingPass?.sssStride;\r\n }\r\n\r\n public set ssShadowStride(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.sssStride = value;\r\n }\r\n\r\n private _sssMaxDistScale: number;\r\n\r\n /**\r\n * A scale for the maximum distance a screen-space shadow can be cast in world-space.\r\n * The maximum distance that screen-space shadows cast is derived from the voxel size\r\n * and this value so shouldn't need to change if you scale your scene\r\n */\r\n public get ssShadowDistanceScale(): number {\r\n return this._sssMaxDistScale;\r\n }\r\n\r\n public set ssShadowDistanceScale(value: number) {\r\n this._sssMaxDistScale = value;\r\n this._updateSsShadowParams();\r\n }\r\n\r\n private _sssThicknessScale: number;\r\n\r\n /**\r\n * Screen-space shadow thickness scale. This value controls the assumed thickness of\r\n * on-screen surfaces in world-space. It scales with the size of the shadow-casting\r\n * region so shouldn't need to change if you scale your scene.\r\n */\r\n public get ssShadowThicknessScale(): number {\r\n return this._sssThicknessScale;\r\n }\r\n\r\n public set ssShadowThicknessScale(value: number) {\r\n this._sssThicknessScale = value;\r\n this._updateSsShadowParams();\r\n }\r\n\r\n /**\r\n * Returns the texture containing the voxel grid data\r\n * @returns The texture containing the voxel grid data\r\n * @internal\r\n */\r\n public _getVoxelGridTexture(): Texture {\r\n const tex = this._voxelRenderer?.getVoxelGrid();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture3d;\r\n }\r\n\r\n /**\r\n * Returns the noise texture.\r\n * @returns The noise texture.\r\n * @internal\r\n */\r\n public _getNoiseTexture(): Texture {\r\n const tex = this._noiseTexture;\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the voxel-tracing texture.\r\n * @returns The voxel-tracing texture.\r\n * @internal\r\n */\r\n public _getVoxelTracingTexture(): Texture {\r\n const tex = this._voxelTracingPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the spatial blur texture.\r\n * @returns The spatial blur texture.\r\n * @internal\r\n */\r\n public _getSpatialBlurTexture(): Texture {\r\n const tex = this._spatialBlurPass.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the accumulated shadow texture.\r\n * @returns The accumulated shadow texture.\r\n * @internal\r\n */\r\n public _getAccumulatedTexture(): Texture {\r\n const tex = this._accumulationPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n private _gbufferDebugPass: PostProcess;\r\n private _gbufferDebugEnabled: boolean = false;\r\n private _gBufferDebugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Turn on or off the debug view of the G-Buffer. This will display only the targets\r\n * of the g-buffer that are used by the shadow pipeline.\r\n */\r\n public get gbufferDebugEnabled(): boolean {\r\n return this._gbufferDebugEnabled;\r\n }\r\n\r\n public set gbufferDebugEnabled(enabled: boolean) {\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable G-Buffer debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._gbufferDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n } else {\r\n this._disableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public get cdfDebugEnabled(): boolean {\r\n return this.scene.iblCdfGenerator ? this.scene.iblCdfGenerator.debugEnabled : false;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public set cdfDebugEnabled(enabled: boolean) {\r\n if (!this.scene.iblCdfGenerator) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable importance sampling debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this.scene.iblCdfGenerator.debugEnabled) {\r\n return;\r\n }\r\n this.scene.iblCdfGenerator.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this.scene.iblCdfGenerator.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this.scene.iblCdfGenerator.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for just the shadow samples taken this frame.\r\n */\r\n public get voxelTracingDebugEnabled(): boolean {\r\n return this._voxelTracingPass?.debugEnabled;\r\n }\r\n\r\n public set voxelTracingDebugEnabled(enabled: boolean) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel tracing debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._voxelTracingPass.debugEnabled) {\r\n return;\r\n }\r\n this._voxelTracingPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the spatial blur pass\r\n */\r\n public get spatialBlurPassDebugEnabled(): boolean {\r\n return this._spatialBlurPass.debugEnabled;\r\n }\r\n\r\n public set spatialBlurPassDebugEnabled(enabled: boolean) {\r\n if (!this._spatialBlurPass) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable spatial blur debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._spatialBlurPass.debugEnabled) {\r\n return;\r\n }\r\n this._spatialBlurPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the shadows accumulated over time.\r\n */\r\n public get accumulationPassDebugEnabled(): boolean {\r\n return this._accumulationPass?.debugEnabled;\r\n }\r\n\r\n public set accumulationPassDebugEnabled(enabled: boolean) {\r\n if (!this._accumulationPass) {\r\n return;\r\n }\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable accumulation pass debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._accumulationPass.debugEnabled) {\r\n return;\r\n }\r\n this._accumulationPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Add a mesh to be used for shadow-casting in the IBL shadow pipeline.\r\n * These meshes will be written to the voxel grid.\r\n * @param mesh A mesh or list of meshes that you want to cast shadows\r\n */\r\n public addShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n if (m && this._shadowCastingMeshes.indexOf(m) === -1) {\r\n this._shadowCastingMeshes.push(m);\r\n if (_IsGaussianSplattingMesh(m)) {\r\n (m as GaussianSplattingMesh).needsRotationScaleTextures = true;\r\n }\r\n }\r\n }\r\n } else {\r\n if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {\r\n this._shadowCastingMeshes.push(mesh);\r\n if (_IsGaussianSplattingMesh(mesh)) {\r\n (mesh as GaussianSplattingMesh).needsRotationScaleTextures = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the shadow-casting list. The mesh will no longer be written\r\n * to the voxel grid and will not cast shadows.\r\n * @param mesh The mesh or list of meshes that you don't want to cast shadows.\r\n */\r\n public removeShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n const index = this._shadowCastingMeshes.indexOf(m);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n if (_IsGaussianSplattingMesh(m)) {\r\n (m as GaussianSplattingMesh).needsRotationScaleTextures = false;\r\n }\r\n }\r\n }\r\n } else {\r\n const index = this._shadowCastingMeshes.indexOf(mesh);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n if (_IsGaussianSplattingMesh(mesh)) {\r\n (mesh as GaussianSplattingMesh).needsRotationScaleTextures = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the list of shadow-casting meshes. This will remove all meshes from the list\r\n */\r\n public clearShadowCastingMeshes(): void {\r\n for (const m of this._shadowCastingMeshes) {\r\n if (_IsGaussianSplattingMesh(m)) {\r\n (m as GaussianSplattingMesh).needsRotationScaleTextures = false;\r\n }\r\n }\r\n this._shadowCastingMeshes.length = 0;\r\n }\r\n\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n public get resolutionExp() {\r\n return this._voxelRenderer.voxelResolutionExp;\r\n }\r\n\r\n public set resolutionExp(newResolution: number) {\r\n if (newResolution === this._voxelRenderer.voxelResolutionExp) {\r\n return;\r\n }\r\n if (this._voxelRenderer.isVoxelizationInProgress()) {\r\n Logger.Warn(\"Can't change the resolution of the voxel grid while voxelization is in progress.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelResolutionExp = Math.max(1, Math.min(newResolution, 8));\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public get sampleDirections() {\r\n return this._voxelTracingPass?.sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public set sampleDirections(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public get shadowRemanence(): number {\r\n return this._accumulationPass?.remanence;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public set shadowRemanence(value: number) {\r\n if (!this._accumulationPass) {\r\n return;\r\n }\r\n this._accumulationPass.remanence = value;\r\n }\r\n\r\n /**\r\n * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.\r\n */\r\n public get envRotation() {\r\n return this._voxelTracingPass?.envRotation;\r\n }\r\n\r\n /**\r\n * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.\r\n */\r\n public set envRotation(value: number) {\r\n if (!this._voxelTracingPass) {\r\n return;\r\n }\r\n this._voxelTracingPass.envRotation = value;\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public get allowDebugPasses(): boolean {\r\n return this._allowDebugPasses;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public set allowDebugPasses(value: boolean) {\r\n if (this._allowDebugPasses === value) {\r\n return;\r\n }\r\n this._allowDebugPasses = value;\r\n if (value && this.scene.iblCdfGenerator) {\r\n if (this.scene.iblCdfGenerator.isReady()) {\r\n this._createDebugPasses();\r\n } else {\r\n this.scene.iblCdfGenerator.onGeneratedObservable.addOnce(() => {\r\n this._createDebugPasses();\r\n });\r\n }\r\n } else {\r\n this._disposeDebugPasses();\r\n }\r\n }\r\n\r\n /**\r\n * Support test.\r\n */\r\n public static get IsSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine._features.supportIBLShadows;\r\n }\r\n\r\n /**\r\n * Toggle the shadow tracing on or off\r\n * @param enabled Toggle the shadow tracing on or off\r\n */\r\n public toggleShadow(enabled: boolean) {\r\n this._enabled = enabled;\r\n this._voxelTracingPass.enabled = enabled;\r\n this._spatialBlurPass.enabled = enabled;\r\n this._accumulationPass.enabled = enabled;\r\n for (const mat of this._materialsWithRenderPlugin) {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(IBLShadowsPluginMaterial.Name) as IBLShadowsPluginMaterial;\r\n plugin.isEnabled = enabled;\r\n }\r\n }\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Trigger the scene to be re-voxelized. This should be run when any shadow-casters have been added, removed or moved.\r\n */\r\n public updateVoxelization() {\r\n if (this._shadowCastingMeshes.length === 0) {\r\n Logger.Warn(\"IBL Shadows: updateVoxelization called with no shadow-casting meshes to voxelize.\");\r\n return;\r\n }\r\n this._voxelRenderer.updateVoxelGrid(this._shadowCastingMeshes);\r\n this._voxelRenderer.onVoxelizationCompleteObservable.addOnce(() => {\r\n this.onVoxelizationCompleteObservable.notifyObservers();\r\n });\r\n this._updateSsShadowParams();\r\n }\r\n\r\n /**\r\n * Trigger the scene bounds of shadow-casters to be calculated. This is the world size that the voxel grid will cover and will always be a cube.\r\n */\r\n public updateSceneBounds() {\r\n const bounds: { min: Vector3; max: Vector3 } = {\r\n min: new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),\r\n max: new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE),\r\n };\r\n for (const mesh of this._shadowCastingMeshes) {\r\n const localBounds = mesh.getHierarchyBoundingVectors(true);\r\n bounds.min = Vector3.Minimize(bounds.min, localBounds.min);\r\n bounds.max = Vector3.Maximize(bounds.max, localBounds.max);\r\n }\r\n\r\n if (this._shadowCastingMeshes.length === 0) {\r\n Logger.Warn(\"IBL Shadows: updateSceneBounds called with no shadow-casting meshes.\");\r\n this.voxelGridSize = 1.0;\r\n return;\r\n }\r\n // If no visible geometry contributed, bounds stay at sentinel values. Keep the\r\n // last valid invWorldScale and return silently — this is expected when all parts\r\n // are temporarily hidden (e.g. while switching between displayed models).\r\n if (bounds.min.x > bounds.max.x) {\r\n return;\r\n }\r\n const size = bounds.max.subtract(bounds.min);\r\n this.voxelGridSize = Math.max(size.x, size.y, size.z);\r\n if (!isFinite(this.voxelGridSize) || this.voxelGridSize === 0) {\r\n Logger.Warn(\"IBL Shadows: Scene size is invalid. Can't update bounds.\");\r\n this.voxelGridSize = 1.0;\r\n return;\r\n }\r\n const halfSize = this.voxelGridSize / 2.0;\r\n const centre = bounds.max.add(bounds.min).multiplyByFloats(-0.5, -0.5, -0.5);\r\n const invWorldScaleMatrix = Matrix.Compose(new Vector3(1.0 / halfSize, 1.0 / halfSize, 1.0 / halfSize), new Quaternion(), new Vector3(0, 0, 0));\r\n const invTranslationMatrix = Matrix.Compose(new Vector3(1.0, 1.0, 1.0), new Quaternion(), centre);\r\n invTranslationMatrix.multiplyToRef(invWorldScaleMatrix, invWorldScaleMatrix);\r\n this._voxelTracingPass.setWorldScaleMatrix(invWorldScaleMatrix);\r\n this._voxelRenderer.setWorldScaleMatrix(invWorldScaleMatrix);\r\n // Set world scale for spatial blur.\r\n this._spatialBlurPass.setWorldScale(halfSize * 2.0);\r\n this._updateSsShadowParams();\r\n }\r\n\r\n /**\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param options Options to configure the pipeline\r\n * @param cameras Cameras to apply the pipeline to.\r\n */\r\n constructor(name: string, scene: Scene, options: Partial<IIblShadowsSettings> = {}, cameras?: Camera[]) {\r\n super(scene.getEngine(), name);\r\n this.scene = scene;\r\n RegisterGeometryBufferRendererSceneComponent(GeometryBufferRenderer);\r\n RegisterIblCdfGeneratorSceneComponent(IblCdfGenerator);\r\n this._cameras = cameras || [scene.activeCamera!];\r\n // Create the dummy textures to be used when the pipeline is not ready\r\n const blackPixels = new Uint8Array([0, 0, 0, 255]);\r\n this._dummyTexture2d = new RawTexture(blackPixels, 1, 1, Constants.TEXTUREFORMAT_RGBA, scene, false);\r\n this._dummyTexture3d = new RawTexture3D(blackPixels, 1, 1, 1, Constants.TEXTUREFORMAT_RGBA, scene, false);\r\n\r\n // Setup the geometry buffer target formats\r\n const textureTypesAndFormats: { [key: number]: IGeometryBufferTextureTypeAndFormat } = {};\r\n textureTypesAndFormats[GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.POSITION_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.NORMAL_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n const geometryBufferRenderer = scene.enableGeometryBufferRenderer(undefined, Constants.TEXTUREFORMAT_DEPTH32_FLOAT, textureTypesAndFormats);\r\n if (!geometryBufferRenderer) {\r\n Logger.Error(\"Geometry buffer renderer is required for IBL shadows to work.\");\r\n return;\r\n }\r\n this._geometryBufferRenderer = geometryBufferRenderer;\r\n this._geometryBufferRenderer.enableScreenspaceDepth = true;\r\n this._geometryBufferRenderer.enableVelocityLinear = true;\r\n this._geometryBufferRenderer.enablePosition = true;\r\n this._geometryBufferRenderer.enableNormal = true;\r\n this._geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n this.scene.enableIblCdfGenerator();\r\n this.shadowOpacity = options.shadowOpacity ?? 0.8;\r\n this._voxelRenderer = new _IblShadowsVoxelRenderer(\r\n this.scene,\r\n this,\r\n options ? options.resolutionExp : 6,\r\n options.triPlanarVoxelization !== undefined ? options.triPlanarVoxelization : true\r\n );\r\n this._voxelTracingPass = new _IblShadowsVoxelTracingPass(this.scene, this);\r\n this._spatialBlurPass = new _IblShadowsSpatialBlurPass(this.scene, this);\r\n this._accumulationPass = new _IblShadowsAccumulationPass(this.scene, this);\r\n this._accumulationPass.onReadyObservable.addOnce(() => {\r\n this.onShadowTextureReadyObservable.notifyObservers();\r\n });\r\n this.sampleDirections = options.sampleDirections || 2;\r\n this.voxelShadowOpacity = options.voxelShadowOpacity ?? 1.0;\r\n this.envRotation = options.envRotation ?? 0.0;\r\n this.shadowRenderSizeFactor = options.shadowRenderSizeFactor || 1.0;\r\n this.ssShadowOpacity = options.ssShadowsEnabled === undefined || options.ssShadowsEnabled ? 1.0 : 0.0;\r\n this.ssShadowDistanceScale = options.ssShadowDistanceScale || 1.25;\r\n this.ssShadowSampleCount = options.ssShadowSampleCount || 16;\r\n this.ssShadowStride = options.ssShadowStride || 8;\r\n this.ssShadowThicknessScale = options.ssShadowThicknessScale || 1.0;\r\n this.shadowRemanence = options.shadowRemanence ?? 0.75;\r\n this.maxVoxelRouletteTests = options.maxVoxelRouletteTests ?? 16;\r\n this._noiseTexture = new Texture(\r\n Tools.GetAssetUrl(\"https://assets.babylonjs.com/core/blue_noise/blue_noise_rgb.png\"),\r\n this.scene,\r\n false,\r\n true,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this.scene.onActiveCameraChanged.add(this._listenForCameraChanges.bind(this));\r\n this.scene.onBeforeRenderObservable.add(this._updateBeforeRender.bind(this));\r\n\r\n this._listenForCameraChanges();\r\n this.scene.getEngine().onResizeObservable.add(this._handleResize.bind(this));\r\n\r\n // Assigning the shadow texture to the materials needs to be done after the RT's are created.\r\n if (this.scene.iblCdfGenerator) {\r\n this.scene.iblCdfGenerator.onGeneratedObservable.add(() => {\r\n this._setPluginParameters();\r\n this.onNewIblReadyObservable.notifyObservers();\r\n });\r\n }\r\n }\r\n\r\n private _handleResize() {\r\n this._voxelRenderer.resize();\r\n this._voxelTracingPass.resize(this.shadowRenderSizeFactor);\r\n this._spatialBlurPass.resize(this.shadowRenderSizeFactor);\r\n this._accumulationPass.resize(this.shadowRenderSizeFactor);\r\n this._setPluginParameters();\r\n }\r\n\r\n private _getGBufferDebugPass(): PostProcess {\r\n if (this._gbufferDebugPass) {\r\n return this._gbufferDebugPass;\r\n }\r\n const isWebGPU = this.engine.isWebGPU;\r\n const textureNames: string[] = [\"depthSampler\", \"normalSampler\", \"positionSampler\", \"velocitySampler\"];\r\n\r\n const options: PostProcessOptions = {\r\n width: this.scene.getEngine().getRenderWidth(),\r\n height: this.scene.getEngine().getRenderHeight(),\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine: this.scene.getEngine(),\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n uniforms: [\"sizeParams\"],\r\n samplers: textureNames,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowGBufferDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowGBufferDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._gbufferDebugPass = new PostProcess(\"iblShadowGBufferDebug\", \"iblShadowGBufferDebug\", options);\r\n if (this.engine.isWebGPU) {\r\n this._gbufferDebugPass.samples = (this.engine as WebGPUEngine).currentSampleCount ?? 1;\r\n }\r\n this._gbufferDebugPass.autoClear = false;\r\n this._gbufferDebugPass.onApplyObservable.add((effect) => {\r\n const depthIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE);\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[depthIndex]);\r\n const normalIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE);\r\n effect.setTexture(\"normalSampler\", this._geometryBufferRenderer.getGBuffer().textures[normalIndex]);\r\n const positionIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n effect.setTexture(\"positionSampler\", this._geometryBufferRenderer.getGBuffer().textures[positionIndex]);\r\n const velocityIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n effect.setTexture(\"velocitySampler\", this._geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n effect.setVector4(\"sizeParams\", this._gBufferDebugSizeParams);\r\n if (this.scene.activeCamera) {\r\n effect.setFloat(\"maxDepth\", this.scene.activeCamera.maxZ);\r\n }\r\n });\r\n return this._gbufferDebugPass;\r\n }\r\n\r\n private _createDebugPasses() {\r\n if (this.scene.iblCdfGenerator) {\r\n this._debugPasses = [{ pass: this.scene.iblCdfGenerator.getDebugPassPP(), enabled: this.cdfDebugEnabled }];\r\n } else {\r\n this._debugPasses = [];\r\n }\r\n\r\n this._debugPasses.push(\r\n { pass: this._voxelTracingPass.getDebugPassPP(), enabled: this.voxelTracingDebugEnabled },\r\n { pass: this._spatialBlurPass.getDebugPassPP(), enabled: this.spatialBlurPassDebugEnabled },\r\n { pass: this._accumulationPass.getDebugPassPP(), enabled: this.accumulationPassDebugEnabled },\r\n { pass: this._getGBufferDebugPass(), enabled: this.gbufferDebugEnabled }\r\n );\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) {\r\n continue;\r\n }\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n this._debugPasses[i].pass.name,\r\n () => {\r\n return this._debugPasses[i].pass;\r\n },\r\n true\r\n )\r\n );\r\n }\r\n const cameras = this.cameras.slice();\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this.scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this.name, cameras);\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) {\r\n continue;\r\n }\r\n if (this._debugPasses[i].enabled) {\r\n this._enableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n } else {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n }\r\n }\r\n }\r\n\r\n private _disposeEffectPasses() {\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this._disposeDebugPasses();\r\n this._reset();\r\n }\r\n\r\n private _disposeDebugPasses() {\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n this._debugPasses[i].pass.dispose();\r\n }\r\n this._debugPasses = [];\r\n }\r\n\r\n private _updateDebugPasses() {\r\n let count = 0;\r\n if (this._gbufferDebugEnabled) {\r\n count++;\r\n }\r\n if (this.cdfDebugEnabled) {\r\n count++;\r\n }\r\n if (this.voxelTracingDebugEnabled) {\r\n count++;\r\n }\r\n if (this.spatialBlurPassDebugEnabled) {\r\n count++;\r\n }\r\n if (this.accumulationPassDebugEnabled) {\r\n count++;\r\n }\r\n\r\n const rows = Math.ceil(Math.sqrt(count));\r\n const cols = Math.ceil(count / rows);\r\n const width = 1.0 / cols;\r\n const height = 1.0 / rows;\r\n let x: number = 0;\r\n let y: number = 0;\r\n if (this.gbufferDebugEnabled) {\r\n this._gBufferDebugSizeParams.set(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n\r\n if (this.cdfDebugEnabled && this.scene.iblCdfGenerator) {\r\n this.scene.iblCdfGenerator.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.voxelTracingDebugEnabled) {\r\n this._voxelTracingPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.spatialBlurPassDebugEnabled) {\r\n this._spatialBlurPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.accumulationPassDebugEnabled) {\r\n this._accumulationPass.setDebugDisplayParams(x, y, cols, rows);\r\n }\r\n }\r\n\r\n /**\r\n * Update the SS shadow max distance and thickness based on the voxel grid size and resolution.\r\n * The max distance should be just a little larger than the world size of a single voxel.\r\n */\r\n private _updateSsShadowParams(): void {\r\n this._voxelTracingPass.sssMaxDist = (this._sssMaxDistScale * this.voxelGridSize) / (1 << this.resolutionExp);\r\n this._voxelTracingPass.sssThickness = this._sssThicknessScale * 0.005 * this.voxelGridSize;\r\n }\r\n\r\n /**\r\n * Apply the shadows to a material or array of materials. If no material is provided, all\r\n * materials in the scene will be added.\r\n * @param material Material that will be affected by the shadows. If not provided, all materials of the scene will be affected.\r\n */\r\n public addShadowReceivingMaterial(material?: Material | Material[]) {\r\n if (material) {\r\n if (Array.isArray(material)) {\r\n for (const m of material) {\r\n this._addShadowSupportToMaterial(m);\r\n }\r\n } else {\r\n this._addShadowSupportToMaterial(material);\r\n }\r\n } else {\r\n for (const mat of this.scene.materials) {\r\n this._addShadowSupportToMaterial(mat);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a material from the list of materials that receive shadows. If no material\r\n * is provided, all materials in the scene will be removed.\r\n * @param material The material or array of materials that will no longer receive shadows\r\n */\r\n public removeShadowReceivingMaterial(material: Material | Material[]) {\r\n if (Array.isArray(material)) {\r\n for (const m of material) {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(m);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = m.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n } else {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(material);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = material.pluginManager!.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the list of materials that receive shadows. This will remove all materials from the list\r\n */\r\n public clearShadowReceivingMaterials() {\r\n for (const mat of this._materialsWithRenderPlugin) {\r\n const plugin = mat.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (plugin) {\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n this._materialsWithRenderPlugin.length = 0;\r\n }\r\n\r\n protected _addShadowSupportToMaterial(material: Material) {\r\n if (!IsIBLShadowsReceiverCompatible(material)) {\r\n return;\r\n }\r\n let plugin = material.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (!plugin) {\r\n plugin = new IBLShadowsPluginMaterial(material);\r\n }\r\n if (this._materialsWithRenderPlugin.indexOf(material) !== -1) {\r\n return;\r\n }\r\n\r\n if (this._enabled) {\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n }\r\n\r\n plugin.isEnabled = this._enabled;\r\n plugin.isColored = this._coloredShadows;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enabled) {\r\n return;\r\n }\r\n\r\n for (const mat of this._materialsWithRenderPlugin) {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n plugin.isColored = this._coloredShadows;\r\n }\r\n }\r\n }\r\n\r\n private _updateBeforeRender() {\r\n this._updateDebugPasses();\r\n }\r\n\r\n private _listenForCameraChanges() {\r\n // We want to listen for camera changes and change settings while the camera is moving.\r\n this.scene.activeCamera?.onViewMatrixChangedObservable.add(() => {\r\n this._accumulationPass.isMoving = true;\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the IBL shadow pipeline is ready to render shadows\r\n * @returns true if the IBL shadow pipeline is ready to render the shadows\r\n */\r\n public isReady() {\r\n return (\r\n this._noiseTexture.isReady() &&\r\n this._voxelRenderer.isReady() &&\r\n this.scene.iblCdfGenerator &&\r\n this.scene.iblCdfGenerator.isReady() &&\r\n (!this._voxelTracingPass || this._voxelTracingPass.isReady()) &&\r\n (!this._spatialBlurPass || this._spatialBlurPass.isReady()) &&\r\n (!this._accumulationPass || this._accumulationPass.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"IBLShadowsRenderPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"IBLShadowsRenderPipeline\";\r\n }\r\n\r\n /**\r\n * Disposes the IBL shadow pipeline and associated resources\r\n */\r\n public override dispose() {\r\n const materials = this._materialsWithRenderPlugin.splice(0);\r\n for (const mat of materials) {\r\n this.removeShadowReceivingMaterial(mat);\r\n }\r\n this._disposeEffectPasses();\r\n this._noiseTexture.dispose();\r\n this._voxelRenderer.dispose();\r\n this._voxelTracingPass.dispose();\r\n this._spatialBlurPass.dispose();\r\n this._accumulationPass.dispose();\r\n this._dummyTexture2d.dispose();\r\n this._dummyTexture3d.dispose();\r\n this.onNewIblReadyObservable.clear();\r\n this.onShadowTextureReadyObservable.clear();\r\n this.onVoxelizationCompleteObservable.clear();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|