@babylonjs/core 5.0.0-alpha.61 → 5.0.0-alpha.65

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 (519) hide show
  1. package/Animations/animation.js +42 -2
  2. package/Animations/animation.js.map +1 -1
  3. package/Animations/animationGroup.d.ts +5 -1
  4. package/Animations/animationGroup.js +19 -1
  5. package/Animations/animationGroup.js.map +1 -1
  6. package/Audio/sound.js +15 -1
  7. package/Audio/sound.js.map +1 -1
  8. package/Behaviors/Cameras/autoRotationBehavior.d.ts +5 -0
  9. package/Behaviors/Cameras/autoRotationBehavior.js +7 -0
  10. package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
  11. package/Behaviors/Meshes/followBehavior.js +1 -1
  12. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  13. package/Behaviors/Meshes/handConstraintBehavior.js +16 -12
  14. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  15. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.js +1 -1
  16. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.js.map +1 -1
  17. package/Cameras/VR/vrExperienceHelper.d.ts +1 -1
  18. package/Cameras/VR/vrExperienceHelper.js +1 -1
  19. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  20. package/Cameras/camera.js +2 -2
  21. package/Cameras/camera.js.map +1 -1
  22. package/DeviceInput/Implementations/{nativeDeviceInputWrapper.d.ts → nativeDeviceInputSystem.d.ts} +5 -21
  23. package/DeviceInput/Implementations/{nativeDeviceInputWrapper.js → nativeDeviceInputSystem.js} +19 -20
  24. package/DeviceInput/Implementations/nativeDeviceInputSystem.js.map +1 -0
  25. package/DeviceInput/Implementations/webDeviceInputSystem.d.ts +7 -20
  26. package/DeviceInput/Implementations/webDeviceInputSystem.js +79 -71
  27. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  28. package/DeviceInput/InputDevices/deviceSourceManager.d.ts +3 -2
  29. package/DeviceInput/InputDevices/deviceSourceManager.js +5 -1
  30. package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
  31. package/DeviceInput/Interfaces/inputInterfaces.d.ts +6 -13
  32. package/DeviceInput/Interfaces/inputInterfaces.js.map +1 -1
  33. package/DeviceInput/deviceInputSystem.d.ts +49 -5
  34. package/DeviceInput/deviceInputSystem.js +62 -10
  35. package/DeviceInput/deviceInputSystem.js.map +1 -1
  36. package/DeviceInput/index.d.ts +1 -1
  37. package/DeviceInput/index.js +1 -1
  38. package/DeviceInput/index.js.map +1 -1
  39. package/Engines/Extensions/engine.dynamicTexture.d.ts +2 -1
  40. package/Engines/Extensions/engine.dynamicTexture.js +2 -1
  41. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  42. package/Engines/Extensions/engine.views.d.ts +1 -1
  43. package/Engines/Extensions/engine.views.js +1 -1
  44. package/Engines/Extensions/engine.views.js.map +1 -1
  45. package/Engines/Processors/iShaderProcessor.d.ts +1 -1
  46. package/Engines/Processors/iShaderProcessor.js.map +1 -1
  47. package/Engines/Processors/shaderProcessingOptions.d.ts +5 -0
  48. package/Engines/Processors/shaderProcessingOptions.js.map +1 -1
  49. package/Engines/Processors/shaderProcessor.js +8 -2
  50. package/Engines/Processors/shaderProcessor.js.map +1 -1
  51. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +3 -11
  52. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  53. package/Engines/WebGPU/Extensions/engine.multiRender.js +19 -9
  54. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  55. package/Engines/WebGPU/Extensions/engine.renderTarget.js +9 -6
  56. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  57. package/Engines/WebGPU/webgpuBufferManager.d.ts +1 -1
  58. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  59. package/Engines/WebGPU/webgpuCacheBindGroups.js +3 -3
  60. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  61. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +4 -1
  62. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +37 -83
  63. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  64. package/Engines/WebGPU/webgpuCacheSampler.js +6 -4
  65. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  66. package/Engines/WebGPU/webgpuClearQuad.d.ts +1 -1
  67. package/Engines/WebGPU/webgpuClearQuad.js +29 -11
  68. package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
  69. package/Engines/WebGPU/webgpuComputeContext.js +2 -2
  70. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  71. package/Engines/WebGPU/webgpuConstants.d.ts +57 -13
  72. package/Engines/WebGPU/webgpuConstants.js +62 -13
  73. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  74. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +24 -4
  75. package/Engines/WebGPU/webgpuHardwareTexture.js +12 -2
  76. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  77. package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +6 -0
  78. package/Engines/WebGPU/webgpuRenderTargetWrapper.js +12 -0
  79. package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -0
  80. package/Engines/WebGPU/webgpuShaderProcessingContext.js +2 -0
  81. package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
  82. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +2 -0
  83. package/Engines/WebGPU/webgpuShaderProcessor.js +23 -0
  84. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  85. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.d.ts +1 -0
  86. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +17 -1
  87. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  88. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +1 -2
  89. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +11 -30
  90. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  91. package/Engines/WebGPU/webgpuTextureHelper.d.ts +9 -2
  92. package/Engines/WebGPU/webgpuTextureHelper.js +291 -66
  93. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  94. package/Engines/engine.d.ts +145 -45
  95. package/Engines/engine.js +5 -1
  96. package/Engines/engine.js.map +1 -1
  97. package/Engines/nativeEngine.d.ts +11 -0
  98. package/Engines/nativeEngine.js +78 -18
  99. package/Engines/nativeEngine.js.map +1 -1
  100. package/Engines/renderTargetWrapper.d.ts +1 -1
  101. package/Engines/renderTargetWrapper.js +1 -1
  102. package/Engines/renderTargetWrapper.js.map +1 -1
  103. package/Engines/thinEngine.js +2 -2
  104. package/Engines/thinEngine.js.map +1 -1
  105. package/Engines/webgpuEngine.d.ts +5 -13
  106. package/Engines/webgpuEngine.js +37 -75
  107. package/Engines/webgpuEngine.js.map +1 -1
  108. package/Gizmos/positionGizmo.js +1 -1
  109. package/Gizmos/positionGizmo.js.map +1 -1
  110. package/Inputs/scene.inputManager.js +6 -1
  111. package/Inputs/scene.inputManager.js.map +1 -1
  112. package/Layers/effectLayer.d.ts +4 -0
  113. package/Layers/effectLayer.js +10 -0
  114. package/Layers/effectLayer.js.map +1 -1
  115. package/Layers/glowLayer.d.ts +8 -0
  116. package/Layers/glowLayer.js +7 -3
  117. package/Layers/glowLayer.js.map +1 -1
  118. package/Layers/highlightLayer.js +2 -0
  119. package/Layers/highlightLayer.js.map +1 -1
  120. package/Lights/Shadows/shadowGenerator.js +1 -1
  121. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  122. package/Lights/light.js +4 -1
  123. package/Lights/light.js.map +1 -1
  124. package/Lights/pointLight.js +1 -1
  125. package/Lights/pointLight.js.map +1 -1
  126. package/Lights/spotLight.js +1 -1
  127. package/Lights/spotLight.js.map +1 -1
  128. package/Loading/Plugins/babylonFileLoader.js +10 -7
  129. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  130. package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
  131. package/Materials/Node/Blocks/Fragment/index.js +1 -0
  132. package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
  133. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +1 -3
  134. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -1
  135. package/Materials/Node/Blocks/Fragment/twirlBlock.d.ts +49 -0
  136. package/Materials/Node/Blocks/Fragment/twirlBlock.js +145 -0
  137. package/Materials/Node/Blocks/Fragment/twirlBlock.js.map +1 -0
  138. package/Materials/Node/Blocks/customBlock.d.ts +31 -0
  139. package/Materials/Node/Blocks/customBlock.js +144 -0
  140. package/Materials/Node/Blocks/customBlock.js.map +1 -0
  141. package/Materials/Node/Blocks/index.d.ts +1 -0
  142. package/Materials/Node/Blocks/index.js +1 -0
  143. package/Materials/Node/Blocks/index.js.map +1 -1
  144. package/Materials/Node/nodeMaterial.js +8 -0
  145. package/Materials/Node/nodeMaterial.js.map +1 -1
  146. package/Materials/Node/nodeMaterialBlock.js +1 -1
  147. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  148. package/Materials/PBR/index.d.ts +4 -0
  149. package/Materials/PBR/index.js +4 -0
  150. package/Materials/PBR/index.js.map +1 -1
  151. package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +28 -96
  152. package/Materials/PBR/pbrAnisotropicConfiguration.js +50 -111
  153. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  154. package/Materials/PBR/pbrBRDFConfiguration.d.ts +11 -37
  155. package/Materials/PBR/pbrBRDFConfiguration.js +39 -52
  156. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  157. package/Materials/PBR/pbrBaseMaterial.d.ts +15 -74
  158. package/Materials/PBR/pbrBaseMaterial.js +67 -182
  159. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  160. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  161. package/Materials/PBR/pbrClearCoatConfiguration.d.ts +23 -98
  162. package/Materials/PBR/pbrClearCoatConfiguration.js +91 -143
  163. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  164. package/Materials/PBR/pbrSheenConfiguration.d.ts +25 -93
  165. package/Materials/PBR/pbrSheenConfiguration.js +71 -126
  166. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  167. package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +28 -114
  168. package/Materials/PBR/pbrSubSurfaceConfiguration.js +150 -211
  169. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  170. package/Materials/Textures/dynamicTexture.d.ts +3 -2
  171. package/Materials/Textures/dynamicTexture.js +5 -3
  172. package/Materials/Textures/dynamicTexture.js.map +1 -1
  173. package/Materials/Textures/multiRenderTarget.js +3 -0
  174. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  175. package/Materials/Textures/renderTargetTexture.js +1 -1
  176. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  177. package/Materials/Textures/thinRenderTargetTexture.js +1 -1
  178. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  179. package/Materials/Textures/thinTexture.d.ts +1 -2
  180. package/Materials/Textures/thinTexture.js +2 -4
  181. package/Materials/Textures/thinTexture.js.map +1 -1
  182. package/Materials/Textures/videoTexture.d.ts +1 -1
  183. package/Materials/Textures/videoTexture.js +1 -1
  184. package/Materials/Textures/videoTexture.js.map +1 -1
  185. package/Materials/effect.d.ts +6 -1
  186. package/Materials/effect.js +4 -1
  187. package/Materials/effect.js.map +1 -1
  188. package/Materials/fresnelParameters.d.ts +1 -1
  189. package/Materials/fresnelParameters.js +1 -1
  190. package/Materials/fresnelParameters.js.map +1 -1
  191. package/Materials/index.d.ts +4 -0
  192. package/Materials/index.js +4 -0
  193. package/Materials/index.js.map +1 -1
  194. package/Materials/material.d.ts +43 -2
  195. package/Materials/material.detailMapConfiguration.d.ts +29 -87
  196. package/Materials/material.detailMapConfiguration.js +50 -106
  197. package/Materials/material.detailMapConfiguration.js.map +1 -1
  198. package/Materials/material.js +99 -8
  199. package/Materials/material.js.map +1 -1
  200. package/Materials/materialDefines.d.ts +16 -0
  201. package/Materials/materialDefines.js +17 -5
  202. package/Materials/materialDefines.js.map +1 -1
  203. package/Materials/materialPluginBase.d.ts +182 -0
  204. package/Materials/materialPluginBase.js +209 -0
  205. package/Materials/materialPluginBase.js.map +1 -0
  206. package/Materials/materialPluginEvent.d.ts +98 -0
  207. package/Materials/materialPluginEvent.js +21 -0
  208. package/Materials/materialPluginEvent.js.map +1 -0
  209. package/Materials/materialPluginFactoryExport.d.ts +40 -0
  210. package/Materials/materialPluginFactoryExport.js +75 -0
  211. package/Materials/materialPluginFactoryExport.js.map +1 -0
  212. package/Materials/materialPluginManager.d.ts +90 -0
  213. package/Materials/materialPluginManager.js +323 -0
  214. package/Materials/materialPluginManager.js.map +1 -0
  215. package/Materials/shaderMaterial.d.ts +1 -1
  216. package/Materials/shaderMaterial.js +13 -1
  217. package/Materials/shaderMaterial.js.map +1 -1
  218. package/Materials/standardMaterial.d.ts +13 -10
  219. package/Materials/standardMaterial.js +45 -51
  220. package/Materials/standardMaterial.js.map +1 -1
  221. package/Materials/uniformBuffer.d.ts +7 -0
  222. package/Materials/uniformBuffer.js +22 -0
  223. package/Materials/uniformBuffer.js.map +1 -1
  224. package/Maths/math.vector.d.ts +12 -8
  225. package/Maths/math.vector.js +22 -14
  226. package/Maths/math.vector.js.map +1 -1
  227. package/Meshes/Builders/capsuleBuilder.d.ts +1 -1
  228. package/Meshes/Builders/capsuleBuilder.js +1 -1
  229. package/Meshes/Builders/capsuleBuilder.js.map +1 -1
  230. package/Meshes/abstractMesh.d.ts +1 -1
  231. package/Meshes/abstractMesh.js +24 -23
  232. package/Meshes/abstractMesh.js.map +1 -1
  233. package/Meshes/geometry.js +2 -2
  234. package/Meshes/geometry.js.map +1 -1
  235. package/Meshes/linesMesh.d.ts +1 -1
  236. package/Meshes/linesMesh.js +3 -2
  237. package/Meshes/linesMesh.js.map +1 -1
  238. package/Meshes/mesh.d.ts +12 -0
  239. package/Meshes/mesh.js +184 -115
  240. package/Meshes/mesh.js.map +1 -1
  241. package/Meshes/mesh.lts.d.ts +8 -8
  242. package/Meshes/mesh.lts.js.map +1 -1
  243. package/Meshes/mesh.vertexData.d.ts +6 -1
  244. package/Meshes/mesh.vertexData.js +295 -114
  245. package/Meshes/mesh.vertexData.js.map +1 -1
  246. package/Meshes/transformNode.js +20 -13
  247. package/Meshes/transformNode.js.map +1 -1
  248. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.d.ts +2 -1
  249. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +38 -33
  250. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
  251. package/Misc/PerformanceViewer/performanceViewerCollector.d.ts +29 -4
  252. package/Misc/PerformanceViewer/performanceViewerCollector.js +36 -12
  253. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  254. package/Misc/assetsManager.d.ts +4 -4
  255. package/Misc/assetsManager.js +2 -2
  256. package/Misc/assetsManager.js.map +1 -1
  257. package/Misc/basis.js +1 -0
  258. package/Misc/basis.js.map +1 -1
  259. package/Misc/coroutine.d.ts +41 -0
  260. package/Misc/coroutine.js +136 -0
  261. package/Misc/coroutine.js.map +1 -0
  262. package/Misc/index.d.ts +1 -0
  263. package/Misc/index.js +1 -0
  264. package/Misc/index.js.map +1 -1
  265. package/Misc/interfaces/iPerfViewer.d.ts +4 -0
  266. package/Misc/interfaces/iPerfViewer.js.map +1 -1
  267. package/Misc/observableCoroutine.d.ts +9 -10
  268. package/Misc/observableCoroutine.js +34 -39
  269. package/Misc/observableCoroutine.js.map +1 -1
  270. package/Misc/sceneSerializer.js +1 -0
  271. package/Misc/sceneSerializer.js.map +1 -1
  272. package/Particles/particleSystem.js +3 -0
  273. package/Particles/particleSystem.js.map +1 -1
  274. package/Particles/subEmitter.js +1 -0
  275. package/Particles/subEmitter.js.map +1 -1
  276. package/PostProcesses/screenSpaceReflectionPostProcess.d.ts +1 -0
  277. package/PostProcesses/screenSpaceReflectionPostProcess.js +4 -0
  278. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  279. package/Rendering/depthPeelingRenderer.d.ts +4 -1
  280. package/Rendering/depthPeelingRenderer.js +34 -9
  281. package/Rendering/depthPeelingRenderer.js.map +1 -1
  282. package/Rendering/depthRenderer.js +1 -1
  283. package/Rendering/depthRenderer.js.map +1 -1
  284. package/Rendering/outlineRenderer.js +24 -1
  285. package/Rendering/outlineRenderer.js.map +1 -1
  286. package/Rendering/prePassRenderer.js +7 -7
  287. package/Rendering/prePassRenderer.js.map +1 -1
  288. package/Rendering/renderingGroup.js +5 -1
  289. package/Rendering/renderingGroup.js.map +1 -1
  290. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js +1 -1
  291. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js.map +1 -1
  292. package/Shaders/ShadersInclude/defaultUboDeclaration.js +1 -1
  293. package/Shaders/ShadersInclude/defaultUboDeclaration.js.map +1 -1
  294. package/Shaders/ShadersInclude/defaultVertexDeclaration.js +1 -1
  295. package/Shaders/ShadersInclude/defaultVertexDeclaration.js.map +1 -1
  296. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +1 -1
  297. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  298. package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
  299. package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  300. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +1 -1
  301. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  302. package/Shaders/anaglyph.fragment.js +1 -1
  303. package/Shaders/anaglyph.fragment.js.map +1 -1
  304. package/Shaders/background.fragment.js +1 -1
  305. package/Shaders/background.fragment.js.map +1 -1
  306. package/Shaders/background.vertex.js +1 -1
  307. package/Shaders/background.vertex.js.map +1 -1
  308. package/Shaders/blackAndWhite.fragment.js +1 -1
  309. package/Shaders/blackAndWhite.fragment.js.map +1 -1
  310. package/Shaders/bloomMerge.fragment.js +1 -1
  311. package/Shaders/bloomMerge.fragment.js.map +1 -1
  312. package/Shaders/blur.fragment.js +1 -1
  313. package/Shaders/blur.fragment.js.map +1 -1
  314. package/Shaders/boundingBoxRenderer.fragment.js +1 -1
  315. package/Shaders/boundingBoxRenderer.fragment.js.map +1 -1
  316. package/Shaders/boundingBoxRenderer.vertex.js +1 -1
  317. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -1
  318. package/Shaders/chromaticAberration.fragment.js +1 -1
  319. package/Shaders/chromaticAberration.fragment.js.map +1 -1
  320. package/Shaders/circleOfConfusion.fragment.js +1 -1
  321. package/Shaders/circleOfConfusion.fragment.js.map +1 -1
  322. package/Shaders/clearQuad.vertex.js +1 -1
  323. package/Shaders/clearQuad.vertex.js.map +1 -1
  324. package/Shaders/color.fragment.js +1 -1
  325. package/Shaders/color.fragment.js.map +1 -1
  326. package/Shaders/color.vertex.js +1 -1
  327. package/Shaders/color.vertex.js.map +1 -1
  328. package/Shaders/colorCorrection.fragment.js +1 -1
  329. package/Shaders/colorCorrection.fragment.js.map +1 -1
  330. package/Shaders/convolution.fragment.js +1 -1
  331. package/Shaders/convolution.fragment.js.map +1 -1
  332. package/Shaders/default.fragment.js +1 -1
  333. package/Shaders/default.fragment.js.map +1 -1
  334. package/Shaders/depth.fragment.js +1 -1
  335. package/Shaders/depth.fragment.js.map +1 -1
  336. package/Shaders/depth.vertex.js +1 -1
  337. package/Shaders/depth.vertex.js.map +1 -1
  338. package/Shaders/depthBoxBlur.fragment.js +1 -1
  339. package/Shaders/depthBoxBlur.fragment.js.map +1 -1
  340. package/Shaders/depthOfField.fragment.js +1 -1
  341. package/Shaders/depthOfField.fragment.js.map +1 -1
  342. package/Shaders/depthOfFieldMerge.fragment.js +1 -1
  343. package/Shaders/depthOfFieldMerge.fragment.js.map +1 -1
  344. package/Shaders/displayPass.fragment.js +1 -1
  345. package/Shaders/displayPass.fragment.js.map +1 -1
  346. package/Shaders/extractHighlights.fragment.js +1 -1
  347. package/Shaders/extractHighlights.fragment.js.map +1 -1
  348. package/Shaders/filter.fragment.js +1 -1
  349. package/Shaders/filter.fragment.js.map +1 -1
  350. package/Shaders/fxaa.vertex.js +1 -1
  351. package/Shaders/fxaa.vertex.js.map +1 -1
  352. package/Shaders/geometry.vertex.js +1 -1
  353. package/Shaders/geometry.vertex.js.map +1 -1
  354. package/Shaders/glowBlurPostProcess.fragment.js +1 -1
  355. package/Shaders/glowBlurPostProcess.fragment.js.map +1 -1
  356. package/Shaders/glowMapGeneration.fragment.js +1 -1
  357. package/Shaders/glowMapGeneration.fragment.js.map +1 -1
  358. package/Shaders/glowMapGeneration.vertex.js +1 -1
  359. package/Shaders/glowMapGeneration.vertex.js.map +1 -1
  360. package/Shaders/glowMapMerge.fragment.js +1 -1
  361. package/Shaders/glowMapMerge.fragment.js.map +1 -1
  362. package/Shaders/glowMapMerge.vertex.js +1 -1
  363. package/Shaders/glowMapMerge.vertex.js.map +1 -1
  364. package/Shaders/grain.fragment.js +1 -1
  365. package/Shaders/grain.fragment.js.map +1 -1
  366. package/Shaders/hdrFiltering.vertex.js +1 -1
  367. package/Shaders/hdrFiltering.vertex.js.map +1 -1
  368. package/Shaders/highlights.fragment.js +1 -1
  369. package/Shaders/highlights.fragment.js.map +1 -1
  370. package/Shaders/imageProcessing.fragment.js +1 -1
  371. package/Shaders/imageProcessing.fragment.js.map +1 -1
  372. package/Shaders/kernelBlur.fragment.js +1 -1
  373. package/Shaders/kernelBlur.fragment.js.map +1 -1
  374. package/Shaders/kernelBlur.vertex.js +1 -1
  375. package/Shaders/kernelBlur.vertex.js.map +1 -1
  376. package/Shaders/layer.fragment.js +1 -1
  377. package/Shaders/layer.fragment.js.map +1 -1
  378. package/Shaders/layer.vertex.js +1 -1
  379. package/Shaders/layer.vertex.js.map +1 -1
  380. package/Shaders/lensFlare.fragment.js +1 -1
  381. package/Shaders/lensFlare.fragment.js.map +1 -1
  382. package/Shaders/lensFlare.vertex.js +1 -1
  383. package/Shaders/lensFlare.vertex.js.map +1 -1
  384. package/Shaders/lensHighlights.fragment.js +1 -1
  385. package/Shaders/lensHighlights.fragment.js.map +1 -1
  386. package/Shaders/line.fragment.js +1 -1
  387. package/Shaders/line.fragment.js.map +1 -1
  388. package/Shaders/line.vertex.js +1 -1
  389. package/Shaders/line.vertex.js.map +1 -1
  390. package/Shaders/minmaxRedux.fragment.js +1 -1
  391. package/Shaders/minmaxRedux.fragment.js.map +1 -1
  392. package/Shaders/motionBlur.fragment.js +1 -1
  393. package/Shaders/motionBlur.fragment.js.map +1 -1
  394. package/Shaders/noise.fragment.js +1 -1
  395. package/Shaders/noise.fragment.js.map +1 -1
  396. package/Shaders/outline.fragment.d.ts +2 -0
  397. package/Shaders/outline.fragment.js +3 -1
  398. package/Shaders/outline.fragment.js.map +1 -1
  399. package/Shaders/outline.vertex.d.ts +2 -0
  400. package/Shaders/outline.vertex.js +3 -1
  401. package/Shaders/outline.vertex.js.map +1 -1
  402. package/Shaders/particles.fragment.js +1 -1
  403. package/Shaders/particles.fragment.js.map +1 -1
  404. package/Shaders/particles.vertex.js +1 -1
  405. package/Shaders/particles.vertex.js.map +1 -1
  406. package/Shaders/pass.fragment.js +1 -1
  407. package/Shaders/pass.fragment.js.map +1 -1
  408. package/Shaders/passCube.fragment.js +1 -1
  409. package/Shaders/passCube.fragment.js.map +1 -1
  410. package/Shaders/pbr.fragment.js +1 -1
  411. package/Shaders/pbr.fragment.js.map +1 -1
  412. package/Shaders/postprocess.vertex.js +1 -1
  413. package/Shaders/postprocess.vertex.js.map +1 -1
  414. package/Shaders/procedural.vertex.js +1 -1
  415. package/Shaders/procedural.vertex.js.map +1 -1
  416. package/Shaders/rgbdDecode.fragment.js +1 -1
  417. package/Shaders/rgbdDecode.fragment.js.map +1 -1
  418. package/Shaders/rgbdEncode.fragment.js +1 -1
  419. package/Shaders/rgbdEncode.fragment.js.map +1 -1
  420. package/Shaders/screenSpaceCurvature.fragment.js +1 -1
  421. package/Shaders/screenSpaceCurvature.fragment.js.map +1 -1
  422. package/Shaders/screenSpaceReflection.fragment.js +1 -1
  423. package/Shaders/screenSpaceReflection.fragment.js.map +1 -1
  424. package/Shaders/shadowMap.fragment.js +1 -1
  425. package/Shaders/shadowMap.fragment.js.map +1 -1
  426. package/Shaders/shadowMap.vertex.js +1 -1
  427. package/Shaders/shadowMap.vertex.js.map +1 -1
  428. package/Shaders/sharpen.fragment.js +1 -1
  429. package/Shaders/sharpen.fragment.js.map +1 -1
  430. package/Shaders/sprites.fragment.js +1 -1
  431. package/Shaders/sprites.fragment.js.map +1 -1
  432. package/Shaders/sprites.vertex.js +1 -1
  433. package/Shaders/sprites.vertex.js.map +1 -1
  434. package/Shaders/ssaoCombine.fragment.js +1 -1
  435. package/Shaders/ssaoCombine.fragment.js.map +1 -1
  436. package/Shaders/standard.fragment.js +1 -1
  437. package/Shaders/standard.fragment.js.map +1 -1
  438. package/Shaders/stereoscopicInterlace.fragment.js +1 -1
  439. package/Shaders/stereoscopicInterlace.fragment.js.map +1 -1
  440. package/Shaders/subSurfaceScattering.fragment.js +1 -1
  441. package/Shaders/subSurfaceScattering.fragment.js.map +1 -1
  442. package/Shaders/tonemap.fragment.js +1 -1
  443. package/Shaders/tonemap.fragment.js.map +1 -1
  444. package/Shaders/volumetricLightScattering.fragment.js +1 -1
  445. package/Shaders/volumetricLightScattering.fragment.js.map +1 -1
  446. package/Shaders/volumetricLightScatteringPass.fragment.js +1 -1
  447. package/Shaders/volumetricLightScatteringPass.fragment.js.map +1 -1
  448. package/Shaders/volumetricLightScatteringPass.vertex.js +1 -1
  449. package/Shaders/volumetricLightScatteringPass.vertex.js.map +1 -1
  450. package/Shaders/vrDistortionCorrection.fragment.js +1 -1
  451. package/Shaders/vrDistortionCorrection.fragment.js.map +1 -1
  452. package/Shaders/vrMultiviewToSingleview.fragment.js +1 -1
  453. package/Shaders/vrMultiviewToSingleview.fragment.js.map +1 -1
  454. package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js +1 -1
  455. package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js.map +1 -1
  456. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +1 -1
  457. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
  458. package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
  459. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  460. package/XR/features/WebXRControllerPointerSelection.d.ts +14 -0
  461. package/XR/features/WebXRControllerPointerSelection.js +55 -21
  462. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  463. package/XR/features/WebXRHandTracking.d.ts +2 -0
  464. package/XR/features/WebXRHandTracking.js +34 -14
  465. package/XR/features/WebXRHandTracking.js.map +1 -1
  466. package/XR/features/WebXRLayers.d.ts +78 -0
  467. package/XR/features/WebXRLayers.js +243 -0
  468. package/XR/features/WebXRLayers.js.map +1 -0
  469. package/XR/features/WebXRPlaneDetector.js +8 -12
  470. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  471. package/XR/features/index.d.ts +1 -0
  472. package/XR/features/index.js +1 -0
  473. package/XR/features/index.js.map +1 -1
  474. package/XR/index.d.ts +1 -0
  475. package/XR/index.js +1 -0
  476. package/XR/index.js.map +1 -1
  477. package/XR/native/index.d.ts +2 -0
  478. package/XR/native/index.js +3 -0
  479. package/XR/native/index.js.map +1 -0
  480. package/XR/native/nativeXRFrame.d.ts +27 -0
  481. package/XR/native/nativeXRFrame.js +81 -0
  482. package/XR/native/nativeXRFrame.js.map +1 -0
  483. package/XR/native/nativeXRRenderTarget.d.ts +44 -0
  484. package/XR/native/nativeXRRenderTarget.js +81 -0
  485. package/XR/native/nativeXRRenderTarget.js.map +1 -0
  486. package/XR/webXRCamera.js +2 -10
  487. package/XR/webXRCamera.js.map +1 -1
  488. package/XR/webXRExperienceHelper.js +15 -13
  489. package/XR/webXRExperienceHelper.js.map +1 -1
  490. package/XR/webXRFeaturesManager.d.ts +4 -0
  491. package/XR/webXRFeaturesManager.js +5 -1
  492. package/XR/webXRFeaturesManager.js.map +1 -1
  493. package/XR/webXRLayerWrapper.d.ts +48 -0
  494. package/XR/webXRLayerWrapper.js +60 -0
  495. package/XR/webXRLayerWrapper.js.map +1 -0
  496. package/XR/webXRManagedOutputCanvas.d.ts +2 -1
  497. package/XR/webXRManagedOutputCanvas.js +36 -29
  498. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  499. package/XR/webXRRenderTargetTextureProvider.d.ts +55 -0
  500. package/XR/webXRRenderTargetTextureProvider.js +63 -0
  501. package/XR/webXRRenderTargetTextureProvider.js.map +1 -0
  502. package/XR/webXRSessionManager.d.ts +30 -7
  503. package/XR/webXRSessionManager.js +62 -64
  504. package/XR/webXRSessionManager.js.map +1 -1
  505. package/XR/webXRTypes.d.ts +1 -1
  506. package/XR/webXRTypes.js.map +1 -1
  507. package/XR/webXRWebGLLayer.d.ts +36 -0
  508. package/XR/webXRWebGLLayer.js +69 -0
  509. package/XR/webXRWebGLLayer.js.map +1 -0
  510. package/abstractScene.d.ts +1 -1
  511. package/abstractScene.js +1 -1
  512. package/abstractScene.js.map +1 -1
  513. package/assetContainer.js +3 -0
  514. package/assetContainer.js.map +1 -1
  515. package/package.json +51 -6
  516. package/scene.d.ts +4 -0
  517. package/scene.js +4 -0
  518. package/scene.js.map +1 -1
  519. package/DeviceInput/Implementations/nativeDeviceInputWrapper.js.map +0 -1
