@babylonjs/core 7.37.0 → 7.37.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Buffers/buffer.d.ts +3 -1
- package/Buffers/buffer.js +20 -122
- package/Buffers/buffer.js.map +1 -1
- package/Buffers/bufferUtils.d.ts +32 -1
- package/Buffers/bufferUtils.js +221 -10
- package/Buffers/bufferUtils.js.map +1 -1
- package/Cameras/arcRotateCamera.d.ts +3 -1
- package/Cameras/arcRotateCamera.js +14 -3
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/engine.js +0 -4
- package/Engines/engine.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -0
- package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.d.ts +2 -0
- package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.js +3 -1
- package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.js.map +1 -1
- package/Inputs/scene.inputManager.js +2 -0
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Lights/IES/iesLoader.d.ts +19 -0
- package/Lights/IES/iesLoader.js +150 -0
- package/Lights/IES/iesLoader.js.map +1 -0
- package/Lights/index.d.ts +1 -0
- package/Lights/index.js +1 -0
- package/Lights/index.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +12 -2
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/GreasedLine/greasedLineMaterialInterfaces.d.ts +5 -0
- package/Materials/GreasedLine/greasedLineMaterialInterfaces.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterial.d.ts +21 -5
- package/Materials/GreasedLine/greasedLinePluginMaterial.js +52 -176
- package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.d.ts +11 -0
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +158 -0
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -0
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.d.ts +11 -0
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js +177 -0
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js.map +1 -0
- package/Materials/GreasedLine/greasedLineSimpleMaterial.d.ts +4 -2
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js +45 -25
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
- package/Materials/Node/Blocks/PBR/reflectionBlock.js +6 -0
- package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
- package/Materials/Node/Blocks/index.d.ts +1 -0
- package/Materials/Node/Blocks/index.js +1 -0
- package/Materials/Node/Blocks/index.js.map +1 -1
- package/Materials/Node/Blocks/matrixSplitterBlock.d.ts +56 -0
- package/Materials/Node/Blocks/matrixSplitterBlock.js +130 -0
- package/Materials/Node/Blocks/matrixSplitterBlock.js.map +1 -0
- package/Materials/Node/nodeMaterialBlock.js +1 -0
- package/Materials/Node/nodeMaterialBlock.js.map +1 -1
- package/Materials/Node/nodeMaterialBlockConnectionPoint.d.ts +2 -0
- package/Materials/Node/nodeMaterialBlockConnectionPoint.js +4 -1
- package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
- package/Materials/PBR/pbrBaseMaterial.js +12 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/Loaders/iesTextureLoader.d.ts +23 -0
- package/Materials/Textures/Loaders/iesTextureLoader.js +40 -0
- package/Materials/Textures/Loaders/iesTextureLoader.js.map +1 -0
- package/Materials/Textures/Loaders/index.d.ts +1 -0
- package/Materials/Textures/Loaders/index.js +1 -0
- package/Materials/Textures/Loaders/index.js.map +1 -1
- package/Materials/Textures/Loaders/textureLoaderManager.js +3 -0
- package/Materials/Textures/Loaders/textureLoaderManager.js.map +1 -1
- package/Materials/effectRenderer.js +1 -1
- package/Materials/effectRenderer.js.map +1 -1
- package/Materials/index.d.ts +4 -0
- package/Materials/index.js +5 -0
- package/Materials/index.js.map +1 -1
- package/Maths/math.scalar.d.ts +0 -1
- package/Maths/math.scalar.js +1 -2
- package/Maths/math.scalar.js.map +1 -1
- package/Meshes/Builders/greasedLineBuilder.js +2 -2
- package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +15 -2
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +68 -20
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/Node/Blocks/geometryInputBlock.d.ts +4 -0
- package/Meshes/Node/Blocks/geometryInputBlock.js +8 -0
- package/Meshes/Node/Blocks/geometryInputBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometryBlock.js +1 -0
- package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometryBlockConnectionPoint.d.ts +2 -0
- package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +3 -1
- package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
- package/Meshes/abstractMesh.hotSpot.d.ts +8 -1
- package/Meshes/abstractMesh.hotSpot.js +17 -0
- package/Meshes/abstractMesh.hotSpot.js.map +1 -1
- package/Meshes/linesMesh.js +1 -1
- package/Meshes/linesMesh.js.map +1 -1
- package/Misc/deepMerger.d.ts +6 -0
- package/Misc/deepMerger.js +26 -0
- package/Misc/deepMerger.js.map +1 -0
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/virtualJoystick.js +2 -0
- package/Misc/virtualJoystick.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +3 -23
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +30 -67
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +8 -4
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/boundingBoxRenderer.d.ts +63 -1
- package/Rendering/boundingBoxRenderer.js +224 -3
- package/Rendering/boundingBoxRenderer.js.map +1 -1
- package/Rendering/edgesRenderer.js +4 -1
- package/Rendering/edgesRenderer.js.map +1 -1
- package/Rendering/{IBLShadows/iblShadowsImportanceSamplingRenderer.d.ts → iblCdfGenerator.d.ts} +15 -12
- package/Rendering/{IBLShadows/iblShadowsImportanceSamplingRenderer.js → iblCdfGenerator.js} +37 -27
- package/Rendering/iblCdfGenerator.js.map +1 -0
- package/Rendering/iblCdfGeneratorSceneComponent.d.ts +59 -0
- package/Rendering/iblCdfGeneratorSceneComponent.js +83 -0
- package/Rendering/iblCdfGeneratorSceneComponent.js.map +1 -0
- package/Rendering/index.d.ts +12 -10
- package/Rendering/index.js +12 -10
- package/Rendering/index.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js +72 -2
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +29 -4
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflection.js +9 -1
- package/Shaders/ShadersInclude/pbrBlockReflection.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js +9 -1
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +3 -0
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/Shaders/boundingBoxRenderer.vertex.js +7 -0
- package/Shaders/boundingBoxRenderer.vertex.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +16 -2
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/{iblShadowsCdfy.fragment.d.ts → iblCdfx.fragment.d.ts} +1 -1
- package/Shaders/{iblShadowsCdfx.fragment.js → iblCdfx.fragment.js} +3 -3
- package/Shaders/iblCdfx.fragment.js.map +1 -0
- package/Shaders/{iblShadowsCdfx.fragment.d.ts → iblCdfy.fragment.d.ts} +1 -1
- package/Shaders/{iblShadowsCdfy.fragment.js → iblCdfy.fragment.js} +3 -3
- package/Shaders/iblCdfy.fragment.js.map +1 -0
- package/Shaders/{iblShadowsIcdfx.fragment.d.ts → iblIcdfx.fragment.d.ts} +1 -1
- package/Shaders/{iblShadowsIcdfx.fragment.js → iblIcdfx.fragment.js} +3 -3
- package/Shaders/iblIcdfx.fragment.js.map +1 -0
- package/Shaders/{iblShadowsIcdfy.fragment.d.ts → iblIcdfy.fragment.d.ts} +1 -1
- package/Shaders/{iblShadowsIcdfy.fragment.js → iblIcdfy.fragment.js} +3 -3
- package/Shaders/iblIcdfy.fragment.js.map +1 -0
- package/Shaders/importanceSamplingDebug.fragment.d.ts +5 -0
- package/Shaders/{iblShadowsImportanceSamplingDebug.fragment.js → importanceSamplingDebug.fragment.js} +3 -3
- package/Shaders/importanceSamplingDebug.fragment.js.map +1 -0
- package/Shaders/pbr.fragment.js +8 -0
- package/Shaders/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +77 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +28 -4
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/oitFragment.js +1 -1
- package/ShadersWGSL/ShadersInclude/oitFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js +14 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +14 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
- package/ShadersWGSL/boundingBoxRenderer.vertex.js +9 -1
- package/ShadersWGSL/boundingBoxRenderer.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +18 -2
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/greasedLine.fragment.d.ts +5 -0
- package/ShadersWGSL/greasedLine.fragment.js +25 -0
- package/ShadersWGSL/greasedLine.fragment.js.map +1 -0
- package/ShadersWGSL/greasedLine.vertex.d.ts +9 -0
- package/ShadersWGSL/greasedLine.vertex.js +43 -0
- package/ShadersWGSL/greasedLine.vertex.js.map +1 -0
- package/ShadersWGSL/iblCdfx.fragment.d.ts +5 -0
- package/ShadersWGSL/{iblShadowsCdfx.fragment.js → iblCdfx.fragment.js} +3 -3
- package/ShadersWGSL/iblCdfx.fragment.js.map +1 -0
- package/ShadersWGSL/iblCdfy.fragment.d.ts +5 -0
- package/ShadersWGSL/{iblShadowsCdfy.fragment.js → iblCdfy.fragment.js} +3 -3
- package/ShadersWGSL/iblCdfy.fragment.js.map +1 -0
- package/ShadersWGSL/iblIcdfx.fragment.d.ts +5 -0
- package/ShadersWGSL/{iblShadowsIcdfx.fragment.js → iblIcdfx.fragment.js} +3 -3
- package/ShadersWGSL/iblIcdfx.fragment.js.map +1 -0
- package/ShadersWGSL/iblIcdfy.fragment.d.ts +5 -0
- package/ShadersWGSL/{iblShadowsIcdfy.fragment.js → iblIcdfy.fragment.js} +3 -3
- package/ShadersWGSL/iblIcdfy.fragment.js.map +1 -0
- package/ShadersWGSL/importanceSamplingDebug.fragment.d.ts +5 -0
- package/ShadersWGSL/{iblShadowsImportanceSamplingDebug.fragment.js → importanceSamplingDebug.fragment.js} +3 -3
- package/ShadersWGSL/importanceSamplingDebug.fragment.js.map +1 -0
- package/ShadersWGSL/pbr.fragment.js +12 -0
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +4 -0
- package/scene.js +6 -0
- package/scene.js.map +1 -1
- package/sceneComponent.d.ts +1 -1
- package/sceneComponent.js +1 -1
- package/sceneComponent.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +0 -1
- package/Shaders/iblShadowsCdfx.fragment.js.map +0 -1
- package/Shaders/iblShadowsCdfy.fragment.js.map +0 -1
- package/Shaders/iblShadowsIcdfx.fragment.js.map +0 -1
- package/Shaders/iblShadowsIcdfy.fragment.js.map +0 -1
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.d.ts +0 -5
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js.map +0 -1
- package/ShadersWGSL/iblShadowsCdfx.fragment.d.ts +0 -5
- package/ShadersWGSL/iblShadowsCdfx.fragment.js.map +0 -1
- package/ShadersWGSL/iblShadowsCdfy.fragment.d.ts +0 -5
- package/ShadersWGSL/iblShadowsCdfy.fragment.js.map +0 -1
- package/ShadersWGSL/iblShadowsIcdfx.fragment.d.ts +0 -5
- package/ShadersWGSL/iblShadowsIcdfx.fragment.js.map +0 -1
- package/ShadersWGSL/iblShadowsIcdfy.fragment.d.ts +0 -5
- package/ShadersWGSL/iblShadowsIcdfy.fragment.js.map +0 -1
- package/ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.d.ts +0 -5
- package/ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblShadowsRenderPipeline.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsRenderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\n\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { _IblShadowsImportanceSamplingRenderer } from \"./iblShadowsImportanceSamplingRenderer\";\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\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"core/Rendering/geometryBufferRenderer\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RawTexture3D } from \"core/Materials/Textures/rawTexture3D\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport { IBLShadowsPluginMaterial } from \"./iblShadowsPluginMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\ninterface IblShadowsSettings {\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/**\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 _importanceSamplingRenderer: _IblShadowsImportanceSamplingRenderer;\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 _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 * 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 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) return;\r\n this._voxelTracingPass.voxelShadowOpacity = 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) return;\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) return;\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) return;\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 * Set the IBL image to be used for shadowing. It can be either a cubemap\r\n * or a 2D equirectangular texture.\r\n * @param iblSource The texture to use for IBL shadowing\r\n */\r\n public setIblTexture(iblSource: BaseTexture) {\r\n if (!this._importanceSamplingRenderer) return;\r\n this._importanceSamplingRenderer.iblSource = iblSource;\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 texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @returns The texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @internal\r\n */\r\n public _getIcdfyTexture(): Texture {\r\n const tex = this._importanceSamplingRenderer!.getIcdfyTexture();\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 texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @returns The texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @internal\r\n */\r\n public _getIcdfxTexture(): Texture {\r\n const tex = this._importanceSamplingRenderer.getIcdfxTexture();\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 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 importanceSamplingDebugEnabled(): boolean {\r\n return this._importanceSamplingRenderer?.debugEnabled;\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 importanceSamplingDebugEnabled(enabled: boolean) {\r\n if (!this._importanceSamplingRenderer) return;\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._importanceSamplingRenderer.debugEnabled) return;\r\n this._importanceSamplingRenderer.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._importanceSamplingRenderer.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._importanceSamplingRenderer.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * This displays the voxel grid in slices spread across the screen.\r\n * It also displays what slices of the model are stored in each layer\r\n * of the voxel grid. Each red stripe represents one layer while each gradient\r\n * (from bright red to black) represents the layers rendered in a single draw call.\r\n */\r\n public get voxelDebugEnabled(): boolean {\r\n return this._voxelRenderer?.voxelDebugEnabled;\r\n }\r\n\r\n public set voxelDebugEnabled(enabled: boolean) {\r\n if (!this._voxelRenderer) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * When using tri-planar voxelization (the default), this value can be used to\r\n * display only the voxelization result for that axis. z-axis = 0, y-axis = 1, x-axis = 2\r\n */\r\n public get voxelDebugAxis(): number {\r\n return this._voxelRenderer?.voxelDebugAxis;\r\n }\r\n\r\n public set voxelDebugAxis(axisNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.voxelDebugAxis = axisNum;\r\n }\r\n\r\n /**\r\n * Displays a given mip of the voxel grid. `voxelDebugAxis` must be undefined in this\r\n * case because we only generate mips for the combined voxel grid.\r\n */\r\n public set voxelDebugDisplayMip(mipNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.setDebugMipNumber(mipNum);\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) return;\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) return;\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) return;\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) return;\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) return;\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) return;\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 }\r\n }\r\n } else {\r\n if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {\r\n this._shadowCastingMeshes.push(mesh);\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 }\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 }\r\n }\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) return;\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) return;\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) return;\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) return;\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) return;\r\n this._allowDebugPasses = value;\r\n if (value) {\r\n if (this._importanceSamplingRenderer.isReady()) {\r\n this._createDebugPasses();\r\n } else {\r\n this._importanceSamplingRenderer.onReadyObservable.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 this._materialsWithRenderPlugin.forEach((mat) => {\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._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 this._shadowCastingMeshes.forEach((mesh) => {\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 const size = bounds.max.subtract(bounds.min);\r\n this.voxelGridSize = Math.max(size.x, size.y, size.z);\r\n if (this._shadowCastingMeshes.length === 0 || !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<IblShadowsSettings> = {}, cameras?: Camera[]) {\r\n super(scene.getEngine(), name);\r\n this.scene = scene;\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, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n this._dummyTexture3d = new RawTexture3D(blackPixels, 1, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n\r\n // Setup the geometry buffer target formats\r\n const textureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {};\r\n textureTypesAndFormats[GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_FLOAT,\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 };\r\n textureTypesAndFormats[GeometryBufferRenderer.POSITION_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.NORMAL_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\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\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._importanceSamplingRenderer = new _IblShadowsImportanceSamplingRenderer(this.scene);\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._noiseTexture = new Texture(\"https://assets.babylonjs.com/textures/blue_noise/blue_noise_rgb.png\", this.scene, false, true, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n if (this.scene.environmentTexture) {\r\n this._importanceSamplingRenderer.iblSource = this.scene.environmentTexture;\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 this._importanceSamplingRenderer.onReadyObservable.add(() => {\r\n this._setPluginParameters();\r\n this.onNewIblReadyObservable.notifyObservers();\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 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 this._debugPasses = [\r\n { pass: this._importanceSamplingRenderer.getDebugPassPP(), enabled: this.importanceSamplingDebugEnabled },\r\n { pass: this._voxelRenderer.getDebugPassPP(), enabled: this.voxelDebugEnabled },\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) continue;\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) continue;\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) count++;\r\n if (this.importanceSamplingDebugEnabled) count++;\r\n if (this.voxelDebugEnabled) count++;\r\n if (this.voxelTracingDebugEnabled) count++;\r\n if (this.spatialBlurPassDebugEnabled) count++;\r\n if (this.accumulationPassDebugEnabled) count++;\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 = 0;\r\n let y = 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.importanceSamplingDebugEnabled) {\r\n this._importanceSamplingRenderer.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.voxelDebugEnabled) {\r\n this._voxelRenderer.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 x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\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 material.forEach((m) => {\r\n this._addShadowSupportToMaterial(m);\r\n });\r\n } else {\r\n this._addShadowSupportToMaterial(material);\r\n }\r\n } else {\r\n this.scene.materials.forEach((mat) => {\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 material.forEach((m) => {\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 protected _addShadowSupportToMaterial(material: Material) {\r\n if (!(material instanceof PBRBaseMaterial) && !(material instanceof StandardMaterial)) {\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\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 this._materialsWithRenderPlugin.forEach((mat) => {\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 }\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._importanceSamplingRenderer.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 materials.forEach((mat) => {\r\n this.removeShadowReceivingMaterial(mat);\r\n });\r\n this._disposeEffectPasses();\r\n this._noiseTexture.dispose();\r\n this._voxelRenderer.dispose();\r\n this._importanceSamplingRenderer.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 super.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"iblShadowsRenderPipeline.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsRenderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\n\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\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\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"core/Rendering/geometryBufferRenderer\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RawTexture3D } from \"core/Materials/Textures/rawTexture3D\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport { IBLShadowsPluginMaterial } from \"./iblShadowsPluginMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\ninterface IblShadowsSettings {\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/**\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 _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 * 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 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) return;\r\n this._voxelTracingPass.voxelShadowOpacity = 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) return;\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) return;\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) return;\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) return;\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) return;\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 * This displays the voxel grid in slices spread across the screen.\r\n * It also displays what slices of the model are stored in each layer\r\n * of the voxel grid. Each red stripe represents one layer while each gradient\r\n * (from bright red to black) represents the layers rendered in a single draw call.\r\n */\r\n public get voxelDebugEnabled(): boolean {\r\n return this._voxelRenderer?.voxelDebugEnabled;\r\n }\r\n\r\n public set voxelDebugEnabled(enabled: boolean) {\r\n if (!this._voxelRenderer) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * When using tri-planar voxelization (the default), this value can be used to\r\n * display only the voxelization result for that axis. z-axis = 0, y-axis = 1, x-axis = 2\r\n */\r\n public get voxelDebugAxis(): number {\r\n return this._voxelRenderer?.voxelDebugAxis;\r\n }\r\n\r\n public set voxelDebugAxis(axisNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.voxelDebugAxis = axisNum;\r\n }\r\n\r\n /**\r\n * Displays a given mip of the voxel grid. `voxelDebugAxis` must be undefined in this\r\n * case because we only generate mips for the combined voxel grid.\r\n */\r\n public set voxelDebugDisplayMip(mipNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.setDebugMipNumber(mipNum);\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) return;\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) return;\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) return;\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) return;\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) return;\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) return;\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 }\r\n }\r\n } else {\r\n if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {\r\n this._shadowCastingMeshes.push(mesh);\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 }\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 }\r\n }\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) return;\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) return;\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) return;\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) return;\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) return;\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 this._materialsWithRenderPlugin.forEach((mat) => {\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._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 this._shadowCastingMeshes.forEach((mesh) => {\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 const size = bounds.max.subtract(bounds.min);\r\n this.voxelGridSize = Math.max(size.x, size.y, size.z);\r\n if (this._shadowCastingMeshes.length === 0 || !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<IblShadowsSettings> = {}, cameras?: Camera[]) {\r\n super(scene.getEngine(), name);\r\n this.scene = scene;\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, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n this._dummyTexture3d = new RawTexture3D(blackPixels, 1, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n\r\n // Setup the geometry buffer target formats\r\n const textureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {};\r\n textureTypesAndFormats[GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_FLOAT,\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 };\r\n textureTypesAndFormats[GeometryBufferRenderer.POSITION_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.NORMAL_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\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._noiseTexture = new Texture(\"https://assets.babylonjs.com/textures/blue_noise/blue_noise_rgb.png\", this.scene, false, true, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\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 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._voxelRenderer.getDebugPassPP(), enabled: this.voxelDebugEnabled },\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) continue;\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) continue;\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) count++;\r\n if (this.cdfDebugEnabled) count++;\r\n if (this.voxelDebugEnabled) count++;\r\n if (this.voxelTracingDebugEnabled) count++;\r\n if (this.spatialBlurPassDebugEnabled) count++;\r\n if (this.accumulationPassDebugEnabled) count++;\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 = 0;\r\n let y = 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.voxelDebugEnabled) {\r\n this._voxelRenderer.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 x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\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 material.forEach((m) => {\r\n this._addShadowSupportToMaterial(m);\r\n });\r\n } else {\r\n this._addShadowSupportToMaterial(material);\r\n }\r\n } else {\r\n this.scene.materials.forEach((mat) => {\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 material.forEach((m) => {\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 protected _addShadowSupportToMaterial(material: Material) {\r\n if (!(material instanceof PBRBaseMaterial) && !(material instanceof StandardMaterial)) {\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\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 this._materialsWithRenderPlugin.forEach((mat) => {\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 }\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 materials.forEach((mat) => {\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 super.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -309,8 +309,11 @@ export class _IblShadowsVoxelTracingPass {
|
|
|
309
309
|
this._outputTexture.setVector4("shadowOpacity", this._opacityParameters);
|
|
310
310
|
this._outputTexture.setTexture("voxelGridSampler", voxelGrid);
|
|
311
311
|
this._outputTexture.setTexture("blueNoiseSampler", this._renderPipeline._getNoiseTexture());
|
|
312
|
-
|
|
313
|
-
|
|
312
|
+
const cdfGenerator = this._scene.iblCdfGenerator;
|
|
313
|
+
if (cdfGenerator) {
|
|
314
|
+
this._outputTexture.setTexture("icdfySampler", cdfGenerator.getIcdfyTexture());
|
|
315
|
+
this._outputTexture.setTexture("icdfxSampler", cdfGenerator.getIcdfxTexture());
|
|
316
|
+
}
|
|
314
317
|
if (this._debugVoxelMarchEnabled) {
|
|
315
318
|
this._outputTexture.defines += "#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\n";
|
|
316
319
|
}
|
|
@@ -341,8 +344,9 @@ export class _IblShadowsVoxelTracingPass {
|
|
|
341
344
|
isReady() {
|
|
342
345
|
return (this._outputTexture.isReady() &&
|
|
343
346
|
!(this._debugPassPP && !this._debugPassPP.isReady()) &&
|
|
344
|
-
this.
|
|
345
|
-
this.
|
|
347
|
+
this._scene.iblCdfGenerator &&
|
|
348
|
+
this._scene.iblCdfGenerator.getIcdfyTexture().isReady() &&
|
|
349
|
+
this._scene.iblCdfGenerator.getIcdfxTexture().isReady() &&
|
|
346
350
|
this._renderPipeline._getVoxelGridTexture().isReady());
|
|
347
351
|
}
|
|
348
352
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblShadowsVoxelTracingPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelTracingPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAK9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,kEAA8D;AAG1F;;;;GAIG;AACH,MAAM,OAAO,2BAA2B;IAKpC;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IACD;;OAEG;IACH,IAAW,kBAAkB,CAAC,KAAa;QACvC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACrC,CAAC;IAOD;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IACD;;OAEG;IACH,IAAW,eAAe,CAAC,KAAa;QACpC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,SAAS,CAAC,KAAa;QAC9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAW,YAAY,CAAC,KAAa;QACjC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;IAaD;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IACD,IAAW,eAAe,CAAC,KAAa;QACpC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAClC,CAAC;IAGD;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IACD,IAAW,kBAAkB,CAAC,KAAa;QACvC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACrC,CAAC;IAOD;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB,CAAC,KAAa;QACrC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IAKD;;;OAGG;IACI,gBAAgB;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACI,cAAc;QACjB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAID;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAKD;;;OAGG;IACI,mBAAmB,CAAC,MAAc;QACrC,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;IACvC,CAAC;IAMD;;;;;;OAMG;IACI,qBAAqB,CAAC,CAAS,EAAE,CAAS,EAAE,UAAkB,EAAE,WAAmB;QACtF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,gBAAgB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,YAAY,GAAuB;gBACrC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;gBACpC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;gBACtC,QAAQ,EAAE,CAAC,YAAY,CAAC;gBACxB,QAAQ,EAAE,CAAC,cAAc,CAAC;gBAC1B,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,QAAQ,EAAE,KAAK;gBACf,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;gBACpE,oBAAoB,EAAE,CAAC,SAAkB,EAAE,IAAoB,EAAE,EAAE;oBAC/D,IAAI,SAAS,EAAE,CAAC;wBACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBACnE,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;oBAC/D,CAAC;gBACL,CAAC;aACJ,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACxF,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/C,yDAAyD;gBACzD,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBACvD,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,KAAY,EAAE,wBAAkD;QAzPpE,wBAAmB,GAAW,GAAG,CAAC;QAalC,gBAAW,GAAW,EAAE,CAAC;QACzB,eAAU,GAAW,CAAC,CAAC;QACvB,gBAAW,GAAW,IAAI,CAAC;QAC3B,kBAAa,GAAW,GAAG,CAAC;QAE5B,qBAAgB,GAAW,GAAG,CAAC;QAuE/B,mBAAc,GAAW,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3C,mBAAc,GAAW,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3C,yBAAoB,GAAW,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjD,aAAQ,GAAW,CAAC,CAAC;QACrB,sBAAiB,GAAW,CAAC,CAAC;QAC9B,sBAAiB,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7D,mBAAc,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1D,uBAAkB,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9D,yBAAoB,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChE,qBAAgB,GAAW,GAAG,CAAC;QAW/B,wBAAmB,GAAW,IAAI,CAAC;QAW3C;;WAEG;QACI,YAAO,GAAY,IAAI,CAAC;QA8B/B,0CAA0C;QACnC,iBAAY,GAAY,KAAK,CAAC;QAsB7B,mBAAc,GAAW,0BAA0B,CAAC;QAS5D,+GAA+G;QACvG,iBAAY,GAAW,GAAG,CAAC;QAU3B,4BAAuB,GAAY,KAAK,CAAC;QAEzC,qBAAgB,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAoDhE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,wBAAwB,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAEO,eAAe;QACnB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YACnC,OAAO,IAAI,wBAAwB,CAAC;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,OAAO,IAAI,iDAAiD,CAAC;QACjE,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,MAAM,cAAc,GAAsC;YACtD,IAAI,EAAE,SAAS,CAAC,yBAAyB;YACzC,MAAM,EAAE,SAAS,CAAC,kBAAkB;YACpC,YAAY,EAAE,SAAS,CAAC,4BAA4B;YACpD,mBAAmB,EAAE,KAAK;YAC1B,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC,CAAC;gBACpF,CAAC;qBAAM,CAAC;oBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC,CAAC;gBAChF,CAAC;YACL,CAAC;SACJ,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,iBAAiB,CACvC,kBAAkB,EAClB;YACI,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YACpC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;SACzC,EACD,uBAAuB,EACvB,IAAI,CAAC,MAAM,EACX,cAAc,CACjB,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;QACtC,+FAA+F;QAC/F,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC,CAAC;QAE7C,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;YAC1C,OAAO,GAAG,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,oCAAoC,CAAC,GAAG,CAAC,GAAG,EAAE;YACtD,IAAI,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;gBACjB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;oBAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC,CAAC;oBAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACjC,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,YAAY,CAAC,MAAc;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YACnC,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,wBAAwB,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,mBAAmB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9D,MAAM,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE/E,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;QAC3H,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,eAAgB,CAAC,oBAAoB,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAChG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAEjF,eAAe;QACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACjG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACrE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACvF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,eAAgB,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,eAAgB,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,eAAgB,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzF,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,iDAAiD,CAAC;QACrF,CAAC;QAED,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;QAClE,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC1B,OAAO;QACX,CAAC;QACD,MAAM,UAAU,GAAG,sBAAsB,CAAC,eAAe,CAAC,sBAAsB,CAAC,8BAA8B,CAAC,CAAC;QACjH,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,sBAAsB,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACzG,MAAM,YAAY,GAAG,sBAAsB,CAAC,eAAe,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;QACxG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACrH,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,cAAsB,GAAG;QACnC,MAAM,OAAO,GAAG;YACZ,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,WAAW,CAAC,CAAC;YAC7E,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,WAAW,CAAC,CAAC;SAClF,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,OAAO,CACH,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YAC7B,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,CAAC,eAAgB,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE;YAClD,IAAI,CAAC,eAAgB,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE;YAClD,IAAI,CAAC,eAAgB,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,CACzD,CAAC;IACN,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC;IACL,CAAC;CACJ","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer\";\r\nimport { ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\n\r\n/**\r\n * Build cdf maps for IBL importance sampling during IBL shadow computation.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsVoxelTracingPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n private _voxelShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public get voxelShadowOpacity(): number {\r\n return this._voxelShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public set voxelShadowOpacity(value: number) {\r\n this._voxelShadowOpacity = value;\r\n }\r\n private _sssSamples: number = 16;\r\n private _sssStride: number = 8;\r\n private _sssMaxDist: number = 0.05;\r\n private _sssThickness: number = 0.5;\r\n\r\n private _ssShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._ssShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public set ssShadowOpacity(value: number) {\r\n this._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 sssSamples(): number {\r\n return this._sssSamples;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public set sssSamples(value: number) {\r\n this._sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public get sssStride(): number {\r\n return this._sssStride;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public set sssStride(value: number) {\r\n this._sssStride = value;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public get sssMaxDist(): number {\r\n return this._sssMaxDist;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public set sssMaxDist(value: number) {\r\n this._sssMaxDist = value;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public get sssThickness(): number {\r\n return this._sssThickness;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public set sssThickness(value: number) {\r\n this._sssThickness = value;\r\n }\r\n\r\n private _outputTexture: ProceduralTexture;\r\n private _cameraInvView: Matrix = Matrix.Identity();\r\n private _cameraInvProj: Matrix = Matrix.Identity();\r\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\r\n private _frameId: number = 0;\r\n private _sampleDirections: number = 4;\r\n private _shadowParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _sssParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _opacityParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _voxelBiasParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _voxelNormalBias: number = 1.4;\r\n /**\r\n * The bias to apply to the voxel sampling in the direction of the surface normal of the geometry.\r\n */\r\n public get voxelNormalBias(): number {\r\n return this._voxelNormalBias;\r\n }\r\n public set voxelNormalBias(value: number) {\r\n this._voxelNormalBias = value;\r\n }\r\n\r\n private _voxelDirectionBias: number = 1.75;\r\n /**\r\n * The bias to apply to the voxel sampling in the direction of the light.\r\n */\r\n public get voxelDirectionBias(): number {\r\n return this._voxelDirectionBias;\r\n }\r\n public set voxelDirectionBias(value: number) {\r\n this._voxelDirectionBias = value;\r\n }\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public enabled: boolean = true;\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public get sampleDirections(): number {\r\n return this._sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public set sampleDirections(value: number) {\r\n this._sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public get envRotation(): number {\r\n return this._envRotation;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public set envRotation(value: number) {\r\n this._envRotation = value;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Returns the output texture of the pass.\r\n * @returns The output texture.\r\n */\r\n public getOutputTexture(): ProceduralTexture {\r\n return this._outputTexture;\r\n }\r\n\r\n /**\r\n * Gets the debug pass post process. This will create the resources for the pass\r\n * if they don't already exist.\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Voxel Tracing Debug Pass\";\r\n\r\n /**\r\n * The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /** The default rotation of the environment map will align the shadows with the default lighting orientation */\r\n private _envRotation: number = 0.0;\r\n\r\n /**\r\n * Set the matrix to use for scaling the world space to voxel space\r\n * @param matrix The matrix to use for scaling the world space to voxel space\r\n */\r\n public setWorldScaleMatrix(matrix: Matrix) {\r\n this._invWorldScaleMatrix = matrix;\r\n }\r\n\r\n private _debugVoxelMarchEnabled: boolean = false;\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n if (!this._debugPassPP) {\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\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/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the shadow voxel-tracing pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The shadow voxel-tracing pass\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n let defines = \"\";\r\n if (this._scene.useRightHandedSystem) {\r\n defines += \"#define RIGHT_HANDED\\n\";\r\n }\r\n if (this._debugVoxelMarchEnabled) {\r\n defines += \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n const isWebGPU = this._engine.isWebGPU;\r\n const textureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowVoxelTracing.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowVoxelTracing.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"voxelTracingPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowVoxelTracing\",\r\n this._scene,\r\n textureOptions\r\n );\r\n this._outputTexture.refreshRate = -1;\r\n this._outputTexture.autoClear = false;\r\n this._outputTexture.defines = defines;\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setBindings(this._scene.activeCamera!);\r\n\r\n let counter = 0;\r\n this._scene.onBeforeRenderObservable.add(() => {\r\n counter = 0;\r\n });\r\n this._scene.onAfterRenderTargetsRenderObservable.add(() => {\r\n if (++counter == 2) {\r\n if (this.enabled && this._outputTexture.isReady()) {\r\n this._setBindings(this._scene.activeCamera!);\r\n this._outputTexture.render();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _setBindings(camera: Camera) {\r\n if (this._scene.useRightHandedSystem) {\r\n this._outputTexture.defines = \"#define RIGHT_HANDED\\n\";\r\n }\r\n this._outputTexture.setMatrix(\"viewMtx\", camera.getViewMatrix());\r\n this._outputTexture.setMatrix(\"projMtx\", camera.getProjectionMatrix());\r\n camera.getProjectionMatrix().invertToRef(this._cameraInvProj);\r\n camera.getViewMatrix().invertToRef(this._cameraInvView);\r\n this._outputTexture.setMatrix(\"invProjMtx\", this._cameraInvProj);\r\n this._outputTexture.setMatrix(\"invViewMtx\", this._cameraInvView);\r\n this._outputTexture.setMatrix(\"wsNormalizationMtx\", this._invWorldScaleMatrix);\r\n\r\n this._frameId++;\r\n\r\n let rotation = this._scene.useRightHandedSystem ? -(this._envRotation + 0.5 * Math.PI) : this._envRotation - 0.5 * Math.PI;\r\n rotation = rotation % (2.0 * Math.PI);\r\n this._shadowParameters.set(this._sampleDirections, this._frameId, 1.0, rotation);\r\n this._outputTexture.setVector4(\"shadowParameters\", this._shadowParameters);\r\n const voxelGrid = this._renderPipeline!._getVoxelGridTexture();\r\n const highestMip = Math.floor(Math.log2(voxelGrid!.getSize().width));\r\n this._voxelBiasParameters.set(this._voxelNormalBias, this._voxelDirectionBias, highestMip, 0.0);\r\n this._outputTexture.setVector4(\"voxelBiasParameters\", this._voxelBiasParameters);\r\n\r\n // SSS Options.\r\n this._sssParameters.set(this._sssSamples, this._sssStride, this._sssMaxDist, this._sssThickness);\r\n this._outputTexture.setVector4(\"sssParameters\", this._sssParameters);\r\n this._opacityParameters.set(this._voxelShadowOpacity, this._ssShadowOpacity, 0.0, 0.0);\r\n this._outputTexture.setVector4(\"shadowOpacity\", this._opacityParameters);\r\n this._outputTexture.setTexture(\"voxelGridSampler\", voxelGrid);\r\n this._outputTexture.setTexture(\"blueNoiseSampler\", this._renderPipeline!._getNoiseTexture());\r\n this._outputTexture.setTexture(\"icdfySampler\", this._renderPipeline!._getIcdfyTexture());\r\n this._outputTexture.setTexture(\"icdfxSampler\", this._renderPipeline!._getIcdfxTexture());\r\n if (this._debugVoxelMarchEnabled) {\r\n this._outputTexture.defines += \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return;\r\n }\r\n const depthIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"depthSampler\", geometryBufferRenderer.getGBuffer().textures[depthIndex]);\r\n const wnormalIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"worldNormalSampler\", geometryBufferRenderer.getGBuffer().textures[wnormalIndex]);\r\n }\r\n\r\n /**\r\n * Called by render pipeline when canvas resized.\r\n * @param scaleFactor The factor by which to scale the canvas size.\r\n */\r\n public resize(scaleFactor: number = 1.0) {\r\n const newSize = {\r\n width: Math.max(1.0, Math.floor(this._engine.getRenderWidth() * scaleFactor)),\r\n height: Math.max(1.0, Math.floor(this._engine.getRenderHeight() * scaleFactor)),\r\n };\r\n this._outputTexture.resize(newSize, false);\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._outputTexture.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady()) &&\r\n this._renderPipeline!._getIcdfyTexture().isReady() &&\r\n this._renderPipeline!._getIcdfxTexture().isReady() &&\r\n this._renderPipeline!._getVoxelGridTexture().isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._outputTexture.dispose();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"iblShadowsVoxelTracingPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelTracingPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer\";\r\nimport { ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\n\r\n/**\r\n * Build cdf maps for IBL importance sampling during IBL shadow computation.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsVoxelTracingPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n private _voxelShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public get voxelShadowOpacity(): number {\r\n return this._voxelShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public set voxelShadowOpacity(value: number) {\r\n this._voxelShadowOpacity = value;\r\n }\r\n private _sssSamples: number = 16;\r\n private _sssStride: number = 8;\r\n private _sssMaxDist: number = 0.05;\r\n private _sssThickness: number = 0.5;\r\n\r\n private _ssShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._ssShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public set ssShadowOpacity(value: number) {\r\n this._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 sssSamples(): number {\r\n return this._sssSamples;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public set sssSamples(value: number) {\r\n this._sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public get sssStride(): number {\r\n return this._sssStride;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public set sssStride(value: number) {\r\n this._sssStride = value;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public get sssMaxDist(): number {\r\n return this._sssMaxDist;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public set sssMaxDist(value: number) {\r\n this._sssMaxDist = value;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public get sssThickness(): number {\r\n return this._sssThickness;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public set sssThickness(value: number) {\r\n this._sssThickness = value;\r\n }\r\n\r\n private _outputTexture: ProceduralTexture;\r\n private _cameraInvView: Matrix = Matrix.Identity();\r\n private _cameraInvProj: Matrix = Matrix.Identity();\r\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\r\n private _frameId: number = 0;\r\n private _sampleDirections: number = 4;\r\n private _shadowParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _sssParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _opacityParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _voxelBiasParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n private _voxelNormalBias: number = 1.4;\r\n /**\r\n * The bias to apply to the voxel sampling in the direction of the surface normal of the geometry.\r\n */\r\n public get voxelNormalBias(): number {\r\n return this._voxelNormalBias;\r\n }\r\n public set voxelNormalBias(value: number) {\r\n this._voxelNormalBias = value;\r\n }\r\n\r\n private _voxelDirectionBias: number = 1.75;\r\n /**\r\n * The bias to apply to the voxel sampling in the direction of the light.\r\n */\r\n public get voxelDirectionBias(): number {\r\n return this._voxelDirectionBias;\r\n }\r\n public set voxelDirectionBias(value: number) {\r\n this._voxelDirectionBias = value;\r\n }\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public enabled: boolean = true;\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public get sampleDirections(): number {\r\n return this._sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public set sampleDirections(value: number) {\r\n this._sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public get envRotation(): number {\r\n return this._envRotation;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public set envRotation(value: number) {\r\n this._envRotation = value;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Returns the output texture of the pass.\r\n * @returns The output texture.\r\n */\r\n public getOutputTexture(): ProceduralTexture {\r\n return this._outputTexture;\r\n }\r\n\r\n /**\r\n * Gets the debug pass post process. This will create the resources for the pass\r\n * if they don't already exist.\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Voxel Tracing Debug Pass\";\r\n\r\n /**\r\n * The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /** The default rotation of the environment map will align the shadows with the default lighting orientation */\r\n private _envRotation: number = 0.0;\r\n\r\n /**\r\n * Set the matrix to use for scaling the world space to voxel space\r\n * @param matrix The matrix to use for scaling the world space to voxel space\r\n */\r\n public setWorldScaleMatrix(matrix: Matrix) {\r\n this._invWorldScaleMatrix = matrix;\r\n }\r\n\r\n private _debugVoxelMarchEnabled: boolean = false;\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n if (!this._debugPassPP) {\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\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/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the shadow voxel-tracing pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The shadow voxel-tracing pass\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n let defines = \"\";\r\n if (this._scene.useRightHandedSystem) {\r\n defines += \"#define RIGHT_HANDED\\n\";\r\n }\r\n if (this._debugVoxelMarchEnabled) {\r\n defines += \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n const isWebGPU = this._engine.isWebGPU;\r\n const textureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowVoxelTracing.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowVoxelTracing.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"voxelTracingPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowVoxelTracing\",\r\n this._scene,\r\n textureOptions\r\n );\r\n this._outputTexture.refreshRate = -1;\r\n this._outputTexture.autoClear = false;\r\n this._outputTexture.defines = defines;\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setBindings(this._scene.activeCamera!);\r\n\r\n let counter = 0;\r\n this._scene.onBeforeRenderObservable.add(() => {\r\n counter = 0;\r\n });\r\n this._scene.onAfterRenderTargetsRenderObservable.add(() => {\r\n if (++counter == 2) {\r\n if (this.enabled && this._outputTexture.isReady()) {\r\n this._setBindings(this._scene.activeCamera!);\r\n this._outputTexture.render();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _setBindings(camera: Camera) {\r\n if (this._scene.useRightHandedSystem) {\r\n this._outputTexture.defines = \"#define RIGHT_HANDED\\n\";\r\n }\r\n this._outputTexture.setMatrix(\"viewMtx\", camera.getViewMatrix());\r\n this._outputTexture.setMatrix(\"projMtx\", camera.getProjectionMatrix());\r\n camera.getProjectionMatrix().invertToRef(this._cameraInvProj);\r\n camera.getViewMatrix().invertToRef(this._cameraInvView);\r\n this._outputTexture.setMatrix(\"invProjMtx\", this._cameraInvProj);\r\n this._outputTexture.setMatrix(\"invViewMtx\", this._cameraInvView);\r\n this._outputTexture.setMatrix(\"wsNormalizationMtx\", this._invWorldScaleMatrix);\r\n\r\n this._frameId++;\r\n\r\n let rotation = this._scene.useRightHandedSystem ? -(this._envRotation + 0.5 * Math.PI) : this._envRotation - 0.5 * Math.PI;\r\n rotation = rotation % (2.0 * Math.PI);\r\n this._shadowParameters.set(this._sampleDirections, this._frameId, 1.0, rotation);\r\n this._outputTexture.setVector4(\"shadowParameters\", this._shadowParameters);\r\n const voxelGrid = this._renderPipeline!._getVoxelGridTexture();\r\n const highestMip = Math.floor(Math.log2(voxelGrid!.getSize().width));\r\n this._voxelBiasParameters.set(this._voxelNormalBias, this._voxelDirectionBias, highestMip, 0.0);\r\n this._outputTexture.setVector4(\"voxelBiasParameters\", this._voxelBiasParameters);\r\n\r\n // SSS Options.\r\n this._sssParameters.set(this._sssSamples, this._sssStride, this._sssMaxDist, this._sssThickness);\r\n this._outputTexture.setVector4(\"sssParameters\", this._sssParameters);\r\n this._opacityParameters.set(this._voxelShadowOpacity, this._ssShadowOpacity, 0.0, 0.0);\r\n this._outputTexture.setVector4(\"shadowOpacity\", this._opacityParameters);\r\n this._outputTexture.setTexture(\"voxelGridSampler\", voxelGrid);\r\n this._outputTexture.setTexture(\"blueNoiseSampler\", this._renderPipeline!._getNoiseTexture());\r\n const cdfGenerator = this._scene.iblCdfGenerator;\r\n if (cdfGenerator) {\r\n this._outputTexture.setTexture(\"icdfySampler\", cdfGenerator.getIcdfyTexture());\r\n this._outputTexture.setTexture(\"icdfxSampler\", cdfGenerator.getIcdfxTexture());\r\n }\r\n if (this._debugVoxelMarchEnabled) {\r\n this._outputTexture.defines += \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return;\r\n }\r\n const depthIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"depthSampler\", geometryBufferRenderer.getGBuffer().textures[depthIndex]);\r\n const wnormalIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"worldNormalSampler\", geometryBufferRenderer.getGBuffer().textures[wnormalIndex]);\r\n }\r\n\r\n /**\r\n * Called by render pipeline when canvas resized.\r\n * @param scaleFactor The factor by which to scale the canvas size.\r\n */\r\n public resize(scaleFactor: number = 1.0) {\r\n const newSize = {\r\n width: Math.max(1.0, Math.floor(this._engine.getRenderWidth() * scaleFactor)),\r\n height: Math.max(1.0, Math.floor(this._engine.getRenderHeight() * scaleFactor)),\r\n };\r\n this._outputTexture.resize(newSize, false);\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._outputTexture.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady()) &&\r\n this._scene.iblCdfGenerator &&\r\n this._scene.iblCdfGenerator.getIcdfyTexture().isReady() &&\r\n this._scene.iblCdfGenerator.getIcdfxTexture().isReady() &&\r\n this._renderPipeline!._getVoxelGridTexture().isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._outputTexture.dispose();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}
|