@onerjs/core 9.0.2 → 9.0.4

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 (476) hide show
  1. package/Buffers/buffer.pure.js +4 -0
  2. package/Buffers/buffer.pure.js.map +1 -1
  3. package/Cameras/camera.pure.d.ts +14 -0
  4. package/Cameras/camera.pure.js +15 -0
  5. package/Cameras/camera.pure.js.map +1 -1
  6. package/Compute/computeShader.pure.d.ts +2 -1
  7. package/Compute/computeShader.pure.js +29 -10
  8. package/Compute/computeShader.pure.js.map +1 -1
  9. package/Culling/ray.core.js +22 -9
  10. package/Culling/ray.core.js.map +1 -1
  11. package/Engines/IDrawContext.d.ts +2 -0
  12. package/Engines/IDrawContext.js.map +1 -1
  13. package/Engines/Native/nativeInterfaces.d.ts +55 -4
  14. package/Engines/Native/nativeInterfaces.js.map +1 -1
  15. package/Engines/Native/nativeRenderTargetWrapper.d.ts +1 -0
  16. package/Engines/Native/nativeRenderTargetWrapper.js +5 -1
  17. package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
  18. package/Engines/Processors/shaderCodeInliner.d.ts +2 -0
  19. package/Engines/Processors/shaderCodeInliner.js +251 -6
  20. package/Engines/Processors/shaderCodeInliner.js.map +1 -1
  21. package/Engines/Processors/shaderProcessor.js +10 -1
  22. package/Engines/Processors/shaderProcessor.js.map +1 -1
  23. package/Engines/WebGPU/Extensions/engine.debugging.pure.js +12 -0
  24. package/Engines/WebGPU/Extensions/engine.debugging.pure.js.map +1 -1
  25. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +0 -1
  26. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
  27. package/Engines/WebGPU/Extensions/engine.query.pure.js +5 -0
  28. package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
  29. package/Engines/WebGPU/webgpuBufferManager.js +7 -0
  30. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  31. package/Engines/WebGPU/webgpuCacheTextureView.d.ts +1 -1
  32. package/Engines/WebGPU/webgpuCacheTextureView.js +20 -8
  33. package/Engines/WebGPU/webgpuCacheTextureView.js.map +1 -1
  34. package/Engines/WebGPU/webgpuDrawContext.d.ts +2 -0
  35. package/Engines/WebGPU/webgpuDrawContext.js +6 -0
  36. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  37. package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -3
  38. package/Engines/WebGPU/webgpuQuerySet.js +23 -9
  39. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  40. package/Engines/WebGPU/webgpuRenderPassCommandStream.d.ts +156 -0
  41. package/Engines/WebGPU/webgpuRenderPassCommandStream.js +323 -0
  42. package/Engines/WebGPU/webgpuRenderPassCommandStream.js.map +1 -0
  43. package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -1
  44. package/Engines/WebGPU/webgpuTextureManager.js +4 -3
  45. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  46. package/Engines/WebGPU/webgpuTimestampQuery.d.ts +3 -1
  47. package/Engines/WebGPU/webgpuTimestampQuery.js +9 -6
  48. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  49. package/Engines/abstractEngine.pure.d.ts +2 -0
  50. package/Engines/abstractEngine.pure.js +14 -5
  51. package/Engines/abstractEngine.pure.js.map +1 -1
  52. package/Engines/constants.d.ts +6 -0
  53. package/Engines/constants.js +6 -0
  54. package/Engines/constants.js.map +1 -1
  55. package/Engines/engine.d.ts +198 -24
  56. package/Engines/pure.d.ts +1 -0
  57. package/Engines/pure.js +1 -0
  58. package/Engines/pure.js.map +1 -1
  59. package/Engines/renderCommandBatcher.pure.d.ts +16 -0
  60. package/Engines/renderCommandBatcher.pure.js +24 -0
  61. package/Engines/renderCommandBatcher.pure.js.map +1 -0
  62. package/Engines/thinEngine.functions.js +3 -2
  63. package/Engines/thinEngine.functions.js.map +1 -1
  64. package/Engines/thinEngine.pure.js +18 -2
  65. package/Engines/thinEngine.pure.js.map +1 -1
  66. package/Engines/thinNativeEngine.pure.d.ts +10 -7
  67. package/Engines/thinNativeEngine.pure.js +117 -46
  68. package/Engines/thinNativeEngine.pure.js.map +1 -1
  69. package/Engines/thinWebGPUEngine.d.ts +8 -0
  70. package/Engines/thinWebGPUEngine.js +11 -0
  71. package/Engines/thinWebGPUEngine.js.map +1 -1
  72. package/Engines/webgpuEngine.pure.d.ts +60 -1
  73. package/Engines/webgpuEngine.pure.js +238 -42
  74. package/Engines/webgpuEngine.pure.js.map +1 -1
  75. package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.d.ts +3 -3
  76. package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js +2 -1
  77. package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js.map +1 -1
  78. package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.d.ts +3 -3
  79. package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js +2 -1
  80. package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js.map +1 -1
  81. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.d.ts +5 -0
  82. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js +8 -0
  83. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js.map +1 -0
  84. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.d.ts +77 -0
  85. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js +141 -0
  86. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js.map +1 -0
  87. package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.d.ts +5 -3
  88. package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js +38 -7
  89. package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js.map +1 -1
  90. package/FlowGraph/Blocks/Event/index.d.ts +1 -0
  91. package/FlowGraph/Blocks/Event/index.js +1 -0
  92. package/FlowGraph/Blocks/Event/index.js.map +1 -1
  93. package/FlowGraph/Blocks/Event/pure.d.ts +1 -0
  94. package/FlowGraph/Blocks/Event/pure.js +1 -0
  95. package/FlowGraph/Blocks/Event/pure.js.map +1 -1
  96. package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.d.ts +3 -3
  97. package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js +2 -1
  98. package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js.map +1 -1
  99. package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.d.ts +3 -3
  100. package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js +2 -1
  101. package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js.map +1 -1
  102. package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.d.ts +3 -3
  103. package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js +2 -1
  104. package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js.map +1 -1
  105. package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.d.ts +3 -3
  106. package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js +2 -1
  107. package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js.map +1 -1
  108. package/FlowGraph/Blocks/allBlocks.pure.js +2 -0
  109. package/FlowGraph/Blocks/allBlocks.pure.js.map +1 -1
  110. package/FlowGraph/Blocks/flowGraphBlockFactory.js +2 -0
  111. package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
  112. package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +1 -0
  113. package/FlowGraph/Blocks/flowGraphBlockNames.js +1 -0
  114. package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
  115. package/FlowGraph/flowGraph.d.ts +12 -1
  116. package/FlowGraph/flowGraph.js +38 -0
  117. package/FlowGraph/flowGraph.js.map +1 -1
  118. package/FlowGraph/flowGraphCoordinator.d.ts +44 -0
  119. package/FlowGraph/flowGraphCoordinator.js +141 -0
  120. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  121. package/FlowGraph/flowGraphDataConnection.pure.js +41 -14
  122. package/FlowGraph/flowGraphDataConnection.pure.js.map +1 -1
  123. package/FlowGraph/flowGraphParser.js +105 -5
  124. package/FlowGraph/flowGraphParser.js.map +1 -1
  125. package/FlowGraph/flowGraphSoundAssets.d.ts +40 -0
  126. package/FlowGraph/flowGraphSoundAssets.js +33 -0
  127. package/FlowGraph/flowGraphSoundAssets.js.map +1 -0
  128. package/FlowGraph/index.d.ts +1 -0
  129. package/FlowGraph/index.js +1 -0
  130. package/FlowGraph/index.js.map +1 -1
  131. package/FlowGraph/pure.d.ts +1 -0
  132. package/FlowGraph/pure.js +1 -0
  133. package/FlowGraph/pure.js.map +1 -1
  134. package/FlowGraph/serialization.d.ts +8 -0
  135. package/FlowGraph/serialization.js +31 -12
  136. package/FlowGraph/serialization.js.map +1 -1
  137. package/FlowGraph/typeDefinitions.d.ts +25 -0
  138. package/FlowGraph/typeDefinitions.js.map +1 -1
  139. package/FrameGraph/Tasks/PostProcesses/taaTask.js +2 -0
  140. package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -1
  141. package/Instrumentation/engineInstrumentation.d.ts +1 -0
  142. package/Instrumentation/engineInstrumentation.js +25 -6
  143. package/Instrumentation/engineInstrumentation.js.map +1 -1
  144. package/Lights/Clustered/clusteredLightContainer.pure.js +2 -0
  145. package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
  146. package/Lights/Shadows/cascadedShadowGenerator.pure.d.ts +36 -1
  147. package/Lights/Shadows/cascadedShadowGenerator.pure.js +202 -27
  148. package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
  149. package/Lights/directionalLight.pure.d.ts +24 -10
  150. package/Lights/directionalLight.pure.js +29 -11
  151. package/Lights/directionalLight.pure.js.map +1 -1
  152. package/Loading/sceneLoader.d.ts +1 -1
  153. package/Loading/sceneLoader.js +1 -1
  154. package/Loading/sceneLoader.js.map +1 -1
  155. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +4 -4
  156. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
  157. package/Materials/Node/Blocks/Dual/lightBlock.pure.js +1 -1
  158. package/Materials/Node/Blocks/Dual/lightBlock.pure.js.map +1 -1
  159. package/Materials/Node/Blocks/Input/inputBlock.pure.js +4 -0
  160. package/Materials/Node/Blocks/Input/inputBlock.pure.js.map +1 -1
  161. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.d.ts +9 -0
  162. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +23 -3
  163. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
  164. package/Materials/PBR/openpbrMaterial.pure.js +1 -1
  165. package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
  166. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +9 -0
  167. package/Materials/PBR/pbrBaseMaterial.pure.js +60 -1
  168. package/Materials/PBR/pbrBaseMaterial.pure.js.map +1 -1
  169. package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +11 -0
  170. package/Materials/PBR/pbrBaseSimpleMaterial.js +21 -2
  171. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  172. package/Materials/PBR/pbrMaterial.pure.d.ts +12 -0
  173. package/Materials/PBR/pbrMaterial.pure.js +23 -3
  174. package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
  175. package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -0
  176. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +10 -0
  177. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
  178. package/Materials/Textures/HTML/htmlInCanvasPolyfill.d.ts +5 -0
  179. package/Materials/Textures/HTML/htmlInCanvasPolyfill.js +7 -0
  180. package/Materials/Textures/HTML/htmlInCanvasPolyfill.js.map +1 -1
  181. package/Materials/Textures/HTML/htmlInteractionManager.d.ts +9 -3
  182. package/Materials/Textures/HTML/htmlInteractionManager.js +64 -5
  183. package/Materials/Textures/HTML/htmlInteractionManager.js.map +1 -1
  184. package/Materials/Textures/HTML/htmlTexture.d.ts +11 -11
  185. package/Materials/Textures/HTML/htmlTexture.js +106 -65
  186. package/Materials/Textures/HTML/htmlTexture.js.map +1 -1
  187. package/Materials/Textures/Loaders/internalTextureLoader.d.ts +2 -1
  188. package/Materials/Textures/Loaders/internalTextureLoader.js.map +1 -1
  189. package/Materials/Textures/Loaders/ktxTextureLoader.d.ts +2 -1
  190. package/Materials/Textures/Loaders/ktxTextureLoader.js +4 -50
  191. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  192. package/Materials/Textures/Procedurals/proceduralTexture.pure.js +10 -0
  193. package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
  194. package/Materials/Textures/dynamicTexture.pure.js +6 -0
  195. package/Materials/Textures/dynamicTexture.pure.js.map +1 -1
  196. package/Materials/Textures/ktx2encoderTypes.d.ts +51 -0
  197. package/Materials/Textures/ktx2encoderTypes.js +2 -0
  198. package/Materials/Textures/ktx2encoderTypes.js.map +1 -0
  199. package/Materials/Textures/renderTargetTexture.pure.js +10 -2
  200. package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
  201. package/Materials/Textures/textureMerger.d.ts +11 -0
  202. package/Materials/Textures/textureMerger.js +34 -19
  203. package/Materials/Textures/textureMerger.js.map +1 -1
  204. package/Materials/Textures/textureProcessor.d.ts +145 -0
  205. package/Materials/Textures/textureProcessor.js +445 -45
  206. package/Materials/Textures/textureProcessor.js.map +1 -1
  207. package/Materials/Textures/textureSampling.functions.d.ts +41 -0
  208. package/Materials/Textures/textureSampling.functions.js +82 -0
  209. package/Materials/Textures/textureSampling.functions.js.map +1 -0
  210. package/Materials/drawWrapper.d.ts +8 -0
  211. package/Materials/drawWrapper.js +19 -0
  212. package/Materials/drawWrapper.js.map +1 -1
  213. package/Materials/effect.pure.d.ts +6 -0
  214. package/Materials/effect.pure.js +28 -6
  215. package/Materials/effect.pure.js.map +1 -1
  216. package/Materials/effect.webgl.functions.pure.js +1 -1
  217. package/Materials/effect.webgl.functions.pure.js.map +1 -1
  218. package/Materials/material.pure.d.ts +5 -0
  219. package/Materials/material.pure.js +9 -2
  220. package/Materials/material.pure.js.map +1 -1
  221. package/Materials/materialFlags.d.ts +6 -0
  222. package/Materials/materialFlags.js +14 -0
  223. package/Materials/materialFlags.js.map +1 -1
  224. package/Materials/materialHelper.functions.d.ts +2 -1
  225. package/Materials/materialHelper.functions.js +36 -2
  226. package/Materials/materialHelper.functions.js.map +1 -1
  227. package/Materials/materialHelper.geometryrendering.js +19 -16
  228. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  229. package/Materials/materialPluginManager.pure.js +12 -8
  230. package/Materials/materialPluginManager.pure.js.map +1 -1
  231. package/Materials/prePassConfiguration.js +19 -16
  232. package/Materials/prePassConfiguration.js.map +1 -1
  233. package/Materials/shaderMaterial.pure.js +19 -6
  234. package/Materials/shaderMaterial.pure.js.map +1 -1
  235. package/Materials/shadowDepthWrapper.d.ts +6 -0
  236. package/Materials/shadowDepthWrapper.js +17 -0
  237. package/Materials/shadowDepthWrapper.js.map +1 -1
  238. package/Meshes/Compression/dracoCodec.d.ts +14 -0
  239. package/Meshes/Compression/dracoCodec.js +22 -0
  240. package/Meshes/Compression/dracoCodec.js.map +1 -1
  241. package/Meshes/Compression/dracoDecoder.d.ts +1 -0
  242. package/Meshes/Compression/dracoDecoder.js +27 -0
  243. package/Meshes/Compression/dracoDecoder.js.map +1 -1
  244. package/Meshes/Compression/dracoEncoder.d.ts +1 -0
  245. package/Meshes/Compression/dracoEncoder.js +8 -0
  246. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  247. package/Meshes/Compression/meshoptCompression.d.ts +1 -0
  248. package/Meshes/Compression/meshoptCompression.js +9 -0
  249. package/Meshes/Compression/meshoptCompression.js.map +1 -1
  250. package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.d.ts +415 -0
  251. package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js +912 -0
  252. package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js.map +1 -0
  253. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +3 -0
  254. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +40 -9
  255. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  256. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +112 -8
  257. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +696 -74
  258. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  259. package/Meshes/abstractMesh.pure.js +12 -4
  260. package/Meshes/abstractMesh.pure.js.map +1 -1
  261. package/Meshes/geometry.d.ts +5 -0
  262. package/Meshes/geometry.js +25 -0
  263. package/Meshes/geometry.js.map +1 -1
  264. package/Meshes/index.d.ts +1 -0
  265. package/Meshes/index.js +1 -0
  266. package/Meshes/index.js.map +1 -1
  267. package/Meshes/mesh.pure.d.ts +7 -0
  268. package/Meshes/mesh.pure.js +18 -13
  269. package/Meshes/mesh.pure.js.map +1 -1
  270. package/Meshes/pure.d.ts +1 -0
  271. package/Meshes/pure.js +1 -0
  272. package/Meshes/pure.js.map +1 -1
  273. package/Meshes/subMesh.pure.d.ts +3 -0
  274. package/Meshes/subMesh.pure.js +26 -0
  275. package/Meshes/subMesh.pure.js.map +1 -1
  276. package/Meshes/thinInstanceMesh.pure.js +5 -3
  277. package/Meshes/thinInstanceMesh.pure.js.map +1 -1
  278. package/Misc/index.d.ts +1 -0
  279. package/Misc/index.js +1 -0
  280. package/Misc/index.js.map +1 -1
  281. package/Misc/khronosTextureContainer2.d.ts +3 -2
  282. package/Misc/khronosTextureContainer2.js +24 -6
  283. package/Misc/khronosTextureContainer2.js.map +1 -1
  284. package/Misc/khronosTextureContainer2Encoder.d.ts +166 -0
  285. package/Misc/khronosTextureContainer2Encoder.js +556 -0
  286. package/Misc/khronosTextureContainer2Encoder.js.map +1 -0
  287. package/Misc/khronosTextureContainer2EncoderWorker.d.ts +61 -0
  288. package/Misc/khronosTextureContainer2EncoderWorker.js +55 -0
  289. package/Misc/khronosTextureContainer2EncoderWorker.js.map +1 -0
  290. package/Misc/pure.d.ts +1 -0
  291. package/Misc/pure.js +1 -0
  292. package/Misc/pure.js.map +1 -1
  293. package/Misc/textureFormat.functions.d.ts +6 -0
  294. package/Misc/textureFormat.functions.js +54 -0
  295. package/Misc/textureFormat.functions.js.map +1 -0
  296. package/Misc/textureTools.d.ts +6 -2
  297. package/Misc/textureTools.js +100 -42
  298. package/Misc/textureTools.js.map +1 -1
  299. package/Misc/tools.pure.js +1 -1
  300. package/Misc/tools.pure.js.map +1 -1
  301. package/Particles/Node/Blocks/systemBlock.pure.d.ts +1 -1
  302. package/Particles/Node/Blocks/systemBlock.pure.js +6 -3
  303. package/Particles/Node/Blocks/systemBlock.pure.js.map +1 -1
  304. package/Particles/computeShaderParticleSystem.pure.js +5 -0
  305. package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
  306. package/Particles/gpuParticleSystem.pure.d.ts +2 -0
  307. package/Particles/gpuParticleSystem.pure.js +25 -1
  308. package/Particles/gpuParticleSystem.pure.js.map +1 -1
  309. package/Particles/solidParticle.d.ts +5 -0
  310. package/Particles/solidParticle.js +5 -0
  311. package/Particles/solidParticle.js.map +1 -1
  312. package/Particles/solidParticleSystem.d.ts +10 -0
  313. package/Particles/solidParticleSystem.js +72 -13
  314. package/Particles/solidParticleSystem.js.map +1 -1
  315. package/Particles/thinParticleSystem.pure.js +4 -0
  316. package/Particles/thinParticleSystem.pure.js.map +1 -1
  317. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.d.ts +27 -6
  318. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js +60 -5
  319. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js.map +1 -1
  320. package/PostProcesses/thinTAAPostProcess.d.ts +1 -0
  321. package/PostProcesses/thinTAAPostProcess.js +17 -1
  322. package/PostProcesses/thinTAAPostProcess.js.map +1 -1
  323. package/PostProcesses/volumetricLightScatteringPostProcess.pure.d.ts +2 -1
  324. package/PostProcesses/volumetricLightScatteringPostProcess.pure.js +6 -5
  325. package/PostProcesses/volumetricLightScatteringPostProcess.pure.js.map +1 -1
  326. package/Rendering/boundingBoxRenderer.pure.js +2 -3
  327. package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
  328. package/Rendering/geometryBufferRenderer.pure.js +8 -2
  329. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  330. package/Rendering/objectRenderer.d.ts +1 -0
  331. package/Rendering/objectRenderer.js +14 -0
  332. package/Rendering/objectRenderer.js.map +1 -1
  333. package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
  334. package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
  335. package/Shaders/ShadersInclude/bumpVertex.js +1 -1
  336. package/Shaders/ShadersInclude/bumpVertex.js.map +1 -1
  337. package/Shaders/ShadersInclude/bumpVertexDeclaration.js +1 -1
  338. package/Shaders/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
  339. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +5 -1
  340. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  341. package/Shaders/ShadersInclude/helperFunctions.js +2 -2
  342. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  343. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
  344. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  345. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +6 -0
  346. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
  347. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
  348. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  349. package/Shaders/ShadersInclude/pbrBlockNormalFinal.js +9 -0
  350. package/Shaders/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
  351. package/Shaders/ShadersInclude/pbrBlockReflectance.js +1 -1
  352. package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  353. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
  354. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
  355. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +7 -1
  356. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  357. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
  358. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  359. package/Shaders/ShadersInclude/pbrIBLFunctions.js +12 -0
  360. package/Shaders/ShadersInclude/pbrIBLFunctions.js.map +1 -1
  361. package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
  362. package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  363. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +3 -0
  364. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  365. package/Shaders/geometry.vertex.js +6 -6
  366. package/Shaders/geometry.vertex.js.map +1 -1
  367. package/Shaders/gpuUpdateParticles.vertex.js +1 -1
  368. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  369. package/Shaders/lod.fragment.js +15 -2
  370. package/Shaders/lod.fragment.js.map +1 -1
  371. package/Shaders/lod3D.fragment.js +15 -2
  372. package/Shaders/lod3D.fragment.js.map +1 -1
  373. package/Shaders/lodCube.fragment.js +15 -2
  374. package/Shaders/lodCube.fragment.js.map +1 -1
  375. package/Shaders/openpbr.vertex.js +2 -0
  376. package/Shaders/openpbr.vertex.js.map +1 -1
  377. package/Shaders/pbr.fragment.js +12 -1
  378. package/Shaders/pbr.fragment.js.map +1 -1
  379. package/Shaders/pbr.vertex.js +2 -0
  380. package/Shaders/pbr.vertex.js.map +1 -1
  381. package/Shaders/textureMerger.fragment.js +28 -0
  382. package/Shaders/textureMerger.fragment.js.map +1 -1
  383. package/Shaders/textureProcessor.fragment.js +26 -4
  384. package/Shaders/textureProcessor.fragment.js.map +1 -1
  385. package/Shaders/volumetricLightScattering.fragment.js +1 -1
  386. package/Shaders/volumetricLightScattering.fragment.js.map +1 -1
  387. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
  388. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
  389. package/ShadersWGSL/ShadersInclude/bumpVertex.js +1 -1
  390. package/ShadersWGSL/ShadersInclude/bumpVertex.js.map +1 -1
  391. package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js +1 -1
  392. package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
  393. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +1 -1
  394. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  395. package/ShadersWGSL/ShadersInclude/helperFunctions.js +2 -2
  396. package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
  397. package/ShadersWGSL/ShadersInclude/lightFragment.js +44 -2
  398. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  399. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +17 -3
  400. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
  401. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +12 -1
  402. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  403. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
  404. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  405. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
  406. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  407. package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js +9 -0
  408. package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
  409. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +1 -1
  410. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  411. package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
  412. package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
  413. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
  414. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  415. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
  416. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  417. package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js +8 -0
  418. package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js.map +1 -1
  419. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
  420. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  421. package/ShadersWGSL/ShadersInclude/prePassVertex.js +2 -2
  422. package/ShadersWGSL/ShadersInclude/prePassVertex.js.map +1 -1
  423. package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js +1 -1
  424. package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
  425. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +3 -1
  426. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
  427. package/ShadersWGSL/ShadersInclude/shadowsVertex.js +16 -0
  428. package/ShadersWGSL/ShadersInclude/shadowsVertex.js.map +1 -1
  429. package/ShadersWGSL/default.fragment.js +4 -4
  430. package/ShadersWGSL/default.fragment.js.map +1 -1
  431. package/ShadersWGSL/default.vertex.js +1 -1
  432. package/ShadersWGSL/default.vertex.js.map +1 -1
  433. package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
  434. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  435. package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
  436. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  437. package/ShadersWGSL/gsSortCount.compute.d.ts +5 -0
  438. package/ShadersWGSL/gsSortCount.compute.js +19 -0
  439. package/ShadersWGSL/gsSortCount.compute.js.map +1 -0
  440. package/ShadersWGSL/gsSortKeys.compute.d.ts +5 -0
  441. package/ShadersWGSL/gsSortKeys.compute.js +49 -0
  442. package/ShadersWGSL/gsSortKeys.compute.js.map +1 -0
  443. package/ShadersWGSL/gsSortOutput.compute.d.ts +5 -0
  444. package/ShadersWGSL/gsSortOutput.compute.js +28 -0
  445. package/ShadersWGSL/gsSortOutput.compute.js.map +1 -0
  446. package/ShadersWGSL/gsSortScanLocal.compute.d.ts +5 -0
  447. package/ShadersWGSL/gsSortScanLocal.compute.js +23 -0
  448. package/ShadersWGSL/gsSortScanLocal.compute.js.map +1 -0
  449. package/ShadersWGSL/gsSortScanSums.compute.d.ts +5 -0
  450. package/ShadersWGSL/gsSortScanSums.compute.js +19 -0
  451. package/ShadersWGSL/gsSortScanSums.compute.js.map +1 -0
  452. package/ShadersWGSL/gsSortScatter.compute.d.ts +5 -0
  453. package/ShadersWGSL/gsSortScatter.compute.js +33 -0
  454. package/ShadersWGSL/gsSortScatter.compute.js.map +1 -0
  455. package/ShadersWGSL/lod.fragment.js +14 -2
  456. package/ShadersWGSL/lod.fragment.js.map +1 -1
  457. package/ShadersWGSL/lod3D.fragment.js +14 -2
  458. package/ShadersWGSL/lod3D.fragment.js.map +1 -1
  459. package/ShadersWGSL/lodCube.fragment.js +14 -2
  460. package/ShadersWGSL/lodCube.fragment.js.map +1 -1
  461. package/ShadersWGSL/openpbr.vertex.js +3 -1
  462. package/ShadersWGSL/openpbr.vertex.js.map +1 -1
  463. package/ShadersWGSL/pbr.fragment.js +11 -0
  464. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  465. package/ShadersWGSL/pbr.vertex.js +3 -1
  466. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  467. package/ShadersWGSL/textureMerger.fragment.js +40 -4
  468. package/ShadersWGSL/textureMerger.fragment.js.map +1 -1
  469. package/ShadersWGSL/textureProcessor.fragment.js +26 -4
  470. package/ShadersWGSL/textureProcessor.fragment.js.map +1 -1
  471. package/Sprites/spriteRenderer.js +15 -5
  472. package/Sprites/spriteRenderer.js.map +1 -1
  473. package/package.json +1 -1
  474. package/scene.pure.d.ts +23 -1
  475. package/scene.pure.js +83 -1
  476. package/scene.pure.js.map +1 -1