@@ -46,6 +46,7 @@ var SubEmitter = /** @class */ (function () {
46
46
  if (!particleSystem.emitter || !particleSystem.emitter.dispose) {
47
47
  var internalClass = GetClass("BABYLON.AbstractMesh");
48
48
  particleSystem.emitter = new internalClass("SubemitterSystemEmitter", particleSystem.getScene());
49
+ particleSystem._disposeEmitterOnDispose = true;
49
50
  }
50
51
  }
51
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"subEmitter.js","sourceRoot":"","sources":["../../../sourceES6/core/Particles/subEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../Maths/math.vector\";\r\nimport { _WarnImport } from '../Misc/devTools';\r\nimport { ThinEngine } from '../Engines/thinEngine';\r\nimport { GetClass } from '../Misc/typeStore';\r\n\r\ndeclare type Scene = import(\"../scene\").Scene;\r\ndeclare type AbstractMesh = import(\"../Meshes/abstractMesh\").AbstractMesh;\r\ndeclare type ParticleSystem = import(\"../Particles/particleSystem\").ParticleSystem;\r\n\r\n/**\r\n * Type of sub emitter\r\n */\r\nexport enum SubEmitterType {\r\n /**\r\n * Attached to the particle over it's lifetime\r\n */\r\n ATTACHED,\r\n /**\r\n * Created when the particle dies\r\n */\r\n END\r\n}\r\n\r\n/**\r\n * Sub emitter class used to emit particles from an existing particle\r\n */\r\nexport class SubEmitter {\r\n /**\r\n * Type of the submitter (Default: END)\r\n */\r\n public type = SubEmitterType.END;\r\n /**\r\n * If the particle should inherit the direction from the particle it's attached to. (+Y will face the direction the particle is moving) (Default: false)\r\n * Note: This only is supported when using an emitter of type Mesh\r\n */\r\n public inheritDirection = false;\r\n /**\r\n * How much of the attached particles speed should be added to the sub emitted particle (default: 0)\r\n */\r\n public inheritedVelocityAmount = 0;\r\n /**\r\n * Creates a sub emitter\r\n * @param particleSystem the particle system to be used by the sub emitter\r\n */\r\n constructor(\r\n /**\r\n * the particle system to be used by the sub emitter\r\n */\r\n public particleSystem: ParticleSystem\r\n ) {\r\n // Create mesh as emitter to support rotation\r\n if (!particleSystem.emitter || !(<AbstractMesh>particleSystem.emitter).dispose) {\r\n const internalClass = GetClass(\"BABYLON.AbstractMesh\");\r\n particleSystem.emitter = new internalClass(\"SubemitterSystemEmitter\", particleSystem.getScene());\r\n }\r\n }\r\n /**\r\n * Clones the sub emitter\r\n * @returns the cloned sub emitter\r\n */\r\n public clone(): SubEmitter {\r\n // Clone particle system\r\n var emitter = this.particleSystem.emitter;\r\n if (!emitter) {\r\n emitter = new Vector3();\r\n } else if (emitter instanceof Vector3) {\r\n emitter = emitter.clone();\r\n } else if (emitter.getClassName().indexOf(\"Mesh\") !== -1) {\r\n const internalClass = GetClass(\"BABYLON.Mesh\");\r\n emitter = new internalClass(\"\", emitter.getScene());\r\n (emitter! as any).isVisible = false;\r\n }\r\n var clone = new SubEmitter(this.particleSystem.clone(this.particleSystem.name, emitter));\r\n\r\n // Clone properties\r\n clone.particleSystem.name += \"Clone\";\r\n clone.type = this.type;\r\n clone.inheritDirection = this.inheritDirection;\r\n clone.inheritedVelocityAmount = this.inheritedVelocityAmount;\r\n\r\n clone.particleSystem._disposeEmitterOnDispose = true;\r\n clone.particleSystem.disposeOnStop = true;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serialize current object to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the serialized object\r\n */\r\n public serialize(serializeTexture: boolean = false): any {\r\n let serializationObject: any = {};\r\n\r\n serializationObject.type = this.type;\r\n serializationObject.inheritDirection = this.inheritDirection;\r\n serializationObject.inheritedVelocityAmount = this.inheritedVelocityAmount;\r\n serializationObject.particleSystem = this.particleSystem.serialize(serializeTexture);\r\n\r\n return serializationObject;\r\n }\r\n\r\n /** @hidden */\r\n public static _ParseParticleSystem(system: any, sceneOrEngine: Scene | ThinEngine, rootUrl: string, doNotStart = false): ParticleSystem {\r\n throw _WarnImport(\"ParseParticle\");\r\n }\r\n\r\n /**\r\n * Creates a new SubEmitter from a serialized JSON version\r\n * @param serializationObject defines the JSON object to read from\r\n * @param sceneOrEngine defines the hosting scene or the hosting engine\r\n * @param rootUrl defines the rootUrl for data loading\r\n * @returns a new SubEmitter\r\n */\r\n public static Parse(serializationObject: any, sceneOrEngine: Scene | ThinEngine, rootUrl: string): SubEmitter {\r\n let system = serializationObject.particleSystem;\r\n let subEmitter = new SubEmitter(SubEmitter._ParseParticleSystem(system, sceneOrEngine, rootUrl, true));\r\n subEmitter.type = serializationObject.type;\r\n subEmitter.inheritDirection = serializationObject.inheritDirection;\r\n subEmitter.inheritedVelocityAmount = serializationObject.inheritedVelocityAmount;\r\n subEmitter.particleSystem._isSubEmitter = true;\r\n\r\n return subEmitter;\r\n }\r\n\r\n /** Release associated resources */\r\n public dispose() {\r\n this.particleSystem.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"subEmitter.js","sourceRoot":"","sources":["../../../sourceES6/core/Particles/subEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../Maths/math.vector\";\r\nimport { _WarnImport } from '../Misc/devTools';\r\nimport { ThinEngine } from '../Engines/thinEngine';\r\nimport { GetClass } from '../Misc/typeStore';\r\n\r\ndeclare type Scene = import(\"../scene\").Scene;\r\ndeclare type AbstractMesh = import(\"../Meshes/abstractMesh\").AbstractMesh;\r\ndeclare type ParticleSystem = import(\"../Particles/particleSystem\").ParticleSystem;\r\n\r\n/**\r\n * Type of sub emitter\r\n */\r\nexport enum SubEmitterType {\r\n /**\r\n * Attached to the particle over it's lifetime\r\n */\r\n ATTACHED,\r\n /**\r\n * Created when the particle dies\r\n */\r\n END\r\n}\r\n\r\n/**\r\n * Sub emitter class used to emit particles from an existing particle\r\n */\r\nexport class SubEmitter {\r\n /**\r\n * Type of the submitter (Default: END)\r\n */\r\n public type = SubEmitterType.END;\r\n /**\r\n * If the particle should inherit the direction from the particle it's attached to. (+Y will face the direction the particle is moving) (Default: false)\r\n * Note: This only is supported when using an emitter of type Mesh\r\n */\r\n public inheritDirection = false;\r\n /**\r\n * How much of the attached particles speed should be added to the sub emitted particle (default: 0)\r\n */\r\n public inheritedVelocityAmount = 0;\r\n\r\n /**\r\n * Creates a sub emitter\r\n * @param particleSystem the particle system to be used by the sub emitter\r\n */\r\n constructor(\r\n /**\r\n * the particle system to be used by the sub emitter\r\n */\r\n public particleSystem: ParticleSystem\r\n ) {\r\n // Create mesh as emitter to support rotation\r\n if (!particleSystem.emitter || !(<AbstractMesh>particleSystem.emitter).dispose) {\r\n const internalClass = GetClass(\"BABYLON.AbstractMesh\");\r\n particleSystem.emitter = new internalClass(\"SubemitterSystemEmitter\", particleSystem.getScene());\r\n particleSystem._disposeEmitterOnDispose = true;\r\n }\r\n }\r\n /**\r\n * Clones the sub emitter\r\n * @returns the cloned sub emitter\r\n */\r\n public clone(): SubEmitter {\r\n // Clone particle system\r\n var emitter = this.particleSystem.emitter;\r\n if (!emitter) {\r\n emitter = new Vector3();\r\n } else if (emitter instanceof Vector3) {\r\n emitter = emitter.clone();\r\n } else if (emitter.getClassName().indexOf(\"Mesh\") !== -1) {\r\n const internalClass = GetClass(\"BABYLON.Mesh\");\r\n emitter = new internalClass(\"\", emitter.getScene());\r\n (emitter! as any).isVisible = false;\r\n }\r\n var clone = new SubEmitter(this.particleSystem.clone(this.particleSystem.name, emitter));\r\n\r\n // Clone properties\r\n clone.particleSystem.name += \"Clone\";\r\n clone.type = this.type;\r\n clone.inheritDirection = this.inheritDirection;\r\n clone.inheritedVelocityAmount = this.inheritedVelocityAmount;\r\n\r\n clone.particleSystem._disposeEmitterOnDispose = true;\r\n clone.particleSystem.disposeOnStop = true;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serialize current object to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the serialized object\r\n */\r\n public serialize(serializeTexture: boolean = false): any {\r\n let serializationObject: any = {};\r\n\r\n serializationObject.type = this.type;\r\n serializationObject.inheritDirection = this.inheritDirection;\r\n serializationObject.inheritedVelocityAmount = this.inheritedVelocityAmount;\r\n serializationObject.particleSystem = this.particleSystem.serialize(serializeTexture);\r\n\r\n return serializationObject;\r\n }\r\n\r\n /** @hidden */\r\n public static _ParseParticleSystem(system: any, sceneOrEngine: Scene | ThinEngine, rootUrl: string, doNotStart = false): ParticleSystem {\r\n throw _WarnImport(\"ParseParticle\");\r\n }\r\n\r\n /**\r\n * Creates a new SubEmitter from a serialized JSON version\r\n * @param serializationObject defines the JSON object to read from\r\n * @param sceneOrEngine defines the hosting scene or the hosting engine\r\n * @param rootUrl defines the rootUrl for data loading\r\n * @returns a new SubEmitter\r\n */\r\n public static Parse(serializationObject: any, sceneOrEngine: Scene | ThinEngine, rootUrl: string): SubEmitter {\r\n let system = serializationObject.particleSystem;\r\n let subEmitter = new SubEmitter(SubEmitter._ParseParticleSystem(system, sceneOrEngine, rootUrl, true));\r\n subEmitter.type = serializationObject.type;\r\n subEmitter.inheritDirection = serializationObject.inheritDirection;\r\n subEmitter.inheritedVelocityAmount = serializationObject.inheritedVelocityAmount;\r\n subEmitter.particleSystem._isSubEmitter = true;\r\n\r\n return subEmitter;\r\n }\r\n\r\n /** Release associated resources */\r\n public dispose() {\r\n this.particleSystem.dispose();\r\n }\r\n}\r\n"]}
@@ -35,6 +35,7 @@ export declare class ScreenSpaceReflectionPostProcess extends PostProcess {
35
35
  private _enableSmoothReflections;
36
36
  private _reflectionSamples;
37
37
  private _smoothSteps;
38
+ private _isSceneRightHanded;
38
39
  /**
39
40
  * Gets a string identifying the name of the class
40
41
  * @returns "ScreenSpaceReflectionPostProcess" string
@@ -113,6 +113,7 @@ var ScreenSpaceReflectionPostProcess = /** @class */ (function (_super) {
113
113
  effect.setFloat("stepSize", _this.step);
114
114
  effect.setFloat("roughnessFactor", _this.roughnessFactor);
115
115
  };
116
+ _this._isSceneRightHanded = scene.useRightHandedSystem;
116
117
  return _this;
117
118
  }
118
119
  Object.defineProperty(ScreenSpaceReflectionPostProcess.prototype, "_geometryBufferRenderer", {
@@ -218,6 +219,9 @@ var ScreenSpaceReflectionPostProcess = /** @class */ (function (_super) {
218
219
  if (this._enableSmoothReflections) {
219
220
  defines.push("#define ENABLE_SMOOTH_REFLECTIONS");
220
221
  }
222
+ if (this._isSceneRightHanded) {
223
+ defines.push("#define RIGHT_HANDED_SCENE");
224
+ }
221
225
  defines.push("#define REFLECTION_SAMPLES " + (this._reflectionSamples >> 0));
222
226
  defines.push("#define SMOOTH_STEPS " + (this._smoothSteps >> 0));
223
227
  this.updateEffect(defines.join("\n"));
@@ -1 +1 @@
1
- {"version":3,"file":"screenSpaceReflectionPostProcess.js","sourceRoot":"","sources":["../../../sourceES6/core/PostProcesses/screenSpaceReflectionPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../types\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { PostProcess, PostProcessOptions } from \"./postProcess\";\r\n\r\nimport { GeometryBufferRenderer } from '../Rendering/geometryBufferRenderer';\r\nimport { serialize, SerializationHelper } from '../Misc/decorators';\r\nimport { PrePassRenderer } from \"../Rendering/prePassRenderer\";\r\nimport { ScreenSpaceReflectionsConfiguration } from \"../Rendering/screenSpaceReflectionsConfiguration\";\r\n\r\nimport \"../Shaders/screenSpaceReflection.fragment\";\r\nimport { RegisterClass } from '../Misc/typeStore';\r\n\r\ndeclare type Engine = import(\"../Engines/engine\").Engine;\r\ndeclare type Scene = import(\"../scene\").Scene;\r\n\r\n/**\r\n * The ScreenSpaceReflectionPostProcess performs realtime reflections using only and only the available informations on the screen (positions and normals).\r\n * Basically, the screen space reflection post-process will compute reflections according the material's reflectivity.\r\n */\r\nexport class ScreenSpaceReflectionPostProcess extends PostProcess {\r\n /**\r\n * Gets or sets a reflection threshold mainly used to adjust the reflection's height.\r\n */\r\n @serialize()\r\n public threshold: number = 1.2;\r\n /**\r\n * Gets or sets the current reflection strength. 1.0 is an ideal value but can be increased/decreased for particular results.\r\n */\r\n @serialize()\r\n public strength: number = 1;\r\n /**\r\n * Gets or sets the falloff exponent used while computing fresnel. More the exponent is high, more the reflections will be discrete.\r\n */\r\n @serialize()\r\n public reflectionSpecularFalloffExponent: number = 3;\r\n /**\r\n * Gets or sets the step size used to iterate until the effect finds the color of the reflection's pixel. Typically in interval [0.1, 1.0]\r\n */\r\n @serialize()\r\n public step: number = 1.0;\r\n /**\r\n * Gets or sets the factor applied when computing roughness. Default value is 0.2.\r\n */\r\n @serialize()\r\n public roughnessFactor: number = 0.2;\r\n\r\n private _forceGeometryBuffer: boolean = false;\r\n private get _geometryBufferRenderer(): Nullable<GeometryBufferRenderer> {\r\n if (!this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n\r\n return this._scene.geometryBufferRenderer;\r\n }\r\n\r\n private get _prePassRenderer(): Nullable<PrePassRenderer> {\r\n if (this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n\r\n return this._scene.prePassRenderer;\r\n }\r\n\r\n private _enableSmoothReflections: boolean = false;\r\n private _reflectionSamples: number = 64;\r\n private _smoothSteps: number = 5;\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"ScreenSpaceReflectionPostProcess\" string\r\n */\r\n public getClassName(): string {\r\n return \"ScreenSpaceReflectionPostProcess\";\r\n }\r\n\r\n /**\r\n * Creates a new instance of ScreenSpaceReflectionPostProcess.\r\n * @param name The name of the effect.\r\n * @param scene The scene containing the objects to calculate reflections.\r\n * @param options The required width/height ratio to downsize to before computing the render pass.\r\n * @param camera The camera to apply the render pass to.\r\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\r\n * @param engine The engine which the post process will be applied. (default: current engine)\r\n * @param reusable If the post process can be reused on the same frame. (default: false)\r\n * @param textureType Type of textures used when performing the post process. (default: 0)\r\n * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: true)\r\n * @param forceGeometryBuffer If this post process should use geometry buffer instead of prepass (default: false)\r\n */\r\n constructor(name: string, scene: Scene, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: Engine, reusable?: boolean, textureType: number = 0, blockCompilation = false, forceGeometryBuffer = false) {\r\n super(name, \"screenSpaceReflection\", [\r\n \"projection\", \"view\", \"threshold\", \"reflectionSpecularFalloffExponent\", \"strength\", \"stepSize\", \"roughnessFactor\"\r\n ], [\r\n \"textureSampler\", \"normalSampler\", \"positionSampler\", \"reflectivitySampler\"\r\n ], options, camera, samplingMode, engine, reusable,\r\n \"#define SSR_SUPPORTED\\n#define REFLECTION_SAMPLES 64\\n#define SMOOTH_STEPS 5\\n\",\r\n textureType, undefined, null, blockCompilation);\r\n\r\n this._forceGeometryBuffer = forceGeometryBuffer;\r\n\r\n if (this._forceGeometryBuffer) {\r\n // Get geometry buffer renderer and update effect\r\n const geometryBufferRenderer = scene.enableGeometryBufferRenderer();\r\n if (geometryBufferRenderer) {\r\n if (geometryBufferRenderer.isSupported) {\r\n geometryBufferRenderer.enablePosition = true;\r\n geometryBufferRenderer.enableReflectivity = true;\r\n }\r\n }\r\n } else {\r\n const prePassRenderer = scene.enablePrePassRenderer();\r\n prePassRenderer?.markAsDirty();\r\n this._prePassEffectConfiguration = new ScreenSpaceReflectionsConfiguration();\r\n }\r\n\r\n this._updateEffectDefines();\r\n\r\n // On apply, send uniforms\r\n this.onApply = (effect: Effect) => {\r\n const geometryBufferRenderer = this._geometryBufferRenderer;\r\n const prePassRenderer = this._prePassRenderer;\r\n\r\n if (!prePassRenderer && !geometryBufferRenderer) {\r\n return;\r\n }\r\n\r\n if (geometryBufferRenderer) {\r\n // Samplers\r\n const positionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n const roughnessIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE);\r\n\r\n effect.setTexture(\"normalSampler\", geometryBufferRenderer.getGBuffer().textures[1]);\r\n effect.setTexture(\"positionSampler\", geometryBufferRenderer.getGBuffer().textures[positionIndex]);\r\n effect.setTexture(\"reflectivitySampler\", geometryBufferRenderer.getGBuffer().textures[roughnessIndex]);\r\n } else if (prePassRenderer) {\r\n // Samplers\r\n const positionIndex = prePassRenderer.getIndex(1);\r\n const roughnessIndex = prePassRenderer.getIndex(3);\r\n const normalIndex = prePassRenderer.getIndex(6);\r\n\r\n effect.setTexture(\"normalSampler\", prePassRenderer.getRenderTarget().textures[normalIndex]);\r\n effect.setTexture(\"positionSampler\", prePassRenderer.getRenderTarget().textures[positionIndex]);\r\n effect.setTexture(\"reflectivitySampler\", prePassRenderer.getRenderTarget().textures[roughnessIndex]);\r\n }\r\n\r\n // Uniforms\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const viewMatrix = camera.getViewMatrix(true);\r\n const projectionMatrix = camera.getProjectionMatrix(true);\r\n\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setFloat(\"threshold\", this.threshold);\r\n effect.setFloat(\"reflectionSpecularFalloffExponent\", this.reflectionSpecularFalloffExponent);\r\n effect.setFloat(\"strength\", this.strength);\r\n effect.setFloat(\"stepSize\", this.step);\r\n effect.setFloat(\"roughnessFactor\", this.roughnessFactor);\r\n };\r\n }\r\n\r\n /**\r\n * Gets whether or not smoothing reflections is enabled.\r\n * Enabling smoothing will require more GPU power and can generate a drop in FPS.\r\n */\r\n @serialize()\r\n public get enableSmoothReflections(): boolean {\r\n return this._enableSmoothReflections;\r\n }\r\n\r\n /**\r\n * Sets whether or not smoothing reflections is enabled.\r\n * Enabling smoothing will require more GPU power and can generate a drop in FPS.\r\n */\r\n public set enableSmoothReflections(enabled: boolean) {\r\n if (enabled === this._enableSmoothReflections) {\r\n return;\r\n }\r\n\r\n this._enableSmoothReflections = enabled;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Gets the number of samples taken while computing reflections. More samples count is high,\r\n * more the post-process wil require GPU power and can generate a drop in FPS. Basically in interval [25, 100].\r\n */\r\n @serialize()\r\n public get reflectionSamples(): number {\r\n return this._reflectionSamples;\r\n }\r\n\r\n /**\r\n * Sets the number of samples taken while computing reflections. More samples count is high,\r\n * more the post-process wil require GPU power and can generate a drop in FPS. Basically in interval [25, 100].\r\n */\r\n public set reflectionSamples(samples: number) {\r\n if (samples === this._reflectionSamples) {\r\n return;\r\n }\r\n\r\n this._reflectionSamples = samples;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Gets the number of samples taken while smoothing reflections. More samples count is high,\r\n * more the post-process will require GPU power and can generate a drop in FPS.\r\n * Default value (5.0) work pretty well in all cases but can be adjusted.\r\n */\r\n @serialize()\r\n public get smoothSteps(): number {\r\n return this._smoothSteps;\r\n }\r\n\r\n /*\r\n * Sets the number of samples taken while smoothing reflections. More samples count is high,\r\n * more the post-process will require GPU power and can generate a drop in FPS.\r\n * Default value (5.0) work pretty well in all cases but can be adjusted.\r\n */\r\n public set smoothSteps(steps: number) {\r\n if (steps === this._smoothSteps) {\r\n return;\r\n }\r\n\r\n this._smoothSteps = steps;\r\n this._updateEffectDefines();\r\n }\r\n\r\n private _updateEffectDefines(): void {\r\n const defines: string[] = [];\r\n if (this._geometryBufferRenderer || this._prePassRenderer) {\r\n defines.push(\"#define SSR_SUPPORTED\");\r\n }\r\n if (this._enableSmoothReflections) {\r\n defines.push(\"#define ENABLE_SMOOTH_REFLECTIONS\");\r\n }\r\n\r\n defines.push(\"#define REFLECTION_SAMPLES \" + (this._reflectionSamples >> 0));\r\n defines.push(\"#define SMOOTH_STEPS \" + (this._smoothSteps >> 0));\r\n\r\n this.updateEffect(defines.join(\"\\n\"));\r\n }\r\n\r\n /** @hidden */\r\n public static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string) {\r\n return SerializationHelper.Parse(() => {\r\n return new ScreenSpaceReflectionPostProcess(\r\n parsedPostProcess.name, scene,\r\n parsedPostProcess.options, targetCamera,\r\n parsedPostProcess.renderTargetSamplingMode,\r\n scene.getEngine(), parsedPostProcess.textureType, parsedPostProcess.reusable);\r\n }, parsedPostProcess, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ScreenSpaceReflectionPostProcess\", ScreenSpaceReflectionPostProcess);"]}
1
+ {"version":3,"file":"screenSpaceReflectionPostProcess.js","sourceRoot":"","sources":["../../../sourceES6/core/PostProcesses/screenSpaceReflectionPostProcess.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,WAAW,EAAsB,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,mCAAmC,EAAE,MAAM,kDAAkD,CAAC;AAEvG,OAAO,2CAA2C,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKlD;;;GAGG;AACH;IAAsD,oDAAW;IAyD7D;;;;;;;;;;;;OAYG;IACH,0CAAY,IAAY,EAAE,KAAY,EAAE,OAAoC,EAAE,MAAwB,EAAE,YAAqB,EAAE,MAAe,EAAE,QAAkB,EAAE,WAAuB,EAAE,gBAAwB,EAAE,mBAA2B;QAA9E,4BAAA,EAAA,eAAuB;QAAE,iCAAA,EAAA,wBAAwB;QAAE,oCAAA,EAAA,2BAA2B;QAAlP,YACI,kBAAM,IAAI,EAAE,uBAAuB,EAAE;YACjC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,mCAAmC,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB;SACpH,EAAE;YACC,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB;SAC9E,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAC9C,gFAAgF,EAChF,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,SAoEtD;QAhJD;;WAEG;QAEI,eAAS,GAAW,GAAG,CAAC;QAC/B;;WAEG;QAEI,cAAQ,GAAW,CAAC,CAAC;QAC5B;;WAEG;QAEI,uCAAiC,GAAW,CAAC,CAAC;QACrD;;WAEG;QAEI,UAAI,GAAW,GAAG,CAAC;QAC1B;;WAEG;QAEI,qBAAe,GAAW,GAAG,CAAC;QAE7B,0BAAoB,GAAY,KAAK,CAAC;QAiBtC,8BAAwB,GAAY,KAAK,CAAC;QAC1C,wBAAkB,GAAW,EAAE,CAAC;QAChC,kBAAY,GAAW,CAAC,CAAC;QAiC7B,KAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC;QAEhD,IAAI,KAAI,CAAC,oBAAoB,EAAE;YAC3B,iDAAiD;YACjD,IAAM,sBAAsB,GAAG,KAAK,CAAC,4BAA4B,EAAE,CAAC;YACpE,IAAI,sBAAsB,EAAE;gBACxB,IAAI,sBAAsB,CAAC,WAAW,EAAE;oBACpC,sBAAsB,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC7C,sBAAsB,CAAC,kBAAkB,GAAG,IAAI,CAAC;iBACpD;aACJ;SACJ;aAAM;YACH,IAAM,eAAe,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;YACtD,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,WAAW,EAAE,CAAC;YAC/B,KAAI,CAAC,2BAA2B,GAAG,IAAI,mCAAmC,EAAE,CAAC;SAChF;QAED,KAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,0BAA0B;QAC1B,KAAI,CAAC,OAAO,GAAG,UAAC,MAAc;YAC1B,IAAM,sBAAsB,GAAG,KAAI,CAAC,uBAAuB,CAAC;YAC5D,IAAM,eAAe,GAAG,KAAI,CAAC,gBAAgB,CAAC;YAE9C,IAAI,CAAC,eAAe,IAAI,CAAC,sBAAsB,EAAE;gBAC7C,OAAO;aACV;YAED,IAAI,sBAAsB,EAAE;gBACxB,WAAW;gBACX,IAAM,aAAa,GAAG,sBAAsB,CAAC,eAAe,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;gBAC3G,IAAM,cAAc,GAAG,sBAAsB,CAAC,eAAe,CAAC,sBAAsB,CAAC,yBAAyB,CAAC,CAAC;gBAEhH,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,sBAAsB,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpF,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBAClG,MAAM,CAAC,UAAU,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;aAC1G;iBAAM,IAAI,eAAe,EAAE;gBACxB,WAAW;gBACX,IAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAClD,IAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACnD,IAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAEhD,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5F,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,eAAe,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBAChG,MAAM,CAAC,UAAU,CAAC,qBAAqB,EAAE,eAAe,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;aACxG;YAED,WAAW;YACX,IAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE;gBACT,OAAO;aACV;YAED,IAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE1D,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,mCAAmC,EAAE,KAAI,CAAC,iCAAiC,CAAC,CAAC;YAC7F,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,KAAI,CAAC,eAAe,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,KAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,oBAAoB,CAAC;;IAC1D,CAAC;IArHD,sBAAY,qEAAuB;aAAnC;YACI,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;gBAC5B,OAAO,IAAI,CAAC;aACf;YAED,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;QAC9C,CAAC;;;OAAA;IAED,sBAAY,8DAAgB;aAA5B;YACI,IAAI,IAAI,CAAC,oBAAoB,EAAE;gBAC3B,OAAO,IAAI,CAAC;aACf;YAED,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QACvC,CAAC;;;OAAA;IAOD;;;OAGG;IACI,uDAAY,GAAnB;QACI,OAAO,kCAAkC,CAAC;IAC9C,CAAC;IAiGD,sBAAW,qEAAuB;QALlC;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,wBAAwB,CAAC;QACzC,CAAC;QAED;;;WAGG;aACH,UAAmC,OAAgB;YAC/C,IAAI,OAAO,KAAK,IAAI,CAAC,wBAAwB,EAAE;gBAC3C,OAAO;aACV;YAED,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC;YACxC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;;;OAbA;IAoBD,sBAAW,+DAAiB;QAL5B;;;WAGG;aAEH;YACI,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACnC,CAAC;QAED;;;WAGG;aACH,UAA6B,OAAe;YACxC,IAAI,OAAO,KAAK,IAAI,CAAC,kBAAkB,EAAE;gBACrC,OAAO;aACV;YAED,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;YAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;;;OAbA;IAqBD,sBAAW,yDAAW;QANtB;;;;WAIG;aAEH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;QAED;;;;WAIG;aACH,UAAuB,KAAa;YAChC,IAAI,KAAK,KAAK,IAAI,CAAC,YAAY,EAAE;gBAC7B,OAAO;aACV;YAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;;;OAdA;IAgBO,+DAAoB,GAA5B;QACI,IAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvD,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;SACzC;QACD,IAAI,IAAI,CAAC,wBAAwB,EAAE;YAC/B,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;SACrD;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC1B,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;SAC9C;QAED,OAAO,CAAC,IAAI,CAAC,6BAA6B,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC;QAEjE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,cAAc;IACA,uCAAM,GAApB,UAAqB,iBAAsB,EAAE,YAAoB,EAAE,KAAY,EAAE,OAAe;QAC5F,OAAO,mBAAmB,CAAC,KAAK,CAAC;YAC7B,OAAO,IAAI,gCAAgC,CACvC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAC7B,iBAAiB,CAAC,OAAO,EAAE,YAAY,EACvC,iBAAiB,CAAC,wBAAwB,EAC1C,KAAK,CAAC,SAAS,EAAE,EAAE,iBAAiB,CAAC,WAAW,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACtF,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IA7OD;QADC,SAAS,EAAE;uEACmB;IAK/B;QADC,SAAS,EAAE;sEACgB;IAK5B;QADC,SAAS,EAAE;+FACyC;IAKrD;QADC,SAAS,EAAE;kEACc;IAK1B;QADC,SAAS,EAAE;6EACyB;IA+HrC;QADC,SAAS,EAAE;mFAGX;IAoBD;QADC,SAAS,EAAE;6EAGX;IAqBD;QADC,SAAS,EAAE;uEAGX;IA4CL,uCAAC;CAAA,AAnPD,CAAsD,WAAW,GAmPhE;SAnPY,gCAAgC;AAqP7C,aAAa,CAAC,0CAA0C,EAAE,gCAAgC,CAAC,CAAC","sourcesContent":["import { Nullable } from \"../types\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { PostProcess, PostProcessOptions } from \"./postProcess\";\r\n\r\nimport { GeometryBufferRenderer } from '../Rendering/geometryBufferRenderer';\r\nimport { serialize, SerializationHelper } from '../Misc/decorators';\r\nimport { PrePassRenderer } from \"../Rendering/prePassRenderer\";\r\nimport { ScreenSpaceReflectionsConfiguration } from \"../Rendering/screenSpaceReflectionsConfiguration\";\r\n\r\nimport \"../Shaders/screenSpaceReflection.fragment\";\r\nimport { RegisterClass } from '../Misc/typeStore';\r\n\r\ndeclare type Engine = import(\"../Engines/engine\").Engine;\r\ndeclare type Scene = import(\"../scene\").Scene;\r\n\r\n/**\r\n * The ScreenSpaceReflectionPostProcess performs realtime reflections using only and only the available informations on the screen (positions and normals).\r\n * Basically, the screen space reflection post-process will compute reflections according the material's reflectivity.\r\n */\r\nexport class ScreenSpaceReflectionPostProcess extends PostProcess {\r\n /**\r\n * Gets or sets a reflection threshold mainly used to adjust the reflection's height.\r\n */\r\n @serialize()\r\n public threshold: number = 1.2;\r\n /**\r\n * Gets or sets the current reflection strength. 1.0 is an ideal value but can be increased/decreased for particular results.\r\n */\r\n @serialize()\r\n public strength: number = 1;\r\n /**\r\n * Gets or sets the falloff exponent used while computing fresnel. More the exponent is high, more the reflections will be discrete.\r\n */\r\n @serialize()\r\n public reflectionSpecularFalloffExponent: number = 3;\r\n /**\r\n * Gets or sets the step size used to iterate until the effect finds the color of the reflection's pixel. Typically in interval [0.1, 1.0]\r\n */\r\n @serialize()\r\n public step: number = 1.0;\r\n /**\r\n * Gets or sets the factor applied when computing roughness. Default value is 0.2.\r\n */\r\n @serialize()\r\n public roughnessFactor: number = 0.2;\r\n\r\n private _forceGeometryBuffer: boolean = false;\r\n private get _geometryBufferRenderer(): Nullable<GeometryBufferRenderer> {\r\n if (!this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n\r\n return this._scene.geometryBufferRenderer;\r\n }\r\n\r\n private get _prePassRenderer(): Nullable<PrePassRenderer> {\r\n if (this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n\r\n return this._scene.prePassRenderer;\r\n }\r\n\r\n private _enableSmoothReflections: boolean = false;\r\n private _reflectionSamples: number = 64;\r\n private _smoothSteps: number = 5;\r\n private _isSceneRightHanded: boolean;\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"ScreenSpaceReflectionPostProcess\" string\r\n */\r\n public getClassName(): string {\r\n return \"ScreenSpaceReflectionPostProcess\";\r\n }\r\n\r\n /**\r\n * Creates a new instance of ScreenSpaceReflectionPostProcess.\r\n * @param name The name of the effect.\r\n * @param scene The scene containing the objects to calculate reflections.\r\n * @param options The required width/height ratio to downsize to before computing the render pass.\r\n * @param camera The camera to apply the render pass to.\r\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\r\n * @param engine The engine which the post process will be applied. (default: current engine)\r\n * @param reusable If the post process can be reused on the same frame. (default: false)\r\n * @param textureType Type of textures used when performing the post process. (default: 0)\r\n * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: true)\r\n * @param forceGeometryBuffer If this post process should use geometry buffer instead of prepass (default: false)\r\n */\r\n constructor(name: string, scene: Scene, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: Engine, reusable?: boolean, textureType: number = 0, blockCompilation = false, forceGeometryBuffer = false) {\r\n super(name, \"screenSpaceReflection\", [\r\n \"projection\", \"view\", \"threshold\", \"reflectionSpecularFalloffExponent\", \"strength\", \"stepSize\", \"roughnessFactor\"\r\n ], [\r\n \"textureSampler\", \"normalSampler\", \"positionSampler\", \"reflectivitySampler\"\r\n ], options, camera, samplingMode, engine, reusable,\r\n \"#define SSR_SUPPORTED\\n#define REFLECTION_SAMPLES 64\\n#define SMOOTH_STEPS 5\\n\",\r\n textureType, undefined, null, blockCompilation);\r\n\r\n this._forceGeometryBuffer = forceGeometryBuffer;\r\n\r\n if (this._forceGeometryBuffer) {\r\n // Get geometry buffer renderer and update effect\r\n const geometryBufferRenderer = scene.enableGeometryBufferRenderer();\r\n if (geometryBufferRenderer) {\r\n if (geometryBufferRenderer.isSupported) {\r\n geometryBufferRenderer.enablePosition = true;\r\n geometryBufferRenderer.enableReflectivity = true;\r\n }\r\n }\r\n } else {\r\n const prePassRenderer = scene.enablePrePassRenderer();\r\n prePassRenderer?.markAsDirty();\r\n this._prePassEffectConfiguration = new ScreenSpaceReflectionsConfiguration();\r\n }\r\n\r\n this._updateEffectDefines();\r\n\r\n // On apply, send uniforms\r\n this.onApply = (effect: Effect) => {\r\n const geometryBufferRenderer = this._geometryBufferRenderer;\r\n const prePassRenderer = this._prePassRenderer;\r\n\r\n if (!prePassRenderer && !geometryBufferRenderer) {\r\n return;\r\n }\r\n\r\n if (geometryBufferRenderer) {\r\n // Samplers\r\n const positionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n const roughnessIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE);\r\n\r\n effect.setTexture(\"normalSampler\", geometryBufferRenderer.getGBuffer().textures[1]);\r\n effect.setTexture(\"positionSampler\", geometryBufferRenderer.getGBuffer().textures[positionIndex]);\r\n effect.setTexture(\"reflectivitySampler\", geometryBufferRenderer.getGBuffer().textures[roughnessIndex]);\r\n } else if (prePassRenderer) {\r\n // Samplers\r\n const positionIndex = prePassRenderer.getIndex(1);\r\n const roughnessIndex = prePassRenderer.getIndex(3);\r\n const normalIndex = prePassRenderer.getIndex(6);\r\n\r\n effect.setTexture(\"normalSampler\", prePassRenderer.getRenderTarget().textures[normalIndex]);\r\n effect.setTexture(\"positionSampler\", prePassRenderer.getRenderTarget().textures[positionIndex]);\r\n effect.setTexture(\"reflectivitySampler\", prePassRenderer.getRenderTarget().textures[roughnessIndex]);\r\n }\r\n\r\n // Uniforms\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const viewMatrix = camera.getViewMatrix(true);\r\n const projectionMatrix = camera.getProjectionMatrix(true);\r\n\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setFloat(\"threshold\", this.threshold);\r\n effect.setFloat(\"reflectionSpecularFalloffExponent\", this.reflectionSpecularFalloffExponent);\r\n effect.setFloat(\"strength\", this.strength);\r\n effect.setFloat(\"stepSize\", this.step);\r\n effect.setFloat(\"roughnessFactor\", this.roughnessFactor);\r\n };\r\n\r\n this._isSceneRightHanded = scene.useRightHandedSystem;\r\n }\r\n\r\n /**\r\n * Gets whether or not smoothing reflections is enabled.\r\n * Enabling smoothing will require more GPU power and can generate a drop in FPS.\r\n */\r\n @serialize()\r\n public get enableSmoothReflections(): boolean {\r\n return this._enableSmoothReflections;\r\n }\r\n\r\n /**\r\n * Sets whether or not smoothing reflections is enabled.\r\n * Enabling smoothing will require more GPU power and can generate a drop in FPS.\r\n */\r\n public set enableSmoothReflections(enabled: boolean) {\r\n if (enabled === this._enableSmoothReflections) {\r\n return;\r\n }\r\n\r\n this._enableSmoothReflections = enabled;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Gets the number of samples taken while computing reflections. More samples count is high,\r\n * more the post-process wil require GPU power and can generate a drop in FPS. Basically in interval [25, 100].\r\n */\r\n @serialize()\r\n public get reflectionSamples(): number {\r\n return this._reflectionSamples;\r\n }\r\n\r\n /**\r\n * Sets the number of samples taken while computing reflections. More samples count is high,\r\n * more the post-process wil require GPU power and can generate a drop in FPS. Basically in interval [25, 100].\r\n */\r\n public set reflectionSamples(samples: number) {\r\n if (samples === this._reflectionSamples) {\r\n return;\r\n }\r\n\r\n this._reflectionSamples = samples;\r\n this._updateEffectDefines();\r\n }\r\n\r\n /**\r\n * Gets the number of samples taken while smoothing reflections. More samples count is high,\r\n * more the post-process will require GPU power and can generate a drop in FPS.\r\n * Default value (5.0) work pretty well in all cases but can be adjusted.\r\n */\r\n @serialize()\r\n public get smoothSteps(): number {\r\n return this._smoothSteps;\r\n }\r\n\r\n /*\r\n * Sets the number of samples taken while smoothing reflections. More samples count is high,\r\n * more the post-process will require GPU power and can generate a drop in FPS.\r\n * Default value (5.0) work pretty well in all cases but can be adjusted.\r\n */\r\n public set smoothSteps(steps: number) {\r\n if (steps === this._smoothSteps) {\r\n return;\r\n }\r\n\r\n this._smoothSteps = steps;\r\n this._updateEffectDefines();\r\n }\r\n\r\n private _updateEffectDefines(): void {\r\n const defines: string[] = [];\r\n if (this._geometryBufferRenderer || this._prePassRenderer) {\r\n defines.push(\"#define SSR_SUPPORTED\");\r\n }\r\n if (this._enableSmoothReflections) {\r\n defines.push(\"#define ENABLE_SMOOTH_REFLECTIONS\");\r\n }\r\n if (this._isSceneRightHanded) {\r\n defines.push(\"#define RIGHT_HANDED_SCENE\");\r\n }\r\n\r\n defines.push(\"#define REFLECTION_SAMPLES \" + (this._reflectionSamples >> 0));\r\n defines.push(\"#define SMOOTH_STEPS \" + (this._smoothSteps >> 0));\r\n\r\n this.updateEffect(defines.join(\"\\n\"));\r\n }\r\n\r\n /** @hidden */\r\n public static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string) {\r\n return SerializationHelper.Parse(() => {\r\n return new ScreenSpaceReflectionPostProcess(\r\n parsedPostProcess.name, scene,\r\n parsedPostProcess.options, targetCamera,\r\n parsedPostProcess.renderTargetSamplingMode,\r\n scene.getEngine(), parsedPostProcess.textureType, parsedPostProcess.reusable);\r\n }, parsedPostProcess, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ScreenSpaceReflectionPostProcess\", ScreenSpaceReflectionPostProcess);"]}
@@ -31,6 +31,8 @@ export declare class DepthPeelingRenderer {
31
31
  private _layoutCacheFormat;
32
32
  private _layoutCache;
33
33
  private _renderPassIds;
34
+ private _candidateSubMeshes;
35
+ private _excludedSubMeshes;
34
36
  private static _DEPTH_CLEAR_VALUE;
35
37
  private static _MIN_DEPTH;
36
38
  private static _MAX_DEPTH;
@@ -76,8 +78,9 @@ export declare class DepthPeelingRenderer {
76
78
  /**
77
79
  * Renders transparent submeshes with depth peeling
78
80
  * @param transparentSubMeshes List of transparent meshes to render
81
+ * @returns The array of submeshes that could not be handled by this renderer
79
82
  */
80
- render(transparentSubMeshes: SmartArray<SubMesh>): void;
83
+ render(transparentSubMeshes: SmartArray<SubMesh>): SmartArray<SubMesh>;
81
84
  /**
82
85
  * Disposes the depth peeling renderer and associated ressources
83
86
  */
@@ -3,9 +3,11 @@
3
3
  */
4
4
  import { MultiRenderTarget } from "../Materials/Textures/multiRenderTarget.js";
5
5
  import { Color4 } from "../Maths/math.color.js";
6
+ import { SmartArray } from "../Misc/smartArray.js";
6
7
  import { ThinTexture } from "../Materials/Textures/thinTexture.js";
7
8
  import { EffectRenderer, EffectWrapper } from "../Materials/effectRenderer.js";
8
9
  import { Logger } from "../Misc/logger.js";
10
+ import { Material } from "../Materials/material.js";
9
11
  import "../Shaders/postprocess.vertex.js";
10
12
  import "../Shaders/oitFinal.fragment.js";
11
13
  import "../Shaders/oitBackBlend.fragment.js";
@@ -44,10 +46,12 @@ var DepthPeelingRenderer = /** @class */ (function () {
44
46
  this._currentPingPongState = 0;
45
47
  this._layoutCacheFormat = [[true], [true, true], [true, true, true]];
46
48
  this._layoutCache = [];
49
+ this._candidateSubMeshes = new SmartArray(10);
50
+ this._excludedSubMeshes = new SmartArray(10);
47
51
  this._colorCache = [
48
52
  new Color4(DepthPeelingRenderer._DEPTH_CLEAR_VALUE, DepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0),
49
53
  new Color4(-DepthPeelingRenderer._MIN_DEPTH, DepthPeelingRenderer._MAX_DEPTH, 0, 0),
50
- new Color4(0, 0, 0, 0)
54
+ new Color4(0, 0, 0, 0),
51
55
  ];
52
56
  this._scene = scene;
53
57
  this._engine = scene.getEngine();
@@ -123,7 +127,10 @@ var DepthPeelingRenderer = /** @class */ (function () {
123
127
  };
124
128
  // 2 for ping pong
125
129
  this._depthMrts = [new MultiRenderTarget("depthPeelingDepth0", size, 1, this._scene), new MultiRenderTarget("depthPeelingDepth1", size, 1, this._scene)];
126
- this._colorMrts = [new MultiRenderTarget("depthPeelingColor0", size, 1, this._scene, { generateDepthBuffer: false }), new MultiRenderTarget("depthPeelingColor1", size, 1, this._scene, { generateDepthBuffer: false })];
130
+ this._colorMrts = [
131
+ new MultiRenderTarget("depthPeelingColor0", size, 1, this._scene, { generateDepthBuffer: false }),
132
+ new MultiRenderTarget("depthPeelingColor1", size, 1, this._scene, { generateDepthBuffer: false }),
133
+ ];
127
134
  this._blendBackMrt = new MultiRenderTarget("depthPeelingBack", size, 1, this._scene, { generateDepthBuffer: false });
128
135
  // 0 is a depth texture
129
136
  // 1 is a color texture
@@ -260,7 +267,8 @@ var DepthPeelingRenderer = /** @class */ (function () {
260
267
  material.backFaceCulling = false;
261
268
  }
262
269
  subMesh.render(false);
263
- if (firstDraw) { // first time we draw this submesh: we replace the material context
270
+ if (firstDraw) {
271
+ // first time we draw this submesh: we replace the material context
264
272
  drawWrapper = subMesh._getDrawWrapper(); // we are sure it is now non empty as we just rendered the submesh
265
273
  if (drawWrapper.materialContext) {
266
274
  var newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId];
@@ -288,14 +296,30 @@ var DepthPeelingRenderer = /** @class */ (function () {
288
296
  /**
289
297
  * Renders transparent submeshes with depth peeling
290
298
  * @param transparentSubMeshes List of transparent meshes to render
299
+ * @returns The array of submeshes that could not be handled by this renderer
291
300
  */
292
301
  DepthPeelingRenderer.prototype.render = function (transparentSubMeshes) {
293
- if (!this._blendBackEffectWrapper.effect.isReady() || !this._blendBackEffectWrapperPingPong.effect.isReady() || !this._finalEffectWrapper.effect.isReady() || !this._updateTextures()) {
294
- return;
302
+ this._candidateSubMeshes.length = 0;
303
+ this._excludedSubMeshes.length = 0;
304
+ if (!this._blendBackEffectWrapper.effect.isReady() ||
305
+ !this._blendBackEffectWrapperPingPong.effect.isReady() ||
306
+ !this._finalEffectWrapper.effect.isReady() ||
307
+ !this._updateTextures()) {
308
+ return this._excludedSubMeshes;
309
+ }
310
+ for (var i = 0; i < transparentSubMeshes.length; i++) {
311
+ var material = transparentSubMeshes.data[i].getMaterial();
312
+ if (material &&
313
+ (material.fillMode === Material.TriangleFanDrawMode || material.fillMode === Material.TriangleFillMode || material.fillMode === Material.TriangleStripDrawMode)) {
314
+ this._candidateSubMeshes.push(transparentSubMeshes.data[i]);
315
+ }
316
+ else {
317
+ this._excludedSubMeshes.push(transparentSubMeshes.data[i]);
318
+ }
295
319
  }
296
- if (!transparentSubMeshes.length) {
320
+ if (!this._candidateSubMeshes.length) {
297
321
  this._finalCompose(1);
298
- return;
322
+ return this._excludedSubMeshes;
299
323
  }
300
324
  var currentRenderPassId = this._engine.currentRenderPassId;
301
325
  this._scene.prePassRenderer._enabled = false;
@@ -325,7 +349,7 @@ var DepthPeelingRenderer = /** @class */ (function () {
325
349
  this._engine.applyStates();
326
350
  this._currentPingPongState = 1;
327
351
  // Render
328
- this._renderSubMeshes(transparentSubMeshes);
352
+ this._renderSubMeshes(this._candidateSubMeshes);
329
353
  this._scene.resetCachedMaterial();
330
354
  // depth peeling ping-pong
331
355
  var readId = 0;
@@ -351,7 +375,7 @@ var DepthPeelingRenderer = /** @class */ (function () {
351
375
  this._engine.depthCullingState.depthTest = false;
352
376
  this._engine.applyStates();
353
377
  // Render
354
- this._renderSubMeshes(transparentSubMeshes);
378
+ this._renderSubMeshes(this._candidateSubMeshes);
355
379
  this._scene.resetCachedMaterial();
356
380
  // Back color
357
381
  this._engine.bindFramebuffer(this._blendBackMrt.renderTarget);
@@ -370,6 +394,7 @@ var DepthPeelingRenderer = /** @class */ (function () {
370
394
  this._scene.prePassRenderer._enabled = true;
371
395
  this._engine.depthCullingState.depthMask = true;
372
396
  this._engine.depthCullingState.depthTest = true;
397
+ return this._excludedSubMeshes;
373
398
  };
374
399
  /**
375
400
  * Disposes the depth peeling renderer and associated ressources
@@ -1 +1 @@
1
- {"version":3,"file":"depthPeelingRenderer.js","sourceRoot":"","sources":["../../../sourceES6/core/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\n\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { MultiRenderTarget } from \"../Materials/Textures/multiRenderTarget\";\r\nimport { InternalTextureCreationOptions } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Scene } from \"../scene\";\r\nimport { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport { PrePassRenderer } from \"./prePassRenderer\";\r\nimport { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\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[] = [4];\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\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\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 * 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 = [new MultiRenderTarget(\"depthPeelingDepth0\", size, 1, this._scene), new MultiRenderTarget(\"depthPeelingDepth1\", size, 1, this._scene)];\r\n this._colorMrts = [new MultiRenderTarget(\"depthPeelingColor0\", size, 1, this._scene, { generateDepthBuffer: false }), new MultiRenderTarget(\"depthPeelingColor1\", size, 1, this._scene, { generateDepthBuffer: false })];\r\n this._blendBackMrt = new MultiRenderTarget(\"depthPeelingBack\", size, 1, this._scene, { generateDepthBuffer: 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: 7,\r\n samplingMode: 1,\r\n type: this._engine.getCaps().textureFloatLinearFiltering ? 1 : 2,\r\n } as InternalTextureCreationOptions,\r\n {\r\n format: 5,\r\n samplingMode: 1,\r\n type: 2,\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\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 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\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(4);\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) { // 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 this._engine.restoreDefaultFramebuffer();\r\n\r\n this._engine.setAlphaMode(0);\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 * Renders transparent submeshes with depth peeling\r\n * @param transparentSubMeshes List of transparent meshes to render\r\n */\r\n public render(transparentSubMeshes: SmartArray<SubMesh>): void {\r\n if (!this._blendBackEffectWrapper.effect.isReady() || !this._blendBackEffectWrapperPingPong.effect.isReady() || !this._finalEffectWrapper.effect.isReady() || !this._updateTextures()) {\r\n return;\r\n }\r\n\r\n if (!transparentSubMeshes.length) {\r\n this._finalCompose(1);\r\n return;\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\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\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\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\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(6); // 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(3);\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(transparentSubMeshes);\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 // 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\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\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[2]);\r\n\r\n this._engine.setAlphaMode(6); // 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(3);\r\n this._engine.depthCullingState.depthTest = false;\r\n this._engine.applyStates();\r\n\r\n // Render\r\n this._renderSubMeshes(transparentSubMeshes);\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(0);\r\n this._engine.setAlphaMode(17);\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 }\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\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":["../../../sourceES6/core/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\n\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { MultiRenderTarget } from \"../Materials/Textures/multiRenderTarget\";\r\nimport { InternalTextureCreationOptions } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Scene } from \"../scene\";\r\nimport { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport { PrePassRenderer } from \"./prePassRenderer\";\r\nimport { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport { 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[] = [4];\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\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\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 * 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 = [new MultiRenderTarget(\"depthPeelingDepth0\", size, 1, this._scene), new MultiRenderTarget(\"depthPeelingDepth1\", size, 1, this._scene)];\r\n this._colorMrts = [\r\n new MultiRenderTarget(\"depthPeelingColor0\", size, 1, this._scene, { generateDepthBuffer: false }),\r\n new MultiRenderTarget(\"depthPeelingColor1\", size, 1, this._scene, { generateDepthBuffer: false }),\r\n ];\r\n this._blendBackMrt = new MultiRenderTarget(\"depthPeelingBack\", size, 1, this._scene, { generateDepthBuffer: 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: 7,\r\n samplingMode: 1,\r\n type: this._engine.getCaps().textureFloatLinearFiltering ? 1 : 2,\r\n } as InternalTextureCreationOptions,\r\n {\r\n format: 5,\r\n samplingMode: 1,\r\n type: 2,\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\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 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\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(4);\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 this._engine.restoreDefaultFramebuffer();\r\n\r\n this._engine.setAlphaMode(0);\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 * 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 (\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 return this._excludedSubMeshes;\r\n }\r\n\r\n for (let i = 0; i < transparentSubMeshes.length; i++) {\r\n const material = transparentSubMeshes.data[i].getMaterial();\r\n\r\n if (\r\n material &&\r\n (material.fillMode === Material.TriangleFanDrawMode || material.fillMode === Material.TriangleFillMode || material.fillMode === Material.TriangleStripDrawMode)\r\n ) {\r\n this._candidateSubMeshes.push(transparentSubMeshes.data[i]);\r\n } else {\r\n this._excludedSubMeshes.push(transparentSubMeshes.data[i]);\r\n }\r\n }\r\n\r\n if (!this._candidateSubMeshes.length) {\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\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\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\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\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(6); // 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(3);\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\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 // 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\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\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[2]);\r\n\r\n this._engine.setAlphaMode(6); // 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(3);\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\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(0);\r\n this._engine.setAlphaMode(17);\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 }\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"]}
@@ -95,7 +95,7 @@ var DepthRenderer = /** @class */ (function () {
95
95
  // Culling
96
96
  var detNeg = effectiveMesh._getWorldMatrixDeterminant() < 0;
97
97
  var sideOrientation = (_a = renderingMesh.overrideMaterialSideOrientation) !== null && _a !== void 0 ? _a : material.sideOrientation;
98
- if (scene.useRightHandedSystem && !detNeg || !scene.useRightHandedSystem && detNeg) {
98
+ if (detNeg) {
99
99
  sideOrientation = sideOrientation === 0 ? 1 : 0;
100
100
  }
101
101
  var reverseSideOrientation = sideOrientation === 0;