@babylonjs/core 7.4.0 → 7.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/Audio/sound.js +3 -0
  2. package/Audio/sound.js.map +1 -1
  3. package/Buffers/storageBuffer.d.ts +2 -2
  4. package/Buffers/storageBuffer.js.map +1 -1
  5. package/Cameras/arcRotateCamera.js +3 -0
  6. package/Cameras/arcRotateCamera.js.map +1 -1
  7. package/Cameras/flyCamera.js +3 -0
  8. package/Cameras/flyCamera.js.map +1 -1
  9. package/Cameras/followCamera.js +4 -0
  10. package/Cameras/followCamera.js.map +1 -1
  11. package/Cameras/freeCamera.js +3 -0
  12. package/Cameras/freeCamera.js.map +1 -1
  13. package/Engines/Extensions/index.d.ts +0 -3
  14. package/Engines/Extensions/index.js +0 -3
  15. package/Engines/Extensions/index.js.map +1 -1
  16. package/Engines/WebGPU/Extensions/index.d.ts +0 -3
  17. package/Engines/WebGPU/Extensions/index.js +0 -3
  18. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  19. package/Engines/abstractEngine.d.ts +11 -63
  20. package/Engines/abstractEngine.js +7 -7
  21. package/Engines/abstractEngine.js.map +1 -1
  22. package/Engines/nativeEngine.js +2 -2
  23. package/Engines/nativeEngine.js.map +1 -1
  24. package/Engines/thinEngine.d.ts +2 -2
  25. package/Engines/thinEngine.functions.d.ts +2 -10
  26. package/Engines/thinEngine.functions.js +1 -20
  27. package/Engines/thinEngine.functions.js.map +1 -1
  28. package/Engines/thinEngine.js +27 -11
  29. package/Engines/thinEngine.js.map +1 -1
  30. package/Engines/webgpuEngine.d.ts +54 -2
  31. package/Engines/webgpuEngine.js +147 -0
  32. package/Engines/webgpuEngine.js.map +1 -1
  33. package/Inputs/scene.inputManager.d.ts +1 -0
  34. package/Inputs/scene.inputManager.js +1 -0
  35. package/Inputs/scene.inputManager.js.map +1 -1
  36. package/Lights/directionalLight.js +3 -0
  37. package/Lights/directionalLight.js.map +1 -1
  38. package/Lights/hemisphericLight.js +3 -0
  39. package/Lights/hemisphericLight.js.map +1 -1
  40. package/Lights/pointLight.js +3 -0
  41. package/Lights/pointLight.js.map +1 -1
  42. package/Lights/spotLight.js +3 -0
  43. package/Lights/spotLight.js.map +1 -1
  44. package/Loading/Plugins/babylonFileLoader.js +25 -14
  45. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  46. package/Materials/Background/backgroundMaterial.js +1 -2
  47. package/Materials/Background/backgroundMaterial.js.map +1 -1
  48. package/Materials/GreasedLine/greasedLinePluginMaterial.js +7 -3
  49. package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
  50. package/Materials/Node/Blocks/Dual/clipPlanesBlock.d.ts +1 -1
  51. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
  52. package/Materials/Node/Blocks/Dual/currentScreenBlock.d.ts +1 -1
  53. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  54. package/Materials/Node/Blocks/Dual/fogBlock.d.ts +1 -1
  55. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  56. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.d.ts +1 -1
  57. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  58. package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +1 -1
  59. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
  60. package/Materials/Node/Blocks/Dual/textureBlock.d.ts +1 -1
  61. package/Materials/Node/Blocks/Dual/textureBlock.js +5 -1
  62. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  63. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +1 -1
  64. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  65. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.d.ts +1 -1
  66. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  67. package/Materials/Node/Blocks/Fragment/screenSizeBlock.d.ts +1 -1
  68. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js.map +1 -1
  69. package/Materials/Node/Blocks/Fragment/shadowMapBlock.d.ts +1 -1
  70. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
  71. package/Materials/Node/Blocks/Input/animatedInputBlockTypes.d.ts +2 -1
  72. package/Materials/Node/Blocks/Input/animatedInputBlockTypes.js +1 -0
  73. package/Materials/Node/Blocks/Input/animatedInputBlockTypes.js.map +1 -1
  74. package/Materials/Node/Blocks/Input/inputBlock.d.ts +1 -1
  75. package/Materials/Node/Blocks/Input/inputBlock.js +16 -0
  76. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  77. package/Materials/Node/Blocks/PBR/anisotropyBlock.d.ts +1 -1
  78. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  79. package/Materials/Node/Blocks/PBR/clearCoatBlock.d.ts +1 -1
  80. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  81. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +1 -1
  82. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  83. package/Materials/Node/Blocks/PBR/reflectionBlock.d.ts +1 -1
  84. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  85. package/Materials/Node/Blocks/PBR/refractionBlock.d.ts +1 -1
  86. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  87. package/Materials/Node/Blocks/Vertex/lightInformationBlock.d.ts +1 -1
  88. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
  89. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.d.ts +1 -1
  90. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
  91. package/Materials/Node/Blocks/baseMathBlock.js +2 -4
  92. package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
  93. package/Materials/Node/Blocks/modBlock.js +7 -1
  94. package/Materials/Node/Blocks/modBlock.js.map +1 -1
  95. package/Materials/Node/Blocks/triPlanarBlock.d.ts +1 -1
  96. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  97. package/Materials/Node/nodeMaterial.d.ts +2 -4
  98. package/Materials/Node/nodeMaterial.js +1 -3
  99. package/Materials/Node/nodeMaterial.js.map +1 -1
  100. package/Materials/Node/nodeMaterialBlockConnectionPoint.d.ts +34 -14
  101. package/Materials/Node/nodeMaterialBlockConnectionPoint.js +87 -9
  102. package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
  103. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
  104. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  105. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -2
  106. package/Materials/PBR/pbrBaseMaterial.js +1 -2
  107. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  108. package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -1
  109. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  110. package/Materials/Textures/htmlElementTexture.d.ts +0 -1
  111. package/Materials/Textures/htmlElementTexture.js +7 -2
  112. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  113. package/Materials/Textures/videoTexture.js +4 -2
  114. package/Materials/Textures/videoTexture.js.map +1 -1
  115. package/Materials/effect.d.ts +4 -0
  116. package/Materials/effect.functions.d.ts +1 -1
  117. package/Materials/effect.functions.js +6 -4
  118. package/Materials/effect.functions.js.map +1 -1
  119. package/Materials/effect.js +1 -1
  120. package/Materials/effect.js.map +1 -1
  121. package/Materials/effect.webgl.functions.js +3 -3
  122. package/Materials/effect.webgl.functions.js.map +1 -1
  123. package/Materials/imageProcessingConfiguration.d.ts +5 -0
  124. package/Materials/imageProcessingConfiguration.defines.d.ts +2 -4
  125. package/Materials/imageProcessingConfiguration.defines.js +1 -2
  126. package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
  127. package/Materials/imageProcessingConfiguration.js +26 -11
  128. package/Materials/imageProcessingConfiguration.js.map +1 -1
  129. package/Materials/materialPluginBase.js +3 -0
  130. package/Materials/materialPluginBase.js.map +1 -1
  131. package/Materials/meshDebugPluginMaterial.js +2 -2
  132. package/Materials/meshDebugPluginMaterial.js.map +1 -1
  133. package/Materials/shaderMaterial.js +18 -8
  134. package/Materials/shaderMaterial.js.map +1 -1
  135. package/Materials/standardMaterial.d.ts +1 -2
  136. package/Materials/standardMaterial.js +1 -2
  137. package/Materials/standardMaterial.js.map +1 -1
  138. package/Maths/math.color.d.ts +85 -82
  139. package/Maths/math.color.js +34 -27
  140. package/Maths/math.color.js.map +1 -1
  141. package/Maths/math.vector.d.ts +202 -202
  142. package/Maths/math.vector.js +133 -130
  143. package/Maths/math.vector.js.map +1 -1
  144. package/Maths/tensor.d.ts +44 -42
  145. package/Maths/tensor.js.map +1 -1
  146. package/Meshes/Compression/dracoCompression.d.ts +7 -0
  147. package/Meshes/Compression/dracoCompression.js +14 -0
  148. package/Meshes/Compression/dracoCompression.js.map +1 -1
  149. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +6 -0
  150. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
  151. package/Meshes/instancedMesh.js +3 -0
  152. package/Meshes/instancedMesh.js.map +1 -1
  153. package/Misc/dumpTools.js +11 -0
  154. package/Misc/dumpTools.js.map +1 -1
  155. package/Misc/fileTools.d.ts +9 -3
  156. package/Misc/fileTools.js +17 -14
  157. package/Misc/fileTools.js.map +1 -1
  158. package/Misc/greasedLineTools.js +7 -1
  159. package/Misc/greasedLineTools.js.map +1 -1
  160. package/Misc/sceneSerializer.js +9 -1
  161. package/Misc/sceneSerializer.js.map +1 -1
  162. package/Misc/textureTools.d.ts +2 -0
  163. package/Misc/textureTools.js +2 -0
  164. package/Misc/textureTools.js.map +1 -1
  165. package/Misc/tools.d.ts +5 -6
  166. package/Misc/tools.js +9 -9
  167. package/Misc/tools.js.map +1 -1
  168. package/Misc/typeStore.d.ts +4 -0
  169. package/Misc/typeStore.js +11 -0
  170. package/Misc/typeStore.js.map +1 -1
  171. package/NOTICE.md +8 -0
  172. package/Particles/baseParticleSystem.js +3 -0
  173. package/Particles/baseParticleSystem.js.map +1 -1
  174. package/Particles/computeShaderParticleSystem.d.ts +2 -2
  175. package/Particles/computeShaderParticleSystem.js.map +1 -1
  176. package/Physics/v1/Plugins/ammoJSPlugin.js +39 -10
  177. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  178. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +4 -0
  179. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  180. package/PostProcesses/imageProcessingPostProcess.js +14 -5
  181. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  182. package/Rendering/GlobalIllumination/giRSMManager.d.ts +6 -0
  183. package/Rendering/GlobalIllumination/giRSMManager.js +15 -1
  184. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  185. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +22 -20
  186. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  187. package/Rendering/renderingGroup.js +1 -1
  188. package/Rendering/renderingGroup.js.map +1 -1
  189. package/Shaders/ShadersInclude/imageProcessingFunctions.js +8 -5
  190. package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  191. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +8 -0
  192. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  193. package/Shaders/lod.fragment.d.ts +5 -0
  194. package/Shaders/lod.fragment.js +12 -0
  195. package/Shaders/lod.fragment.js.map +1 -0
  196. package/Shaders/lodCube.fragment.d.ts +5 -0
  197. package/Shaders/lodCube.fragment.js +30 -0
  198. package/Shaders/lodCube.fragment.js.map +1 -0
  199. package/Shaders/screenSpaceReflection2.fragment.js +7 -1
  200. package/Shaders/screenSpaceReflection2.fragment.js.map +1 -1
  201. package/Shaders/ssao2.fragment.js +1 -1
  202. package/Shaders/ssao2.fragment.js.map +1 -1
  203. package/XR/features/WebXRNearInteraction.d.ts +6 -0
  204. package/XR/features/WebXRNearInteraction.js +14 -2
  205. package/XR/features/WebXRNearInteraction.js.map +1 -1
  206. package/XR/webXRManagedOutputCanvas.d.ts +2 -0
  207. package/XR/webXRManagedOutputCanvas.js +14 -6
  208. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  209. package/abstractScene.js +3 -0
  210. package/abstractScene.js.map +1 -1
  211. package/assets/glslang/glslang.js +113 -0
  212. package/assets/glslang/glslang.wasm +0 -0
  213. package/assets/twgsl/twgsl.js +53 -0
  214. package/assets/twgsl/twgsl.wasm +0 -0
  215. package/package.json +1 -1
  216. package/scene.js +3 -0
  217. package/scene.js.map +1 -1
  218. package/Engines/Extensions/engine.externalTexture.d.ts +0 -18
  219. package/Engines/Extensions/engine.externalTexture.js +0 -10
  220. package/Engines/Extensions/engine.externalTexture.js.map +0 -1
  221. package/Engines/Extensions/engine.storageBuffer.d.ts +0 -39
  222. package/Engines/Extensions/engine.storageBuffer.js +0 -16
  223. package/Engines/Extensions/engine.storageBuffer.js.map +0 -1
  224. package/Engines/Extensions/engine.textureSampler.d.ts +0 -12
  225. package/Engines/Extensions/engine.textureSampler.js +0 -6
  226. package/Engines/Extensions/engine.textureSampler.js.map +0 -1
  227. package/Engines/WebGPU/Extensions/engine.externalTexture.d.ts +0 -28
  228. package/Engines/WebGPU/Extensions/engine.externalTexture.js +0 -18
  229. package/Engines/WebGPU/Extensions/engine.externalTexture.js.map +0 -1
  230. package/Engines/WebGPU/Extensions/engine.storageBuffer.d.ts +0 -50
  231. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +0 -88
  232. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +0 -1
  233. package/Engines/WebGPU/Extensions/engine.textureSampler.d.ts +0 -22
  234. package/Engines/WebGPU/Extensions/engine.textureSampler.js +0 -9
  235. package/Engines/WebGPU/Extensions/engine.textureSampler.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fluidRenderingTargetRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport type { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { FluidRenderingTextures } from \"./fluidRenderingTextures\";\r\n\r\n/**\r\n * Textures that can be displayed as a debugging tool\r\n */\r\nexport enum FluidRenderingDebug {\r\n DepthTexture,\r\n DepthBlurredTexture,\r\n ThicknessTexture,\r\n ThicknessBlurredTexture,\r\n DiffuseTexture,\r\n Normals,\r\n DiffuseRendering,\r\n}\r\n\r\n/**\r\n * Class used to render an object as a fluid thanks to different render target textures (depth, thickness, diffuse)\r\n */\r\nexport class FluidRenderingTargetRenderer {\r\n protected _scene: Scene;\r\n protected _camera: Nullable<Camera>;\r\n protected _engine: AbstractEngine;\r\n\r\n protected _invProjectionMatrix: Matrix;\r\n protected _depthClearColor: Color4;\r\n protected _thicknessClearColor: Color4;\r\n\r\n protected _needInitialization: boolean;\r\n\r\n /**\r\n * Returns true if the class needs to be reinitialized (because of changes in parameterization)\r\n */\r\n public get needInitialization() {\r\n return this._needInitialization;\r\n }\r\n\r\n private _generateDiffuseTexture = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated and used for the rendering\r\n */\r\n public get generateDiffuseTexture() {\r\n return this._generateDiffuseTexture;\r\n }\r\n\r\n public set generateDiffuseTexture(generate: boolean) {\r\n if (this._generateDiffuseTexture === generate) {\r\n return;\r\n }\r\n\r\n this._generateDiffuseTexture = generate;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Fluid color. Not used if generateDiffuseTexture is true\r\n */\r\n public fluidColor = new Color3(0.085, 0.6375, 0.765);\r\n\r\n /**\r\n * Density of the fluid (positive number). The higher the value, the more opaque the fluid.\r\n */\r\n public density = 2;\r\n\r\n /**\r\n * Strength of the refraction (positive number, but generally between 0 and 0.3).\r\n */\r\n public refractionStrength = 0.1;\r\n\r\n /**\r\n * Strength of the fresnel effect (value between 0 and 1). Lower the value if you want to soften the specular effect\r\n */\r\n public fresnelClamp = 1.0;\r\n\r\n /**\r\n * Strength of the specular power (positive number). Increase the value to make the specular effect more concentrated\r\n */\r\n public specularPower = 250;\r\n\r\n /**\r\n * Minimum thickness of the particles (positive number). If useFixedThickness is true, minimumThickness is the thickness used\r\n */\r\n public minimumThickness = 0;\r\n\r\n /**\r\n * Direction of the light. The fluid is assumed to be lit by a directional light\r\n */\r\n public dirLight: Vector3 = new Vector3(-2, -1, 1).normalize();\r\n\r\n private _debugFeature: FluidRenderingDebug = FluidRenderingDebug.DepthBlurredTexture;\r\n\r\n /**\r\n * Gets or sets the feature (texture) to be debugged. Not used if debug is false\r\n */\r\n public get debugFeature() {\r\n return this._debugFeature;\r\n }\r\n\r\n public set debugFeature(feature: FluidRenderingDebug) {\r\n if (this._debugFeature === feature) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._debugFeature = feature;\r\n }\r\n\r\n private _debug = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if we should display a specific texture (given by debugFeature) for debugging purpose\r\n */\r\n public get debug() {\r\n return this._debug;\r\n }\r\n\r\n public set debug(debug: boolean) {\r\n if (this._debug === debug) {\r\n return;\r\n }\r\n\r\n this._debug = debug;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _environmentMap?: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Gets or sets the environment map used for the reflection part of the shading\r\n * If null, no map will be used. If undefined, the scene.environmentMap will be used (if defined)\r\n */\r\n public get environmentMap() {\r\n return this._environmentMap;\r\n }\r\n\r\n public set environmentMap(map: Nullable<BaseTexture> | undefined) {\r\n if (this._environmentMap === map) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._environmentMap = map;\r\n }\r\n\r\n private _enableBlurDepth = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the depth texture should be blurred\r\n */\r\n public get enableBlurDepth() {\r\n return this._enableBlurDepth;\r\n }\r\n\r\n public set enableBlurDepth(enable: boolean) {\r\n if (this._enableBlurDepth === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurDepth = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the depth size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the depth\r\n * For eg. if blurDepthSizeDivisor=2, the texture used to blur the depth will be half the size of the depth texture\r\n */\r\n public get blurDepthSizeDivisor() {\r\n return this._blurDepthSizeDivisor;\r\n }\r\n\r\n public set blurDepthSizeDivisor(scale: number) {\r\n if (this._blurDepthSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthFilterSize = 7;\r\n\r\n /**\r\n * Size of the kernel used to filter the depth blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthFilterSize() {\r\n return this._blurDepthFilterSize;\r\n }\r\n\r\n public set blurDepthFilterSize(filterSize: number) {\r\n if (this._blurDepthFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthNumIterations = 3;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the depth blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthNumIterations() {\r\n return this._blurDepthNumIterations;\r\n }\r\n\r\n public set blurDepthNumIterations(numIterations: number) {\r\n if (this._blurDepthNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurDepthNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthMaxFilterSize = 100;\r\n\r\n /**\r\n * Maximum size of the kernel used to blur the depth texture (positive number, generally between 1 and 200 - higher values will require more processing power from the GPU when the particles are larger on screen)\r\n */\r\n public get blurDepthMaxFilterSize() {\r\n return this._blurDepthMaxFilterSize;\r\n }\r\n\r\n public set blurDepthMaxFilterSize(maxFilterSize: number) {\r\n if (this._blurDepthMaxFilterSize === maxFilterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthMaxFilterSize = maxFilterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthDepthScale = 10;\r\n\r\n /**\r\n * Depth weight in the calculation when applying the bilateral blur to generate the depth blur texture (positive number, generally between 0 and 100)\r\n */\r\n public get blurDepthDepthScale() {\r\n return this._blurDepthDepthScale;\r\n }\r\n\r\n public set blurDepthDepthScale(scale: number) {\r\n if (this._blurDepthDepthScale === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthDepthScale = scale;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _enableBlurThickness = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the thickness texture should be blurred\r\n */\r\n public get enableBlurThickness() {\r\n return this._enableBlurThickness;\r\n }\r\n\r\n public set enableBlurThickness(enable: boolean) {\r\n if (this._enableBlurThickness === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurThickness = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the thickness size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the thickness\r\n * For eg. if blurThicknessSizeDivisor=2, the texture used to blur the thickness will be half the size of the thickness texture\r\n */\r\n public get blurThicknessSizeDivisor() {\r\n return this._blurThicknessSizeDivisor;\r\n }\r\n\r\n public set blurThicknessSizeDivisor(scale: number) {\r\n if (this._blurThicknessSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurThicknessSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessFilterSize = 5;\r\n\r\n /**\r\n * Size of the kernel used to filter the thickness blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessFilterSize() {\r\n return this._blurThicknessFilterSize;\r\n }\r\n\r\n public set blurThicknessFilterSize(filterSize: number) {\r\n if (this._blurThicknessFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurThicknessFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurThicknessNumIterations = 1;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the thickness blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessNumIterations() {\r\n return this._blurThicknessNumIterations;\r\n }\r\n\r\n public set blurThicknessNumIterations(numIterations: number) {\r\n if (this._blurThicknessNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurThicknessNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _useFixedThickness = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that a fixed thickness should be used instead of generating a thickness texture\r\n */\r\n public get useFixedThickness() {\r\n return this._useFixedThickness;\r\n }\r\n\r\n public set useFixedThickness(use: boolean) {\r\n if (this._useFixedThickness === use) {\r\n return;\r\n }\r\n\r\n this._useFixedThickness = use;\r\n this._needInitialization = true;\r\n }\r\n\r\n /** @internal */\r\n public _bgDepthTexture: Nullable<InternalTexture>;\r\n\r\n /** @internal */\r\n public _onUseVelocityChanged = new Observable<FluidRenderingTargetRenderer>();\r\n\r\n private _useVelocity = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the velocity should be used when rendering the particles as a fluid.\r\n * Note: the vertex buffers must contain a \"velocity\" buffer for this to work!\r\n */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._needInitialization = true;\r\n this._onUseVelocityChanged.notifyObservers(this);\r\n }\r\n\r\n private _depthMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the depth texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get depthMapSize() {\r\n return this._depthMapSize;\r\n }\r\n\r\n public set depthMapSize(size: Nullable<number>) {\r\n if (this._depthMapSize === size) {\r\n return;\r\n }\r\n\r\n this._depthMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _thicknessMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the thickness texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get thicknessMapSize() {\r\n return this._thicknessMapSize;\r\n }\r\n\r\n public set thicknessMapSize(size: Nullable<number>) {\r\n if (this._thicknessMapSize === size) {\r\n return;\r\n }\r\n\r\n this._thicknessMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _diffuseMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the diffuse texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get diffuseMapSize() {\r\n return this._diffuseMapSize;\r\n }\r\n\r\n public set diffuseMapSize(size: Nullable<number>) {\r\n if (this._diffuseMapSize === size) {\r\n return;\r\n }\r\n\r\n this._diffuseMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _samples = 1;\r\n\r\n /**\r\n * Gets or sets the number of samples used by MSAA\r\n * Note: changing this value in WebGL does not work because depth/stencil textures can't be created with MSAA (see https://github.com/BabylonJS/Babylon.js/issues/12444)\r\n */\r\n public get samples() {\r\n return this._samples;\r\n }\r\n\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Gets the camera used for the rendering\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n /** @internal */\r\n public _renderPostProcess: Nullable<PostProcess>;\r\n\r\n /** @internal */\r\n public _depthRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _diffuseRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _thicknessRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /**\r\n * Creates an instance of the class\r\n * @param scene Scene used to render the fluid object into\r\n * @param camera Camera used to render the fluid object. If not provided, use the active camera of the scene instead\r\n */\r\n constructor(scene: Scene, camera?: Camera) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._camera = camera ?? scene.activeCamera;\r\n this._needInitialization = true;\r\n this._bgDepthTexture = null;\r\n\r\n this._invProjectionMatrix = new Matrix();\r\n this._depthClearColor = new Color4(1e6, 1e6, 1e6, 1);\r\n this._thicknessClearColor = new Color4(0, 0, 0, 1);\r\n\r\n this._depthRenderTarget = null;\r\n this._diffuseRenderTarget = null;\r\n this._thicknessRenderTarget = null;\r\n\r\n this._renderPostProcess = null;\r\n }\r\n\r\n /** @internal */\r\n public _initialize(): void {\r\n this.dispose();\r\n\r\n this._needInitialization = false;\r\n\r\n const depthWidth = this._depthMapSize ?? this._engine.getRenderWidth();\r\n const depthHeight =\r\n this._depthMapSize !== null ? Math.round((this._depthMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth()) : this._engine.getRenderHeight();\r\n\r\n this._depthRenderTarget = new FluidRenderingTextures(\r\n \"Depth\",\r\n this._scene,\r\n depthWidth,\r\n depthHeight,\r\n depthWidth,\r\n depthHeight,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n false,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._depthRenderTarget);\r\n\r\n if (this.generateDiffuseTexture) {\r\n const diffuseWidth = this._diffuseMapSize ?? this._engine.getRenderWidth();\r\n const diffuseHeight =\r\n this._diffuseMapSize !== null\r\n ? Math.round((this._diffuseMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n this._diffuseRenderTarget = new FluidRenderingTextures(\r\n \"Diffuse\",\r\n this._scene,\r\n diffuseWidth,\r\n diffuseHeight,\r\n 0,\r\n 0,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n true,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._diffuseRenderTarget);\r\n }\r\n\r\n const thicknessWidth = this._thicknessMapSize ?? this._engine.getRenderWidth();\r\n const thicknessHeight =\r\n this._thicknessMapSize !== null\r\n ? Math.round((this._thicknessMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n if (!this._useFixedThickness) {\r\n this._thicknessRenderTarget = new FluidRenderingTextures(\r\n \"Thickness\",\r\n this._scene,\r\n thicknessWidth,\r\n thicknessHeight,\r\n thicknessWidth,\r\n thicknessHeight,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n true,\r\n this._camera,\r\n false,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._thicknessRenderTarget);\r\n }\r\n\r\n this._createLiquidRenderingPostProcess();\r\n }\r\n\r\n protected _setBlurParameters(renderTarget: Nullable<FluidRenderingTextures> = null): void {\r\n if (renderTarget === null || renderTarget === this._depthRenderTarget) {\r\n this._setBlurDepthParameters();\r\n }\r\n if (renderTarget === null || renderTarget === this._thicknessRenderTarget) {\r\n this._setBlurThicknessParameters();\r\n }\r\n }\r\n\r\n protected _setBlurDepthParameters(): void {\r\n if (!this._depthRenderTarget) {\r\n return;\r\n }\r\n this._depthRenderTarget.blurFilterSize = this.blurDepthFilterSize;\r\n this._depthRenderTarget.blurMaxFilterSize = this.blurDepthMaxFilterSize;\r\n this._depthRenderTarget.blurNumIterations = this.blurDepthNumIterations;\r\n this._depthRenderTarget.blurDepthScale = this.blurDepthDepthScale;\r\n }\r\n\r\n protected _setBlurThicknessParameters(): void {\r\n if (!this._thicknessRenderTarget) {\r\n return;\r\n }\r\n this._thicknessRenderTarget.blurFilterSize = this.blurThicknessFilterSize;\r\n this._thicknessRenderTarget.blurNumIterations = this.blurThicknessNumIterations;\r\n }\r\n\r\n protected _initializeRenderTarget(renderTarget: FluidRenderingTextures): void {\r\n if (renderTarget !== this._diffuseRenderTarget) {\r\n renderTarget.enableBlur = renderTarget === this._depthRenderTarget ? this.enableBlurDepth : this.enableBlurThickness;\r\n renderTarget.blurSizeDivisor = renderTarget === this._depthRenderTarget ? this.blurDepthSizeDivisor : this.blurThicknessSizeDivisor;\r\n }\r\n\r\n this._setBlurParameters(renderTarget);\r\n\r\n renderTarget.initialize();\r\n }\r\n\r\n protected _createLiquidRenderingPostProcess(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n const uniformNames = [\r\n \"viewMatrix\",\r\n \"projectionMatrix\",\r\n \"invProjectionMatrix\",\r\n \"texelSize\",\r\n \"dirLight\",\r\n \"cameraFar\",\r\n \"density\",\r\n \"refractionStrength\",\r\n \"fresnelClamp\",\r\n \"specularPower\",\r\n ];\r\n const samplerNames = [\"depthSampler\"];\r\n const defines = [];\r\n\r\n this.dispose(true);\r\n\r\n if (!this._camera) {\r\n return;\r\n }\r\n\r\n const texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur! : this._depthRenderTarget!.texture!;\r\n const texelSize = new Vector2(1 / texture.getSize().width, 1 / texture.getSize().height);\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n samplerNames.push(\"reflectionSampler\");\r\n defines.push(\"#define FLUIDRENDERING_ENVIRONMENT\");\r\n }\r\n }\r\n\r\n if (this._diffuseRenderTarget) {\r\n samplerNames.push(\"diffuseSampler\");\r\n defines.push(\"#define FLUIDRENDERING_DIFFUSETEXTURE\");\r\n } else {\r\n uniformNames.push(\"diffuseColor\");\r\n }\r\n\r\n if (this._useVelocity) {\r\n samplerNames.push(\"velocitySampler\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._useFixedThickness) {\r\n uniformNames.push(\"thickness\");\r\n samplerNames.push(\"bgDepthSampler\");\r\n defines.push(\"#define FLUIDRENDERING_FIXED_THICKNESS\");\r\n } else {\r\n uniformNames.push(\"minimumThickness\");\r\n samplerNames.push(\"thicknessSampler\");\r\n }\r\n\r\n if (this._debug) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG\");\r\n if (this._debugFeature === FluidRenderingDebug.Normals) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_SHOWNORMAL\");\r\n } else if (this._debugFeature === FluidRenderingDebug.DiffuseRendering) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DIFFUSERENDERING\");\r\n } else {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_TEXTURE\");\r\n samplerNames.push(\"debugSampler\");\r\n if (this._debugFeature === FluidRenderingDebug.DepthTexture || this._debugFeature === FluidRenderingDebug.DepthBlurredTexture) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DEPTH\");\r\n }\r\n }\r\n }\r\n\r\n this._renderPostProcess = new PostProcess(\r\n \"FluidRendering\",\r\n \"fluidRenderingRender\",\r\n uniformNames,\r\n samplerNames,\r\n 1,\r\n null,\r\n Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n null,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n undefined,\r\n undefined,\r\n true,\r\n undefined\r\n );\r\n this._renderPostProcess.updateEffect(defines.join(\"\\n\"));\r\n\r\n this._renderPostProcess.samples = this._samples;\r\n this._renderPostProcess.onApplyObservable.add((effect) => {\r\n this._invProjectionMatrix.copyFrom(this._scene.getProjectionMatrix());\r\n this._invProjectionMatrix.invert();\r\n\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"textureSamplerSampler\", this._renderPostProcess!.inputTexture.texture);\r\n }\r\n\r\n if (!this._depthRenderTarget!.enableBlur) {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.texture);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"depthSamplerSampler\", this._depthRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.textureBlur);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"depthSamplerSampler\", this._depthRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n if (this._diffuseRenderTarget) {\r\n if (!this._diffuseRenderTarget.enableBlur) {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.texture);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"diffuseSamplerSampler\", this._diffuseRenderTarget.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.textureBlur);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"diffuseSamplerSampler\", this._diffuseRenderTarget.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n } else {\r\n effect.setColor3(\"diffuseColor\", this.fluidColor);\r\n }\r\n if (this._useFixedThickness) {\r\n effect.setFloat(\"thickness\", this.minimumThickness);\r\n effect._bindTexture(\"bgDepthSampler\", this._bgDepthTexture);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"bgDepthSamplerSampler\", this._bgDepthTexture ?? null);\r\n }\r\n } else {\r\n if (!this._thicknessRenderTarget!.enableBlur) {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.texture);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"thicknessSamplerSampler\", this._thicknessRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.textureBlur);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"thicknessSamplerSampler\", this._thicknessRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n effect.setFloat(\"minimumThickness\", this.minimumThickness);\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n effect.setTexture(\"reflectionSampler\", envMap);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"reflectionSamplerSampler\", envMap?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n\r\n effect.setMatrix(\"viewMatrix\", this._scene.getViewMatrix());\r\n effect.setMatrix(\"invProjectionMatrix\", this._invProjectionMatrix);\r\n effect.setMatrix(\"projectionMatrix\", this._scene.getProjectionMatrix());\r\n effect.setVector2(\"texelSize\", texelSize);\r\n effect.setFloat(\"density\", this.density);\r\n effect.setFloat(\"refractionStrength\", this.refractionStrength);\r\n effect.setFloat(\"fresnelClamp\", this.fresnelClamp);\r\n effect.setFloat(\"specularPower\", this.specularPower);\r\n\r\n effect.setVector3(\"dirLight\", this.dirLight);\r\n\r\n effect.setFloat(\"cameraFar\", this._camera!.maxZ);\r\n\r\n if (this._debug) {\r\n let texture: Nullable<ThinTexture> = null;\r\n switch (this._debugFeature) {\r\n case FluidRenderingDebug.DepthTexture:\r\n texture = this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.DepthBlurredTexture:\r\n texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur : this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.ThicknessTexture:\r\n texture = this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.ThicknessBlurredTexture:\r\n texture = this._thicknessRenderTarget?.enableBlur ? this._thicknessRenderTarget?.textureBlur ?? null : this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.DiffuseTexture:\r\n if (this._diffuseRenderTarget) {\r\n texture = this._diffuseRenderTarget.texture;\r\n }\r\n break;\r\n }\r\n if (this._debugFeature !== FluidRenderingDebug.Normals) {\r\n effect.setTexture(\"debugSampler\", texture);\r\n if (engine.isWebGPU) {\r\n effect.setTextureSampler(\"debugSamplerSampler\", texture?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _clearTargets(): void {\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n this._engine.clear(this._depthClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n this._engine.clear(this._thicknessClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n // we don't clear the depth buffer because it is the depth buffer that is coming from the scene and that we reuse in the thickness rendering pass\r\n this._engine.clear(this._thicknessClearColor, true, false, false);\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _render(fluidObject: FluidRenderingObject): void {\r\n if (this._needInitialization || !fluidObject.isReady()) {\r\n return;\r\n }\r\n\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n\r\n this._engine.setState(false, undefined, undefined, undefined, true);\r\n this._engine.setDepthBuffer(true);\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n // Render the particles in the depth texture\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDepthTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the diffuse texture\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDiffuseTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the thickness texture\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n\r\n fluidObject.renderThicknessTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n\r\n // Run the blur post processes\r\n this._depthRenderTarget?.applyBlurPostProcesses();\r\n this._diffuseRenderTarget?.applyBlurPostProcesses();\r\n this._thicknessRenderTarget?.applyBlurPostProcesses();\r\n\r\n if (currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Releases all the ressources used by the class\r\n * @param onlyPostProcesses If true, releases only the ressources used by the render post processes\r\n */\r\n public dispose(onlyPostProcesses = false): void {\r\n if (!onlyPostProcesses) {\r\n this._depthRenderTarget?.dispose();\r\n this._depthRenderTarget = null;\r\n\r\n this._diffuseRenderTarget?.dispose();\r\n this._diffuseRenderTarget = null;\r\n\r\n this._thicknessRenderTarget?.dispose();\r\n this._thicknessRenderTarget = null;\r\n }\r\n\r\n if (this._renderPostProcess && this._camera) {\r\n this._camera.detachPostProcess(this._renderPostProcess);\r\n }\r\n this._renderPostProcess?.dispose();\r\n this._renderPostProcess = null;\r\n\r\n this._needInitialization = false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"fluidRenderingTargetRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,mCAA+B;AAKnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kCAA8B;AACvD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,mCAA+B;AAClE,OAAO,EAAE,UAAU,EAAE,iCAA6B;AAClD,OAAO,EAAE,WAAW,EAAE,2CAAuC;AAK7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;GAEG;AACH,MAAM,CAAN,IAAY,mBAQX;AARD,WAAY,mBAAmB;IAC3B,6EAAY,CAAA;IACZ,2FAAmB,CAAA;IACnB,qFAAgB,CAAA;IAChB,mGAAuB,CAAA;IACvB,iFAAc,CAAA;IACd,mEAAO,CAAA;IACP,qFAAgB,CAAA;AACpB,CAAC,EARW,mBAAmB,KAAnB,mBAAmB,QAQ9B;AAED;;GAEG;AACH,MAAM,OAAO,4BAA4B;IAWrC;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAID;;OAEG;IACH,IAAW,sBAAsB;QAC7B,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IAED,IAAW,sBAAsB,CAAC,QAAiB;QAC/C,IAAI,IAAI,CAAC,uBAAuB,KAAK,QAAQ,EAAE;YAC3C,OAAO;SACV;QAED,IAAI,CAAC,uBAAuB,GAAG,QAAQ,CAAC;QACxC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAuCD;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAW,YAAY,CAAC,OAA4B;QAChD,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE;YAChC,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IACjC,CAAC;IAID;;OAEG;IACH,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK,CAAC,KAAc;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YACvB,OAAO;SACV;QAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;;OAGG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAW,cAAc,CAAC,GAAsC;QAC5D,IAAI,IAAI,CAAC,eAAe,KAAK,GAAG,EAAE;YAC9B,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;IAC/B,CAAC;IAID;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED,IAAW,eAAe,CAAC,MAAe;QACtC,IAAI,IAAI,CAAC,gBAAgB,KAAK,MAAM,EAAE;YAClC,OAAO;SACV;QAED,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;;OAGG;IACH,IAAW,oBAAoB;QAC3B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACtC,CAAC;IAED,IAAW,oBAAoB,CAAC,KAAa;QACzC,IAAI,IAAI,CAAC,qBAAqB,KAAK,KAAK,EAAE;YACtC,OAAO;SACV;QAED,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,IAAW,mBAAmB,CAAC,UAAkB;QAC7C,IAAI,IAAI,CAAC,oBAAoB,KAAK,UAAU,EAAE;YAC1C,OAAO;SACV;QAED,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC;QACvC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAID;;OAEG;IACH,IAAW,sBAAsB;QAC7B,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IAED,IAAW,sBAAsB,CAAC,aAAqB;QACnD,IAAI,IAAI,CAAC,uBAAuB,KAAK,aAAa,EAAE;YAChD,OAAO;SACV;QAED,IAAI,CAAC,uBAAuB,GAAG,aAAa,CAAC;QAC7C,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAID;;OAEG;IACH,IAAW,sBAAsB;QAC7B,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IAED,IAAW,sBAAsB,CAAC,aAAqB;QACnD,IAAI,IAAI,CAAC,uBAAuB,KAAK,aAAa,EAAE;YAChD,OAAO;SACV;QAED,IAAI,CAAC,uBAAuB,GAAG,aAAa,CAAC;QAC7C,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAID;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,IAAW,mBAAmB,CAAC,KAAa;QACxC,IAAI,IAAI,CAAC,oBAAoB,KAAK,KAAK,EAAE;YACrC,OAAO;SACV;QAED,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAID;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,IAAW,mBAAmB,CAAC,MAAe;QAC1C,IAAI,IAAI,CAAC,oBAAoB,KAAK,MAAM,EAAE;YACtC,OAAO;SACV;QAED,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;QACnC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;;OAGG;IACH,IAAW,wBAAwB;QAC/B,OAAO,IAAI,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IAED,IAAW,wBAAwB,CAAC,KAAa;QAC7C,IAAI,IAAI,CAAC,yBAAyB,KAAK,KAAK,EAAE;YAC1C,OAAO;SACV;QAED,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;OAEG;IACH,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED,IAAW,uBAAuB,CAAC,UAAkB;QACjD,IAAI,IAAI,CAAC,wBAAwB,KAAK,UAAU,EAAE;YAC9C,OAAO;SACV;QAED,IAAI,CAAC,wBAAwB,GAAG,UAAU,CAAC;QAC3C,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAID;;OAEG;IACH,IAAW,0BAA0B;QACjC,OAAO,IAAI,CAAC,2BAA2B,CAAC;IAC5C,CAAC;IAED,IAAW,0BAA0B,CAAC,aAAqB;QACvD,IAAI,IAAI,CAAC,2BAA2B,KAAK,aAAa,EAAE;YACpD,OAAO;SACV;QAED,IAAI,CAAC,2BAA2B,GAAG,aAAa,CAAC;QACjD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAID;;OAEG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,GAAY;QACrC,IAAI,IAAI,CAAC,kBAAkB,KAAK,GAAG,EAAE;YACjC,OAAO;SACV;QAED,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;QAC9B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAUD;;;OAGG;IACH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAW,WAAW,CAAC,GAAY;QAC/B,IAAI,IAAI,CAAC,YAAY,KAAK,GAAG,EAAE;YAC3B,OAAO;SACV;QAED,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;QACxB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAID;;;OAGG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAW,YAAY,CAAC,IAAsB;QAC1C,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC7B,OAAO;SACV;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;;OAGG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,IAAW,gBAAgB,CAAC,IAAsB;QAC9C,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE;YACjC,OAAO;SACV;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;;OAGG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAW,cAAc,CAAC,IAAsB;QAC5C,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAID;;;OAGG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAW,OAAO,CAAC,OAAe;QAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE;YAC3B,OAAO;SACV;QAED,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAcD;;;;OAIG;IACH,YAAY,KAAY,EAAE,MAAe;QAlbjC,4BAAuB,GAAG,KAAK,CAAC;QAkBxC;;WAEG;QACI,eAAU,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAErD;;WAEG;QACI,YAAO,GAAG,CAAC,CAAC;QAEnB;;WAEG;QACI,uBAAkB,GAAG,GAAG,CAAC;QAEhC;;WAEG;QACI,iBAAY,GAAG,GAAG,CAAC;QAE1B;;WAEG;QACI,kBAAa,GAAG,GAAG,CAAC;QAE3B;;WAEG;QACI,qBAAgB,GAAG,CAAC,CAAC;QAE5B;;WAEG;QACI,aAAQ,GAAY,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAEtD,kBAAa,GAAwB,mBAAmB,CAAC,mBAAmB,CAAC;QAkB7E,WAAM,GAAG,KAAK,CAAC;QAqCf,qBAAgB,GAAG,IAAI,CAAC;QAkBxB,0BAAqB,GAAG,CAAC,CAAC;QAmB1B,yBAAoB,GAAG,CAAC,CAAC;QAkBzB,4BAAuB,GAAG,CAAC,CAAC;QAkB5B,4BAAuB,GAAG,GAAG,CAAC;QAkB9B,yBAAoB,GAAG,EAAE,CAAC;QAkB1B,yBAAoB,GAAG,IAAI,CAAC;QAkB5B,8BAAyB,GAAG,CAAC,CAAC;QAmB9B,6BAAwB,GAAG,CAAC,CAAC;QAkB7B,gCAA2B,GAAG,CAAC,CAAC;QAkBhC,uBAAkB,GAAG,KAAK,CAAC;QAqBnC,gBAAgB;QACT,0BAAqB,GAAG,IAAI,UAAU,EAAgC,CAAC;QAEtE,iBAAY,GAAG,KAAK,CAAC;QAoBrB,kBAAa,GAAqB,IAAI,CAAC;QAmBvC,sBAAiB,GAAqB,IAAI,CAAC;QAmB3C,oBAAe,GAAqB,IAAI,CAAC;QAmBzC,aAAQ,GAAG,CAAC,CAAC;QA4CjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC;QAC5C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC,oBAAoB,GAAG,IAAI,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,oBAAoB,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAEnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,gBAAgB;IACT,WAAW;QACd,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACvE,MAAM,WAAW,GACb,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAErK,IAAI,CAAC,kBAAkB,GAAG,IAAI,sBAAsB,CAChD,OAAO,EACP,IAAI,CAAC,MAAM,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,CAAC,iBAAiB,EAC3B,SAAS,CAAC,gBAAgB,EAC1B,SAAS,CAAC,iBAAiB,EAC3B,SAAS,CAAC,gBAAgB,EAC1B,KAAK,EACL,IAAI,CAAC,OAAO,EACZ,IAAI,EACJ,IAAI,CAAC,QAAQ,CAChB,CAAC;QAEF,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEtD,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3E,MAAM,aAAa,GACf,IAAI,CAAC,eAAe,KAAK,IAAI;gBACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBACrG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAEzC,IAAI,CAAC,oBAAoB,GAAG,IAAI,sBAAsB,CAClD,SAAS,EACT,IAAI,CAAC,MAAM,EACX,YAAY,EACZ,aAAa,EACb,CAAC,EACD,CAAC,EACD,SAAS,CAAC,yBAAyB,EACnC,SAAS,CAAC,kBAAkB,EAC5B,SAAS,CAAC,yBAAyB,EACnC,SAAS,CAAC,kBAAkB,EAC5B,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,IAAI,EACJ,IAAI,CAAC,QAAQ,CAChB,CAAC;YAEF,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;SAC3D;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC/E,MAAM,eAAe,GACjB,IAAI,CAAC,iBAAiB,KAAK,IAAI;YAC3B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YACvG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAEzC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC1B,IAAI,CAAC,sBAAsB,GAAG,IAAI,sBAAsB,CACpD,WAAW,EACX,IAAI,CAAC,MAAM,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,SAAS,CAAC,sBAAsB,EAChC,SAAS,CAAC,eAAe,EACzB,SAAS,CAAC,sBAAsB,EAChC,SAAS,CAAC,eAAe,EACzB,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,KAAK,EACL,IAAI,CAAC,QAAQ,CAChB,CAAC;YAEF,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;SAC7D;QAED,IAAI,CAAC,iCAAiC,EAAE,CAAC;IAC7C,CAAC;IAES,kBAAkB,CAAC,eAAiD,IAAI;QAC9E,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,CAAC,kBAAkB,EAAE;YACnE,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAClC;QACD,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,CAAC,sBAAsB,EAAE;YACvE,IAAI,CAAC,2BAA2B,EAAE,CAAC;SACtC;IACL,CAAC;IAES,uBAAuB;QAC7B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC1B,OAAO;SACV;QACD,IAAI,CAAC,kBAAkB,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAClE,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACxE,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACxE,IAAI,CAAC,kBAAkB,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC;IACtE,CAAC;IAES,2BAA2B;QACjC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC9B,OAAO;SACV;QACD,IAAI,CAAC,sBAAsB,CAAC,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC;QAC1E,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,CAAC;IACpF,CAAC;IAES,uBAAuB,CAAC,YAAoC;QAClE,IAAI,YAAY,KAAK,IAAI,CAAC,oBAAoB,EAAE;YAC5C,YAAY,CAAC,UAAU,GAAG,YAAY,KAAK,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;YACrH,YAAY,CAAC,eAAe,GAAG,YAAY,KAAK,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC;SACvI;QAED,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAEtC,YAAY,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;IAES,iCAAiC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAEvC,MAAM,YAAY,GAAG;YACjB,YAAY;YACZ,kBAAkB;YAClB,qBAAqB;YACrB,WAAW;YACX,UAAU;YACV,WAAW;YACX,SAAS;YACT,oBAAoB;YACpB,cAAc;YACd,eAAe;SAClB,CAAC;QACF,MAAM,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,EAAE,CAAC;QAEnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,OAAO;SACV;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAmB,CAAC,WAAY,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAmB,CAAC,OAAQ,CAAC;QAChI,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAEzF,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE;YAClC,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;SAC9C;QAED,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YACtE,IAAI,MAAM,EAAE;gBACR,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;aACtD;SACJ;QAED,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC3B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;SACzD;aAAM;YACH,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACrC;QAED,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;SACnD;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;SAC1D;aAAM;YACH,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SACzC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,aAAa,KAAK,mBAAmB,CAAC,OAAO,EAAE;gBACpD,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;aAC3D;iBAAM,IAAI,IAAI,CAAC,aAAa,KAAK,mBAAmB,CAAC,gBAAgB,EAAE;gBACpE,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;aACjE;iBAAM;gBACH,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBACrD,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAClC,IAAI,IAAI,CAAC,aAAa,KAAK,mBAAmB,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,mBAAmB,CAAC,mBAAmB,EAAE;oBAC3H,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;iBACtD;aACJ;SACJ;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,WAAW,CACrC,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,CAAC,EACD,IAAI,EACJ,SAAS,CAAC,6BAA6B,EACvC,MAAM,EACN,KAAK,EACL,IAAI,EACJ,SAAS,CAAC,yBAAyB,EACnC,SAAS,EACT,SAAS,EACT,IAAI,EACJ,SAAS,CACZ,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAChD,MAAM,YAAY,GAAG,MAAsB,CAAC;QAC5C,MAAM,iBAAiB,GAAG,YAAY,CAAC,iBAAiB,CAAC;QACzD,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACrD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;YAEnC,IAAI,iBAAiB,EAAE;gBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,EAAE,IAAI,CAAC,kBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;aAChH;YAED,IAAI,CAAC,IAAI,CAAC,kBAAmB,CAAC,UAAU,EAAE;gBACtC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAmB,CAAC,OAAO,CAAC,CAAC;gBACpE,IAAI,iBAAiB,EAAE;oBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,qBAAqB,EAAE,IAAI,CAAC,kBAAmB,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;iBAC/H;aACJ;iBAAM;gBACH,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAmB,CAAC,WAAW,CAAC,CAAC;gBACxE,IAAI,iBAAiB,EAAE;oBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,qBAAqB,EAAE,IAAI,CAAC,kBAAmB,CAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;iBACnI;aACJ;YACD,IAAI,IAAI,CAAC,oBAAoB,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;oBACvC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;oBACvE,IAAI,iBAAiB,EAAE;wBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;qBAClI;iBACJ;qBAAM;oBACH,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;oBAC3E,IAAI,iBAAiB,EAAE;wBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,EAAE,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;qBACtI;iBACJ;aACJ;iBAAM;gBACH,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;aACrD;YACD,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACpD,MAAM,CAAC,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC5D,IAAI,iBAAiB,EAAE;oBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;iBAC/F;aACJ;iBAAM;gBACH,IAAI,CAAC,IAAI,CAAC,sBAAuB,CAAC,UAAU,EAAE;oBAC1C,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,sBAAuB,CAAC,OAAO,CAAC,CAAC;oBAC5E,IAAI,iBAAiB,EAAE;wBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,yBAAyB,EAAE,IAAI,CAAC,sBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;qBACvI;iBACJ;qBAAM;oBACH,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,sBAAuB,CAAC,WAAW,CAAC,CAAC;oBAChF,IAAI,iBAAiB,EAAE;wBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,yBAAyB,EAAE,IAAI,CAAC,sBAAuB,CAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;qBAC3I;iBACJ;gBACD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;aAC9D;YAED,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;gBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBACtE,IAAI,MAAM,EAAE;oBACR,MAAM,CAAC,UAAU,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;oBAC/C,IAAI,iBAAiB,EAAE;wBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,0BAA0B,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;qBAC1G;iBACJ;aACJ;YAED,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnE,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;YACxE,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAErD,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7C,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,OAAQ,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,OAAO,GAA0B,IAAI,CAAC;gBAC1C,QAAQ,IAAI,CAAC,aAAa,EAAE;oBACxB,KAAK,mBAAmB,CAAC,YAAY;wBACjC,OAAO,GAAG,IAAI,CAAC,kBAAmB,CAAC,OAAO,CAAC;wBAC3C,MAAM;oBACV,KAAK,mBAAmB,CAAC,mBAAmB;wBACxC,OAAO,GAAG,IAAI,CAAC,kBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAmB,CAAC,OAAO,CAAC;wBACxH,MAAM;oBACV,KAAK,mBAAmB,CAAC,gBAAgB;wBACrC,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE,OAAO,IAAI,IAAI,CAAC;wBACvD,MAAM;oBACV,KAAK,mBAAmB,CAAC,uBAAuB;wBAC5C,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,IAAI,IAAI,CAAC;wBACpJ,MAAM;oBACV,KAAK,mBAAmB,CAAC,cAAc;wBACnC,IAAI,IAAI,CAAC,oBAAoB,EAAE;4BAC3B,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;yBAC/C;wBACD,MAAM;iBACb;gBACD,IAAI,IAAI,CAAC,aAAa,KAAK,mBAAmB,CAAC,OAAO,EAAE;oBACpD,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;oBAC3C,IAAI,iBAAiB,EAAE;wBACnB,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,qBAAqB,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,IAAI,CAAC,CAAC;qBACtG;iBACJ;aACJ;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB;IACT,aAAa;QAChB,IAAI,IAAI,CAAC,kBAAkB,EAAE,YAAY,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;SACxE;QAED,IAAI,IAAI,CAAC,oBAAoB,EAAE,YAAY,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;SAC1E;QAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,YAAY,EAAE;YAC3C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;YACvE,iJAAiJ;YACjJ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;SAC5E;IACL,CAAC;IAED,gBAAgB;IACT,OAAO,CAAC,WAAiC;QAC5C,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE;YACpD,OAAO;SACV;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAE9D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAEnD,4CAA4C;QAC5C,IAAI,IAAI,CAAC,kBAAkB,EAAE,YAAY,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAEnE,WAAW,CAAC,kBAAkB,EAAE,CAAC;YAEjC,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;SACxE;QAED,8CAA8C;QAC9C,IAAI,IAAI,CAAC,oBAAoB,EAAE,YAAY,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAErE,WAAW,CAAC,oBAAoB,EAAE,CAAC;YAEnC,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;SAC1E;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,sBAAsB,EAAE,YAAY,EAAE;YAC3C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAEvE,WAAW,CAAC,sBAAsB,EAAE,CAAC;YAErC,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;SAC5E;QAED,8BAA8B;QAC9B,IAAI,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,CAAC;QAClD,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;QACpD,IAAI,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,CAAC;QAEtD,IAAI,mBAAmB,EAAE;YACrB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;SACrD;IACL,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,iBAAiB,GAAG,KAAK;QACpC,IAAI,CAAC,iBAAiB,EAAE;YACpB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAE/B,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAEjC,IAAI,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;SACtC;QAED,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SAC3D;QACD,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAE/B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACrC,CAAC;CACJ","sourcesContent":["import type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport type { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { FluidRenderingTextures } from \"./fluidRenderingTextures\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\n\r\n/**\r\n * Textures that can be displayed as a debugging tool\r\n */\r\nexport enum FluidRenderingDebug {\r\n DepthTexture,\r\n DepthBlurredTexture,\r\n ThicknessTexture,\r\n ThicknessBlurredTexture,\r\n DiffuseTexture,\r\n Normals,\r\n DiffuseRendering,\r\n}\r\n\r\n/**\r\n * Class used to render an object as a fluid thanks to different render target textures (depth, thickness, diffuse)\r\n */\r\nexport class FluidRenderingTargetRenderer {\r\n protected _scene: Scene;\r\n protected _camera: Nullable<Camera>;\r\n protected _engine: AbstractEngine;\r\n\r\n protected _invProjectionMatrix: Matrix;\r\n protected _depthClearColor: Color4;\r\n protected _thicknessClearColor: Color4;\r\n\r\n protected _needInitialization: boolean;\r\n\r\n /**\r\n * Returns true if the class needs to be reinitialized (because of changes in parameterization)\r\n */\r\n public get needInitialization() {\r\n return this._needInitialization;\r\n }\r\n\r\n private _generateDiffuseTexture = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated and used for the rendering\r\n */\r\n public get generateDiffuseTexture() {\r\n return this._generateDiffuseTexture;\r\n }\r\n\r\n public set generateDiffuseTexture(generate: boolean) {\r\n if (this._generateDiffuseTexture === generate) {\r\n return;\r\n }\r\n\r\n this._generateDiffuseTexture = generate;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Fluid color. Not used if generateDiffuseTexture is true\r\n */\r\n public fluidColor = new Color3(0.085, 0.6375, 0.765);\r\n\r\n /**\r\n * Density of the fluid (positive number). The higher the value, the more opaque the fluid.\r\n */\r\n public density = 2;\r\n\r\n /**\r\n * Strength of the refraction (positive number, but generally between 0 and 0.3).\r\n */\r\n public refractionStrength = 0.1;\r\n\r\n /**\r\n * Strength of the fresnel effect (value between 0 and 1). Lower the value if you want to soften the specular effect\r\n */\r\n public fresnelClamp = 1.0;\r\n\r\n /**\r\n * Strength of the specular power (positive number). Increase the value to make the specular effect more concentrated\r\n */\r\n public specularPower = 250;\r\n\r\n /**\r\n * Minimum thickness of the particles (positive number). If useFixedThickness is true, minimumThickness is the thickness used\r\n */\r\n public minimumThickness = 0;\r\n\r\n /**\r\n * Direction of the light. The fluid is assumed to be lit by a directional light\r\n */\r\n public dirLight: Vector3 = new Vector3(-2, -1, 1).normalize();\r\n\r\n private _debugFeature: FluidRenderingDebug = FluidRenderingDebug.DepthBlurredTexture;\r\n\r\n /**\r\n * Gets or sets the feature (texture) to be debugged. Not used if debug is false\r\n */\r\n public get debugFeature() {\r\n return this._debugFeature;\r\n }\r\n\r\n public set debugFeature(feature: FluidRenderingDebug) {\r\n if (this._debugFeature === feature) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._debugFeature = feature;\r\n }\r\n\r\n private _debug = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if we should display a specific texture (given by debugFeature) for debugging purpose\r\n */\r\n public get debug() {\r\n return this._debug;\r\n }\r\n\r\n public set debug(debug: boolean) {\r\n if (this._debug === debug) {\r\n return;\r\n }\r\n\r\n this._debug = debug;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _environmentMap?: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Gets or sets the environment map used for the reflection part of the shading\r\n * If null, no map will be used. If undefined, the scene.environmentMap will be used (if defined)\r\n */\r\n public get environmentMap() {\r\n return this._environmentMap;\r\n }\r\n\r\n public set environmentMap(map: Nullable<BaseTexture> | undefined) {\r\n if (this._environmentMap === map) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._environmentMap = map;\r\n }\r\n\r\n private _enableBlurDepth = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the depth texture should be blurred\r\n */\r\n public get enableBlurDepth() {\r\n return this._enableBlurDepth;\r\n }\r\n\r\n public set enableBlurDepth(enable: boolean) {\r\n if (this._enableBlurDepth === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurDepth = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the depth size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the depth\r\n * For eg. if blurDepthSizeDivisor=2, the texture used to blur the depth will be half the size of the depth texture\r\n */\r\n public get blurDepthSizeDivisor() {\r\n return this._blurDepthSizeDivisor;\r\n }\r\n\r\n public set blurDepthSizeDivisor(scale: number) {\r\n if (this._blurDepthSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthFilterSize = 7;\r\n\r\n /**\r\n * Size of the kernel used to filter the depth blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthFilterSize() {\r\n return this._blurDepthFilterSize;\r\n }\r\n\r\n public set blurDepthFilterSize(filterSize: number) {\r\n if (this._blurDepthFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthNumIterations = 3;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the depth blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthNumIterations() {\r\n return this._blurDepthNumIterations;\r\n }\r\n\r\n public set blurDepthNumIterations(numIterations: number) {\r\n if (this._blurDepthNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurDepthNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthMaxFilterSize = 100;\r\n\r\n /**\r\n * Maximum size of the kernel used to blur the depth texture (positive number, generally between 1 and 200 - higher values will require more processing power from the GPU when the particles are larger on screen)\r\n */\r\n public get blurDepthMaxFilterSize() {\r\n return this._blurDepthMaxFilterSize;\r\n }\r\n\r\n public set blurDepthMaxFilterSize(maxFilterSize: number) {\r\n if (this._blurDepthMaxFilterSize === maxFilterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthMaxFilterSize = maxFilterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthDepthScale = 10;\r\n\r\n /**\r\n * Depth weight in the calculation when applying the bilateral blur to generate the depth blur texture (positive number, generally between 0 and 100)\r\n */\r\n public get blurDepthDepthScale() {\r\n return this._blurDepthDepthScale;\r\n }\r\n\r\n public set blurDepthDepthScale(scale: number) {\r\n if (this._blurDepthDepthScale === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthDepthScale = scale;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _enableBlurThickness = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the thickness texture should be blurred\r\n */\r\n public get enableBlurThickness() {\r\n return this._enableBlurThickness;\r\n }\r\n\r\n public set enableBlurThickness(enable: boolean) {\r\n if (this._enableBlurThickness === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurThickness = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the thickness size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the thickness\r\n * For eg. if blurThicknessSizeDivisor=2, the texture used to blur the thickness will be half the size of the thickness texture\r\n */\r\n public get blurThicknessSizeDivisor() {\r\n return this._blurThicknessSizeDivisor;\r\n }\r\n\r\n public set blurThicknessSizeDivisor(scale: number) {\r\n if (this._blurThicknessSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurThicknessSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessFilterSize = 5;\r\n\r\n /**\r\n * Size of the kernel used to filter the thickness blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessFilterSize() {\r\n return this._blurThicknessFilterSize;\r\n }\r\n\r\n public set blurThicknessFilterSize(filterSize: number) {\r\n if (this._blurThicknessFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurThicknessFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurThicknessNumIterations = 1;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the thickness blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessNumIterations() {\r\n return this._blurThicknessNumIterations;\r\n }\r\n\r\n public set blurThicknessNumIterations(numIterations: number) {\r\n if (this._blurThicknessNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurThicknessNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _useFixedThickness = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that a fixed thickness should be used instead of generating a thickness texture\r\n */\r\n public get useFixedThickness() {\r\n return this._useFixedThickness;\r\n }\r\n\r\n public set useFixedThickness(use: boolean) {\r\n if (this._useFixedThickness === use) {\r\n return;\r\n }\r\n\r\n this._useFixedThickness = use;\r\n this._needInitialization = true;\r\n }\r\n\r\n /** @internal */\r\n public _bgDepthTexture: Nullable<InternalTexture>;\r\n\r\n /** @internal */\r\n public _onUseVelocityChanged = new Observable<FluidRenderingTargetRenderer>();\r\n\r\n private _useVelocity = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the velocity should be used when rendering the particles as a fluid.\r\n * Note: the vertex buffers must contain a \"velocity\" buffer for this to work!\r\n */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._needInitialization = true;\r\n this._onUseVelocityChanged.notifyObservers(this);\r\n }\r\n\r\n private _depthMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the depth texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get depthMapSize() {\r\n return this._depthMapSize;\r\n }\r\n\r\n public set depthMapSize(size: Nullable<number>) {\r\n if (this._depthMapSize === size) {\r\n return;\r\n }\r\n\r\n this._depthMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _thicknessMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the thickness texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get thicknessMapSize() {\r\n return this._thicknessMapSize;\r\n }\r\n\r\n public set thicknessMapSize(size: Nullable<number>) {\r\n if (this._thicknessMapSize === size) {\r\n return;\r\n }\r\n\r\n this._thicknessMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _diffuseMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the diffuse texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get diffuseMapSize() {\r\n return this._diffuseMapSize;\r\n }\r\n\r\n public set diffuseMapSize(size: Nullable<number>) {\r\n if (this._diffuseMapSize === size) {\r\n return;\r\n }\r\n\r\n this._diffuseMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _samples = 1;\r\n\r\n /**\r\n * Gets or sets the number of samples used by MSAA\r\n * Note: changing this value in WebGL does not work because depth/stencil textures can't be created with MSAA (see https://github.com/BabylonJS/Babylon.js/issues/12444)\r\n */\r\n public get samples() {\r\n return this._samples;\r\n }\r\n\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Gets the camera used for the rendering\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n /** @internal */\r\n public _renderPostProcess: Nullable<PostProcess>;\r\n\r\n /** @internal */\r\n public _depthRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _diffuseRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _thicknessRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /**\r\n * Creates an instance of the class\r\n * @param scene Scene used to render the fluid object into\r\n * @param camera Camera used to render the fluid object. If not provided, use the active camera of the scene instead\r\n */\r\n constructor(scene: Scene, camera?: Camera) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._camera = camera ?? scene.activeCamera;\r\n this._needInitialization = true;\r\n this._bgDepthTexture = null;\r\n\r\n this._invProjectionMatrix = new Matrix();\r\n this._depthClearColor = new Color4(1e6, 1e6, 1e6, 1);\r\n this._thicknessClearColor = new Color4(0, 0, 0, 1);\r\n\r\n this._depthRenderTarget = null;\r\n this._diffuseRenderTarget = null;\r\n this._thicknessRenderTarget = null;\r\n\r\n this._renderPostProcess = null;\r\n }\r\n\r\n /** @internal */\r\n public _initialize(): void {\r\n this.dispose();\r\n\r\n this._needInitialization = false;\r\n\r\n const depthWidth = this._depthMapSize ?? this._engine.getRenderWidth();\r\n const depthHeight =\r\n this._depthMapSize !== null ? Math.round((this._depthMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth()) : this._engine.getRenderHeight();\r\n\r\n this._depthRenderTarget = new FluidRenderingTextures(\r\n \"Depth\",\r\n this._scene,\r\n depthWidth,\r\n depthHeight,\r\n depthWidth,\r\n depthHeight,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n false,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._depthRenderTarget);\r\n\r\n if (this.generateDiffuseTexture) {\r\n const diffuseWidth = this._diffuseMapSize ?? this._engine.getRenderWidth();\r\n const diffuseHeight =\r\n this._diffuseMapSize !== null\r\n ? Math.round((this._diffuseMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n this._diffuseRenderTarget = new FluidRenderingTextures(\r\n \"Diffuse\",\r\n this._scene,\r\n diffuseWidth,\r\n diffuseHeight,\r\n 0,\r\n 0,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n true,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._diffuseRenderTarget);\r\n }\r\n\r\n const thicknessWidth = this._thicknessMapSize ?? this._engine.getRenderWidth();\r\n const thicknessHeight =\r\n this._thicknessMapSize !== null\r\n ? Math.round((this._thicknessMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n if (!this._useFixedThickness) {\r\n this._thicknessRenderTarget = new FluidRenderingTextures(\r\n \"Thickness\",\r\n this._scene,\r\n thicknessWidth,\r\n thicknessHeight,\r\n thicknessWidth,\r\n thicknessHeight,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n true,\r\n this._camera,\r\n false,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._thicknessRenderTarget);\r\n }\r\n\r\n this._createLiquidRenderingPostProcess();\r\n }\r\n\r\n protected _setBlurParameters(renderTarget: Nullable<FluidRenderingTextures> = null): void {\r\n if (renderTarget === null || renderTarget === this._depthRenderTarget) {\r\n this._setBlurDepthParameters();\r\n }\r\n if (renderTarget === null || renderTarget === this._thicknessRenderTarget) {\r\n this._setBlurThicknessParameters();\r\n }\r\n }\r\n\r\n protected _setBlurDepthParameters(): void {\r\n if (!this._depthRenderTarget) {\r\n return;\r\n }\r\n this._depthRenderTarget.blurFilterSize = this.blurDepthFilterSize;\r\n this._depthRenderTarget.blurMaxFilterSize = this.blurDepthMaxFilterSize;\r\n this._depthRenderTarget.blurNumIterations = this.blurDepthNumIterations;\r\n this._depthRenderTarget.blurDepthScale = this.blurDepthDepthScale;\r\n }\r\n\r\n protected _setBlurThicknessParameters(): void {\r\n if (!this._thicknessRenderTarget) {\r\n return;\r\n }\r\n this._thicknessRenderTarget.blurFilterSize = this.blurThicknessFilterSize;\r\n this._thicknessRenderTarget.blurNumIterations = this.blurThicknessNumIterations;\r\n }\r\n\r\n protected _initializeRenderTarget(renderTarget: FluidRenderingTextures): void {\r\n if (renderTarget !== this._diffuseRenderTarget) {\r\n renderTarget.enableBlur = renderTarget === this._depthRenderTarget ? this.enableBlurDepth : this.enableBlurThickness;\r\n renderTarget.blurSizeDivisor = renderTarget === this._depthRenderTarget ? this.blurDepthSizeDivisor : this.blurThicknessSizeDivisor;\r\n }\r\n\r\n this._setBlurParameters(renderTarget);\r\n\r\n renderTarget.initialize();\r\n }\r\n\r\n protected _createLiquidRenderingPostProcess(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n const uniformNames = [\r\n \"viewMatrix\",\r\n \"projectionMatrix\",\r\n \"invProjectionMatrix\",\r\n \"texelSize\",\r\n \"dirLight\",\r\n \"cameraFar\",\r\n \"density\",\r\n \"refractionStrength\",\r\n \"fresnelClamp\",\r\n \"specularPower\",\r\n ];\r\n const samplerNames = [\"depthSampler\"];\r\n const defines = [];\r\n\r\n this.dispose(true);\r\n\r\n if (!this._camera) {\r\n return;\r\n }\r\n\r\n const texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur! : this._depthRenderTarget!.texture!;\r\n const texelSize = new Vector2(1 / texture.getSize().width, 1 / texture.getSize().height);\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n samplerNames.push(\"reflectionSampler\");\r\n defines.push(\"#define FLUIDRENDERING_ENVIRONMENT\");\r\n }\r\n }\r\n\r\n if (this._diffuseRenderTarget) {\r\n samplerNames.push(\"diffuseSampler\");\r\n defines.push(\"#define FLUIDRENDERING_DIFFUSETEXTURE\");\r\n } else {\r\n uniformNames.push(\"diffuseColor\");\r\n }\r\n\r\n if (this._useVelocity) {\r\n samplerNames.push(\"velocitySampler\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._useFixedThickness) {\r\n uniformNames.push(\"thickness\");\r\n samplerNames.push(\"bgDepthSampler\");\r\n defines.push(\"#define FLUIDRENDERING_FIXED_THICKNESS\");\r\n } else {\r\n uniformNames.push(\"minimumThickness\");\r\n samplerNames.push(\"thicknessSampler\");\r\n }\r\n\r\n if (this._debug) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG\");\r\n if (this._debugFeature === FluidRenderingDebug.Normals) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_SHOWNORMAL\");\r\n } else if (this._debugFeature === FluidRenderingDebug.DiffuseRendering) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DIFFUSERENDERING\");\r\n } else {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_TEXTURE\");\r\n samplerNames.push(\"debugSampler\");\r\n if (this._debugFeature === FluidRenderingDebug.DepthTexture || this._debugFeature === FluidRenderingDebug.DepthBlurredTexture) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DEPTH\");\r\n }\r\n }\r\n }\r\n\r\n this._renderPostProcess = new PostProcess(\r\n \"FluidRendering\",\r\n \"fluidRenderingRender\",\r\n uniformNames,\r\n samplerNames,\r\n 1,\r\n null,\r\n Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n null,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n undefined,\r\n undefined,\r\n true,\r\n undefined\r\n );\r\n this._renderPostProcess.updateEffect(defines.join(\"\\n\"));\r\n\r\n this._renderPostProcess.samples = this._samples;\r\n const engineWebGPU = engine as WebGPUEngine;\r\n const setTextureSampler = engineWebGPU.setTextureSampler;\r\n this._renderPostProcess.onApplyObservable.add((effect) => {\r\n this._invProjectionMatrix.copyFrom(this._scene.getProjectionMatrix());\r\n this._invProjectionMatrix.invert();\r\n\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"textureSamplerSampler\", this._renderPostProcess!.inputTexture.texture);\r\n }\r\n\r\n if (!this._depthRenderTarget!.enableBlur) {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"depthSamplerSampler\", this._depthRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"depthSamplerSampler\", this._depthRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n if (this._diffuseRenderTarget) {\r\n if (!this._diffuseRenderTarget.enableBlur) {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"diffuseSamplerSampler\", this._diffuseRenderTarget.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"diffuseSamplerSampler\", this._diffuseRenderTarget.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n } else {\r\n effect.setColor3(\"diffuseColor\", this.fluidColor);\r\n }\r\n if (this._useFixedThickness) {\r\n effect.setFloat(\"thickness\", this.minimumThickness);\r\n effect._bindTexture(\"bgDepthSampler\", this._bgDepthTexture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"bgDepthSamplerSampler\", this._bgDepthTexture ?? null);\r\n }\r\n } else {\r\n if (!this._thicknessRenderTarget!.enableBlur) {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"thicknessSamplerSampler\", this._thicknessRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"thicknessSamplerSampler\", this._thicknessRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n effect.setFloat(\"minimumThickness\", this.minimumThickness);\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n effect.setTexture(\"reflectionSampler\", envMap);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"reflectionSamplerSampler\", envMap?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n\r\n effect.setMatrix(\"viewMatrix\", this._scene.getViewMatrix());\r\n effect.setMatrix(\"invProjectionMatrix\", this._invProjectionMatrix);\r\n effect.setMatrix(\"projectionMatrix\", this._scene.getProjectionMatrix());\r\n effect.setVector2(\"texelSize\", texelSize);\r\n effect.setFloat(\"density\", this.density);\r\n effect.setFloat(\"refractionStrength\", this.refractionStrength);\r\n effect.setFloat(\"fresnelClamp\", this.fresnelClamp);\r\n effect.setFloat(\"specularPower\", this.specularPower);\r\n\r\n effect.setVector3(\"dirLight\", this.dirLight);\r\n\r\n effect.setFloat(\"cameraFar\", this._camera!.maxZ);\r\n\r\n if (this._debug) {\r\n let texture: Nullable<ThinTexture> = null;\r\n switch (this._debugFeature) {\r\n case FluidRenderingDebug.DepthTexture:\r\n texture = this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.DepthBlurredTexture:\r\n texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur : this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.ThicknessTexture:\r\n texture = this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.ThicknessBlurredTexture:\r\n texture = this._thicknessRenderTarget?.enableBlur ? this._thicknessRenderTarget?.textureBlur ?? null : this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.DiffuseTexture:\r\n if (this._diffuseRenderTarget) {\r\n texture = this._diffuseRenderTarget.texture;\r\n }\r\n break;\r\n }\r\n if (this._debugFeature !== FluidRenderingDebug.Normals) {\r\n effect.setTexture(\"debugSampler\", texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"debugSamplerSampler\", texture?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _clearTargets(): void {\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n this._engine.clear(this._depthClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n this._engine.clear(this._thicknessClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n // we don't clear the depth buffer because it is the depth buffer that is coming from the scene and that we reuse in the thickness rendering pass\r\n this._engine.clear(this._thicknessClearColor, true, false, false);\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _render(fluidObject: FluidRenderingObject): void {\r\n if (this._needInitialization || !fluidObject.isReady()) {\r\n return;\r\n }\r\n\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n\r\n this._engine.setState(false, undefined, undefined, undefined, true);\r\n this._engine.setDepthBuffer(true);\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n // Render the particles in the depth texture\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDepthTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the diffuse texture\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDiffuseTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the thickness texture\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n\r\n fluidObject.renderThicknessTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n\r\n // Run the blur post processes\r\n this._depthRenderTarget?.applyBlurPostProcesses();\r\n this._diffuseRenderTarget?.applyBlurPostProcesses();\r\n this._thicknessRenderTarget?.applyBlurPostProcesses();\r\n\r\n if (currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Releases all the ressources used by the class\r\n * @param onlyPostProcesses If true, releases only the ressources used by the render post processes\r\n */\r\n public dispose(onlyPostProcesses = false): void {\r\n if (!onlyPostProcesses) {\r\n this._depthRenderTarget?.dispose();\r\n this._depthRenderTarget = null;\r\n\r\n this._diffuseRenderTarget?.dispose();\r\n this._diffuseRenderTarget = null;\r\n\r\n this._thicknessRenderTarget?.dispose();\r\n this._thicknessRenderTarget = null;\r\n }\r\n\r\n if (this._renderPostProcess && this._camera) {\r\n this._camera.detachPostProcess(this._renderPostProcess);\r\n }\r\n this._renderPostProcess?.dispose();\r\n this._renderPostProcess = null;\r\n\r\n this._needInitialization = false;\r\n }\r\n}\r\n"]}
