@onerjs/core 8.54.1 → 8.54.3

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 (238) hide show
  1. package/Animations/animatable.core.js.map +1 -1
  2. package/AudioV2/abstractAudio/abstractSoundSource.d.ts +26 -0
  3. package/AudioV2/abstractAudio/abstractSoundSource.js.map +1 -1
  4. package/AudioV2/webAudio/webAudioEngine.js +2 -0
  5. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  6. package/AudioV2/webAudio/webAudioSoundSource.d.ts +16 -0
  7. package/AudioV2/webAudio/webAudioSoundSource.js +43 -1
  8. package/AudioV2/webAudio/webAudioSoundSource.js.map +1 -1
  9. package/Bones/skeleton.functions.js +1 -1
  10. package/Bones/skeleton.functions.js.map +1 -1
  11. package/Cameras/inputMapper.js.map +1 -1
  12. package/Collisions/gpuPicker.js +7 -6
  13. package/Collisions/gpuPicker.js.map +1 -1
  14. package/Debug/physicsViewer.pure.js +1 -1
  15. package/Debug/physicsViewer.pure.js.map +1 -1
  16. package/Engines/Extensions/engine.alphaToCoverage.d.ts +6 -0
  17. package/Engines/Extensions/engine.alphaToCoverage.js +9 -0
  18. package/Engines/Extensions/engine.alphaToCoverage.js.map +1 -0
  19. package/Engines/Extensions/engine.alphaToCoverage.pure.d.ts +6 -0
  20. package/Engines/Extensions/engine.alphaToCoverage.pure.js +54 -0
  21. package/Engines/Extensions/engine.alphaToCoverage.pure.js.map +1 -0
  22. package/Engines/Extensions/engine.alphaToCoverage.types.d.ts +21 -0
  23. package/Engines/Extensions/engine.alphaToCoverage.types.js +2 -0
  24. package/Engines/Extensions/engine.alphaToCoverage.types.js.map +1 -0
  25. package/Engines/Extensions/engine.texture2DArrayImageSource.d.ts +6 -0
  26. package/Engines/Extensions/engine.texture2DArrayImageSource.js +9 -0
  27. package/Engines/Extensions/engine.texture2DArrayImageSource.js.map +1 -0
  28. package/Engines/Extensions/engine.texture2DArrayImageSource.pure.d.ts +7 -0
  29. package/Engines/Extensions/engine.texture2DArrayImageSource.pure.js +40 -0
  30. package/Engines/Extensions/engine.texture2DArrayImageSource.pure.js.map +1 -0
  31. package/Engines/Extensions/engine.texture2DArrayImageSource.types.d.ts +21 -0
  32. package/Engines/Extensions/engine.texture2DArrayImageSource.types.js +2 -0
  33. package/Engines/Extensions/engine.texture2DArrayImageSource.types.js.map +1 -0
  34. package/Engines/Extensions/index.d.ts +1 -0
  35. package/Engines/Extensions/index.js +1 -0
  36. package/Engines/Extensions/index.js.map +1 -1
  37. package/Engines/Extensions/pure.d.ts +2 -0
  38. package/Engines/Extensions/pure.js +2 -0
  39. package/Engines/Extensions/pure.js.map +1 -1
  40. package/Engines/Native/nativeHelpers.js +6 -4
  41. package/Engines/Native/nativeHelpers.js.map +1 -1
  42. package/Engines/Native/nativeInterfaces.d.ts +1 -0
  43. package/Engines/Native/nativeInterfaces.js.map +1 -1
  44. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.d.ts +6 -0
  45. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.js +9 -0
  46. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.js.map +1 -0
  47. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.d.ts +6 -0
  48. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.js +34 -0
  49. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.js.map +1 -0
  50. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.d.ts +16 -0
  51. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.js +2 -0
  52. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.js.map +1 -0
  53. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.d.ts +6 -0
  54. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.js +9 -0
  55. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.js.map +1 -0
  56. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.pure.d.ts +7 -0
  57. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.pure.js +23 -0
  58. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.pure.js.map +1 -0
  59. package/Engines/WebGPU/Extensions/index.d.ts +1 -0
  60. package/Engines/WebGPU/Extensions/index.js +1 -0
  61. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  62. package/Engines/WebGPU/Extensions/pure.d.ts +2 -0
  63. package/Engines/WebGPU/Extensions/pure.js +2 -0
  64. package/Engines/WebGPU/Extensions/pure.js.map +1 -1
  65. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +0 -1
  66. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  67. package/Engines/abstractEngine.pure.d.ts +0 -15
  68. package/Engines/abstractEngine.pure.js +2 -23
  69. package/Engines/abstractEngine.pure.js.map +1 -1
  70. package/Engines/constants.d.ts +4 -0
  71. package/Engines/constants.js +4 -0
  72. package/Engines/constants.js.map +1 -1
  73. package/Engines/engine.d.ts +32 -2
  74. package/Engines/engine.js +1 -0
  75. package/Engines/engine.js.map +1 -1
  76. package/Engines/engine.pure.js +1 -1
  77. package/Engines/engine.pure.js.map +1 -1
  78. package/Engines/thinEngine.pure.d.ts +0 -11
  79. package/Engines/thinEngine.pure.js +0 -19
  80. package/Engines/thinEngine.pure.js.map +1 -1
  81. package/Engines/thinNativeEngine.pure.js +4 -4
  82. package/Engines/thinNativeEngine.pure.js.map +1 -1
  83. package/Engines/webgpuEngine.d.ts +2 -0
  84. package/Engines/webgpuEngine.js +2 -0
  85. package/Engines/webgpuEngine.js.map +1 -1
  86. package/Engines/webgpuEngine.pure.d.ts +0 -5
  87. package/Engines/webgpuEngine.pure.js +1 -10
  88. package/Engines/webgpuEngine.pure.js.map +1 -1
  89. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  90. package/Lights/Clustered/clusteredLightContainer.pure.js +6 -0
  91. package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
  92. package/Loading/Plugins/babylonFileLoader.d.ts +10 -0
  93. package/Loading/Plugins/babylonFileLoader.js +18 -0
  94. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  95. package/Loading/Plugins/babylonFileLoader.pure.js +10 -2
  96. package/Loading/Plugins/babylonFileLoader.pure.js.map +1 -1
  97. package/Loading/loadingScreen.pure.js +2 -0
  98. package/Loading/loadingScreen.pure.js.map +1 -1
  99. package/Materials/Node/Blocks/Fragment/ambientOcclusionBlock.pure.js.map +1 -1
  100. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +2 -1
  101. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
  102. package/Materials/Node/nodeMaterial.pure.d.ts +13 -5
  103. package/Materials/Node/nodeMaterial.pure.js +20 -2
  104. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  105. package/Materials/Textures/index.d.ts +1 -0
  106. package/Materials/Textures/index.js +1 -0
  107. package/Materials/Textures/index.js.map +1 -1
  108. package/Materials/Textures/ktx2decoderTypes.d.ts +14 -3
  109. package/Materials/Textures/ktx2decoderTypes.js +2 -0
  110. package/Materials/Textures/ktx2decoderTypes.js.map +1 -1
  111. package/Materials/Textures/pure.d.ts +1 -0
  112. package/Materials/Textures/pure.js +1 -0
  113. package/Materials/Textures/pure.js.map +1 -1
  114. package/Materials/Textures/rawTexture2DArray.functions.d.ts +95 -0
  115. package/Materials/Textures/rawTexture2DArray.functions.js +201 -0
  116. package/Materials/Textures/rawTexture2DArray.functions.js.map +1 -0
  117. package/Materials/Textures/renderTargetTexture.pure.js +7 -0
  118. package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
  119. package/Materials/material.pure.d.ts +1 -0
  120. package/Materials/material.pure.js +1 -0
  121. package/Materials/material.pure.js.map +1 -1
  122. package/Meshes/Builders/pure.d.ts +2 -2
  123. package/Meshes/Builders/pure.js +2 -2
  124. package/Meshes/Builders/pure.js.map +1 -1
  125. package/Meshes/Builders/textBuilder.js.map +1 -1
  126. package/Meshes/Builders/tiledBoxBuilder.d.ts +1 -83
  127. package/Meshes/Builders/tiledBoxBuilder.js +3 -215
  128. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  129. package/Meshes/Builders/tiledBoxBuilder.pure.d.ts +89 -0
  130. package/Meshes/Builders/tiledBoxBuilder.pure.js +229 -0
  131. package/Meshes/Builders/tiledBoxBuilder.pure.js.map +1 -0
  132. package/Meshes/Builders/tiledPlaneBuilder.d.ts +1 -79
  133. package/Meshes/Builders/tiledPlaneBuilder.js +3 -429
  134. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  135. package/Meshes/Builders/tiledPlaneBuilder.pure.d.ts +85 -0
  136. package/Meshes/Builders/tiledPlaneBuilder.pure.js +442 -0
  137. package/Meshes/Builders/tiledPlaneBuilder.pure.js.map +1 -0
  138. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +13 -0
  139. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +15 -0
  140. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  141. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +29 -9
  142. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  143. package/Meshes/Node/Blocks/bevelBlock.pure.js.map +1 -1
  144. package/Meshes/meshBuilder.d.ts +21 -57
  145. package/Meshes/meshBuilder.js +21 -58
  146. package/Meshes/meshBuilder.js.map +1 -1
  147. package/Meshes/meshBuilder.pure.d.ts +58 -0
  148. package/Meshes/meshBuilder.pure.js +60 -0
  149. package/Meshes/meshBuilder.pure.js.map +1 -0
  150. package/Meshes/pure.d.ts +1 -1
  151. package/Meshes/pure.js +1 -1
  152. package/Meshes/pure.js.map +1 -1
  153. package/Misc/greasedLineTools.js.map +1 -1
  154. package/Misc/khronosTextureContainer2.d.ts +10 -0
  155. package/Misc/khronosTextureContainer2.js +23 -12
  156. package/Misc/khronosTextureContainer2.js.map +1 -1
  157. package/Misc/perfCounter.d.ts +2 -0
  158. package/Misc/perfCounter.js +17 -2
  159. package/Misc/perfCounter.js.map +1 -1
  160. package/Misc/rgbdTextureTools.js +1 -1
  161. package/Misc/rgbdTextureTools.js.map +1 -1
  162. package/Misc/snapshotRenderingHelper.js +2 -1
  163. package/Misc/snapshotRenderingHelper.js.map +1 -1
  164. package/Misc/tools.pure.js +1 -1
  165. package/Misc/tools.pure.js.map +1 -1
  166. package/Navigation/Plugins/recastJSPlugin.js +1 -1
  167. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  168. package/Physics/v2/Plugins/havokPlugin.js +15 -0
  169. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  170. package/Physics/v2/characterController.d.ts +17 -0
  171. package/Physics/v2/characterController.js +40 -0
  172. package/Physics/v2/characterController.js.map +1 -1
  173. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
  174. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.pure.js.map +1 -1
  175. package/PostProcesses/thinSSAO2PostProcess.js.map +1 -1
  176. package/PostProcesses/volumetricLightScatteringPostProcess.d.ts +3 -0
  177. package/PostProcesses/volumetricLightScatteringPostProcess.js +3 -0
  178. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  179. package/PostProcesses/volumetricLightScatteringPostProcess.pure.d.ts +1 -0
  180. package/PostProcesses/volumetricLightScatteringPostProcess.pure.js +25 -6
  181. package/PostProcesses/volumetricLightScatteringPostProcess.pure.js.map +1 -1
  182. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +3 -1
  183. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +25 -4
  184. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  185. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +6 -5
  186. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  187. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +3 -1
  188. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +16 -4
  189. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
  190. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +6 -5
  191. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
  192. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +3 -1
  193. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +16 -4
  194. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  195. package/Rendering/depthRenderer.d.ts +2 -0
  196. package/Rendering/depthRenderer.js +2 -0
  197. package/Rendering/depthRenderer.js.map +1 -1
  198. package/Rendering/depthRenderer.pure.js +3 -2
  199. package/Rendering/depthRenderer.pure.js.map +1 -1
  200. package/Rendering/fluidRenderer/fluidRenderer.pure.js +6 -0
  201. package/Rendering/fluidRenderer/fluidRenderer.pure.js.map +1 -1
  202. package/Rendering/geometryBufferRenderer.pure.js +5 -5
  203. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  204. package/Shaders/ShadersInclude/openpbrDielectricReflectance.js +6 -6
  205. package/Shaders/ShadersInclude/openpbrDielectricReflectance.js.map +1 -1
  206. package/ShadersWGSL/ShadersInclude/depthPrePass.js +2 -0
  207. package/ShadersWGSL/ShadersInclude/depthPrePass.js.map +1 -1
  208. package/ShadersWGSL/ShadersInclude/openpbrDielectricReflectance.js +7 -8
  209. package/ShadersWGSL/ShadersInclude/openpbrDielectricReflectance.js.map +1 -1
  210. package/ShadersWGSL/default.fragment.js +3 -0
  211. package/ShadersWGSL/default.fragment.js.map +1 -1
  212. package/ShadersWGSL/openpbr.fragment.js +3 -0
  213. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  214. package/ShadersWGSL/pbr.fragment.js +3 -0
  215. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  216. package/ShadersWGSL/volumetricLightScattering.fragment.d.ts +5 -0
  217. package/ShadersWGSL/volumetricLightScattering.fragment.js +20 -0
  218. package/ShadersWGSL/volumetricLightScattering.fragment.js.map +1 -0
  219. package/ShadersWGSL/volumetricLightScatteringPass.fragment.d.ts +5 -0
  220. package/ShadersWGSL/volumetricLightScatteringPass.fragment.js +24 -0
  221. package/ShadersWGSL/volumetricLightScatteringPass.fragment.js.map +1 -0
  222. package/ShadersWGSL/volumetricLightScatteringPass.vertex.d.ts +5 -0
  223. package/ShadersWGSL/volumetricLightScatteringPass.vertex.js +67 -0
  224. package/ShadersWGSL/volumetricLightScatteringPass.vertex.js.map +1 -0
  225. package/SmartAssets/smartAssetManager.pure.js +9 -1
  226. package/SmartAssets/smartAssetManager.pure.js.map +1 -1
  227. package/States/alphaCullingState.d.ts +0 -9
  228. package/States/alphaCullingState.js +4 -31
  229. package/States/alphaCullingState.js.map +1 -1
  230. package/XR/features/WebXRBodyTracking.pure.d.ts +0 -28
  231. package/XR/features/WebXRBodyTracking.pure.js.map +1 -1
  232. package/XR/features/WebXRLayers.pure.js +4 -4
  233. package/XR/features/WebXRLayers.pure.js.map +1 -1
  234. package/node.d.ts +18 -1
  235. package/node.js +52 -1
  236. package/node.js.map +1 -1
  237. package/package.json +1 -1
  238. package/types.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"volumetricLightScatteringPostProcess.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/volumetricLightScatteringPostProcess.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serializeAsVector3, serialize, serializeAsMeshReference } from \"../Misc/decorators\";\r\nimport { type SmartArray } from \"../Misc/smartArray\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Vector2, Vector3, Matrix } from \"../Maths/math.vector.pure\";\r\nimport { VertexBuffer } from \"../Buffers/buffer.pure\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { type SubMesh } from \"../Meshes/subMesh.pure\";\r\nimport { type Mesh } from \"../Meshes/mesh.pure\";\r\nimport { type Camera } from \"../Cameras/camera.pure\";\r\nimport { type Effect, type IEffectCreationOptions } from \"../Materials/effect.pure\";\r\nimport { Material } from \"../Materials/material.pure\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial.pure\";\r\nimport { Texture } from \"../Materials/Textures/texture.pure\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture.pure\";\r\nimport { PostProcess } from \"./postProcess.pure\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder.pure\";\r\nimport { Color4, Color3 } from \"../Maths/math.color.pure\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { type Nullable } from \"../types\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine.pure\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * Inspired by https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-13-volumetric-light-scattering-post-process\r\n */\r\nexport class VolumetricLightScatteringPostProcess extends PostProcess {\r\n // Members\r\n private _volumetricLightScatteringRTT: RenderTargetTexture;\r\n private _viewPort: Viewport;\r\n private _screenCoordinates: Vector2 = Vector2.Zero();\r\n\r\n /**\r\n * If not undefined, the mesh position is computed from the attached node position\r\n */\r\n public attachedNode: { position: Vector3 };\r\n\r\n /**\r\n * Custom position of the mesh. Used if \"useCustomMeshPosition\" is set to \"true\"\r\n */\r\n @serializeAsVector3()\r\n public customMeshPosition: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Set if the post-process should use a custom position for the light source (true) or the internal mesh position (false)\r\n */\r\n @serialize()\r\n public useCustomMeshPosition: boolean = false;\r\n\r\n /**\r\n * If the post-process should inverse the light scattering direction\r\n */\r\n @serialize()\r\n public invert: boolean = true;\r\n\r\n /**\r\n * The internal mesh used by the post-process\r\n */\r\n @serializeAsMeshReference()\r\n public mesh: Mesh;\r\n\r\n /**\r\n * @internal\r\n * VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead\r\n */\r\n public get useDiffuseColor(): boolean {\r\n Logger.Warn(\"VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead\");\r\n return false;\r\n }\r\n\r\n public set useDiffuseColor(useDiffuseColor: boolean) {\r\n Logger.Warn(\"VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead\");\r\n }\r\n\r\n /**\r\n * Array containing the excluded meshes not rendered in the internal pass\r\n */\r\n @serialize()\r\n public excludedMeshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Array containing the only meshes rendered in the internal pass.\r\n * If this array is not empty, only the meshes from this array are rendered in the internal pass\r\n */\r\n @serialize()\r\n public includedMeshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Controls the overall intensity of the post-process\r\n */\r\n @serialize()\r\n public exposure = 0.3;\r\n\r\n /**\r\n * Dissipates each sample's contribution in range [0, 1]\r\n */\r\n @serialize()\r\n public decay = 0.96815;\r\n\r\n /**\r\n * Controls the overall intensity of each sample\r\n */\r\n @serialize()\r\n public weight = 0.58767;\r\n\r\n /**\r\n * Controls the density of each sample\r\n */\r\n @serialize()\r\n public density = 0.926;\r\n\r\n /**\r\n * @constructor\r\n * @param name The post-process name\r\n * @param ratio The size of the post-process and/or internal pass (0.5 means that your postprocess will have a width = canvas.width 0.5 and a height = canvas.height 0.5)\r\n * @param camera The camera that the post-process will be attached to\r\n * @param mesh The mesh used to create the light scattering\r\n * @param samples The post-process quality, default 100\r\n * @param samplingMode The post-process filtering mode\r\n * @param engine The babylon engine\r\n * @param reusable If the post-process is reusable\r\n * @param scene The constructor needs a scene reference to initialize internal components. If \"camera\" is null a \"scene\" must be provided\r\n */\r\n constructor(\r\n name: string,\r\n ratio: any,\r\n camera: Nullable<Camera>,\r\n mesh?: Mesh,\r\n samples: number = 100,\r\n samplingMode: number = Texture.BILINEAR_SAMPLINGMODE,\r\n engine?: AbstractEngine,\r\n reusable?: boolean,\r\n scene?: Scene\r\n ) {\r\n super(\r\n name,\r\n \"volumetricLightScattering\",\r\n [\"decay\", \"exposure\", \"weight\", \"meshPositionOnScreen\", \"density\"],\r\n [\"lightScatteringSampler\"],\r\n ratio.postProcessRatio || ratio,\r\n camera,\r\n samplingMode,\r\n engine,\r\n reusable,\r\n \"#define NUM_SAMPLES \" + samples\r\n );\r\n scene = camera?.getScene() ?? scene ?? this._scene; // parameter \"scene\" can be null.\r\n\r\n engine = scene.getEngine();\r\n this._viewPort = new Viewport(0, 0, 1, 1).toGlobal(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n // Configure mesh\r\n this.mesh = mesh ?? VolumetricLightScatteringPostProcess.CreateDefaultMesh(\"VolumetricLightScatteringMesh\", scene);\r\n // Configure\r\n this._createPass(scene, ratio.passRatio || ratio);\r\n\r\n this.onActivate = (camera: Camera) => {\r\n if (!this.isSupported) {\r\n this.dispose(camera);\r\n }\r\n\r\n this.onActivate = null;\r\n };\r\n\r\n this.onApplyObservable.add((effect: Effect) => {\r\n this._updateMeshScreenCoordinates(scene);\r\n\r\n effect.setTexture(\"lightScatteringSampler\", this._volumetricLightScatteringRTT);\r\n effect.setFloat(\"exposure\", this.exposure);\r\n effect.setFloat(\"decay\", this.decay);\r\n effect.setFloat(\"weight\", this.weight);\r\n effect.setFloat(\"density\", this.density);\r\n effect.setVector2(\"meshPositionOnScreen\", this._screenCoordinates);\r\n });\r\n }\r\n\r\n /**\r\n * Returns the string \"VolumetricLightScatteringPostProcess\"\r\n * @returns \"VolumetricLightScatteringPostProcess\"\r\n */\r\n public override getClassName(): string {\r\n return \"VolumetricLightScatteringPostProcess\";\r\n }\r\n\r\n private _isReady(subMesh: SubMesh, useInstances: boolean): boolean {\r\n const mesh = subMesh.getMesh();\r\n\r\n // Render this.mesh as default\r\n if (mesh === this.mesh && mesh.material) {\r\n return mesh.material.isReady(mesh);\r\n }\r\n\r\n const renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[this._scene.getEngine().currentRenderPassId];\r\n\r\n if (renderingMaterial) {\r\n return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);\r\n }\r\n\r\n const defines = [];\r\n const attribs = [VertexBuffer.PositionKind];\r\n const material = subMesh.getMaterial();\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Alpha test\r\n if (material) {\r\n const needAlphaTesting = material.needAlphaTestingForMesh(mesh);\r\n if (needAlphaTesting) {\r\n defines.push(\"#define ALPHATEST\");\r\n }\r\n\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n uv1 = needAlphaTesting;\r\n }\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n uv2 = needAlphaTesting;\r\n }\r\n }\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n\r\n const skeleton = mesh.skeleton;\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n false, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(undefined, true)!;\r\n const cachedDefines = drawWrapper.defines;\r\n const join = defines.join(\"\\n\");\r\n if (cachedDefines !== join) {\r\n const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"boneTextureInfo\",\r\n \"viewProjection\",\r\n \"diffuseMatrix\",\r\n \"morphTargetInfluences\",\r\n \"morphTargetCount\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n ];\r\n const samplers = [\"diffuseSampler\", \"morphTargets\", \"boneSampler\", \"bakedVertexAnimationTexture\"];\r\n\r\n drawWrapper.setEffect(\r\n mesh\r\n .getScene()\r\n .getEngine()\r\n .createEffect(\r\n \"volumetricLightScatteringPass\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n },\r\n mesh.getScene().getEngine()\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n /**\r\n * Sets the new light position for light scattering effect\r\n * @param position The new custom light position\r\n */\r\n public setCustomMeshPosition(position: Vector3): void {\r\n this.customMeshPosition = position;\r\n }\r\n\r\n /**\r\n * Returns the light position for light scattering effect\r\n * @returns Vector3 The custom light position\r\n */\r\n public getCustomMeshPosition(): Vector3 {\r\n return this.customMeshPosition;\r\n }\r\n\r\n /**\r\n * Disposes the internal assets and detaches the post-process from the camera\r\n * @param camera The camera from which to detach the post-process\r\n */\r\n public override dispose(camera: Camera): void {\r\n const rttIndex = camera.getScene().customRenderTargets.indexOf(this._volumetricLightScatteringRTT);\r\n if (rttIndex !== -1) {\r\n camera.getScene().customRenderTargets.splice(rttIndex, 1);\r\n }\r\n\r\n this._volumetricLightScatteringRTT.dispose();\r\n super.dispose(camera);\r\n }\r\n\r\n /**\r\n * Returns the render target texture used by the post-process\r\n * @returns the render target texture used by the post-process\r\n */\r\n public getPass(): RenderTargetTexture {\r\n return this._volumetricLightScatteringRTT;\r\n }\r\n\r\n // Private methods\r\n private _meshExcluded(mesh: AbstractMesh) {\r\n if ((this.includedMeshes.length > 0 && this.includedMeshes.indexOf(mesh) === -1) || (this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(mesh) !== -1)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _createPass(scene: Scene, ratio: number): void {\r\n const engine = scene.getEngine();\r\n\r\n this._volumetricLightScatteringRTT = new RenderTargetTexture(\r\n \"volumetricLightScatteringMap\",\r\n { width: engine.getRenderWidth() * ratio, height: engine.getRenderHeight() * ratio },\r\n scene,\r\n false,\r\n true,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n this._volumetricLightScatteringRTT.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this._volumetricLightScatteringRTT.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._volumetricLightScatteringRTT.renderList = null;\r\n this._volumetricLightScatteringRTT.renderParticles = false;\r\n this._volumetricLightScatteringRTT.ignoreCameraViewport = true;\r\n\r\n const camera = this.getCamera();\r\n if (camera) {\r\n camera.customRenderTargets.push(this._volumetricLightScatteringRTT);\r\n } else {\r\n scene.customRenderTargets.push(this._volumetricLightScatteringRTT);\r\n }\r\n\r\n // Custom render function for submeshes\r\n const renderSubMesh = (subMesh: SubMesh): void => {\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = subMesh.getEffectiveMesh();\r\n if (this._meshExcluded(renderingMesh)) {\r\n return;\r\n }\r\n\r\n effectiveMesh._internalAbstractMeshDataInfo._isActiveIntermediate = false;\r\n\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return;\r\n }\r\n\r\n const scene = renderingMesh.getScene();\r\n const engine = scene.getEngine();\r\n\r\n // Culling\r\n engine.setState(material.backFaceCulling, undefined, undefined, undefined, material.cullBackFaces);\r\n\r\n // Managing instances\r\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());\r\n\r\n if (batch.mustReturn) {\r\n return;\r\n }\r\n\r\n const hardwareInstancedRendering = engine.getCaps().instancedArrays && (batch.visibleInstances[subMesh._id] !== null || renderingMesh.hasThinInstances);\r\n\r\n if (this._isReady(subMesh, hardwareInstancedRendering)) {\r\n const renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\r\n\r\n let drawWrapper = subMesh._getDrawWrapper();\r\n if (renderingMesh === this.mesh && !drawWrapper) {\r\n drawWrapper = material._getDrawWrapper();\r\n }\r\n\r\n if (!drawWrapper) {\r\n return;\r\n }\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n engine.enableEffect(drawWrapper);\r\n if (!hardwareInstancedRendering) {\r\n renderingMesh._bind(subMesh, effect, material.fillMode);\r\n }\r\n\r\n if (renderingMesh === this.mesh) {\r\n material.bind(effectiveMesh.getWorldMatrix(), renderingMesh);\r\n } else if (renderingMaterial) {\r\n renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh as Mesh, subMesh);\r\n } else {\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n\r\n // Alpha test\r\n if (material.needAlphaTestingForMesh(effectiveMesh)) {\r\n const alphaTexture = material.getAlphaTestTexture();\r\n\r\n if (alphaTexture) {\r\n effect.setTexture(\"diffuseSampler\", alphaTexture);\r\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\r\n }\r\n }\r\n\r\n // Bones\r\n BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n }\r\n\r\n if (hardwareInstancedRendering && renderingMesh.hasThinInstances) {\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n }\r\n\r\n // Draw\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, Material.TriangleFillMode, batch, hardwareInstancedRendering, (isInstance, world) => {\r\n if (!isInstance) {\r\n effect.setMatrix(\"world\", world);\r\n }\r\n });\r\n }\r\n };\r\n\r\n // Render target texture callbacks\r\n let savedSceneClearColor: Color4;\r\n const sceneClearColor = new Color4(0.0, 0.0, 0.0, 1.0);\r\n\r\n this._volumetricLightScatteringRTT.onBeforeRenderObservable.add((): void => {\r\n savedSceneClearColor = scene.clearColor;\r\n scene.clearColor = sceneClearColor;\r\n });\r\n\r\n this._volumetricLightScatteringRTT.onAfterRenderObservable.add((): void => {\r\n scene.clearColor = savedSceneClearColor;\r\n });\r\n\r\n this._volumetricLightScatteringRTT.customIsReadyFunction = (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => {\r\n if ((preWarm || refreshRate === 0) && mesh.subMeshes) {\r\n for (let i = 0; i < mesh.subMeshes.length; ++i) {\r\n const subMesh = mesh.subMeshes[i];\r\n const material = subMesh.getMaterial();\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n\r\n if (!material) {\r\n continue;\r\n }\r\n\r\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());\r\n const hardwareInstancedRendering = engine.getCaps().instancedArrays && (batch.visibleInstances[subMesh._id] !== null || renderingMesh.hasThinInstances);\r\n\r\n if (!this._isReady(subMesh, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n this._volumetricLightScatteringRTT.customRenderFunction = (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ): void => {\r\n const engine = scene.getEngine();\r\n let index: number;\r\n\r\n if (depthOnlySubMeshes.length) {\r\n engine.setColorWrite(false);\r\n for (index = 0; index < depthOnlySubMeshes.length; index++) {\r\n renderSubMesh(depthOnlySubMeshes.data[index]);\r\n }\r\n engine.setColorWrite(true);\r\n }\r\n\r\n for (index = 0; index < opaqueSubMeshes.length; index++) {\r\n renderSubMesh(opaqueSubMeshes.data[index]);\r\n }\r\n\r\n for (index = 0; index < alphaTestSubMeshes.length; index++) {\r\n renderSubMesh(alphaTestSubMeshes.data[index]);\r\n }\r\n\r\n if (transparentSubMeshes.length) {\r\n // Sort sub meshes\r\n for (index = 0; index < transparentSubMeshes.length; index++) {\r\n const submesh = transparentSubMeshes.data[index];\r\n const boundingInfo = submesh.getBoundingInfo();\r\n\r\n if (boundingInfo && scene.activeCamera) {\r\n submesh._alphaIndex = submesh.getMesh().alphaIndex;\r\n submesh._distanceToCamera = boundingInfo.boundingSphere.centerWorld.subtract(scene.activeCamera.position).length();\r\n }\r\n }\r\n\r\n const sortedArray = transparentSubMeshes.data.slice(0, transparentSubMeshes.length);\r\n sortedArray.sort((a, b) => {\r\n // Alpha index first\r\n if (a._alphaIndex > b._alphaIndex) {\r\n return 1;\r\n }\r\n if (a._alphaIndex < b._alphaIndex) {\r\n return -1;\r\n }\r\n\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return 1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n // Render sub meshes\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n for (index = 0; index < sortedArray.length; index++) {\r\n renderSubMesh(sortedArray[index]);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n };\r\n }\r\n\r\n private _updateMeshScreenCoordinates(scene: Scene): void {\r\n const transform = scene.getTransformMatrix();\r\n let meshPosition: Vector3;\r\n\r\n if (this.useCustomMeshPosition) {\r\n meshPosition = this.customMeshPosition;\r\n } else if (this.attachedNode) {\r\n meshPosition = this.attachedNode.position;\r\n } else {\r\n meshPosition = this.mesh.parent ? this.mesh.getAbsolutePosition() : this.mesh.position;\r\n }\r\n\r\n const pos = Vector3.Project(meshPosition, Matrix.Identity(), transform, this._viewPort);\r\n\r\n this._screenCoordinates.x = pos.x / this._viewPort.width;\r\n this._screenCoordinates.y = pos.y / this._viewPort.height;\r\n\r\n if (this.invert) {\r\n this._screenCoordinates.y = 1.0 - this._screenCoordinates.y;\r\n }\r\n }\r\n\r\n // Static methods\r\n /**\r\n * Creates a default mesh for the Volumeric Light Scattering post-process\r\n * @param name The mesh name\r\n * @param scene The scene where to create the mesh\r\n * @returns the default mesh\r\n */\r\n public static CreateDefaultMesh(name: string, scene: Scene): Mesh {\r\n const mesh = CreatePlane(name, { size: 1 }, scene);\r\n mesh.billboardMode = AbstractMesh.BILLBOARDMODE_ALL;\r\n\r\n const material = new StandardMaterial(name + \"Material\", scene);\r\n material.emissiveColor = new Color3(1, 1, 1);\r\n\r\n mesh.material = material;\r\n\r\n return mesh;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for volumetricLightScatteringPostProcess.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterVolumetricLightScatteringPostProcess(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.VolumetricLightScatteringPostProcess\", VolumetricLightScatteringPostProcess);\r\n}\r\n"]}
