@babylonjs/core 5.45.2 → 5.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/Actions/condition.js +23 -23
  2. package/Actions/condition.js.map +1 -1
  3. package/Animations/animatable.js +48 -48
  4. package/Animations/animatable.js.map +1 -1
  5. package/Animations/animation.js +53 -53
  6. package/Animations/animation.js.map +1 -1
  7. package/Animations/animationGroup.js +53 -53
  8. package/Animations/animationGroup.js.map +1 -1
  9. package/Animations/runtimeAnimation.js +36 -36
  10. package/Animations/runtimeAnimation.js.map +1 -1
  11. package/Audio/audioEngine.js +14 -14
  12. package/Audio/audioEngine.js.map +1 -1
  13. package/Audio/audioSceneComponent.js +14 -14
  14. package/Audio/audioSceneComponent.js.map +1 -1
  15. package/Audio/sound.js +47 -47
  16. package/Audio/sound.js.map +1 -1
  17. package/Behaviors/Meshes/baseSixDofDragBehavior.d.ts +1 -1
  18. package/Behaviors/Meshes/fadeInOutBehavior.js +11 -11
  19. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  20. package/Behaviors/Meshes/pointerDragBehavior.js +34 -34
  21. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  22. package/Bones/bone.js +15 -15
  23. package/Bones/bone.js.map +1 -1
  24. package/Bones/boneIKController.js +9 -9
  25. package/Bones/boneIKController.js.map +1 -1
  26. package/Bones/boneLookController.js +50 -50
  27. package/Bones/boneLookController.js.map +1 -1
  28. package/Bones/skeleton.js +35 -35
  29. package/Bones/skeleton.js.map +1 -1
  30. package/Buffers/buffer.js +14 -14
  31. package/Buffers/buffer.js.map +1 -1
  32. package/Buffers/dataBuffer.js +6 -6
  33. package/Buffers/dataBuffer.js.map +1 -1
  34. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js +42 -42
  35. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
  36. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js +18 -18
  37. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js.map +1 -1
  38. package/Cameras/VR/vrExperienceHelper.js +178 -178
  39. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  40. package/Cameras/arcRotateCamera.js +176 -176
  41. package/Cameras/arcRotateCamera.js.map +1 -1
  42. package/Cameras/camera.js +90 -90
  43. package/Cameras/camera.js.map +1 -1
  44. package/Cameras/flyCamera.js +82 -82
  45. package/Cameras/flyCamera.js.map +1 -1
  46. package/Cameras/freeCamera.js +54 -54
  47. package/Cameras/freeCamera.js.map +1 -1
  48. package/Compute/computeShader.js +12 -12
  49. package/Compute/computeShader.js.map +1 -1
  50. package/Culling/ray.d.ts +1 -1
  51. package/Debug/axesViewer.js +12 -12
  52. package/Debug/axesViewer.js.map +1 -1
  53. package/Debug/debugLayer.js +21 -21
  54. package/Debug/debugLayer.js.map +1 -1
  55. package/Debug/directionalLightFrustumViewer.js +20 -20
  56. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  57. package/Debug/rayHelper.js +10 -10
  58. package/Debug/rayHelper.js.map +1 -1
  59. package/Debug/skeletonViewer.js +81 -81
  60. package/Debug/skeletonViewer.js.map +1 -1
  61. package/DeviceInput/InputDevices/deviceSource.d.ts +1 -1
  62. package/DeviceInput/InputDevices/deviceSourceManager.js +31 -31
  63. package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
  64. package/DeviceInput/InputDevices/deviceTypes.d.ts +1 -1
  65. package/DeviceInput/internalDeviceSourceManager.d.ts +2 -2
  66. package/Engines/Extensions/engine.computeShader.d.ts +3 -3
  67. package/Engines/Extensions/engine.multiRender.js +1 -1
  68. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  69. package/Engines/Extensions/engine.query.d.ts +1 -1
  70. package/Engines/Extensions/engine.renderTarget.d.ts +1 -1
  71. package/Engines/Extensions/engine.renderTarget.js +1 -1
  72. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  73. package/Engines/Native/nativeDataStream.d.ts +1 -1
  74. package/Engines/Native/nativeHardwareTexture.js +3 -3
  75. package/Engines/Native/nativeHardwareTexture.js.map +1 -1
  76. package/Engines/Native/nativeInterfaces.d.ts +5 -5
  77. package/Engines/Native/nativePipelineContext.js +7 -7
  78. package/Engines/Native/nativePipelineContext.js.map +1 -1
  79. package/Engines/Native/nativeRenderTargetWrapper.js +6 -6
  80. package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
  81. package/Engines/Processors/shaderCodeInliner.js +4 -4
  82. package/Engines/Processors/shaderCodeInliner.js.map +1 -1
  83. package/Engines/Processors/shaderProcessingOptions.d.ts +1 -1
  84. package/Engines/WebGL/webGLHardwareTexture.js +3 -3
  85. package/Engines/WebGL/webGLHardwareTexture.js.map +1 -1
  86. package/Engines/WebGPU/webgpuBufferManager.js +3 -3
  87. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  88. package/Engines/WebGPU/webgpuCacheBindGroups.js +6 -6
  89. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  90. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js +5 -5
  91. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js.map +1 -1
  92. package/Engines/WebGPU/webgpuClearQuad.js +11 -11
  93. package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
  94. package/Engines/WebGPU/webgpuComputeContext.js +7 -7
  95. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  96. package/Engines/WebGPU/webgpuComputePipelineContext.js +4 -4
  97. package/Engines/WebGPU/webgpuComputePipelineContext.js.map +1 -1
  98. package/Engines/WebGPU/webgpuDrawContext.js +7 -7
  99. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  100. package/Engines/WebGPU/webgpuHardwareTexture.js +9 -9
  101. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  102. package/Engines/WebGPU/webgpuMaterialContext.js +5 -5
  103. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  104. package/Engines/WebGPU/webgpuOcclusionQuery.js +10 -10
  105. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  106. package/Engines/WebGPU/webgpuPipelineContext.js +6 -6
  107. package/Engines/WebGPU/webgpuPipelineContext.js.map +1 -1
  108. package/Engines/WebGPU/webgpuQuerySet.js +3 -3
  109. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  110. package/Engines/WebGPU/webgpuShaderProcessingContext.js +3 -3
  111. package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
  112. package/Engines/WebGPU/webgpuTextureHelper.js +3 -3
  113. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  114. package/Engines/WebGPU/webgpuTimestampQuery.js +3 -3
  115. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  116. package/Engines/engine.js +134 -134
  117. package/Engines/engine.js.map +1 -1
  118. package/Engines/nativeEngine.js +6 -6
  119. package/Engines/nativeEngine.js.map +1 -1
  120. package/Engines/nullEngine.js +25 -25
  121. package/Engines/nullEngine.js.map +1 -1
  122. package/Engines/renderTargetWrapper.js +25 -25
  123. package/Engines/renderTargetWrapper.js.map +1 -1
  124. package/Engines/thinEngine.js +243 -243
  125. package/Engines/thinEngine.js.map +1 -1
  126. package/Engines/webgpuEngine.js +132 -132
  127. package/Engines/webgpuEngine.js.map +1 -1
  128. package/Events/keyboardEvents.js +10 -10
  129. package/Events/keyboardEvents.js.map +1 -1
  130. package/Events/pointerEvents.js +9 -9
  131. package/Events/pointerEvents.js.map +1 -1
  132. package/Gamepads/Controllers/poseEnabledController.js +9 -9
  133. package/Gamepads/Controllers/poseEnabledController.js.map +1 -1
  134. package/Gamepads/Controllers/webVRController.js +13 -13
  135. package/Gamepads/Controllers/webVRController.js.map +1 -1
  136. package/Gamepads/gamepad.js +20 -20
  137. package/Gamepads/gamepad.js.map +1 -1
  138. package/Gizmos/axisDragGizmo.js +45 -45
  139. package/Gizmos/axisDragGizmo.js.map +1 -1
  140. package/Gizmos/axisScaleGizmo.js +12 -12
  141. package/Gizmos/axisScaleGizmo.js.map +1 -1
  142. package/Gizmos/boundingBoxGizmo.js +74 -74
  143. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  144. package/Gizmos/gizmo.js +34 -34
  145. package/Gizmos/gizmo.js.map +1 -1
  146. package/Gizmos/gizmoManager.js +40 -40
  147. package/Gizmos/gizmoManager.js.map +1 -1
  148. package/Gizmos/planeDragGizmo.js +23 -23
  149. package/Gizmos/planeDragGizmo.js.map +1 -1
  150. package/Gizmos/planeRotationGizmo.js +12 -12
  151. package/Gizmos/planeRotationGizmo.js.map +1 -1
  152. package/Gizmos/positionGizmo.js +40 -40
  153. package/Gizmos/positionGizmo.js.map +1 -1
  154. package/Gizmos/rotationGizmo.js +47 -47
  155. package/Gizmos/rotationGizmo.js.map +1 -1
  156. package/Gizmos/scaleGizmo.js +41 -41
  157. package/Gizmos/scaleGizmo.js.map +1 -1
  158. package/Helpers/environmentHelper.js +18 -18
  159. package/Helpers/environmentHelper.js.map +1 -1
  160. package/Helpers/textureDome.js +96 -96
  161. package/Helpers/textureDome.js.map +1 -1
  162. package/IAccessibilityTag.d.ts +2 -2
  163. package/Instrumentation/engineInstrumentation.js +21 -21
  164. package/Instrumentation/engineInstrumentation.js.map +1 -1
  165. package/Instrumentation/sceneInstrumentation.js +90 -90
  166. package/Instrumentation/sceneInstrumentation.js.map +1 -1
  167. package/Layers/effectLayer.js +48 -48
  168. package/Layers/effectLayer.js.map +1 -1
  169. package/Layers/glowLayer.js +32 -32
  170. package/Layers/glowLayer.js.map +1 -1
  171. package/Layers/highlightLayer.js +26 -26
  172. package/Layers/highlightLayer.js.map +1 -1
  173. package/Layers/layer.js +40 -40
  174. package/Layers/layer.js.map +1 -1
  175. package/LensFlares/lensFlare.js +15 -15
  176. package/LensFlares/lensFlare.js.map +1 -1
  177. package/LensFlares/lensFlareSystem.js +4 -4
  178. package/LensFlares/lensFlareSystem.js.map +1 -1
  179. package/Lights/Shadows/cascadedShadowGenerator.js +18 -18
  180. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  181. package/Lights/Shadows/shadowGenerator.js +115 -115
  182. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  183. package/Lights/directionalLight.js +31 -31
  184. package/Lights/directionalLight.js.map +1 -1
  185. package/Lights/light.js +72 -72
  186. package/Lights/light.js.map +1 -1
  187. package/Lights/pointLight.js +18 -18
  188. package/Lights/pointLight.js.map +1 -1
  189. package/Lights/spotLight.js +30 -30
  190. package/Lights/spotLight.js.map +1 -1
  191. package/Loading/sceneLoader.d.ts +1 -1
  192. package/Materials/Background/backgroundMaterial.js +124 -124
  193. package/Materials/Background/backgroundMaterial.js.map +1 -1
  194. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +8 -8
  195. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  196. package/Materials/Node/Blocks/Dual/lightBlock.js +14 -14
  197. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  198. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +9 -9
  199. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  200. package/Materials/Node/Blocks/Dual/textureBlock.js +26 -26
  201. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  202. package/Materials/Node/Blocks/Input/inputBlock.js +34 -34
  203. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  204. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +14 -14
  205. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  206. package/Materials/Node/Blocks/PBR/reflectionBlock.js +16 -16
  207. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  208. package/Materials/Node/Blocks/customBlock.js +7 -7
  209. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  210. package/Materials/Node/Blocks/gradientBlock.js +13 -13
  211. package/Materials/Node/Blocks/gradientBlock.js.map +1 -1
  212. package/Materials/Node/Blocks/triPlanarBlock.js +30 -30
  213. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  214. package/Materials/Node/nodeMaterial.d.ts +1 -1
  215. package/Materials/Node/nodeMaterial.js +60 -60
  216. package/Materials/Node/nodeMaterial.js.map +1 -1
  217. package/Materials/Node/nodeMaterialBlock.js +35 -35
  218. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  219. package/Materials/Node/nodeMaterialBlockConnectionPoint.js +50 -50
  220. package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
  221. package/Materials/PBR/pbrAnisotropicConfiguration.js +5 -5
  222. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  223. package/Materials/PBR/pbrBRDFConfiguration.js +4 -4
  224. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  225. package/Materials/PBR/pbrBaseMaterial.js +52 -52
  226. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  227. package/Materials/PBR/pbrBaseSimpleMaterial.js +17 -17
  228. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  229. package/Materials/PBR/pbrClearCoatConfiguration.js +5 -5
  230. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  231. package/Materials/PBR/pbrIridescenceConfiguration.js +5 -5
  232. package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
  233. package/Materials/PBR/pbrMaterial.js +209 -209
  234. package/Materials/PBR/pbrMaterial.js.map +1 -1
  235. package/Materials/PBR/pbrSheenConfiguration.js +5 -5
  236. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  237. package/Materials/PBR/pbrSpecularGlossinessMaterial.js +6 -6
  238. package/Materials/PBR/pbrSpecularGlossinessMaterial.js.map +1 -1
  239. package/Materials/PBR/pbrSubSurfaceConfiguration.js +51 -51
  240. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  241. package/Materials/Textures/baseTexture.js +99 -99
  242. package/Materials/Textures/baseTexture.js.map +1 -1
  243. package/Materials/Textures/cubeTexture.js +61 -61
  244. package/Materials/Textures/cubeTexture.js.map +1 -1
  245. package/Materials/Textures/externalTexture.js +16 -16
  246. package/Materials/Textures/externalTexture.js.map +1 -1
  247. package/Materials/Textures/hdrCubeTexture.js +44 -44
  248. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  249. package/Materials/Textures/internalTexture.js +31 -31
  250. package/Materials/Textures/internalTexture.js.map +1 -1
  251. package/Materials/Textures/mirrorTexture.js +73 -73
  252. package/Materials/Textures/mirrorTexture.js.map +1 -1
  253. package/Materials/Textures/multiRenderTarget.js +47 -47
  254. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  255. package/Materials/Textures/rawTexture2DArray.js +6 -6
  256. package/Materials/Textures/rawTexture2DArray.js.map +1 -1
  257. package/Materials/Textures/renderTargetTexture.js +142 -142
  258. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  259. package/Materials/Textures/texture.d.ts +1 -1
  260. package/Materials/Textures/texture.js +26 -26
  261. package/Materials/Textures/texture.js.map +1 -1
  262. package/Materials/Textures/textureCreationOptions.d.ts +1 -1
  263. package/Materials/Textures/textureSampler.js +20 -20
  264. package/Materials/Textures/textureSampler.js.map +1 -1
  265. package/Materials/Textures/thinRenderTargetTexture.js +6 -6
  266. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  267. package/Materials/Textures/thinTexture.js +39 -39
  268. package/Materials/Textures/thinTexture.js.map +1 -1
  269. package/Materials/Textures/videoTexture.js +40 -40
  270. package/Materials/Textures/videoTexture.js.map +1 -1
  271. package/Materials/drawWrapper.js +6 -6
  272. package/Materials/drawWrapper.js.map +1 -1
  273. package/Materials/effect.js +18 -18
  274. package/Materials/effect.js.map +1 -1
  275. package/Materials/effectRenderer.js +9 -9
  276. package/Materials/effectRenderer.js.map +1 -1
  277. package/Materials/fresnelParameters.d.ts +2 -2
  278. package/Materials/fresnelParameters.js +13 -13
  279. package/Materials/fresnelParameters.js.map +1 -1
  280. package/Materials/material.detailMapConfiguration.js +5 -5
  281. package/Materials/material.detailMapConfiguration.js.map +1 -1
  282. package/Materials/material.js +223 -223
  283. package/Materials/material.js.map +1 -1
  284. package/Materials/materialPluginBase.js +5 -5
  285. package/Materials/materialPluginBase.js.map +1 -1
  286. package/Materials/materialPluginEvent.d.ts +14 -14
  287. package/Materials/materialPluginManager.d.ts +1 -1
  288. package/Materials/multiMaterial.js +16 -16
  289. package/Materials/multiMaterial.js.map +1 -1
  290. package/Materials/shadowDepthWrapper.js +14 -14
  291. package/Materials/shadowDepthWrapper.js.map +1 -1
  292. package/Materials/standardMaterial.js +100 -100
  293. package/Materials/standardMaterial.js.map +1 -1
  294. package/Materials/uniformBufferEffectCommonAccessor.js +3 -3
  295. package/Materials/uniformBufferEffectCommonAccessor.js.map +1 -1
  296. package/Maths/math.functions.js +2 -0
  297. package/Maths/math.functions.js.map +1 -1
  298. package/Maths/math.path.js +11 -11
  299. package/Maths/math.path.js.map +1 -1
  300. package/Maths/math.vector.d.ts +6 -7
  301. package/Maths/math.vector.js +48 -48
  302. package/Maths/math.vector.js.map +1 -1
  303. package/Meshes/Builders/goldbergBuilder.d.ts +2 -2
  304. package/Meshes/Compression/dracoCompression.js +23 -23
  305. package/Meshes/Compression/dracoCompression.js.map +1 -1
  306. package/Meshes/Compression/meshoptCompression.js +9 -9
  307. package/Meshes/Compression/meshoptCompression.js.map +1 -1
  308. package/Meshes/abstractMesh.js +179 -179
  309. package/Meshes/abstractMesh.js.map +1 -1
  310. package/Meshes/geometry.js +32 -32
  311. package/Meshes/geometry.js.map +1 -1
  312. package/Meshes/goldbergMesh.d.ts +1 -1
  313. package/Meshes/linesMesh.js +3 -3
  314. package/Meshes/linesMesh.js.map +1 -1
  315. package/Meshes/mesh.js +165 -165
  316. package/Meshes/mesh.js.map +1 -1
  317. package/Meshes/mesh.vertexData.js.map +1 -1
  318. package/Meshes/polygonMesh.js +5 -5
  319. package/Meshes/polygonMesh.js.map +1 -1
  320. package/Meshes/subMesh.js +59 -59
  321. package/Meshes/subMesh.js.map +1 -1
  322. package/Meshes/transformNode.js +52 -52
  323. package/Meshes/transformNode.js.map +1 -1
  324. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.d.ts +1 -1
  325. package/Misc/PerformanceViewer/performanceViewerCollector.js +12 -12
  326. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  327. package/Misc/arrayTools.d.ts +1 -1
  328. package/Misc/copyTextureToTexture.js +3 -3
  329. package/Misc/copyTextureToTexture.js.map +1 -1
  330. package/Misc/coroutine.d.ts +5 -5
  331. package/Misc/deferred.js +9 -9
  332. package/Misc/deferred.js.map +1 -1
  333. package/Misc/depthReducer.js +7 -7
  334. package/Misc/depthReducer.js.map +1 -1
  335. package/Misc/environmentTextureTools.d.ts +1 -1
  336. package/Misc/error.d.ts +1 -1
  337. package/Misc/fileTools.d.ts +5 -5
  338. package/Misc/filesInput.js +6 -6
  339. package/Misc/filesInput.js.map +1 -1
  340. package/Misc/khronosTextureContainer2.js +9 -9
  341. package/Misc/khronosTextureContainer2.js.map +1 -1
  342. package/Misc/observable.js +12 -12
  343. package/Misc/observable.js.map +1 -1
  344. package/Misc/perfCounter.js +16 -16
  345. package/Misc/perfCounter.js.map +1 -1
  346. package/Misc/sceneOptimizer.js +76 -76
  347. package/Misc/sceneOptimizer.js.map +1 -1
  348. package/Misc/stringDictionary.d.ts +1 -1
  349. package/Misc/trajectoryClassifier.js +67 -67
  350. package/Misc/trajectoryClassifier.js.map +1 -1
  351. package/Misc/videoRecorder.js +15 -15
  352. package/Misc/videoRecorder.js.map +1 -1
  353. package/Misc/virtualJoystick.js +12 -12
  354. package/Misc/virtualJoystick.js.map +1 -1
  355. package/Morph/morphTarget.js +28 -28
  356. package/Morph/morphTarget.js.map +1 -1
  357. package/Morph/morphTargetManager.js +18 -18
  358. package/Morph/morphTargetManager.js.map +1 -1
  359. package/Offline/database.js +12 -12
  360. package/Offline/database.js.map +1 -1
  361. package/Particles/EmitterTypes/coneParticleEmitter.js +25 -25
  362. package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
  363. package/Particles/EmitterTypes/meshParticleEmitter.js +20 -20
  364. package/Particles/EmitterTypes/meshParticleEmitter.js.map +1 -1
  365. package/Particles/baseParticleSystem.js +232 -232
  366. package/Particles/baseParticleSystem.js.map +1 -1
  367. package/Particles/cloudPoint.js +9 -9
  368. package/Particles/cloudPoint.js.map +1 -1
  369. package/Particles/gpuParticleSystem.js +123 -123
  370. package/Particles/gpuParticleSystem.js.map +1 -1
  371. package/Particles/particleSystem.js +102 -102
  372. package/Particles/particleSystem.js.map +1 -1
  373. package/Particles/pointsCloudSystem.js +18 -18
  374. package/Particles/pointsCloudSystem.js.map +1 -1
  375. package/Particles/solidParticle.js +23 -23
  376. package/Particles/solidParticle.js.map +1 -1
  377. package/Physics/v1/physicsEngine.js +14 -14
  378. package/Physics/v1/physicsEngine.js.map +1 -1
  379. package/Physics/v1/physicsImpostor.js +149 -149
  380. package/Physics/v1/physicsImpostor.js.map +1 -1
  381. package/Physics/v2/physicsEngine.js +14 -14
  382. package/Physics/v2/physicsEngine.js.map +1 -1
  383. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js +129 -129
  384. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
  385. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +68 -68
  386. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  387. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +6 -6
  388. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  389. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +226 -225
  390. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  391. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +10 -10
  392. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  393. package/PostProcesses/anaglyphPostProcess.js +7 -7
  394. package/PostProcesses/anaglyphPostProcess.js.map +1 -1
  395. package/PostProcesses/blackAndWhitePostProcess.js +7 -7
  396. package/PostProcesses/blackAndWhitePostProcess.js.map +1 -1
  397. package/PostProcesses/bloomEffect.js +28 -28
  398. package/PostProcesses/bloomEffect.js.map +1 -1
  399. package/PostProcesses/bloomMergePostProcess.js +7 -7
  400. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  401. package/PostProcesses/blurPostProcess.js +32 -32
  402. package/PostProcesses/blurPostProcess.js.map +1 -1
  403. package/PostProcesses/chromaticAberrationPostProcess.js +7 -7
  404. package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
  405. package/PostProcesses/circleOfConfusionPostProcess.js +7 -7
  406. package/PostProcesses/circleOfConfusionPostProcess.js.map +1 -1
  407. package/PostProcesses/colorCorrectionPostProcess.js +7 -7
  408. package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
  409. package/PostProcesses/convolutionPostProcess.js +7 -7
  410. package/PostProcesses/convolutionPostProcess.js.map +1 -1
  411. package/PostProcesses/depthOfFieldBlurPostProcess.js +7 -7
  412. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  413. package/PostProcesses/depthOfFieldEffect.js +36 -36
  414. package/PostProcesses/depthOfFieldEffect.js.map +1 -1
  415. package/PostProcesses/depthOfFieldMergePostProcess.js +7 -7
  416. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  417. package/PostProcesses/extractHighlightsPostProcess.js +7 -7
  418. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  419. package/PostProcesses/filterPostProcess.js +7 -7
  420. package/PostProcesses/filterPostProcess.js.map +1 -1
  421. package/PostProcesses/grainPostProcess.js +7 -7
  422. package/PostProcesses/grainPostProcess.js.map +1 -1
  423. package/PostProcesses/imageProcessingPostProcess.js +42 -42
  424. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  425. package/PostProcesses/motionBlurPostProcess.js +41 -41
  426. package/PostProcesses/motionBlurPostProcess.js.map +1 -1
  427. package/PostProcesses/passPostProcess.js +15 -15
  428. package/PostProcesses/passPostProcess.js.map +1 -1
  429. package/PostProcesses/postProcess.d.ts +2 -2
  430. package/PostProcesses/postProcess.js +123 -123
  431. package/PostProcesses/postProcess.js.map +1 -1
  432. package/PostProcesses/refractionPostProcess.js +21 -21
  433. package/PostProcesses/refractionPostProcess.js.map +1 -1
  434. package/PostProcesses/screenSpaceCurvaturePostProcess.js +7 -7
  435. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  436. package/PostProcesses/screenSpaceReflectionPostProcess.js +19 -19
  437. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  438. package/PostProcesses/sharpenPostProcess.js +7 -7
  439. package/PostProcesses/sharpenPostProcess.js.map +1 -1
  440. package/PostProcesses/stereoscopicInterlacePostProcess.js +14 -14
  441. package/PostProcesses/stereoscopicInterlacePostProcess.js.map +1 -1
  442. package/PostProcesses/tonemapPostProcess.js +7 -7
  443. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  444. package/PostProcesses/volumetricLightScatteringPostProcess.js +11 -11
  445. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  446. package/PostProcesses/vrDistortionCorrectionPostProcess.js +7 -7
  447. package/PostProcesses/vrDistortionCorrectionPostProcess.js.map +1 -1
  448. package/Rendering/depthPeelingRenderer.js +36 -36
  449. package/Rendering/depthPeelingRenderer.js.map +1 -1
  450. package/Rendering/depthRenderer.js +8 -8
  451. package/Rendering/depthRenderer.js.map +1 -1
  452. package/Rendering/edgesRenderer.js +34 -34
  453. package/Rendering/edgesRenderer.js.map +1 -1
  454. package/Rendering/fluidRenderer/fluidRenderer.js +8 -8
  455. package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
  456. package/Rendering/fluidRenderer/fluidRenderingDepthTextureCopy.js +3 -3
  457. package/Rendering/fluidRenderer/fluidRenderingDepthTextureCopy.js.map +1 -1
  458. package/Rendering/fluidRenderer/fluidRenderingObject.js +19 -19
  459. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  460. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +12 -12
  461. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
  462. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +18 -18
  463. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  464. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +68 -68
  465. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  466. package/Rendering/fluidRenderer/fluidRenderingTextures.js +29 -29
  467. package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
  468. package/Rendering/geometryBufferRenderer.js +44 -44
  469. package/Rendering/geometryBufferRenderer.js.map +1 -1
  470. package/Rendering/prePassRenderer.js +51 -51
  471. package/Rendering/prePassRenderer.js.map +1 -1
  472. package/Rendering/renderingGroup.js +25 -25
  473. package/Rendering/renderingGroup.js.map +1 -1
  474. package/Rendering/renderingManager.js +21 -21
  475. package/Rendering/renderingManager.js.map +1 -1
  476. package/Rendering/subSurfaceConfiguration.js +18 -18
  477. package/Rendering/subSurfaceConfiguration.js.map +1 -1
  478. package/Rendering/utilityLayerRenderer.js +76 -76
  479. package/Rendering/utilityLayerRenderer.js.map +1 -1
  480. package/Sprites/sprite.js +16 -16
  481. package/Sprites/sprite.js.map +1 -1
  482. package/Sprites/spriteManager.js +81 -81
  483. package/Sprites/spriteManager.js.map +1 -1
  484. package/Sprites/spriteMap.js +32 -32
  485. package/Sprites/spriteMap.js.map +1 -1
  486. package/Sprites/spriteRenderer.js +6 -6
  487. package/Sprites/spriteRenderer.js.map +1 -1
  488. package/Sprites/thinSprite.js +22 -22
  489. package/Sprites/thinSprite.js.map +1 -1
  490. package/States/stencilStateComposer.js +10 -10
  491. package/States/stencilStateComposer.js.map +1 -1
  492. package/XR/features/WebXRAnchorSystem.js +7 -7
  493. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  494. package/XR/features/WebXRControllerMovement.d.ts +3 -3
  495. package/XR/features/WebXRControllerMovement.js +97 -97
  496. package/XR/features/WebXRControllerMovement.js.map +1 -1
  497. package/XR/features/WebXRControllerPhysics.js +24 -24
  498. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  499. package/XR/features/WebXRControllerTeleportation.js +26 -26
  500. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  501. package/XR/features/WebXRDOMOverlay.d.ts +1 -1
  502. package/XR/features/WebXRFeaturePointSystem.js +6 -6
  503. package/XR/features/WebXRFeaturePointSystem.js.map +1 -1
  504. package/XR/features/WebXRHandTracking.d.ts +1 -1
  505. package/XR/features/WebXRHandTracking.js +95 -95
  506. package/XR/features/WebXRHandTracking.js.map +1 -1
  507. package/XR/features/WebXRWalkingLocomotion.js +21 -21
  508. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  509. package/XR/motionController/webXRAbstractMotionController.d.ts +3 -3
  510. package/XR/motionController/webXRMotionControllerManager.d.ts +1 -1
  511. package/XR/native/nativeXRFrame.js +3 -3
  512. package/XR/native/nativeXRFrame.js.map +1 -1
  513. package/XR/webXRFeaturesManager.d.ts +1 -1
  514. package/XR/webXRLayerWrapper.d.ts +2 -2
  515. package/XR/webXRLayerWrapper.js +17 -17
  516. package/XR/webXRLayerWrapper.js.map +1 -1
  517. package/abstractScene.d.ts +2 -2
  518. package/node.d.ts +1 -1
  519. package/node.js +71 -71
  520. package/node.js.map +1 -1
  521. package/package.json +1 -1
  522. package/scene.js +777 -777
  523. package/scene.js.map +1 -1
  524. package/sceneComponent.d.ts +12 -12
  525. package/types.d.ts +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"prePassRenderer.js","sourceRoot":"","sources":["../../../../lts/core/generated/Rendering/prePassRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { PrePassRenderTarget } from \"../Materials/Textures/prePassRenderTarget\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { GeometryBufferRenderer } from \"../Rendering/geometryBufferRenderer\";\r\n\r\n/**\r\n * Renders a pre pass of the scene\r\n * This means every mesh in the scene will be rendered to a render target texture\r\n * And then this texture will be composited to the rendering canvas with post processes\r\n * It is necessary for effects like subsurface scattering or deferred shading\r\n */\r\nexport class PrePassRenderer {\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"PrePassRendererSceneComponent\");\r\n };\r\n\r\n /**\r\n * To save performance, we can excluded skinned meshes from the prepass\r\n */\r\n public excludedSkinnedMesh: AbstractMesh[] = [];\r\n\r\n /**\r\n * Force material to be excluded from the prepass\r\n * Can be useful when `useGeometryBufferFallback` is set to `true`\r\n * and you don't want a material to show in the effect.\r\n */\r\n public excludedMaterials: Material[] = [];\r\n\r\n private _scene: Scene;\r\n private _engine: Engine;\r\n\r\n /**\r\n * Number of textures in the multi render target texture where the scene is directly rendered\r\n */\r\n public mrtCount: number = 0;\r\n\r\n private _mrtFormats: number[] = [];\r\n private _mrtLayout: number[] = [];\r\n private _mrtNames: string[] = [];\r\n private _textureIndices: number[] = [];\r\n\r\n private _multiRenderAttachments: number[];\r\n private _defaultAttachments: number[];\r\n private _clearAttachments: number[];\r\n\r\n /**\r\n * Returns the index of a texture in the multi render target texture array.\r\n * @param type Texture type\r\n * @returns The index\r\n */\r\n public getIndex(type: number): number {\r\n return this._textureIndices[type];\r\n }\r\n\r\n /**\r\n * How many samples are used for MSAA of the scene render target\r\n */\r\n public get samples() {\r\n return this.defaultRT.samples;\r\n }\r\n\r\n public set samples(n: number) {\r\n this.defaultRT.samples = n;\r\n }\r\n\r\n private static _TextureFormats = [\r\n {\r\n type: Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Irradiance\",\r\n },\r\n {\r\n type: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Position\",\r\n },\r\n {\r\n type: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n name: \"prePass_Velocity\",\r\n },\r\n {\r\n type: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n name: \"prePass_Reflectivity\",\r\n },\r\n {\r\n type: Constants.PREPASS_COLOR_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Color\",\r\n },\r\n {\r\n type: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Depth\",\r\n },\r\n {\r\n type: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Normal\",\r\n },\r\n {\r\n type: Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n name: \"prePass_Albedo\",\r\n },\r\n ];\r\n\r\n private _isDirty: boolean = true;\r\n\r\n /**\r\n * The render target where the scene is directly rendered\r\n */\r\n public defaultRT: PrePassRenderTarget;\r\n\r\n /**\r\n * Configuration for prepass effects\r\n */\r\n private _effectConfigurations: PrePassEffectConfiguration[] = [];\r\n\r\n /**\r\n * @returns the prepass render target for the rendering pass.\r\n * If we are currently rendering a render target, it returns the PrePassRenderTarget\r\n * associated with that render target. Otherwise, it returns the scene default PrePassRenderTarget\r\n */\r\n public getRenderTarget(): PrePassRenderTarget {\r\n return this._currentTarget;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Managed by the scene component\r\n * @param prePassRenderTarget\r\n */\r\n public _setRenderTarget(prePassRenderTarget: Nullable<PrePassRenderTarget>): void {\r\n if (prePassRenderTarget) {\r\n this._currentTarget = prePassRenderTarget;\r\n } else {\r\n this._currentTarget = this.defaultRT;\r\n this._engine.currentRenderPassId = this._currentTarget.renderPassId;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the currently rendered prePassRenderTarget is the one\r\n * associated with the scene.\r\n */\r\n public get currentRTisSceneRT(): boolean {\r\n return this._currentTarget === this.defaultRT;\r\n }\r\n\r\n private _geometryBuffer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback\r\n */\r\n public doNotUseGeometryRendererFallback = true;\r\n\r\n private _refreshGeometryBufferRendererLink() {\r\n if (!this.doNotUseGeometryRendererFallback) {\r\n this._geometryBuffer = this._scene.enableGeometryBufferRenderer();\r\n\r\n if (!this._geometryBuffer) {\r\n // Not supported\r\n this.doNotUseGeometryRendererFallback = true;\r\n return;\r\n }\r\n\r\n this._geometryBuffer._linkPrePassRenderer(this);\r\n } else {\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._unlinkPrePassRenderer();\r\n }\r\n this._geometryBuffer = null;\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n\r\n private _currentTarget: PrePassRenderTarget;\r\n\r\n /**\r\n * All the render targets generated by prepass\r\n */\r\n public renderTargets: PrePassRenderTarget[] = [];\r\n\r\n private readonly _clearColor = new Color4(0, 0, 0, 0);\r\n\r\n private _enabled: boolean = false;\r\n\r\n private _needsCompositionForThisPass = false;\r\n private _postProcessesSourceForThisPass: Nullable<PostProcess>[];\r\n\r\n /**\r\n * Indicates if the prepass is enabled\r\n */\r\n public get enabled() {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Set to true to disable gamma transform in PrePass.\r\n * Can be useful in case you already proceed to gamma transform on a material level\r\n * and your post processes don't need to be in linear color space.\r\n */\r\n public disableGammaTransform = false;\r\n\r\n /**\r\n * Instantiates a prepass renderer\r\n * @param scene The scene\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n PrePassRenderer._SceneComponentInitialization(this._scene);\r\n this.defaultRT = this._createRenderTarget(\"sceneprePassRT\", null);\r\n this._currentTarget = this.defaultRT;\r\n }\r\n\r\n /**\r\n * Creates a new PrePassRenderTarget\r\n * This should be the only way to instantiate a `PrePassRenderTarget`\r\n * @param name Name of the `PrePassRenderTarget`\r\n * @param renderTargetTexture RenderTarget the `PrePassRenderTarget` will be attached to.\r\n * Can be `null` if the created `PrePassRenderTarget` is attached to the scene (default framebuffer).\r\n * @internal\r\n */\r\n public _createRenderTarget(name: string, renderTargetTexture: Nullable<RenderTargetTexture>): PrePassRenderTarget {\r\n const rt = new PrePassRenderTarget(name, renderTargetTexture, { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, 0, this._scene, {\r\n generateMipMaps: false,\r\n generateStencilBuffer: this._engine.isStencilEnable,\r\n defaultType: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n types: [],\r\n drawOnlyOnFirstAttachmentByDefault: true,\r\n });\r\n\r\n this.renderTargets.push(rt);\r\n\r\n return rt;\r\n }\r\n\r\n /**\r\n * Indicates if rendering a prepass is supported\r\n */\r\n public get isSupported() {\r\n return this._scene.getEngine().getCaps().drawBuffersExtension;\r\n }\r\n\r\n /**\r\n * Sets the proper output textures to draw in the engine.\r\n * @param effect The effect that is drawn. It can be or not be compatible with drawing to several output textures.\r\n * @param subMesh Submesh on which the effect is applied\r\n */\r\n public bindAttachmentsForEffect(effect: Effect, subMesh: SubMesh) {\r\n const material = subMesh.getMaterial();\r\n const isPrePassCapable = material && material.isPrePassCapable;\r\n const excluded = material && this.excludedMaterials.indexOf(material) !== -1;\r\n\r\n if (this.enabled && this._currentTarget.enabled) {\r\n if (effect._multiTarget && isPrePassCapable && !excluded) {\r\n this._engine.bindAttachments(this._multiRenderAttachments);\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n\r\n if (this._geometryBuffer && this.currentRTisSceneRT && !excluded) {\r\n this._geometryBuffer.renderList!.push(subMesh.getRenderingMesh());\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _reinitializeAttachments() {\r\n const multiRenderLayout = [];\r\n const clearLayout = [false];\r\n const defaultLayout = [true];\r\n\r\n for (let i = 0; i < this.mrtCount; i++) {\r\n multiRenderLayout.push(true);\r\n\r\n if (i > 0) {\r\n clearLayout.push(true);\r\n defaultLayout.push(false);\r\n }\r\n }\r\n\r\n this._multiRenderAttachments = this._engine.buildTextureLayout(multiRenderLayout);\r\n this._clearAttachments = this._engine.buildTextureLayout(clearLayout);\r\n this._defaultAttachments = this._engine.buildTextureLayout(defaultLayout);\r\n }\r\n\r\n private _resetLayout() {\r\n for (let i = 0; i < PrePassRenderer._TextureFormats.length; i++) {\r\n this._textureIndices[PrePassRenderer._TextureFormats[i].type] = -1;\r\n }\r\n\r\n this._textureIndices[Constants.PREPASS_COLOR_TEXTURE_TYPE] = 0;\r\n this._mrtLayout = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n this._mrtFormats = [PrePassRenderer._TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].format];\r\n this._mrtNames = [PrePassRenderer._TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].name];\r\n this.mrtCount = 1;\r\n }\r\n\r\n private _updateGeometryBufferLayout() {\r\n this._refreshGeometryBufferRendererLink();\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._resetLayout();\r\n\r\n const texturesActivated = [];\r\n\r\n for (let i = 0; i < this._mrtLayout.length; i++) {\r\n texturesActivated.push(false);\r\n }\r\n\r\n this._geometryBuffer._linkInternalTexture(this.defaultRT.getInternalTexture()!);\r\n\r\n const matches = [\r\n {\r\n prePassConstant: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.DEPTH_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.NORMAL_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.POSITION_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.VELOCITY_TEXTURE_TYPE,\r\n },\r\n ];\r\n\r\n // replace textures in the geometryBuffer RT\r\n for (let i = 0; i < matches.length; i++) {\r\n const index = this._mrtLayout.indexOf(matches[i].prePassConstant);\r\n if (index !== -1) {\r\n this._geometryBuffer._forceTextureType(matches[i].geometryBufferConstant, index);\r\n texturesActivated[index] = true;\r\n }\r\n }\r\n\r\n this._geometryBuffer._setAttachments(this._engine.buildTextureLayout(texturesActivated));\r\n }\r\n }\r\n\r\n /**\r\n * Restores attachments for single texture draw.\r\n */\r\n public restoreAttachments() {\r\n if (this.enabled && this._currentTarget.enabled && this._defaultAttachments) {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _beforeDraw(camera?: Camera, faceIndex?: number, layer?: number) {\r\n // const previousEnabled = this._enabled && this._currentTarget.enabled;\r\n\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n\r\n if (!this._enabled || !this._currentTarget.enabled) {\r\n return;\r\n }\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer.renderList = [];\r\n }\r\n\r\n this._setupOutputForThisPass(this._currentTarget, camera);\r\n }\r\n\r\n private _prepareFrame(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number, layer?: number) {\r\n if (prePassRenderTarget.renderTargetTexture) {\r\n prePassRenderTarget.renderTargetTexture._prepareFrame(this._scene, faceIndex, layer, prePassRenderTarget.renderTargetTexture.useCameraPostProcesses);\r\n } else if (this._postProcessesSourceForThisPass.length) {\r\n this._scene.postProcessManager._prepareFrame();\r\n } else {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Sets an intermediary texture between prepass and postprocesses. This texture\r\n * will be used as input for post processes\r\n * @param rt\r\n * @returns true if there are postprocesses that will use this texture,\r\n * false if there is no postprocesses - and the function has no effect\r\n */\r\n public setCustomOutput(rt: RenderTargetTexture) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n if (!firstPP) {\r\n return false;\r\n }\r\n\r\n firstPP.inputTexture = rt.renderTarget!;\r\n\r\n return true;\r\n }\r\n\r\n private _renderPostProcesses(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n const outputTexture = firstPP ? firstPP.inputTexture : prePassRenderTarget.renderTargetTexture ? prePassRenderTarget.renderTargetTexture.renderTarget : null;\r\n\r\n // Build post process chain for this prepass post draw\r\n let postProcessChain = this._currentTarget._beforeCompositionPostProcesses;\r\n\r\n if (this._needsCompositionForThisPass) {\r\n postProcessChain = postProcessChain.concat([this._currentTarget.imageProcessingPostProcess]);\r\n }\r\n\r\n // Activates and renders the chain\r\n if (postProcessChain.length) {\r\n this._scene.postProcessManager._prepareFrame(this._currentTarget.renderTarget?.texture, postProcessChain);\r\n this._scene.postProcessManager.directRender(postProcessChain, outputTexture, false, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _afterDraw(faceIndex?: number, layer?: number) {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._prepareFrame(this._currentTarget, faceIndex, layer);\r\n this._renderPostProcesses(this._currentTarget, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * Clears the current prepass render target (in the sense of settings pixels to the scene clear color value)\r\n * @internal\r\n */\r\n public _clear() {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._bindFrameBuffer(this._currentTarget);\r\n\r\n // Clearing other attachment with 0 on all other attachments\r\n this._engine.bindAttachments(this._clearAttachments);\r\n this._engine.clear(this._clearColor, true, false, false);\r\n // Regular clear color with the scene clear color of the 1st attachment\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _bindFrameBuffer(prePassRenderTarget: PrePassRenderTarget) {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._currentTarget._checkSize();\r\n const internalTexture = this._currentTarget.renderTarget;\r\n if (internalTexture) {\r\n this._engine.bindFramebuffer(internalTexture);\r\n }\r\n }\r\n }\r\n\r\n private _setEnabled(enabled: boolean) {\r\n this._enabled = enabled;\r\n }\r\n\r\n private _setRenderTargetEnabled(prePassRenderTarget: PrePassRenderTarget, enabled: boolean) {\r\n prePassRenderTarget.enabled = enabled;\r\n if (!enabled) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Adds an effect configuration to the prepass render target.\r\n * If an effect has already been added, it won't add it twice and will return the configuration\r\n * already present.\r\n * @param cfg the effect configuration\r\n * @returns the effect configuration now used by the prepass\r\n */\r\n public addEffectConfiguration(cfg: PrePassEffectConfiguration): PrePassEffectConfiguration {\r\n // Do not add twice\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].name === cfg.name) {\r\n return this._effectConfigurations[i];\r\n }\r\n }\r\n\r\n this._effectConfigurations.push(cfg);\r\n return cfg;\r\n }\r\n\r\n private _enable() {\r\n const previousMrtCount = this.mrtCount;\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled) {\r\n this._enableTextures(this._effectConfigurations[i].texturesRequired);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.mrtCount !== previousMrtCount || this.renderTargets[i].count !== this.mrtCount) {\r\n this.renderTargets[i].updateCount(this.mrtCount, { types: this._mrtFormats }, this._mrtNames.concat(\"prePass_DepthBuffer\"));\r\n }\r\n\r\n this.renderTargets[i]._resetPostProcessChain();\r\n\r\n for (let j = 0; j < this._effectConfigurations.length; j++) {\r\n if (this._effectConfigurations[j].enabled) {\r\n // TODO : subsurface scattering has 1 scene-wide effect configuration\r\n // solution : do not stock postProcess on effectConfiguration, but in the prepassRenderTarget (hashmap configuration => postProcess)\r\n // And call createPostProcess whenever the post process does not exist in the RT\r\n if (!this._effectConfigurations[j].postProcess && this._effectConfigurations[j].createPostProcess) {\r\n this._effectConfigurations[j].createPostProcess!();\r\n }\r\n\r\n if (this._effectConfigurations[j].postProcess) {\r\n this.renderTargets[i]._beforeCompositionPostProcesses.push(this._effectConfigurations[j].postProcess!);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._reinitializeAttachments();\r\n this._setEnabled(true);\r\n this._updateGeometryBufferLayout();\r\n }\r\n\r\n private _disable() {\r\n this._setEnabled(false);\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], false);\r\n }\r\n\r\n this._resetLayout();\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n this._effectConfigurations[i].enabled = false;\r\n }\r\n }\r\n\r\n private _getPostProcessesSource(prePassRenderTarget: PrePassRenderTarget, camera?: Camera): Nullable<PostProcess>[] {\r\n if (camera) {\r\n return camera._postProcesses;\r\n } else if (prePassRenderTarget.renderTargetTexture) {\r\n if (prePassRenderTarget.renderTargetTexture.useCameraPostProcesses) {\r\n const camera = prePassRenderTarget.renderTargetTexture.activeCamera ? prePassRenderTarget.renderTargetTexture.activeCamera : this._scene.activeCamera;\r\n return camera ? camera._postProcesses : [];\r\n } else if (prePassRenderTarget.renderTargetTexture.postProcesses) {\r\n return prePassRenderTarget.renderTargetTexture.postProcesses;\r\n } else {\r\n return [];\r\n }\r\n } else {\r\n return this._scene.activeCamera ? this._scene.activeCamera._postProcesses : [];\r\n }\r\n }\r\n\r\n private _setupOutputForThisPass(prePassRenderTarget: PrePassRenderTarget, camera?: Camera) {\r\n // Order is : draw ===> prePassRenderTarget._postProcesses ==> ipp ==> camera._postProcesses\r\n const secondaryCamera = camera && this._scene.activeCameras && !!this._scene.activeCameras.length && this._scene.activeCameras.indexOf(camera) !== 0;\r\n this._postProcessesSourceForThisPass = this._getPostProcessesSource(prePassRenderTarget, camera);\r\n this._postProcessesSourceForThisPass = this._postProcessesSourceForThisPass.filter((pp) => {\r\n return pp != null;\r\n });\r\n this._scene.autoClear = true;\r\n\r\n const cameraHasImageProcessing = this._hasImageProcessing(this._postProcessesSourceForThisPass);\r\n this._needsCompositionForThisPass = !cameraHasImageProcessing && !this.disableGammaTransform && this._needsImageProcessing() && !secondaryCamera;\r\n\r\n const firstCameraPP = this._getFirstPostProcess(this._postProcessesSourceForThisPass);\r\n const firstPrePassPP = prePassRenderTarget._beforeCompositionPostProcesses && prePassRenderTarget._beforeCompositionPostProcesses[0];\r\n let firstPP = null;\r\n\r\n // Setting the scene-wide post process configuration\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = this._needsCompositionForThisPass || cameraHasImageProcessing;\r\n\r\n // Create composition effect if needed\r\n if (this._needsCompositionForThisPass && !prePassRenderTarget.imageProcessingPostProcess) {\r\n prePassRenderTarget._createCompositionEffect();\r\n }\r\n\r\n // Setting the prePassRenderTarget as input texture of the first PP\r\n if (firstPrePassPP) {\r\n firstPP = firstPrePassPP;\r\n } else if (this._needsCompositionForThisPass) {\r\n firstPP = prePassRenderTarget.imageProcessingPostProcess;\r\n } else if (firstCameraPP) {\r\n firstPP = firstCameraPP;\r\n }\r\n\r\n this._bindFrameBuffer(prePassRenderTarget);\r\n this._linkInternalTexture(prePassRenderTarget, firstPP);\r\n }\r\n\r\n private _linkInternalTexture(prePassRenderTarget: PrePassRenderTarget, postProcess: Nullable<PostProcess>) {\r\n if (postProcess) {\r\n postProcess.autoClear = false;\r\n postProcess.inputTexture = prePassRenderTarget.renderTarget!;\r\n }\r\n\r\n if (prePassRenderTarget._outputPostProcess !== postProcess) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n prePassRenderTarget._outputPostProcess = postProcess;\r\n }\r\n\r\n if (prePassRenderTarget._internalTextureDirty) {\r\n this._updateGeometryBufferLayout();\r\n prePassRenderTarget._internalTextureDirty = false;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _unlinkInternalTexture(prePassRenderTarget: PrePassRenderTarget) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n prePassRenderTarget._outputPostProcess.autoClear = true;\r\n prePassRenderTarget._outputPostProcess.restoreDefaultInputTexture();\r\n prePassRenderTarget._outputPostProcess = null;\r\n }\r\n }\r\n\r\n private _needsImageProcessing(): boolean {\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled && this._effectConfigurations[i].needsImageProcessing) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _hasImageProcessing(postProcesses: Nullable<PostProcess>[]): boolean {\r\n let isIPPAlreadyPresent = false;\r\n if (postProcesses) {\r\n for (let i = 0; i < postProcesses.length; i++) {\r\n if (postProcesses[i]?.getClassName() === \"ImageProcessingPostProcess\") {\r\n isIPPAlreadyPresent = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isIPPAlreadyPresent;\r\n }\r\n\r\n /**\r\n * Internal, gets the first post proces.\r\n * @param postProcesses\r\n * @returns the first post process to be run on this camera.\r\n */\r\n private _getFirstPostProcess(postProcesses: Nullable<PostProcess>[]): Nullable<PostProcess> {\r\n for (let ppIndex = 0; ppIndex < postProcesses.length; ppIndex++) {\r\n if (postProcesses[ppIndex] !== null) {\r\n return postProcesses[ppIndex];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the prepass renderer as dirty, triggering a check if the prepass is necessary for the next rendering.\r\n */\r\n public markAsDirty() {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Enables a texture on the MultiRenderTarget for prepass\r\n * @param types\r\n */\r\n private _enableTextures(types: number[]) {\r\n // For velocity : enable storage of previous matrices for instances\r\n this._scene.needsPreviousWorldMatrices = false;\r\n\r\n for (let i = 0; i < types.length; i++) {\r\n const type = types[i];\r\n\r\n if (this._textureIndices[type] === -1) {\r\n this._textureIndices[type] = this._mrtLayout.length;\r\n this._mrtLayout.push(type);\r\n\r\n this._mrtFormats.push(PrePassRenderer._TextureFormats[type].format);\r\n this._mrtNames.push(PrePassRenderer._TextureFormats[type].name);\r\n this.mrtCount++;\r\n }\r\n\r\n if (type === Constants.PREPASS_VELOCITY_TEXTURE_TYPE) {\r\n this._scene.needsPreviousWorldMatrices = true;\r\n }\r\n }\r\n }\r\n\r\n private _update() {\r\n this._disable();\r\n let enablePrePass = false;\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = false;\r\n\r\n if (this._scene._depthPeelingRenderer && this._scene.useOrderIndependentTransparency) {\r\n this._scene._depthPeelingRenderer.setPrePassRenderer(this);\r\n enablePrePass = true;\r\n }\r\n\r\n for (let i = 0; i < this._scene.materials.length; i++) {\r\n if (this._scene.materials[i].setPrePassRenderer(this)) {\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (enablePrePass) {\r\n this._setRenderTargetEnabled(this.defaultRT, true);\r\n }\r\n\r\n let postProcesses;\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.renderTargets[i].renderTargetTexture) {\r\n postProcesses = this._getPostProcessesSource(this.renderTargets[i]);\r\n } else {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n continue;\r\n }\r\n\r\n postProcesses = camera._postProcesses;\r\n }\r\n\r\n if (!postProcesses) {\r\n continue;\r\n }\r\n\r\n postProcesses = <Nullable<PostProcess[]>>postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (postProcesses) {\r\n for (let j = 0; j < postProcesses.length; j++) {\r\n if (postProcesses[j].setPrePassRenderer(this)) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], true);\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (this._hasImageProcessing(postProcesses)) {\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n }\r\n\r\n this._markAllMaterialsAsPrePassDirty();\r\n this._isDirty = false;\r\n\r\n if (enablePrePass) {\r\n this._enable();\r\n }\r\n }\r\n\r\n private _markAllMaterialsAsPrePassDirty() {\r\n const materials = this._scene.materials;\r\n\r\n for (let i = 0; i < materials.length; i++) {\r\n materials[i].markAsDirty(Material.PrePassDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the prepass renderer.\r\n */\r\n public dispose() {\r\n for (let i = this.renderTargets.length - 1; i >= 0; i--) {\r\n this.renderTargets[i].dispose();\r\n }\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].dispose) {\r\n this._effectConfigurations[i].dispose!();\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"prePassRenderer.js","sourceRoot":"","sources":["../../../../lts/core/generated/Rendering/prePassRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { PrePassRenderTarget } from \"../Materials/Textures/prePassRenderTarget\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { GeometryBufferRenderer } from \"../Rendering/geometryBufferRenderer\";\r\n\r\n/**\r\n * Renders a pre pass of the scene\r\n * This means every mesh in the scene will be rendered to a render target texture\r\n * And then this texture will be composited to the rendering canvas with post processes\r\n * It is necessary for effects like subsurface scattering or deferred shading\r\n */\r\nexport class PrePassRenderer {\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"PrePassRendererSceneComponent\");\r\n };\r\n\r\n /**\r\n * To save performance, we can excluded skinned meshes from the prepass\r\n */\r\n public excludedSkinnedMesh: AbstractMesh[] = [];\r\n\r\n /**\r\n * Force material to be excluded from the prepass\r\n * Can be useful when `useGeometryBufferFallback` is set to `true`\r\n * and you don't want a material to show in the effect.\r\n */\r\n public excludedMaterials: Material[] = [];\r\n\r\n private _scene: Scene;\r\n private _engine: Engine;\r\n\r\n /**\r\n * Number of textures in the multi render target texture where the scene is directly rendered\r\n */\r\n public mrtCount: number = 0;\r\n\r\n private _mrtFormats: number[] = [];\r\n private _mrtLayout: number[] = [];\r\n private _mrtNames: string[] = [];\r\n private _textureIndices: number[] = [];\r\n\r\n private _multiRenderAttachments: number[];\r\n private _defaultAttachments: number[];\r\n private _clearAttachments: number[];\r\n\r\n /**\r\n * Returns the index of a texture in the multi render target texture array.\r\n * @param type Texture type\r\n * @returns The index\r\n */\r\n public getIndex(type: number): number {\r\n return this._textureIndices[type];\r\n }\r\n\r\n /**\r\n * How many samples are used for MSAA of the scene render target\r\n */\r\n public get samples() {\r\n return this.defaultRT.samples;\r\n }\r\n\r\n public set samples(n: number) {\r\n this.defaultRT.samples = n;\r\n }\r\n\r\n private static _TextureFormats = [\r\n {\r\n type: Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Irradiance\",\r\n },\r\n {\r\n type: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Position\",\r\n },\r\n {\r\n type: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n name: \"prePass_Velocity\",\r\n },\r\n {\r\n type: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n name: \"prePass_Reflectivity\",\r\n },\r\n {\r\n type: Constants.PREPASS_COLOR_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Color\",\r\n },\r\n {\r\n type: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Depth\",\r\n },\r\n {\r\n type: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_HALF_FLOAT,\r\n name: \"prePass_Normal\",\r\n },\r\n {\r\n type: Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n format: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n name: \"prePass_Albedo\",\r\n },\r\n ];\r\n\r\n private _isDirty: boolean = true;\r\n\r\n /**\r\n * The render target where the scene is directly rendered\r\n */\r\n public defaultRT: PrePassRenderTarget;\r\n\r\n /**\r\n * Configuration for prepass effects\r\n */\r\n private _effectConfigurations: PrePassEffectConfiguration[] = [];\r\n\r\n /**\r\n * @returns the prepass render target for the rendering pass.\r\n * If we are currently rendering a render target, it returns the PrePassRenderTarget\r\n * associated with that render target. Otherwise, it returns the scene default PrePassRenderTarget\r\n */\r\n public getRenderTarget(): PrePassRenderTarget {\r\n return this._currentTarget;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Managed by the scene component\r\n * @param prePassRenderTarget\r\n */\r\n public _setRenderTarget(prePassRenderTarget: Nullable<PrePassRenderTarget>): void {\r\n if (prePassRenderTarget) {\r\n this._currentTarget = prePassRenderTarget;\r\n } else {\r\n this._currentTarget = this.defaultRT;\r\n this._engine.currentRenderPassId = this._currentTarget.renderPassId;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the currently rendered prePassRenderTarget is the one\r\n * associated with the scene.\r\n */\r\n public get currentRTisSceneRT(): boolean {\r\n return this._currentTarget === this.defaultRT;\r\n }\r\n\r\n private _geometryBuffer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback\r\n */\r\n public doNotUseGeometryRendererFallback = true;\r\n\r\n private _refreshGeometryBufferRendererLink() {\r\n if (!this.doNotUseGeometryRendererFallback) {\r\n this._geometryBuffer = this._scene.enableGeometryBufferRenderer();\r\n\r\n if (!this._geometryBuffer) {\r\n // Not supported\r\n this.doNotUseGeometryRendererFallback = true;\r\n return;\r\n }\r\n\r\n this._geometryBuffer._linkPrePassRenderer(this);\r\n } else {\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._unlinkPrePassRenderer();\r\n }\r\n this._geometryBuffer = null;\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n\r\n private _currentTarget: PrePassRenderTarget;\r\n\r\n /**\r\n * All the render targets generated by prepass\r\n */\r\n public renderTargets: PrePassRenderTarget[] = [];\r\n\r\n private readonly _clearColor = new Color4(0, 0, 0, 0);\r\n\r\n private _enabled: boolean = false;\r\n\r\n private _needsCompositionForThisPass = false;\r\n private _postProcessesSourceForThisPass: Nullable<PostProcess>[];\r\n\r\n /**\r\n * Indicates if the prepass is enabled\r\n */\r\n public get enabled() {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Set to true to disable gamma transform in PrePass.\r\n * Can be useful in case you already proceed to gamma transform on a material level\r\n * and your post processes don't need to be in linear color space.\r\n */\r\n public disableGammaTransform = false;\r\n\r\n /**\r\n * Instantiates a prepass renderer\r\n * @param scene The scene\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n PrePassRenderer._SceneComponentInitialization(this._scene);\r\n this.defaultRT = this._createRenderTarget(\"sceneprePassRT\", null);\r\n this._currentTarget = this.defaultRT;\r\n }\r\n\r\n /**\r\n * Creates a new PrePassRenderTarget\r\n * This should be the only way to instantiate a `PrePassRenderTarget`\r\n * @param name Name of the `PrePassRenderTarget`\r\n * @param renderTargetTexture RenderTarget the `PrePassRenderTarget` will be attached to.\r\n * Can be `null` if the created `PrePassRenderTarget` is attached to the scene (default framebuffer).\r\n * @internal\r\n */\r\n public _createRenderTarget(name: string, renderTargetTexture: Nullable<RenderTargetTexture>): PrePassRenderTarget {\r\n const rt = new PrePassRenderTarget(name, renderTargetTexture, { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, 0, this._scene, {\r\n generateMipMaps: false,\r\n generateStencilBuffer: this._engine.isStencilEnable,\r\n defaultType: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n types: [],\r\n drawOnlyOnFirstAttachmentByDefault: true,\r\n });\r\n\r\n this.renderTargets.push(rt);\r\n\r\n return rt;\r\n }\r\n\r\n /**\r\n * Indicates if rendering a prepass is supported\r\n */\r\n public get isSupported() {\r\n return this._scene.getEngine().getCaps().drawBuffersExtension;\r\n }\r\n\r\n /**\r\n * Sets the proper output textures to draw in the engine.\r\n * @param effect The effect that is drawn. It can be or not be compatible with drawing to several output textures.\r\n * @param subMesh Submesh on which the effect is applied\r\n */\r\n public bindAttachmentsForEffect(effect: Effect, subMesh: SubMesh) {\r\n const material = subMesh.getMaterial();\r\n const isPrePassCapable = material && material.isPrePassCapable;\r\n const excluded = material && this.excludedMaterials.indexOf(material) !== -1;\r\n\r\n if (this.enabled && this._currentTarget.enabled) {\r\n if (effect._multiTarget && isPrePassCapable && !excluded) {\r\n this._engine.bindAttachments(this._multiRenderAttachments);\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n\r\n if (this._geometryBuffer && this.currentRTisSceneRT && !excluded) {\r\n this._geometryBuffer.renderList!.push(subMesh.getRenderingMesh());\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _reinitializeAttachments() {\r\n const multiRenderLayout = [];\r\n const clearLayout = [false];\r\n const defaultLayout = [true];\r\n\r\n for (let i = 0; i < this.mrtCount; i++) {\r\n multiRenderLayout.push(true);\r\n\r\n if (i > 0) {\r\n clearLayout.push(true);\r\n defaultLayout.push(false);\r\n }\r\n }\r\n\r\n this._multiRenderAttachments = this._engine.buildTextureLayout(multiRenderLayout);\r\n this._clearAttachments = this._engine.buildTextureLayout(clearLayout);\r\n this._defaultAttachments = this._engine.buildTextureLayout(defaultLayout);\r\n }\r\n\r\n private _resetLayout() {\r\n for (let i = 0; i < PrePassRenderer._TextureFormats.length; i++) {\r\n this._textureIndices[PrePassRenderer._TextureFormats[i].type] = -1;\r\n }\r\n\r\n this._textureIndices[Constants.PREPASS_COLOR_TEXTURE_TYPE] = 0;\r\n this._mrtLayout = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n this._mrtFormats = [PrePassRenderer._TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].format];\r\n this._mrtNames = [PrePassRenderer._TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].name];\r\n this.mrtCount = 1;\r\n }\r\n\r\n private _updateGeometryBufferLayout() {\r\n this._refreshGeometryBufferRendererLink();\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._resetLayout();\r\n\r\n const texturesActivated = [];\r\n\r\n for (let i = 0; i < this._mrtLayout.length; i++) {\r\n texturesActivated.push(false);\r\n }\r\n\r\n this._geometryBuffer._linkInternalTexture(this.defaultRT.getInternalTexture()!);\r\n\r\n const matches = [\r\n {\r\n prePassConstant: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.DEPTH_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.NORMAL_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.POSITION_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.VELOCITY_TEXTURE_TYPE,\r\n },\r\n ];\r\n\r\n // replace textures in the geometryBuffer RT\r\n for (let i = 0; i < matches.length; i++) {\r\n const index = this._mrtLayout.indexOf(matches[i].prePassConstant);\r\n if (index !== -1) {\r\n this._geometryBuffer._forceTextureType(matches[i].geometryBufferConstant, index);\r\n texturesActivated[index] = true;\r\n }\r\n }\r\n\r\n this._geometryBuffer._setAttachments(this._engine.buildTextureLayout(texturesActivated));\r\n }\r\n }\r\n\r\n /**\r\n * Restores attachments for single texture draw.\r\n */\r\n public restoreAttachments() {\r\n if (this.enabled && this._currentTarget.enabled && this._defaultAttachments) {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _beforeDraw(camera?: Camera, faceIndex?: number, layer?: number) {\r\n // const previousEnabled = this._enabled && this._currentTarget.enabled;\r\n\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n\r\n if (!this._enabled || !this._currentTarget.enabled) {\r\n return;\r\n }\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer.renderList = [];\r\n }\r\n\r\n this._setupOutputForThisPass(this._currentTarget, camera);\r\n }\r\n\r\n private _prepareFrame(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number, layer?: number) {\r\n if (prePassRenderTarget.renderTargetTexture) {\r\n prePassRenderTarget.renderTargetTexture._prepareFrame(this._scene, faceIndex, layer, prePassRenderTarget.renderTargetTexture.useCameraPostProcesses);\r\n } else if (this._postProcessesSourceForThisPass.length) {\r\n this._scene.postProcessManager._prepareFrame();\r\n } else {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Sets an intermediary texture between prepass and postprocesses. This texture\r\n * will be used as input for post processes\r\n * @param rt\r\n * @returns true if there are postprocesses that will use this texture,\r\n * false if there is no postprocesses - and the function has no effect\r\n */\r\n public setCustomOutput(rt: RenderTargetTexture) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n if (!firstPP) {\r\n return false;\r\n }\r\n\r\n firstPP.inputTexture = rt.renderTarget!;\r\n\r\n return true;\r\n }\r\n\r\n private _renderPostProcesses(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n const outputTexture = firstPP ? firstPP.inputTexture : prePassRenderTarget.renderTargetTexture ? prePassRenderTarget.renderTargetTexture.renderTarget : null;\r\n\r\n // Build post process chain for this prepass post draw\r\n let postProcessChain = this._currentTarget._beforeCompositionPostProcesses;\r\n\r\n if (this._needsCompositionForThisPass) {\r\n postProcessChain = postProcessChain.concat([this._currentTarget.imageProcessingPostProcess]);\r\n }\r\n\r\n // Activates and renders the chain\r\n if (postProcessChain.length) {\r\n this._scene.postProcessManager._prepareFrame(this._currentTarget.renderTarget?.texture, postProcessChain);\r\n this._scene.postProcessManager.directRender(postProcessChain, outputTexture, false, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _afterDraw(faceIndex?: number, layer?: number) {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._prepareFrame(this._currentTarget, faceIndex, layer);\r\n this._renderPostProcesses(this._currentTarget, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * Clears the current prepass render target (in the sense of settings pixels to the scene clear color value)\r\n * @internal\r\n */\r\n public _clear() {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._bindFrameBuffer(this._currentTarget);\r\n\r\n // Clearing other attachment with 0 on all other attachments\r\n this._engine.bindAttachments(this._clearAttachments);\r\n this._engine.clear(this._clearColor, true, false, false);\r\n // Regular clear color with the scene clear color of the 1st attachment\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _bindFrameBuffer(prePassRenderTarget: PrePassRenderTarget) {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._currentTarget._checkSize();\r\n const internalTexture = this._currentTarget.renderTarget;\r\n if (internalTexture) {\r\n this._engine.bindFramebuffer(internalTexture);\r\n }\r\n }\r\n }\r\n\r\n private _setEnabled(enabled: boolean) {\r\n this._enabled = enabled;\r\n }\r\n\r\n private _setRenderTargetEnabled(prePassRenderTarget: PrePassRenderTarget, enabled: boolean) {\r\n prePassRenderTarget.enabled = enabled;\r\n if (!enabled) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Adds an effect configuration to the prepass render target.\r\n * If an effect has already been added, it won't add it twice and will return the configuration\r\n * already present.\r\n * @param cfg the effect configuration\r\n * @returns the effect configuration now used by the prepass\r\n */\r\n public addEffectConfiguration(cfg: PrePassEffectConfiguration): PrePassEffectConfiguration {\r\n // Do not add twice\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].name === cfg.name) {\r\n return this._effectConfigurations[i];\r\n }\r\n }\r\n\r\n this._effectConfigurations.push(cfg);\r\n return cfg;\r\n }\r\n\r\n private _enable() {\r\n const previousMrtCount = this.mrtCount;\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled) {\r\n this._enableTextures(this._effectConfigurations[i].texturesRequired);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.mrtCount !== previousMrtCount || this.renderTargets[i].count !== this.mrtCount) {\r\n this.renderTargets[i].updateCount(this.mrtCount, { types: this._mrtFormats }, this._mrtNames.concat(\"prePass_DepthBuffer\"));\r\n }\r\n\r\n this.renderTargets[i]._resetPostProcessChain();\r\n\r\n for (let j = 0; j < this._effectConfigurations.length; j++) {\r\n if (this._effectConfigurations[j].enabled) {\r\n // TODO : subsurface scattering has 1 scene-wide effect configuration\r\n // solution : do not stock postProcess on effectConfiguration, but in the prepassRenderTarget (hashmap configuration => postProcess)\r\n // And call createPostProcess whenever the post process does not exist in the RT\r\n if (!this._effectConfigurations[j].postProcess && this._effectConfigurations[j].createPostProcess) {\r\n this._effectConfigurations[j].createPostProcess!();\r\n }\r\n\r\n if (this._effectConfigurations[j].postProcess) {\r\n this.renderTargets[i]._beforeCompositionPostProcesses.push(this._effectConfigurations[j].postProcess!);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._reinitializeAttachments();\r\n this._setEnabled(true);\r\n this._updateGeometryBufferLayout();\r\n }\r\n\r\n private _disable() {\r\n this._setEnabled(false);\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], false);\r\n }\r\n\r\n this._resetLayout();\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n this._effectConfigurations[i].enabled = false;\r\n }\r\n }\r\n\r\n private _getPostProcessesSource(prePassRenderTarget: PrePassRenderTarget, camera?: Camera): Nullable<PostProcess>[] {\r\n if (camera) {\r\n return camera._postProcesses;\r\n } else if (prePassRenderTarget.renderTargetTexture) {\r\n if (prePassRenderTarget.renderTargetTexture.useCameraPostProcesses) {\r\n const camera = prePassRenderTarget.renderTargetTexture.activeCamera ? prePassRenderTarget.renderTargetTexture.activeCamera : this._scene.activeCamera;\r\n return camera ? camera._postProcesses : [];\r\n } else if (prePassRenderTarget.renderTargetTexture.postProcesses) {\r\n return prePassRenderTarget.renderTargetTexture.postProcesses;\r\n } else {\r\n return [];\r\n }\r\n } else {\r\n return this._scene.activeCamera ? this._scene.activeCamera._postProcesses : [];\r\n }\r\n }\r\n\r\n private _setupOutputForThisPass(prePassRenderTarget: PrePassRenderTarget, camera?: Camera) {\r\n // Order is : draw ===> prePassRenderTarget._postProcesses ==> ipp ==> camera._postProcesses\r\n const secondaryCamera = camera && this._scene.activeCameras && !!this._scene.activeCameras.length && this._scene.activeCameras.indexOf(camera) !== 0;\r\n this._postProcessesSourceForThisPass = this._getPostProcessesSource(prePassRenderTarget, camera);\r\n this._postProcessesSourceForThisPass = this._postProcessesSourceForThisPass.filter((pp) => {\r\n return pp != null;\r\n });\r\n this._scene.autoClear = true;\r\n\r\n const cameraHasImageProcessing = this._hasImageProcessing(this._postProcessesSourceForThisPass);\r\n this._needsCompositionForThisPass = !cameraHasImageProcessing && !this.disableGammaTransform && this._needsImageProcessing() && !secondaryCamera;\r\n\r\n const firstCameraPP = this._getFirstPostProcess(this._postProcessesSourceForThisPass);\r\n const firstPrePassPP = prePassRenderTarget._beforeCompositionPostProcesses && prePassRenderTarget._beforeCompositionPostProcesses[0];\r\n let firstPP = null;\r\n\r\n // Setting the scene-wide post process configuration\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = this._needsCompositionForThisPass || cameraHasImageProcessing;\r\n\r\n // Create composition effect if needed\r\n if (this._needsCompositionForThisPass && !prePassRenderTarget.imageProcessingPostProcess) {\r\n prePassRenderTarget._createCompositionEffect();\r\n }\r\n\r\n // Setting the prePassRenderTarget as input texture of the first PP\r\n if (firstPrePassPP) {\r\n firstPP = firstPrePassPP;\r\n } else if (this._needsCompositionForThisPass) {\r\n firstPP = prePassRenderTarget.imageProcessingPostProcess;\r\n } else if (firstCameraPP) {\r\n firstPP = firstCameraPP;\r\n }\r\n\r\n this._bindFrameBuffer(prePassRenderTarget);\r\n this._linkInternalTexture(prePassRenderTarget, firstPP);\r\n }\r\n\r\n private _linkInternalTexture(prePassRenderTarget: PrePassRenderTarget, postProcess: Nullable<PostProcess>) {\r\n if (postProcess) {\r\n postProcess.autoClear = false;\r\n postProcess.inputTexture = prePassRenderTarget.renderTarget!;\r\n }\r\n\r\n if (prePassRenderTarget._outputPostProcess !== postProcess) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n prePassRenderTarget._outputPostProcess = postProcess;\r\n }\r\n\r\n if (prePassRenderTarget._internalTextureDirty) {\r\n this._updateGeometryBufferLayout();\r\n prePassRenderTarget._internalTextureDirty = false;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _unlinkInternalTexture(prePassRenderTarget: PrePassRenderTarget) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n prePassRenderTarget._outputPostProcess.autoClear = true;\r\n prePassRenderTarget._outputPostProcess.restoreDefaultInputTexture();\r\n prePassRenderTarget._outputPostProcess = null;\r\n }\r\n }\r\n\r\n private _needsImageProcessing(): boolean {\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled && this._effectConfigurations[i].needsImageProcessing) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _hasImageProcessing(postProcesses: Nullable<PostProcess>[]): boolean {\r\n let isIPPAlreadyPresent = false;\r\n if (postProcesses) {\r\n for (let i = 0; i < postProcesses.length; i++) {\r\n if (postProcesses[i]?.getClassName() === \"ImageProcessingPostProcess\") {\r\n isIPPAlreadyPresent = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isIPPAlreadyPresent;\r\n }\r\n\r\n /**\r\n * Internal, gets the first post proces.\r\n * @param postProcesses\r\n * @returns the first post process to be run on this camera.\r\n */\r\n private _getFirstPostProcess(postProcesses: Nullable<PostProcess>[]): Nullable<PostProcess> {\r\n for (let ppIndex = 0; ppIndex < postProcesses.length; ppIndex++) {\r\n if (postProcesses[ppIndex] !== null) {\r\n return postProcesses[ppIndex];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the prepass renderer as dirty, triggering a check if the prepass is necessary for the next rendering.\r\n */\r\n public markAsDirty() {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Enables a texture on the MultiRenderTarget for prepass\r\n * @param types\r\n */\r\n private _enableTextures(types: number[]) {\r\n // For velocity : enable storage of previous matrices for instances\r\n this._scene.needsPreviousWorldMatrices = false;\r\n\r\n for (let i = 0; i < types.length; i++) {\r\n const type = types[i];\r\n\r\n if (this._textureIndices[type] === -1) {\r\n this._textureIndices[type] = this._mrtLayout.length;\r\n this._mrtLayout.push(type);\r\n\r\n this._mrtFormats.push(PrePassRenderer._TextureFormats[type].format);\r\n this._mrtNames.push(PrePassRenderer._TextureFormats[type].name);\r\n this.mrtCount++;\r\n }\r\n\r\n if (type === Constants.PREPASS_VELOCITY_TEXTURE_TYPE) {\r\n this._scene.needsPreviousWorldMatrices = true;\r\n }\r\n }\r\n }\r\n\r\n private _update() {\r\n this._disable();\r\n let enablePrePass = false;\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = false;\r\n\r\n if (this._scene._depthPeelingRenderer && this._scene.useOrderIndependentTransparency) {\r\n this._scene._depthPeelingRenderer.setPrePassRenderer(this);\r\n enablePrePass = true;\r\n }\r\n\r\n for (let i = 0; i < this._scene.materials.length; i++) {\r\n if (this._scene.materials[i].setPrePassRenderer(this)) {\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (enablePrePass) {\r\n this._setRenderTargetEnabled(this.defaultRT, true);\r\n }\r\n\r\n let postProcesses;\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.renderTargets[i].renderTargetTexture) {\r\n postProcesses = this._getPostProcessesSource(this.renderTargets[i]);\r\n } else {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n continue;\r\n }\r\n\r\n postProcesses = camera._postProcesses;\r\n }\r\n\r\n if (!postProcesses) {\r\n continue;\r\n }\r\n\r\n postProcesses = <Nullable<PostProcess[]>>postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (postProcesses) {\r\n for (let j = 0; j < postProcesses.length; j++) {\r\n if (postProcesses[j].setPrePassRenderer(this)) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], true);\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (this._hasImageProcessing(postProcesses)) {\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n }\r\n\r\n this._markAllMaterialsAsPrePassDirty();\r\n this._isDirty = false;\r\n\r\n if (enablePrePass) {\r\n this._enable();\r\n }\r\n }\r\n\r\n private _markAllMaterialsAsPrePassDirty() {\r\n const materials = this._scene.materials;\r\n\r\n for (let i = 0; i < materials.length; i++) {\r\n materials[i].markAsDirty(Material.PrePassDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the prepass renderer.\r\n */\r\n public dispose() {\r\n for (let i = this.renderTargets.length - 1; i >= 0; i--) {\r\n this.renderTargets[i].dispose();\r\n }\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].dispose) {\r\n this._effectConfigurations[i].dispose!();\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -8,31 +8,6 @@ import { Vector3 } from "../Maths/math.vector.js";
8
8
  * @internal
9
9
  */
10
10
  export class RenderingGroup {
11
- /**
12
- * Creates a new rendering group.
13
- * @param index The rendering group index
14
- * @param scene
15
- * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied
16
- * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied
17
- * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied
18
- */
19
- constructor(index, scene, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) {
20
- this.index = index;
21
- this._opaqueSubMeshes = new SmartArray(256);
22
- this._transparentSubMeshes = new SmartArray(256);
23
- this._alphaTestSubMeshes = new SmartArray(256);
24
- this._depthOnlySubMeshes = new SmartArray(256);
25
- this._particleSystems = new SmartArray(256);
26
- this._spriteManagers = new SmartArray(256);
27
- /** @internal */
28
- this._empty = true;
29
- /** @internal */
30
- this._edgesRenderers = new SmartArrayNoDuplicate(16);
31
- this._scene = scene;
32
- this.opaqueSortCompareFn = opaqueSortCompareFn;
33
- this.alphaTestSortCompareFn = alphaTestSortCompareFn;
34
- this.transparentSortCompareFn = transparentSortCompareFn;
35
- }
36
11
  /**
37
12
  * Set the opaque sort comparison function.
38
13
  * If null the sub meshes will be render in the order they were created
@@ -72,6 +47,31 @@ export class RenderingGroup {
72
47
  }
73
48
  this._renderTransparent = this._renderTransparentSorted;
74
49
  }
50
+ /**
51
+ * Creates a new rendering group.
52
+ * @param index The rendering group index
53
+ * @param scene
54
+ * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied
55
+ * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied
56
+ * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied
57
+ */
58
+ constructor(index, scene, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) {
59
+ this.index = index;
60
+ this._opaqueSubMeshes = new SmartArray(256);
61
+ this._transparentSubMeshes = new SmartArray(256);
62
+ this._alphaTestSubMeshes = new SmartArray(256);
63
+ this._depthOnlySubMeshes = new SmartArray(256);
64
+ this._particleSystems = new SmartArray(256);
65
+ this._spriteManagers = new SmartArray(256);
66
+ /** @internal */
67
+ this._empty = true;
68
+ /** @internal */
69
+ this._edgesRenderers = new SmartArrayNoDuplicate(16);
70
+ this._scene = scene;
71
+ this.opaqueSortCompareFn = opaqueSortCompareFn;
72
+ this.alphaTestSortCompareFn = alphaTestSortCompareFn;
73
+ this.transparentSortCompareFn = transparentSortCompareFn;
74
+ }
75
75
  /**
76
76
  * Render all the sub meshes contained in the group.
77
77
  * @param customRenderFunction Used to override the default render behaviour of the group.
@@ -1 +1 @@
1
- {"version":3,"file":"renderingGroup.js","sourceRoot":"","sources":["../../../../lts/core/generated/Rendering/renderingGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import { SmartArray, SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable, DeepImmutable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { IEdgesRenderer } from \"./edgesRenderer\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\n\r\n/**\r\n * This represents the object necessary to create a rendering group.\r\n * This is exclusively used and created by the rendering manager.\r\n * To modify the behavior, you use the available helpers in your scene or meshes.\r\n * @internal\r\n */\r\nexport class RenderingGroup {\r\n private static _ZeroVector: DeepImmutable<Vector3> = Vector3.Zero();\r\n private _scene: Scene;\r\n private _opaqueSubMeshes = new SmartArray<SubMesh>(256);\r\n private _transparentSubMeshes = new SmartArray<SubMesh>(256);\r\n private _alphaTestSubMeshes = new SmartArray<SubMesh>(256);\r\n private _depthOnlySubMeshes = new SmartArray<SubMesh>(256);\r\n private _particleSystems = new SmartArray<IParticleSystem>(256);\r\n private _spriteManagers = new SmartArray<ISpriteManager>(256);\r\n\r\n private _opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _transparentSortCompareFn: (a: SubMesh, b: SubMesh) => number;\r\n\r\n private _renderOpaque: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderAlphaTest: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderTransparent: (subMeshes: SmartArray<SubMesh>) => void;\r\n\r\n /** @internal */\r\n public _empty = true;\r\n\r\n /** @internal */\r\n public _edgesRenderers = new SmartArrayNoDuplicate<IEdgesRenderer>(16);\r\n\r\n public onBeforeTransparentRendering: () => void;\r\n\r\n /**\r\n * Set the opaque sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set opaqueSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._opaqueSortCompareFn = value;\r\n } else {\r\n this._opaqueSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderOpaque = this._renderOpaqueSorted;\r\n }\r\n\r\n /**\r\n * Set the alpha test sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set alphaTestSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._alphaTestSortCompareFn = value;\r\n } else {\r\n this._alphaTestSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderAlphaTest = this._renderAlphaTestSorted;\r\n }\r\n\r\n /**\r\n * Set the transparent sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set transparentSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._transparentSortCompareFn = value;\r\n } else {\r\n this._transparentSortCompareFn = RenderingGroup.defaultTransparentSortCompare;\r\n }\r\n this._renderTransparent = this._renderTransparentSorted;\r\n }\r\n\r\n /**\r\n * Creates a new rendering group.\r\n * @param index The rendering group index\r\n * @param scene\r\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\r\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\r\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\r\n */\r\n constructor(\r\n public index: number,\r\n scene: Scene,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._scene = scene;\r\n\r\n this.opaqueSortCompareFn = opaqueSortCompareFn;\r\n this.alphaTestSortCompareFn = alphaTestSortCompareFn;\r\n this.transparentSortCompareFn = transparentSortCompareFn;\r\n }\r\n\r\n /**\r\n * Render all the sub meshes contained in the group.\r\n * @param customRenderFunction Used to override the default render behaviour of the group.\r\n * @param renderSprites\r\n * @param renderParticles\r\n * @param activeMeshes\r\n * @returns true if rendered some submeshes.\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ) => void\r\n >,\r\n renderSprites: boolean,\r\n renderParticles: boolean,\r\n activeMeshes: Nullable<AbstractMesh[]>\r\n ): void {\r\n if (customRenderFunction) {\r\n customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Depth only\r\n if (this._depthOnlySubMeshes.length !== 0) {\r\n engine.setColorWrite(false);\r\n this._renderAlphaTest(this._depthOnlySubMeshes);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n // Opaque\r\n if (this._opaqueSubMeshes.length !== 0) {\r\n this._renderOpaque(this._opaqueSubMeshes);\r\n }\r\n\r\n // Alpha test\r\n if (this._alphaTestSubMeshes.length !== 0) {\r\n this._renderAlphaTest(this._alphaTestSubMeshes);\r\n }\r\n\r\n const stencilState = engine.getStencilBuffer();\r\n engine.setStencilBuffer(false);\r\n\r\n // Sprites\r\n if (renderSprites) {\r\n this._renderSprites();\r\n }\r\n\r\n // Particles\r\n if (renderParticles) {\r\n this._renderParticles(activeMeshes);\r\n }\r\n\r\n if (this.onBeforeTransparentRendering) {\r\n this.onBeforeTransparentRendering();\r\n }\r\n\r\n // Transparent\r\n if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\r\n engine.setStencilBuffer(stencilState);\r\n if (this._scene.useOrderIndependentTransparency) {\r\n const excludedMeshes = this._scene.depthPeelingRenderer!.render(this._transparentSubMeshes);\r\n if (excludedMeshes.length) {\r\n // Render leftover meshes that could not be processed by depth peeling\r\n this._renderTransparent(excludedMeshes);\r\n }\r\n } else {\r\n this._renderTransparent(this._transparentSubMeshes);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Set back stencil to false in case it changes before the edge renderer.\r\n engine.setStencilBuffer(false);\r\n\r\n // Edges\r\n if (this._edgesRenderers.length) {\r\n for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {\r\n this._edgesRenderers.data[edgesRendererIndex].render();\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Stencil state.\r\n engine.setStencilBuffer(stencilState);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderOpaqueSorted(subMeshes: SmartArray<SubMesh>): void {\r\n return RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderAlphaTestSorted(subMeshes: SmartArray<SubMesh>): void {\r\n return RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderTransparentSorted(subMeshes: SmartArray<SubMesh>): void {\r\n return RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true);\r\n }\r\n\r\n /**\r\n * Renders the submeshes in a specified order.\r\n * @param subMeshes The submeshes to sort before render\r\n * @param sortCompareFn The comparison function use to sort\r\n * @param camera The camera position use to preprocess the submeshes to help sorting\r\n * @param transparent Specifies to activate blending if true\r\n */\r\n private static _RenderSorted(\r\n subMeshes: SmartArray<SubMesh>,\r\n sortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>,\r\n camera: Nullable<Camera>,\r\n transparent: boolean\r\n ): void {\r\n let subIndex = 0;\r\n let subMesh: SubMesh;\r\n const cameraPosition = camera ? camera.globalPosition : RenderingGroup._ZeroVector;\r\n\r\n if (transparent) {\r\n for (; subIndex < subMeshes.length; subIndex++) {\r\n subMesh = subMeshes.data[subIndex];\r\n subMesh._alphaIndex = subMesh.getMesh().alphaIndex;\r\n subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n }\r\n\r\n const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length);\r\n\r\n if (sortCompareFn) {\r\n sortedArray.sort(sortCompareFn);\r\n }\r\n\r\n const scene = sortedArray[0].getMesh().getScene();\r\n for (subIndex = 0; subIndex < sortedArray.length; subIndex++) {\r\n subMesh = sortedArray[subIndex];\r\n\r\n if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) {\r\n continue;\r\n }\r\n\r\n if (transparent) {\r\n const material = subMesh.getMaterial();\r\n\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n subMesh.render(false);\r\n engine.setColorWrite(true);\r\n }\r\n }\r\n\r\n subMesh.render(transparent);\r\n }\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front if in the same alpha index.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static defaultTransparentSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Alpha index first\r\n if (a._alphaIndex > b._alphaIndex) {\r\n return 1;\r\n }\r\n if (a._alphaIndex < b._alphaIndex) {\r\n return -1;\r\n }\r\n\r\n // Then distance to camera\r\n return RenderingGroup.backToFrontSortCompare(a, b);\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static backToFrontSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return 1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered front to back (prevent overdraw).\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static frontToBackSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return -1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are grouped by material then geometry.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n public static PainterSortCompare(a: SubMesh, b: SubMesh): number {\r\n const meshA = a.getMesh();\r\n const meshB = b.getMesh();\r\n\r\n if (meshA.material && meshB.material) {\r\n return meshA.material.uniqueId - meshB.material.uniqueId;\r\n }\r\n\r\n return meshA.uniqueId - meshB.uniqueId;\r\n }\r\n\r\n /**\r\n * Resets the different lists of submeshes to prepare a new frame.\r\n */\r\n public prepare(): void {\r\n this._opaqueSubMeshes.reset();\r\n this._transparentSubMeshes.reset();\r\n this._alphaTestSubMeshes.reset();\r\n this._depthOnlySubMeshes.reset();\r\n this._particleSystems.reset();\r\n this.prepareSprites();\r\n this._edgesRenderers.reset();\r\n this._empty = true;\r\n }\r\n\r\n /**\r\n * Resets the different lists of sprites to prepare a new frame.\r\n */\r\n public prepareSprites(): void {\r\n this._spriteManagers.reset();\r\n }\r\n\r\n public dispose(): void {\r\n this._opaqueSubMeshes.dispose();\r\n this._transparentSubMeshes.dispose();\r\n this._alphaTestSubMeshes.dispose();\r\n this._depthOnlySubMeshes.dispose();\r\n this._particleSystems.dispose();\r\n this._spriteManagers.dispose();\r\n this._edgesRenderers.dispose();\r\n }\r\n\r\n /**\r\n * Inserts the submesh in its correct queue depending on its material.\r\n * @param subMesh The submesh to dispatch\r\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable<Material>): void {\r\n // Get mesh and materials if not provided\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (material === undefined) {\r\n material = subMesh.getMaterial();\r\n }\r\n\r\n if (material === null || material === undefined) {\r\n return;\r\n }\r\n\r\n if (material.needAlphaBlendingForMesh(mesh)) {\r\n // Transparent\r\n this._transparentSubMeshes.push(subMesh);\r\n } else if (material.needAlphaTesting()) {\r\n // Alpha test\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._alphaTestSubMeshes.push(subMesh);\r\n } else {\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._opaqueSubMeshes.push(subMesh); // Opaque\r\n }\r\n\r\n mesh._renderingGroup = this;\r\n\r\n if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) {\r\n this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer);\r\n }\r\n\r\n this._empty = false;\r\n }\r\n\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n this._spriteManagers.push(spriteManager);\r\n this._empty = false;\r\n }\r\n\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n this._particleSystems.push(particleSystem);\r\n this._empty = false;\r\n }\r\n\r\n private _renderParticles(activeMeshes: Nullable<AbstractMesh[]>): void {\r\n if (this._particleSystems.length === 0) {\r\n return;\r\n }\r\n\r\n // Particles\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) {\r\n const particleSystem = this._particleSystems.data[particleIndex];\r\n\r\n if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) {\r\n continue;\r\n }\r\n\r\n const emitter: any = particleSystem.emitter;\r\n if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) {\r\n this._scene._activeParticles.addCount(particleSystem.render(), false);\r\n }\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n private _renderSprites(): void {\r\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) {\r\n return;\r\n }\r\n\r\n // Sprites\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\r\n for (let id = 0; id < this._spriteManagers.length; id++) {\r\n const spriteManager = this._spriteManagers.data[id];\r\n\r\n if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) {\r\n spriteManager.render();\r\n }\r\n }\r\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"renderingGroup.js","sourceRoot":"","sources":["../../../../lts/core/generated/Rendering/renderingGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import { SmartArray, SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable, DeepImmutable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { IEdgesRenderer } from \"./edgesRenderer\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\n\r\n/**\r\n * This represents the object necessary to create a rendering group.\r\n * This is exclusively used and created by the rendering manager.\r\n * To modify the behavior, you use the available helpers in your scene or meshes.\r\n * @internal\r\n */\r\nexport class RenderingGroup {\r\n private static _ZeroVector: DeepImmutable<Vector3> = Vector3.Zero();\r\n private _scene: Scene;\r\n private _opaqueSubMeshes = new SmartArray<SubMesh>(256);\r\n private _transparentSubMeshes = new SmartArray<SubMesh>(256);\r\n private _alphaTestSubMeshes = new SmartArray<SubMesh>(256);\r\n private _depthOnlySubMeshes = new SmartArray<SubMesh>(256);\r\n private _particleSystems = new SmartArray<IParticleSystem>(256);\r\n private _spriteManagers = new SmartArray<ISpriteManager>(256);\r\n\r\n private _opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _transparentSortCompareFn: (a: SubMesh, b: SubMesh) => number;\r\n\r\n private _renderOpaque: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderAlphaTest: (subMeshes: SmartArray<SubMesh>) => void;\r\n private _renderTransparent: (subMeshes: SmartArray<SubMesh>) => void;\r\n\r\n /** @internal */\r\n public _empty = true;\r\n\r\n /** @internal */\r\n public _edgesRenderers = new SmartArrayNoDuplicate<IEdgesRenderer>(16);\r\n\r\n public onBeforeTransparentRendering: () => void;\r\n\r\n /**\r\n * Set the opaque sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set opaqueSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._opaqueSortCompareFn = value;\r\n } else {\r\n this._opaqueSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderOpaque = this._renderOpaqueSorted;\r\n }\r\n\r\n /**\r\n * Set the alpha test sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set alphaTestSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._alphaTestSortCompareFn = value;\r\n } else {\r\n this._alphaTestSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderAlphaTest = this._renderAlphaTestSorted;\r\n }\r\n\r\n /**\r\n * Set the transparent sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set transparentSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._transparentSortCompareFn = value;\r\n } else {\r\n this._transparentSortCompareFn = RenderingGroup.defaultTransparentSortCompare;\r\n }\r\n this._renderTransparent = this._renderTransparentSorted;\r\n }\r\n\r\n /**\r\n * Creates a new rendering group.\r\n * @param index The rendering group index\r\n * @param scene\r\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\r\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\r\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\r\n */\r\n constructor(\r\n public index: number,\r\n scene: Scene,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._scene = scene;\r\n\r\n this.opaqueSortCompareFn = opaqueSortCompareFn;\r\n this.alphaTestSortCompareFn = alphaTestSortCompareFn;\r\n this.transparentSortCompareFn = transparentSortCompareFn;\r\n }\r\n\r\n /**\r\n * Render all the sub meshes contained in the group.\r\n * @param customRenderFunction Used to override the default render behaviour of the group.\r\n * @param renderSprites\r\n * @param renderParticles\r\n * @param activeMeshes\r\n * @returns true if rendered some submeshes.\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ) => void\r\n >,\r\n renderSprites: boolean,\r\n renderParticles: boolean,\r\n activeMeshes: Nullable<AbstractMesh[]>\r\n ): void {\r\n if (customRenderFunction) {\r\n customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Depth only\r\n if (this._depthOnlySubMeshes.length !== 0) {\r\n engine.setColorWrite(false);\r\n this._renderAlphaTest(this._depthOnlySubMeshes);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n // Opaque\r\n if (this._opaqueSubMeshes.length !== 0) {\r\n this._renderOpaque(this._opaqueSubMeshes);\r\n }\r\n\r\n // Alpha test\r\n if (this._alphaTestSubMeshes.length !== 0) {\r\n this._renderAlphaTest(this._alphaTestSubMeshes);\r\n }\r\n\r\n const stencilState = engine.getStencilBuffer();\r\n engine.setStencilBuffer(false);\r\n\r\n // Sprites\r\n if (renderSprites) {\r\n this._renderSprites();\r\n }\r\n\r\n // Particles\r\n if (renderParticles) {\r\n this._renderParticles(activeMeshes);\r\n }\r\n\r\n if (this.onBeforeTransparentRendering) {\r\n this.onBeforeTransparentRendering();\r\n }\r\n\r\n // Transparent\r\n if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\r\n engine.setStencilBuffer(stencilState);\r\n if (this._scene.useOrderIndependentTransparency) {\r\n const excludedMeshes = this._scene.depthPeelingRenderer!.render(this._transparentSubMeshes);\r\n if (excludedMeshes.length) {\r\n // Render leftover meshes that could not be processed by depth peeling\r\n this._renderTransparent(excludedMeshes);\r\n }\r\n } else {\r\n this._renderTransparent(this._transparentSubMeshes);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Set back stencil to false in case it changes before the edge renderer.\r\n engine.setStencilBuffer(false);\r\n\r\n // Edges\r\n if (this._edgesRenderers.length) {\r\n for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {\r\n this._edgesRenderers.data[edgesRendererIndex].render();\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Stencil state.\r\n engine.setStencilBuffer(stencilState);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderOpaqueSorted(subMeshes: SmartArray<SubMesh>): void {\r\n return RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderAlphaTestSorted(subMeshes: SmartArray<SubMesh>): void {\r\n return RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderTransparentSorted(subMeshes: SmartArray<SubMesh>): void {\r\n return RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true);\r\n }\r\n\r\n /**\r\n * Renders the submeshes in a specified order.\r\n * @param subMeshes The submeshes to sort before render\r\n * @param sortCompareFn The comparison function use to sort\r\n * @param camera The camera position use to preprocess the submeshes to help sorting\r\n * @param transparent Specifies to activate blending if true\r\n */\r\n private static _RenderSorted(\r\n subMeshes: SmartArray<SubMesh>,\r\n sortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>,\r\n camera: Nullable<Camera>,\r\n transparent: boolean\r\n ): void {\r\n let subIndex = 0;\r\n let subMesh: SubMesh;\r\n const cameraPosition = camera ? camera.globalPosition : RenderingGroup._ZeroVector;\r\n\r\n if (transparent) {\r\n for (; subIndex < subMeshes.length; subIndex++) {\r\n subMesh = subMeshes.data[subIndex];\r\n subMesh._alphaIndex = subMesh.getMesh().alphaIndex;\r\n subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n }\r\n\r\n const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length);\r\n\r\n if (sortCompareFn) {\r\n sortedArray.sort(sortCompareFn);\r\n }\r\n\r\n const scene = sortedArray[0].getMesh().getScene();\r\n for (subIndex = 0; subIndex < sortedArray.length; subIndex++) {\r\n subMesh = sortedArray[subIndex];\r\n\r\n if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) {\r\n continue;\r\n }\r\n\r\n if (transparent) {\r\n const material = subMesh.getMaterial();\r\n\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n subMesh.render(false);\r\n engine.setColorWrite(true);\r\n }\r\n }\r\n\r\n subMesh.render(transparent);\r\n }\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front if in the same alpha index.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static defaultTransparentSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Alpha index first\r\n if (a._alphaIndex > b._alphaIndex) {\r\n return 1;\r\n }\r\n if (a._alphaIndex < b._alphaIndex) {\r\n return -1;\r\n }\r\n\r\n // Then distance to camera\r\n return RenderingGroup.backToFrontSortCompare(a, b);\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static backToFrontSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return 1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered front to back (prevent overdraw).\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static frontToBackSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return -1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are grouped by material then geometry.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n public static PainterSortCompare(a: SubMesh, b: SubMesh): number {\r\n const meshA = a.getMesh();\r\n const meshB = b.getMesh();\r\n\r\n if (meshA.material && meshB.material) {\r\n return meshA.material.uniqueId - meshB.material.uniqueId;\r\n }\r\n\r\n return meshA.uniqueId - meshB.uniqueId;\r\n }\r\n\r\n /**\r\n * Resets the different lists of submeshes to prepare a new frame.\r\n */\r\n public prepare(): void {\r\n this._opaqueSubMeshes.reset();\r\n this._transparentSubMeshes.reset();\r\n this._alphaTestSubMeshes.reset();\r\n this._depthOnlySubMeshes.reset();\r\n this._particleSystems.reset();\r\n this.prepareSprites();\r\n this._edgesRenderers.reset();\r\n this._empty = true;\r\n }\r\n\r\n /**\r\n * Resets the different lists of sprites to prepare a new frame.\r\n */\r\n public prepareSprites(): void {\r\n this._spriteManagers.reset();\r\n }\r\n\r\n public dispose(): void {\r\n this._opaqueSubMeshes.dispose();\r\n this._transparentSubMeshes.dispose();\r\n this._alphaTestSubMeshes.dispose();\r\n this._depthOnlySubMeshes.dispose();\r\n this._particleSystems.dispose();\r\n this._spriteManagers.dispose();\r\n this._edgesRenderers.dispose();\r\n }\r\n\r\n /**\r\n * Inserts the submesh in its correct queue depending on its material.\r\n * @param subMesh The submesh to dispatch\r\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable<Material>): void {\r\n // Get mesh and materials if not provided\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (material === undefined) {\r\n material = subMesh.getMaterial();\r\n }\r\n\r\n if (material === null || material === undefined) {\r\n return;\r\n }\r\n\r\n if (material.needAlphaBlendingForMesh(mesh)) {\r\n // Transparent\r\n this._transparentSubMeshes.push(subMesh);\r\n } else if (material.needAlphaTesting()) {\r\n // Alpha test\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._alphaTestSubMeshes.push(subMesh);\r\n } else {\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._opaqueSubMeshes.push(subMesh); // Opaque\r\n }\r\n\r\n mesh._renderingGroup = this;\r\n\r\n if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) {\r\n this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer);\r\n }\r\n\r\n this._empty = false;\r\n }\r\n\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n this._spriteManagers.push(spriteManager);\r\n this._empty = false;\r\n }\r\n\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n this._particleSystems.push(particleSystem);\r\n this._empty = false;\r\n }\r\n\r\n private _renderParticles(activeMeshes: Nullable<AbstractMesh[]>): void {\r\n if (this._particleSystems.length === 0) {\r\n return;\r\n }\r\n\r\n // Particles\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) {\r\n const particleSystem = this._particleSystems.data[particleIndex];\r\n\r\n if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) {\r\n continue;\r\n }\r\n\r\n const emitter: any = particleSystem.emitter;\r\n if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) {\r\n this._scene._activeParticles.addCount(particleSystem.render(), false);\r\n }\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n private _renderSprites(): void {\r\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) {\r\n return;\r\n }\r\n\r\n // Sprites\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\r\n for (let id = 0; id < this._spriteManagers.length; id++) {\r\n const spriteManager = this._spriteManagers.data[id];\r\n\r\n if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) {\r\n spriteManager.render();\r\n }\r\n }\r\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n}\r\n"]}
@@ -10,27 +10,6 @@ export class RenderingGroupInfo {
10
10
  * This should not be used directly aside of the few static configurations
11
11
  */
12
12
  export class RenderingManager {
13
- /**
14
- * Instantiates a new rendering group for a particular scene
15
- * @param scene Defines the scene the groups belongs to
16
- */
17
- constructor(scene) {
18
- /**
19
- * @internal
20
- */
21
- this._useSceneAutoClearSetup = false;
22
- this._renderingGroups = new Array();
23
- this._autoClearDepthStencil = {};
24
- this._customOpaqueSortCompareFn = {};
25
- this._customAlphaTestSortCompareFn = {};
26
- this._customTransparentSortCompareFn = {};
27
- this._renderingGroupInfo = new RenderingGroupInfo();
28
- this._maintainStateBetweenFrames = false;
29
- this._scene = scene;
30
- for (let i = RenderingManager.MIN_RENDERINGGROUPS; i < RenderingManager.MAX_RENDERINGGROUPS; i++) {
31
- this._autoClearDepthStencil[i] = { autoClear: true, depth: true, stencil: true };
32
- }
33
- }
34
13
  /**
35
14
  * Gets or sets a boolean indicating that the manager will not reset between frames.
36
15
  * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again.
@@ -62,6 +41,27 @@ export class RenderingManager {
62
41
  }
63
42
  }
64
43
  }
44
+ /**
45
+ * Instantiates a new rendering group for a particular scene
46
+ * @param scene Defines the scene the groups belongs to
47
+ */
48
+ constructor(scene) {
49
+ /**
50
+ * @internal
51
+ */
52
+ this._useSceneAutoClearSetup = false;
53
+ this._renderingGroups = new Array();
54
+ this._autoClearDepthStencil = {};
55
+ this._customOpaqueSortCompareFn = {};
56
+ this._customAlphaTestSortCompareFn = {};
57
+ this._customTransparentSortCompareFn = {};
58
+ this._renderingGroupInfo = new RenderingGroupInfo();
59
+ this._maintainStateBetweenFrames = false;
60
+ this._scene = scene;
61
+ for (let i = RenderingManager.MIN_RENDERINGGROUPS; i < RenderingManager.MAX_RENDERINGGROUPS; i++) {
62
+ this._autoClearDepthStencil[i] = { autoClear: true, depth: true, stencil: true };
63
+ }
64
+ }
65
65
  /**
66
66
  * Gets the rendering group with the specified id.
67
67
  */