@@ -338,7 +338,7 @@ export class RenderingGroup {
338
338
  this._opaqueSubMeshes.push(subMesh); // Opaque
339
339
  }
340
340
  mesh._renderingGroup = this;
341
- if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) {
341
+ if (mesh._edgesRenderer && mesh.isEnabled() && mesh.isVisible && mesh._edgesRenderer.isEnabled) {
342
342
  this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer);
343
343
  }
344
344
  this._empty = false;
@@ -1 +1 @@
1
- {"version":3,"file":"renderingGroup.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/renderingGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import { SmartArray, SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable, DeepImmutable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { IEdgesRenderer } from \"./edgesRenderer\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\n\r\n/**\r\n * This represents the object necessary to create a rendering group.\r\n * This is exclusively used and created by the rendering manager.\r\n * To modify the behavior, you use the available helpers in your scene or meshes.\r\n * @internal\r\n */\r\nexport class RenderingGroup {\r\n private static _ZeroVector: DeepImmutable<Vector3> = Vector3.Zero();\r\n private _scene: Scene;\r\n private _opaqueSubMeshes = new SmartArray<SubMesh>(256);\r\n private _transparentSubMeshes = new SmartArray<SubMesh>(256);\r\n private _alphaTestSubMeshes = new SmartArray<SubMesh>(256);\r\n private _depthOnlySubMeshes = new SmartArray<SubMesh>(256);\r\n private _particleSystems = new SmartArray<IParticleSystem>(256);\r\n private _spriteManagers = new SmartArray<ISpriteManager>(256);\r\n\r\n private _opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _transparentSortCompareFn: (a: SubMesh, b: SubMesh) => number;\r\n\r\n private _renderOpaque: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderAlphaTest: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderTransparent: (subMeshes: SmartArray<SubMesh>) => void;\r\n\r\n /** @internal */\r\n public _empty = true;\r\n\r\n /** @internal */\r\n public _edgesRenderers = new SmartArrayNoDuplicate<IEdgesRenderer>(16);\r\n\r\n public onBeforeTransparentRendering: () => void;\r\n\r\n /**\r\n * Set the opaque sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set opaqueSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._opaqueSortCompareFn = value;\r\n } else {\r\n this._opaqueSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderOpaque = this._renderOpaqueSorted;\r\n }\r\n\r\n /**\r\n * Set the alpha test sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set alphaTestSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._alphaTestSortCompareFn = value;\r\n } else {\r\n this._alphaTestSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderAlphaTest = this._renderAlphaTestSorted;\r\n }\r\n\r\n /**\r\n * Set the transparent sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set transparentSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._transparentSortCompareFn = value;\r\n } else {\r\n this._transparentSortCompareFn = RenderingGroup.defaultTransparentSortCompare;\r\n }\r\n this._renderTransparent = this._renderTransparentSorted;\r\n }\r\n\r\n /**\r\n * Creates a new rendering group.\r\n * @param index The rendering group index\r\n * @param scene\r\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\r\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\r\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\r\n */\r\n constructor(\r\n public index: number,\r\n scene: Scene,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._scene = scene;\r\n\r\n this.opaqueSortCompareFn = opaqueSortCompareFn;\r\n this.alphaTestSortCompareFn = alphaTestSortCompareFn;\r\n this.transparentSortCompareFn = transparentSortCompareFn;\r\n }\r\n\r\n /**\r\n * Render all the sub meshes contained in the group.\r\n * @param customRenderFunction Used to override the default render behaviour of the group.\r\n * @param renderSprites\r\n * @param renderParticles\r\n * @param activeMeshes\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ) => void\r\n >,\r\n renderSprites: boolean,\r\n renderParticles: boolean,\r\n activeMeshes: Nullable<AbstractMesh[]>\r\n ): void {\r\n if (customRenderFunction) {\r\n customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Depth only\r\n if (this._depthOnlySubMeshes.length !== 0) {\r\n engine.setColorWrite(false);\r\n this._renderAlphaTest(this._depthOnlySubMeshes);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n // Opaque\r\n if (this._opaqueSubMeshes.length !== 0) {\r\n this._renderOpaque(this._opaqueSubMeshes);\r\n }\r\n\r\n // Alpha test\r\n if (this._alphaTestSubMeshes.length !== 0) {\r\n this._renderAlphaTest(this._alphaTestSubMeshes);\r\n }\r\n\r\n const stencilState = engine.getStencilBuffer();\r\n engine.setStencilBuffer(false);\r\n\r\n // Sprites\r\n if (renderSprites) {\r\n this._renderSprites();\r\n }\r\n\r\n // Particles\r\n if (renderParticles) {\r\n this._renderParticles(activeMeshes);\r\n }\r\n\r\n if (this.onBeforeTransparentRendering) {\r\n this.onBeforeTransparentRendering();\r\n }\r\n\r\n // Transparent\r\n if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\r\n engine.setStencilBuffer(stencilState);\r\n if (this._scene.useOrderIndependentTransparency) {\r\n const excludedMeshes = this._scene.depthPeelingRenderer!.render(this._transparentSubMeshes);\r\n if (excludedMeshes.length) {\r\n // Render leftover meshes that could not be processed by depth peeling\r\n this._renderTransparent(excludedMeshes);\r\n }\r\n } else {\r\n this._renderTransparent(this._transparentSubMeshes);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Set back stencil to false in case it changes before the edge renderer.\r\n engine.setStencilBuffer(false);\r\n\r\n // Edges\r\n if (this._edgesRenderers.length) {\r\n for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {\r\n this._edgesRenderers.data[edgesRendererIndex].render();\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Stencil state.\r\n engine.setStencilBuffer(stencilState);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderOpaqueSorted(subMeshes: SmartArray<SubMesh>): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderAlphaTestSorted(subMeshes: SmartArray<SubMesh>): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderTransparentSorted(subMeshes: SmartArray<SubMesh>): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true);\r\n }\r\n\r\n /**\r\n * Renders the submeshes in a specified order.\r\n * @param subMeshes The submeshes to sort before render\r\n * @param sortCompareFn The comparison function use to sort\r\n * @param camera The camera position use to preprocess the submeshes to help sorting\r\n * @param transparent Specifies to activate blending if true\r\n */\r\n private static _RenderSorted(\r\n subMeshes: SmartArray<SubMesh>,\r\n sortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>,\r\n camera: Nullable<Camera>,\r\n transparent: boolean\r\n ): void {\r\n let subIndex = 0;\r\n let subMesh: SubMesh;\r\n const cameraPosition = camera ? camera.globalPosition : RenderingGroup._ZeroVector;\r\n\r\n if (transparent) {\r\n for (; subIndex < subMeshes.length; subIndex++) {\r\n subMesh = subMeshes.data[subIndex];\r\n subMesh._alphaIndex = subMesh.getMesh().alphaIndex;\r\n subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n }\r\n\r\n const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length);\r\n\r\n if (sortCompareFn) {\r\n sortedArray.sort(sortCompareFn);\r\n }\r\n\r\n const scene = sortedArray[0].getMesh().getScene();\r\n for (subIndex = 0; subIndex < sortedArray.length; subIndex++) {\r\n subMesh = sortedArray[subIndex];\r\n\r\n if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) {\r\n continue;\r\n }\r\n\r\n if (transparent) {\r\n const material = subMesh.getMaterial();\r\n\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n subMesh.render(false);\r\n engine.setColorWrite(true);\r\n }\r\n }\r\n\r\n subMesh.render(transparent);\r\n }\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front if in the same alpha index.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static defaultTransparentSortCompare(a: SubMesh, b: SubMesh): number {\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 return RenderingGroup.backToFrontSortCompare(a, b);\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static backToFrontSortCompare(a: SubMesh, b: SubMesh): number {\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 /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered front to back (prevent overdraw).\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static frontToBackSortCompare(a: SubMesh, b: SubMesh): number {\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 /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are grouped by material then geometry.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n public static PainterSortCompare(a: SubMesh, b: SubMesh): number {\r\n const meshA = a.getMesh();\r\n const meshB = b.getMesh();\r\n\r\n if (meshA.material && meshB.material) {\r\n return meshA.material.uniqueId - meshB.material.uniqueId;\r\n }\r\n\r\n return meshA.uniqueId - meshB.uniqueId;\r\n }\r\n\r\n /**\r\n * Resets the different lists of submeshes to prepare a new frame.\r\n */\r\n public prepare(): void {\r\n this._opaqueSubMeshes.reset();\r\n this._transparentSubMeshes.reset();\r\n this._alphaTestSubMeshes.reset();\r\n this._depthOnlySubMeshes.reset();\r\n this._particleSystems.reset();\r\n this.prepareSprites();\r\n this._edgesRenderers.reset();\r\n this._empty = true;\r\n }\r\n\r\n /**\r\n * Resets the different lists of sprites to prepare a new frame.\r\n */\r\n public prepareSprites(): void {\r\n this._spriteManagers.reset();\r\n }\r\n\r\n public dispose(): void {\r\n this._opaqueSubMeshes.dispose();\r\n this._transparentSubMeshes.dispose();\r\n this._alphaTestSubMeshes.dispose();\r\n this._depthOnlySubMeshes.dispose();\r\n this._particleSystems.dispose();\r\n this._spriteManagers.dispose();\r\n this._edgesRenderers.dispose();\r\n }\r\n\r\n /**\r\n * Inserts the submesh in its correct queue depending on its material.\r\n * @param subMesh The submesh to dispatch\r\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable<Material>): void {\r\n // Get mesh and materials if not provided\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (material === undefined) {\r\n material = subMesh.getMaterial();\r\n }\r\n\r\n if (material === null || material === undefined) {\r\n return;\r\n }\r\n\r\n if (material.needAlphaBlendingForMesh(mesh)) {\r\n // Transparent\r\n this._transparentSubMeshes.push(subMesh);\r\n } else if (material.needAlphaTesting()) {\r\n // Alpha test\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._alphaTestSubMeshes.push(subMesh);\r\n } else {\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._opaqueSubMeshes.push(subMesh); // Opaque\r\n }\r\n\r\n mesh._renderingGroup = this;\r\n\r\n if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) {\r\n this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer);\r\n }\r\n\r\n this._empty = false;\r\n }\r\n\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n this._spriteManagers.push(spriteManager);\r\n this._empty = false;\r\n }\r\n\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n this._particleSystems.push(particleSystem);\r\n this._empty = false;\r\n }\r\n\r\n private _renderParticles(activeMeshes: Nullable<AbstractMesh[]>): void {\r\n if (this._particleSystems.length === 0) {\r\n return;\r\n }\r\n\r\n // Particles\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) {\r\n const particleSystem = this._particleSystems.data[particleIndex];\r\n\r\n if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) {\r\n continue;\r\n }\r\n\r\n const emitter: any = particleSystem.emitter;\r\n if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) {\r\n this._scene._activeParticles.addCount(particleSystem.render(), false);\r\n }\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n private _renderSprites(): void {\r\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) {\r\n return;\r\n }\r\n\r\n // Sprites\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\r\n for (let id = 0; id < this._spriteManagers.length; id++) {\r\n const spriteManager = this._spriteManagers.data[id];\r\n\r\n if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) {\r\n spriteManager.render();\r\n }\r\n }\r\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"renderingGroup.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/renderingGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import { SmartArray, SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable, DeepImmutable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { IEdgesRenderer } from \"./edgesRenderer\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\n\r\n/**\r\n * This represents the object necessary to create a rendering group.\r\n * This is exclusively used and created by the rendering manager.\r\n * To modify the behavior, you use the available helpers in your scene or meshes.\r\n * @internal\r\n */\r\nexport class RenderingGroup {\r\n private static _ZeroVector: DeepImmutable<Vector3> = Vector3.Zero();\r\n private _scene: Scene;\r\n private _opaqueSubMeshes = new SmartArray<SubMesh>(256);\r\n private _transparentSubMeshes = new SmartArray<SubMesh>(256);\r\n private _alphaTestSubMeshes = new SmartArray<SubMesh>(256);\r\n private _depthOnlySubMeshes = new SmartArray<SubMesh>(256);\r\n private _particleSystems = new SmartArray<IParticleSystem>(256);\r\n private _spriteManagers = new SmartArray<ISpriteManager>(256);\r\n\r\n private _opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _transparentSortCompareFn: (a: SubMesh, b: SubMesh) => number;\r\n\r\n private _renderOpaque: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderAlphaTest: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderTransparent: (subMeshes: SmartArray<SubMesh>) => void;\r\n\r\n /** @internal */\r\n public _empty = true;\r\n\r\n /** @internal */\r\n public _edgesRenderers = new SmartArrayNoDuplicate<IEdgesRenderer>(16);\r\n\r\n public onBeforeTransparentRendering: () => void;\r\n\r\n /**\r\n * Set the opaque sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set opaqueSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._opaqueSortCompareFn = value;\r\n } else {\r\n this._opaqueSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderOpaque = this._renderOpaqueSorted;\r\n }\r\n\r\n /**\r\n * Set the alpha test sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set alphaTestSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._alphaTestSortCompareFn = value;\r\n } else {\r\n this._alphaTestSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderAlphaTest = this._renderAlphaTestSorted;\r\n }\r\n\r\n /**\r\n * Set the transparent sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set transparentSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._transparentSortCompareFn = value;\r\n } else {\r\n this._transparentSortCompareFn = RenderingGroup.defaultTransparentSortCompare;\r\n }\r\n this._renderTransparent = this._renderTransparentSorted;\r\n }\r\n\r\n /**\r\n * Creates a new rendering group.\r\n * @param index The rendering group index\r\n * @param scene\r\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\r\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\r\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\r\n */\r\n constructor(\r\n public index: number,\r\n scene: Scene,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._scene = scene;\r\n\r\n this.opaqueSortCompareFn = opaqueSortCompareFn;\r\n this.alphaTestSortCompareFn = alphaTestSortCompareFn;\r\n this.transparentSortCompareFn = transparentSortCompareFn;\r\n }\r\n\r\n /**\r\n * Render all the sub meshes contained in the group.\r\n * @param customRenderFunction Used to override the default render behaviour of the group.\r\n * @param renderSprites\r\n * @param renderParticles\r\n * @param activeMeshes\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ) => void\r\n >,\r\n renderSprites: boolean,\r\n renderParticles: boolean,\r\n activeMeshes: Nullable<AbstractMesh[]>\r\n ): void {\r\n if (customRenderFunction) {\r\n customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Depth only\r\n if (this._depthOnlySubMeshes.length !== 0) {\r\n engine.setColorWrite(false);\r\n this._renderAlphaTest(this._depthOnlySubMeshes);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n // Opaque\r\n if (this._opaqueSubMeshes.length !== 0) {\r\n this._renderOpaque(this._opaqueSubMeshes);\r\n }\r\n\r\n // Alpha test\r\n if (this._alphaTestSubMeshes.length !== 0) {\r\n this._renderAlphaTest(this._alphaTestSubMeshes);\r\n }\r\n\r\n const stencilState = engine.getStencilBuffer();\r\n engine.setStencilBuffer(false);\r\n\r\n // Sprites\r\n if (renderSprites) {\r\n this._renderSprites();\r\n }\r\n\r\n // Particles\r\n if (renderParticles) {\r\n this._renderParticles(activeMeshes);\r\n }\r\n\r\n if (this.onBeforeTransparentRendering) {\r\n this.onBeforeTransparentRendering();\r\n }\r\n\r\n // Transparent\r\n if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\r\n engine.setStencilBuffer(stencilState);\r\n if (this._scene.useOrderIndependentTransparency) {\r\n const excludedMeshes = this._scene.depthPeelingRenderer!.render(this._transparentSubMeshes);\r\n if (excludedMeshes.length) {\r\n // Render leftover meshes that could not be processed by depth peeling\r\n this._renderTransparent(excludedMeshes);\r\n }\r\n } else {\r\n this._renderTransparent(this._transparentSubMeshes);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Set back stencil to false in case it changes before the edge renderer.\r\n engine.setStencilBuffer(false);\r\n\r\n // Edges\r\n if (this._edgesRenderers.length) {\r\n for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {\r\n this._edgesRenderers.data[edgesRendererIndex].render();\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Stencil state.\r\n engine.setStencilBuffer(stencilState);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderOpaqueSorted(subMeshes: SmartArray<SubMesh>): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderAlphaTestSorted(subMeshes: SmartArray<SubMesh>): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderTransparentSorted(subMeshes: SmartArray<SubMesh>): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true);\r\n }\r\n\r\n /**\r\n * Renders the submeshes in a specified order.\r\n * @param subMeshes The submeshes to sort before render\r\n * @param sortCompareFn The comparison function use to sort\r\n * @param camera The camera position use to preprocess the submeshes to help sorting\r\n * @param transparent Specifies to activate blending if true\r\n */\r\n private static _RenderSorted(\r\n subMeshes: SmartArray<SubMesh>,\r\n sortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>,\r\n camera: Nullable<Camera>,\r\n transparent: boolean\r\n ): void {\r\n let subIndex = 0;\r\n let subMesh: SubMesh;\r\n const cameraPosition = camera ? camera.globalPosition : RenderingGroup._ZeroVector;\r\n\r\n if (transparent) {\r\n for (; subIndex < subMeshes.length; subIndex++) {\r\n subMesh = subMeshes.data[subIndex];\r\n subMesh._alphaIndex = subMesh.getMesh().alphaIndex;\r\n subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n }\r\n\r\n const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length);\r\n\r\n if (sortCompareFn) {\r\n sortedArray.sort(sortCompareFn);\r\n }\r\n\r\n const scene = sortedArray[0].getMesh().getScene();\r\n for (subIndex = 0; subIndex < sortedArray.length; subIndex++) {\r\n subMesh = sortedArray[subIndex];\r\n\r\n if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) {\r\n continue;\r\n }\r\n\r\n if (transparent) {\r\n const material = subMesh.getMaterial();\r\n\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n subMesh.render(false);\r\n engine.setColorWrite(true);\r\n }\r\n }\r\n\r\n subMesh.render(transparent);\r\n }\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front if in the same alpha index.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static defaultTransparentSortCompare(a: SubMesh, b: SubMesh): number {\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 return RenderingGroup.backToFrontSortCompare(a, b);\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static backToFrontSortCompare(a: SubMesh, b: SubMesh): number {\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 /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered front to back (prevent overdraw).\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static frontToBackSortCompare(a: SubMesh, b: SubMesh): number {\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 /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are grouped by material then geometry.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n public static PainterSortCompare(a: SubMesh, b: SubMesh): number {\r\n const meshA = a.getMesh();\r\n const meshB = b.getMesh();\r\n\r\n if (meshA.material && meshB.material) {\r\n return meshA.material.uniqueId - meshB.material.uniqueId;\r\n }\r\n\r\n return meshA.uniqueId - meshB.uniqueId;\r\n }\r\n\r\n /**\r\n * Resets the different lists of submeshes to prepare a new frame.\r\n */\r\n public prepare(): void {\r\n this._opaqueSubMeshes.reset();\r\n this._transparentSubMeshes.reset();\r\n this._alphaTestSubMeshes.reset();\r\n this._depthOnlySubMeshes.reset();\r\n this._particleSystems.reset();\r\n this.prepareSprites();\r\n this._edgesRenderers.reset();\r\n this._empty = true;\r\n }\r\n\r\n /**\r\n * Resets the different lists of sprites to prepare a new frame.\r\n */\r\n public prepareSprites(): void {\r\n this._spriteManagers.reset();\r\n }\r\n\r\n public dispose(): void {\r\n this._opaqueSubMeshes.dispose();\r\n this._transparentSubMeshes.dispose();\r\n this._alphaTestSubMeshes.dispose();\r\n this._depthOnlySubMeshes.dispose();\r\n this._particleSystems.dispose();\r\n this._spriteManagers.dispose();\r\n this._edgesRenderers.dispose();\r\n }\r\n\r\n /**\r\n * Inserts the submesh in its correct queue depending on its material.\r\n * @param subMesh The submesh to dispatch\r\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable<Material>): void {\r\n // Get mesh and materials if not provided\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (material === undefined) {\r\n material = subMesh.getMaterial();\r\n }\r\n\r\n if (material === null || material === undefined) {\r\n return;\r\n }\r\n\r\n if (material.needAlphaBlendingForMesh(mesh)) {\r\n // Transparent\r\n this._transparentSubMeshes.push(subMesh);\r\n } else if (material.needAlphaTesting()) {\r\n // Alpha test\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._alphaTestSubMeshes.push(subMesh);\r\n } else {\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._opaqueSubMeshes.push(subMesh); // Opaque\r\n }\r\n\r\n mesh._renderingGroup = this;\r\n\r\n if (mesh._edgesRenderer && mesh.isEnabled() && mesh.isVisible && mesh._edgesRenderer.isEnabled) {\r\n this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer);\r\n }\r\n\r\n this._empty = false;\r\n }\r\n\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n this._spriteManagers.push(spriteManager);\r\n this._empty = false;\r\n }\r\n\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n this._particleSystems.push(particleSystem);\r\n this._empty = false;\r\n }\r\n\r\n private _renderParticles(activeMeshes: Nullable<AbstractMesh[]>): void {\r\n if (this._particleSystems.length === 0) {\r\n return;\r\n }\r\n\r\n // Particles\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) {\r\n const particleSystem = this._particleSystems.data[particleIndex];\r\n\r\n if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) {\r\n continue;\r\n }\r\n\r\n const emitter: any = particleSystem.emitter;\r\n if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) {\r\n this._scene._activeParticles.addCount(particleSystem.render(), false);\r\n }\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n private _renderSprites(): void {\r\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) {\r\n return;\r\n }\r\n\r\n // Sprites\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\r\n for (let id = 0; id < this._spriteManagers.length; id++) {\r\n const spriteManager = this._spriteManagers.data[id];\r\n\r\n if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) {\r\n spriteManager.render();\r\n }\r\n }\r\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n}\r\n"]}
@@ -29,7 +29,10 @@ color.rgb=result.bgr;
29
29
  #endif
