@babylonjs/core 7.45.0 → 7.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/Buffers/bufferUtils.d.ts +28 -1
  2. package/Buffers/bufferUtils.js +104 -1
  3. package/Buffers/bufferUtils.js.map +1 -1
  4. package/Decorators/nodeDecorator.js +1 -1
  5. package/Decorators/nodeDecorator.js.map +1 -1
  6. package/Engines/Extensions/engine.renderTarget.js +2 -1
  7. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  8. package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
  9. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  10. package/Engines/WebGPU/Extensions/engine.renderTarget.js +2 -1
  11. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  12. package/Engines/abstractEngine.js +2 -2
  13. package/Engines/abstractEngine.js.map +1 -1
  14. package/Engines/renderTargetWrapper.js +1 -1
  15. package/Engines/renderTargetWrapper.js.map +1 -1
  16. package/Engines/thinEngine.js +2 -1
  17. package/Engines/thinEngine.js.map +1 -1
  18. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.d.ts +5 -0
  19. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.js +7 -0
  20. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.js.map +1 -1
  21. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +3 -0
  22. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +13 -0
  23. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  24. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.d.ts +0 -3
  25. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js +0 -13
  26. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js.map +1 -1
  27. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +3 -0
  28. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +1 -1
  29. package/FrameGraph/Node/nodeRenderGraph.js +9 -5
  30. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  31. package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -0
  32. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  33. package/FrameGraph/Passes/renderPass.d.ts +11 -0
  34. package/FrameGraph/Passes/renderPass.js +40 -0
  35. package/FrameGraph/Passes/renderPass.js.map +1 -1
  36. package/FrameGraph/Tasks/Layers/baseLayerTask.js +3 -2
  37. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  38. package/FrameGraph/Tasks/Layers/highlightLayerTask.js +1 -1
  39. package/FrameGraph/Tasks/Layers/highlightLayerTask.js.map +1 -1
  40. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js +1 -1
  41. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js.map +1 -1
  42. package/FrameGraph/Tasks/PostProcesses/bloomTask.js +1 -1
  43. package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
  44. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js +1 -1
  45. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js.map +1 -1
  46. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +1 -1
  47. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
  48. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +2 -2
  49. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  50. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +1 -0
  51. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
  52. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +2 -1
  53. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  54. package/FrameGraph/Tasks/Texture/copyToBackbufferColorTask.js +1 -0
  55. package/FrameGraph/Tasks/Texture/copyToBackbufferColorTask.js.map +1 -1
  56. package/FrameGraph/Tasks/Texture/copyToTextureTask.js +1 -1
  57. package/FrameGraph/Tasks/Texture/copyToTextureTask.js.map +1 -1
  58. package/FrameGraph/frameGraph.d.ts +5 -5
  59. package/FrameGraph/frameGraph.js +31 -21
  60. package/FrameGraph/frameGraph.js.map +1 -1
  61. package/FrameGraph/frameGraphTask.d.ts +8 -2
  62. package/FrameGraph/frameGraphTask.js +12 -12
  63. package/FrameGraph/frameGraphTask.js.map +1 -1
  64. package/FrameGraph/frameGraphTextureManager.d.ts +33 -2
  65. package/FrameGraph/frameGraphTextureManager.js +368 -27
  66. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  67. package/Lights/LTC/ltcTextureTool.d.ts +20 -0
  68. package/Lights/LTC/ltcTextureTool.js +24 -0
  69. package/Lights/LTC/ltcTextureTool.js.map +1 -0
  70. package/Lights/Shadows/shadowGenerator.d.ts +10 -0
  71. package/Lights/Shadows/shadowGenerator.js +5 -0
  72. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  73. package/Lights/Shadows/shadowGeneratorSceneComponent.js +6 -0
  74. package/Lights/Shadows/shadowGeneratorSceneComponent.js.map +1 -1
  75. package/Lights/areaLight.d.ts +39 -0
  76. package/Lights/areaLight.js +81 -0
  77. package/Lights/areaLight.js.map +1 -0
  78. package/Lights/index.d.ts +2 -0
  79. package/Lights/index.js +2 -0
  80. package/Lights/index.js.map +1 -1
  81. package/Lights/light.d.ts +8 -0
  82. package/Lights/light.js +10 -0
  83. package/Lights/light.js.map +1 -1
  84. package/Lights/lightConstants.d.ts +4 -0
  85. package/Lights/lightConstants.js +4 -0
  86. package/Lights/lightConstants.js.map +1 -1
  87. package/Lights/rectAreaLight.d.ts +61 -0
  88. package/Lights/rectAreaLight.js +127 -0
  89. package/Lights/rectAreaLight.js.map +1 -0
  90. package/Loading/loadingScreen.d.ts +21 -1
  91. package/Loading/loadingScreen.js +125 -52
  92. package/Loading/loadingScreen.js.map +1 -1
  93. package/Materials/Node/Blocks/Dual/lightBlock.js +2 -0
  94. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  95. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +1 -1
  96. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  97. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +2 -1
  98. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  99. package/Materials/Node/Blocks/debugBlock.d.ts +38 -0
  100. package/Materials/Node/Blocks/debugBlock.js +92 -0
  101. package/Materials/Node/Blocks/debugBlock.js.map +1 -0
  102. package/Materials/Node/Blocks/index.d.ts +1 -0
  103. package/Materials/Node/Blocks/index.js +1 -0
  104. package/Materials/Node/Blocks/index.js.map +1 -1
  105. package/Materials/Node/nodeMaterial.d.ts +2 -0
  106. package/Materials/Node/nodeMaterial.js +20 -2
  107. package/Materials/Node/nodeMaterial.js.map +1 -1
  108. package/Materials/Node/nodeMaterialBlock.d.ts +8 -1
  109. package/Materials/Node/nodeMaterialBlock.js +13 -1
  110. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  111. package/Materials/PBR/index.d.ts +1 -0
  112. package/Materials/PBR/index.js +1 -0
  113. package/Materials/PBR/index.js.map +1 -1
  114. package/Materials/PBR/pbrBaseMaterial.d.ts +13 -0
  115. package/Materials/PBR/pbrBaseMaterial.js +60 -0
  116. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  117. package/Materials/PBR/pbrMaterial.d.ts +8 -0
  118. package/Materials/PBR/pbrMaterial.js +12 -0
  119. package/Materials/PBR/pbrMaterial.js.map +1 -1
  120. package/Materials/Textures/internalTexture.d.ts +0 -18
  121. package/Materials/Textures/internalTexture.js +0 -46
  122. package/Materials/Textures/internalTexture.js.map +1 -1
  123. package/Materials/Textures/rawTexture.d.ts +6 -2
  124. package/Materials/Textures/rawTexture.js +10 -3
  125. package/Materials/Textures/rawTexture.js.map +1 -1
  126. package/Materials/Textures/textureHelper.functions.d.ts +18 -0
  127. package/Materials/Textures/textureHelper.functions.js +47 -0
  128. package/Materials/Textures/textureHelper.functions.js.map +1 -0
  129. package/Materials/materialFlags.d.ts +6 -0
  130. package/Materials/materialFlags.js +14 -0
  131. package/Materials/materialFlags.js.map +1 -1
  132. package/Materials/materialHelper.functions.js +3 -1
  133. package/Materials/materialHelper.functions.js.map +1 -1
  134. package/Materials/standardMaterial.d.ts +1 -0
  135. package/Materials/standardMaterial.js +14 -0
  136. package/Materials/standardMaterial.js.map +1 -1
  137. package/Meshes/Compression/dracoCompressionWorker.js +0 -1
  138. package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
  139. package/Misc/timingTools.d.ts +2 -2
  140. package/Misc/timingTools.js +15 -10
  141. package/Misc/timingTools.js.map +1 -1
  142. package/Particles/gpuParticleSystem.js +8 -2
  143. package/Particles/gpuParticleSystem.js.map +1 -1
  144. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +4 -0
  145. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +66 -16
  146. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  147. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +8 -0
  148. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +16 -0
  149. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  150. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +9 -0
  151. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +28 -11
  152. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  153. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js +1 -1
  154. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js.map +1 -1
  155. package/Shaders/ShadersInclude/gaussianSplatting.js +1 -1
  156. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  157. package/Shaders/ShadersInclude/lightFragment.js +19 -1
  158. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  159. package/Shaders/ShadersInclude/lightFragmentDeclaration.js +3 -0
  160. package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
  161. package/Shaders/ShadersInclude/lightUboDeclaration.js +3 -0
  162. package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
  163. package/Shaders/ShadersInclude/lightVxFragmentDeclaration.js +3 -0
  164. package/Shaders/ShadersInclude/lightVxFragmentDeclaration.js.map +1 -1
  165. package/Shaders/ShadersInclude/lightVxUboDeclaration.js +3 -0
  166. package/Shaders/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  167. package/Shaders/ShadersInclude/lightsFragmentFunctions.d.ts +1 -0
  168. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +14 -1
  169. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  170. package/Shaders/ShadersInclude/ltcHelperFunctions.d.ts +5 -0
  171. package/Shaders/ShadersInclude/ltcHelperFunctions.js +31 -0
  172. package/Shaders/ShadersInclude/ltcHelperFunctions.js.map +1 -0
  173. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +11 -2
  174. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  175. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +6 -0
  176. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  177. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.d.ts +1 -0
  178. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +18 -1
  179. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  180. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +6 -3
  181. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  182. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +4 -0
  183. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  184. package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
  185. package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  186. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +5 -2
  187. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  188. package/Shaders/iblShadowAccumulation.fragment.js +6 -5
  189. package/Shaders/iblShadowAccumulation.fragment.js.map +1 -1
  190. package/Shaders/iblShadowSpatialBlur.fragment.js +3 -3
  191. package/Shaders/iblShadowSpatialBlur.fragment.js.map +1 -1
  192. package/Shaders/iblShadowVoxelTracing.fragment.js +26 -8
  193. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  194. package/Shaders/pbr.fragment.js +11 -3
  195. package/Shaders/pbr.fragment.js.map +1 -1
  196. package/Shaders/pbr.vertex.js +2 -0
  197. package/Shaders/pbr.vertex.js.map +1 -1
  198. package/ShadersWGSL/ShadersInclude/lightFragment.js +19 -1
  199. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  200. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +4 -0
  201. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
  202. package/ShadersWGSL/ShadersInclude/lightVxFragmentDeclaration.js +3 -0
  203. package/ShadersWGSL/ShadersInclude/lightVxFragmentDeclaration.js.map +1 -1
  204. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +4 -0
  205. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  206. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.d.ts +1 -0
  207. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +12 -1
  208. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  209. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.d.ts +5 -0
  210. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js +35 -0
  211. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js.map +1 -0
  212. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js +10 -1
  213. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  214. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +4 -0
  215. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  216. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.d.ts +1 -0
  217. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +18 -1
  218. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  219. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +4 -0
  220. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  221. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
  222. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  223. package/ShadersWGSL/iblShadowAccumulation.fragment.js +4 -3
  224. package/ShadersWGSL/iblShadowAccumulation.fragment.js.map +1 -1
  225. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js +3 -3
  226. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js.map +1 -1
  227. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +26 -8
  228. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  229. package/ShadersWGSL/pbr.fragment.js +10 -2
  230. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  231. package/ShadersWGSL/pbr.vertex.js +2 -0
  232. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  233. package/Sprites/spriteRenderer.js +1 -0
  234. package/Sprites/spriteRenderer.js.map +1 -1
  235. package/package.json +1 -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 { 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"]}
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 _coloredShadows: boolean = false;\r\n private _materialsWithRenderPlugin: Material[] = [];\r\n\r\n /**\r\n * Observable that triggers when the shadow renderer is ready\r\n */\r\n public onShadowTextureReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when a new IBL is set and the importance sampling is ready\r\n */\r\n public onNewIblReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * The current world-space size of that the voxel grid covers in the scene.\r\n */\r\n public voxelGridSize: number = 1.0;\r\n\r\n /**\r\n * Reset the shadow accumulation. This has a similar affect to lowering the remanence for a single frame.\r\n * This is useful when making a sudden change to the IBL.\r\n */\r\n public resetAccumulation(): void {\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get shadowOpacity(): number {\r\n return this._shadowOpacity;\r\n }\r\n\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Render the shadows in color rather than black and white.\r\n * This is slightly more expensive than black and white shadows but can be much\r\n * more accurate when the strongest lights in the IBL are non-white.\r\n */\r\n public get coloredShadows(): boolean {\r\n return this._coloredShadows;\r\n }\r\n\r\n public set coloredShadows(value: boolean) {\r\n this._coloredShadows = value;\r\n this._voxelTracingPass.coloredShadows = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n private _renderSizeFactor: number = 1.0;\r\n\r\n /**\r\n * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.\r\n */\r\n public get shadowRenderSizeFactor(): number {\r\n return this._renderSizeFactor;\r\n }\r\n\r\n public set shadowRenderSizeFactor(value: number) {\r\n this._renderSizeFactor = Math.max(Math.min(value, 1.0), 0.0);\r\n this._voxelTracingPass.resize(value);\r\n this._spatialBlurPass.resize(value);\r\n this._accumulationPass.resize(value);\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get voxelShadowOpacity() {\r\n return this._voxelTracingPass?.voxelShadowOpacity;\r\n }\r\n\r\n public set voxelShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) 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 plugin.isColored = this._coloredShadows;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enabled) {\r\n return;\r\n }\r\n\r\n 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 plugin.isColored = this._coloredShadows;\r\n }\r\n });\r\n }\r\n\r\n private _updateBeforeRender() {\r\n this._updateDebugPasses();\r\n }\r\n\r\n private _listenForCameraChanges() {\r\n // We want to listen for camera changes and change settings while the camera is moving.\r\n this.scene.activeCamera?.onViewMatrixChangedObservable.add(() => {\r\n this._accumulationPass.isMoving = true;\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the IBL shadow pipeline is ready to render shadows\r\n * @returns true if the IBL shadow pipeline is ready to render the shadows\r\n */\r\n public isReady() {\r\n return (\r\n this._noiseTexture.isReady() &&\r\n this._voxelRenderer.isReady() &&\r\n this.scene.iblCdfGenerator &&\r\n this.scene.iblCdfGenerator.isReady() &&\r\n (!this._voxelTracingPass || this._voxelTracingPass.isReady()) &&\r\n (!this._spatialBlurPass || this._spatialBlurPass.isReady()) &&\r\n (!this._accumulationPass || this._accumulationPass.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"IBLShadowsRenderPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"IBLShadowsRenderPipeline\";\r\n }\r\n\r\n /**\r\n * Disposes the IBL shadow pipeline and associated resources\r\n */\r\n public override dispose() {\r\n const materials = this._materialsWithRenderPlugin.splice(0);\r\n 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"]}
@@ -133,6 +133,14 @@ export declare class _IblShadowsVoxelTracingPass {
133
133
  * @param matrix The matrix to use for scaling the world space to voxel space
134
134
  */
135
135
  setWorldScaleMatrix(matrix: Matrix): void;
136
+ /**
137
+ * Render the shadows in color rather than black and white.
138
+ * This is slightly more expensive than black and white shadows but can be much
139
+ * more accurate when the strongest lights in the IBL are non-white.
140
+ */
141
+ set coloredShadows(value: boolean);
142
+ get coloredShadows(): boolean;
143
+ private _coloredShadows;
136
144
  private _debugVoxelMarchEnabled;
137
145
  private _debugPassPP;
138
146
  private _debugSizeParams;
@@ -156,6 +164,7 @@ export declare class _IblShadowsVoxelTracingPass {
156
164
  */
157
165
  constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline);
158
166
  private _createTextures;
167
+ private _createDefines;
159
168
  private _setBindings;
160
169
  /**
161
170
  * Called by render pipeline when canvas resized.
@@ -154,6 +154,17 @@ export class _IblShadowsVoxelTracingPass {
154
154
  setWorldScaleMatrix(matrix) {
155
155
  this._invWorldScaleMatrix = matrix;
156
156
  }
157
+ /**
158
+ * Render the shadows in color rather than black and white.
159
+ * This is slightly more expensive than black and white shadows but can be much
160
+ * more accurate when the strongest lights in the IBL are non-white.
161
+ */
162
+ set coloredShadows(value) {
163
+ this._coloredShadows = value;
164
+ }
165
+ get coloredShadows() {
166
+ return this._coloredShadows;
167
+ }
157
168
  /**
158
169
  * Sets params that control the position and scaling of the debug display on the screen.
159
170
  * @param x Screen X offset of the debug display (0-1)
@@ -229,6 +240,7 @@ export class _IblShadowsVoxelTracingPass {
229
240
  this._debugPassName = "Voxel Tracing Debug Pass";
230
241
  /** The default rotation of the environment map will align the shadows with the default lighting orientation */
231
242
  this._envRotation = 0.0;
243
+ this._coloredShadows = false;
232
244
  this._debugVoxelMarchEnabled = false;
233
245
  this._debugSizeParams = new Vector4(0.0, 0.0, 0.0, 0.0);
234
246
  this._scene = scene;
@@ -237,13 +249,7 @@ export class _IblShadowsVoxelTracingPass {
237
249
  this._createTextures();
238
250
  }
239
251
  _createTextures() {
240
- let defines = "";
241
- if (this._scene.useRightHandedSystem) {
242
- defines += "#define RIGHT_HANDED\n";
243
- }
244
- if (this._debugVoxelMarchEnabled) {
245
- defines += "#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\n";
246
- }
252
+ const defines = this._createDefines();
247
253
  const isWebGPU = this._engine.isWebGPU;
248
254
  const textureOptions = {
249
255
  type: 0,
@@ -282,10 +288,21 @@ export class _IblShadowsVoxelTracingPass {
282
288
  }
283
289
  });
284
290
  }
285
- _setBindings(camera) {
291
+ _createDefines() {
292
+ let defines = "";
286
293
  if (this._scene.useRightHandedSystem) {
287
- this._outputTexture.defines = "#define RIGHT_HANDED\n";
294
+ defines += "#define RIGHT_HANDED\n";
295
+ }
296
+ if (this._debugVoxelMarchEnabled) {
297
+ defines += "#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\n";
298
+ }
299
+ if (this._coloredShadows) {
300
+ defines += "#define COLOR_SHADOWS 1u\n";
288
301
  }
302
+ return defines;
303
+ }
304
+ _setBindings(camera) {
305
+ this._outputTexture.defines = this._createDefines();
289
306
  this._outputTexture.setMatrix("viewMtx", camera.getViewMatrix());
290
307
  this._outputTexture.setMatrix("projMtx", camera.getProjectionMatrix());
291
308
  camera.getProjectionMatrix().invertToRef(this._cameraInvProj);
@@ -317,8 +334,8 @@ export class _IblShadowsVoxelTracingPass {
317
334
  if (cdfGenerator) {
318
335
  this._outputTexture.setTexture("icdfSampler", cdfGenerator.getIcdfTexture());
319
336
  }
320
- if (this._debugVoxelMarchEnabled) {
321
- this._outputTexture.defines += "#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\n";
337
+ if (this._coloredShadows && this._scene.environmentTexture) {
338
+ this._outputTexture.setTexture("iblSampler", this._scene.environmentTexture);
322
339
  }
323
340
  const geometryBufferRenderer = this._scene.geometryBufferRenderer;
324
341
  if (!geometryBufferRenderer) {
@@ -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;AAI1F;;;;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,IAAI;gBACd,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,GAAG,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACjC,QAAQ,GAAI,IAAI,CAAC,MAAM,CAAC,kBAAkC,CAAC,SAAS,IAAI,CAAC,CAAC;QAC9E,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;QACrG,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,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QACjD,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,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,MAAM,CAAC,eAAe;YAC3B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE;YACtD,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\nimport type { CubeTexture } from \"../../Materials/Textures/cubeTexture\";\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: true,\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 = 0.0;\r\n if (this._scene.environmentTexture) {\r\n rotation = (this._scene.environmentTexture as CubeTexture).rotationY ?? 0;\r\n }\r\n rotation = this._scene.useRightHandedSystem ? -(rotation + 0.5 * Math.PI) : rotation - 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(\"icdfSampler\", cdfGenerator.getIcdfTexture());\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.getIcdfTexture().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\nimport type { CubeTexture } from \"../../Materials/Textures/cubeTexture\";\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 /**\r\n * Render the shadows in color rather than black and white.\r\n * This is slightly more expensive than black and white shadows but can be much\r\n * more accurate when the strongest lights in the IBL are non-white.\r\n */\r\n public set coloredShadows(value: boolean) {\r\n this._coloredShadows = value;\r\n }\r\n public get coloredShadows(): boolean {\r\n return this._coloredShadows;\r\n }\r\n private _coloredShadows: boolean = false;\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: true,\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 const defines = this._createDefines();\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 _createDefines(): string {\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 if (this._coloredShadows) {\r\n defines += \"#define COLOR_SHADOWS 1u\\n\";\r\n }\r\n return defines;\r\n }\r\n\r\n private _setBindings(camera: Camera) {\r\n this._outputTexture.defines = this._createDefines();\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 = 0.0;\r\n if (this._scene.environmentTexture) {\r\n rotation = (this._scene.environmentTexture as CubeTexture).rotationY ?? 0;\r\n }\r\n rotation = this._scene.useRightHandedSystem ? -(rotation + 0.5 * Math.PI) : rotation - 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(\"icdfSampler\", cdfGenerator.getIcdfTexture());\r\n }\r\n if (this._coloredShadows && this._scene.environmentTexture) {\r\n this._outputTexture.setTexture(\"iblSampler\", this._scene.environmentTexture);\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.getIcdfTexture().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"]}
@@ -51,7 +51,7 @@ uniform vec4 opacityParts;
51
51
  #ifdef EMISSIVEFRESNEL
52
52
  uniform vec4 emissiveLeftColor;uniform vec4 emissiveRightColor;
53
53
  #endif
54
- #ifdef REFLECTION
54
+ #if defined(REFLECTION) || (defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED))
55
55
  uniform vec2 vReflectionInfos;
56
56
  #if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION) || defined(REFLECTIONMAP_EQUIRECTANGULAR) || defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_SKYBOX)
57
57
  uniform mat4 reflectionMatrix;