@babylonjs/core 7.2.2 → 7.3.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 (620) hide show
  1. package/Animations/runtimeAnimation.d.ts +1 -0
  2. package/Animations/runtimeAnimation.js +12 -3
  3. package/Animations/runtimeAnimation.js.map +1 -1
  4. package/Audio/audioEngine.js +2 -2
  5. package/Audio/audioEngine.js.map +1 -1
  6. package/Bones/boneLookController.js +3 -0
  7. package/Bones/boneLookController.js.map +1 -1
  8. package/Buffers/buffer.d.ts +5 -5
  9. package/Buffers/buffer.js.map +1 -1
  10. package/Buffers/storageBuffer.d.ts +2 -2
  11. package/Buffers/storageBuffer.js.map +1 -1
  12. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
  13. package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
  14. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  15. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  16. package/Compute/computeEffect.d.ts +3 -3
  17. package/Compute/computeEffect.js.map +1 -1
  18. package/Compute/computeShader.d.ts +10 -2
  19. package/Compute/computeShader.js +53 -35
  20. package/Compute/computeShader.js.map +1 -1
  21. package/DeviceInput/InputDevices/deviceSourceManager.d.ts +2 -2
  22. package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
  23. package/DeviceInput/internalDeviceSourceManager.d.ts +4 -4
  24. package/DeviceInput/internalDeviceSourceManager.js.map +1 -1
  25. package/DeviceInput/webDeviceInputSystem.d.ts +2 -2
  26. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  27. package/Engines/AbstractEngine/abstractEngine.alpha.d.ts +10 -0
  28. package/Engines/AbstractEngine/abstractEngine.alpha.js +29 -0
  29. package/Engines/AbstractEngine/abstractEngine.alpha.js.map +1 -0
  30. package/Engines/AbstractEngine/abstractEngine.cubeTexture.d.ts +17 -0
  31. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +138 -0
  32. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -0
  33. package/Engines/AbstractEngine/abstractEngine.dom.d.ts +61 -0
  34. package/Engines/AbstractEngine/abstractEngine.dom.js +27 -0
  35. package/Engines/AbstractEngine/abstractEngine.dom.js.map +1 -0
  36. package/Engines/AbstractEngine/abstractEngine.loadingScreen.d.ts +30 -0
  37. package/Engines/AbstractEngine/abstractEngine.loadingScreen.js +48 -0
  38. package/Engines/AbstractEngine/abstractEngine.loadingScreen.js.map +1 -0
  39. package/Engines/AbstractEngine/abstractEngine.query.d.ts +122 -0
  40. package/Engines/AbstractEngine/abstractEngine.query.js +175 -0
  41. package/Engines/AbstractEngine/abstractEngine.query.js.map +1 -0
  42. package/Engines/AbstractEngine/abstractEngine.renderPass.d.ts +26 -0
  43. package/Engines/AbstractEngine/abstractEngine.renderPass.js +29 -0
  44. package/Engines/AbstractEngine/abstractEngine.renderPass.js.map +1 -0
  45. package/Engines/AbstractEngine/abstractEngine.states.d.ts +162 -0
  46. package/Engines/AbstractEngine/abstractEngine.states.js +105 -0
  47. package/Engines/AbstractEngine/abstractEngine.states.js.map +1 -0
  48. package/Engines/AbstractEngine/abstractEngine.texture.d.ts +16 -0
  49. package/Engines/AbstractEngine/abstractEngine.texture.js +11 -0
  50. package/Engines/AbstractEngine/abstractEngine.texture.js.map +1 -0
  51. package/Engines/AbstractEngine/index.d.ts +8 -0
  52. package/Engines/AbstractEngine/index.js +10 -0
  53. package/Engines/AbstractEngine/index.js.map +1 -0
  54. package/Engines/Extensions/engine.alpha.d.ts +0 -24
  55. package/Engines/Extensions/engine.alpha.js +0 -35
  56. package/Engines/Extensions/engine.alpha.js.map +1 -1
  57. package/Engines/Extensions/engine.computeShader.d.ts +15 -2
  58. package/Engines/Extensions/engine.computeShader.js +5 -1
  59. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  60. package/Engines/Extensions/engine.cubeTexture.d.ts +0 -8
  61. package/Engines/Extensions/engine.cubeTexture.js +2 -135
  62. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  63. package/Engines/Extensions/engine.debugging.d.ts +2 -2
  64. package/Engines/Extensions/engine.debugging.js +5 -5
  65. package/Engines/Extensions/engine.debugging.js.map +1 -1
  66. package/Engines/Extensions/engine.dynamicTexture.js +3 -2
  67. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  68. package/Engines/Extensions/engine.multiview.js.map +1 -1
  69. package/Engines/Extensions/engine.query.d.ts +5 -120
  70. package/Engines/Extensions/engine.query.js +14 -150
  71. package/Engines/Extensions/engine.query.js.map +1 -1
  72. package/Engines/Extensions/engine.renderTarget.js +0 -9
  73. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  74. package/Engines/Extensions/engine.views.d.ts +3 -2
  75. package/Engines/Extensions/engine.views.js.map +1 -1
  76. package/Engines/Processors/iShaderProcessor.d.ts +2 -2
  77. package/Engines/Processors/iShaderProcessor.js.map +1 -1
  78. package/Engines/Processors/shaderProcessor.d.ts +3 -3
  79. package/Engines/Processors/shaderProcessor.js.map +1 -1
  80. package/Engines/WebGL/webGLRenderTargetWrapper.js +12 -9
  81. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  82. package/Engines/WebGL/webGLShaderProcessors.d.ts +2 -2
  83. package/Engines/WebGL/webGLShaderProcessors.js.map +1 -1
  84. package/Engines/WebGPU/Extensions/engine.alpha.d.ts +35 -0
  85. package/Engines/WebGPU/Extensions/engine.alpha.js +4 -4
  86. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  87. package/Engines/WebGPU/Extensions/engine.computeShader.d.ts +9 -0
  88. package/Engines/WebGPU/Extensions/engine.computeShader.js +13 -2
  89. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  90. package/Engines/WebGPU/Extensions/engine.cubeTexture.d.ts +78 -1
  91. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  92. package/Engines/WebGPU/Extensions/engine.dynamicTexture.d.ts +27 -1
  93. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +3 -3
  94. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  95. package/Engines/WebGPU/Extensions/engine.externalTexture.d.ts +16 -0
  96. package/Engines/WebGPU/Extensions/engine.externalTexture.js.map +1 -1
  97. package/Engines/WebGPU/Extensions/engine.multiRender.d.ts +55 -1
  98. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  99. package/Engines/WebGPU/Extensions/engine.query.d.ts +1 -1
  100. package/Engines/WebGPU/Extensions/engine.query.js +1 -0
  101. package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
  102. package/Engines/WebGPU/Extensions/engine.rawTexture.d.ts +185 -1
  103. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  104. package/Engines/WebGPU/Extensions/engine.readTexture.d.ts +10 -1
  105. package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
  106. package/Engines/WebGPU/Extensions/engine.renderTarget.d.ts +38 -1
  107. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  108. package/Engines/WebGPU/Extensions/engine.renderTargetCube.d.ts +13 -1
  109. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
  110. package/Engines/WebGPU/Extensions/engine.storageBuffer.d.ts +38 -1
  111. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  112. package/Engines/WebGPU/Extensions/engine.textureSampler.d.ts +10 -0
  113. package/Engines/WebGPU/Extensions/engine.textureSampler.js.map +1 -1
  114. package/Engines/WebGPU/Extensions/engine.videoTexture.d.ts +14 -1
  115. package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
  116. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.d.ts +2 -2
  117. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  118. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +2 -0
  119. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +2 -0
  120. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  121. package/Engines/abstractEngine.d.ts +1695 -0
  122. package/Engines/abstractEngine.js +1362 -0
  123. package/Engines/abstractEngine.js.map +1 -0
  124. package/Engines/engine.common.d.ts +39 -0
  125. package/Engines/engine.common.js +226 -0
  126. package/Engines/engine.common.js.map +1 -0
  127. package/Engines/engine.d.ts +40 -447
  128. package/Engines/engine.js +64 -810
  129. package/Engines/engine.js.map +1 -1
  130. package/Engines/engineFactory.d.ts +2 -2
  131. package/Engines/engineFactory.js.map +1 -1
  132. package/Engines/engineStore.d.ts +4 -4
  133. package/Engines/engineStore.js.map +1 -1
  134. package/Engines/index.d.ts +3 -0
  135. package/Engines/index.js +3 -0
  136. package/Engines/index.js.map +1 -1
  137. package/Engines/nativeEngine.d.ts +1 -1
  138. package/Engines/nativeEngine.js +2 -1
  139. package/Engines/nativeEngine.js.map +1 -1
  140. package/Engines/nullEngine.d.ts +2 -2
  141. package/Engines/nullEngine.js +2 -3
  142. package/Engines/nullEngine.js.map +1 -1
  143. package/Engines/renderTargetWrapper.d.ts +3 -3
  144. package/Engines/renderTargetWrapper.js.map +1 -1
  145. package/Engines/thinEngine.d.ts +34 -597
  146. package/Engines/thinEngine.js +85 -1143
  147. package/Engines/thinEngine.js.map +1 -1
  148. package/Engines/webgpuEngine.d.ts +147 -109
  149. package/Engines/webgpuEngine.js +249 -162
  150. package/Engines/webgpuEngine.js.map +1 -1
  151. package/Instrumentation/engineInstrumentation.d.ts +5 -4
  152. package/Instrumentation/engineInstrumentation.js.map +1 -1
  153. package/Layers/effectLayer.d.ts +2 -2
  154. package/Layers/effectLayer.js +3 -3
  155. package/Layers/effectLayer.js.map +1 -1
  156. package/Layers/effectLayerSceneComponent.js.map +1 -1
  157. package/Layers/glowLayer.js +3 -3
  158. package/Layers/glowLayer.js.map +1 -1
  159. package/Layers/highlightLayer.js +3 -3
  160. package/Layers/highlightLayer.js.map +1 -1
  161. package/Layers/layerSceneComponent.js.map +1 -1
  162. package/Loading/loadingScreen.js +2 -2
  163. package/Loading/loadingScreen.js.map +1 -1
  164. package/Loading/sceneLoader.d.ts +3 -3
  165. package/Loading/sceneLoader.js +1 -1
  166. package/Loading/sceneLoader.js.map +1 -1
  167. package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
  168. package/Materials/Node/Blocks/Dual/clipPlanesBlock.d.ts +1 -1
  169. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +6 -6
  170. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
  171. package/Materials/Node/Blocks/Dual/currentScreenBlock.d.ts +2 -3
  172. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +5 -5
  173. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  174. package/Materials/Node/Blocks/Dual/fogBlock.d.ts +1 -1
  175. package/Materials/Node/Blocks/Dual/fogBlock.js +4 -4
  176. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  177. package/Materials/Node/Blocks/Dual/lightBlock.js +4 -4
  178. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  179. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.d.ts +1 -1
  180. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +8 -7
  181. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  182. package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +1 -1
  183. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +9 -5
  184. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
  185. package/Materials/Node/Blocks/Dual/textureBlock.d.ts +4 -2
  186. package/Materials/Node/Blocks/Dual/textureBlock.js +43 -21
  187. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  188. package/Materials/Node/Blocks/Fragment/TBNBlock.js +3 -3
  189. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  190. package/Materials/Node/Blocks/Fragment/derivativeBlock.js +9 -2
  191. package/Materials/Node/Blocks/Fragment/derivativeBlock.js.map +1 -1
  192. package/Materials/Node/Blocks/Fragment/fragCoordBlock.js +1 -1
  193. package/Materials/Node/Blocks/Fragment/fragCoordBlock.js.map +1 -1
  194. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +1 -1
  195. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +16 -8
  196. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  197. package/Materials/Node/Blocks/Fragment/frontFacingBlock.js +1 -1
  198. package/Materials/Node/Blocks/Fragment/frontFacingBlock.js.map +1 -1
  199. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +2 -2
  200. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  201. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +3 -3
  202. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  203. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.d.ts +1 -1
  204. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +4 -4
  205. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  206. package/Materials/Node/Blocks/Fragment/screenSizeBlock.d.ts +1 -1
  207. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js +2 -2
  208. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js.map +1 -1
  209. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +3 -3
  210. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -1
  211. package/Materials/Node/Blocks/Fragment/shadowMapBlock.d.ts +1 -1
  212. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js +4 -4
  213. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
  214. package/Materials/Node/Blocks/Fragment/twirlBlock.js +9 -9
  215. package/Materials/Node/Blocks/Fragment/twirlBlock.js.map +1 -1
  216. package/Materials/Node/Blocks/Input/inputBlock.d.ts +6 -1
  217. package/Materials/Node/Blocks/Input/inputBlock.js +36 -12
  218. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  219. package/Materials/Node/Blocks/PBR/anisotropyBlock.d.ts +1 -1
  220. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +1 -1
  221. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  222. package/Materials/Node/Blocks/PBR/clearCoatBlock.d.ts +1 -1
  223. package/Materials/Node/Blocks/PBR/clearCoatBlock.js +3 -3
  224. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  225. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +1 -1
  226. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +9 -9
  227. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  228. package/Materials/Node/Blocks/PBR/reflectionBlock.d.ts +1 -1
  229. package/Materials/Node/Blocks/PBR/reflectionBlock.js +21 -21
  230. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  231. package/Materials/Node/Blocks/PBR/refractionBlock.d.ts +1 -1
  232. package/Materials/Node/Blocks/PBR/refractionBlock.js +6 -6
  233. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  234. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +5 -0
  235. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  236. package/Materials/Node/Blocks/Particle/particleBlendMultiplyBlock.js +2 -2
  237. package/Materials/Node/Blocks/Particle/particleBlendMultiplyBlock.js.map +1 -1
  238. package/Materials/Node/Blocks/Particle/particleRampGradientBlock.js +3 -3
  239. package/Materials/Node/Blocks/Particle/particleRampGradientBlock.js.map +1 -1
  240. package/Materials/Node/Blocks/Particle/particleTextureBlock.js +1 -1
  241. package/Materials/Node/Blocks/Particle/particleTextureBlock.js.map +1 -1
  242. package/Materials/Node/Blocks/Teleport/teleportOutBlock.js +1 -1
  243. package/Materials/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
  244. package/Materials/Node/Blocks/Vertex/bonesBlock.js +2 -2
  245. package/Materials/Node/Blocks/Vertex/bonesBlock.js.map +1 -1
  246. package/Materials/Node/Blocks/Vertex/instancesBlock.js +5 -5
  247. package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
  248. package/Materials/Node/Blocks/Vertex/lightInformationBlock.d.ts +1 -1
  249. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +12 -12
  250. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
  251. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +7 -7
  252. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  253. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.d.ts +1 -1
  254. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js +10 -3
  255. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
  256. package/Materials/Node/Blocks/addBlock.js +2 -1
  257. package/Materials/Node/Blocks/addBlock.js.map +1 -1
  258. package/Materials/Node/Blocks/arcTan2Block.js +3 -1
  259. package/Materials/Node/Blocks/arcTan2Block.js.map +1 -1
  260. package/Materials/Node/Blocks/clampBlock.js +1 -1
  261. package/Materials/Node/Blocks/clampBlock.js.map +1 -1
  262. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  263. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  264. package/Materials/Node/Blocks/colorMergerBlock.js +9 -7
  265. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  266. package/Materials/Node/Blocks/colorSplitterBlock.js +5 -5
  267. package/Materials/Node/Blocks/colorSplitterBlock.js.map +1 -1
  268. package/Materials/Node/Blocks/conditionalBlock.js +18 -12
  269. package/Materials/Node/Blocks/conditionalBlock.js.map +1 -1
  270. package/Materials/Node/Blocks/crossBlock.js +1 -1
  271. package/Materials/Node/Blocks/crossBlock.js.map +1 -1
  272. package/Materials/Node/Blocks/curveBlock.js +48 -53
  273. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  274. package/Materials/Node/Blocks/customBlock.js +1 -1
  275. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  276. package/Materials/Node/Blocks/desaturateBlock.js +5 -4
  277. package/Materials/Node/Blocks/desaturateBlock.js.map +1 -1
  278. package/Materials/Node/Blocks/distanceBlock.js +1 -1
  279. package/Materials/Node/Blocks/distanceBlock.js.map +1 -1
  280. package/Materials/Node/Blocks/divideBlock.js +2 -1
  281. package/Materials/Node/Blocks/divideBlock.js.map +1 -1
  282. package/Materials/Node/Blocks/dotBlock.js +1 -1
  283. package/Materials/Node/Blocks/dotBlock.js.map +1 -1
  284. package/Materials/Node/Blocks/elbowBlock.js +1 -1
  285. package/Materials/Node/Blocks/elbowBlock.js.map +1 -1
  286. package/Materials/Node/Blocks/fresnelBlock.js +1 -1
  287. package/Materials/Node/Blocks/fresnelBlock.js.map +1 -1
  288. package/Materials/Node/Blocks/gradientBlock.js +8 -7
  289. package/Materials/Node/Blocks/gradientBlock.js.map +1 -1
  290. package/Materials/Node/Blocks/lengthBlock.js +1 -1
  291. package/Materials/Node/Blocks/lengthBlock.js.map +1 -1
  292. package/Materials/Node/Blocks/lerpBlock.js +1 -1
  293. package/Materials/Node/Blocks/lerpBlock.js.map +1 -1
  294. package/Materials/Node/Blocks/matrixBuilderBlock.js +1 -1
  295. package/Materials/Node/Blocks/matrixBuilderBlock.js.map +1 -1
  296. package/Materials/Node/Blocks/matrixDeterminantBlock.js +1 -1
  297. package/Materials/Node/Blocks/matrixDeterminantBlock.js.map +1 -1
  298. package/Materials/Node/Blocks/matrixTransposeBlock.js +1 -1
  299. package/Materials/Node/Blocks/matrixTransposeBlock.js.map +1 -1
  300. package/Materials/Node/Blocks/maxBlock.js +1 -1
  301. package/Materials/Node/Blocks/maxBlock.js.map +1 -1
  302. package/Materials/Node/Blocks/meshAttributeExistsBlock.js +1 -1
  303. package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
  304. package/Materials/Node/Blocks/minBlock.js +1 -1
  305. package/Materials/Node/Blocks/minBlock.js.map +1 -1
  306. package/Materials/Node/Blocks/modBlock.js +1 -1
  307. package/Materials/Node/Blocks/modBlock.js.map +1 -1
  308. package/Materials/Node/Blocks/multiplyBlock.js +2 -1
  309. package/Materials/Node/Blocks/multiplyBlock.js.map +1 -1
  310. package/Materials/Node/Blocks/nLerpBlock.js +1 -1
  311. package/Materials/Node/Blocks/nLerpBlock.js.map +1 -1
  312. package/Materials/Node/Blocks/negateBlock.js +1 -1
  313. package/Materials/Node/Blocks/negateBlock.js.map +1 -1
  314. package/Materials/Node/Blocks/normalBlendBlock.js +1 -1
  315. package/Materials/Node/Blocks/normalBlendBlock.js.map +1 -1
  316. package/Materials/Node/Blocks/normalizeBlock.js +1 -1
  317. package/Materials/Node/Blocks/normalizeBlock.js.map +1 -1
  318. package/Materials/Node/Blocks/oneMinusBlock.js +1 -1
  319. package/Materials/Node/Blocks/oneMinusBlock.js.map +1 -1
  320. package/Materials/Node/Blocks/posterizeBlock.js +1 -1
  321. package/Materials/Node/Blocks/posterizeBlock.js.map +1 -1
  322. package/Materials/Node/Blocks/powBlock.js +1 -1
  323. package/Materials/Node/Blocks/powBlock.js.map +1 -1
  324. package/Materials/Node/Blocks/randomNumberBlock.js +1 -1
  325. package/Materials/Node/Blocks/randomNumberBlock.js.map +1 -1
  326. package/Materials/Node/Blocks/reciprocalBlock.js +2 -2
  327. package/Materials/Node/Blocks/reciprocalBlock.js.map +1 -1
  328. package/Materials/Node/Blocks/reflectBlock.js +1 -1
  329. package/Materials/Node/Blocks/reflectBlock.js.map +1 -1
  330. package/Materials/Node/Blocks/refractBlock.js +1 -1
  331. package/Materials/Node/Blocks/refractBlock.js.map +1 -1
  332. package/Materials/Node/Blocks/remapBlock.js +1 -1
  333. package/Materials/Node/Blocks/remapBlock.js.map +1 -1
  334. package/Materials/Node/Blocks/replaceColorBlock.js +1 -1
  335. package/Materials/Node/Blocks/replaceColorBlock.js.map +1 -1
  336. package/Materials/Node/Blocks/rotate2dBlock.js +1 -1
  337. package/Materials/Node/Blocks/rotate2dBlock.js.map +1 -1
  338. package/Materials/Node/Blocks/scaleBlock.js +1 -1
  339. package/Materials/Node/Blocks/scaleBlock.js.map +1 -1
  340. package/Materials/Node/Blocks/simplexPerlin3DBlock.js +1 -1
  341. package/Materials/Node/Blocks/simplexPerlin3DBlock.js.map +1 -1
  342. package/Materials/Node/Blocks/smoothStepBlock.js +3 -2
  343. package/Materials/Node/Blocks/smoothStepBlock.js.map +1 -1
  344. package/Materials/Node/Blocks/stepBlock.js +1 -1
  345. package/Materials/Node/Blocks/stepBlock.js.map +1 -1
  346. package/Materials/Node/Blocks/subtractBlock.js +2 -1
  347. package/Materials/Node/Blocks/subtractBlock.js.map +1 -1
  348. package/Materials/Node/Blocks/transformBlock.js +18 -10
  349. package/Materials/Node/Blocks/transformBlock.js.map +1 -1
  350. package/Materials/Node/Blocks/triPlanarBlock.d.ts +1 -1
  351. package/Materials/Node/Blocks/triPlanarBlock.js +2 -2
  352. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  353. package/Materials/Node/Blocks/trigonometryBlock.js +1 -1
  354. package/Materials/Node/Blocks/trigonometryBlock.js.map +1 -1
  355. package/Materials/Node/Blocks/vectorMergerBlock.js +30 -27
  356. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  357. package/Materials/Node/Blocks/vectorSplitterBlock.js +9 -8
  358. package/Materials/Node/Blocks/vectorSplitterBlock.js.map +1 -1
  359. package/Materials/Node/Blocks/viewDirectionBlock.js +1 -1
  360. package/Materials/Node/Blocks/viewDirectionBlock.js.map +1 -1
  361. package/Materials/Node/Blocks/voronoiNoiseBlock.js +19 -8
  362. package/Materials/Node/Blocks/voronoiNoiseBlock.js.map +1 -1
  363. package/Materials/Node/Blocks/waveBlock.js +3 -3
  364. package/Materials/Node/Blocks/waveBlock.js.map +1 -1
  365. package/Materials/Node/Blocks/worleyNoise3DBlock.js +3 -3
  366. package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
  367. package/Materials/Node/nodeMaterial.d.ts +9 -3
  368. package/Materials/Node/nodeMaterial.js +29 -4
  369. package/Materials/Node/nodeMaterial.js.map +1 -1
  370. package/Materials/Node/nodeMaterialBlock.d.ts +0 -1
  371. package/Materials/Node/nodeMaterialBlock.js +6 -6
  372. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  373. package/Materials/Node/nodeMaterialBlockConnectionPoint.d.ts +4 -0
  374. package/Materials/Node/nodeMaterialBlockConnectionPoint.js +12 -0
  375. package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
  376. package/Materials/Node/nodeMaterialBuildState.d.ts +35 -3
  377. package/Materials/Node/nodeMaterialBuildState.js +169 -16
  378. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  379. package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +18 -4
  380. package/Materials/PBR/pbrSubSurfaceConfiguration.js +60 -9
  381. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  382. package/Materials/Textures/Filtering/hdrFiltering.d.ts +2 -2
  383. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  384. package/Materials/Textures/Loaders/basisTextureLoader.js +2 -2
  385. package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
  386. package/Materials/Textures/MultiviewRenderTarget.d.ts +1 -0
  387. package/Materials/Textures/MultiviewRenderTarget.js +1 -0
  388. package/Materials/Textures/MultiviewRenderTarget.js.map +1 -1
  389. package/Materials/Textures/Procedurals/proceduralTexture.js +1 -1
  390. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  391. package/Materials/Textures/baseTexture.d.ts +3 -3
  392. package/Materials/Textures/baseTexture.js.map +1 -1
  393. package/Materials/Textures/colorGradingTexture.d.ts +2 -2
  394. package/Materials/Textures/colorGradingTexture.js.map +1 -1
  395. package/Materials/Textures/cubeTexture.d.ts +3 -2
  396. package/Materials/Textures/cubeTexture.js +1 -0
  397. package/Materials/Textures/cubeTexture.js.map +1 -1
  398. package/Materials/Textures/hdrCubeTexture.d.ts +2 -2
  399. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  400. package/Materials/Textures/htmlElementTexture.d.ts +2 -2
  401. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  402. package/Materials/Textures/internalTexture.d.ts +3 -3
  403. package/Materials/Textures/internalTexture.js.map +1 -1
  404. package/Materials/Textures/rawTexture.d.ts +10 -10
  405. package/Materials/Textures/rawTexture.js.map +1 -1
  406. package/Materials/Textures/renderTargetTexture.d.ts +4 -4
  407. package/Materials/Textures/renderTargetTexture.js +4 -4
  408. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  409. package/Materials/Textures/texture.d.ts +2 -2
  410. package/Materials/Textures/texture.js.map +1 -1
  411. package/Materials/Textures/thinTexture.d.ts +3 -3
  412. package/Materials/Textures/thinTexture.js +1 -1
  413. package/Materials/Textures/thinTexture.js.map +1 -1
  414. package/Materials/drawWrapper.d.ts +2 -3
  415. package/Materials/drawWrapper.functions.d.ts +8 -0
  416. package/Materials/drawWrapper.functions.js +9 -0
  417. package/Materials/drawWrapper.functions.js.map +1 -0
  418. package/Materials/drawWrapper.js +0 -3
  419. package/Materials/drawWrapper.js.map +1 -1
  420. package/Materials/effect.d.ts +4 -5
  421. package/Materials/effect.js.map +1 -1
  422. package/Materials/effectRenderer.d.ts +4 -4
  423. package/Materials/effectRenderer.js.map +1 -1
  424. package/Materials/index.d.ts +1 -0
  425. package/Materials/index.js +1 -0
  426. package/Materials/index.js.map +1 -1
  427. package/Materials/materialFlags.d.ts +6 -0
  428. package/Materials/materialFlags.js +15 -1
  429. package/Materials/materialFlags.js.map +1 -1
  430. package/Materials/materialHelper.functions.d.ts +2 -2
  431. package/Materials/materialHelper.functions.js.map +1 -1
  432. package/Materials/materialPluginBase.d.ts +4 -4
  433. package/Materials/materialPluginBase.js.map +1 -1
  434. package/Materials/materialPluginManager.d.ts +2 -2
  435. package/Materials/materialPluginManager.js.map +1 -1
  436. package/Materials/meshDebugPluginMaterial.js +1 -1
  437. package/Materials/meshDebugPluginMaterial.js.map +1 -1
  438. package/Materials/uniformBuffer.d.ts +2 -2
  439. package/Materials/uniformBuffer.js.map +1 -1
  440. package/Meshes/Builders/greasedLineBuilder.d.ts +6 -0
  441. package/Meshes/Builders/greasedLineBuilder.js +15 -8
  442. package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
  443. package/Meshes/Compression/meshoptCompression.js +4 -3
  444. package/Meshes/Compression/meshoptCompression.js.map +1 -1
  445. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +1 -1
  446. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  447. package/Meshes/GreasedLine/greasedLineBaseMesh.d.ts +2 -2
  448. package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
  449. package/Meshes/GreasedLine/greasedLineMesh.js +1 -1
  450. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  451. package/Meshes/geometry.d.ts +2 -2
  452. package/Meshes/geometry.js +3 -2
  453. package/Meshes/geometry.js.map +1 -1
  454. package/Meshes/instancedMesh.js.map +1 -1
  455. package/Meshes/mesh.d.ts +3 -3
  456. package/Meshes/mesh.js.map +1 -1
  457. package/Meshes/subMesh.d.ts +2 -2
  458. package/Meshes/subMesh.js.map +1 -1
  459. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
  460. package/Misc/copyTextureToTexture.d.ts +2 -2
  461. package/Misc/copyTextureToTexture.js.map +1 -1
  462. package/Misc/dds.d.ts +3 -2
  463. package/Misc/dds.js +2 -1
  464. package/Misc/dds.js.map +1 -1
  465. package/Misc/dumpTools.d.ts +2 -2
  466. package/Misc/dumpTools.js.map +1 -1
  467. package/Misc/fileTools.js +3 -3
  468. package/Misc/fileTools.js.map +1 -1
  469. package/Misc/filesInput.d.ts +2 -2
  470. package/Misc/filesInput.js.map +1 -1
  471. package/Misc/khronosTextureContainer2.d.ts +8 -2
  472. package/Misc/khronosTextureContainer2.js +3 -2
  473. package/Misc/khronosTextureContainer2.js.map +1 -1
  474. package/Misc/minMaxReducer.d.ts +2 -2
  475. package/Misc/minMaxReducer.js.map +1 -1
  476. package/Misc/screenshotTools.d.ts +6 -6
  477. package/Misc/screenshotTools.js.map +1 -1
  478. package/Misc/textureTools.js.map +1 -1
  479. package/Misc/tools.d.ts +7 -7
  480. package/Misc/tools.functions.d.ts +26 -0
  481. package/Misc/tools.functions.js +62 -0
  482. package/Misc/tools.functions.js.map +1 -1
  483. package/Misc/tools.js.map +1 -1
  484. package/Misc/videoRecorder.d.ts +3 -3
  485. package/Misc/videoRecorder.js.map +1 -1
  486. package/Particles/baseParticleSystem.d.ts +2 -2
  487. package/Particles/baseParticleSystem.js.map +1 -1
  488. package/Particles/computeShaderParticleSystem.d.ts +2 -2
  489. package/Particles/computeShaderParticleSystem.js.map +1 -1
  490. package/Particles/gpuParticleSystem.d.ts +3 -3
  491. package/Particles/gpuParticleSystem.js +2 -2
  492. package/Particles/gpuParticleSystem.js.map +1 -1
  493. package/Particles/particle.js +1 -1
  494. package/Particles/particle.js.map +1 -1
  495. package/Particles/particleSystem.d.ts +3 -3
  496. package/Particles/particleSystem.js +3 -3
  497. package/Particles/particleSystem.js.map +1 -1
  498. package/Particles/particleSystemComponent.d.ts +2 -2
  499. package/Particles/particleSystemComponent.js +2 -2
  500. package/Particles/particleSystemComponent.js.map +1 -1
  501. package/Particles/subEmitter.d.ts +3 -3
  502. package/Particles/subEmitter.js.map +1 -1
  503. package/Particles/thinParticleSystem.d.ts +2 -2
  504. package/Particles/thinParticleSystem.js.map +1 -1
  505. package/Physics/v2/physicsBody.js +3 -3
  506. package/Physics/v2/physicsBody.js.map +1 -1
  507. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
  508. package/PostProcesses/RenderPipeline/postProcessRenderEffect.d.ts +2 -2
  509. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  510. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +2 -2
  511. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  512. package/PostProcesses/blackAndWhitePostProcess.d.ts +2 -2
  513. package/PostProcesses/blackAndWhitePostProcess.js.map +1 -1
  514. package/PostProcesses/bloomMergePostProcess.d.ts +2 -2
  515. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  516. package/PostProcesses/blurPostProcess.d.ts +2 -2
  517. package/PostProcesses/blurPostProcess.js.map +1 -1
  518. package/PostProcesses/chromaticAberrationPostProcess.d.ts +2 -2
  519. package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
  520. package/PostProcesses/circleOfConfusionPostProcess.d.ts +2 -2
  521. package/PostProcesses/circleOfConfusionPostProcess.js.map +1 -1
  522. package/PostProcesses/colorCorrectionPostProcess.d.ts +2 -2
  523. package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
  524. package/PostProcesses/convolutionPostProcess.d.ts +2 -2
  525. package/PostProcesses/convolutionPostProcess.js.map +1 -1
  526. package/PostProcesses/depthOfFieldBlurPostProcess.d.ts +2 -2
  527. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  528. package/PostProcesses/depthOfFieldEffect.js +1 -1
  529. package/PostProcesses/depthOfFieldEffect.js.map +1 -1
  530. package/PostProcesses/depthOfFieldMergePostProcess.d.ts +2 -2
  531. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  532. package/PostProcesses/displayPassPostProcess.d.ts +2 -2
  533. package/PostProcesses/displayPassPostProcess.js.map +1 -1
  534. package/PostProcesses/extractHighlightsPostProcess.d.ts +2 -2
  535. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  536. package/PostProcesses/filterPostProcess.d.ts +2 -2
  537. package/PostProcesses/filterPostProcess.js.map +1 -1
  538. package/PostProcesses/fxaaPostProcess.d.ts +2 -2
  539. package/PostProcesses/fxaaPostProcess.js +2 -2
  540. package/PostProcesses/fxaaPostProcess.js.map +1 -1
  541. package/PostProcesses/grainPostProcess.d.ts +2 -2
  542. package/PostProcesses/grainPostProcess.js.map +1 -1
  543. package/PostProcesses/imageProcessingPostProcess.d.ts +2 -2
  544. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  545. package/PostProcesses/motionBlurPostProcess.d.ts +2 -2
  546. package/PostProcesses/motionBlurPostProcess.js.map +1 -1
  547. package/PostProcesses/passPostProcess.d.ts +3 -3
  548. package/PostProcesses/passPostProcess.js +2 -2
  549. package/PostProcesses/passPostProcess.js.map +1 -1
  550. package/PostProcesses/postProcess.d.ts +4 -5
  551. package/PostProcesses/postProcess.js +3 -3
  552. package/PostProcesses/postProcess.js.map +1 -1
  553. package/PostProcesses/refractionPostProcess.d.ts +2 -2
  554. package/PostProcesses/refractionPostProcess.js.map +1 -1
  555. package/PostProcesses/screenSpaceCurvaturePostProcess.d.ts +2 -2
  556. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  557. package/PostProcesses/screenSpaceReflectionPostProcess.d.ts +2 -2
  558. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  559. package/PostProcesses/sharpenPostProcess.d.ts +2 -2
  560. package/PostProcesses/sharpenPostProcess.js.map +1 -1
  561. package/PostProcesses/subSurfaceScatteringPostProcess.d.ts +2 -2
  562. package/PostProcesses/subSurfaceScatteringPostProcess.js.map +1 -1
  563. package/PostProcesses/volumetricLightScatteringPostProcess.d.ts +2 -2
  564. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  565. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  566. package/Rendering/depthPeelingRenderer.js.map +1 -1
  567. package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
  568. package/Rendering/fluidRenderer/fluidRenderingDepthTextureCopy.d.ts +2 -2
  569. package/Rendering/fluidRenderer/fluidRenderingDepthTextureCopy.js.map +1 -1
  570. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +2 -2
  571. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  572. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +2 -2
  573. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  574. package/Rendering/fluidRenderer/fluidRenderingTextures.d.ts +2 -2
  575. package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
  576. package/Rendering/geometryBufferRenderer.js +24 -18
  577. package/Rendering/geometryBufferRenderer.js.map +1 -1
  578. package/Rendering/outlineRenderer.js.map +1 -1
  579. package/Rendering/prePassRenderer.js.map +1 -1
  580. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +19 -3
  581. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  582. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +4 -1
  583. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  584. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
  585. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  586. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +3 -0
  587. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  588. package/Shaders/pbr.fragment.js +7 -0
  589. package/Shaders/pbr.fragment.js.map +1 -1
  590. package/Shaders/pbr.vertex.js +2 -0
  591. package/Shaders/pbr.vertex.js.map +1 -1
  592. package/ShadersWGSL/ShadersInclude/fresnelFunction.d.ts +5 -0
  593. package/ShadersWGSL/ShadersInclude/fresnelFunction.js +13 -0
  594. package/ShadersWGSL/ShadersInclude/fresnelFunction.js.map +1 -0
  595. package/ShadersWGSL/ShadersInclude/helperFunctions.d.ts +5 -0
  596. package/ShadersWGSL/ShadersInclude/helperFunctions.js +68 -0
  597. package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -0
  598. package/Sprites/spriteRenderer.d.ts +2 -2
  599. package/Sprites/spriteRenderer.js.map +1 -1
  600. package/XR/features/WebXRDepthSensing.js.map +1 -1
  601. package/XR/features/WebXRImageTracking.js.map +1 -1
  602. package/XR/features/WebXRLayers.d.ts +2 -2
  603. package/XR/features/WebXRLayers.js.map +1 -1
  604. package/XR/features/WebXRLightEstimation.js.map +1 -1
  605. package/XR/features/WebXRRawCameraAccess.d.ts +1 -1
  606. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  607. package/XR/features/WebXRSpaceWarp.js +1 -3
  608. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  609. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  610. package/XR/webXRExperienceHelper.js.map +1 -1
  611. package/XR/webXRManagedOutputCanvas.d.ts +2 -2
  612. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  613. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  614. package/XR/webXRSessionManager.js.map +1 -1
  615. package/assetContainer.js.map +1 -1
  616. package/node.d.ts +2 -2
  617. package/node.js.map +1 -1
  618. package/package.json +1 -1
  619. package/scene.d.ts +3 -3
  620. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"giRSMManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Reflective Shadow Maps were first described in http://www.klayge.org/material/3_12/GI/rsm.pdf by Carsten Dachsbacher and Marc Stamminger\r\n * Further explanations and implementations can be found in:\r\n * - Jaker video explaining RSM and its implementation: https://www.youtube.com/watch?v=LJQQdBsOYPM\r\n * - C++ implementation by Luis Angel: https://github.com/imyoungmin/RSM\r\n * - Javascript implementation by Erkaman: https://github.com/Erkaman/webgl-rsm\r\n */\r\nimport type { Scene } from \"core/scene\";\r\nimport type { GIRSM } from \"./giRSM\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Layer } from \"core/Layers/layer\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport { GeometryBufferRenderer } from \"../geometryBufferRenderer\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { WebGPURenderTargetWrapper } from \"core/Engines/WebGPU/webgpuRenderTargetWrapper\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport \"../../Shaders/bilateralBlur.fragment\";\r\nimport \"../../Shaders/bilateralBlurQuality.fragment\";\r\nimport \"../../Shaders/rsmGlobalIllumination.fragment\";\r\nimport \"../../Shaders/rsmFullGlobalIllumination.fragment\";\r\n\r\n/**\r\n * Class used to manage the global illumination contribution calculated from reflective shadow maps (RSM).\r\n */\r\nexport class GIRSMManager {\r\n private _scene: Scene;\r\n private _engine: Engine;\r\n private _giRSM: GIRSM[] = [];\r\n private _materialsWithRenderPlugin: Material[];\r\n private _sampleTexture: RawTexture;\r\n private _maxSamples: number;\r\n private _blurRTT: Nullable<RenderTargetTexture> = null;\r\n private _blurPostProcesses: Nullable<PostProcess[]> = null;\r\n private _blurXPostprocess: Nullable<PostProcess> = null;\r\n private _blurYPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingXPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingYPostprocess: Nullable<PostProcess> = null;\r\n private _ppGlobalIllumination: PostProcess[] = [];\r\n private _drawPhaseObserver: Observer<Scene>;\r\n private _debugLayer: Layer;\r\n private _counters: Array<{ name: string; value: number }>;\r\n private _countersRTW: Array<RenderTargetWrapper[]>;\r\n private _firstActivation = true;\r\n private _geomBufferEnabled = false;\r\n private _geomBufferEnablePosition = false;\r\n private _tempMatrix = new Matrix();\r\n\r\n private _enable = false;\r\n\r\n /**\r\n * Defines the default texture types and formats used by the geometry buffer renderer.\r\n */\r\n public static GeometryBufferTextureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 0: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_R }, // depth\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 1: { textureType: Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // normal\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 2: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // position\r\n };\r\n\r\n /**\r\n * Enables or disables the manager. Default is false.\r\n * If disabled, the global illumination won't be calculated and the scene will be rendered normally, without any global illumination contribution.\r\n */\r\n public get enable() {\r\n return this._enable;\r\n }\r\n\r\n public set enable(enable: boolean) {\r\n if (this._giRSM.length === 0) {\r\n enable = false;\r\n }\r\n\r\n if (enable === this._enable) {\r\n return;\r\n }\r\n\r\n this._enable = enable;\r\n this._debugLayer.isEnabled = this._showOnlyGI && enable;\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(GIRSMRenderPluginMaterial.Name) as GIRSMRenderPluginMaterial;\r\n plugin.isEnabled = enable;\r\n }\r\n });\r\n\r\n this.recreateResources(!enable);\r\n }\r\n\r\n /**\r\n * Defines if the global illumination calculation is paused or not.\r\n * Use this setting to pause the global illumination calculation when you know that the scene (camera/mesh/light positions) is not changing anymore to save some GPU power.\r\n * The scene will still be rendered with the latest global illumination contribution.\r\n */\r\n public pause = false;\r\n\r\n private _enableBlur = true;\r\n\r\n /**\r\n * Defines if the global illumination contribution should be blurred or not (using a bilateral blur). Default is true.\r\n */\r\n public get enableBlur() {\r\n return this._enableBlur;\r\n }\r\n\r\n public set enableBlur(enable: boolean) {\r\n if (enable === this._enableBlur) {\r\n return;\r\n }\r\n\r\n this._enableBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityBlur() {\r\n return this._useQualityBlur;\r\n }\r\n\r\n public set useQualityBlur(enable: boolean) {\r\n if (enable === this._useQualityBlur) {\r\n return;\r\n }\r\n\r\n this._useQualityBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the depth threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurDepthThreshold = 0.05;\r\n\r\n /**\r\n * Defines the normal threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurNormalThreshold = 0.25;\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral blur post-processes. Default is 12.\r\n */\r\n public blurKernel = 12;\r\n\r\n private _forceFullSizeBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done at full resolution or not. Default is false.\r\n * If this setting is enabled, upampling will be disabled (ignored) as it is not needed anymore.\r\n */\r\n public get fullSizeBlur() {\r\n return this._forceFullSizeBlur;\r\n }\r\n\r\n public set fullSizeBlur(mode: boolean) {\r\n if (this._forceFullSizeBlur === mode) {\r\n return;\r\n }\r\n\r\n this._forceFullSizeBlur = mode;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityUpsampling = false;\r\n\r\n /**\r\n * Defines if the upsampling should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityUpsampling() {\r\n return this._useQualityUpsampling;\r\n }\r\n\r\n public set useQualityUpsampling(enable: boolean) {\r\n if (enable === this._useQualityUpsampling) {\r\n return;\r\n }\r\n\r\n this._useQualityUpsampling = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral upsampling post-processes. Default is 6.\r\n */\r\n public upsamplerKernel = 6;\r\n\r\n private _showOnlyGI = false;\r\n\r\n /**\r\n * Defines if the debug layer should be enabled or not. Default is false.\r\n * Use this setting for debugging purpose, to show the global illumination contribution only.\r\n */\r\n public get showOnlyGI() {\r\n return this._showOnlyGI;\r\n }\r\n\r\n public set showOnlyGI(show) {\r\n if (this._showOnlyGI === show) {\r\n return;\r\n }\r\n\r\n this._showOnlyGI = show;\r\n this._debugLayer.isEnabled = show;\r\n }\r\n\r\n private _outputDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the output dimensions of the final process. It should normally be the same as the output dimensions of the screen.\r\n * @param dimensions The dimensions of the output texture (width and height)\r\n */\r\n public setOutputDimensions(dimensions: { width: number; height: number }) {\r\n this._outputDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the dimensions of the GI texture. Try to use the smallest size possible for better performance.\r\n * @param dimensions The dimensions of the GI texture (width and height)\r\n */\r\n public setGITextureDimensions(dimensions: { width: number; height: number }) {\r\n this._giTextureDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureType: number;\r\n\r\n /**\r\n * Gets or sets the texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n public get giTextureType() {\r\n return this._giTextureType;\r\n }\r\n\r\n public set giTextureType(textureType: number) {\r\n if (this._giTextureType === textureType) {\r\n return;\r\n }\r\n\r\n this._giTextureType = textureType;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Gets the list of GIRSM used by the manager.\r\n */\r\n public get giRSM() {\r\n return this._giRSM;\r\n }\r\n\r\n /**\r\n * Adds a (list of) GIRSM to the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to add to the manager\r\n */\r\n public addGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n this._giRSM.push(...rsm);\r\n } else {\r\n this._giRSM.push(rsm);\r\n }\r\n\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Removes a (list of) GIRSM from the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to remove from the manager\r\n */\r\n public removeGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n for (let i = 0; i < rsm.length; ++i) {\r\n const idx = this._giRSM.indexOf(rsm[i]);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n } else {\r\n const idx = this._giRSM.indexOf(rsm);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n\r\n if (this._giRSM.length === 0) {\r\n this.enable = false;\r\n } else {\r\n this.recreateResources();\r\n }\r\n }\r\n\r\n /**\r\n * Add a material to the manager. This will enable the global illumination contribution for the material.\r\n * @param material Material that will be affected by the global illumination contribution. If not provided, all materials of the scene will be affected.\r\n */\r\n public addMaterial(material?: Material) {\r\n if (material) {\r\n this._addGISupportToMaterial(material);\r\n } else {\r\n this._scene.meshes.forEach((mesh) => {\r\n if (mesh.getTotalVertices() > 0 && mesh.isEnabled() && mesh.material) {\r\n this._addGISupportToMaterial(mesh.material);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of GPU counters used by the manager.\r\n * GPU timing measurements must be enabled for the counters to be filled (engine.enableGPUTimingMeasurements = true).\r\n * Only available with WebGPU. You will still get the list of counters with other engines but the values will always be 0.\r\n */\r\n public get countersGPU(): Array<{ name: string; value: number }> {\r\n return this._counters;\r\n }\r\n\r\n /**\r\n * Recreates the resources used by the manager.\r\n * You should normally not have to call this method manually, except if you change the useFullTexture property of a GIRSM, because the manager won't track this change.\r\n * @param disposeGeometryBufferRenderer Defines if the geometry buffer renderer should be disposed and recreated. Default is false.\r\n */\r\n public recreateResources(disposeGeometryBufferRenderer = false) {\r\n this._disposePostProcesses(disposeGeometryBufferRenderer);\r\n this._createPostProcesses();\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Generates the sample texture used by the the global illumination calculation process.\r\n * @param maxSamples The maximum number of samples to generate in the texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n */\r\n public generateSampleTexture(maxSamples: number) {\r\n this._sampleTexture?.dispose();\r\n\r\n this._maxSamples = maxSamples;\r\n\r\n const data = new Float32Array(this._maxSamples * 4);\r\n for (let i = 0; i < this._maxSamples; i++) {\r\n const xi1 = Math.random();\r\n const xi2 = Math.random();\r\n\r\n const x = xi1 * Math.sin(2 * Math.PI * xi2);\r\n const y = xi1 * Math.cos(2 * Math.PI * xi2);\r\n\r\n data[i * 4 + 0] = x;\r\n data[i * 4 + 1] = y;\r\n data[i * 4 + 2] = xi1 * xi1;\r\n data[i * 4 + 3] = 1;\r\n }\r\n\r\n this._sampleTexture = new RawTexture(\r\n data,\r\n this._maxSamples,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._sampleTexture.name = \"GIRSMSamples\";\r\n }\r\n\r\n /**\r\n * Disposes the manager.\r\n */\r\n public dispose() {\r\n this._disposePostProcesses(true);\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.dispose();\r\n this._scene.onBeforeDrawPhaseObservable.remove(this._drawPhaseObserver);\r\n }\r\n\r\n /**\r\n * Creates a new GIRSMManager\r\n * @param scene The scene\r\n * @param outputDimensions The dimensions of the output texture (width and height). Should normally be the same as the output dimensions of the screen.\r\n * @param giTextureDimensions The dimensions of the GI texture (width and height). Try to use the smallest size possible for better performance.\r\n * @param maxSamples The maximum number of samples to generate in the sample texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n * @param giTextureType The texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n constructor(\r\n scene: Scene,\r\n outputDimensions: { width: number; height: number },\r\n giTextureDimensions = { width: 256, height: 256 },\r\n maxSamples = 2048,\r\n giTextureType = Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV\r\n ) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._outputDimensions = outputDimensions;\r\n this._giTextureDimensions = giTextureDimensions;\r\n this._giTextureType = giTextureType;\r\n this._materialsWithRenderPlugin = [];\r\n this._maxSamples = maxSamples;\r\n this._debugLayer = new Layer(\"debug layer\", null, this._scene, false);\r\n this._debugLayer.isEnabled = false;\r\n this._counters = [];\r\n this._countersRTW = [];\r\n\r\n this.generateSampleTexture(maxSamples);\r\n\r\n this._drawPhaseObserver = this._scene.onBeforeDrawPhaseObservable.add(() => {\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n let rebindCurrentRenderTarget = false;\r\n\r\n if (this._enable) {\r\n if (!this.pause) {\r\n this._scene.postProcessManager.directRender(this._ppGlobalIllumination, this._ppGlobalIllumination[0].inputTexture);\r\n this._engine.unBindFramebuffer(this._ppGlobalIllumination[0].inputTexture, true);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n rebindCurrentRenderTarget = true;\r\n\r\n if (this.enableBlur && this._blurPostProcesses) {\r\n this._scene.postProcessManager.directRender(this._blurPostProcesses, this._blurRTT!.renderTarget, true);\r\n this._engine.unBindFramebuffer(this._blurRTT!.renderTarget!, true);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._counters.length; ++i) {\r\n const rtws = this._countersRTW[i];\r\n for (let t = 0; t < rtws.length; ++t) {\r\n if (t === 0) {\r\n this._counters[i].value = this.pause ? 0 : (rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n } else if (!this.pause) {\r\n this._counters[i].value += (rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n }\r\n }\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n }\r\n\r\n if (rebindCurrentRenderTarget && currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n });\r\n }\r\n\r\n protected _disposePostProcesses(disposeGeometryBufferRenderer = false) {\r\n this._blurRTT?.dispose();\r\n this._blurRTT = null;\r\n this._blurPostProcesses = [];\r\n this._blurXPostprocess?.dispose();\r\n this._blurXPostprocess = null;\r\n this._blurYPostprocess?.dispose();\r\n this._blurYPostprocess = null;\r\n this._upsamplingXPostprocess?.dispose();\r\n this._upsamplingXPostprocess = null;\r\n this._upsamplingYPostprocess?.dispose();\r\n this._upsamplingYPostprocess = null;\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n ppGlobalIllumination.dispose();\r\n }\r\n this._ppGlobalIllumination = [];\r\n if (disposeGeometryBufferRenderer) {\r\n if (this._geomBufferEnabled) {\r\n this._scene.enableGeometryBufferRenderer();\r\n this._scene.geometryBufferRenderer!.enablePosition = this._geomBufferEnablePosition;\r\n } else {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n this._counters = [];\r\n this._countersRTW = [];\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<GIRSMRenderPluginMaterial>(GIRSMRenderPluginMaterial.Name)!;\r\n plugin.textureGIContrib = this.enableBlur ? this._blurRTT!.renderTarget!.texture! : this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n });\r\n }\r\n\r\n protected _createPostProcesses() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n const textureFormat = this._giTextureType === Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (this._firstActivation) {\r\n this._firstActivation = false;\r\n this._geomBufferEnabled = !!this._scene.geometryBufferRenderer;\r\n this._geomBufferEnablePosition = this._scene.geometryBufferRenderer?.enablePosition ?? false;\r\n }\r\n\r\n if (!this._geomBufferEnabled) {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n\r\n const geometryBufferRenderer = this._scene.enableGeometryBufferRenderer(\r\n this._enableBlur ? this._outputDimensions : this._giTextureDimensions,\r\n Constants.TEXTUREFORMAT_DEPTH16,\r\n GIRSMManager.GeometryBufferTextureTypesAndFormats\r\n );\r\n\r\n if (!geometryBufferRenderer) {\r\n throw new Error(\"Geometry buffer renderer is not supported but is required for GIRSMManager.\");\r\n }\r\n\r\n geometryBufferRenderer.enablePosition = true;\r\n if (!this._geomBufferEnabled) {\r\n geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n }\r\n\r\n const decodeGeometryBufferNormals = geometryBufferRenderer.normalsAreUnsigned;\r\n const normalsAreInWorldSpace = geometryBufferRenderer.generateNormalsInWorldSpace;\r\n\r\n this._counters.push({ name: \"Geometry buffer renderer\", value: 0 });\r\n this._countersRTW.push([this._scene.geometryBufferRenderer!.getGBuffer().renderTarget!]);\r\n\r\n let defines = \"\";\r\n if (decodeGeometryBufferNormals) {\r\n defines += \"#define DECODE_NORMAL\\n\";\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n defines += \"#define TRANSFORM_NORMAL\\n\";\r\n }\r\n\r\n for (let i = 0; i < this._giRSM.length; ++i) {\r\n const giRSM = this._giRSM[i];\r\n const rsm = giRSM.rsm;\r\n\r\n const ppGlobalIllumination = new PostProcess(\"RSMGlobalIllumination\" + i, giRSM.useFullTexture ? \"rsmFullGlobalIllumination\" : \"rsmGlobalIllumination\", {\r\n ...this._giTextureDimensions,\r\n uniforms: [\"rsmLightMatrix\", \"rsmInfo\", \"rsmInfo2\", \"invView\"],\r\n samplers: [\"normalSampler\", \"rsmPositionW\", \"rsmNormalW\", \"rsmFlux\", \"rsmSamples\"],\r\n defines,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._ppGlobalIllumination.push(ppGlobalIllumination);\r\n\r\n if (i !== 0) {\r\n ppGlobalIllumination.shareOutputWith(this._ppGlobalIllumination[0]);\r\n ppGlobalIllumination.alphaMode = Constants.ALPHA_ADD;\r\n }\r\n\r\n ppGlobalIllumination.autoClear = false;\r\n ppGlobalIllumination.externalTextureSamplerBinding = true;\r\n ppGlobalIllumination.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"textureSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\"rsmPositionW\", rsm.positionWorldTexture);\r\n effect.setTexture(\"rsmNormalW\", rsm.normalWorldTexture);\r\n effect.setTexture(\"rsmFlux\", rsm.fluxTexture);\r\n effect.setMatrix(\"rsmLightMatrix\", rsm.lightTransformationMatrix);\r\n if (!giRSM.useFullTexture) {\r\n effect.setTexture(\"rsmSamples\", this._sampleTexture);\r\n effect.setFloat4(\"rsmInfo\", giRSM.numSamples, giRSM.radius, giRSM.intensity, giRSM.edgeArtifactCorrection);\r\n effect.setFloat4(\r\n \"rsmInfo2\",\r\n giRSM.noiseFactor,\r\n giRSM.rotateSample ? 1 : 0,\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height\r\n );\r\n } else {\r\n effect.setFloat4(\r\n \"rsmInfo\",\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height,\r\n giRSM.intensity,\r\n giRSM.edgeArtifactCorrection\r\n );\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n this._tempMatrix.copyFrom(this._scene.activeCamera!.getViewMatrix());\r\n this._tempMatrix.invert();\r\n effect.setMatrix(\"invView\", this._tempMatrix);\r\n }\r\n });\r\n }\r\n\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n if (!ppGlobalIllumination.inputTexture) {\r\n ppGlobalIllumination.resize(this._giTextureDimensions.width, this._giTextureDimensions.height);\r\n }\r\n }\r\n\r\n this._counters.push({ name: \"GI generation\", value: 0 });\r\n this._countersRTW.push([this._ppGlobalIllumination[0].inputTexture]);\r\n\r\n if (this._enableBlur) {\r\n const blurTextureSize = this._forceFullSizeBlur ? this._outputDimensions : this._giTextureDimensions;\r\n\r\n this._blurRTT = new RenderTargetTexture(\"GIRSMContribution\", this._outputDimensions, this._scene, {\r\n type: this._giTextureType,\r\n format: textureFormat,\r\n generateDepthBuffer: false,\r\n });\r\n this._blurRTT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.updateSamplingMode(Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n this._blurRTT.skipInitialClear = true;\r\n\r\n const blurRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI blur\", value: 0 });\r\n this._countersRTW.push(blurRTWs);\r\n\r\n // Bilateral blur\r\n this._blurXPostprocess = new PostProcess(this._useQualityBlur ? \"BilateralBlur\" : \"BilateralBlurX\", this._useQualityBlur ? \"bilateralBlurQuality\" : \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._blurXPostprocess.onApplyObservable.add((effect) => {\r\n effect._bindTexture(\"textureSampler\", this._ppGlobalIllumination[0].inputTexture.texture);\r\n effect.setTexture(\"depthSampler\", geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._giTextureDimensions.width, this._useQualityBlur ? 1 / this._giTextureDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurXPostprocess.externalTextureSamplerBinding = true;\r\n this._blurXPostprocess.autoClear = false;\r\n\r\n if (!this._useQualityBlur) {\r\n this._blurYPostprocess = new PostProcess(\"BilateralBlurY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._blurYPostprocess.autoClear = false;\r\n this._blurYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._giTextureDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurYPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._blurYPostprocess.inputTexture);\r\n }\r\n\r\n this._blurPostProcesses = [this._blurXPostprocess];\r\n if (this._blurYPostprocess) {\r\n this._blurPostProcesses.push(this._blurYPostprocess);\r\n }\r\n\r\n // Bilateral upsampling\r\n const giFullDimensions = this._giTextureDimensions.width >= this._outputDimensions.width && this._giTextureDimensions.height >= this._outputDimensions.height;\r\n\r\n if (!giFullDimensions && !this._forceFullSizeBlur) {\r\n const upsamplingRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI upsampling\", value: 0 });\r\n this._countersRTW.push(upsamplingRTWs);\r\n\r\n this._upsamplingXPostprocess = new PostProcess(\r\n this._useQualityUpsampling ? \"BilateralUpsampling\" : \"BilateralUpsamplingX\",\r\n this._useQualityUpsampling ? \"bilateralBlurQuality\" : \"bilateralBlur\",\r\n {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n }\r\n );\r\n\r\n this._upsamplingXPostprocess.autoClear = false;\r\n this._upsamplingXPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._outputDimensions.width, this._useQualityUpsampling ? 1 / this._outputDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingXPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._upsamplingXPostprocess.inputTexture);\r\n\r\n if (!this.useQualityUpsampling) {\r\n this._upsamplingYPostprocess = new PostProcess(\"BilateralUpsamplingY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: this._outputDimensions,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._upsamplingYPostprocess.autoClear = false;\r\n this._upsamplingYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._outputDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingYPostprocess.resize(this._outputDimensions.width, this._outputDimensions.height);\r\n\r\n upsamplingRTWs.push(this._upsamplingYPostprocess.inputTexture);\r\n }\r\n\r\n upsamplingRTWs.push(this._blurRTT.renderTarget!);\r\n\r\n this._blurPostProcesses.push(this._upsamplingXPostprocess);\r\n if (this._upsamplingYPostprocess) {\r\n this._blurPostProcesses.push(this._upsamplingYPostprocess);\r\n }\r\n } else {\r\n blurRTWs.push(this._blurRTT.renderTarget!);\r\n }\r\n }\r\n\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.texture = new BaseTexture(this._scene, this._enableBlur ? this._blurRTT!.renderTarget!.texture : this._ppGlobalIllumination[0].inputTexture.texture);\r\n }\r\n\r\n protected _addGISupportToMaterial(material: Material) {\r\n if (material.pluginManager?.getPlugin(GIRSMRenderPluginMaterial.Name)) {\r\n return;\r\n }\r\n\r\n const plugin = new GIRSMRenderPluginMaterial(material);\r\n\r\n if (this._enable && this._ppGlobalIllumination.length > 0) {\r\n plugin.textureGIContrib = this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n\r\n plugin.isEnabled = this._enable;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass MaterialGIRSMRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_GIRSM = false;\r\n public RSMCREATE_PROJTEXTURE = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the global illumination contribution.\r\n */\r\nexport class GIRSMRenderPluginMaterial extends MaterialPluginBase {\r\n private _isPBR;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"GIRSMRender\";\r\n\r\n /**\r\n * The texture containing the global illumination contribution.\r\n */\r\n @serialize()\r\n public textureGIContrib: InternalTexture;\r\n\r\n /**\r\n * The width of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureWidth: number;\r\n\r\n /**\r\n * The height of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureHeight: number;\r\n\r\n private _isEnabled = false;\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, GIRSMRenderPluginMaterial.Name, 310, new MaterialGIRSMRenderDefines());\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n\r\n this._isPBR = material instanceof PBRBaseMaterial;\r\n }\r\n\r\n public prepareDefines(defines: MaterialGIRSMRenderDefines) {\r\n defines.RENDER_WITH_GIRSM = this._isEnabled;\r\n }\r\n\r\n public getClassName() {\r\n return \"GIRSMRenderPluginMaterial\";\r\n }\r\n\r\n public getUniforms() {\r\n return {\r\n ubo: [{ name: \"girsmTextureOutputSize\", size: 2, type: \"vec2\" }],\r\n fragment: `#ifdef RENDER_WITH_GIRSM\r\n uniform vec2 girsmTextureOutputSize;\r\n #endif`,\r\n };\r\n }\r\n\r\n public getSamplers(samplers: string[]) {\r\n samplers.push(\"girsmTextureGIContrib\");\r\n }\r\n\r\n public bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"girsmTextureGIContrib\", this.textureGIContrib);\r\n uniformBuffer.updateFloat2(\"girsmTextureOutputSize\", this.outputTextureWidth, this.outputTextureHeight);\r\n }\r\n }\r\n\r\n public getCustomCode(shaderType: string) {\r\n const frag: { [name: string]: string } = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_GIRSM\r\n uniform sampler2D girsmTextureGIContrib;\r\n\r\n vec3 computeIndirect() {\r\n vec2 uv = gl_FragCoord.xy / girsmTextureOutputSize;\r\n return texture2D(girsmTextureGIContrib, uv).rgb;\r\n }\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: `\r\n #ifdef RENDER_WITH_GIRSM\r\n finalDiffuse += computeIndirect() * surfaceAlbedo.rgb;\r\n #endif\r\n `,\r\n };\r\n\r\n if (!this._isPBR) {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_GIRSM\r\n color.rgb += computeIndirect() * baseColor.rgb;\r\n #endif\r\n `;\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.GIRSMRenderPluginMaterial`, GIRSMRenderPluginMaterial);\r\n"]}