30
30
  return color;}
31
31
  #endif
32
- #ifdef TONEMAPPING_ACES
32
+ #if TONEMAPPING==3
33
+ const float PBRNeutralStartCompression=0.8-0.04;const float PBRNeutralDesaturation=0.15;vec3 PBRNeutralToneMapping( vec3 color ) {float x=min(color.r,min(color.g,color.b));float offset=x<0.08 ? x-6.25*x*x : 0.04;color-=offset;float peak=max(color.r,max(color.g,color.b));if (peak<PBRNeutralStartCompression) return color;float d=1.-PBRNeutralStartCompression;float newPeak=1.-d*d/(peak+d-PBRNeutralStartCompression);color*=newPeak/peak;float g=1.-1./(PBRNeutralDesaturation*(peak-newPeak)+1.);return mix(color,newPeak*vec3(1,1,1),g);}
34
+ #endif
35
+ #if TONEMAPPING==2
33
36
  const mat3 ACESInputMat=mat3(
34
37
  vec3(0.59719,0.07600,0.02840),
35
38
  vec3(0.35458,0.90834,0.13383),
@@ -58,13 +61,13 @@ vec3 vignetteColorMultiplier=mix(vignetteColor,vec3(1,1,1),vignette);result.rgb*
58
61
  result.rgb=mix(vignetteColor,result.rgb,vignette);
59
62
  #endif
60
63
  #endif
61
- #ifdef TONEMAPPING
62
- #ifdef TONEMAPPING_ACES
64
+ #if TONEMAPPING==3
65
+ result.rgb=PBRNeutralToneMapping(result.rgb);
66
+ #elif TONEMAPPING==2
63
67
  result.rgb=ACESFitted(result.rgb);
64
- #else
68
+ #elif TONEMAPPING==1
65
69
  const float tonemappingCalibration=1.590579;result.rgb=1.0-exp2(-tonemappingCalibration*result.rgb);
66
70
  #endif
67
- #endif
68
71
  result.rgb=toGammaSpace(result.rgb);result.rgb=saturate(result.rgb);
69
72
  #ifdef CONTRAST
70
73
  vec3 resultHighContrast=result.rgb*result.rgb*(3.0-2.0*result.rgb);if (contrast<1.0) {result.rgb=mix(vec3(0.5,0.5,0.5),result.rgb,contrast);} else {result.rgb=mix(result.rgb,resultHighContrast,contrast-1.0);}
@@ -1 +1 @@
1
- {"version":3,"file":"imageProcessingFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/imageProcessingFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAoFC,CAAC;AACjB,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"imageProcessingFunctions\";\nconst shader = `#if defined(COLORGRADING) && !defined(COLORGRADING3D)\n/** \n* Polyfill for SAMPLE_TEXTURE_3D,which is unsupported in WebGL.\n* sampler3dSetting.x=textureOffset (0.5/textureSize).\n* sampler3dSetting.y=textureSize.\n*/\n#define inline\nvec3 sampleTexture3D(sampler2D colorTransform,vec3 color,vec2 sampler3dSetting)\n{float sliceSize=2.0*sampler3dSetting.x; \n#ifdef SAMPLER3DGREENDEPTH\nfloat sliceContinuous=(color.g-sampler3dSetting.x)*sampler3dSetting.y;\n#else\nfloat sliceContinuous=(color.b-sampler3dSetting.x)*sampler3dSetting.y;\n#endif\nfloat sliceInteger=floor(sliceContinuous);float sliceFraction=sliceContinuous-sliceInteger;\n#ifdef SAMPLER3DGREENDEPTH\nvec2 sliceUV=color.rb;\n#else\nvec2 sliceUV=color.rg;\n#endif\nsliceUV.x*=sliceSize;sliceUV.x+=sliceInteger*sliceSize;sliceUV=saturate(sliceUV);vec4 slice0Color=texture2D(colorTransform,sliceUV);sliceUV.x+=sliceSize;sliceUV=saturate(sliceUV);vec4 slice1Color=texture2D(colorTransform,sliceUV);vec3 result=mix(slice0Color.rgb,slice1Color.rgb,sliceFraction);\n#ifdef SAMPLER3DBGRMAP\ncolor.rgb=result.rgb;\n#else\ncolor.rgb=result.bgr;\n#endif\nreturn color;}\n#endif\n#ifdef TONEMAPPING_ACES\nconst mat3 ACESInputMat=mat3(\nvec3(0.59719,0.07600,0.02840),\nvec3(0.35458,0.90834,0.13383),\nvec3(0.04823,0.01566,0.83777)\n);const mat3 ACESOutputMat=mat3(\nvec3( 1.60475,-0.10208,-0.00327),\nvec3(-0.53108, 1.10813,-0.07276),\nvec3(-0.07367,-0.00605, 1.07602)\n);vec3 RRTAndODTFit(vec3 v)\n{vec3 a=v*(v+0.0245786)-0.000090537;vec3 b=v*(0.983729*v+0.4329510)+0.238081;return a/b;}\nvec3 ACESFitted(vec3 color)\n{color=ACESInputMat*color;color=RRTAndODTFit(color);color=ACESOutputMat*color;color=saturate(color);return color;}\n#endif\n#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_DEFINITIONS\nvec4 applyImageProcessing(vec4 result) {\n#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATSTART\n#ifdef EXPOSURE\nresult.rgb*=exposureLinear;\n#endif\n#ifdef VIGNETTE\nvec2 viewportXY=gl_FragCoord.xy*vInverseScreenSize;viewportXY=viewportXY*2.0-1.0;vec3 vignetteXY1=vec3(viewportXY*vignetteSettings1.xy+vignetteSettings1.zw,1.0);float vignetteTerm=dot(vignetteXY1,vignetteXY1);float vignette=pow(vignetteTerm,vignetteSettings2.w);vec3 vignetteColor=vignetteSettings2.rgb;\n#ifdef VIGNETTEBLENDMODEMULTIPLY\nvec3 vignetteColorMultiplier=mix(vignetteColor,vec3(1,1,1),vignette);result.rgb*=vignetteColorMultiplier;\n#endif\n#ifdef VIGNETTEBLENDMODEOPAQUE\nresult.rgb=mix(vignetteColor,result.rgb,vignette);\n#endif\n#endif\n#ifdef TONEMAPPING\n#ifdef TONEMAPPING_ACES\nresult.rgb=ACESFitted(result.rgb);\n#else\nconst float tonemappingCalibration=1.590579;result.rgb=1.0-exp2(-tonemappingCalibration*result.rgb);\n#endif\n#endif\nresult.rgb=toGammaSpace(result.rgb);result.rgb=saturate(result.rgb);\n#ifdef CONTRAST\nvec3 resultHighContrast=result.rgb*result.rgb*(3.0-2.0*result.rgb);if (contrast<1.0) {result.rgb=mix(vec3(0.5,0.5,0.5),result.rgb,contrast);} else {result.rgb=mix(result.rgb,resultHighContrast,contrast-1.0);}\n#endif\n#ifdef COLORGRADING\nvec3 colorTransformInput=result.rgb*colorTransformSettings.xxx+colorTransformSettings.yyy;\n#ifdef COLORGRADING3D\nvec3 colorTransformOutput=texture(txColorTransform,colorTransformInput).rgb;\n#else\nvec3 colorTransformOutput=sampleTexture3D(txColorTransform,colorTransformInput,colorTransformSettings.yz).rgb;\n#endif\nresult.rgb=mix(result.rgb,colorTransformOutput,colorTransformSettings.www);\n#endif\n#ifdef COLORCURVES\nfloat luma=getLuminance(result.rgb);vec2 curveMix=clamp(vec2(luma*3.0-1.5,luma*-3.0+1.5),vec2(0.0),vec2(1.0));vec4 colorCurve=vCameraColorCurveNeutral+curveMix.x*vCameraColorCurvePositive-curveMix.y*vCameraColorCurveNegative;result.rgb*=colorCurve.rgb;result.rgb=mix(vec3(luma),result.rgb,colorCurve.a);\n#endif\n#ifdef DITHER\nfloat rand=getRand(gl_FragCoord.xy*vInverseScreenSize);float dither=mix(-ditherIntensity,ditherIntensity,rand);result.rgb=saturate(result.rgb+vec3(dither));\n#endif\n#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATEND\nreturn result;}`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const imageProcessingFunctions = { name, shader };\n"]}
1
+ {"version":3,"file":"imageProcessingFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/imageProcessingFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAuFC,CAAC;AACjB,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"imageProcessingFunctions\";\nconst shader = `#if defined(COLORGRADING) && !defined(COLORGRADING3D)\n/** \n* Polyfill for SAMPLE_TEXTURE_3D,which is unsupported in WebGL.\n* sampler3dSetting.x=textureOffset (0.5/textureSize).\n* sampler3dSetting.y=textureSize.\n*/\n#define inline\nvec3 sampleTexture3D(sampler2D colorTransform,vec3 color,vec2 sampler3dSetting)\n{float sliceSize=2.0*sampler3dSetting.x; \n#ifdef SAMPLER3DGREENDEPTH\nfloat sliceContinuous=(color.g-sampler3dSetting.x)*sampler3dSetting.y;\n#else\nfloat sliceContinuous=(color.b-sampler3dSetting.x)*sampler3dSetting.y;\n#endif\nfloat sliceInteger=floor(sliceContinuous);float sliceFraction=sliceContinuous-sliceInteger;\n#ifdef SAMPLER3DGREENDEPTH\nvec2 sliceUV=color.rb;\n#else\nvec2 sliceUV=color.rg;\n#endif\nsliceUV.x*=sliceSize;sliceUV.x+=sliceInteger*sliceSize;sliceUV=saturate(sliceUV);vec4 slice0Color=texture2D(colorTransform,sliceUV);sliceUV.x+=sliceSize;sliceUV=saturate(sliceUV);vec4 slice1Color=texture2D(colorTransform,sliceUV);vec3 result=mix(slice0Color.rgb,slice1Color.rgb,sliceFraction);\n#ifdef SAMPLER3DBGRMAP\ncolor.rgb=result.rgb;\n#else\ncolor.rgb=result.bgr;\n#endif\nreturn color;}\n#endif\n#if TONEMAPPING==3\nconst float PBRNeutralStartCompression=0.8-0.04;const float PBRNeutralDesaturation=0.15;vec3 PBRNeutralToneMapping( vec3 color ) {float x=min(color.r,min(color.g,color.b));float offset=x<0.08 ? x-6.25*x*x : 0.04;color-=offset;float peak=max(color.r,max(color.g,color.b));if (peak<PBRNeutralStartCompression) return color;float d=1.-PBRNeutralStartCompression;float newPeak=1.-d*d/(peak+d-PBRNeutralStartCompression);color*=newPeak/peak;float g=1.-1./(PBRNeutralDesaturation*(peak-newPeak)+1.);return mix(color,newPeak*vec3(1,1,1),g);}\n#endif\n#if TONEMAPPING==2\nconst mat3 ACESInputMat=mat3(\nvec3(0.59719,0.07600,0.02840),\nvec3(0.35458,0.90834,0.13383),\nvec3(0.04823,0.01566,0.83777)\n);const mat3 ACESOutputMat=mat3(\nvec3( 1.60475,-0.10208,-0.00327),\nvec3(-0.53108, 1.10813,-0.07276),\nvec3(-0.07367,-0.00605, 1.07602)\n);vec3 RRTAndODTFit(vec3 v)\n{vec3 a=v*(v+0.0245786)-0.000090537;vec3 b=v*(0.983729*v+0.4329510)+0.238081;return a/b;}\nvec3 ACESFitted(vec3 color)\n{color=ACESInputMat*color;color=RRTAndODTFit(color);color=ACESOutputMat*color;color=saturate(color);return color;}\n#endif\n#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_DEFINITIONS\nvec4 applyImageProcessing(vec4 result) {\n#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATSTART\n#ifdef EXPOSURE\nresult.rgb*=exposureLinear;\n#endif\n#ifdef VIGNETTE\nvec2 viewportXY=gl_FragCoord.xy*vInverseScreenSize;viewportXY=viewportXY*2.0-1.0;vec3 vignetteXY1=vec3(viewportXY*vignetteSettings1.xy+vignetteSettings1.zw,1.0);float vignetteTerm=dot(vignetteXY1,vignetteXY1);float vignette=pow(vignetteTerm,vignetteSettings2.w);vec3 vignetteColor=vignetteSettings2.rgb;\n#ifdef VIGNETTEBLENDMODEMULTIPLY\nvec3 vignetteColorMultiplier=mix(vignetteColor,vec3(1,1,1),vignette);result.rgb*=vignetteColorMultiplier;\n#endif\n#ifdef VIGNETTEBLENDMODEOPAQUE\nresult.rgb=mix(vignetteColor,result.rgb,vignette);\n#endif\n#endif\n#if TONEMAPPING==3\nresult.rgb=PBRNeutralToneMapping(result.rgb);\n#elif TONEMAPPING==2\nresult.rgb=ACESFitted(result.rgb);\n#elif TONEMAPPING==1\nconst float tonemappingCalibration=1.590579;result.rgb=1.0-exp2(-tonemappingCalibration*result.rgb);\n#endif\nresult.rgb=toGammaSpace(result.rgb);result.rgb=saturate(result.rgb);\n#ifdef CONTRAST\nvec3 resultHighContrast=result.rgb*result.rgb*(3.0-2.0*result.rgb);if (contrast<1.0) {result.rgb=mix(vec3(0.5,0.5,0.5),result.rgb,contrast);} else {result.rgb=mix(result.rgb,resultHighContrast,contrast-1.0);}\n#endif\n#ifdef COLORGRADING\nvec3 colorTransformInput=result.rgb*colorTransformSettings.xxx+colorTransformSettings.yyy;\n#ifdef COLORGRADING3D\nvec3 colorTransformOutput=texture(txColorTransform,colorTransformInput).rgb;\n#else\nvec3 colorTransformOutput=sampleTexture3D(txColorTransform,colorTransformInput,colorTransformSettings.yz).rgb;\n#endif\nresult.rgb=mix(result.rgb,colorTransformOutput,colorTransformSettings.www);\n#endif\n#ifdef COLORCURVES\nfloat luma=getLuminance(result.rgb);vec2 curveMix=clamp(vec2(luma*3.0-1.5,luma*-3.0+1.5),vec2(0.0),vec2(1.0));vec4 colorCurve=vCameraColorCurveNeutral+curveMix.x*vCameraColorCurvePositive-curveMix.y*vCameraColorCurveNegative;result.rgb*=colorCurve.rgb;result.rgb=mix(vec3(luma),result.rgb,colorCurve.a);\n#endif\n#ifdef DITHER\nfloat rand=getRand(gl_FragCoord.xy*vInverseScreenSize);float dither=mix(-ditherIntensity,ditherIntensity,rand);result.rgb=saturate(result.rgb+vec3(dither));\n#endif\n#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATEND\nreturn result;}`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const imageProcessingFunctions = { name, shader };\n"]}
@@ -107,10 +107,18 @@ depth: depth in view space (range [znear,zfar]])
107
107
  */