1
+ {"version":3,"file":"volumetricLightScatteringPostProcess.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/volumetricLightScatteringPostProcess.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;;AAE7D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAK3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAE/K,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD;;GAEG;IACU,oCAAoC;;sBAAS,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAAxD,oCAAqC,SAAQ,WAAW;YAmCjE;;;eAGG;YACH,IAAW,eAAe;gBACtB,MAAM,CAAC,IAAI,CAAC,gHAAgH,CAAC,CAAC;gBAC9H,OAAO,KAAK,CAAC;YACjB,CAAC;YAED,IAAW,eAAe,CAAC,eAAwB;gBAC/C,MAAM,CAAC,IAAI,CAAC,gHAAgH,CAAC,CAAC;YAClI,CAAC;YAuCD;;;;;;;;;;;eAWG;YACH,YACI,IAAY,EACZ,KAAU,EACV,MAAwB,EACxB,IAAW,EACX,UAAkB,GAAG,EACrB,eAAuB,OAAO,CAAC,qBAAqB,EACpD,MAAuB,EACvB,QAAkB,EAClB,KAAa;gBAEb,MAAM,cAAc,GAAG,MAAM,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,KAAK,EAAE,SAAS,EAAE,CAAC;gBACtF,MAAM,cAAc,GAAG,cAAc,EAAE,QAAQ,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,6BAAqB,CAAC,4BAAoB,CAAC;gBACtH,KAAK,CACD,IAAI,EACJ,2BAA2B,EAC3B,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,sBAAsB,EAAE,SAAS,CAAC,EAClE,CAAC,wBAAwB,CAAC,EAC1B,KAAK,CAAC,gBAAgB,IAAI,KAAK,EAC/B,MAAM,EACN,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,sBAAsB,GAAG,OAAO,EAChC,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,cAAc,CACjB,CAAC;gBA3HE,uBAAkB,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;gBAOrD;;mBAEG;gBAEI,uBAAkB,6DAAY,OAAO,CAAC,IAAI,EAAE,EAAC;gBAEpD;;mBAEG;gBAEI,0BAAqB,iIAAY,KAAK,GAAC;gBAE9C;;mBAEG;gBAEI,WAAM,qHAAY,IAAI,GAAC;gBAE9B;;mBAEG;gBAEI,SAAI,6GAAO;gBAelB;;mBAEG;gBAEI,mBAAc,4GAAmB,EAAE,GAAC;gBAE3C;;;mBAGG;gBAEI,mBAAc,sHAAmB,EAAE,GAAC;gBAE3C;;mBAEG;gBAEI,aAAQ,gHAAG,GAAG,GAAC;gBAEtB;;mBAEG;gBAEI,UAAK,uGAAG,OAAO,GAAC;gBAEvB;;mBAEG;gBAEI,WAAM,qGAAG,OAAO,GAAC;gBAExB;;mBAEG;gBAEI,YAAO,uGAAG,KAAK,GAAC;;gBA6CnB,KAAK,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,iCAAiC;gBAErF,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;gBAEtG,iBAAiB;gBACjB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAoC,CAAC,iBAAiB,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;gBACnH,YAAY;gBACZ,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;gBAElD,IAAI,CAAC,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE;oBACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;wBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACzB,CAAC;oBAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC3B,CAAC,CAAC;gBAEF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,EAAE;oBAC1C,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;oBAEzC,MAAM,CAAC,UAAU,CAAC,wBAAwB,EAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;oBAChF,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBACvC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzC,MAAM,CAAC,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACvE,CAAC,CAAC,CAAC;aACN;YAEkB,cAAc,CAAC,SAAkB,EAAE,IAAoB;gBACtE,IAAI,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,IAAI,CACL,OAAO,CAAC,GAAG,CAAC;wBACR,MAAM,CAAC,mDAAmD,CAAC;wBAC3D,MAAM,CAAC,qDAAqD,CAAC;wBAC7D,MAAM,CAAC,uDAAuD,CAAC;qBAClE,CAAC,CACL,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,IAAI,CACL,OAAO,CAAC,GAAG,CAAC;wBACR,MAAM,CAAC,+CAA+C,CAAC;wBACvD,MAAM,CAAC,iDAAiD,CAAC;wBACzD,MAAM,CAAC,mDAAmD,CAAC;qBAC9D,CAAC,CACL,CAAC;gBACN,CAAC;gBAED,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;YAED;;;eAGG;YACa,YAAY;gBACxB,OAAO,sCAAsC,CAAC;YAClD,CAAC;YAEO,QAAQ,CAAC,OAAgB,EAAE,YAAqB;gBACpD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;gBAE/B,8BAA8B;gBAC9B,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,CAAC;gBAEnI,IAAI,iBAAiB,EAAE,CAAC;oBACpB,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;gBAC5E,CAAC;gBAED,MAAM,OAAO,GAAG,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBAEvC,IAAI,GAAG,GAAG,KAAK,CAAC;gBAChB,IAAI,GAAG,GAAG,KAAK,CAAC;gBAChB,MAAM,KAAK,GAAG,KAAK,CAAC;gBAEpB,aAAa;gBACb,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,gBAAgB,GAAG,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;oBAChE,IAAI,gBAAgB,EAAE,CAAC;wBACnB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBACtC,CAAC;oBAED,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;wBAClD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;wBAClC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBAC5B,GAAG,GAAG,gBAAgB,CAAC;oBAC3B,CAAC;oBACD,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;wBACnD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;wBACnC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBAC5B,GAAG,GAAG,gBAAgB,CAAC;oBAC3B,CAAC;gBACL,CAAC;gBAED,QAAQ;gBACR,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;oBAC/C,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;wBAC9B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;wBACpD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;oBACxD,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBACxE,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;wBAC9B,SAAS,CAAC,sBAAsB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBAC9C,CAAC;oBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;oBAC/B,IAAI,QAAQ,CAAC,yBAAyB,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;oBACxE,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBACnD,CAAC;gBAED,gBAAgB;gBAChB,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB;oBAC/C,CAAC,CAAC,0CAA0C,CACtC,IAAI,CAAC,kBAAkB,EACvB,OAAO,EACP,OAAO,EACP,IAAI,EACJ,IAAI,EAAE,mBAAmB;oBACzB,KAAK,EAAE,iBAAiB;oBACxB,KAAK,EAAE,kBAAkB;oBACzB,GAAG,EAAE,aAAa;oBAClB,GAAG,EAAE,cAAc;oBACnB,KAAK,CAAC,gBAAgB;qBACzB;oBACH,CAAC,CAAC,CAAC,CAAC;gBAER,YAAY;gBACZ,IAAI,YAAY,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBAClC,0BAA0B,CAAC,OAAO,CAAC,CAAC;oBACpC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,CAAC;wBAC9C,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;oBAC3C,CAAC;gBACL,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,2BAA2B,CAAC;gBACpD,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;oBACvD,IAAI,YAAY,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;oBAC1D,CAAC;gBACL,CAAC;gBAED,qBAAqB;gBACrB,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAE,CAAC;gBAC9D,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC;gBAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;oBAC3C,MAAM,QAAQ,GAAG;wBACb,OAAO;wBACP,QAAQ;wBACR,iBAAiB;wBACjB,gBAAgB;wBAChB,eAAe;wBACf,uBAAuB;wBACvB,kBAAkB;wBAClB,wBAAwB;wBACxB,2BAA2B;wBAC3B,8BAA8B;wBAC9B,yCAAyC;wBACzC,0BAA0B;wBAC1B,6BAA6B;qBAChC,CAAC;oBACF,MAAM,QAAQ,GAAG,CAAC,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,6BAA6B,CAAC,CAAC;oBAElG,WAAW,CAAC,SAAS,CACjB,MAAM,CAAC,YAAY,CACf,+BAA+B,EACP;wBACpB,UAAU,EAAE,OAAO;wBACnB,aAAa,EAAE,QAAQ;wBACvB,mBAAmB,EAAE,EAAE;wBACvB,QAAQ,EAAE,QAAQ;wBAClB,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,SAAS;wBACpB,UAAU,EAAE,IAAI;wBAChB,OAAO,EAAE,IAAI;wBACb,eAAe,EAAE,EAAE,2BAA2B,EAAE,mBAAmB,EAAE;wBACrE,cAAc,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;qBACxG,EACD,MAAM,CACT,EACD,IAAI,CACP,CAAC;gBACN,CAAC;gBAED,OAAO,WAAW,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC;YACzC,CAAC;YAED;;;eAGG;YACI,qBAAqB,CAAC,QAAiB;gBAC1C,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;YACvC,CAAC;YAED;;;eAGG;YACI,qBAAqB;gBACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;YACnC,CAAC;YAED;;;eAGG;YACa,OAAO,CAAC,MAAc;gBAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBACnG,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;oBAClB,MAAM,CAAC,QAAQ,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC;gBAED,IAAI,CAAC,6BAA6B,CAAC,OAAO,EAAE,CAAC;gBAC7C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YAED;;;eAGG;YACI,OAAO;gBACV,OAAO,IAAI,CAAC,6BAA6B,CAAC;YAC9C,CAAC;YAED,kBAAkB;YACV,aAAa,CAAC,IAAkB;gBACpC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/J,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAED,OAAO,KAAK,CAAC;YACjB,CAAC;YAEO,WAAW,CAAC,KAAY,EAAE,KAAa;gBAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAEjC,IAAI,CAAC,6BAA6B,GAAG,IAAI,mBAAmB,CACxD,8BAA8B,EAC9B,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,GAAG,KAAK,EAAE,EACpF,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,CAAC,yBAAyB,CACtC,CAAC;gBACF,IAAI,CAAC,6BAA6B,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACrE,IAAI,CAAC,6BAA6B,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACrE,IAAI,CAAC,6BAA6B,CAAC,UAAU,GAAG,IAAI,CAAC;gBACrD,IAAI,CAAC,6BAA6B,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC3D,IAAI,CAAC,6BAA6B,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChC,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBACvE,CAAC;gBAED,uCAAuC;gBACvC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAQ,EAAE;oBAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBACjD,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBACjD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;wBACpC,OAAO;oBACX,CAAC;oBAED,aAAa,CAAC,6BAA6B,CAAC,qBAAqB,GAAG,KAAK,CAAC;oBAE1E,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;oBAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACZ,OAAO;oBACX,CAAC;oBAED,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;oBACvC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;oBAEjC,UAAU;oBACV,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;oBAEnG,qBAAqB;oBACrB,MAAM,KAAK,GAAG,aAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBAEjG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;wBACnB,OAAO;oBACX,CAAC;oBAED,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC;oBAExJ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC,EAAE,CAAC;wBACrD,MAAM,iBAAiB,GAAG,aAAa,CAAC,6BAA6B,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;wBAE3H,IAAI,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;wBAC5C,IAAI,aAAa,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;4BAC9C,WAAW,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;wBAC7C,CAAC;wBAED,IAAI,CAAC,WAAW,EAAE,CAAC;4BACf,OAAO;wBACX,CAAC;wBAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAO,CAAC;wBAEnC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;wBACjC,IAAI,CAAC,0BAA0B,EAAE,CAAC;4BAC9B,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBAC5D,CAAC;wBAED,IAAI,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;4BAC9B,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;wBACjE,CAAC;6BAAM,IAAI,iBAAiB,EAAE,CAAC;4BAC3B,iBAAiB,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,aAAqB,EAAE,OAAO,CAAC,CAAC;wBACrG,CAAC;6BAAM,CAAC;4BACJ,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;4BAE/D,aAAa;4BACb,IAAI,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE,CAAC;gCAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;gCAEpD,IAAI,YAAY,EAAE,CAAC;oCACf,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;oCAClD,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC;gCACvE,CAAC;4BACL,CAAC;4BAED,QAAQ;4BACR,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;4BAE3C,gBAAgB;4BAChB,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;4BACjD,IAAI,aAAa,CAAC,kBAAkB,IAAI,aAAa,CAAC,kBAAkB,CAAC,wBAAwB,EAAE,CAAC;gCAChG,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BACnD,CAAC;4BAED,0BAA0B;4BAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,2BAA2B,CAAC;4BACjE,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gCACrC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;4BACxD,CAAC;wBACL,CAAC;wBAED,IAAI,0BAA0B,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC;4BAC/D,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;wBAC9D,CAAC;wBAED,OAAO;wBACP,aAAa,CAAC,iBAAiB,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;4BAChJ,IAAI,CAAC,UAAU,EAAE,CAAC;gCACd,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;4BACrC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC,CAAC;gBAEF,kCAAkC;gBAClC,IAAI,oBAA4B,CAAC;gBACjC,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAEvD,IAAI,CAAC,6BAA6B,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAS,EAAE;oBACvE,oBAAoB,GAAG,KAAK,CAAC,UAAU,CAAC;oBACxC,KAAK,CAAC,UAAU,GAAG,eAAe,CAAC;gBACvC,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,6BAA6B,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAS,EAAE;oBACtE,KAAK,CAAC,UAAU,GAAG,oBAAoB,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,6BAA6B,CAAC,qBAAqB,GAAG,CAAC,IAAkB,EAAE,WAAmB,EAAE,OAAiB,EAAE,EAAE;oBACtH,IAAI,CAAC,OAAO,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;4BAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;4BAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;4BACvC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;4BAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACZ,SAAS;4BACb,CAAC;4BAED,MAAM,KAAK,GAAG,aAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;4BACjG,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC;4BAExJ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC,EAAE,CAAC;gCACtD,OAAO,KAAK,CAAC;4BACjB,CAAC;wBACL,CAAC;oBACL,CAAC;oBAED,OAAO,IAAI,CAAC;gBAChB,CAAC,CAAC;gBAEF,IAAI,CAAC,6BAA6B,CAAC,oBAAoB,GAAG,CACtD,eAAoC,EACpC,kBAAuC,EACvC,oBAAyC,EACzC,kBAAuC,EACnC,EAAE;oBACN,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;oBACjC,IAAI,KAAa,CAAC;oBAElB,IAAI,kBAAkB,CAAC,MAAM,EAAE,CAAC;wBAC5B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;wBAC5B,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;4BACzD,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;wBAClD,CAAC;wBACD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;oBAED,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;wBACtD,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC/C,CAAC;oBAED,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;wBACzD,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClD,CAAC;oBAED,IAAI,oBAAoB,CAAC,MAAM,EAAE,CAAC;wBAC9B,kBAAkB;wBAClB,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;4BAC3D,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BACjD,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;4BAE/C,IAAI,YAAY,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gCACrC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC;gCACnD,OAAO,CAAC,iBAAiB,GAAG,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;4BACvH,CAAC;wBACL,CAAC;wBAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;wBACpF,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BACtB,oBAAoB;4BACpB,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gCAChC,OAAO,CAAC,CAAC;4BACb,CAAC;4BACD,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gCAChC,OAAO,CAAC,CAAC,CAAC;4BACd,CAAC;4BAED,0BAA0B;4BAC1B,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC;gCAC5C,OAAO,CAAC,CAAC;4BACb,CAAC;4BACD,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC;gCAC5C,OAAO,CAAC,CAAC,CAAC;4BACd,CAAC;4BAED,OAAO,CAAC,CAAC;wBACb,CAAC,CAAC,CAAC;wBAEH,oBAAoB;wBACpB,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;wBAC7C,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;4BAClD,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;wBACtC,CAAC;wBACD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;oBACjD,CAAC;gBACL,CAAC,CAAC;YACN,CAAC;YAEO,4BAA4B,CAAC,KAAY;gBAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAC7C,IAAI,YAAqB,CAAC;gBAE1B,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC7B,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAC3C,CAAC;qBAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC3B,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACJ,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC3F,CAAC;gBAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAExF,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBACzD,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAE1D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAChE,CAAC;YACL,CAAC;YAED,iBAAiB;YACjB;;;;;eAKG;YACI,MAAM,CAAC,iBAAiB,CAAC,IAAY,EAAE,KAAY;gBACtD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,iBAAiB,CAAC;gBAEpD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC;gBAChE,QAAQ,CAAC,aAAa,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAEzB,OAAO,IAAI,CAAC;YAChB,CAAC;;;;8CAvnBA,kBAAkB,EAAE;iDAMpB,SAAS,EAAE;kCAMX,SAAS,EAAE;gCAMX,wBAAwB,EAAE;0CAmB1B,SAAS,EAAE;0CAOX,SAAS,EAAE;oCAMX,SAAS,EAAE;iCAMX,SAAS,EAAE;kCAMX,SAAS,EAAE;mCAMX,SAAS,EAAE;YAnEZ,wMAAO,kBAAkB,6BAAlB,kBAAkB,+GAA2B;YAMpD,iNAAO,qBAAqB,6BAArB,qBAAqB,qHAAkB;YAM9C,oKAAO,MAAM,6BAAN,MAAM,uFAAiB;YAM9B,8JAAO,IAAI,6BAAJ,IAAI,mFAAO;YAmBlB,4LAAO,cAAc,6BAAd,cAAc,uGAAsB;YAO3C,4LAAO,cAAc,6BAAd,cAAc,uGAAsB;YAM3C,0KAAO,QAAQ,6BAAR,QAAQ,2FAAO;YAMtB,iKAAO,KAAK,6BAAL,KAAK,qFAAW;YAMvB,oKAAO,MAAM,6BAAN,MAAM,uFAAW;YAMxB,uKAAO,OAAO,6BAAP,OAAO,yFAAS;;;;;SAnFd,oCAAoC;AAwoBjD,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,4CAA4C;IACxD,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,aAAa,CAAC,8CAA8C,EAAE,oCAAoC,CAAC,CAAC;AACxG,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serializeAsVector3, serialize, serializeAsMeshReference } from \"../Misc/decorators\";\r\nimport { type SmartArray } from \"../Misc/smartArray\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Vector2, Vector3, Matrix } from \"../Maths/math.vector.pure\";\r\nimport { VertexBuffer } from \"../Buffers/buffer.pure\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { type SubMesh } from \"../Meshes/subMesh.pure\";\r\nimport { type Mesh } from \"../Meshes/mesh.pure\";\r\nimport { type Camera } from \"../Cameras/camera.pure\";\r\nimport { type Effect, type IEffectCreationOptions } from \"../Materials/effect.pure\";\r\nimport { Material } from \"../Materials/material.pure\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial.pure\";\r\nimport { Texture } from \"../Materials/Textures/texture.pure\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture.pure\";\r\nimport { PostProcess } from \"./postProcess.pure\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder.pure\";\r\nimport { Color4, Color3 } from \"../Maths/math.color.pure\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { type Nullable } from \"../types\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine.pure\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\n/**\r\n * Inspired by https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-13-volumetric-light-scattering-post-process\r\n */\r\nexport class VolumetricLightScatteringPostProcess extends PostProcess {\r\n // Members\r\n private _volumetricLightScatteringRTT: RenderTargetTexture;\r\n private _viewPort: Viewport;\r\n private _screenCoordinates: Vector2 = Vector2.Zero();\r\n\r\n /**\r\n * If not undefined, the mesh position is computed from the attached node position\r\n */\r\n public attachedNode: { position: Vector3 };\r\n\r\n /**\r\n * Custom position of the mesh. Used if \"useCustomMeshPosition\" is set to \"true\"\r\n */\r\n @serializeAsVector3()\r\n public customMeshPosition: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Set if the post-process should use a custom position for the light source (true) or the internal mesh position (false)\r\n */\r\n @serialize()\r\n public useCustomMeshPosition: boolean = false;\r\n\r\n /**\r\n * If the post-process should inverse the light scattering direction\r\n */\r\n @serialize()\r\n public invert: boolean = true;\r\n\r\n /**\r\n * The internal mesh used by the post-process\r\n */\r\n @serializeAsMeshReference()\r\n public mesh: Mesh;\r\n\r\n /**\r\n * @internal\r\n * VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead\r\n */\r\n public get useDiffuseColor(): boolean {\r\n Logger.Warn(\"VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead\");\r\n return false;\r\n }\r\n\r\n public set useDiffuseColor(useDiffuseColor: boolean) {\r\n Logger.Warn(\"VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead\");\r\n }\r\n\r\n /**\r\n * Array containing the excluded meshes not rendered in the internal pass\r\n */\r\n @serialize()\r\n public excludedMeshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Array containing the only meshes rendered in the internal pass.\r\n * If this array is not empty, only the meshes from this array are rendered in the internal pass\r\n */\r\n @serialize()\r\n public includedMeshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Controls the overall intensity of the post-process\r\n */\r\n @serialize()\r\n public exposure = 0.3;\r\n\r\n /**\r\n * Dissipates each sample's contribution in range [0, 1]\r\n */\r\n @serialize()\r\n public decay = 0.96815;\r\n\r\n /**\r\n * Controls the overall intensity of each sample\r\n */\r\n @serialize()\r\n public weight = 0.58767;\r\n\r\n /**\r\n * Controls the density of each sample\r\n */\r\n @serialize()\r\n public density = 0.926;\r\n\r\n /**\r\n * @constructor\r\n * @param name The post-process name\r\n * @param ratio The size of the post-process and/or internal pass (0.5 means that your postprocess will have a width = canvas.width 0.5 and a height = canvas.height 0.5)\r\n * @param camera The camera that the post-process will be attached to\r\n * @param mesh The mesh used to create the light scattering\r\n * @param samples The post-process quality, default 100\r\n * @param samplingMode The post-process filtering mode\r\n * @param engine The babylon engine\r\n * @param reusable If the post-process is reusable\r\n * @param scene The constructor needs a scene reference to initialize internal components. If \"camera\" is null a \"scene\" must be provided\r\n */\r\n constructor(\r\n name: string,\r\n ratio: any,\r\n camera: Nullable<Camera>,\r\n mesh?: Mesh,\r\n samples: number = 100,\r\n samplingMode: number = Texture.BILINEAR_SAMPLINGMODE,\r\n engine?: AbstractEngine,\r\n reusable?: boolean,\r\n scene?: Scene\r\n ) {\r\n const selectedEngine = engine ?? camera?.getScene().getEngine() ?? scene?.getEngine();\r\n const shaderLanguage = selectedEngine?.isWebGPU && !PostProcess.ForceGLSL ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\r\n super(\r\n name,\r\n \"volumetricLightScattering\",\r\n [\"decay\", \"exposure\", \"weight\", \"meshPositionOnScreen\", \"density\"],\r\n [\"lightScatteringSampler\"],\r\n ratio.postProcessRatio || ratio,\r\n camera,\r\n samplingMode,\r\n selectedEngine,\r\n reusable,\r\n \"#define NUM_SAMPLES \" + samples,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n shaderLanguage\r\n );\r\n scene = camera?.getScene() ?? scene ?? this._scene; // parameter \"scene\" can be null.\r\n\r\n engine = scene.getEngine();\r\n this._viewPort = new Viewport(0, 0, 1, 1).toGlobal(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n // Configure mesh\r\n this.mesh = mesh ?? VolumetricLightScatteringPostProcess.CreateDefaultMesh(\"VolumetricLightScatteringMesh\", scene);\r\n // Configure\r\n this._createPass(scene, ratio.passRatio || ratio);\r\n\r\n this.onActivate = (camera: Camera) => {\r\n if (!this.isSupported) {\r\n this.dispose(camera);\r\n }\r\n\r\n this.onActivate = null;\r\n };\r\n\r\n this.onApplyObservable.add((effect: Effect) => {\r\n this._updateMeshScreenCoordinates(scene);\r\n\r\n effect.setTexture(\"lightScatteringSampler\", this._volumetricLightScatteringRTT);\r\n effect.setFloat(\"exposure\", this.exposure);\r\n effect.setFloat(\"decay\", this.decay);\r\n effect.setFloat(\"weight\", this.weight);\r\n effect.setFloat(\"density\", this.density);\r\n effect.setVector2(\"meshPositionOnScreen\", this._screenCoordinates);\r\n });\r\n }\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(\r\n Promise.all([\r\n import(\"../ShadersWGSL/volumetricLightScattering.fragment\"),\r\n import(\"../ShadersWGSL/volumetricLightScatteringPass.vertex\"),\r\n import(\"../ShadersWGSL/volumetricLightScatteringPass.fragment\"),\r\n ])\r\n );\r\n } else {\r\n list.push(\r\n Promise.all([\r\n import(\"../Shaders/volumetricLightScattering.fragment\"),\r\n import(\"../Shaders/volumetricLightScatteringPass.vertex\"),\r\n import(\"../Shaders/volumetricLightScatteringPass.fragment\"),\r\n ])\r\n );\r\n }\r\n\r\n super._gatherImports(useWebGPU, list);\r\n }\r\n\r\n /**\r\n * Returns the string \"VolumetricLightScatteringPostProcess\"\r\n * @returns \"VolumetricLightScatteringPostProcess\"\r\n */\r\n public override getClassName(): string {\r\n return \"VolumetricLightScatteringPostProcess\";\r\n }\r\n\r\n private _isReady(subMesh: SubMesh, useInstances: boolean): boolean {\r\n const mesh = subMesh.getMesh();\r\n\r\n // Render this.mesh as default\r\n if (mesh === this.mesh && mesh.material) {\r\n return mesh.material.isReady(mesh);\r\n }\r\n\r\n const renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[this._scene.getEngine().currentRenderPassId];\r\n\r\n if (renderingMaterial) {\r\n return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);\r\n }\r\n\r\n const defines = [];\r\n const attribs = [VertexBuffer.PositionKind];\r\n const material = subMesh.getMaterial();\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Alpha test\r\n if (material) {\r\n const needAlphaTesting = material.needAlphaTestingForMesh(mesh);\r\n if (needAlphaTesting) {\r\n defines.push(\"#define ALPHATEST\");\r\n }\r\n\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n uv1 = needAlphaTesting;\r\n }\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n uv2 = needAlphaTesting;\r\n }\r\n }\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n\r\n const skeleton = mesh.skeleton;\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n false, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(undefined, true)!;\r\n const cachedDefines = drawWrapper.defines;\r\n const join = defines.join(\"\\n\");\r\n if (cachedDefines !== join) {\r\n const engine = mesh.getScene().getEngine();\r\n const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"boneTextureInfo\",\r\n \"viewProjection\",\r\n \"diffuseMatrix\",\r\n \"morphTargetInfluences\",\r\n \"morphTargetCount\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n ];\r\n const samplers = [\"diffuseSampler\", \"morphTargets\", \"boneSampler\", \"bakedVertexAnimationTexture\"];\r\n\r\n drawWrapper.setEffect(\r\n engine.createEffect(\r\n \"volumetricLightScatteringPass\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n shaderLanguage: engine.isWebGPU && !PostProcess.ForceGLSL ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n },\r\n engine\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n /**\r\n * Sets the new light position for light scattering effect\r\n * @param position The new custom light position\r\n */\r\n public setCustomMeshPosition(position: Vector3): void {\r\n this.customMeshPosition = position;\r\n }\r\n\r\n /**\r\n * Returns the light position for light scattering effect\r\n * @returns Vector3 The custom light position\r\n */\r\n public getCustomMeshPosition(): Vector3 {\r\n return this.customMeshPosition;\r\n }\r\n\r\n /**\r\n * Disposes the internal assets and detaches the post-process from the camera\r\n * @param camera The camera from which to detach the post-process\r\n */\r\n public override dispose(camera: Camera): void {\r\n const rttIndex = camera.getScene().customRenderTargets.indexOf(this._volumetricLightScatteringRTT);\r\n if (rttIndex !== -1) {\r\n camera.getScene().customRenderTargets.splice(rttIndex, 1);\r\n }\r\n\r\n this._volumetricLightScatteringRTT.dispose();\r\n super.dispose(camera);\r\n }\r\n\r\n /**\r\n * Returns the render target texture used by the post-process\r\n * @returns the render target texture used by the post-process\r\n */\r\n public getPass(): RenderTargetTexture {\r\n return this._volumetricLightScatteringRTT;\r\n }\r\n\r\n // Private methods\r\n private _meshExcluded(mesh: AbstractMesh) {\r\n if ((this.includedMeshes.length > 0 && this.includedMeshes.indexOf(mesh) === -1) || (this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(mesh) !== -1)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _createPass(scene: Scene, ratio: number): void {\r\n const engine = scene.getEngine();\r\n\r\n this._volumetricLightScatteringRTT = new RenderTargetTexture(\r\n \"volumetricLightScatteringMap\",\r\n { width: engine.getRenderWidth() * ratio, height: engine.getRenderHeight() * ratio },\r\n scene,\r\n false,\r\n true,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n this._volumetricLightScatteringRTT.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this._volumetricLightScatteringRTT.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._volumetricLightScatteringRTT.renderList = null;\r\n this._volumetricLightScatteringRTT.renderParticles = false;\r\n this._volumetricLightScatteringRTT.ignoreCameraViewport = true;\r\n\r\n const camera = this.getCamera();\r\n if (camera) {\r\n camera.customRenderTargets.push(this._volumetricLightScatteringRTT);\r\n } else {\r\n scene.customRenderTargets.push(this._volumetricLightScatteringRTT);\r\n }\r\n\r\n // Custom render function for submeshes\r\n const renderSubMesh = (subMesh: SubMesh): void => {\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = subMesh.getEffectiveMesh();\r\n if (this._meshExcluded(renderingMesh)) {\r\n return;\r\n }\r\n\r\n effectiveMesh._internalAbstractMeshDataInfo._isActiveIntermediate = false;\r\n\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return;\r\n }\r\n\r\n const scene = renderingMesh.getScene();\r\n const engine = scene.getEngine();\r\n\r\n // Culling\r\n engine.setState(material.backFaceCulling, undefined, undefined, undefined, material.cullBackFaces);\r\n\r\n // Managing instances\r\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());\r\n\r\n if (batch.mustReturn) {\r\n return;\r\n }\r\n\r\n const hardwareInstancedRendering = engine.getCaps().instancedArrays && (batch.visibleInstances[subMesh._id] !== null || renderingMesh.hasThinInstances);\r\n\r\n if (this._isReady(subMesh, hardwareInstancedRendering)) {\r\n const renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\r\n\r\n let drawWrapper = subMesh._getDrawWrapper();\r\n if (renderingMesh === this.mesh && !drawWrapper) {\r\n drawWrapper = material._getDrawWrapper();\r\n }\r\n\r\n if (!drawWrapper) {\r\n return;\r\n }\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n engine.enableEffect(drawWrapper);\r\n if (!hardwareInstancedRendering) {\r\n renderingMesh._bind(subMesh, effect, material.fillMode);\r\n }\r\n\r\n if (renderingMesh === this.mesh) {\r\n material.bind(effectiveMesh.getWorldMatrix(), renderingMesh);\r\n } else if (renderingMaterial) {\r\n renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh as Mesh, subMesh);\r\n } else {\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n\r\n // Alpha test\r\n if (material.needAlphaTestingForMesh(effectiveMesh)) {\r\n const alphaTexture = material.getAlphaTestTexture();\r\n\r\n if (alphaTexture) {\r\n effect.setTexture(\"diffuseSampler\", alphaTexture);\r\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\r\n }\r\n }\r\n\r\n // Bones\r\n BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n }\r\n\r\n if (hardwareInstancedRendering && renderingMesh.hasThinInstances) {\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n }\r\n\r\n // Draw\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, Material.TriangleFillMode, batch, hardwareInstancedRendering, (isInstance, world) => {\r\n if (!isInstance) {\r\n effect.setMatrix(\"world\", world);\r\n }\r\n });\r\n }\r\n };\r\n\r\n // Render target texture callbacks\r\n let savedSceneClearColor: Color4;\r\n const sceneClearColor = new Color4(0.0, 0.0, 0.0, 1.0);\r\n\r\n this._volumetricLightScatteringRTT.onBeforeRenderObservable.add((): void => {\r\n savedSceneClearColor = scene.clearColor;\r\n scene.clearColor = sceneClearColor;\r\n });\r\n\r\n this._volumetricLightScatteringRTT.onAfterRenderObservable.add((): void => {\r\n scene.clearColor = savedSceneClearColor;\r\n });\r\n\r\n this._volumetricLightScatteringRTT.customIsReadyFunction = (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => {\r\n if ((preWarm || refreshRate === 0) && mesh.subMeshes) {\r\n for (let i = 0; i < mesh.subMeshes.length; ++i) {\r\n const subMesh = mesh.subMeshes[i];\r\n const material = subMesh.getMaterial();\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n\r\n if (!material) {\r\n continue;\r\n }\r\n\r\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());\r\n const hardwareInstancedRendering = engine.getCaps().instancedArrays && (batch.visibleInstances[subMesh._id] !== null || renderingMesh.hasThinInstances);\r\n\r\n if (!this._isReady(subMesh, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n this._volumetricLightScatteringRTT.customRenderFunction = (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ): void => {\r\n const engine = scene.getEngine();\r\n let index: number;\r\n\r\n if (depthOnlySubMeshes.length) {\r\n engine.setColorWrite(false);\r\n for (index = 0; index < depthOnlySubMeshes.length; index++) {\r\n renderSubMesh(depthOnlySubMeshes.data[index]);\r\n }\r\n engine.setColorWrite(true);\r\n }\r\n\r\n for (index = 0; index < opaqueSubMeshes.length; index++) {\r\n renderSubMesh(opaqueSubMeshes.data[index]);\r\n }\r\n\r\n for (index = 0; index < alphaTestSubMeshes.length; index++) {\r\n renderSubMesh(alphaTestSubMeshes.data[index]);\r\n }\r\n\r\n if (transparentSubMeshes.length) {\r\n // Sort sub meshes\r\n for (index = 0; index < transparentSubMeshes.length; index++) {\r\n const submesh = transparentSubMeshes.data[index];\r\n const boundingInfo = submesh.getBoundingInfo();\r\n\r\n if (boundingInfo && scene.activeCamera) {\r\n submesh._alphaIndex = submesh.getMesh().alphaIndex;\r\n submesh._distanceToCamera = boundingInfo.boundingSphere.centerWorld.subtract(scene.activeCamera.position).length();\r\n }\r\n }\r\n\r\n const sortedArray = transparentSubMeshes.data.slice(0, transparentSubMeshes.length);\r\n sortedArray.sort((a, b) => {\r\n // Alpha index first\r\n if (a._alphaIndex > b._alphaIndex) {\r\n return 1;\r\n }\r\n if (a._alphaIndex < b._alphaIndex) {\r\n return -1;\r\n }\r\n\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return 1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n // Render sub meshes\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n for (index = 0; index < sortedArray.length; index++) {\r\n renderSubMesh(sortedArray[index]);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n };\r\n }\r\n\r\n private _updateMeshScreenCoordinates(scene: Scene): void {\r\n const transform = scene.getTransformMatrix();\r\n let meshPosition: Vector3;\r\n\r\n if (this.useCustomMeshPosition) {\r\n meshPosition = this.customMeshPosition;\r\n } else if (this.attachedNode) {\r\n meshPosition = this.attachedNode.position;\r\n } else {\r\n meshPosition = this.mesh.parent ? this.mesh.getAbsolutePosition() : this.mesh.position;\r\n }\r\n\r\n const pos = Vector3.Project(meshPosition, Matrix.Identity(), transform, this._viewPort);\r\n\r\n this._screenCoordinates.x = pos.x / this._viewPort.width;\r\n this._screenCoordinates.y = pos.y / this._viewPort.height;\r\n\r\n if (this.invert) {\r\n this._screenCoordinates.y = 1.0 - this._screenCoordinates.y;\r\n }\r\n }\r\n\r\n // Static methods\r\n /**\r\n * Creates a default mesh for the Volumeric Light Scattering post-process\r\n * @param name The mesh name\r\n * @param scene The scene where to create the mesh\r\n * @returns the default mesh\r\n */\r\n public static CreateDefaultMesh(name: string, scene: Scene): Mesh {\r\n const mesh = CreatePlane(name, { size: 1 }, scene);\r\n mesh.billboardMode = AbstractMesh.BILLBOARDMODE_ALL;\r\n\r\n const material = new StandardMaterial(name + \"Material\", scene);\r\n material.emissiveColor = new Color3(1, 1, 1);\r\n\r\n mesh.material = material;\r\n\r\n return mesh;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for volumetricLightScatteringPostProcess.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterVolumetricLightScatteringPostProcess(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.VolumetricLightScatteringPostProcess\", VolumetricLightScatteringPostProcess);\r\n}\r\n"]}
@@ -17,10 +17,12 @@ export declare class _IblShadowsAccumulationPass {
17
17
  private _accumulationParams;
18
18
  /** Enable the debug view for this pass */
19
19
  debugEnabled: boolean;
20
+ private _enabled;
20
21
  /**
21
22
  * Is the effect enabled
22
23
  */
23
- enabled: boolean;
24
+ get enabled(): boolean;
25
+ set enabled(value: boolean);
24
26
  /**
25
27
  * Returns the output texture of the pass.
26
28
  * @returns The output texture.
@@ -9,6 +9,30 @@ import { Observable } from "../../Misc/observable.js";
9
9
  * @internal
10
10
  */
11
11
  export class _IblShadowsAccumulationPass {
12
+ /**
13
+ * Is the effect enabled
14
+ */
15
+ get enabled() {
16
+ return this._enabled;
17
+ }
18
+ set enabled(value) {
19
+ this._enabled = value;
20
+ // _render() already gates on `enabled` for _outputTexture, but _oldAccumulationCopy and
21
+ // _oldPositionCopy have refreshRate = 1 and are rendered by Babylon's generic per-frame
22
+ // ProceduralTexture refresh loop, entirely independent of `enabled` / `_render()`. Without
23
+ // disabling them directly here, they keep rendering (and paying a real per-frame texture-view
24
+ // creation cost) every frame forever, even when the whole pass — and the rest of the IBL
25
+ // shadows pipeline — has been toggled off (e.g. no shadow casters or receivers in the scene).
26
+ if (this._outputTexture) {
27
+ this._outputTexture.isEnabled = value;
28
+ }
29
+ if (this._oldAccumulationCopy) {
30
+ this._oldAccumulationCopy.isEnabled = value;
31
+ }
32
+ if (this._oldPositionCopy) {
33
+ this._oldPositionCopy.isEnabled = value;
34
+ }
35
+ }
12
36
  /**
13
37
  * Returns the output texture of the pass.
14
38
  * @returns The output texture.
@@ -121,10 +145,7 @@ export class _IblShadowsAccumulationPass {
121
145
  this._accumulationParams = new Vector4(0.0, 0.0, 0.0, 0.0);
122
146
  /** Enable the debug view for this pass */
123
147
  this.debugEnabled = false;
124
- /**
125
- * Is the effect enabled
126
- */
127
- this.enabled = true;
148
+ this._enabled = true;
128
149
  /**
129
150
  * Observable that triggers when the accumulation texture is ready
130
151
  */
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsAccumulationPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.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 { Vector4 } from \"../../Maths/math.vector.pure\";\r\nimport { PostProcess, type PostProcessOptions } from \"../../PostProcesses/postProcess.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer.pure\";\r\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture.pure\";\r\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport { Observable, type EventState } from \"../../Misc/observable\";\r\nimport { type Nullable } from \"../../types\";\r\n\r\n/**\r\n * This should not be instantiated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsAccumulationPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n\r\n // First, render the accumulation pass with both position buffers, motion buffer, shadow buffer, and the previous accumulation buffer\r\n private _outputTexture: ProceduralTexture;\r\n private _oldAccumulationCopy: ProceduralTexture;\r\n private _oldPositionCopy: ProceduralTexture;\r\n private _accumulationParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public enabled: boolean = true;\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 * Observable that triggers when the accumulation texture is ready\r\n */\r\n public onReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Gets the debug pass post process\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 = \"Shadow Accumulation Debug Pass\";\r\n\r\n /**\r\n * Gets the name of the debug pass\r\n * @returns 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 /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public get remanence(): number {\r\n return this._remanence;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public set remanence(value: number) {\r\n this._remanence = value;\r\n }\r\n private _remanence: number = 0.9;\r\n\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public get reset(): boolean {\r\n return this._reset;\r\n }\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public set reset(value: boolean) {\r\n this._reset = value;\r\n }\r\n private _reset: boolean = true;\r\n\r\n /**\r\n * Tell the pass that the camera is moving. This will cause the accumulation\r\n * rate to change.\r\n */\r\n public set isMoving(value: boolean) {\r\n this._isMoving = value;\r\n }\r\n private _isMoving: boolean = false;\r\n\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 if (!this._debugPassPP) {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the accumulation pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The accumulation 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 isWebGPU = this._engine.isWebGPU;\r\n\r\n const outputTextureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowAccumulation.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowAccumulation.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"shadowAccumulationPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowAccumulation\",\r\n this._scene,\r\n outputTextureOptions\r\n );\r\n this._outputTexture.refreshRate = -1;\r\n this._outputTexture.autoClear = false;\r\n this._outputTexture.onGeneratedObservable.addOnce(() => {\r\n this.onReadyObservable.notifyObservers();\r\n });\r\n\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setOutputTextureBindings();\r\n\r\n this._renderWhenGBufferReady = this._render.bind(this);\r\n // Don't start rendering until the first vozelization is done.\r\n this._renderPipeline.onVoxelizationCompleteObservable.addOnce(() => {\r\n if (this._scene.geometryBufferRenderer) {\r\n this._scene.geometryBufferRenderer.getGBuffer().onAfterRenderObservable.add(this._renderWhenGBufferReady);\r\n }\r\n });\r\n\r\n // Create the accumulation texture for the previous frame.\r\n // We'll copy the output of the accumulation pass to this texture at the start of every frame.\r\n const accumulationOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldAccumulationCopy = new ProceduralTexture(\r\n \"oldAccumulationRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n accumulationOptions,\r\n false\r\n );\r\n\r\n this._oldAccumulationCopy.autoClear = false;\r\n this._oldAccumulationCopy.refreshRate = 1;\r\n this._oldAccumulationCopy.onBeforeGenerationObservable.add(this._setAccumulationCopyBindings.bind(this));\r\n this._setAccumulationCopyBindings();\r\n\r\n // Create the local position texture for the previous frame.\r\n // We'll copy the previous local position texture to this texture at the start of every frame.\r\n const localPositionOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldPositionCopy = new ProceduralTexture(\r\n \"oldLocalPositionRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n localPositionOptions,\r\n false\r\n );\r\n this._updatePositionCopy();\r\n this._oldPositionCopy.autoClear = false;\r\n this._oldPositionCopy.refreshRate = 1;\r\n this._oldPositionCopy.onBeforeGenerationObservable.add(this._updatePositionCopy.bind(this));\r\n }\r\n\r\n private _setOutputTextureBindings(): boolean {\r\n const remanence = this._isMoving ? this.remanence : 0.99;\r\n this._accumulationParams.set(remanence, this.reset ? 1.0 : 0.0, this._renderPipeline.voxelGridSize, 0.0);\r\n this._outputTexture.setTexture(\"spatialBlurSampler\", this._renderPipeline._getSpatialBlurTexture());\r\n this._outputTexture.setVector4(\"accumulationParameters\", this._accumulationParams);\r\n this._outputTexture.setTexture(\"oldAccumulationSampler\", this._oldAccumulationCopy ? this._oldAccumulationCopy : this._renderPipeline._dummyTexture2d);\r\n this._outputTexture.setTexture(\"prevPositionSampler\", this._oldPositionCopy ? this._oldPositionCopy : this._renderPipeline._dummyTexture2d);\r\n\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return false;\r\n }\r\n const velocityIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"motionSampler\", geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n const wPositionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"positionSampler\", geometryBufferRenderer.getGBuffer().textures[wPositionIndex]);\r\n\r\n this.reset = false;\r\n this._isMoving = false;\r\n return true;\r\n }\r\n\r\n private _updatePositionCopy() {\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (geometryBufferRenderer) {\r\n const index = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._oldPositionCopy.setTexture(\"textureSampler\", geometryBufferRenderer.getGBuffer().textures[index]);\r\n }\r\n }\r\n\r\n private _setAccumulationCopyBindings() {\r\n this._oldAccumulationCopy.setTexture(\"textureSampler\", this._outputTexture);\r\n }\r\n\r\n private _render() {\r\n if (this.enabled && this._outputTexture.isReady() && this._outputTexture.getEffect()?.isReady()) {\r\n if (this._setOutputTextureBindings()) {\r\n this._outputTexture.render();\r\n }\r\n }\r\n }\r\n\r\n private _renderWhenGBufferReady: Nullable<(eventData: number, eventState: EventState) => void> = null;\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 // Don't resize if the size is the same as the current size.\r\n if (this._outputTexture.getSize().width === newSize.width && this._outputTexture.getSize().height === newSize.height) {\r\n return;\r\n }\r\n this._outputTexture.resize(newSize, false);\r\n this._oldAccumulationCopy.resize(newSize, false);\r\n this._oldPositionCopy.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, false);\r\n this.reset = true;\r\n }\r\n\r\n private _disposeTextures() {\r\n this._oldAccumulationCopy.dispose();\r\n this._oldPositionCopy.dispose();\r\n this._outputTexture.dispose();\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._oldAccumulationCopy &&\r\n this._oldAccumulationCopy.isReady() &&\r\n this._oldPositionCopy &&\r\n this._oldPositionCopy.isReady() &&\r\n this._outputTexture.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n if (this._scene.geometryBufferRenderer && this._renderWhenGBufferReady) {\r\n const gBuffer = this._scene.geometryBufferRenderer.getGBuffer();\r\n gBuffer.onAfterRenderObservable.removeCallback(this._renderWhenGBufferReady);\r\n }\r\n this._disposeTextures();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n this.onReadyObservable.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"iblShadowsAccumulationPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.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 { Vector4 } from \"../../Maths/math.vector.pure\";\r\nimport { PostProcess, type PostProcessOptions } from \"../../PostProcesses/postProcess.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer.pure\";\r\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture.pure\";\r\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport { Observable, type EventState } from \"../../Misc/observable\";\r\nimport { type Nullable } from \"../../types\";\r\n\r\n/**\r\n * This should not be instantiated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsAccumulationPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n\r\n // First, render the accumulation pass with both position buffers, motion buffer, shadow buffer, and the previous accumulation buffer\r\n private _outputTexture: ProceduralTexture;\r\n private _oldAccumulationCopy: ProceduralTexture;\r\n private _oldPositionCopy: ProceduralTexture;\r\n private _accumulationParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n private _enabled: boolean = true;\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n public set enabled(value: boolean) {\r\n this._enabled = value;\r\n // _render() already gates on `enabled` for _outputTexture, but _oldAccumulationCopy and\r\n // _oldPositionCopy have refreshRate = 1 and are rendered by Babylon's generic per-frame\r\n // ProceduralTexture refresh loop, entirely independent of `enabled` / `_render()`. Without\r\n // disabling them directly here, they keep rendering (and paying a real per-frame texture-view\r\n // creation cost) every frame forever, even when the whole pass — and the rest of the IBL\r\n // shadows pipeline — has been toggled off (e.g. no shadow casters or receivers in the scene).\r\n if (this._outputTexture) {\r\n this._outputTexture.isEnabled = value;\r\n }\r\n if (this._oldAccumulationCopy) {\r\n this._oldAccumulationCopy.isEnabled = value;\r\n }\r\n if (this._oldPositionCopy) {\r\n this._oldPositionCopy.isEnabled = value;\r\n }\r\n }\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 * Observable that triggers when the accumulation texture is ready\r\n */\r\n public onReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Gets the debug pass post process\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 = \"Shadow Accumulation Debug Pass\";\r\n\r\n /**\r\n * Gets the name of the debug pass\r\n * @returns 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 /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public get remanence(): number {\r\n return this._remanence;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public set remanence(value: number) {\r\n this._remanence = value;\r\n }\r\n private _remanence: number = 0.9;\r\n\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public get reset(): boolean {\r\n return this._reset;\r\n }\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public set reset(value: boolean) {\r\n this._reset = value;\r\n }\r\n private _reset: boolean = true;\r\n\r\n /**\r\n * Tell the pass that the camera is moving. This will cause the accumulation\r\n * rate to change.\r\n */\r\n public set isMoving(value: boolean) {\r\n this._isMoving = value;\r\n }\r\n private _isMoving: boolean = false;\r\n\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 if (!this._debugPassPP) {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the accumulation pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The accumulation 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 isWebGPU = this._engine.isWebGPU;\r\n\r\n const outputTextureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowAccumulation.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowAccumulation.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"shadowAccumulationPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowAccumulation\",\r\n this._scene,\r\n outputTextureOptions\r\n );\r\n this._outputTexture.refreshRate = -1;\r\n this._outputTexture.autoClear = false;\r\n this._outputTexture.onGeneratedObservable.addOnce(() => {\r\n this.onReadyObservable.notifyObservers();\r\n });\r\n\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setOutputTextureBindings();\r\n\r\n this._renderWhenGBufferReady = this._render.bind(this);\r\n // Don't start rendering until the first vozelization is done.\r\n this._renderPipeline.onVoxelizationCompleteObservable.addOnce(() => {\r\n if (this._scene.geometryBufferRenderer) {\r\n this._scene.geometryBufferRenderer.getGBuffer().onAfterRenderObservable.add(this._renderWhenGBufferReady);\r\n }\r\n });\r\n\r\n // Create the accumulation texture for the previous frame.\r\n // We'll copy the output of the accumulation pass to this texture at the start of every frame.\r\n const accumulationOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldAccumulationCopy = new ProceduralTexture(\r\n \"oldAccumulationRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n accumulationOptions,\r\n false\r\n );\r\n\r\n this._oldAccumulationCopy.autoClear = false;\r\n this._oldAccumulationCopy.refreshRate = 1;\r\n this._oldAccumulationCopy.onBeforeGenerationObservable.add(this._setAccumulationCopyBindings.bind(this));\r\n this._setAccumulationCopyBindings();\r\n\r\n // Create the local position texture for the previous frame.\r\n // We'll copy the previous local position texture to this texture at the start of every frame.\r\n const localPositionOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldPositionCopy = new ProceduralTexture(\r\n \"oldLocalPositionRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n localPositionOptions,\r\n false\r\n );\r\n this._updatePositionCopy();\r\n this._oldPositionCopy.autoClear = false;\r\n this._oldPositionCopy.refreshRate = 1;\r\n this._oldPositionCopy.onBeforeGenerationObservable.add(this._updatePositionCopy.bind(this));\r\n }\r\n\r\n private _setOutputTextureBindings(): boolean {\r\n const remanence = this._isMoving ? this.remanence : 0.99;\r\n this._accumulationParams.set(remanence, this.reset ? 1.0 : 0.0, this._renderPipeline.voxelGridSize, 0.0);\r\n this._outputTexture.setTexture(\"spatialBlurSampler\", this._renderPipeline._getSpatialBlurTexture());\r\n this._outputTexture.setVector4(\"accumulationParameters\", this._accumulationParams);\r\n this._outputTexture.setTexture(\"oldAccumulationSampler\", this._oldAccumulationCopy ? this._oldAccumulationCopy : this._renderPipeline._dummyTexture2d);\r\n this._outputTexture.setTexture(\"prevPositionSampler\", this._oldPositionCopy ? this._oldPositionCopy : this._renderPipeline._dummyTexture2d);\r\n\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return false;\r\n }\r\n const velocityIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"motionSampler\", geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n const wPositionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"positionSampler\", geometryBufferRenderer.getGBuffer().textures[wPositionIndex]);\r\n\r\n this.reset = false;\r\n this._isMoving = false;\r\n return true;\r\n }\r\n\r\n private _updatePositionCopy() {\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (geometryBufferRenderer) {\r\n const index = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._oldPositionCopy.setTexture(\"textureSampler\", geometryBufferRenderer.getGBuffer().textures[index]);\r\n }\r\n }\r\n\r\n private _setAccumulationCopyBindings() {\r\n this._oldAccumulationCopy.setTexture(\"textureSampler\", this._outputTexture);\r\n }\r\n\r\n private _render() {\r\n if (this.enabled && this._outputTexture.isReady() && this._outputTexture.getEffect()?.isReady()) {\r\n if (this._setOutputTextureBindings()) {\r\n this._outputTexture.render();\r\n }\r\n }\r\n }\r\n\r\n private _renderWhenGBufferReady: Nullable<(eventData: number, eventState: EventState) => void> = null;\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 // Don't resize if the size is the same as the current size.\r\n if (this._outputTexture.getSize().width === newSize.width && this._outputTexture.getSize().height === newSize.height) {\r\n return;\r\n }\r\n this._outputTexture.resize(newSize, false);\r\n this._oldAccumulationCopy.resize(newSize, false);\r\n this._oldPositionCopy.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, false);\r\n this.reset = true;\r\n }\r\n\r\n private _disposeTextures() {\r\n this._oldAccumulationCopy.dispose();\r\n this._oldPositionCopy.dispose();\r\n this._outputTexture.dispose();\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._oldAccumulationCopy &&\r\n this._oldAccumulationCopy.isReady() &&\r\n this._oldPositionCopy &&\r\n this._oldPositionCopy.isReady() &&\r\n this._outputTexture.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n if (this._scene.geometryBufferRenderer && this._renderWhenGBufferReady) {\r\n const gBuffer = this._scene.geometryBufferRenderer.getGBuffer();\r\n gBuffer.onAfterRenderObservable.removeCallback(this._renderWhenGBufferReady);\r\n }\r\n this._disposeTextures();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n this.onReadyObservable.clear();\r\n }\r\n}\r\n"]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { EngineStore } from "../../Engines/engineStore.js";
4
4
  import { Matrix, Vector3, Vector4, Quaternion } from "../../Maths/math.vector.pure.js";
5
+ import { IsGaussianSplattingClassName } from "../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js";
5
6
  import { Texture } from "../../Materials/Textures/texture.pure.js";
6
7
  import { Logger } from "../../Misc/logger.js";
7
8
  import { _IblShadowsVoxelRenderer } from "./iblShadowsVoxelRenderer.pure.js";
@@ -337,7 +338,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
337
338
  for (const m of mesh) {
338
339
  if (m && this._shadowCastingMeshes.indexOf(m) === -1) {
339
340
  this._shadowCastingMeshes.push(m);
340
- if (m.getClassName() === "GaussianSplattingMesh") {
341
+ if (IsGaussianSplattingClassName(m.getClassName())) {
341
342
  m.needsRotationScaleTextures = true;
342
343
  }
343
344
  }
@@ -346,7 +347,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
346
347
  else {
347
348
  if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {
348
349
  this._shadowCastingMeshes.push(mesh);
349
- if (mesh.getClassName() === "GaussianSplattingMesh") {
350
+ if (IsGaussianSplattingClassName(mesh.getClassName())) {
350
351
  mesh.needsRotationScaleTextures = true;
351
352
  }
352
353
  }
@@ -363,7 +364,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
363
364
  const index = this._shadowCastingMeshes.indexOf(m);
364
365
  if (index !== -1) {
365
366
  this._shadowCastingMeshes.splice(index, 1);
366
- if (m.getClassName() === "GaussianSplattingMesh") {
367
+ if (IsGaussianSplattingClassName(m.getClassName())) {
367
368
  m.needsRotationScaleTextures = false;
368
369
  }
369
370
  }
@@ -373,7 +374,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
373
374
  const index = this._shadowCastingMeshes.indexOf(mesh);
374
375
  if (index !== -1) {
375
376
  this._shadowCastingMeshes.splice(index, 1);
376
- if (mesh.getClassName() === "GaussianSplattingMesh") {
377
+ if (IsGaussianSplattingClassName(mesh.getClassName())) {
377
378
  mesh.needsRotationScaleTextures = false;
378
379
  }
379
380
  }
@@ -384,7 +385,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
384
385
  */
385
386
  clearShadowCastingMeshes() {
386
387
  for (const m of this._shadowCastingMeshes) {
387
- if (m.getClassName() === "GaussianSplattingMesh") {
388
+ if (IsGaussianSplattingClassName(m.getClassName())) {
388
389
  m.needsRotationScaleTextures = false;
389
390
  }
390
391
  }