1
+ {"version":3,"file":"giRSMManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Reflective Shadow Maps were first described in http://www.klayge.org/material/3_12/GI/rsm.pdf by Carsten Dachsbacher and Marc Stamminger\r\n * Further explanations and implementations can be found in:\r\n * - Jaker video explaining RSM and its implementation: https://www.youtube.com/watch?v=LJQQdBsOYPM\r\n * - C++ implementation by Luis Angel: https://github.com/imyoungmin/RSM\r\n * - Javascript implementation by Erkaman: https://github.com/Erkaman/webgl-rsm\r\n */\r\nimport type { Scene } from \"core/scene\";\r\nimport type { GIRSM } from \"./giRSM\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Layer } from \"core/Layers/layer\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { GeometryBufferRenderer } from \"../geometryBufferRenderer\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { WebGPURenderTargetWrapper } from \"core/Engines/WebGPU/webgpuRenderTargetWrapper\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport \"../../Shaders/bilateralBlur.fragment\";\r\nimport \"../../Shaders/bilateralBlurQuality.fragment\";\r\nimport \"../../Shaders/rsmGlobalIllumination.fragment\";\r\nimport \"../../Shaders/rsmFullGlobalIllumination.fragment\";\r\n\r\n/**\r\n * Class used to manage the global illumination contribution calculated from reflective shadow maps (RSM).\r\n */\r\nexport class GIRSMManager {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _giRSM: GIRSM[] = [];\r\n private _materialsWithRenderPlugin: Material[];\r\n private _sampleTexture: RawTexture;\r\n private _maxSamples: number;\r\n private _blurRTT: Nullable<RenderTargetTexture> = null;\r\n private _blurPostProcesses: Nullable<PostProcess[]> = null;\r\n private _blurXPostprocess: Nullable<PostProcess> = null;\r\n private _blurYPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingXPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingYPostprocess: Nullable<PostProcess> = null;\r\n private _ppGlobalIllumination: PostProcess[] = [];\r\n private _drawPhaseObserver: Observer<Scene>;\r\n private _debugLayer: Layer;\r\n private _counters: Array<{ name: string; value: number }>;\r\n private _countersRTW: Array<RenderTargetWrapper[]>;\r\n private _firstActivation = true;\r\n private _geomBufferEnabled = false;\r\n private _geomBufferEnablePosition = false;\r\n private _tempMatrix = new Matrix();\r\n\r\n private _enable = false;\r\n\r\n /**\r\n * Defines the default texture types and formats used by the geometry buffer renderer.\r\n */\r\n public static GeometryBufferTextureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 0: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_R }, // depth\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 1: { textureType: Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // normal\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 2: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // position\r\n };\r\n\r\n /**\r\n * Enables or disables the manager. Default is false.\r\n * If disabled, the global illumination won't be calculated and the scene will be rendered normally, without any global illumination contribution.\r\n */\r\n public get enable() {\r\n return this._enable;\r\n }\r\n\r\n public set enable(enable: boolean) {\r\n if (this._giRSM.length === 0) {\r\n enable = false;\r\n }\r\n\r\n if (enable === this._enable) {\r\n return;\r\n }\r\n\r\n this._enable = enable;\r\n this._debugLayer.isEnabled = this._showOnlyGI && enable;\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(GIRSMRenderPluginMaterial.Name) as GIRSMRenderPluginMaterial;\r\n plugin.isEnabled = enable;\r\n }\r\n });\r\n\r\n this.recreateResources(!enable);\r\n }\r\n\r\n /**\r\n * Defines if the global illumination calculation is paused or not.\r\n * Use this setting to pause the global illumination calculation when you know that the scene (camera/mesh/light positions) is not changing anymore to save some GPU power.\r\n * The scene will still be rendered with the latest global illumination contribution.\r\n */\r\n public pause = false;\r\n\r\n private _enableBlur = true;\r\n\r\n /**\r\n * Defines if the global illumination contribution should be blurred or not (using a bilateral blur). Default is true.\r\n */\r\n public get enableBlur() {\r\n return this._enableBlur;\r\n }\r\n\r\n public set enableBlur(enable: boolean) {\r\n if (enable === this._enableBlur) {\r\n return;\r\n }\r\n\r\n this._enableBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityBlur() {\r\n return this._useQualityBlur;\r\n }\r\n\r\n public set useQualityBlur(enable: boolean) {\r\n if (enable === this._useQualityBlur) {\r\n return;\r\n }\r\n\r\n this._useQualityBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the depth threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurDepthThreshold = 0.05;\r\n\r\n /**\r\n * Defines the normal threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurNormalThreshold = 0.25;\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral blur post-processes. Default is 12.\r\n */\r\n public blurKernel = 12;\r\n\r\n private _forceFullSizeBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done at full resolution or not. Default is false.\r\n * If this setting is enabled, upampling will be disabled (ignored) as it is not needed anymore.\r\n */\r\n public get fullSizeBlur() {\r\n return this._forceFullSizeBlur;\r\n }\r\n\r\n public set fullSizeBlur(mode: boolean) {\r\n if (this._forceFullSizeBlur === mode) {\r\n return;\r\n }\r\n\r\n this._forceFullSizeBlur = mode;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityUpsampling = false;\r\n\r\n /**\r\n * Defines if the upsampling should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityUpsampling() {\r\n return this._useQualityUpsampling;\r\n }\r\n\r\n public set useQualityUpsampling(enable: boolean) {\r\n if (enable === this._useQualityUpsampling) {\r\n return;\r\n }\r\n\r\n this._useQualityUpsampling = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral upsampling post-processes. Default is 6.\r\n */\r\n public upsamplerKernel = 6;\r\n\r\n private _showOnlyGI = false;\r\n\r\n /**\r\n * Defines if the debug layer should be enabled or not. Default is false.\r\n * Use this setting for debugging purpose, to show the global illumination contribution only.\r\n */\r\n public get showOnlyGI() {\r\n return this._showOnlyGI;\r\n }\r\n\r\n public set showOnlyGI(show) {\r\n if (this._showOnlyGI === show) {\r\n return;\r\n }\r\n\r\n this._showOnlyGI = show;\r\n this._debugLayer.isEnabled = show;\r\n }\r\n\r\n private _outputDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the output dimensions of the final process. It should normally be the same as the output dimensions of the screen.\r\n * @param dimensions The dimensions of the output texture (width and height)\r\n */\r\n public setOutputDimensions(dimensions: { width: number; height: number }) {\r\n this._outputDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the dimensions of the GI texture. Try to use the smallest size possible for better performance.\r\n * @param dimensions The dimensions of the GI texture (width and height)\r\n */\r\n public setGITextureDimensions(dimensions: { width: number; height: number }) {\r\n this._giTextureDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureType: number;\r\n\r\n /**\r\n * Gets or sets the texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n public get giTextureType() {\r\n return this._giTextureType;\r\n }\r\n\r\n public set giTextureType(textureType: number) {\r\n if (this._giTextureType === textureType) {\r\n return;\r\n }\r\n\r\n this._giTextureType = textureType;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Gets the list of GIRSM used by the manager.\r\n */\r\n public get giRSM() {\r\n return this._giRSM;\r\n }\r\n\r\n /**\r\n * Adds a (list of) GIRSM to the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to add to the manager\r\n */\r\n public addGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n this._giRSM.push(...rsm);\r\n } else {\r\n this._giRSM.push(rsm);\r\n }\r\n\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Removes a (list of) GIRSM from the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to remove from the manager\r\n */\r\n public removeGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n for (let i = 0; i < rsm.length; ++i) {\r\n const idx = this._giRSM.indexOf(rsm[i]);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n } else {\r\n const idx = this._giRSM.indexOf(rsm);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n\r\n if (this._giRSM.length === 0) {\r\n this.enable = false;\r\n } else {\r\n this.recreateResources();\r\n }\r\n }\r\n\r\n /**\r\n * Add a material to the manager. This will enable the global illumination contribution for the material.\r\n * @param material Material that will be affected by the global illumination contribution. If not provided, all materials of the scene will be affected.\r\n */\r\n public addMaterial(material?: Material) {\r\n if (material) {\r\n this._addGISupportToMaterial(material);\r\n } else {\r\n this._scene.meshes.forEach((mesh) => {\r\n if (mesh.getTotalVertices() > 0 && mesh.isEnabled() && mesh.material) {\r\n this._addGISupportToMaterial(mesh.material);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of GPU counters used by the manager.\r\n * GPU timing measurements must be enabled for the counters to be filled (engine.enableGPUTimingMeasurements = true).\r\n * Only available with WebGPU. You will still get the list of counters with other engines but the values will always be 0.\r\n */\r\n public get countersGPU(): Array<{ name: string; value: number }> {\r\n return this._counters;\r\n }\r\n\r\n /**\r\n * Recreates the resources used by the manager.\r\n * You should normally not have to call this method manually, except if you change the useFullTexture property of a GIRSM, because the manager won't track this change.\r\n * @param disposeGeometryBufferRenderer Defines if the geometry buffer renderer should be disposed and recreated. Default is false.\r\n */\r\n public recreateResources(disposeGeometryBufferRenderer = false) {\r\n this._disposePostProcesses(disposeGeometryBufferRenderer);\r\n this._createPostProcesses();\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Generates the sample texture used by the the global illumination calculation process.\r\n * @param maxSamples The maximum number of samples to generate in the texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n */\r\n public generateSampleTexture(maxSamples: number) {\r\n this._sampleTexture?.dispose();\r\n\r\n this._maxSamples = maxSamples;\r\n\r\n const data = new Float32Array(this._maxSamples * 4);\r\n for (let i = 0; i < this._maxSamples; i++) {\r\n const xi1 = Math.random();\r\n const xi2 = Math.random();\r\n\r\n const x = xi1 * Math.sin(2 * Math.PI * xi2);\r\n const y = xi1 * Math.cos(2 * Math.PI * xi2);\r\n\r\n data[i * 4 + 0] = x;\r\n data[i * 4 + 1] = y;\r\n data[i * 4 + 2] = xi1 * xi1;\r\n data[i * 4 + 3] = 1;\r\n }\r\n\r\n this._sampleTexture = new RawTexture(\r\n data,\r\n this._maxSamples,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._sampleTexture.name = \"GIRSMSamples\";\r\n }\r\n\r\n /**\r\n * Disposes the manager.\r\n */\r\n public dispose() {\r\n this._disposePostProcesses(true);\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.dispose();\r\n this._scene.onBeforeDrawPhaseObservable.remove(this._drawPhaseObserver);\r\n }\r\n\r\n /**\r\n * Creates a new GIRSMManager\r\n * @param scene The scene\r\n * @param outputDimensions The dimensions of the output texture (width and height). Should normally be the same as the output dimensions of the screen.\r\n * @param giTextureDimensions The dimensions of the GI texture (width and height). Try to use the smallest size possible for better performance.\r\n * @param maxSamples The maximum number of samples to generate in the sample texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n * @param giTextureType The texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n constructor(\r\n scene: Scene,\r\n outputDimensions: { width: number; height: number },\r\n giTextureDimensions = { width: 256, height: 256 },\r\n maxSamples = 2048,\r\n giTextureType = Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV\r\n ) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._outputDimensions = outputDimensions;\r\n this._giTextureDimensions = giTextureDimensions;\r\n this._giTextureType = giTextureType;\r\n this._materialsWithRenderPlugin = [];\r\n this._maxSamples = maxSamples;\r\n this._debugLayer = new Layer(\"debug layer\", null, this._scene, false);\r\n this._debugLayer.isEnabled = false;\r\n this._counters = [];\r\n this._countersRTW = [];\r\n\r\n this.generateSampleTexture(maxSamples);\r\n\r\n this._drawPhaseObserver = this._scene.onBeforeDrawPhaseObservable.add(() => {\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n let rebindCurrentRenderTarget = false;\r\n\r\n if (this._enable) {\r\n if (!this.pause) {\r\n this._scene.postProcessManager.directRender(this._ppGlobalIllumination, this._ppGlobalIllumination[0].inputTexture);\r\n this._engine.unBindFramebuffer(this._ppGlobalIllumination[0].inputTexture, true);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n rebindCurrentRenderTarget = true;\r\n\r\n if (this.enableBlur && this._blurPostProcesses) {\r\n this._scene.postProcessManager.directRender(this._blurPostProcesses, this._blurRTT!.renderTarget, true);\r\n this._engine.unBindFramebuffer(this._blurRTT!.renderTarget!, true);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._counters.length; ++i) {\r\n const rtws = this._countersRTW[i];\r\n for (let t = 0; t < rtws.length; ++t) {\r\n if (t === 0) {\r\n this._counters[i].value = this.pause ? 0 : (rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n } else if (!this.pause) {\r\n this._counters[i].value += (rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n }\r\n }\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n }\r\n\r\n if (rebindCurrentRenderTarget && currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n });\r\n }\r\n\r\n protected _disposePostProcesses(disposeGeometryBufferRenderer = false) {\r\n this._blurRTT?.dispose();\r\n this._blurRTT = null;\r\n this._blurPostProcesses = [];\r\n this._blurXPostprocess?.dispose();\r\n this._blurXPostprocess = null;\r\n this._blurYPostprocess?.dispose();\r\n this._blurYPostprocess = null;\r\n this._upsamplingXPostprocess?.dispose();\r\n this._upsamplingXPostprocess = null;\r\n this._upsamplingYPostprocess?.dispose();\r\n this._upsamplingYPostprocess = null;\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n ppGlobalIllumination.dispose();\r\n }\r\n this._ppGlobalIllumination = [];\r\n if (disposeGeometryBufferRenderer) {\r\n if (this._geomBufferEnabled) {\r\n this._scene.enableGeometryBufferRenderer();\r\n this._scene.geometryBufferRenderer!.enablePosition = this._geomBufferEnablePosition;\r\n } else {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n this._counters = [];\r\n this._countersRTW = [];\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<GIRSMRenderPluginMaterial>(GIRSMRenderPluginMaterial.Name)!;\r\n plugin.textureGIContrib = this.enableBlur ? this._blurRTT!.renderTarget!.texture! : this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n });\r\n }\r\n\r\n protected _createPostProcesses() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n const textureFormat = this._giTextureType === Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (this._firstActivation) {\r\n this._firstActivation = false;\r\n this._geomBufferEnabled = !!this._scene.geometryBufferRenderer;\r\n this._geomBufferEnablePosition = this._scene.geometryBufferRenderer?.enablePosition ?? false;\r\n }\r\n\r\n if (!this._geomBufferEnabled) {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n\r\n const geometryBufferRenderer = this._scene.enableGeometryBufferRenderer(\r\n this._enableBlur ? this._outputDimensions : this._giTextureDimensions,\r\n Constants.TEXTUREFORMAT_DEPTH16,\r\n GIRSMManager.GeometryBufferTextureTypesAndFormats\r\n );\r\n\r\n if (!geometryBufferRenderer) {\r\n throw new Error(\"Geometry buffer renderer is not supported but is required for GIRSMManager.\");\r\n }\r\n\r\n geometryBufferRenderer.enablePosition = true;\r\n if (!this._geomBufferEnabled) {\r\n geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n }\r\n\r\n const decodeGeometryBufferNormals = geometryBufferRenderer.normalsAreUnsigned;\r\n const normalsAreInWorldSpace = geometryBufferRenderer.generateNormalsInWorldSpace;\r\n\r\n this._counters.push({ name: \"Geometry buffer renderer\", value: 0 });\r\n this._countersRTW.push([this._scene.geometryBufferRenderer!.getGBuffer().renderTarget!]);\r\n\r\n let defines = \"\";\r\n if (decodeGeometryBufferNormals) {\r\n defines += \"#define DECODE_NORMAL\\n\";\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n defines += \"#define TRANSFORM_NORMAL\\n\";\r\n }\r\n\r\n for (let i = 0; i < this._giRSM.length; ++i) {\r\n const giRSM = this._giRSM[i];\r\n const rsm = giRSM.rsm;\r\n\r\n const ppGlobalIllumination = new PostProcess(\"RSMGlobalIllumination\" + i, giRSM.useFullTexture ? \"rsmFullGlobalIllumination\" : \"rsmGlobalIllumination\", {\r\n ...this._giTextureDimensions,\r\n uniforms: [\"rsmLightMatrix\", \"rsmInfo\", \"rsmInfo2\", \"invView\"],\r\n samplers: [\"normalSampler\", \"rsmPositionW\", \"rsmNormalW\", \"rsmFlux\", \"rsmSamples\"],\r\n defines,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._ppGlobalIllumination.push(ppGlobalIllumination);\r\n\r\n if (i !== 0) {\r\n ppGlobalIllumination.shareOutputWith(this._ppGlobalIllumination[0]);\r\n ppGlobalIllumination.alphaMode = Constants.ALPHA_ADD;\r\n }\r\n\r\n ppGlobalIllumination.autoClear = false;\r\n ppGlobalIllumination.externalTextureSamplerBinding = true;\r\n ppGlobalIllumination.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"textureSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\"rsmPositionW\", rsm.positionWorldTexture);\r\n effect.setTexture(\"rsmNormalW\", rsm.normalWorldTexture);\r\n effect.setTexture(\"rsmFlux\", rsm.fluxTexture);\r\n effect.setMatrix(\"rsmLightMatrix\", rsm.lightTransformationMatrix);\r\n if (!giRSM.useFullTexture) {\r\n effect.setTexture(\"rsmSamples\", this._sampleTexture);\r\n effect.setFloat4(\"rsmInfo\", giRSM.numSamples, giRSM.radius, giRSM.intensity, giRSM.edgeArtifactCorrection);\r\n effect.setFloat4(\r\n \"rsmInfo2\",\r\n giRSM.noiseFactor,\r\n giRSM.rotateSample ? 1 : 0,\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height\r\n );\r\n } else {\r\n effect.setFloat4(\r\n \"rsmInfo\",\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height,\r\n giRSM.intensity,\r\n giRSM.edgeArtifactCorrection\r\n );\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n this._tempMatrix.copyFrom(this._scene.activeCamera!.getViewMatrix());\r\n this._tempMatrix.invert();\r\n effect.setMatrix(\"invView\", this._tempMatrix);\r\n }\r\n });\r\n }\r\n\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n if (!ppGlobalIllumination.inputTexture) {\r\n ppGlobalIllumination.resize(this._giTextureDimensions.width, this._giTextureDimensions.height);\r\n }\r\n }\r\n\r\n this._counters.push({ name: \"GI generation\", value: 0 });\r\n this._countersRTW.push([this._ppGlobalIllumination[0].inputTexture]);\r\n\r\n if (this._enableBlur) {\r\n const blurTextureSize = this._forceFullSizeBlur ? this._outputDimensions : this._giTextureDimensions;\r\n\r\n this._blurRTT = new RenderTargetTexture(\"GIRSMContribution\", this._outputDimensions, this._scene, {\r\n type: this._giTextureType,\r\n format: textureFormat,\r\n generateDepthBuffer: false,\r\n });\r\n this._blurRTT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.updateSamplingMode(Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n this._blurRTT.skipInitialClear = true;\r\n\r\n const blurRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI blur\", value: 0 });\r\n this._countersRTW.push(blurRTWs);\r\n\r\n // Bilateral blur\r\n this._blurXPostprocess = new PostProcess(this._useQualityBlur ? \"BilateralBlur\" : \"BilateralBlurX\", this._useQualityBlur ? \"bilateralBlurQuality\" : \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._blurXPostprocess.onApplyObservable.add((effect) => {\r\n effect._bindTexture(\"textureSampler\", this._ppGlobalIllumination[0].inputTexture.texture);\r\n effect.setTexture(\"depthSampler\", geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._giTextureDimensions.width, this._useQualityBlur ? 1 / this._giTextureDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurXPostprocess.externalTextureSamplerBinding = true;\r\n this._blurXPostprocess.autoClear = false;\r\n\r\n if (!this._useQualityBlur) {\r\n this._blurYPostprocess = new PostProcess(\"BilateralBlurY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._blurYPostprocess.autoClear = false;\r\n this._blurYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._giTextureDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurYPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._blurYPostprocess.inputTexture);\r\n }\r\n\r\n this._blurPostProcesses = [this._blurXPostprocess];\r\n if (this._blurYPostprocess) {\r\n this._blurPostProcesses.push(this._blurYPostprocess);\r\n }\r\n\r\n // Bilateral upsampling\r\n const giFullDimensions = this._giTextureDimensions.width >= this._outputDimensions.width && this._giTextureDimensions.height >= this._outputDimensions.height;\r\n\r\n if (!giFullDimensions && !this._forceFullSizeBlur) {\r\n const upsamplingRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI upsampling\", value: 0 });\r\n this._countersRTW.push(upsamplingRTWs);\r\n\r\n this._upsamplingXPostprocess = new PostProcess(\r\n this._useQualityUpsampling ? \"BilateralUpsampling\" : \"BilateralUpsamplingX\",\r\n this._useQualityUpsampling ? \"bilateralBlurQuality\" : \"bilateralBlur\",\r\n {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n }\r\n );\r\n\r\n this._upsamplingXPostprocess.autoClear = false;\r\n this._upsamplingXPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._outputDimensions.width, this._useQualityUpsampling ? 1 / this._outputDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingXPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._upsamplingXPostprocess.inputTexture);\r\n\r\n if (!this.useQualityUpsampling) {\r\n this._upsamplingYPostprocess = new PostProcess(\"BilateralUpsamplingY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: this._outputDimensions,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n });\r\n\r\n this._upsamplingYPostprocess.autoClear = false;\r\n this._upsamplingYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._outputDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingYPostprocess.resize(this._outputDimensions.width, this._outputDimensions.height);\r\n\r\n upsamplingRTWs.push(this._upsamplingYPostprocess.inputTexture);\r\n }\r\n\r\n upsamplingRTWs.push(this._blurRTT.renderTarget!);\r\n\r\n this._blurPostProcesses.push(this._upsamplingXPostprocess);\r\n if (this._upsamplingYPostprocess) {\r\n this._blurPostProcesses.push(this._upsamplingYPostprocess);\r\n }\r\n } else {\r\n blurRTWs.push(this._blurRTT.renderTarget!);\r\n }\r\n }\r\n\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.texture = new BaseTexture(this._scene, this._enableBlur ? this._blurRTT!.renderTarget!.texture : this._ppGlobalIllumination[0].inputTexture.texture);\r\n }\r\n\r\n protected _addGISupportToMaterial(material: Material) {\r\n if (material.pluginManager?.getPlugin(GIRSMRenderPluginMaterial.Name)) {\r\n return;\r\n }\r\n\r\n const plugin = new GIRSMRenderPluginMaterial(material);\r\n\r\n if (this._enable && this._ppGlobalIllumination.length > 0) {\r\n plugin.textureGIContrib = this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n\r\n plugin.isEnabled = this._enable;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass MaterialGIRSMRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_GIRSM = false;\r\n public RSMCREATE_PROJTEXTURE = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the global illumination contribution.\r\n */\r\nexport class GIRSMRenderPluginMaterial extends MaterialPluginBase {\r\n private _isPBR;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"GIRSMRender\";\r\n\r\n /**\r\n * The texture containing the global illumination contribution.\r\n */\r\n @serialize()\r\n public textureGIContrib: InternalTexture;\r\n\r\n /**\r\n * The width of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureWidth: number;\r\n\r\n /**\r\n * The height of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureHeight: number;\r\n\r\n private _isEnabled = false;\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, GIRSMRenderPluginMaterial.Name, 310, new MaterialGIRSMRenderDefines());\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n\r\n this._isPBR = material instanceof PBRBaseMaterial;\r\n }\r\n\r\n public prepareDefines(defines: MaterialGIRSMRenderDefines) {\r\n defines.RENDER_WITH_GIRSM = this._isEnabled;\r\n }\r\n\r\n public getClassName() {\r\n return \"GIRSMRenderPluginMaterial\";\r\n }\r\n\r\n public getUniforms() {\r\n return {\r\n ubo: [{ name: \"girsmTextureOutputSize\", size: 2, type: \"vec2\" }],\r\n fragment: `#ifdef RENDER_WITH_GIRSM\r\n uniform vec2 girsmTextureOutputSize;\r\n #endif`,\r\n };\r\n }\r\n\r\n public getSamplers(samplers: string[]) {\r\n samplers.push(\"girsmTextureGIContrib\");\r\n }\r\n\r\n public bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"girsmTextureGIContrib\", this.textureGIContrib);\r\n uniformBuffer.updateFloat2(\"girsmTextureOutputSize\", this.outputTextureWidth, this.outputTextureHeight);\r\n }\r\n }\r\n\r\n public getCustomCode(shaderType: string) {\r\n const frag: { [name: string]: string } = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_GIRSM\r\n uniform sampler2D girsmTextureGIContrib;\r\n\r\n vec3 computeIndirect() {\r\n vec2 uv = gl_FragCoord.xy / girsmTextureOutputSize;\r\n return texture2D(girsmTextureGIContrib, uv).rgb;\r\n }\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: `\r\n #ifdef RENDER_WITH_GIRSM\r\n finalDiffuse += computeIndirect() * surfaceAlbedo.rgb;\r\n #endif\r\n `,\r\n };\r\n\r\n if (!this._isPBR) {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_GIRSM\r\n color.rgb += computeIndirect() * baseColor.rgb;\r\n #endif\r\n `;\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.GIRSMRenderPluginMaterial`, GIRSMRenderPluginMaterial);\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"depthPeelingRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/depthPeelingRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b\r\n */\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { MultiRenderTarget } from \"../Materials/Textures/multiRenderTarget\";\r\nimport type { InternalTextureCreationOptions } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Scene } from \"../scene\";\r\nimport { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport type { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport type { PrePassRenderer } from \"./prePassRenderer\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { Material } from \"../Materials/material\";\r\n\r\nimport \"../Shaders/postprocess.vertex\";\r\nimport \"../Shaders/oitFinal.fragment\";\r\nimport \"../Shaders/oitBackBlend.fragment\";\r\n\r\nclass DepthPeelingEffectConfiguration implements PrePassEffectConfiguration {\r\n /**\r\n * Is this effect enabled\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Name of the configuration\r\n */\r\n public name = \"depthPeeling\";\r\n\r\n /**\r\n * Textures that should be present in the MRT for this effect to work\r\n */\r\n public readonly texturesRequired: number[] = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n}\r\n\r\n/**\r\n * The depth peeling renderer that performs\r\n * Order independant transparency (OIT).\r\n * This should not be instanciated directly, as it is part of a scene component\r\n */\r\nexport class DepthPeelingRenderer {\r\n private _scene: Scene;\r\n private _engine: Engine;\r\n private _depthMrts: MultiRenderTarget[];\r\n private _thinTextures: ThinTexture[] = [];\r\n private _colorMrts: MultiRenderTarget[];\r\n private _blendBackMrt: MultiRenderTarget;\r\n private _outputRT: RenderTargetTexture;\r\n\r\n private _blendBackEffectWrapper: EffectWrapper;\r\n private _blendBackEffectWrapperPingPong: EffectWrapper;\r\n private _finalEffectWrapper: EffectWrapper;\r\n private _effectRenderer: EffectRenderer;\r\n\r\n private _currentPingPongState: number = 0;\r\n private _prePassEffectConfiguration: DepthPeelingEffectConfiguration;\r\n\r\n private _blendBackTexture: InternalTexture;\r\n private _layoutCacheFormat = [[true], [true, true], [true, true, true]];\r\n private _layoutCache: number[][] = [];\r\n private _renderPassIds: number[];\r\n private _candidateSubMeshes: SmartArray<SubMesh> = new SmartArray(10);\r\n private _excludedSubMeshes: SmartArray<SubMesh> = new SmartArray(10);\r\n private _excludedMeshes: number[] = [];\r\n\r\n private static _DEPTH_CLEAR_VALUE = -99999.0;\r\n private static _MIN_DEPTH = 0;\r\n private static _MAX_DEPTH = 1;\r\n\r\n private _colorCache = [\r\n new Color4(DepthPeelingRenderer._DEPTH_CLEAR_VALUE, DepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0),\r\n new Color4(-DepthPeelingRenderer._MIN_DEPTH, DepthPeelingRenderer._MAX_DEPTH, 0, 0),\r\n new Color4(0, 0, 0, 0),\r\n ];\r\n\r\n private _passCount: number;\r\n /**\r\n * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.\r\n */\r\n public get passCount(): number {\r\n return this._passCount;\r\n }\r\n\r\n public set passCount(count: number) {\r\n if (this._passCount === count) {\r\n return;\r\n }\r\n this._passCount = count;\r\n this._createRenderPassIds();\r\n }\r\n\r\n private _useRenderPasses: boolean;\r\n /**\r\n * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.\r\n */\r\n public get useRenderPasses() {\r\n return this._useRenderPasses;\r\n }\r\n\r\n public set useRenderPasses(usePasses: boolean) {\r\n if (this._useRenderPasses === usePasses) {\r\n return;\r\n }\r\n this._useRenderPasses = usePasses;\r\n this._createRenderPassIds();\r\n }\r\n\r\n /**\r\n * Add a mesh in the exclusion list to prevent it to be handled by the depth peeling renderer\r\n * @param mesh The mesh to exclude from the depth peeling renderer\r\n */\r\n public addExcludedMesh(mesh: AbstractMesh): void {\r\n if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {\r\n this._excludedMeshes.push(mesh.uniqueId);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the exclusion list of the depth peeling renderer\r\n * @param mesh The mesh to remove\r\n */\r\n public removeExcludedMesh(mesh: AbstractMesh): void {\r\n const index = this._excludedMeshes.indexOf(mesh.uniqueId);\r\n if (index !== -1) {\r\n this._excludedMeshes.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Instanciates the depth peeling renderer\r\n * @param scene Scene to attach to\r\n * @param passCount Number of depth layers to peel\r\n * @returns The depth peeling renderer\r\n */\r\n constructor(scene: Scene, passCount: number = 5) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._passCount = passCount;\r\n\r\n // We need a depth texture for opaque\r\n if (!scene.enablePrePassRenderer()) {\r\n Logger.Warn(\"Depth peeling for order independant transparency could not enable PrePass, aborting.\");\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this._layoutCacheFormat.length; ++i) {\r\n this._layoutCache[i] = this._engine.buildTextureLayout(this._layoutCacheFormat[i]);\r\n }\r\n\r\n this._renderPassIds = [];\r\n this.useRenderPasses = false;\r\n\r\n this._prePassEffectConfiguration = new DepthPeelingEffectConfiguration();\r\n this._createTextures();\r\n this._createEffects();\r\n }\r\n\r\n private _createRenderPassIds(): void {\r\n this._releaseRenderPassIds();\r\n if (this._useRenderPasses) {\r\n for (let i = 0; i < this._passCount + 1; ++i) {\r\n if (!this._renderPassIds[i]) {\r\n this._renderPassIds[i] = this._engine.createRenderPassId(`DepthPeelingRenderer - pass #${i}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _releaseRenderPassIds(): void {\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n this._engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n this._renderPassIds = [];\r\n }\r\n\r\n private _createTextures() {\r\n const size = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n };\r\n\r\n // 2 for ping pong\r\n this._depthMrts = [\r\n new MultiRenderTarget(\"depthPeelingDepth0MRT\", size, 3, this._scene, undefined, [\r\n \"depthPeelingDepth0MRT_depth\",\r\n \"depthPeelingDepth0MRT_frontColor\",\r\n \"depthPeelingDepth0MRT_backColor\",\r\n ]),\r\n new MultiRenderTarget(\"depthPeelingDepth1MRT\", size, 3, this._scene, undefined, [\r\n \"depthPeelingDepth1MRT_depth\",\r\n \"depthPeelingDepth1MRT_frontColor\",\r\n \"depthPeelingDepth1MRT_backColor\",\r\n ]),\r\n ];\r\n this._colorMrts = [\r\n new MultiRenderTarget(\"depthPeelingColor0MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\r\n \"depthPeelingColor0MRT_frontColor\",\r\n \"depthPeelingColor0MRT_backColor\",\r\n ]),\r\n new MultiRenderTarget(\"depthPeelingColor1MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\r\n \"depthPeelingColor1MRT_frontColor\",\r\n \"depthPeelingColor1MRT_backColor\",\r\n ]),\r\n ];\r\n this._blendBackMrt = new MultiRenderTarget(\"depthPeelingBackMRT\", size, 1, this._scene, { generateDepthBuffer: false }, [\"depthPeelingBackMRT_blendBack\"]);\r\n this._outputRT = new RenderTargetTexture(\"depthPeelingOutputRTT\", size, this._scene, false);\r\n\r\n // 0 is a depth texture\r\n // 1 is a color texture\r\n const optionsArray = [\r\n {\r\n format: Constants.TEXTUREFORMAT_RG, // For MSAA we need RGBA\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n type: this._engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT,\r\n label: \"DepthPeelingRenderer-DepthTexture\",\r\n } as InternalTextureCreationOptions,\r\n {\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT, // For MSAA we need FLOAT\r\n label: \"DepthPeelingRenderer-ColorTexture\",\r\n } as InternalTextureCreationOptions,\r\n ];\r\n\r\n for (let i = 0; i < 2; i++) {\r\n const depthTexture = this._engine._createInternalTexture(size, optionsArray[0], false);\r\n const frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\r\n const backColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\r\n\r\n this._depthMrts[i].setInternalTexture(depthTexture, 0);\r\n this._depthMrts[i].setInternalTexture(frontColorTexture, 1);\r\n this._depthMrts[i].setInternalTexture(backColorTexture, 2);\r\n this._colorMrts[i].setInternalTexture(frontColorTexture, 0);\r\n this._colorMrts[i].setInternalTexture(backColorTexture, 1);\r\n\r\n this._thinTextures.push(new ThinTexture(depthTexture), new ThinTexture(frontColorTexture), new ThinTexture(backColorTexture));\r\n }\r\n }\r\n\r\n // TODO : explore again MSAA with depth peeling when\r\n // we are able to fetch individual samples in a multisampled renderbuffer\r\n // public set samples(value: number) {\r\n // for (let i = 0; i < 2; i++) {\r\n // this._depthMrts[i].samples = value;\r\n // this._colorMrts[i].samples = value;\r\n // }\r\n // this._scene.prePassRenderer!.samples = value;\r\n // }\r\n\r\n private _disposeTextures() {\r\n for (let i = 0; i < this._thinTextures.length; i++) {\r\n if (i === 6) {\r\n // Do not dispose the shared texture with the prepass\r\n continue;\r\n }\r\n this._thinTextures[i].dispose();\r\n }\r\n\r\n for (let i = 0; i < 2; i++) {\r\n this._depthMrts[i].dispose(true);\r\n this._colorMrts[i].dispose(true);\r\n this._blendBackMrt.dispose(true);\r\n }\r\n this._outputRT.dispose();\r\n\r\n this._thinTextures = [];\r\n this._colorMrts = [];\r\n this._depthMrts = [];\r\n }\r\n\r\n private _updateTextures() {\r\n if (this._depthMrts[0].getSize().width !== this._engine.getRenderWidth() || this._depthMrts[0].getSize().height !== this._engine.getRenderHeight()) {\r\n this._disposeTextures();\r\n this._createTextures();\r\n }\r\n return this._updateTextureReferences();\r\n }\r\n\r\n private _updateTextureReferences() {\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n\r\n if (!prePassRenderer) {\r\n return false;\r\n }\r\n\r\n // Retrieve opaque color texture\r\n const textureIndex = prePassRenderer.getIndex(Constants.PREPASS_COLOR_TEXTURE_TYPE);\r\n const prePassTexture = prePassRenderer.defaultRT.textures?.length ? prePassRenderer.defaultRT.textures[textureIndex].getInternalTexture() : null;\r\n\r\n if (!prePassTexture) {\r\n return false;\r\n }\r\n\r\n if (this._blendBackTexture !== prePassTexture) {\r\n this._blendBackTexture = prePassTexture;\r\n this._blendBackMrt.setInternalTexture(this._blendBackTexture, 0);\r\n\r\n if (this._thinTextures[6]) {\r\n this._thinTextures[6].dispose();\r\n }\r\n this._thinTextures[6] = new ThinTexture(this._blendBackTexture);\r\n\r\n prePassRenderer.defaultRT.renderTarget!.shareDepth(this._depthMrts[0].renderTarget!);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _createEffects() {\r\n this._blendBackEffectWrapper = new EffectWrapper({\r\n fragmentShader: \"oitBackBlend\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uBackColor\"],\r\n uniformNames: [],\r\n });\r\n this._blendBackEffectWrapperPingPong = new EffectWrapper({\r\n fragmentShader: \"oitBackBlend\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uBackColor\"],\r\n uniformNames: [],\r\n });\r\n\r\n this._finalEffectWrapper = new EffectWrapper({\r\n fragmentShader: \"oitFinal\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uFrontColor\", \"uBackColor\"],\r\n uniformNames: [],\r\n });\r\n\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n }\r\n\r\n /**\r\n * Links to the prepass renderer\r\n * @param prePassRenderer The scene PrePassRenderer\r\n */\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer) {\r\n prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\r\n }\r\n\r\n /**\r\n * Binds depth peeling textures on an effect\r\n * @param effect The effect to bind textures on\r\n */\r\n public bind(effect: Effect) {\r\n effect.setTexture(\"oitDepthSampler\", this._thinTextures[this._currentPingPongState * 3]);\r\n effect.setTexture(\"oitFrontColorSampler\", this._thinTextures[this._currentPingPongState * 3 + 1]);\r\n }\r\n\r\n private _renderSubMeshes(transparentSubMeshes: SmartArray<SubMesh>) {\r\n let mapMaterialContext: { [uniqueId: number]: IMaterialContext | undefined };\r\n if (this._useRenderPasses) {\r\n mapMaterialContext = {};\r\n }\r\n for (let j = 0; j < transparentSubMeshes.length; j++) {\r\n const material = transparentSubMeshes.data[j].getMaterial();\r\n let previousShaderHotSwapping = true;\r\n let previousBFC = false;\r\n\r\n const subMesh = transparentSubMeshes.data[j];\r\n let drawWrapper: DrawWrapper | undefined;\r\n let firstDraw = false;\r\n\r\n if (this._useRenderPasses) {\r\n drawWrapper = subMesh._getDrawWrapper();\r\n firstDraw = !drawWrapper;\r\n }\r\n\r\n if (material) {\r\n previousShaderHotSwapping = material.allowShaderHotSwapping;\r\n previousBFC = material.backFaceCulling;\r\n material.allowShaderHotSwapping = false;\r\n material.backFaceCulling = false;\r\n }\r\n\r\n subMesh.render(false);\r\n\r\n if (firstDraw) {\r\n // first time we draw this submesh: we replace the material context\r\n drawWrapper = subMesh._getDrawWrapper()!; // we are sure it is now non empty as we just rendered the submesh\r\n if (drawWrapper.materialContext) {\r\n let newMaterialContext = mapMaterialContext![drawWrapper.materialContext.uniqueId];\r\n if (!newMaterialContext) {\r\n newMaterialContext = mapMaterialContext![drawWrapper.materialContext.uniqueId] = this._engine.createMaterialContext();\r\n }\r\n subMesh._getDrawWrapper()!.materialContext = newMaterialContext;\r\n }\r\n }\r\n\r\n if (material) {\r\n material.allowShaderHotSwapping = previousShaderHotSwapping;\r\n material.backFaceCulling = previousBFC;\r\n }\r\n }\r\n }\r\n\r\n private _finalCompose(writeId: number) {\r\n const output = this._scene.prePassRenderer?.setCustomOutput(this._outputRT);\r\n if (output) {\r\n this._engine.bindFramebuffer(this._outputRT.renderTarget!);\r\n } else {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n this._engine.applyStates();\r\n\r\n this._engine.enableEffect(this._finalEffectWrapper._drawWrapper);\r\n this._finalEffectWrapper.effect.setTexture(\"uFrontColor\", this._thinTextures[writeId * 3 + 1]);\r\n this._finalEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[6]);\r\n this._effectRenderer.render(this._finalEffectWrapper);\r\n }\r\n\r\n /**\r\n * Checks if the depth peeling renderer is ready to render transparent meshes\r\n * @returns true if the depth peeling renderer is ready to render the transparent meshes\r\n */\r\n public isReady() {\r\n return (\r\n this._blendBackEffectWrapper.effect.isReady() &&\r\n this._blendBackEffectWrapperPingPong.effect.isReady() &&\r\n this._finalEffectWrapper.effect.isReady() &&\r\n this._updateTextures()\r\n );\r\n }\r\n\r\n /**\r\n * Renders transparent submeshes with depth peeling\r\n * @param transparentSubMeshes List of transparent meshes to render\r\n * @returns The array of submeshes that could not be handled by this renderer\r\n */\r\n public render(transparentSubMeshes: SmartArray<SubMesh>): SmartArray<SubMesh> {\r\n this._candidateSubMeshes.length = 0;\r\n this._excludedSubMeshes.length = 0;\r\n if (!this.isReady()) {\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n\r\n for (let i = 0; i < transparentSubMeshes.length; i++) {\r\n const subMesh = transparentSubMeshes.data[i];\r\n const material = subMesh.getMaterial();\r\n const fillMode = material && subMesh.getRenderingMesh()._getRenderingFillMode(material.fillMode);\r\n\r\n if (\r\n material &&\r\n (fillMode === Material.TriangleFanDrawMode || fillMode === Material.TriangleFillMode || fillMode === Material.TriangleStripDrawMode) &&\r\n this._excludedMeshes.indexOf(subMesh.getMesh().uniqueId) === -1\r\n ) {\r\n this._candidateSubMeshes.push(subMesh);\r\n } else {\r\n this._excludedSubMeshes.push(subMesh);\r\n }\r\n }\r\n\r\n if (!this._candidateSubMeshes.length) {\r\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget!);\r\n\r\n this._finalCompose(1);\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n const currentRenderPassId = this._engine.currentRenderPassId;\r\n\r\n (this._scene.prePassRenderer! as any)._enabled = false;\r\n\r\n if (this._useRenderPasses) {\r\n this._engine.currentRenderPassId = this._renderPassIds[0];\r\n }\r\n\r\n // Clears\r\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[0], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._depthMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[1], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[1].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[0].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget!);\r\n\r\n // Draw depth for first pass\r\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE_ONEONE); // in WebGPU, when using MIN or MAX equation, the src / dst color factors should not use SRC_ALPHA and the src / dst alpha factors must be 1 else WebGPU will throw a validation error\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_MAX);\r\n this._engine.depthCullingState.depthMask = false;\r\n this._engine.depthCullingState.depthTest = true;\r\n this._engine.applyStates();\r\n\r\n this._currentPingPongState = 1;\r\n // Render\r\n this._renderSubMeshes(this._candidateSubMeshes);\r\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget!);\r\n\r\n this._scene.resetCachedMaterial();\r\n\r\n // depth peeling ping-pong\r\n let readId = 0;\r\n let writeId = 0;\r\n\r\n for (let i = 0; i < this._passCount; i++) {\r\n readId = i % 2;\r\n writeId = 1 - readId;\r\n this._currentPingPongState = readId;\r\n\r\n if (this._useRenderPasses) {\r\n this._engine.currentRenderPassId = this._renderPassIds[i + 1];\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n\r\n // Clears\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[0], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[writeId].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[2]);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE_ONEONE); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_MAX);\r\n this._engine.depthCullingState.depthTest = false;\r\n this._engine.applyStates();\r\n\r\n // Render\r\n this._renderSubMeshes(this._candidateSubMeshes);\r\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n\r\n this._scene.resetCachedMaterial();\r\n\r\n // Back color\r\n this._engine.bindFramebuffer(this._blendBackMrt.renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_ADD);\r\n this._engine.setAlphaMode(Constants.ALPHA_LAYER_ACCUMULATE);\r\n this._engine.applyStates();\r\n\r\n const blendBackEffectWrapper = writeId === 0 || !this._useRenderPasses ? this._blendBackEffectWrapper : this._blendBackEffectWrapperPingPong;\r\n this._engine.enableEffect(blendBackEffectWrapper._drawWrapper);\r\n blendBackEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[writeId * 3 + 2]);\r\n this._effectRenderer.render(blendBackEffectWrapper);\r\n this._engine.unBindFramebuffer(this._blendBackMrt.renderTarget!);\r\n }\r\n\r\n this._engine.currentRenderPassId = currentRenderPassId;\r\n\r\n // Final composition on default FB\r\n this._finalCompose(writeId);\r\n\r\n (this._scene.prePassRenderer! as any)._enabled = true;\r\n this._engine.depthCullingState.depthMask = true;\r\n this._engine.depthCullingState.depthTest = true;\r\n\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n /**\r\n * Disposes the depth peeling renderer and associated ressources\r\n */\r\n public dispose() {\r\n this._disposeTextures();\r\n this._blendBackEffectWrapper.dispose();\r\n this._finalEffectWrapper.dispose();\r\n this._effectRenderer.dispose();\r\n this._releaseRenderPassIds();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"depthPeelingRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/depthPeelingRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b\r\n */\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { MultiRenderTarget } from \"../Materials/Textures/multiRenderTarget\";\r\nimport type { InternalTextureCreationOptions } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Scene } from \"../scene\";\r\nimport { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport type { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport type { PrePassRenderer } from \"./prePassRenderer\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { Material } from \"../Materials/material\";\r\n\r\nimport \"../Shaders/postprocess.vertex\";\r\nimport \"../Shaders/oitFinal.fragment\";\r\nimport \"../Shaders/oitBackBlend.fragment\";\r\n\r\nclass DepthPeelingEffectConfiguration implements PrePassEffectConfiguration {\r\n /**\r\n * Is this effect enabled\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Name of the configuration\r\n */\r\n public name = \"depthPeeling\";\r\n\r\n /**\r\n * Textures that should be present in the MRT for this effect to work\r\n */\r\n public readonly texturesRequired: number[] = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n}\r\n\r\n/**\r\n * The depth peeling renderer that performs\r\n * Order independant transparency (OIT).\r\n * This should not be instanciated directly, as it is part of a scene component\r\n */\r\nexport class DepthPeelingRenderer {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _depthMrts: MultiRenderTarget[];\r\n private _thinTextures: ThinTexture[] = [];\r\n private _colorMrts: MultiRenderTarget[];\r\n private _blendBackMrt: MultiRenderTarget;\r\n private _outputRT: RenderTargetTexture;\r\n\r\n private _blendBackEffectWrapper: EffectWrapper;\r\n private _blendBackEffectWrapperPingPong: EffectWrapper;\r\n private _finalEffectWrapper: EffectWrapper;\r\n private _effectRenderer: EffectRenderer;\r\n\r\n private _currentPingPongState: number = 0;\r\n private _prePassEffectConfiguration: DepthPeelingEffectConfiguration;\r\n\r\n private _blendBackTexture: InternalTexture;\r\n private _layoutCacheFormat = [[true], [true, true], [true, true, true]];\r\n private _layoutCache: number[][] = [];\r\n private _renderPassIds: number[];\r\n private _candidateSubMeshes: SmartArray<SubMesh> = new SmartArray(10);\r\n private _excludedSubMeshes: SmartArray<SubMesh> = new SmartArray(10);\r\n private _excludedMeshes: number[] = [];\r\n\r\n private static _DEPTH_CLEAR_VALUE = -99999.0;\r\n private static _MIN_DEPTH = 0;\r\n private static _MAX_DEPTH = 1;\r\n\r\n private _colorCache = [\r\n new Color4(DepthPeelingRenderer._DEPTH_CLEAR_VALUE, DepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0),\r\n new Color4(-DepthPeelingRenderer._MIN_DEPTH, DepthPeelingRenderer._MAX_DEPTH, 0, 0),\r\n new Color4(0, 0, 0, 0),\r\n ];\r\n\r\n private _passCount: number;\r\n /**\r\n * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.\r\n */\r\n public get passCount(): number {\r\n return this._passCount;\r\n }\r\n\r\n public set passCount(count: number) {\r\n if (this._passCount === count) {\r\n return;\r\n }\r\n this._passCount = count;\r\n this._createRenderPassIds();\r\n }\r\n\r\n private _useRenderPasses: boolean;\r\n /**\r\n * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.\r\n */\r\n public get useRenderPasses() {\r\n return this._useRenderPasses;\r\n }\r\n\r\n public set useRenderPasses(usePasses: boolean) {\r\n if (this._useRenderPasses === usePasses) {\r\n return;\r\n }\r\n this._useRenderPasses = usePasses;\r\n this._createRenderPassIds();\r\n }\r\n\r\n /**\r\n * Add a mesh in the exclusion list to prevent it to be handled by the depth peeling renderer\r\n * @param mesh The mesh to exclude from the depth peeling renderer\r\n */\r\n public addExcludedMesh(mesh: AbstractMesh): void {\r\n if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {\r\n this._excludedMeshes.push(mesh.uniqueId);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the exclusion list of the depth peeling renderer\r\n * @param mesh The mesh to remove\r\n */\r\n public removeExcludedMesh(mesh: AbstractMesh): void {\r\n const index = this._excludedMeshes.indexOf(mesh.uniqueId);\r\n if (index !== -1) {\r\n this._excludedMeshes.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Instanciates the depth peeling renderer\r\n * @param scene Scene to attach to\r\n * @param passCount Number of depth layers to peel\r\n * @returns The depth peeling renderer\r\n */\r\n constructor(scene: Scene, passCount: number = 5) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._passCount = passCount;\r\n\r\n // We need a depth texture for opaque\r\n if (!scene.enablePrePassRenderer()) {\r\n Logger.Warn(\"Depth peeling for order independant transparency could not enable PrePass, aborting.\");\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this._layoutCacheFormat.length; ++i) {\r\n this._layoutCache[i] = this._engine.buildTextureLayout(this._layoutCacheFormat[i]);\r\n }\r\n\r\n this._renderPassIds = [];\r\n this.useRenderPasses = false;\r\n\r\n this._prePassEffectConfiguration = new DepthPeelingEffectConfiguration();\r\n this._createTextures();\r\n this._createEffects();\r\n }\r\n\r\n private _createRenderPassIds(): void {\r\n this._releaseRenderPassIds();\r\n if (this._useRenderPasses) {\r\n for (let i = 0; i < this._passCount + 1; ++i) {\r\n if (!this._renderPassIds[i]) {\r\n this._renderPassIds[i] = this._engine.createRenderPassId(`DepthPeelingRenderer - pass #${i}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _releaseRenderPassIds(): void {\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n this._engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n this._renderPassIds = [];\r\n }\r\n\r\n private _createTextures() {\r\n const size = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n };\r\n\r\n // 2 for ping pong\r\n this._depthMrts = [\r\n new MultiRenderTarget(\"depthPeelingDepth0MRT\", size, 3, this._scene, undefined, [\r\n \"depthPeelingDepth0MRT_depth\",\r\n \"depthPeelingDepth0MRT_frontColor\",\r\n \"depthPeelingDepth0MRT_backColor\",\r\n ]),\r\n new MultiRenderTarget(\"depthPeelingDepth1MRT\", size, 3, this._scene, undefined, [\r\n \"depthPeelingDepth1MRT_depth\",\r\n \"depthPeelingDepth1MRT_frontColor\",\r\n \"depthPeelingDepth1MRT_backColor\",\r\n ]),\r\n ];\r\n this._colorMrts = [\r\n new MultiRenderTarget(\"depthPeelingColor0MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\r\n \"depthPeelingColor0MRT_frontColor\",\r\n \"depthPeelingColor0MRT_backColor\",\r\n ]),\r\n new MultiRenderTarget(\"depthPeelingColor1MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\r\n \"depthPeelingColor1MRT_frontColor\",\r\n \"depthPeelingColor1MRT_backColor\",\r\n ]),\r\n ];\r\n this._blendBackMrt = new MultiRenderTarget(\"depthPeelingBackMRT\", size, 1, this._scene, { generateDepthBuffer: false }, [\"depthPeelingBackMRT_blendBack\"]);\r\n this._outputRT = new RenderTargetTexture(\"depthPeelingOutputRTT\", size, this._scene, false);\r\n\r\n // 0 is a depth texture\r\n // 1 is a color texture\r\n const optionsArray = [\r\n {\r\n format: Constants.TEXTUREFORMAT_RG, // For MSAA we need RGBA\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n type: this._engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT,\r\n label: \"DepthPeelingRenderer-DepthTexture\",\r\n } as InternalTextureCreationOptions,\r\n {\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT, // For MSAA we need FLOAT\r\n label: \"DepthPeelingRenderer-ColorTexture\",\r\n } as InternalTextureCreationOptions,\r\n ];\r\n\r\n for (let i = 0; i < 2; i++) {\r\n const depthTexture = this._engine._createInternalTexture(size, optionsArray[0], false);\r\n const frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\r\n const backColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\r\n\r\n this._depthMrts[i].setInternalTexture(depthTexture, 0);\r\n this._depthMrts[i].setInternalTexture(frontColorTexture, 1);\r\n this._depthMrts[i].setInternalTexture(backColorTexture, 2);\r\n this._colorMrts[i].setInternalTexture(frontColorTexture, 0);\r\n this._colorMrts[i].setInternalTexture(backColorTexture, 1);\r\n\r\n this._thinTextures.push(new ThinTexture(depthTexture), new ThinTexture(frontColorTexture), new ThinTexture(backColorTexture));\r\n }\r\n }\r\n\r\n // TODO : explore again MSAA with depth peeling when\r\n // we are able to fetch individual samples in a multisampled renderbuffer\r\n // public set samples(value: number) {\r\n // for (let i = 0; i < 2; i++) {\r\n // this._depthMrts[i].samples = value;\r\n // this._colorMrts[i].samples = value;\r\n // }\r\n // this._scene.prePassRenderer!.samples = value;\r\n // }\r\n\r\n private _disposeTextures() {\r\n for (let i = 0; i < this._thinTextures.length; i++) {\r\n if (i === 6) {\r\n // Do not dispose the shared texture with the prepass\r\n continue;\r\n }\r\n this._thinTextures[i].dispose();\r\n }\r\n\r\n for (let i = 0; i < 2; i++) {\r\n this._depthMrts[i].dispose(true);\r\n this._colorMrts[i].dispose(true);\r\n this._blendBackMrt.dispose(true);\r\n }\r\n this._outputRT.dispose();\r\n\r\n this._thinTextures = [];\r\n this._colorMrts = [];\r\n this._depthMrts = [];\r\n }\r\n\r\n private _updateTextures() {\r\n if (this._depthMrts[0].getSize().width !== this._engine.getRenderWidth() || this._depthMrts[0].getSize().height !== this._engine.getRenderHeight()) {\r\n this._disposeTextures();\r\n this._createTextures();\r\n }\r\n return this._updateTextureReferences();\r\n }\r\n\r\n private _updateTextureReferences() {\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n\r\n if (!prePassRenderer) {\r\n return false;\r\n }\r\n\r\n // Retrieve opaque color texture\r\n const textureIndex = prePassRenderer.getIndex(Constants.PREPASS_COLOR_TEXTURE_TYPE);\r\n const prePassTexture = prePassRenderer.defaultRT.textures?.length ? prePassRenderer.defaultRT.textures[textureIndex].getInternalTexture() : null;\r\n\r\n if (!prePassTexture) {\r\n return false;\r\n }\r\n\r\n if (this._blendBackTexture !== prePassTexture) {\r\n this._blendBackTexture = prePassTexture;\r\n this._blendBackMrt.setInternalTexture(this._blendBackTexture, 0);\r\n\r\n if (this._thinTextures[6]) {\r\n this._thinTextures[6].dispose();\r\n }\r\n this._thinTextures[6] = new ThinTexture(this._blendBackTexture);\r\n\r\n prePassRenderer.defaultRT.renderTarget!.shareDepth(this._depthMrts[0].renderTarget!);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _createEffects() {\r\n this._blendBackEffectWrapper = new EffectWrapper({\r\n fragmentShader: \"oitBackBlend\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uBackColor\"],\r\n uniformNames: [],\r\n });\r\n this._blendBackEffectWrapperPingPong = new EffectWrapper({\r\n fragmentShader: \"oitBackBlend\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uBackColor\"],\r\n uniformNames: [],\r\n });\r\n\r\n this._finalEffectWrapper = new EffectWrapper({\r\n fragmentShader: \"oitFinal\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uFrontColor\", \"uBackColor\"],\r\n uniformNames: [],\r\n });\r\n\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n }\r\n\r\n /**\r\n * Links to the prepass renderer\r\n * @param prePassRenderer The scene PrePassRenderer\r\n */\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer) {\r\n prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\r\n }\r\n\r\n /**\r\n * Binds depth peeling textures on an effect\r\n * @param effect The effect to bind textures on\r\n */\r\n public bind(effect: Effect) {\r\n effect.setTexture(\"oitDepthSampler\", this._thinTextures[this._currentPingPongState * 3]);\r\n effect.setTexture(\"oitFrontColorSampler\", this._thinTextures[this._currentPingPongState * 3 + 1]);\r\n }\r\n\r\n private _renderSubMeshes(transparentSubMeshes: SmartArray<SubMesh>) {\r\n let mapMaterialContext: { [uniqueId: number]: IMaterialContext | undefined };\r\n if (this._useRenderPasses) {\r\n mapMaterialContext = {};\r\n }\r\n for (let j = 0; j < transparentSubMeshes.length; j++) {\r\n const material = transparentSubMeshes.data[j].getMaterial();\r\n let previousShaderHotSwapping = true;\r\n let previousBFC = false;\r\n\r\n const subMesh = transparentSubMeshes.data[j];\r\n let drawWrapper: DrawWrapper | undefined;\r\n let firstDraw = false;\r\n\r\n if (this._useRenderPasses) {\r\n drawWrapper = subMesh._getDrawWrapper();\r\n firstDraw = !drawWrapper;\r\n }\r\n\r\n if (material) {\r\n previousShaderHotSwapping = material.allowShaderHotSwapping;\r\n previousBFC = material.backFaceCulling;\r\n material.allowShaderHotSwapping = false;\r\n material.backFaceCulling = false;\r\n }\r\n\r\n subMesh.render(false);\r\n\r\n if (firstDraw) {\r\n // first time we draw this submesh: we replace the material context\r\n drawWrapper = subMesh._getDrawWrapper()!; // we are sure it is now non empty as we just rendered the submesh\r\n if (drawWrapper.materialContext) {\r\n let newMaterialContext = mapMaterialContext![drawWrapper.materialContext.uniqueId];\r\n if (!newMaterialContext) {\r\n newMaterialContext = mapMaterialContext![drawWrapper.materialContext.uniqueId] = this._engine.createMaterialContext();\r\n }\r\n subMesh._getDrawWrapper()!.materialContext = newMaterialContext;\r\n }\r\n }\r\n\r\n if (material) {\r\n material.allowShaderHotSwapping = previousShaderHotSwapping;\r\n material.backFaceCulling = previousBFC;\r\n }\r\n }\r\n }\r\n\r\n private _finalCompose(writeId: number) {\r\n const output = this._scene.prePassRenderer?.setCustomOutput(this._outputRT);\r\n if (output) {\r\n this._engine.bindFramebuffer(this._outputRT.renderTarget!);\r\n } else {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n this._engine.applyStates();\r\n\r\n this._engine.enableEffect(this._finalEffectWrapper._drawWrapper);\r\n this._finalEffectWrapper.effect.setTexture(\"uFrontColor\", this._thinTextures[writeId * 3 + 1]);\r\n this._finalEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[6]);\r\n this._effectRenderer.render(this._finalEffectWrapper);\r\n }\r\n\r\n /**\r\n * Checks if the depth peeling renderer is ready to render transparent meshes\r\n * @returns true if the depth peeling renderer is ready to render the transparent meshes\r\n */\r\n public isReady() {\r\n return (\r\n this._blendBackEffectWrapper.effect.isReady() &&\r\n this._blendBackEffectWrapperPingPong.effect.isReady() &&\r\n this._finalEffectWrapper.effect.isReady() &&\r\n this._updateTextures()\r\n );\r\n }\r\n\r\n /**\r\n * Renders transparent submeshes with depth peeling\r\n * @param transparentSubMeshes List of transparent meshes to render\r\n * @returns The array of submeshes that could not be handled by this renderer\r\n */\r\n public render(transparentSubMeshes: SmartArray<SubMesh>): SmartArray<SubMesh> {\r\n this._candidateSubMeshes.length = 0;\r\n this._excludedSubMeshes.length = 0;\r\n if (!this.isReady()) {\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n\r\n for (let i = 0; i < transparentSubMeshes.length; i++) {\r\n const subMesh = transparentSubMeshes.data[i];\r\n const material = subMesh.getMaterial();\r\n const fillMode = material && subMesh.getRenderingMesh()._getRenderingFillMode(material.fillMode);\r\n\r\n if (\r\n material &&\r\n (fillMode === Material.TriangleFanDrawMode || fillMode === Material.TriangleFillMode || fillMode === Material.TriangleStripDrawMode) &&\r\n this._excludedMeshes.indexOf(subMesh.getMesh().uniqueId) === -1\r\n ) {\r\n this._candidateSubMeshes.push(subMesh);\r\n } else {\r\n this._excludedSubMeshes.push(subMesh);\r\n }\r\n }\r\n\r\n if (!this._candidateSubMeshes.length) {\r\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget!);\r\n\r\n this._finalCompose(1);\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n const currentRenderPassId = this._engine.currentRenderPassId;\r\n\r\n (this._scene.prePassRenderer! as any)._enabled = false;\r\n\r\n if (this._useRenderPasses) {\r\n this._engine.currentRenderPassId = this._renderPassIds[0];\r\n }\r\n\r\n // Clears\r\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[0], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._depthMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[1], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[1].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[0].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget!);\r\n\r\n // Draw depth for first pass\r\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE_ONEONE); // in WebGPU, when using MIN or MAX equation, the src / dst color factors should not use SRC_ALPHA and the src / dst alpha factors must be 1 else WebGPU will throw a validation error\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_MAX);\r\n this._engine.depthCullingState.depthMask = false;\r\n this._engine.depthCullingState.depthTest = true;\r\n this._engine.applyStates();\r\n\r\n this._currentPingPongState = 1;\r\n // Render\r\n this._renderSubMeshes(this._candidateSubMeshes);\r\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget!);\r\n\r\n this._scene.resetCachedMaterial();\r\n\r\n // depth peeling ping-pong\r\n let readId = 0;\r\n let writeId = 0;\r\n\r\n for (let i = 0; i < this._passCount; i++) {\r\n readId = i % 2;\r\n writeId = 1 - readId;\r\n this._currentPingPongState = readId;\r\n\r\n if (this._useRenderPasses) {\r\n this._engine.currentRenderPassId = this._renderPassIds[i + 1];\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n\r\n // Clears\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[0], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[writeId].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[2]);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE_ONEONE); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_MAX);\r\n this._engine.depthCullingState.depthTest = false;\r\n this._engine.applyStates();\r\n\r\n // Render\r\n this._renderSubMeshes(this._candidateSubMeshes);\r\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n\r\n this._scene.resetCachedMaterial();\r\n\r\n // Back color\r\n this._engine.bindFramebuffer(this._blendBackMrt.renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_ADD);\r\n this._engine.setAlphaMode(Constants.ALPHA_LAYER_ACCUMULATE);\r\n this._engine.applyStates();\r\n\r\n const blendBackEffectWrapper = writeId === 0 || !this._useRenderPasses ? this._blendBackEffectWrapper : this._blendBackEffectWrapperPingPong;\r\n this._engine.enableEffect(blendBackEffectWrapper._drawWrapper);\r\n blendBackEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[writeId * 3 + 2]);\r\n this._effectRenderer.render(blendBackEffectWrapper);\r\n this._engine.unBindFramebuffer(this._blendBackMrt.renderTarget!);\r\n }\r\n\r\n this._engine.currentRenderPassId = currentRenderPassId;\r\n\r\n // Final composition on default FB\r\n this._finalCompose(writeId);\r\n\r\n (this._scene.prePassRenderer! as any)._enabled = true;\r\n this._engine.depthCullingState.depthMask = true;\r\n this._engine.depthCullingState.depthTest = true;\r\n\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n /**\r\n * Disposes the depth peeling renderer and associated ressources\r\n */\r\n public dispose() {\r\n this._disposeTextures();\r\n this._blendBackEffectWrapper.dispose();\r\n this._finalEffectWrapper.dispose();\r\n this._effectRenderer.dispose();\r\n this._releaseRenderPassIds();\r\n }\r\n}\r\n"]}