108
108
  vec3 computeViewPosFromUVDepth(vec2 texCoord,float depth,mat4 projection,mat4 invProjectionMatrix) {vec4 ndc;ndc.xy=texCoord*2.0-1.0;
109
109
  #ifdef SSRAYTRACE_RIGHT_HANDED_SCENE
110
+ #ifdef ORTHOGRAPHIC_CAMERA
111
+ ndc.z=-projection[2].z*depth+projection[3].z;
112
+ #else
110
113
  ndc.z=-projection[2].z-projection[3].z/depth;
114
+ #endif
115
+ #else
116
+ #ifdef ORTHOGRAPHIC_CAMERA
117
+ ndc.z=projection[2].z*depth+projection[3].z;
111
118
  #else
112
119
  ndc.z=projection[2].z+projection[3].z/depth;
113
120
  #endif
121
+ #endif
114
122
  ndc.w=1.0;vec4 eyePos=invProjectionMatrix*ndc;eyePos.xyz/=eyePos.w;return eyePos.xyz;}
115
123
  `;
116
124
  // Sideeffect
@@ -1 +1 @@
1
- {"version":3,"file":"screenSpaceRayTrace.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Gd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"screenSpaceRayTrace\";\nconst shader = `float distanceSquared(vec2 a,vec2 b) { a-=b; return dot(a,a); }\n/**\n\\param csOrigin Camera-space ray origin,which must be \nwithin the view volume and must have z>0.01 and project within the valid screen rectangle\n\\param csDirection Unit length camera-space ray direction\n\\param projectToPixelMatrix A projection matrix that maps to **pixel** coordinates \n(**not** [-1,+1] normalized device coordinates).\n\\param csZBuffer The camera-space Z buffer\n\\param csZBufferSize Dimensions of csZBuffer\n\\param csZThickness Camera space csZThickness to ascribe to each pixel in the depth buffer\n\\param nearPlaneZ Positive number. Doesn't have to be THE actual near plane,just a reasonable value\nfor clipping rays headed towards the camera\n\\param stride Step in horizontal or vertical pixels between samples. This is a float\nbecause integer math is slow on GPUs,but should be set to an integer>=1\n\\param jitterFraction Number between 0 and 1 for how far to bump the ray in stride units\nto conceal banding artifacts,plus the stride ray offset.\n\\param maxSteps Maximum number of iterations. Higher gives better images but may be slow\n\\param maxRayTraceDistance Maximum camera-space distance to trace before returning a miss\n\\param selfCollisionNumSkip Number of steps to skip at start when raytracing to avoid self collisions.\n1 is a reasonable value,depending on the scene you may need to set this value to 2\n\\param hitPixel Pixel coordinates of the first intersection with the scene\n\\param numIterations number of iterations performed\n\\param csHitPoint Camera space location of the ray hit\n*/\n#define inline\nbool traceScreenSpaceRay1(\nvec3 csOrigin,\nvec3 csDirection,\nmat4 projectToPixelMatrix,\nsampler2D csZBuffer,\nvec2 csZBufferSize,\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nsampler2D csZBackBuffer,\nfloat csZBackSizeFactor,\n#endif\nfloat csZThickness,\nfloat nearPlaneZ,\nfloat stride,\nfloat jitterFraction,\nfloat maxSteps,\nfloat maxRayTraceDistance,\nfloat selfCollisionNumSkip,\nout vec2 startPixel,\nout vec2 hitPixel,\nout vec3 csHitPoint,\nout float numIterations\n#ifdef SSRAYTRACE_DEBUG\n,out vec3 debugColor\n#endif\n)\n{\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)>-nearPlaneZ ? (-nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#else\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)<nearPlaneZ ? (nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#endif\nvec3 csEndPoint=csOrigin+csDirection*rayLength;hitPixel=vec2(-1.0,-1.0);vec4 H0=projectToPixelMatrix*vec4(csOrigin,1.0);vec4 H1=projectToPixelMatrix*vec4(csEndPoint,1.0);float k0=1.0/H0.w;float k1=1.0/H1.w;vec3 Q0=csOrigin*k0;vec3 Q1=csEndPoint*k1;vec2 P0=H0.xy*k0;vec2 P1=H1.xy*k1;\n#ifdef SSRAYTRACE_CLIP_TO_FRUSTUM\nfloat xMax=csZBufferSize.x-0.5,xMin=0.5,yMax=csZBufferSize.y-0.5,yMin=0.5;float alpha=0.0;if ((P1.y>yMax) || (P1.y<yMin)) {alpha=(P1.y-((P1.y>yMax) ? yMax : yMin))/(P1.y-P0.y);}\nif ((P1.x>xMax) || (P1.x<xMin)) {alpha=max(alpha,(P1.x-((P1.x>xMax) ? xMax : xMin))/(P1.x-P0.x));}\nP1=mix(P1,P0,alpha); k1=mix(k1,k0,alpha); Q1=mix(Q1,Q0,alpha);\n#endif\nP1+=vec2((distanceSquared(P0,P1)<0.0001) ? 0.01 : 0.0);vec2 delta=P1-P0;bool permute=false;if (abs(delta.x)<abs(delta.y)) { \npermute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }\nfloat stepDirection=sign(delta.x);float invdx=stepDirection/delta.x;vec2 dP=vec2(stepDirection,delta.y*invdx);vec3 dQ=(Q1-Q0)*invdx;float dk=(k1-k0)*invdx;float zMin=min(csEndPoint.z,csOrigin.z);float zMax=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;vec4 pqk=vec4(P0,Q0.z,k0);vec4 dPQK=vec4(dP,dQ.z,dk);startPixel=permute ? P0.yx : P0.xy;float prevZMaxEstimate=csOrigin.z;float rayZMin=prevZMaxEstimate,rayZMax=prevZMaxEstimate;float sceneZMax=rayZMax+1e4;float end=P1.x*stepDirection;bool hit=false;float stepCount;for (stepCount=0.0;stepCount<=selfCollisionNumSkip ||\n(pqk.x*stepDirection)<=end &&\nstepCount<maxSteps &&\n!hit &&\nsceneZMax != 0.0; \npqk+=dPQK,++stepCount)\n{hitPixel=permute ? pqk.yx : pqk.xy;rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;if (rayZMin>rayZMax) { \nfloat t=rayZMin; rayZMin=rayZMax; rayZMax=t;}\nsceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;hit=(rayZMax>=sceneBackZ-csZThickness) && (rayZMin<=sceneZMax);\n#else\nhit=(rayZMax>=sceneZMax-csZThickness) && (rayZMin<=sceneZMax);\n#endif\n#else\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax) && (sceneZMax != 0.0);\n#else\nhit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);\n#endif\n#endif\n}\npqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps || sceneZMax==0.0) {hit=false;}\n#ifdef SSRAYTRACE_ENABLE_REFINEMENT\nif (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;float invStride=1.0/stride;dPQK*=invStride;float refinementStepCount=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||\n(refinementStepCount<=stride*1.4) &&\n(rayZMax<sceneZMax) && (sceneZMax != 0.0);pqk+=dPQK,refinementStepCount+=1.0)\n{rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);hitPixel=permute ? pqk.yx : pqk.xy;sceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;}\npqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}\n#endif\nQ0.xy+=dQ.xy*stepCount;Q0.z=pqk.z;csHitPoint=Q0/pqk.w;numIterations=stepCount+1.0;\n#ifdef SSRAYTRACE_DEBUG\nif (((pqk.x+dPQK.x)*stepDirection)>end) {debugColor=vec3(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {debugColor=vec3(1,0,0);} else if (sceneZMax==0.0) {debugColor=vec3(1,1,0);} else {debugColor=vec3(0,stepCount/maxSteps,0);}\n#endif\nreturn hit;}\n/**\ntexCoord: in the [0,1] range\ndepth: depth in view space (range [znear,zfar]])\n*/\nvec3 computeViewPosFromUVDepth(vec2 texCoord,float depth,mat4 projection,mat4 invProjectionMatrix) {vec4 ndc;ndc.xy=texCoord*2.0-1.0;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nndc.z=-projection[2].z-projection[3].z/depth;\n#else\nndc.z=projection[2].z+projection[3].z/depth;\n#endif\nndc.w=1.0;vec4 eyePos=invProjectionMatrix*ndc;eyePos.xyz/=eyePos.w;return eyePos.xyz;}\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const screenSpaceRayTrace = { name, shader };\n"]}
1
+ {"version":3,"file":"screenSpaceRayTrace.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuHd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"screenSpaceRayTrace\";\nconst shader = `float distanceSquared(vec2 a,vec2 b) { a-=b; return dot(a,a); }\n/**\n\\param csOrigin Camera-space ray origin,which must be \nwithin the view volume and must have z>0.01 and project within the valid screen rectangle\n\\param csDirection Unit length camera-space ray direction\n\\param projectToPixelMatrix A projection matrix that maps to **pixel** coordinates \n(**not** [-1,+1] normalized device coordinates).\n\\param csZBuffer The camera-space Z buffer\n\\param csZBufferSize Dimensions of csZBuffer\n\\param csZThickness Camera space csZThickness to ascribe to each pixel in the depth buffer\n\\param nearPlaneZ Positive number. Doesn't have to be THE actual near plane,just a reasonable value\nfor clipping rays headed towards the camera\n\\param stride Step in horizontal or vertical pixels between samples. This is a float\nbecause integer math is slow on GPUs,but should be set to an integer>=1\n\\param jitterFraction Number between 0 and 1 for how far to bump the ray in stride units\nto conceal banding artifacts,plus the stride ray offset.\n\\param maxSteps Maximum number of iterations. Higher gives better images but may be slow\n\\param maxRayTraceDistance Maximum camera-space distance to trace before returning a miss\n\\param selfCollisionNumSkip Number of steps to skip at start when raytracing to avoid self collisions.\n1 is a reasonable value,depending on the scene you may need to set this value to 2\n\\param hitPixel Pixel coordinates of the first intersection with the scene\n\\param numIterations number of iterations performed\n\\param csHitPoint Camera space location of the ray hit\n*/\n#define inline\nbool traceScreenSpaceRay1(\nvec3 csOrigin,\nvec3 csDirection,\nmat4 projectToPixelMatrix,\nsampler2D csZBuffer,\nvec2 csZBufferSize,\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nsampler2D csZBackBuffer,\nfloat csZBackSizeFactor,\n#endif\nfloat csZThickness,\nfloat nearPlaneZ,\nfloat stride,\nfloat jitterFraction,\nfloat maxSteps,\nfloat maxRayTraceDistance,\nfloat selfCollisionNumSkip,\nout vec2 startPixel,\nout vec2 hitPixel,\nout vec3 csHitPoint,\nout float numIterations\n#ifdef SSRAYTRACE_DEBUG\n,out vec3 debugColor\n#endif\n)\n{\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)>-nearPlaneZ ? (-nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#else\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)<nearPlaneZ ? (nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#endif\nvec3 csEndPoint=csOrigin+csDirection*rayLength;hitPixel=vec2(-1.0,-1.0);vec4 H0=projectToPixelMatrix*vec4(csOrigin,1.0);vec4 H1=projectToPixelMatrix*vec4(csEndPoint,1.0);float k0=1.0/H0.w;float k1=1.0/H1.w;vec3 Q0=csOrigin*k0;vec3 Q1=csEndPoint*k1;vec2 P0=H0.xy*k0;vec2 P1=H1.xy*k1;\n#ifdef SSRAYTRACE_CLIP_TO_FRUSTUM\nfloat xMax=csZBufferSize.x-0.5,xMin=0.5,yMax=csZBufferSize.y-0.5,yMin=0.5;float alpha=0.0;if ((P1.y>yMax) || (P1.y<yMin)) {alpha=(P1.y-((P1.y>yMax) ? yMax : yMin))/(P1.y-P0.y);}\nif ((P1.x>xMax) || (P1.x<xMin)) {alpha=max(alpha,(P1.x-((P1.x>xMax) ? xMax : xMin))/(P1.x-P0.x));}\nP1=mix(P1,P0,alpha); k1=mix(k1,k0,alpha); Q1=mix(Q1,Q0,alpha);\n#endif\nP1+=vec2((distanceSquared(P0,P1)<0.0001) ? 0.01 : 0.0);vec2 delta=P1-P0;bool permute=false;if (abs(delta.x)<abs(delta.y)) { \npermute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }\nfloat stepDirection=sign(delta.x);float invdx=stepDirection/delta.x;vec2 dP=vec2(stepDirection,delta.y*invdx);vec3 dQ=(Q1-Q0)*invdx;float dk=(k1-k0)*invdx;float zMin=min(csEndPoint.z,csOrigin.z);float zMax=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;vec4 pqk=vec4(P0,Q0.z,k0);vec4 dPQK=vec4(dP,dQ.z,dk);startPixel=permute ? P0.yx : P0.xy;float prevZMaxEstimate=csOrigin.z;float rayZMin=prevZMaxEstimate,rayZMax=prevZMaxEstimate;float sceneZMax=rayZMax+1e4;float end=P1.x*stepDirection;bool hit=false;float stepCount;for (stepCount=0.0;stepCount<=selfCollisionNumSkip ||\n(pqk.x*stepDirection)<=end &&\nstepCount<maxSteps &&\n!hit &&\nsceneZMax != 0.0; \npqk+=dPQK,++stepCount)\n{hitPixel=permute ? pqk.yx : pqk.xy;rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;if (rayZMin>rayZMax) { \nfloat t=rayZMin; rayZMin=rayZMax; rayZMax=t;}\nsceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;hit=(rayZMax>=sceneBackZ-csZThickness) && (rayZMin<=sceneZMax);\n#else\nhit=(rayZMax>=sceneZMax-csZThickness) && (rayZMin<=sceneZMax);\n#endif\n#else\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax) && (sceneZMax != 0.0);\n#else\nhit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);\n#endif\n#endif\n}\npqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps || sceneZMax==0.0) {hit=false;}\n#ifdef SSRAYTRACE_ENABLE_REFINEMENT\nif (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;float invStride=1.0/stride;dPQK*=invStride;float refinementStepCount=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||\n(refinementStepCount<=stride*1.4) &&\n(rayZMax<sceneZMax) && (sceneZMax != 0.0);pqk+=dPQK,refinementStepCount+=1.0)\n{rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);hitPixel=permute ? pqk.yx : pqk.xy;sceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;}\npqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}\n#endif\nQ0.xy+=dQ.xy*stepCount;Q0.z=pqk.z;csHitPoint=Q0/pqk.w;numIterations=stepCount+1.0;\n#ifdef SSRAYTRACE_DEBUG\nif (((pqk.x+dPQK.x)*stepDirection)>end) {debugColor=vec3(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {debugColor=vec3(1,0,0);} else if (sceneZMax==0.0) {debugColor=vec3(1,1,0);} else {debugColor=vec3(0,stepCount/maxSteps,0);}\n#endif\nreturn hit;}\n/**\ntexCoord: in the [0,1] range\ndepth: depth in view space (range [znear,zfar]])\n*/\nvec3 computeViewPosFromUVDepth(vec2 texCoord,float depth,mat4 projection,mat4 invProjectionMatrix) {vec4 ndc;ndc.xy=texCoord*2.0-1.0;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef ORTHOGRAPHIC_CAMERA\nndc.z=-projection[2].z*depth+projection[3].z;\n#else\nndc.z=-projection[2].z-projection[3].z/depth;\n#endif\n#else\n#ifdef ORTHOGRAPHIC_CAMERA\nndc.z=projection[2].z*depth+projection[3].z;\n#else\nndc.z=projection[2].z+projection[3].z/depth;\n#endif\n#endif\nndc.w=1.0;vec4 eyePos=invProjectionMatrix*ndc;eyePos.xyz/=eyePos.w;return eyePos.xyz;}\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const screenSpaceRayTrace = { name, shader };\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const lodPixelShader: {
3
+ name: string;
4
+ shader: string;
5
+ };
@@ -0,0 +1,12 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "../Engines/shaderStore.js";
3
+ const name = "lodPixelShader";
4
+ const shader = `#extension GL_EXT_shader_texture_lod : enable
5
+ precision highp float;const float GammaEncodePowerApprox=1.0/2.2;varying vec2 vUV;uniform sampler2D textureSampler;uniform float lod;uniform vec2 texSize;uniform bool gamma;void main(void)
6
+ {gl_FragColor=textureLod(textureSampler,vUV,lod);if (!gamma) {gl_FragColor.rgb=pow(gl_FragColor.rgb,vec3(GammaEncodePowerApprox));}}
7
+ `;
8
+ // Sideeffect
9
+ ShaderStore.ShadersStore[name] = shader;
10
+ /** @internal */
11
+ export const lodPixelShader = { name, shader };
12
+ //# sourceMappingURL=lod.fragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lod.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/lod.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,MAAM,GAAG;;;CAGd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,gBAAgB;AAChB,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"lodPixelShader\";\nconst shader = `#extension GL_EXT_shader_texture_lod : enable\nprecision highp float;const float GammaEncodePowerApprox=1.0/2.2;varying vec2 vUV;uniform sampler2D textureSampler;uniform float lod;uniform vec2 texSize;uniform bool gamma;void main(void)\n{gl_FragColor=textureLod(textureSampler,vUV,lod);if (!gamma) {gl_FragColor.rgb=pow(gl_FragColor.rgb,vec3(GammaEncodePowerApprox));}}\n`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const lodPixelShader = { name, shader };\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const lodCubePixelShader: {
3
+ name: string;
4
+ shader: string;
5
+ };