@@ -283,6 +283,7 @@ export declare class ObjectRenderer {
283
283
  prepareRenderList(): void;
284
284
  private _defaultRenderListPrepared;
285
285
  private _currentSceneCamera;
286
+ private _currentViewPassId;
286
287
  /**
287
288
  * This method makes sure everything is setup before "render" can be called
288
289
  * @param viewportWidth Width of the viewport to render to
@@ -294,6 +294,7 @@ export class ObjectRenderer {
294
294
  /** @internal */
295
295
  this._freezeActiveMeshesCancel = null;
296
296
  this._currentSceneCamera = null;
297
+ this._currentViewPassId = 0;
297
298
  this.name = name;
298
299
  this._scene = scene;
299
300
  this._engine = this._scene.getEngine();
@@ -345,6 +346,11 @@ export class ObjectRenderer {
345
346
  ubo.addUniform("projection", 16);
346
347
  ubo.addUniform("vEyePosition", 4);
347
348
  ubo.addUniform("inverseProjection", 16);
349
+ // the temporal data of the view, for WGSL shaders (see Scene.finalizeSceneUbo)
350
+ if (engine.isWebGPU) {
351
+ ubo.addUniform("previousViewProjection", 16);
352
+ ubo.addUniform("taaJitter", 2);
353
+ }
348
354
  return ubo;
349
355
  }
350
356
  _getSceneUBO() {
@@ -428,9 +434,13 @@ export class ObjectRenderer {
428
434
  */
429
435
  isReadyForRendering(viewportWidth, viewportHeight) {
430
436
  this.prepareRenderList();
437
+ // no draw: the view histories must not advance
438
+ const viewHistoryIsReadOnly = this._scene._viewHistoryIsReadOnly;
439
+ this._scene._viewHistoryIsReadOnly = true;
431
440
  this.initRender(viewportWidth, viewportHeight);
432
441
  const isReady = this._checkReadiness();
433
442
  this.finishRender();
443
+ this._scene._viewHistoryIsReadOnly = viewHistoryIsReadOnly;
434
444
  return isReady;
435
445
  }
436
446
  /**
@@ -496,6 +506,9 @@ export class ObjectRenderer {
496
506
  this._scene._activeCamera = camera;
497
507
  this._engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);
498
508
  }
509
+ // the cameras keep a view history per object renderer
510
+ this._currentViewPassId = this._scene._viewPassId;
511
+ this._scene._viewPassId = this.renderPassId;
499
512
  if (this._useUBO) {
500
513
  this._scene.finalizeSceneUbo();
501
514
  }
@@ -509,6 +522,7 @@ export class ObjectRenderer {
509
522
  if (this._useUBO) {
510
523
  this._scene.setSceneUniformBuffer(this._currentSceneUBO);
511
524
  }
525
+ this._scene._viewPassId = this._currentViewPassId;
512
526
  if (this._disableImageProcessing) {
513
527
  scene.imageProcessingConfiguration._applyByPostProcess = this._currentApplyByPostProcessSetting;
514
528
  }
@@ -1 +1 @@
1
- {"version":3,"file":"objectRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/objectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n type Nullable,\r\n type Immutable,\r\n type Camera,\r\n type Scene,\r\n type AbstractMesh,\r\n type SubMesh,\r\n type Material,\r\n type IParticleSystem,\r\n type InstancedMesh,\r\n type BoundingBox,\r\n type BoundingBoxRenderer,\r\n type AbstractEngine,\r\n type ClusteredLightContainer,\r\n type Mesh,\r\n type ISpriteManager,\r\n} from \"core/index\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { RenderingManager } from \"../Rendering/renderingManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { _ObserveArray } from \"../Misc/arrayTools\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { LightConstants } from \"../Lights/lightConstants\";\r\n\r\n/**\r\n * Defines the options of the object renderer\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface ObjectRendererOptions {\r\n /** The number of passes the renderer will support (1 by default) */\r\n numPasses?: number;\r\n\r\n /** True (default) to not change the aspect ratio of the scene in the RTT */\r\n doNotChangeAspectRatio?: boolean;\r\n\r\n /** True to enable clustered lights (default: false) */\r\n enableClusteredLights?: boolean;\r\n}\r\n\r\n/**\r\n * A class that renders objects to the currently bound render target.\r\n * This class only renders objects, and is not concerned with the output texture or post-processing.\r\n */\r\nexport class ObjectRenderer {\r\n /**\r\n * Objects will only be rendered once which can be useful to improve performance if everything in your render is static for instance.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONCE: number = 0;\r\n /**\r\n * Objects will be rendered every frame and is recommended for dynamic contents.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number = 1;\r\n /**\r\n * Objects will be rendered every 2 frames which could be enough if your dynamic objects are not\r\n * the central point of your effect and can save a lot of performances.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number = 2;\r\n\r\n /**\r\n * Use this predicate to dynamically define the list of mesh you want to render.\r\n * If set, the renderList property will be overwritten.\r\n */\r\n public renderListPredicate: (AbstractMesh: AbstractMesh) => boolean;\r\n\r\n private _renderList: Nullable<Array<AbstractMesh>>;\r\n private _unObserveRenderList: Nullable<() => void> = null;\r\n\r\n /**\r\n * Use this list to define the list of mesh you want to render.\r\n */\r\n public get renderList(): Nullable<Array<AbstractMesh>> {\r\n return this._renderList;\r\n }\r\n\r\n public set renderList(value: Nullable<Array<AbstractMesh>>) {\r\n if (this._renderList === value) {\r\n return;\r\n }\r\n if (this._unObserveRenderList) {\r\n this._unObserveRenderList();\r\n this._unObserveRenderList = null;\r\n }\r\n\r\n if (value) {\r\n this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged);\r\n }\r\n\r\n this._renderList = value;\r\n }\r\n\r\n private _renderListHasChanged = (_functionName: string, previousLength: number) => {\r\n const newLength = this._renderList ? this._renderList.length : 0;\r\n if ((previousLength === 0 && newLength > 0) || newLength === 0) {\r\n for (const mesh of this._scene.meshes) {\r\n mesh._markSubMeshesAsLightDirty();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Define the list of particle systems to render. If not provided, will render all the particle systems of the scene.\r\n * Note that the particle systems are rendered only if renderParticles is set to true.\r\n */\r\n public particleSystemList: Nullable<Array<IParticleSystem>> = null;\r\n\r\n /**\r\n * Define the list of sprite managers to render. If not provided, will render all the sprite managers of the scene.\r\n * An empty array will render no sprite managers.\r\n * Note that the sprite managers are rendered only if renderSprites is set to true.\r\n */\r\n public spriteManagerList: Nullable<Array<ISpriteManager>> = null;\r\n\r\n /**\r\n * Use this function to overload the renderList array at rendering time.\r\n * Return null to render with the current renderList, else return the list of meshes to use for rendering.\r\n * For 2DArray, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of\r\n * the cube (if the RTT is a cube, else layerOrFace=0).\r\n * The renderList passed to the function is the current render list (the one that will be used if the function returns null).\r\n * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can\r\n * hold dummy elements!\r\n */\r\n public getCustomRenderList: Nullable<(layerOrFace: number, renderList: Nullable<Immutable<Array<AbstractMesh>>>, renderListLength: number) => Nullable<Array<AbstractMesh>>> =\r\n null;\r\n\r\n /**\r\n * Define if meshes should be rendered (default is true).\r\n */\r\n public renderMeshes = true;\r\n\r\n /**\r\n * Define if depth only meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderDepthOnlyMeshes = true;\r\n\r\n /**\r\n * Define if opaque meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderOpaqueMeshes = true;\r\n\r\n /**\r\n * Define if alpha test meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderAlphaTestMeshes = true;\r\n\r\n /**\r\n * Define if transparent meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderTransparentMeshes = true;\r\n\r\n /**\r\n * Custom render function for transparent submeshes.\r\n */\r\n public customRenderTransparentSubMeshes?: (transparentSubMeshes: SmartArray<SubMesh>) => void;\r\n\r\n /**\r\n * Define if particles should be rendered (default is true).\r\n */\r\n public renderParticles = true;\r\n\r\n /**\r\n * Define if sprites should be rendered (default is false).\r\n */\r\n public renderSprites = false;\r\n\r\n /**\r\n * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined)\r\n */\r\n public forceLayerMaskCheck = false;\r\n\r\n /**\r\n * Enables the rendering of bounding boxes for meshes (still subject to Mesh.showBoundingBox or scene.forceShowBoundingBoxes). Default is false.\r\n */\r\n public enableBoundingBoxRendering = false;\r\n\r\n /**\r\n * Enables the rendering of outline/overlay for meshes (still subject to Mesh.renderOutline/Mesh.renderOverlay). Default is true.\r\n */\r\n public enableOutlineRendering = true;\r\n\r\n /**\r\n * Define the camera used to render the objects.\r\n */\r\n public activeCamera: Nullable<Camera>;\r\n\r\n /**\r\n * Define the camera used to calculate the LOD of the objects.\r\n * If not defined, activeCamera will be used. If not defined nor activeCamera, scene's active camera will be used.\r\n */\r\n public cameraForLOD: Nullable<Camera>;\r\n\r\n private _disableImageProcessing = false;\r\n /**\r\n * If true, the object renderer will render all objects without any image processing applied.\r\n * If false (default value), the renderer will use the current setting of the scene's image processing configuration.\r\n */\r\n public get disableImageProcessing() {\r\n return this._disableImageProcessing;\r\n }\r\n\r\n public set disableImageProcessing(value: boolean) {\r\n if (value === this._disableImageProcessing) {\r\n return;\r\n }\r\n\r\n this._disableImageProcessing = value;\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_ImageProcessingDirtyFlag);\r\n }\r\n\r\n /**\r\n * If true, the object renderer will not set the view/projection/transformation matrices for the active camera (default: false).\r\n * By default, the view/projection/transformation matrices are set from the active camera (either ObjectRenderer.activeCamera or scene.activeCamera).\r\n * Sets this property to true if you want to define your own transformation matrices (use the onInitRenderingObservable observable\r\n * to set your own matrices, to be sure they will be correctly taken into account)\r\n */\r\n public dontSetTransformationMatrix = false;\r\n\r\n private _disableDepthPrePass = false;\r\n /**\r\n * Specifies to disable depth pre-pass if true (default: false)\r\n */\r\n public get disableDepthPrePass() {\r\n return this._disableDepthPrePass;\r\n }\r\n\r\n public set disableDepthPrePass(value: boolean) {\r\n this._disableDepthPrePass = value;\r\n this._renderingManager.disableDepthPrePass = value;\r\n }\r\n\r\n /**\r\n * Override the mesh isReady function with your own one.\r\n */\r\n public customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;\r\n\r\n /**\r\n * Override the render function with your own one.\r\n */\r\n public customRenderFunction: (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>,\r\n beforeTransparents?: () => void\r\n ) => void;\r\n\r\n /**\r\n * An event triggered before rendering the objects.\r\n * Note: This observable is also triggered during readiness checks (e.g. when calling scene.isReady()),\r\n * in which case the render target is not bound to the output. Observers should avoid performing\r\n * GPU state changes (such as clearing or modifying the framebuffer) unless the render target is actually bound.\r\n */\r\n public readonly onBeforeRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after rendering the objects.\r\n * Note: This observable is also triggered during readiness checks (e.g. when calling scene.isReady()),\r\n * in which case the render target is not bound to the output. Observers should avoid performing\r\n * GPU state changes (such as clearing or modifying the framebuffer) unless the render target is actually bound.\r\n */\r\n public readonly onAfterRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered before the rendering group is processed\r\n */\r\n public readonly onBeforeRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after the rendering group is processed\r\n */\r\n public readonly onAfterRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered when initRender is called\r\n */\r\n public readonly onInitRenderingObservable = new Observable<ObjectRenderer>();\r\n\r\n /**\r\n * An event triggered when finishRender is called\r\n */\r\n public readonly onFinishRenderingObservable = new Observable<ObjectRenderer>();\r\n\r\n /**\r\n * An event triggered when fast path rendering is used\r\n */\r\n public readonly onFastPathRenderObservable = new Observable<number>();\r\n\r\n protected _engine: AbstractEngine;\r\n protected _scene: Scene;\r\n protected _renderingManager: RenderingManager;\r\n /** @internal */\r\n public _waitingRenderList?: string[];\r\n protected _currentRefreshId = -1;\r\n protected _refreshRate = 1;\r\n protected _currentApplyByPostProcessSetting = false;\r\n protected _activeMeshes = new SmartArray<AbstractMesh>(256);\r\n protected _activeBoundingBoxes = new SmartArray<BoundingBox>(32);\r\n protected _useUBO: boolean;\r\n protected _sceneUBOs: UniformBuffer[]; // It's an array because we may need multiple ubos per frame if the object renderer is used several times in a frame (e.g. for rigged cameras)\r\n protected _sceneUBOIsMultiview: boolean[]; // Parallel array caching the multiview state per UBO slot — avoids getUniformNames().indexOf() in the hot path\r\n protected _currentSceneUBO: UniformBuffer;\r\n protected _currentFrameId = -1;\r\n protected _currentSceneUBOIndex = 0;\r\n\r\n /**\r\n * The options used by the object renderer\r\n */\r\n public options: Required<ObjectRendererOptions>;\r\n\r\n private _name: string;\r\n /**\r\n * Friendly name of the object renderer\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n if (this._name === value) {\r\n return;\r\n }\r\n\r\n this._name = value;\r\n if (this._sceneUBOs) {\r\n for (let i = 0; i < this._sceneUBOs.length; ++i) {\r\n this._sceneUBOs[i].name = `Scene ubo #${i} for ${this.name}`;\r\n }\r\n }\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n const renderPassId = this._renderPassIds[i];\r\n this._engine._renderPassNames[renderPassId] = `${this._name}#${i}`;\r\n }\r\n }\r\n\r\n /**\r\n * Current render pass id. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!\r\n */\r\n public renderPassId: number;\r\n private readonly _renderPassIds: number[];\r\n /**\r\n * Gets the render pass ids used by the object renderer.\r\n */\r\n public get renderPassIds(): readonly number[] {\r\n return this._renderPassIds;\r\n }\r\n\r\n /**\r\n * Gets the current value of the refreshId counter\r\n */\r\n public get currentRefreshId() {\r\n return this._currentRefreshId;\r\n }\r\n\r\n /**\r\n * Gets the array of active meshes\r\n * @returns an array of AbstractMesh\r\n */\r\n public getActiveMeshes(): SmartArray<AbstractMesh> {\r\n return this._activeMeshes;\r\n }\r\n\r\n /**\r\n * Sets a specific material to be used to render a mesh/a list of meshes with this object renderer\r\n * @param mesh mesh or array of meshes\r\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering pass.\r\n */\r\n public setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void {\r\n let meshes;\r\n if (!Array.isArray(mesh)) {\r\n meshes = [mesh];\r\n } else {\r\n meshes = mesh;\r\n }\r\n for (let j = 0; j < meshes.length; ++j) {\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n let mesh = meshes[j];\r\n if (meshes[j].isAnInstance) {\r\n mesh = (meshes[j] as InstancedMesh).sourceMesh;\r\n }\r\n mesh.setMaterialForRenderPass(this._renderPassIds[i], material !== undefined ? (Array.isArray(material) ? material[i] : material) : undefined);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _isFrozen = false;\r\n\r\n /** @internal */\r\n public _freezeActiveMeshesCancel: Nullable<() => void> = null;\r\n\r\n /** @internal */\r\n public _freezeActiveMeshes(freezeMeshes: boolean) {\r\n this._freezeActiveMeshesCancel = _RetryWithInterval(\r\n () => {\r\n return this._checkReadiness();\r\n },\r\n () => {\r\n this._freezeActiveMeshesCancel = null;\r\n if (freezeMeshes) {\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._freeze();\r\n }\r\n }\r\n this._prepareRenderingManager(0, true);\r\n this._isFrozen = true;\r\n },\r\n (err, isTimeout) => {\r\n this._freezeActiveMeshesCancel = null;\r\n if (!isTimeout) {\r\n Logger.Error(\"ObjectRenderer: An unexpected error occurred while waiting for the renderer to be ready.\");\r\n if (err) {\r\n Logger.Error(err);\r\n if (err.stack) {\r\n Logger.Error(err.stack);\r\n }\r\n }\r\n } else {\r\n Logger.Error(`ObjectRenderer: Timeout while waiting for the renderer to be ready.`);\r\n if (err) {\r\n Logger.Error(err);\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _unfreezeActiveMeshes() {\r\n this._freezeActiveMeshesCancel?.();\r\n this._freezeActiveMeshesCancel = null;\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._unFreeze();\r\n }\r\n this._isFrozen = false;\r\n }\r\n\r\n /**\r\n * Instantiates an object renderer.\r\n * @param name The friendly name of the object renderer\r\n * @param scene The scene the renderer belongs to\r\n * @param options The options used to create the renderer (optional)\r\n */\r\n constructor(name: string, scene: Scene, options?: ObjectRendererOptions) {\r\n this.name = name;\r\n this._scene = scene;\r\n this._engine = this._scene.getEngine();\r\n this._useUBO = this._engine.supportsUniformBuffers;\r\n\r\n this.renderList = [] as AbstractMesh[];\r\n this._renderPassIds = [];\r\n\r\n this.options = {\r\n numPasses: 1,\r\n doNotChangeAspectRatio: true,\r\n enableClusteredLights: false,\r\n ...options,\r\n };\r\n\r\n this._createRenderPassId();\r\n\r\n this.renderPassId = this._renderPassIds[0];\r\n\r\n // Rendering groups\r\n this._renderingManager = new RenderingManager(scene);\r\n this._renderingManager._useSceneAutoClearSetup = true;\r\n\r\n if (this.options.enableClusteredLights) {\r\n this.onInitRenderingObservable.add(() => {\r\n for (const light of this._scene.lights) {\r\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_CLUSTERED_CONTAINER && (light as ClusteredLightContainer).isSupported) {\r\n (light as ClusteredLightContainer)._updateBatches(this.activeCamera).render();\r\n }\r\n }\r\n });\r\n }\r\n\r\n this._scene.addObjectRenderer(this);\r\n }\r\n\r\n private _releaseRenderPassId(): void {\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n this._engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n this._renderPassIds.length = 0;\r\n }\r\n\r\n private _createRenderPassId(): void {\r\n this._releaseRenderPassId();\r\n\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n this._renderPassIds[i] = this._engine.createRenderPassId(`${this.name}#${i}`);\r\n }\r\n }\r\n\r\n private _createSceneUBO(name: string, isMultiview: boolean): UniformBuffer {\r\n const engine = this._scene.getEngine();\r\n const ubo = new UniformBuffer(engine, undefined, isMultiview, name, undefined, false);\r\n ubo.addUniform(\"viewProjection\", 16);\r\n if (isMultiview) {\r\n ubo.addUniform(\"viewProjectionR\", 16);\r\n }\r\n ubo.addUniform(\"view\", 16);\r\n ubo.addUniform(\"projection\", 16);\r\n ubo.addUniform(\"vEyePosition\", 4);\r\n ubo.addUniform(\"inverseProjection\", 16);\r\n return ubo;\r\n }\r\n\r\n private _getSceneUBO(): UniformBuffer {\r\n if (this._currentFrameId !== this._engine.frameId) {\r\n this._currentSceneUBOIndex = 0;\r\n this._currentFrameId = this._engine.frameId;\r\n }\r\n\r\n if (!this._sceneUBOs) {\r\n this._sceneUBOs = [];\r\n this._sceneUBOIsMultiview = [];\r\n }\r\n\r\n const activeRenderTarget = this._engine._currentRenderTarget;\r\n const isMultiview = !!(activeRenderTarget && activeRenderTarget.texture?.isMultiview) || !!(this._scene as any)._multiviewSceneUboIsActive;\r\n\r\n // Check if we have enough UBOs or if the current one is compatible\r\n if (this._currentSceneUBOIndex >= this._sceneUBOs.length) {\r\n const index = this._sceneUBOs.length;\r\n this._sceneUBOs.push(this._createSceneUBO(`Scene ubo #${index} for ${this.name}`, isMultiview));\r\n this._sceneUBOIsMultiview.push(isMultiview);\r\n } else if (this._sceneUBOIsMultiview[this._currentSceneUBOIndex] !== isMultiview) {\r\n // Layout mismatch, recreate\r\n this._sceneUBOs[this._currentSceneUBOIndex].dispose();\r\n this._sceneUBOs[this._currentSceneUBOIndex] = this._createSceneUBO(`Scene ubo #${this._currentSceneUBOIndex} for ${this.name}`, isMultiview);\r\n this._sceneUBOIsMultiview[this._currentSceneUBOIndex] = isMultiview;\r\n }\r\n\r\n const ubo = this._sceneUBOs[this._currentSceneUBOIndex++];\r\n ubo.unbindEffect();\r\n\r\n return ubo;\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the renderer and start back from scratch.\r\n * Could be useful to re-render if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the rendering or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /**\r\n * Indicates if the renderer should render the current frame.\r\n * The output is based on the specified refresh rate.\r\n * When snapshot rendering is active, this always returns true to ensure render pass\r\n * topology stays consistent between the recording frame and playback frames.\r\n * @returns true if the renderer should render the current frame\r\n */\r\n public shouldRender(): boolean {\r\n if (this._engine.snapshotRendering) {\r\n // When snapshot rendering is active (recording or playing), we must always render\r\n // to ensure the number of render passes stays consistent between the recording frame\r\n // and all playback frames. If a render target is skipped during recording but not\r\n // during playback (or vice versa), the recorded bundle list indices become misaligned,\r\n // causing visual artifacts such as flickering.\r\n return true;\r\n }\r\n\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * This function will check if the renderer is ready to render (textures are loaded, shaders are compiled)\r\n * @param viewportWidth defines the width of the viewport\r\n * @param viewportHeight defines the height of the viewport\r\n * @returns true if all required resources are ready\r\n */\r\n public isReadyForRendering(viewportWidth: number, viewportHeight: number): boolean {\r\n this.prepareRenderList();\r\n this.initRender(viewportWidth, viewportHeight);\r\n\r\n const isReady = this._checkReadiness();\r\n\r\n this.finishRender();\r\n\r\n return isReady;\r\n }\r\n\r\n /**\r\n * Makes sure the list of meshes is ready to be rendered\r\n * You should call this function before \"initRender\", but if you know the render list is ok, you may call \"initRender\" directly\r\n */\r\n public prepareRenderList(): void {\r\n const scene = this._scene;\r\n\r\n if (this._waitingRenderList) {\r\n if (!this.renderListPredicate) {\r\n this.renderList = [];\r\n for (let index = 0; index < this._waitingRenderList.length; index++) {\r\n const id = this._waitingRenderList[index];\r\n const mesh = scene.getMeshById(id);\r\n if (mesh) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n this._waitingRenderList = undefined;\r\n }\r\n\r\n // Is predicate defined?\r\n if (this.renderListPredicate) {\r\n if (this.renderList) {\r\n this.renderList.length = 0; // Clear previous renderList\r\n } else {\r\n this.renderList = [];\r\n }\r\n\r\n const sceneMeshes = this._scene.meshes;\r\n\r\n for (let index = 0; index < sceneMeshes.length; index++) {\r\n const mesh = sceneMeshes[index];\r\n if (this.renderListPredicate(mesh)) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n this._currentApplyByPostProcessSetting = this._scene.imageProcessingConfiguration.applyByPostProcess;\r\n if (this._disableImageProcessing) {\r\n // we do not use the applyByPostProcess setter to avoid flagging all the materials as \"image processing dirty\"!\r\n this._scene.imageProcessingConfiguration._applyByPostProcess = this._disableImageProcessing;\r\n }\r\n }\r\n\r\n private _defaultRenderListPrepared: boolean;\r\n private _currentSceneCamera: Nullable<Camera> = null;\r\n\r\n /**\r\n * This method makes sure everything is setup before \"render\" can be called\r\n * @param viewportWidth Width of the viewport to render to\r\n * @param viewportHeight Height of the viewport to render to\r\n */\r\n public initRender(viewportWidth: number, viewportHeight: number): void {\r\n const camera: Nullable<Camera> = this.activeCamera ?? this._scene.activeCamera;\r\n\r\n this._currentSceneCamera = this._scene.activeCamera;\r\n\r\n if (this._useUBO) {\r\n this._currentSceneUBO = this._scene.getSceneUniformBuffer();\r\n this._currentSceneUBO.unbindEffect();\r\n this._scene.setSceneUniformBuffer(this._getSceneUBO());\r\n }\r\n\r\n this.onInitRenderingObservable.notifyObservers(this);\r\n\r\n if (camera) {\r\n if (!this.dontSetTransformationMatrix) {\r\n this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));\r\n }\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged for this internal render pass.\r\n this._scene._activeCamera = camera;\r\n this._engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);\r\n }\r\n\r\n if (this._useUBO) {\r\n this._scene.finalizeSceneUbo();\r\n }\r\n\r\n this._defaultRenderListPrepared = false;\r\n }\r\n\r\n /**\r\n * This method must be called after the \"render\" call(s), to complete the rendering process.\r\n */\r\n public finishRender() {\r\n const scene = this._scene;\r\n\r\n if (this._useUBO) {\r\n this._scene.setSceneUniformBuffer(this._currentSceneUBO);\r\n }\r\n\r\n if (this._disableImageProcessing) {\r\n scene.imageProcessingConfiguration._applyByPostProcess = this._currentApplyByPostProcessSetting;\r\n }\r\n\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged for this internal render pass.\r\n scene._activeCamera = this._currentSceneCamera;\r\n if (this._currentSceneCamera) {\r\n if (this.activeCamera && this.activeCamera !== scene.activeCamera) {\r\n scene.setTransformMatrix(this._currentSceneCamera.getViewMatrix(), this._currentSceneCamera.getProjectionMatrix(true));\r\n }\r\n this._engine.setViewport(this._currentSceneCamera.viewport);\r\n }\r\n\r\n scene.resetCachedMaterial();\r\n\r\n this.onFinishRenderingObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Renders all the objects (meshes, particles systems, sprites) to the currently bound render target texture.\r\n * @param passIndex defines the pass index to use (default: 0)\r\n * @param skipOnAfterRenderObservable defines a flag to skip raising the onAfterRenderObservable\r\n */\r\n public render(passIndex = 0, skipOnAfterRenderObservable = false): void {\r\n const currentRenderPassId = this._engine.currentRenderPassId;\r\n\r\n this._engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n const fastPath = this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!fastPath) {\r\n const currentRenderList = this._prepareRenderingManager(passIndex);\r\n\r\n // The cast to \"any\" is to avoid an error in ES6 in case you don't import outlineRenderer\r\n const outlineRenderer = (this._scene as any).getOutlineRenderer?.();\r\n const outlineRendererIsEnabled = outlineRenderer?.enabled;\r\n\r\n if (outlineRenderer) {\r\n outlineRenderer.enabled = this.enableOutlineRendering;\r\n }\r\n\r\n this.onBeforeRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n\r\n this._renderingManager.render(\r\n this.customRenderFunction,\r\n currentRenderList,\r\n this.renderParticles,\r\n this.renderSprites,\r\n this.renderDepthOnlyMeshes,\r\n this.renderOpaqueMeshes,\r\n this.renderAlphaTestMeshes,\r\n this.renderTransparentMeshes,\r\n this.customRenderTransparentSubMeshes,\r\n this.spriteManagerList\r\n );\r\n this.onAfterRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n\r\n if (outlineRenderer) {\r\n outlineRenderer.enabled = outlineRendererIsEnabled;\r\n }\r\n } else {\r\n this.onFastPathRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n if (!skipOnAfterRenderObservable) {\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n this._engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n /** @internal */\r\n public _checkReadiness(): boolean {\r\n const scene = this._scene;\r\n const currentRenderPassId = this._engine.currentRenderPassId;\r\n\r\n let returnValue = true;\r\n\r\n if (!scene.getViewMatrix()) {\r\n // We probably didn't execute scene.render() yet, so make sure we have a view/projection matrix setup for the scene\r\n scene.updateTransformMatrix();\r\n }\r\n\r\n const numPasses = this.options.numPasses;\r\n for (let passIndex = 0; passIndex < numPasses && returnValue; passIndex++) {\r\n const defaultRenderList = this.renderList ? this.renderList : scene.frameGraph ? scene.meshes : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList || scene.frameGraph ? defaultRenderList.length : scene.getActiveMeshes().length;\r\n\r\n this._engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n let currentRenderListLength = defaultRenderListLength;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n if (currentRenderList) {\r\n currentRenderListLength = currentRenderList.length;\r\n }\r\n }\r\n\r\n if (!currentRenderList) {\r\n currentRenderList = defaultRenderList;\r\n }\r\n\r\n if (!this.options.doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n for (let i = 0; i < currentRenderListLength && returnValue; ++i) {\r\n const mesh = currentRenderList[i];\r\n\r\n if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n } else if (!mesh.isReady(true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n\r\n let edgesRenderer = mesh._edgesRenderer;\r\n let useInstances = mesh.hasThinInstances;\r\n if (mesh.isAnInstance) {\r\n const sourceMesh = (mesh as InstancedMesh).sourceMesh;\r\n if (sourceMesh.edgesShareWithInstances && sourceMesh._edgesRenderer?.isEnabled) {\r\n edgesRenderer = sourceMesh._edgesRenderer;\r\n useInstances = true;\r\n }\r\n } else if (mesh.hasInstances && (mesh as Mesh).edgesShareWithInstances) {\r\n useInstances = true;\r\n }\r\n if (!this.customRenderFunction && this.renderOpaqueMeshes && edgesRenderer?.isEnabled) {\r\n if (!edgesRenderer.isReady(useInstances)) {\r\n returnValue = false;\r\n }\r\n }\r\n }\r\n\r\n if (this.renderParticles && scene.particlesEnabled) {\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (const particleSystem of particleSystems) {\r\n if (!particleSystem.isReady()) {\r\n returnValue = false;\r\n }\r\n }\r\n }\r\n\r\n if (this.renderSprites && scene.spritesEnabled) {\r\n const spriteManagers = this.spriteManagerList || scene.spriteManagers;\r\n if (spriteManagers) {\r\n for (const spriteManager of spriteManagers) {\r\n if (scene.activeCamera && (spriteManager.layerMask & scene.activeCamera.layerMask) === 0) {\r\n continue;\r\n }\r\n if (spriteManager.isReady && !spriteManager.isReady()) {\r\n returnValue = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n\r\n if (numPasses > 1) {\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n }\r\n\r\n this._engine.currentRenderPassId = currentRenderPassId;\r\n\r\n return returnValue;\r\n }\r\n\r\n private _prepareRenderingManager(passIndex = 0, winterIsComing = false): Array<AbstractMesh> {\r\n const scene = this._scene;\r\n\r\n // Get the list of meshes to dispatch to the rendering manager\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n let currentRenderListLength: number;\r\n let checkLayerMask: boolean;\r\n\r\n const defaultRenderList = this.renderList ? this.renderList : scene.frameGraph ? scene.meshes : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList || scene.frameGraph ? defaultRenderList.length : scene.getActiveMeshes().length;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n // No custom render list provided, we prepare the rendering for the default list, but check\r\n // first if we did not already performed the preparation (in this frame) before so as to avoid re-doing it several times.\r\n // In WebGPU, instance data (visibleInstances) is stored per render pass ID. Each cascade/face (in CSM) uses a different\r\n // render pass ID, so we must re-prepare for each pass to register instances in the correct per-pass storage.\r\n if (this._defaultRenderListPrepared && !winterIsComing && !this._engine.isWebGPU) {\r\n return defaultRenderList;\r\n }\r\n this._defaultRenderListPrepared = true;\r\n currentRenderList = defaultRenderList;\r\n currentRenderListLength = defaultRenderListLength;\r\n checkLayerMask = !this.renderList || this.forceLayerMaskCheck;\r\n } else {\r\n // Prepare the rendering for the custom render list provided\r\n currentRenderListLength = currentRenderList.length;\r\n checkLayerMask = this.forceLayerMaskCheck;\r\n }\r\n\r\n const camera = scene.activeCamera; // note that at this point, scene.activeCamera == this.activeCamera if defined, because initRender() has been called before\r\n const cameraForLOD = this.cameraForLOD ?? camera;\r\n\r\n // The cast to \"any\" is to avoid an error in ES6 in case you don't import boundingBoxRenderer\r\n const boundingBoxRenderer = (scene as any).getBoundingBoxRenderer?.() as Nullable<BoundingBoxRenderer>;\r\n\r\n if (scene._activeMeshesFrozen && this._isFrozen) {\r\n this._renderingManager.resetSprites();\r\n\r\n if (this.enableBoundingBoxRendering && boundingBoxRenderer) {\r\n boundingBoxRenderer.reset();\r\n for (let i = 0; i < this._activeBoundingBoxes.length; i++) {\r\n const boundingBox = this._activeBoundingBoxes.data[i];\r\n boundingBoxRenderer.renderList.push(boundingBox);\r\n }\r\n }\r\n\r\n return currentRenderList;\r\n }\r\n\r\n this._renderingManager.reset();\r\n this._activeMeshes.reset();\r\n this._activeBoundingBoxes.reset();\r\n\r\n // We do not check option.enableBoundingBoxRendering before resetting the current list of bounding boxes, because:\r\n // * if bounding box rendering is enabled, we want to start with an empty list and add new bounding boxes to it\r\n // * if bounding box rendering is disabled, we don't want to render any bounding boxes that may have been generated by previous code\r\n boundingBoxRenderer && boundingBoxRenderer.reset();\r\n\r\n if (this.renderMeshes) {\r\n const sceneRenderId = scene.getRenderId();\r\n const currentFrameId = scene.getFrameId();\r\n for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {\r\n const mesh = currentRenderList[meshIndex];\r\n\r\n if (mesh && !mesh.isBlocked) {\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n } else if (!mesh.isReady(this.refreshRate === 0)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n\r\n let meshToRender: Nullable<AbstractMesh>;\r\n\r\n if (cameraForLOD) {\r\n const meshToRenderAndFrameId = mesh._internalAbstractMeshDataInfo._currentLOD.get(cameraForLOD);\r\n if (!meshToRenderAndFrameId || meshToRenderAndFrameId[1] !== currentFrameId) {\r\n meshToRender = scene.customLODSelector ? scene.customLODSelector(mesh, cameraForLOD) : mesh.getLOD(cameraForLOD);\r\n if (!meshToRenderAndFrameId) {\r\n mesh._internalAbstractMeshDataInfo._currentLOD.set(cameraForLOD, [meshToRender, currentFrameId]);\r\n } else {\r\n meshToRenderAndFrameId[0] = meshToRender;\r\n meshToRenderAndFrameId[1] = currentFrameId;\r\n }\r\n } else {\r\n meshToRender = meshToRenderAndFrameId[0];\r\n }\r\n } else {\r\n meshToRender = mesh;\r\n }\r\n\r\n if (!meshToRender) {\r\n continue;\r\n }\r\n\r\n if (meshToRender !== mesh && meshToRender.billboardMode !== 0) {\r\n meshToRender.computeWorldMatrix(); // Compute world matrix if LOD is billboard\r\n }\r\n\r\n meshToRender._preActivateForIntermediateRendering(sceneRenderId);\r\n\r\n let isMasked;\r\n if (checkLayerMask && camera) {\r\n isMasked = (mesh.layerMask & camera.layerMask) === 0;\r\n } else {\r\n isMasked = false;\r\n }\r\n\r\n if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) {\r\n this._activeMeshes.push(mesh);\r\n meshToRender._internalAbstractMeshDataInfo._wasActiveLastFrame = true;\r\n\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(sceneRenderId, true);\r\n }\r\n\r\n this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._preActiveMesh(mesh);\r\n\r\n if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true;\r\n\r\n scene._prepareSkeleton(meshToRender);\r\n\r\n for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) {\r\n const subMesh = meshToRender.subMeshes[subIndex];\r\n this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._evaluateSubMesh(mesh, subMesh);\r\n this._renderingManager.dispatch(subMesh, meshToRender);\r\n }\r\n }\r\n\r\n mesh._postActivate();\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.enableBoundingBoxRendering && boundingBoxRenderer && winterIsComing) {\r\n for (let i = 0; i < boundingBoxRenderer.renderList.length; i++) {\r\n const boundingBox = boundingBoxRenderer.renderList.data[i];\r\n this._activeBoundingBoxes.push(boundingBox);\r\n }\r\n }\r\n\r\n if (this._scene.particlesEnabled && this.renderParticles) {\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (let particleIndex = 0; particleIndex < particleSystems.length; particleIndex++) {\r\n const particleSystem = particleSystems[particleIndex];\r\n\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {\r\n continue;\r\n }\r\n\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n return currentRenderList;\r\n }\r\n\r\n /**\r\n * Gets the rendering manager\r\n */\r\n public get renderingManager(): RenderingManager {\r\n return this._renderingManager;\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\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 ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil);\r\n this._renderingManager._useSceneAutoClearSetup = false;\r\n }\r\n\r\n /**\r\n * Clones the renderer.\r\n * @returns the cloned renderer\r\n */\r\n public clone(): ObjectRenderer {\r\n const newRenderer = new ObjectRenderer(this.name, this._scene, this.options);\r\n\r\n if (this.renderList) {\r\n newRenderer.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newRenderer;\r\n }\r\n\r\n /**\r\n * Dispose the renderer and release its associated resources.\r\n */\r\n public dispose(): void {\r\n const renderList = this.renderList ? this.renderList : this._scene.getActiveMeshes().data;\r\n const renderListLength = this.renderList ? this.renderList.length : this._scene.getActiveMeshes().length;\r\n for (let i = 0; i < renderListLength; i++) {\r\n const mesh = renderList[i];\r\n if (mesh && mesh.getMaterialForRenderPass(this.renderPassId) !== undefined) {\r\n mesh.setMaterialForRenderPass(this.renderPassId, undefined);\r\n }\r\n }\r\n\r\n this.onInitRenderingObservable.clear();\r\n this.onFinishRenderingObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderingManagerRenderObservable.clear();\r\n this.onAfterRenderingManagerRenderObservable.clear();\r\n this.onFastPathRenderObservable.clear();\r\n\r\n this._releaseRenderPassId();\r\n\r\n this.renderList = null;\r\n if (this._sceneUBOs) {\r\n for (const ubo of this._sceneUBOs) {\r\n ubo.dispose();\r\n }\r\n }\r\n this._sceneUBOs = undefined as any;\r\n\r\n this._scene.removeObjectRenderer(this);\r\n this._activeMeshes.length = 0;\r\n this._activeBoundingBoxes.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this.refreshRate === ObjectRenderer.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = ObjectRenderer.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention point in material dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"objectRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/objectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n type Nullable,\r\n type Immutable,\r\n type Camera,\r\n type Scene,\r\n type AbstractMesh,\r\n type SubMesh,\r\n type Material,\r\n type IParticleSystem,\r\n type InstancedMesh,\r\n type BoundingBox,\r\n type BoundingBoxRenderer,\r\n type AbstractEngine,\r\n type ClusteredLightContainer,\r\n type Mesh,\r\n type ISpriteManager,\r\n} from \"core/index\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { RenderingManager } from \"../Rendering/renderingManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { _ObserveArray } from \"../Misc/arrayTools\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { LightConstants } from \"../Lights/lightConstants\";\r\n\r\n/**\r\n * Defines the options of the object renderer\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface ObjectRendererOptions {\r\n /** The number of passes the renderer will support (1 by default) */\r\n numPasses?: number;\r\n\r\n /** True (default) to not change the aspect ratio of the scene in the RTT */\r\n doNotChangeAspectRatio?: boolean;\r\n\r\n /** True to enable clustered lights (default: false) */\r\n enableClusteredLights?: boolean;\r\n}\r\n\r\n/**\r\n * A class that renders objects to the currently bound render target.\r\n * This class only renders objects, and is not concerned with the output texture or post-processing.\r\n */\r\nexport class ObjectRenderer {\r\n /**\r\n * Objects will only be rendered once which can be useful to improve performance if everything in your render is static for instance.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONCE: number = 0;\r\n /**\r\n * Objects will be rendered every frame and is recommended for dynamic contents.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number = 1;\r\n /**\r\n * Objects will be rendered every 2 frames which could be enough if your dynamic objects are not\r\n * the central point of your effect and can save a lot of performances.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number = 2;\r\n\r\n /**\r\n * Use this predicate to dynamically define the list of mesh you want to render.\r\n * If set, the renderList property will be overwritten.\r\n */\r\n public renderListPredicate: (AbstractMesh: AbstractMesh) => boolean;\r\n\r\n private _renderList: Nullable<Array<AbstractMesh>>;\r\n private _unObserveRenderList: Nullable<() => void> = null;\r\n\r\n /**\r\n * Use this list to define the list of mesh you want to render.\r\n */\r\n public get renderList(): Nullable<Array<AbstractMesh>> {\r\n return this._renderList;\r\n }\r\n\r\n public set renderList(value: Nullable<Array<AbstractMesh>>) {\r\n if (this._renderList === value) {\r\n return;\r\n }\r\n if (this._unObserveRenderList) {\r\n this._unObserveRenderList();\r\n this._unObserveRenderList = null;\r\n }\r\n\r\n if (value) {\r\n this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged);\r\n }\r\n\r\n this._renderList = value;\r\n }\r\n\r\n private _renderListHasChanged = (_functionName: string, previousLength: number) => {\r\n const newLength = this._renderList ? this._renderList.length : 0;\r\n if ((previousLength === 0 && newLength > 0) || newLength === 0) {\r\n for (const mesh of this._scene.meshes) {\r\n mesh._markSubMeshesAsLightDirty();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Define the list of particle systems to render. If not provided, will render all the particle systems of the scene.\r\n * Note that the particle systems are rendered only if renderParticles is set to true.\r\n */\r\n public particleSystemList: Nullable<Array<IParticleSystem>> = null;\r\n\r\n /**\r\n * Define the list of sprite managers to render. If not provided, will render all the sprite managers of the scene.\r\n * An empty array will render no sprite managers.\r\n * Note that the sprite managers are rendered only if renderSprites is set to true.\r\n */\r\n public spriteManagerList: Nullable<Array<ISpriteManager>> = null;\r\n\r\n /**\r\n * Use this function to overload the renderList array at rendering time.\r\n * Return null to render with the current renderList, else return the list of meshes to use for rendering.\r\n * For 2DArray, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of\r\n * the cube (if the RTT is a cube, else layerOrFace=0).\r\n * The renderList passed to the function is the current render list (the one that will be used if the function returns null).\r\n * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can\r\n * hold dummy elements!\r\n */\r\n public getCustomRenderList: Nullable<(layerOrFace: number, renderList: Nullable<Immutable<Array<AbstractMesh>>>, renderListLength: number) => Nullable<Array<AbstractMesh>>> =\r\n null;\r\n\r\n /**\r\n * Define if meshes should be rendered (default is true).\r\n */\r\n public renderMeshes = true;\r\n\r\n /**\r\n * Define if depth only meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderDepthOnlyMeshes = true;\r\n\r\n /**\r\n * Define if opaque meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderOpaqueMeshes = true;\r\n\r\n /**\r\n * Define if alpha test meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderAlphaTestMeshes = true;\r\n\r\n /**\r\n * Define if transparent meshes should be rendered (default is true). No effect if renderMeshes is false.\r\n */\r\n public renderTransparentMeshes = true;\r\n\r\n /**\r\n * Custom render function for transparent submeshes.\r\n */\r\n public customRenderTransparentSubMeshes?: (transparentSubMeshes: SmartArray<SubMesh>) => void;\r\n\r\n /**\r\n * Define if particles should be rendered (default is true).\r\n */\r\n public renderParticles = true;\r\n\r\n /**\r\n * Define if sprites should be rendered (default is false).\r\n */\r\n public renderSprites = false;\r\n\r\n /**\r\n * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined)\r\n */\r\n public forceLayerMaskCheck = false;\r\n\r\n /**\r\n * Enables the rendering of bounding boxes for meshes (still subject to Mesh.showBoundingBox or scene.forceShowBoundingBoxes). Default is false.\r\n */\r\n public enableBoundingBoxRendering = false;\r\n\r\n /**\r\n * Enables the rendering of outline/overlay for meshes (still subject to Mesh.renderOutline/Mesh.renderOverlay). Default is true.\r\n */\r\n public enableOutlineRendering = true;\r\n\r\n /**\r\n * Define the camera used to render the objects.\r\n */\r\n public activeCamera: Nullable<Camera>;\r\n\r\n /**\r\n * Define the camera used to calculate the LOD of the objects.\r\n * If not defined, activeCamera will be used. If not defined nor activeCamera, scene's active camera will be used.\r\n */\r\n public cameraForLOD: Nullable<Camera>;\r\n\r\n private _disableImageProcessing = false;\r\n /**\r\n * If true, the object renderer will render all objects without any image processing applied.\r\n * If false (default value), the renderer will use the current setting of the scene's image processing configuration.\r\n */\r\n public get disableImageProcessing() {\r\n return this._disableImageProcessing;\r\n }\r\n\r\n public set disableImageProcessing(value: boolean) {\r\n if (value === this._disableImageProcessing) {\r\n return;\r\n }\r\n\r\n this._disableImageProcessing = value;\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_ImageProcessingDirtyFlag);\r\n }\r\n\r\n /**\r\n * If true, the object renderer will not set the view/projection/transformation matrices for the active camera (default: false).\r\n * By default, the view/projection/transformation matrices are set from the active camera (either ObjectRenderer.activeCamera or scene.activeCamera).\r\n * Sets this property to true if you want to define your own transformation matrices (use the onInitRenderingObservable observable\r\n * to set your own matrices, to be sure they will be correctly taken into account)\r\n */\r\n public dontSetTransformationMatrix = false;\r\n\r\n private _disableDepthPrePass = false;\r\n /**\r\n * Specifies to disable depth pre-pass if true (default: false)\r\n */\r\n public get disableDepthPrePass() {\r\n return this._disableDepthPrePass;\r\n }\r\n\r\n public set disableDepthPrePass(value: boolean) {\r\n this._disableDepthPrePass = value;\r\n this._renderingManager.disableDepthPrePass = value;\r\n }\r\n\r\n /**\r\n * Override the mesh isReady function with your own one.\r\n */\r\n public customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;\r\n\r\n /**\r\n * Override the render function with your own one.\r\n */\r\n public customRenderFunction: (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>,\r\n beforeTransparents?: () => void\r\n ) => void;\r\n\r\n /**\r\n * An event triggered before rendering the objects.\r\n * Note: This observable is also triggered during readiness checks (e.g. when calling scene.isReady()),\r\n * in which case the render target is not bound to the output. Observers should avoid performing\r\n * GPU state changes (such as clearing or modifying the framebuffer) unless the render target is actually bound.\r\n */\r\n public readonly onBeforeRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after rendering the objects.\r\n * Note: This observable is also triggered during readiness checks (e.g. when calling scene.isReady()),\r\n * in which case the render target is not bound to the output. Observers should avoid performing\r\n * GPU state changes (such as clearing or modifying the framebuffer) unless the render target is actually bound.\r\n */\r\n public readonly onAfterRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered before the rendering group is processed\r\n */\r\n public readonly onBeforeRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after the rendering group is processed\r\n */\r\n public readonly onAfterRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered when initRender is called\r\n */\r\n public readonly onInitRenderingObservable = new Observable<ObjectRenderer>();\r\n\r\n /**\r\n * An event triggered when finishRender is called\r\n */\r\n public readonly onFinishRenderingObservable = new Observable<ObjectRenderer>();\r\n\r\n /**\r\n * An event triggered when fast path rendering is used\r\n */\r\n public readonly onFastPathRenderObservable = new Observable<number>();\r\n\r\n protected _engine: AbstractEngine;\r\n protected _scene: Scene;\r\n protected _renderingManager: RenderingManager;\r\n /** @internal */\r\n public _waitingRenderList?: string[];\r\n protected _currentRefreshId = -1;\r\n protected _refreshRate = 1;\r\n protected _currentApplyByPostProcessSetting = false;\r\n protected _activeMeshes = new SmartArray<AbstractMesh>(256);\r\n protected _activeBoundingBoxes = new SmartArray<BoundingBox>(32);\r\n protected _useUBO: boolean;\r\n protected _sceneUBOs: UniformBuffer[]; // It's an array because we may need multiple ubos per frame if the object renderer is used several times in a frame (e.g. for rigged cameras)\r\n protected _sceneUBOIsMultiview: boolean[]; // Parallel array caching the multiview state per UBO slot — avoids getUniformNames().indexOf() in the hot path\r\n protected _currentSceneUBO: UniformBuffer;\r\n protected _currentFrameId = -1;\r\n protected _currentSceneUBOIndex = 0;\r\n\r\n /**\r\n * The options used by the object renderer\r\n */\r\n public options: Required<ObjectRendererOptions>;\r\n\r\n private _name: string;\r\n /**\r\n * Friendly name of the object renderer\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n if (this._name === value) {\r\n return;\r\n }\r\n\r\n this._name = value;\r\n if (this._sceneUBOs) {\r\n for (let i = 0; i < this._sceneUBOs.length; ++i) {\r\n this._sceneUBOs[i].name = `Scene ubo #${i} for ${this.name}`;\r\n }\r\n }\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n const renderPassId = this._renderPassIds[i];\r\n this._engine._renderPassNames[renderPassId] = `${this._name}#${i}`;\r\n }\r\n }\r\n\r\n /**\r\n * Current render pass id. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!\r\n */\r\n public renderPassId: number;\r\n private readonly _renderPassIds: number[];\r\n /**\r\n * Gets the render pass ids used by the object renderer.\r\n */\r\n public get renderPassIds(): readonly number[] {\r\n return this._renderPassIds;\r\n }\r\n\r\n /**\r\n * Gets the current value of the refreshId counter\r\n */\r\n public get currentRefreshId() {\r\n return this._currentRefreshId;\r\n }\r\n\r\n /**\r\n * Gets the array of active meshes\r\n * @returns an array of AbstractMesh\r\n */\r\n public getActiveMeshes(): SmartArray<AbstractMesh> {\r\n return this._activeMeshes;\r\n }\r\n\r\n /**\r\n * Sets a specific material to be used to render a mesh/a list of meshes with this object renderer\r\n * @param mesh mesh or array of meshes\r\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering pass.\r\n */\r\n public setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void {\r\n let meshes;\r\n if (!Array.isArray(mesh)) {\r\n meshes = [mesh];\r\n } else {\r\n meshes = mesh;\r\n }\r\n for (let j = 0; j < meshes.length; ++j) {\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n let mesh = meshes[j];\r\n if (meshes[j].isAnInstance) {\r\n mesh = (meshes[j] as InstancedMesh).sourceMesh;\r\n }\r\n mesh.setMaterialForRenderPass(this._renderPassIds[i], material !== undefined ? (Array.isArray(material) ? material[i] : material) : undefined);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _isFrozen = false;\r\n\r\n /** @internal */\r\n public _freezeActiveMeshesCancel: Nullable<() => void> = null;\r\n\r\n /** @internal */\r\n public _freezeActiveMeshes(freezeMeshes: boolean) {\r\n this._freezeActiveMeshesCancel = _RetryWithInterval(\r\n () => {\r\n return this._checkReadiness();\r\n },\r\n () => {\r\n this._freezeActiveMeshesCancel = null;\r\n if (freezeMeshes) {\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._freeze();\r\n }\r\n }\r\n this._prepareRenderingManager(0, true);\r\n this._isFrozen = true;\r\n },\r\n (err, isTimeout) => {\r\n this._freezeActiveMeshesCancel = null;\r\n if (!isTimeout) {\r\n Logger.Error(\"ObjectRenderer: An unexpected error occurred while waiting for the renderer to be ready.\");\r\n if (err) {\r\n Logger.Error(err);\r\n if (err.stack) {\r\n Logger.Error(err.stack);\r\n }\r\n }\r\n } else {\r\n Logger.Error(`ObjectRenderer: Timeout while waiting for the renderer to be ready.`);\r\n if (err) {\r\n Logger.Error(err);\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _unfreezeActiveMeshes() {\r\n this._freezeActiveMeshesCancel?.();\r\n this._freezeActiveMeshesCancel = null;\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._unFreeze();\r\n }\r\n this._isFrozen = false;\r\n }\r\n\r\n /**\r\n * Instantiates an object renderer.\r\n * @param name The friendly name of the object renderer\r\n * @param scene The scene the renderer belongs to\r\n * @param options The options used to create the renderer (optional)\r\n */\r\n constructor(name: string, scene: Scene, options?: ObjectRendererOptions) {\r\n this.name = name;\r\n this._scene = scene;\r\n this._engine = this._scene.getEngine();\r\n this._useUBO = this._engine.supportsUniformBuffers;\r\n\r\n this.renderList = [] as AbstractMesh[];\r\n this._renderPassIds = [];\r\n\r\n this.options = {\r\n numPasses: 1,\r\n doNotChangeAspectRatio: true,\r\n enableClusteredLights: false,\r\n ...options,\r\n };\r\n\r\n this._createRenderPassId();\r\n\r\n this.renderPassId = this._renderPassIds[0];\r\n\r\n // Rendering groups\r\n this._renderingManager = new RenderingManager(scene);\r\n this._renderingManager._useSceneAutoClearSetup = true;\r\n\r\n if (this.options.enableClusteredLights) {\r\n this.onInitRenderingObservable.add(() => {\r\n for (const light of this._scene.lights) {\r\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_CLUSTERED_CONTAINER && (light as ClusteredLightContainer).isSupported) {\r\n (light as ClusteredLightContainer)._updateBatches(this.activeCamera).render();\r\n }\r\n }\r\n });\r\n }\r\n\r\n this._scene.addObjectRenderer(this);\r\n }\r\n\r\n private _releaseRenderPassId(): void {\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n this._engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n this._renderPassIds.length = 0;\r\n }\r\n\r\n private _createRenderPassId(): void {\r\n this._releaseRenderPassId();\r\n\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n this._renderPassIds[i] = this._engine.createRenderPassId(`${this.name}#${i}`);\r\n }\r\n }\r\n\r\n private _createSceneUBO(name: string, isMultiview: boolean): UniformBuffer {\r\n const engine = this._scene.getEngine();\r\n const ubo = new UniformBuffer(engine, undefined, isMultiview, name, undefined, false);\r\n ubo.addUniform(\"viewProjection\", 16);\r\n if (isMultiview) {\r\n ubo.addUniform(\"viewProjectionR\", 16);\r\n }\r\n ubo.addUniform(\"view\", 16);\r\n ubo.addUniform(\"projection\", 16);\r\n ubo.addUniform(\"vEyePosition\", 4);\r\n ubo.addUniform(\"inverseProjection\", 16);\r\n // the temporal data of the view, for WGSL shaders (see Scene.finalizeSceneUbo)\r\n if (engine.isWebGPU) {\r\n ubo.addUniform(\"previousViewProjection\", 16);\r\n ubo.addUniform(\"taaJitter\", 2);\r\n }\r\n return ubo;\r\n }\r\n\r\n private _getSceneUBO(): UniformBuffer {\r\n if (this._currentFrameId !== this._engine.frameId) {\r\n this._currentSceneUBOIndex = 0;\r\n this._currentFrameId = this._engine.frameId;\r\n }\r\n\r\n if (!this._sceneUBOs) {\r\n this._sceneUBOs = [];\r\n this._sceneUBOIsMultiview = [];\r\n }\r\n\r\n const activeRenderTarget = this._engine._currentRenderTarget;\r\n const isMultiview = !!(activeRenderTarget && activeRenderTarget.texture?.isMultiview) || !!(this._scene as any)._multiviewSceneUboIsActive;\r\n\r\n // Check if we have enough UBOs or if the current one is compatible\r\n if (this._currentSceneUBOIndex >= this._sceneUBOs.length) {\r\n const index = this._sceneUBOs.length;\r\n this._sceneUBOs.push(this._createSceneUBO(`Scene ubo #${index} for ${this.name}`, isMultiview));\r\n this._sceneUBOIsMultiview.push(isMultiview);\r\n } else if (this._sceneUBOIsMultiview[this._currentSceneUBOIndex] !== isMultiview) {\r\n // Layout mismatch, recreate\r\n this._sceneUBOs[this._currentSceneUBOIndex].dispose();\r\n this._sceneUBOs[this._currentSceneUBOIndex] = this._createSceneUBO(`Scene ubo #${this._currentSceneUBOIndex} for ${this.name}`, isMultiview);\r\n this._sceneUBOIsMultiview[this._currentSceneUBOIndex] = isMultiview;\r\n }\r\n\r\n const ubo = this._sceneUBOs[this._currentSceneUBOIndex++];\r\n ubo.unbindEffect();\r\n\r\n return ubo;\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the renderer and start back from scratch.\r\n * Could be useful to re-render if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the rendering or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /**\r\n * Indicates if the renderer should render the current frame.\r\n * The output is based on the specified refresh rate.\r\n * When snapshot rendering is active, this always returns true to ensure render pass\r\n * topology stays consistent between the recording frame and playback frames.\r\n * @returns true if the renderer should render the current frame\r\n */\r\n public shouldRender(): boolean {\r\n if (this._engine.snapshotRendering) {\r\n // When snapshot rendering is active (recording or playing), we must always render\r\n // to ensure the number of render passes stays consistent between the recording frame\r\n // and all playback frames. If a render target is skipped during recording but not\r\n // during playback (or vice versa), the recorded bundle list indices become misaligned,\r\n // causing visual artifacts such as flickering.\r\n return true;\r\n }\r\n\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * This function will check if the renderer is ready to render (textures are loaded, shaders are compiled)\r\n * @param viewportWidth defines the width of the viewport\r\n * @param viewportHeight defines the height of the viewport\r\n * @returns true if all required resources are ready\r\n */\r\n public isReadyForRendering(viewportWidth: number, viewportHeight: number): boolean {\r\n this.prepareRenderList();\r\n\r\n // no draw: the view histories must not advance\r\n const viewHistoryIsReadOnly = this._scene._viewHistoryIsReadOnly;\r\n this._scene._viewHistoryIsReadOnly = true;\r\n\r\n this.initRender(viewportWidth, viewportHeight);\r\n\r\n const isReady = this._checkReadiness();\r\n\r\n this.finishRender();\r\n\r\n this._scene._viewHistoryIsReadOnly = viewHistoryIsReadOnly;\r\n\r\n return isReady;\r\n }\r\n\r\n /**\r\n * Makes sure the list of meshes is ready to be rendered\r\n * You should call this function before \"initRender\", but if you know the render list is ok, you may call \"initRender\" directly\r\n */\r\n public prepareRenderList(): void {\r\n const scene = this._scene;\r\n\r\n if (this._waitingRenderList) {\r\n if (!this.renderListPredicate) {\r\n this.renderList = [];\r\n for (let index = 0; index < this._waitingRenderList.length; index++) {\r\n const id = this._waitingRenderList[index];\r\n const mesh = scene.getMeshById(id);\r\n if (mesh) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n this._waitingRenderList = undefined;\r\n }\r\n\r\n // Is predicate defined?\r\n if (this.renderListPredicate) {\r\n if (this.renderList) {\r\n this.renderList.length = 0; // Clear previous renderList\r\n } else {\r\n this.renderList = [];\r\n }\r\n\r\n const sceneMeshes = this._scene.meshes;\r\n\r\n for (let index = 0; index < sceneMeshes.length; index++) {\r\n const mesh = sceneMeshes[index];\r\n if (this.renderListPredicate(mesh)) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n this._currentApplyByPostProcessSetting = this._scene.imageProcessingConfiguration.applyByPostProcess;\r\n if (this._disableImageProcessing) {\r\n // we do not use the applyByPostProcess setter to avoid flagging all the materials as \"image processing dirty\"!\r\n this._scene.imageProcessingConfiguration._applyByPostProcess = this._disableImageProcessing;\r\n }\r\n }\r\n\r\n private _defaultRenderListPrepared: boolean;\r\n private _currentSceneCamera: Nullable<Camera> = null;\r\n private _currentViewPassId = Constants.RENDERPASS_MAIN;\r\n\r\n /**\r\n * This method makes sure everything is setup before \"render\" can be called\r\n * @param viewportWidth Width of the viewport to render to\r\n * @param viewportHeight Height of the viewport to render to\r\n */\r\n public initRender(viewportWidth: number, viewportHeight: number): void {\r\n const camera: Nullable<Camera> = this.activeCamera ?? this._scene.activeCamera;\r\n\r\n this._currentSceneCamera = this._scene.activeCamera;\r\n\r\n if (this._useUBO) {\r\n this._currentSceneUBO = this._scene.getSceneUniformBuffer();\r\n this._currentSceneUBO.unbindEffect();\r\n this._scene.setSceneUniformBuffer(this._getSceneUBO());\r\n }\r\n\r\n this.onInitRenderingObservable.notifyObservers(this);\r\n\r\n if (camera) {\r\n if (!this.dontSetTransformationMatrix) {\r\n this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));\r\n }\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged for this internal render pass.\r\n this._scene._activeCamera = camera;\r\n this._engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);\r\n }\r\n\r\n // the cameras keep a view history per object renderer\r\n this._currentViewPassId = this._scene._viewPassId;\r\n this._scene._viewPassId = this.renderPassId;\r\n\r\n if (this._useUBO) {\r\n this._scene.finalizeSceneUbo();\r\n }\r\n\r\n this._defaultRenderListPrepared = false;\r\n }\r\n\r\n /**\r\n * This method must be called after the \"render\" call(s), to complete the rendering process.\r\n */\r\n public finishRender() {\r\n const scene = this._scene;\r\n\r\n if (this._useUBO) {\r\n this._scene.setSceneUniformBuffer(this._currentSceneUBO);\r\n }\r\n\r\n this._scene._viewPassId = this._currentViewPassId;\r\n\r\n if (this._disableImageProcessing) {\r\n scene.imageProcessingConfiguration._applyByPostProcess = this._currentApplyByPostProcessSetting;\r\n }\r\n\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged for this internal render pass.\r\n scene._activeCamera = this._currentSceneCamera;\r\n if (this._currentSceneCamera) {\r\n if (this.activeCamera && this.activeCamera !== scene.activeCamera) {\r\n scene.setTransformMatrix(this._currentSceneCamera.getViewMatrix(), this._currentSceneCamera.getProjectionMatrix(true));\r\n }\r\n this._engine.setViewport(this._currentSceneCamera.viewport);\r\n }\r\n\r\n scene.resetCachedMaterial();\r\n\r\n this.onFinishRenderingObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Renders all the objects (meshes, particles systems, sprites) to the currently bound render target texture.\r\n * @param passIndex defines the pass index to use (default: 0)\r\n * @param skipOnAfterRenderObservable defines a flag to skip raising the onAfterRenderObservable\r\n */\r\n public render(passIndex = 0, skipOnAfterRenderObservable = false): void {\r\n const currentRenderPassId = this._engine.currentRenderPassId;\r\n\r\n this._engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n const fastPath = this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!fastPath) {\r\n const currentRenderList = this._prepareRenderingManager(passIndex);\r\n\r\n // The cast to \"any\" is to avoid an error in ES6 in case you don't import outlineRenderer\r\n const outlineRenderer = (this._scene as any).getOutlineRenderer?.();\r\n const outlineRendererIsEnabled = outlineRenderer?.enabled;\r\n\r\n if (outlineRenderer) {\r\n outlineRenderer.enabled = this.enableOutlineRendering;\r\n }\r\n\r\n this.onBeforeRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n\r\n this._renderingManager.render(\r\n this.customRenderFunction,\r\n currentRenderList,\r\n this.renderParticles,\r\n this.renderSprites,\r\n this.renderDepthOnlyMeshes,\r\n this.renderOpaqueMeshes,\r\n this.renderAlphaTestMeshes,\r\n this.renderTransparentMeshes,\r\n this.customRenderTransparentSubMeshes,\r\n this.spriteManagerList\r\n );\r\n this.onAfterRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n\r\n if (outlineRenderer) {\r\n outlineRenderer.enabled = outlineRendererIsEnabled;\r\n }\r\n } else {\r\n this.onFastPathRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n if (!skipOnAfterRenderObservable) {\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n this._engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n /** @internal */\r\n public _checkReadiness(): boolean {\r\n const scene = this._scene;\r\n const currentRenderPassId = this._engine.currentRenderPassId;\r\n\r\n let returnValue = true;\r\n\r\n if (!scene.getViewMatrix()) {\r\n // We probably didn't execute scene.render() yet, so make sure we have a view/projection matrix setup for the scene\r\n scene.updateTransformMatrix();\r\n }\r\n\r\n const numPasses = this.options.numPasses;\r\n for (let passIndex = 0; passIndex < numPasses && returnValue; passIndex++) {\r\n const defaultRenderList = this.renderList ? this.renderList : scene.frameGraph ? scene.meshes : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList || scene.frameGraph ? defaultRenderList.length : scene.getActiveMeshes().length;\r\n\r\n this._engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n let currentRenderListLength = defaultRenderListLength;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n if (currentRenderList) {\r\n currentRenderListLength = currentRenderList.length;\r\n }\r\n }\r\n\r\n if (!currentRenderList) {\r\n currentRenderList = defaultRenderList;\r\n }\r\n\r\n if (!this.options.doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n for (let i = 0; i < currentRenderListLength && returnValue; ++i) {\r\n const mesh = currentRenderList[i];\r\n\r\n if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n } else if (!mesh.isReady(true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n\r\n let edgesRenderer = mesh._edgesRenderer;\r\n let useInstances = mesh.hasThinInstances;\r\n if (mesh.isAnInstance) {\r\n const sourceMesh = (mesh as InstancedMesh).sourceMesh;\r\n if (sourceMesh.edgesShareWithInstances && sourceMesh._edgesRenderer?.isEnabled) {\r\n edgesRenderer = sourceMesh._edgesRenderer;\r\n useInstances = true;\r\n }\r\n } else if (mesh.hasInstances && (mesh as Mesh).edgesShareWithInstances) {\r\n useInstances = true;\r\n }\r\n if (!this.customRenderFunction && this.renderOpaqueMeshes && edgesRenderer?.isEnabled) {\r\n if (!edgesRenderer.isReady(useInstances)) {\r\n returnValue = false;\r\n }\r\n }\r\n }\r\n\r\n if (this.renderParticles && scene.particlesEnabled) {\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (const particleSystem of particleSystems) {\r\n if (!particleSystem.isReady()) {\r\n returnValue = false;\r\n }\r\n }\r\n }\r\n\r\n if (this.renderSprites && scene.spritesEnabled) {\r\n const spriteManagers = this.spriteManagerList || scene.spriteManagers;\r\n if (spriteManagers) {\r\n for (const spriteManager of spriteManagers) {\r\n if (scene.activeCamera && (spriteManager.layerMask & scene.activeCamera.layerMask) === 0) {\r\n continue;\r\n }\r\n if (spriteManager.isReady && !spriteManager.isReady()) {\r\n returnValue = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n\r\n if (numPasses > 1) {\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n }\r\n\r\n this._engine.currentRenderPassId = currentRenderPassId;\r\n\r\n return returnValue;\r\n }\r\n\r\n private _prepareRenderingManager(passIndex = 0, winterIsComing = false): Array<AbstractMesh> {\r\n const scene = this._scene;\r\n\r\n // Get the list of meshes to dispatch to the rendering manager\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n let currentRenderListLength: number;\r\n let checkLayerMask: boolean;\r\n\r\n const defaultRenderList = this.renderList ? this.renderList : scene.frameGraph ? scene.meshes : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList || scene.frameGraph ? defaultRenderList.length : scene.getActiveMeshes().length;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n // No custom render list provided, we prepare the rendering for the default list, but check\r\n // first if we did not already performed the preparation (in this frame) before so as to avoid re-doing it several times.\r\n // In WebGPU, instance data (visibleInstances) is stored per render pass ID. Each cascade/face (in CSM) uses a different\r\n // render pass ID, so we must re-prepare for each pass to register instances in the correct per-pass storage.\r\n if (this._defaultRenderListPrepared && !winterIsComing && !this._engine.isWebGPU) {\r\n return defaultRenderList;\r\n }\r\n this._defaultRenderListPrepared = true;\r\n currentRenderList = defaultRenderList;\r\n currentRenderListLength = defaultRenderListLength;\r\n checkLayerMask = !this.renderList || this.forceLayerMaskCheck;\r\n } else {\r\n // Prepare the rendering for the custom render list provided\r\n currentRenderListLength = currentRenderList.length;\r\n checkLayerMask = this.forceLayerMaskCheck;\r\n }\r\n\r\n const camera = scene.activeCamera; // note that at this point, scene.activeCamera == this.activeCamera if defined, because initRender() has been called before\r\n const cameraForLOD = this.cameraForLOD ?? camera;\r\n\r\n // The cast to \"any\" is to avoid an error in ES6 in case you don't import boundingBoxRenderer\r\n const boundingBoxRenderer = (scene as any).getBoundingBoxRenderer?.() as Nullable<BoundingBoxRenderer>;\r\n\r\n if (scene._activeMeshesFrozen && this._isFrozen) {\r\n this._renderingManager.resetSprites();\r\n\r\n if (this.enableBoundingBoxRendering && boundingBoxRenderer) {\r\n boundingBoxRenderer.reset();\r\n for (let i = 0; i < this._activeBoundingBoxes.length; i++) {\r\n const boundingBox = this._activeBoundingBoxes.data[i];\r\n boundingBoxRenderer.renderList.push(boundingBox);\r\n }\r\n }\r\n\r\n return currentRenderList;\r\n }\r\n\r\n this._renderingManager.reset();\r\n this._activeMeshes.reset();\r\n this._activeBoundingBoxes.reset();\r\n\r\n // We do not check option.enableBoundingBoxRendering before resetting the current list of bounding boxes, because:\r\n // * if bounding box rendering is enabled, we want to start with an empty list and add new bounding boxes to it\r\n // * if bounding box rendering is disabled, we don't want to render any bounding boxes that may have been generated by previous code\r\n boundingBoxRenderer && boundingBoxRenderer.reset();\r\n\r\n if (this.renderMeshes) {\r\n const sceneRenderId = scene.getRenderId();\r\n const currentFrameId = scene.getFrameId();\r\n for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {\r\n const mesh = currentRenderList[meshIndex];\r\n\r\n if (mesh && !mesh.isBlocked) {\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n } else if (!mesh.isReady(this.refreshRate === 0)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n\r\n let meshToRender: Nullable<AbstractMesh>;\r\n\r\n if (cameraForLOD) {\r\n const meshToRenderAndFrameId = mesh._internalAbstractMeshDataInfo._currentLOD.get(cameraForLOD);\r\n if (!meshToRenderAndFrameId || meshToRenderAndFrameId[1] !== currentFrameId) {\r\n meshToRender = scene.customLODSelector ? scene.customLODSelector(mesh, cameraForLOD) : mesh.getLOD(cameraForLOD);\r\n if (!meshToRenderAndFrameId) {\r\n mesh._internalAbstractMeshDataInfo._currentLOD.set(cameraForLOD, [meshToRender, currentFrameId]);\r\n } else {\r\n meshToRenderAndFrameId[0] = meshToRender;\r\n meshToRenderAndFrameId[1] = currentFrameId;\r\n }\r\n } else {\r\n meshToRender = meshToRenderAndFrameId[0];\r\n }\r\n } else {\r\n meshToRender = mesh;\r\n }\r\n\r\n if (!meshToRender) {\r\n continue;\r\n }\r\n\r\n if (meshToRender !== mesh && meshToRender.billboardMode !== 0) {\r\n meshToRender.computeWorldMatrix(); // Compute world matrix if LOD is billboard\r\n }\r\n\r\n meshToRender._preActivateForIntermediateRendering(sceneRenderId);\r\n\r\n let isMasked;\r\n if (checkLayerMask && camera) {\r\n isMasked = (mesh.layerMask & camera.layerMask) === 0;\r\n } else {\r\n isMasked = false;\r\n }\r\n\r\n if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) {\r\n this._activeMeshes.push(mesh);\r\n meshToRender._internalAbstractMeshDataInfo._wasActiveLastFrame = true;\r\n\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(sceneRenderId, true);\r\n }\r\n\r\n this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._preActiveMesh(mesh);\r\n\r\n if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true;\r\n\r\n scene._prepareSkeleton(meshToRender);\r\n\r\n for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) {\r\n const subMesh = meshToRender.subMeshes[subIndex];\r\n this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._evaluateSubMesh(mesh, subMesh);\r\n this._renderingManager.dispatch(subMesh, meshToRender);\r\n }\r\n }\r\n\r\n mesh._postActivate();\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.enableBoundingBoxRendering && boundingBoxRenderer && winterIsComing) {\r\n for (let i = 0; i < boundingBoxRenderer.renderList.length; i++) {\r\n const boundingBox = boundingBoxRenderer.renderList.data[i];\r\n this._activeBoundingBoxes.push(boundingBox);\r\n }\r\n }\r\n\r\n if (this._scene.particlesEnabled && this.renderParticles) {\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (let particleIndex = 0; particleIndex < particleSystems.length; particleIndex++) {\r\n const particleSystem = particleSystems[particleIndex];\r\n\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {\r\n continue;\r\n }\r\n\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n return currentRenderList;\r\n }\r\n\r\n /**\r\n * Gets the rendering manager\r\n */\r\n public get renderingManager(): RenderingManager {\r\n return this._renderingManager;\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\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 ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil);\r\n this._renderingManager._useSceneAutoClearSetup = false;\r\n }\r\n\r\n /**\r\n * Clones the renderer.\r\n * @returns the cloned renderer\r\n */\r\n public clone(): ObjectRenderer {\r\n const newRenderer = new ObjectRenderer(this.name, this._scene, this.options);\r\n\r\n if (this.renderList) {\r\n newRenderer.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newRenderer;\r\n }\r\n\r\n /**\r\n * Dispose the renderer and release its associated resources.\r\n */\r\n public dispose(): void {\r\n const renderList = this.renderList ? this.renderList : this._scene.getActiveMeshes().data;\r\n const renderListLength = this.renderList ? this.renderList.length : this._scene.getActiveMeshes().length;\r\n for (let i = 0; i < renderListLength; i++) {\r\n const mesh = renderList[i];\r\n if (mesh && mesh.getMaterialForRenderPass(this.renderPassId) !== undefined) {\r\n mesh.setMaterialForRenderPass(this.renderPassId, undefined);\r\n }\r\n }\r\n\r\n this.onInitRenderingObservable.clear();\r\n this.onFinishRenderingObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderingManagerRenderObservable.clear();\r\n this.onAfterRenderingManagerRenderObservable.clear();\r\n this.onFastPathRenderObservable.clear();\r\n\r\n this._releaseRenderPassId();\r\n\r\n this.renderList = null;\r\n if (this._sceneUBOs) {\r\n for (const ubo of this._sceneUBOs) {\r\n ubo.dispose();\r\n }\r\n }\r\n this._sceneUBOs = undefined as any;\r\n\r\n this._scene.removeObjectRenderer(this);\r\n this._activeMeshes.length = 0;\r\n this._activeBoundingBoxes.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this.refreshRate === ObjectRenderer.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = ObjectRenderer.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention point in material dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n }\r\n}\r\n"]}
@@ -5,8 +5,8 @@ const shader = `#ifndef TEXRD_DEFINED
5
5
  #define TEXRD(s,uv) texture2D(s,uv)
6
6
  #define TEXRD_DEFINED
7
7
  #endif
8
- #if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL)
9
- #if defined(TANGENT) && defined(NORMAL)
8
+ #if defined(BUMP) || defined(BENTNORMAL) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL)
9
+ #if defined(TANGENT) && defined(NORMAL)
10
10
  varying mat3 vTBN;
11
11
  #endif
12
12
  #ifdef OBJECTSPACE_NORMALMAP
@@ -1 +1 @@
1
- {"version":3,"file":"bumpFragmentMainFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/bumpFragmentMainFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,2BAA2B,CAAC;AACzC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"bumpFragmentMainFunctions\";\nconst shader = `#ifndef TEXRD_DEFINED\n#define TEXRD(s,uv) texture2D(s,uv)\n#define TEXRD_DEFINED\n#endif\n#if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nuniform mat4 normalMatrix;\n#if defined(WEBGL2) || defined(WEBGPU)\nmat4 toNormalMatrix(mat4 wMatrix)\n{mat4 ret=inverse(wMatrix);ret=transpose(ret);ret[0][3]=0.;ret[1][3]=0.;ret[2][3]=0.;ret[3]=vec4(0.,0.,0.,1.);return ret;}\n#else\nmat4 toNormalMatrix(mat4 m)\n{float\na00=m[0][0],a01=m[0][1],a02=m[0][2],a03=m[0][3],\na10=m[1][0],a11=m[1][1],a12=m[1][2],a13=m[1][3],\na20=m[2][0],a21=m[2][1],a22=m[2][2],a23=m[2][3],\na30=m[3][0],a31=m[3][1],a32=m[3][2],a33=m[3][3],\nb00=a00*a11-a01*a10,\nb01=a00*a12-a02*a10,\nb02=a00*a13-a03*a10,\nb03=a01*a12-a02*a11,\nb04=a01*a13-a03*a11,\nb05=a02*a13-a03*a12,\nb06=a20*a31-a21*a30,\nb07=a20*a32-a22*a30,\nb08=a20*a33-a23*a30,\nb09=a21*a32-a22*a31,\nb10=a21*a33-a23*a31,\nb11=a22*a33-a23*a32,\ndet=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;mat4 mi=mat4(\na11*b11-a12*b10+a13*b09,\na02*b10-a01*b11-a03*b09,\na31*b05-a32*b04+a33*b03,\na22*b04-a21*b05-a23*b03,\na12*b08-a10*b11-a13*b07,\na00*b11-a02*b08+a03*b07,\na32*b02-a30*b05-a33*b01,\na20*b05-a22*b02+a23*b01,\na10*b10-a11*b08+a13*b06,\na01*b08-a00*b10-a03*b06,\na30*b04-a31*b02+a33*b00,\na21*b02-a20*b04-a23*b00,\na11*b07-a10*b09-a12*b06,\na00*b09-a01*b07+a02*b06,\na31*b01-a30*b03-a32*b00,\na20*b03-a21*b01+a22*b00)/det;return mat4(mi[0][0],mi[1][0],mi[2][0],mi[3][0],\nmi[0][1],mi[1][1],mi[2][1],mi[3][1],\nmi[0][2],mi[1][2],mi[2][2],mi[3][2],\nmi[0][3],mi[1][3],mi[2][3],mi[3][3]);}\n#endif\n#endif\nvec3 perturbNormalBase(mat3 cotangentFrame,vec3 normal,float scale)\n{\n#ifdef NORMALXYSCALE\nnormal=normalize(normal*vec3(scale,scale,1.0));\n#endif\nreturn normalize(cotangentFrame*normal);}\nvec3 perturbNormal(mat3 cotangentFrame,vec3 textureSample,float scale)\n{return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);}\nmat3 cotangent_frame(vec3 normal,vec3 p,vec2 uv,vec2 tangentSpaceParams)\n{vec3 dp1=dFdx(p);vec3 dp2=dFdy(p);vec2 duv1=dFdx(uv);vec2 duv2=dFdy(uv);vec3 dp2perp=cross(dp2,normal);vec3 dp1perp=cross(normal,dp1);vec3 tangent=dp2perp*duv1.x+dp1perp*duv2.x;vec3 bitangent=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;float det=max(dot(tangent,tangent),dot(bitangent,bitangent));float invmax=det==0.0 ? 0.0 : inversesqrt(det);return mat3(tangent*invmax,bitangent*invmax,normal);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const bumpFragmentMainFunctions = { name, shader };\n"]}
1
+ {"version":3,"file":"bumpFragmentMainFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/bumpFragmentMainFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,2BAA2B,CAAC;AACzC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"bumpFragmentMainFunctions\";\nconst shader = `#ifndef TEXRD_DEFINED\n#define TEXRD(s,uv) texture2D(s,uv)\n#define TEXRD_DEFINED\n#endif\n#if defined(BUMP) || defined(BENTNORMAL) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL)\n#if defined(TANGENT) && defined(NORMAL)\nvarying mat3 vTBN;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nuniform mat4 normalMatrix;\n#if defined(WEBGL2) || defined(WEBGPU)\nmat4 toNormalMatrix(mat4 wMatrix)\n{mat4 ret=inverse(wMatrix);ret=transpose(ret);ret[0][3]=0.;ret[1][3]=0.;ret[2][3]=0.;ret[3]=vec4(0.,0.,0.,1.);return ret;}\n#else\nmat4 toNormalMatrix(mat4 m)\n{float\na00=m[0][0],a01=m[0][1],a02=m[0][2],a03=m[0][3],\na10=m[1][0],a11=m[1][1],a12=m[1][2],a13=m[1][3],\na20=m[2][0],a21=m[2][1],a22=m[2][2],a23=m[2][3],\na30=m[3][0],a31=m[3][1],a32=m[3][2],a33=m[3][3],\nb00=a00*a11-a01*a10,\nb01=a00*a12-a02*a10,\nb02=a00*a13-a03*a10,\nb03=a01*a12-a02*a11,\nb04=a01*a13-a03*a11,\nb05=a02*a13-a03*a12,\nb06=a20*a31-a21*a30,\nb07=a20*a32-a22*a30,\nb08=a20*a33-a23*a30,\nb09=a21*a32-a22*a31,\nb10=a21*a33-a23*a31,\nb11=a22*a33-a23*a32,\ndet=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;mat4 mi=mat4(\na11*b11-a12*b10+a13*b09,\na02*b10-a01*b11-a03*b09,\na31*b05-a32*b04+a33*b03,\na22*b04-a21*b05-a23*b03,\na12*b08-a10*b11-a13*b07,\na00*b11-a02*b08+a03*b07,\na32*b02-a30*b05-a33*b01,\na20*b05-a22*b02+a23*b01,\na10*b10-a11*b08+a13*b06,\na01*b08-a00*b10-a03*b06,\na30*b04-a31*b02+a33*b00,\na21*b02-a20*b04-a23*b00,\na11*b07-a10*b09-a12*b06,\na00*b09-a01*b07+a02*b06,\na31*b01-a30*b03-a32*b00,\na20*b03-a21*b01+a22*b00)/det;return mat4(mi[0][0],mi[1][0],mi[2][0],mi[3][0],\nmi[0][1],mi[1][1],mi[2][1],mi[3][1],\nmi[0][2],mi[1][2],mi[2][2],mi[3][2],\nmi[0][3],mi[1][3],mi[2][3],mi[3][3]);}\n#endif\n#endif\nvec3 perturbNormalBase(mat3 cotangentFrame,vec3 normal,float scale)\n{\n#ifdef NORMALXYSCALE\nnormal=normalize(normal*vec3(scale,scale,1.0));\n#endif\nreturn normalize(cotangentFrame*normal);}\nvec3 perturbNormal(mat3 cotangentFrame,vec3 textureSample,float scale)\n{return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);}\nmat3 cotangent_frame(vec3 normal,vec3 p,vec2 uv,vec2 tangentSpaceParams)\n{vec3 dp1=dFdx(p);vec3 dp2=dFdy(p);vec2 duv1=dFdx(uv);vec2 duv2=dFdy(uv);vec3 dp2perp=cross(dp2,normal);vec3 dp1perp=cross(normal,dp1);vec3 tangent=dp2perp*duv1.x+dp1perp*duv2.x;vec3 bitangent=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;float det=max(dot(tangent,tangent),dot(bitangent,bitangent));float invmax=det==0.0 ? 0.0 : inversesqrt(det);return mat3(tangent*invmax,bitangent*invmax,normal);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const bumpFragmentMainFunctions = { name, shader };\n"]}
@@ -1,7 +1,7 @@
1
1
  // Do not edit.
2
2
  import { ShaderStore } from "../../Engines/shaderStore.js";
3
3
  const name = "bumpVertex";
4
- const shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)
4
+ const shader = `#if defined(BUMP) || defined(BENTNORMAL) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)
5
5
  #if defined(TANGENT) && defined(NORMAL)
6
6
  vec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);
7
7
  #endif
@@ -1 +1 @@
1
- {"version":3,"file":"bumpVertex.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/bumpVertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,YAAY,CAAC;AAC1B,MAAM,MAAM,GAAG;;;;;CAKd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"bumpVertex\";\nconst shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nvec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const bumpVertex = { name, shader };\n"]}
1
+ {"version":3,"file":"bumpVertex.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/bumpVertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,YAAY,CAAC;AAC1B,MAAM,MAAM,GAAG;;;;;CAKd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"bumpVertex\";\nconst shader = `#if defined(BUMP) || defined(BENTNORMAL) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nvec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const bumpVertex = { name, shader };\n"]}
@@ -1,7 +1,7 @@
1
1
  // Do not edit.
2
2
  import { ShaderStore } from "../../Engines/shaderStore.js";
3
3
  const name = "bumpVertexDeclaration";
4
- const shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)
4
+ const shader = `#if defined(BUMP) || defined(BENTNORMAL) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)
5
5
  #if defined(TANGENT) && defined(NORMAL)
6
6
  varying mat3 vTBN;
7
7
  #endif
@@ -1 +1 @@
1
- {"version":3,"file":"bumpVertexDeclaration.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/bumpVertexDeclaration.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,MAAM,GAAG;;;;;CAKd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"bumpVertexDeclaration\";\nconst shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const bumpVertexDeclaration = { name, shader };\n"]}
1
+ {"version":3,"file":"bumpVertexDeclaration.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/bumpVertexDeclaration.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,MAAM,GAAG;;;;;CAKd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"bumpVertexDeclaration\";\nconst shader = `#if defined(BUMP) || defined(BENTNORMAL) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const bumpVertexDeclaration = { name, shader };\n"]}
@@ -47,7 +47,11 @@ for(int i=0; i<NUM_SAMPLES; ++i)
47
47
  #endif
48
48
  {vec2 Xi=hammersley(i,NUM_SAMPLES);
49
49
  #if IBL_CDF_FILTERING
50
- vec2 T;T.x=texture2D(icdfSampler,vec2(Xi.x,0.)).x;T.y=texture2D(icdfSampler,vec2(T.x,Xi.y)).y;vec3 Ls=uv_to_normal(vec2(1.0-fract(T.x+0.25),T.y));float NoL=dot(n,Ls);float NoV=dot(n,inputV);
50
+ vec2 T;T.x=texture2D(icdfSampler,vec2(Xi.x,0.)).x;T.y=texture2D(icdfSampler,vec2(T.x,Xi.y)).y;
51
+ #if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)
52
+ vec2 icdfSize=vec2(textureSize(icdfSampler,0));T=(min(floor(T*icdfSize),icdfSize-1.0)+0.5)/icdfSize;
53
+ #endif
54
+ vec3 Ls=uv_to_normal(vec2(1.0-fract(T.x+0.25),T.y));float NoL=dot(n,Ls);float NoV=dot(n,inputV);
51
55
  #if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON
52
56
  float LoV=dot (Ls,inputV);
53
57
  #elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY
@@ -1 +1 @@
1
- {"version":3,"file":"hdrFilteringFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/hdrFilteringFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiJd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"hdrFilteringFunctions\";\nconst shader = `#if NUM_SAMPLES\n#if NUM_SAMPLES>0\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nprecision highp int;float radicalInverse_VdC(uint bits)\n{bits=(bits<<16u) | (bits>>16u);bits=((bits & 0x55555555u)<<1u) | ((bits & 0xAAAAAAAAu)>>1u);bits=((bits & 0x33333333u)<<2u) | ((bits & 0xCCCCCCCCu)>>2u);bits=((bits & 0x0F0F0F0Fu)<<4u) | ((bits & 0xF0F0F0F0u)>>4u);bits=((bits & 0x00FF00FFu)<<8u) | ((bits & 0xFF00FF00u)>>8u);return float(bits)*2.3283064365386963e-10; }\nvec2 hammersley(uint i,uint N)\n{return vec2(float(i)/float(N),radicalInverse_VdC(i));}\n#else\nfloat vanDerCorpus(int n,int base)\n{float invBase=1.0/float(base);float denom =1.0;float result =0.0;for(int i=0; i<32; ++i)\n{if(n>0)\n{denom =mod(float(n),2.0);result+=denom*invBase;invBase=invBase/2.0;n =int(float(n)/2.0);}}\nreturn result;}\nvec2 hammersley(int i,int N)\n{return vec2(float(i)/float(N),vanDerCorpus(i,2));}\n#endif\nfloat log4(float x) {return log2(x)/2.;}\nvec3 uv_to_normal(vec2 uv) {vec3 N;vec2 uvRange=uv;float theta=uvRange.x*2.*PI;float phi=uvRange.y*PI;float sinPhi=sin(phi);N.x=cos(theta)*sinPhi;N.z=sin(theta)*sinPhi;N.y=cos(phi);return N;}\nconst float NUM_SAMPLES_FLOAT=float(NUM_SAMPLES);const float NUM_SAMPLES_FLOAT_INVERSED=1./NUM_SAMPLES_FLOAT;const float K=4.;\n#define inline\nvec3 irradiance(\n#ifdef CUSTOM_IRRADIANCE_FILTERING_INPUT\nCUSTOM_IRRADIANCE_FILTERING_INPUT\n#else\nsamplerCube inputTexture,\n#endif\nvec3 inputN,vec2 filteringInfo,\nfloat diffuseRoughness,\nvec3 surfaceAlbedo,\nvec3 inputV\n#if IBL_CDF_FILTERING\n,sampler2D icdfSampler\n#endif\n)\n{vec3 n=normalize(inputN);vec3 result=vec3(0.);\n#ifndef IBL_CDF_FILTERING\nvec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);mat3 tbnInverse=mat3(tangent.x,bitangent.x,n.x,tangent.y,bitangent.y,n.y,tangent.z,bitangent.z,n.z);\n#endif\nfloat maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);vec3 clampedAlbedo=clamp(surfaceAlbedo,vec3(0.1),vec3(1.0));\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i<NUM_SAMPLES; ++i)\n#else\nfor(int i=0; i<NUM_SAMPLES; ++i)\n#endif\n{vec2 Xi=hammersley(i,NUM_SAMPLES);\n#if IBL_CDF_FILTERING\nvec2 T;T.x=texture2D(icdfSampler,vec2(Xi.x,0.)).x;T.y=texture2D(icdfSampler,vec2(T.x,Xi.y)).y;vec3 Ls=uv_to_normal(vec2(1.0-fract(T.x+0.25),T.y));float NoL=dot(n,Ls);float NoV=dot(n,inputV);\n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\nfloat LoV=dot (Ls,inputV);\n#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY\nvec3 H=(inputV+Ls)*0.5;float VoH=dot(inputV,H);\n#endif\n#else\nvec3 Ls=hemisphereCosSample(Xi);Ls=normalize(Ls);float NoL=Ls.z; \nvec3 V=tbnInverse*inputV;float NoV=V.z; \n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\nfloat LoV=dot (Ls,V);\n#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY\nvec3 H=(V+Ls)*0.5;float VoH=dot(V,H);\n#endif\n#endif\nif (NoL>0.) {\n#if IBL_CDF_FILTERING\nfloat pdf=texture2D(icdfSampler,T).z;vec3 c=textureCubeLodEXT(inputTexture,Ls,0.).rgb;\n#else\nfloat pdf_inversed=PI/NoL;float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(l,0.,maxLevel);\n#ifdef CUSTOM_IRRADIANCE_FILTERING_FUNCTION\nCUSTOM_IRRADIANCE_FILTERING_FUNCTION\n#else\nvec3 c=textureCubeLodEXT(inputTexture,tbn*Ls,mipLevel).rgb;\n#endif\n#endif\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nvec3 diffuseRoughnessTerm=vec3(1.0);\n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\ndiffuseRoughnessTerm=diffuseBRDF_EON(clampedAlbedo,diffuseRoughness,NoL,NoV,LoV)*PI;\n#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY\ndiffuseRoughnessTerm=vec3(diffuseBRDF_Burley(NoL,NoV,VoH,diffuseRoughness)*PI);\n#endif\n#if IBL_CDF_FILTERING\nvec3 light=pdf<1e-6 ? vec3(0.0) : vec3(1.0)/vec3(pdf)*c;result+=NoL*diffuseRoughnessTerm*light;\n#else\nresult+=c*diffuseRoughnessTerm;\n#endif\n}}\nresult=result*NUM_SAMPLES_FLOAT_INVERSED;\n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\nresult=result/clampedAlbedo;\n#endif\nreturn result;}\n#define inline\nvec3 radiance(float alphaG,samplerCube inputTexture,vec3 inputN,vec2 filteringInfo)\n{vec3 n=normalize(inputN);vec3 c=textureCubeLodEXT(inputTexture,n,0.).rgb; \nif (alphaG==0.) {\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nreturn c;} else {vec3 result=vec3(0.);vec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);float weight=0.;\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i<NUM_SAMPLES; ++i)\n#else\nfor(int i=0; i<NUM_SAMPLES; ++i)\n#endif\n{vec2 Xi=hammersley(i,NUM_SAMPLES);vec3 H=hemisphereImportanceSampleDggx(Xi,alphaG);float NoV=1.;float NoH=H.z;float NoH2=H.z*H.z;float NoL=2.*NoH2-1.;vec3 L=vec3(2.*NoH*H.x,2.*NoH*H.y,NoL);L=normalize(L);if (NoL>0.) {float pdf_inversed=4./normalDistributionFunction_TrowbridgeReitzGGX(NoH,alphaG);float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(float(l),0.0,maxLevel);weight+=NoL;vec3 c=textureCubeLodEXT(inputTexture,tbn*L,mipLevel).rgb;\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c*NoL;}}\nresult=result/weight;return result;}}\n#ifdef ANISOTROPIC\n#define inline\nvec3 radianceAnisotropic(\nfloat alphaTangent, \nfloat alphaBitangent, \nsamplerCube inputTexture,\nvec3 inputView, \nvec3 inputTangent, \nvec3 inputBitangent, \nvec3 inputNormal, \nvec2 filteringInfo,\nvec2 noiseInput, \nbool isRefraction,\nfloat ior \n)\n{vec3 V=inputView;vec3 N=inputNormal;vec3 T=inputTangent;vec3 B=inputBitangent;vec3 result=vec3(0.);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float clampedAlphaT=max(alphaTangent,MINIMUMVARIANCE);float clampedAlphaB=max(alphaBitangent,MINIMUMVARIANCE);float effectiveDim=dim0*sqrt(clampedAlphaT*clampedAlphaB);float omegaP=(4.*PI)/(6.*effectiveDim*effectiveDim);const float noiseScale=clamp(log2(float(NUM_SAMPLES))/12.0,0.0,1.0);float weight=0.;\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i<NUM_SAMPLES; ++i)\n#else\nfor(int i=0; i<NUM_SAMPLES; ++i)\n#endif\n{vec2 Xi=hammersley(i,NUM_SAMPLES);Xi=fract(Xi+noiseInput*mix(0.5,0.015,noiseScale)); \nvec3 H_tangent=hemisphereImportanceSampleDggxAnisotropic(Xi,clampedAlphaT,clampedAlphaB);vec3 H=normalize(H_tangent.x*T+H_tangent.y*B+H_tangent.z*N);vec3 L;if (isRefraction) {L=refract(-V,H,1.0/ior);} else {L=reflect(-V,H);}\nfloat NoH=max(dot(N,H),0.001);float VoH=max(dot(V,H),0.001);float NoL=max(dot(N,L),0.001);if (NoL>0.) {float pdf_inversed=4./normalDistributionFunction_BurleyGGX_Anisotropic(\nH_tangent.z,H_tangent.x,H_tangent.y,vec2(clampedAlphaT,clampedAlphaB)\n);float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(float(l),0.0,maxLevel);weight+=NoL;vec3 c=textureCubeLodEXT(inputTexture,L,mipLevel).rgb;\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c*NoL;}}\nresult=result/weight;return result;}\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const hdrFilteringFunctions = { name, shader };\n"]}
1
+ {"version":3,"file":"hdrFilteringFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/hdrFilteringFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqJd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"hdrFilteringFunctions\";\nconst shader = `#if NUM_SAMPLES\n#if NUM_SAMPLES>0\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nprecision highp int;float radicalInverse_VdC(uint bits)\n{bits=(bits<<16u) | (bits>>16u);bits=((bits & 0x55555555u)<<1u) | ((bits & 0xAAAAAAAAu)>>1u);bits=((bits & 0x33333333u)<<2u) | ((bits & 0xCCCCCCCCu)>>2u);bits=((bits & 0x0F0F0F0Fu)<<4u) | ((bits & 0xF0F0F0F0u)>>4u);bits=((bits & 0x00FF00FFu)<<8u) | ((bits & 0xFF00FF00u)>>8u);return float(bits)*2.3283064365386963e-10; }\nvec2 hammersley(uint i,uint N)\n{return vec2(float(i)/float(N),radicalInverse_VdC(i));}\n#else\nfloat vanDerCorpus(int n,int base)\n{float invBase=1.0/float(base);float denom =1.0;float result =0.0;for(int i=0; i<32; ++i)\n{if(n>0)\n{denom =mod(float(n),2.0);result+=denom*invBase;invBase=invBase/2.0;n =int(float(n)/2.0);}}\nreturn result;}\nvec2 hammersley(int i,int N)\n{return vec2(float(i)/float(N),vanDerCorpus(i,2));}\n#endif\nfloat log4(float x) {return log2(x)/2.;}\nvec3 uv_to_normal(vec2 uv) {vec3 N;vec2 uvRange=uv;float theta=uvRange.x*2.*PI;float phi=uvRange.y*PI;float sinPhi=sin(phi);N.x=cos(theta)*sinPhi;N.z=sin(theta)*sinPhi;N.y=cos(phi);return N;}\nconst float NUM_SAMPLES_FLOAT=float(NUM_SAMPLES);const float NUM_SAMPLES_FLOAT_INVERSED=1./NUM_SAMPLES_FLOAT;const float K=4.;\n#define inline\nvec3 irradiance(\n#ifdef CUSTOM_IRRADIANCE_FILTERING_INPUT\nCUSTOM_IRRADIANCE_FILTERING_INPUT\n#else\nsamplerCube inputTexture,\n#endif\nvec3 inputN,vec2 filteringInfo,\nfloat diffuseRoughness,\nvec3 surfaceAlbedo,\nvec3 inputV\n#if IBL_CDF_FILTERING\n,sampler2D icdfSampler\n#endif\n)\n{vec3 n=normalize(inputN);vec3 result=vec3(0.);\n#ifndef IBL_CDF_FILTERING\nvec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);mat3 tbnInverse=mat3(tangent.x,bitangent.x,n.x,tangent.y,bitangent.y,n.y,tangent.z,bitangent.z,n.z);\n#endif\nfloat maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);vec3 clampedAlbedo=clamp(surfaceAlbedo,vec3(0.1),vec3(1.0));\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i<NUM_SAMPLES; ++i)\n#else\nfor(int i=0; i<NUM_SAMPLES; ++i)\n#endif\n{vec2 Xi=hammersley(i,NUM_SAMPLES);\n#if IBL_CDF_FILTERING\nvec2 T;T.x=texture2D(icdfSampler,vec2(Xi.x,0.)).x;T.y=texture2D(icdfSampler,vec2(T.x,Xi.y)).y;\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nvec2 icdfSize=vec2(textureSize(icdfSampler,0));T=(min(floor(T*icdfSize),icdfSize-1.0)+0.5)/icdfSize;\n#endif\nvec3 Ls=uv_to_normal(vec2(1.0-fract(T.x+0.25),T.y));float NoL=dot(n,Ls);float NoV=dot(n,inputV);\n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\nfloat LoV=dot (Ls,inputV);\n#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY\nvec3 H=(inputV+Ls)*0.5;float VoH=dot(inputV,H);\n#endif\n#else\nvec3 Ls=hemisphereCosSample(Xi);Ls=normalize(Ls);float NoL=Ls.z; \nvec3 V=tbnInverse*inputV;float NoV=V.z; \n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\nfloat LoV=dot (Ls,V);\n#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY\nvec3 H=(V+Ls)*0.5;float VoH=dot(V,H);\n#endif\n#endif\nif (NoL>0.) {\n#if IBL_CDF_FILTERING\nfloat pdf=texture2D(icdfSampler,T).z;vec3 c=textureCubeLodEXT(inputTexture,Ls,0.).rgb;\n#else\nfloat pdf_inversed=PI/NoL;float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(l,0.,maxLevel);\n#ifdef CUSTOM_IRRADIANCE_FILTERING_FUNCTION\nCUSTOM_IRRADIANCE_FILTERING_FUNCTION\n#else\nvec3 c=textureCubeLodEXT(inputTexture,tbn*Ls,mipLevel).rgb;\n#endif\n#endif\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nvec3 diffuseRoughnessTerm=vec3(1.0);\n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\ndiffuseRoughnessTerm=diffuseBRDF_EON(clampedAlbedo,diffuseRoughness,NoL,NoV,LoV)*PI;\n#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY\ndiffuseRoughnessTerm=vec3(diffuseBRDF_Burley(NoL,NoV,VoH,diffuseRoughness)*PI);\n#endif\n#if IBL_CDF_FILTERING\nvec3 light=pdf<1e-6 ? vec3(0.0) : vec3(1.0)/vec3(pdf)*c;result+=NoL*diffuseRoughnessTerm*light;\n#else\nresult+=c*diffuseRoughnessTerm;\n#endif\n}}\nresult=result*NUM_SAMPLES_FLOAT_INVERSED;\n#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON\nresult=result/clampedAlbedo;\n#endif\nreturn result;}\n#define inline\nvec3 radiance(float alphaG,samplerCube inputTexture,vec3 inputN,vec2 filteringInfo)\n{vec3 n=normalize(inputN);vec3 c=textureCubeLodEXT(inputTexture,n,0.).rgb; \nif (alphaG==0.) {\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nreturn c;} else {vec3 result=vec3(0.);vec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);float weight=0.;\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i<NUM_SAMPLES; ++i)\n#else\nfor(int i=0; i<NUM_SAMPLES; ++i)\n#endif\n{vec2 Xi=hammersley(i,NUM_SAMPLES);vec3 H=hemisphereImportanceSampleDggx(Xi,alphaG);float NoV=1.;float NoH=H.z;float NoH2=H.z*H.z;float NoL=2.*NoH2-1.;vec3 L=vec3(2.*NoH*H.x,2.*NoH*H.y,NoL);L=normalize(L);if (NoL>0.) {float pdf_inversed=4./normalDistributionFunction_TrowbridgeReitzGGX(NoH,alphaG);float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(float(l),0.0,maxLevel);weight+=NoL;vec3 c=textureCubeLodEXT(inputTexture,tbn*L,mipLevel).rgb;\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c*NoL;}}\nresult=result/weight;return result;}}\n#ifdef ANISOTROPIC\n#define inline\nvec3 radianceAnisotropic(\nfloat alphaTangent, \nfloat alphaBitangent, \nsamplerCube inputTexture,\nvec3 inputView, \nvec3 inputTangent, \nvec3 inputBitangent, \nvec3 inputNormal, \nvec2 filteringInfo,\nvec2 noiseInput, \nbool isRefraction,\nfloat ior \n)\n{vec3 V=inputView;vec3 N=inputNormal;vec3 T=inputTangent;vec3 B=inputBitangent;vec3 result=vec3(0.);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float clampedAlphaT=max(alphaTangent,MINIMUMVARIANCE);float clampedAlphaB=max(alphaBitangent,MINIMUMVARIANCE);float effectiveDim=dim0*sqrt(clampedAlphaT*clampedAlphaB);float omegaP=(4.*PI)/(6.*effectiveDim*effectiveDim);const float noiseScale=clamp(log2(float(NUM_SAMPLES))/12.0,0.0,1.0);float weight=0.;\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i<NUM_SAMPLES; ++i)\n#else\nfor(int i=0; i<NUM_SAMPLES; ++i)\n#endif\n{vec2 Xi=hammersley(i,NUM_SAMPLES);Xi=fract(Xi+noiseInput*mix(0.5,0.015,noiseScale)); \nvec3 H_tangent=hemisphereImportanceSampleDggxAnisotropic(Xi,clampedAlphaT,clampedAlphaB);vec3 H=normalize(H_tangent.x*T+H_tangent.y*B+H_tangent.z*N);vec3 L;if (isRefraction) {L=refract(-V,H,1.0/ior);} else {L=reflect(-V,H);}\nfloat NoH=max(dot(N,H),0.001);float VoH=max(dot(V,H),0.001);float NoL=max(dot(N,L),0.001);if (NoL>0.) {float pdf_inversed=4./normalDistributionFunction_BurleyGGX_Anisotropic(\nH_tangent.z,H_tangent.x,H_tangent.y,vec2(clampedAlphaT,clampedAlphaB)\n);float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(float(l),0.0,maxLevel);weight+=NoL;vec3 c=textureCubeLodEXT(inputTexture,L,mipLevel).rgb;\n#if GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c*NoL;}}\nresult=result/weight;return result;}\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const hdrFilteringFunctions = { name, shader };\n"]}
@@ -111,8 +111,8 @@ float avg(vec3 value) {return dot(value,vec3(0.333333333));}
111
111
  precision highp int;uint extractBits(uint value,int offset,int width) {return (value>>offset) & ((1u<<width)-1u);}
112
112
  int onlyBitPosition(uint value) {return (floatBitsToInt(float(value))>>23)-0x7f;}
113
113
  vec3 singleScatterToMultiScatterAlbedo(vec3 rho_ss) {vec3 s=sqrt(max(vec3(1.0)-rho_ss,vec3(0.0)));return (vec3(1.0)-s)*(vec3(1.0)-vec3(0.139)*s)/(vec3(1.0)+vec3(1.17)*s);}
114
- vec3 multiScatterToSingleScatterAlbedo(vec3 rho_ms) {vec3 s=4.09712+4.20863*rho_ms-sqrt(9.59217+41.6808*rho_ms+17.7126*rho_ms*rho_ms);return 1.0-s*s;}
115
- vec3 multiScatterToSingleScatterAlbedo(vec3 rho_ms,float aniso) {vec3 s=4.09712+4.20863*rho_ms-sqrt(9.59217+41.6808*rho_ms+17.7126*rho_ms*rho_ms);return (1.0-s*s)/maxEps(1.0-aniso*s*s);}
114
+ vec3 multiScatterToSingleScatterAlbedo(vec3 rho_ms) {vec3 s=4.09712+4.20863*rho_ms-sqrt(9.59217+41.6808*rho_ms+17.7126*rho_ms*rho_ms);s=mix(s,vec3(1.0),vec3(lessThanEqual(rho_ms,vec3(0.0))));return 1.0-s*s;}
115
+ vec3 multiScatterToSingleScatterAlbedo(vec3 rho_ms,float aniso) {vec3 s=4.09712+4.20863*rho_ms-sqrt(9.59217+41.6808*rho_ms+17.7126*rho_ms*rho_ms);s=mix(s,vec3(1.0),vec3(lessThanEqual(rho_ms,vec3(0.0))));return (1.0-s*s)/maxEps(1.0-aniso*s*s);}
116
116
  float min3(vec3 v) {return min(v.x,min(v.y,v.z));}
117
117
  float max3(vec3 v) {return max(v.x,max(v.y,v.z));}
118
118
  float uint2float(uint i) {return uintBitsToFloat(0x3F800000u | (i>>9u))-1.0;}