@onerjs/core 9.0.1 → 9.0.3

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/Animations/animationGroup.pure.js.map +1 -1
  2. package/Buffers/buffer.pure.js +4 -0
  3. package/Buffers/buffer.pure.js.map +1 -1
  4. package/Cameras/camera.pure.d.ts +14 -0
  5. package/Cameras/camera.pure.js +15 -0
  6. package/Cameras/camera.pure.js.map +1 -1
  7. package/Compute/computeShader.pure.d.ts +2 -1
  8. package/Compute/computeShader.pure.js +29 -10
  9. package/Compute/computeShader.pure.js.map +1 -1
  10. package/Culling/ray.core.js +22 -9
  11. package/Culling/ray.core.js.map +1 -1
  12. package/Engines/IDrawContext.d.ts +2 -0
  13. package/Engines/IDrawContext.js.map +1 -1
  14. package/Engines/Native/nativeInterfaces.d.ts +55 -4
  15. package/Engines/Native/nativeInterfaces.js.map +1 -1
  16. package/Engines/Native/nativeRenderTargetWrapper.d.ts +1 -0
  17. package/Engines/Native/nativeRenderTargetWrapper.js +5 -1
  18. package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
  19. package/Engines/Processors/shaderCodeInliner.d.ts +2 -0
  20. package/Engines/Processors/shaderCodeInliner.js +251 -6
  21. package/Engines/Processors/shaderCodeInliner.js.map +1 -1
  22. package/Engines/Processors/shaderProcessor.js +10 -1
  23. package/Engines/Processors/shaderProcessor.js.map +1 -1
  24. package/Engines/WebGPU/Extensions/engine.debugging.pure.js +12 -0
  25. package/Engines/WebGPU/Extensions/engine.debugging.pure.js.map +1 -1
  26. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +0 -1
  27. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
  28. package/Engines/WebGPU/Extensions/engine.query.pure.js +5 -0
  29. package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
  30. package/Engines/WebGPU/webgpuBufferManager.js +7 -0
  31. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  32. package/Engines/WebGPU/webgpuCacheTextureView.d.ts +1 -1
  33. package/Engines/WebGPU/webgpuCacheTextureView.js +20 -8
  34. package/Engines/WebGPU/webgpuCacheTextureView.js.map +1 -1
  35. package/Engines/WebGPU/webgpuDrawContext.d.ts +2 -0
  36. package/Engines/WebGPU/webgpuDrawContext.js +6 -0
  37. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  38. package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -3
  39. package/Engines/WebGPU/webgpuQuerySet.js +23 -9
  40. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  41. package/Engines/WebGPU/webgpuRenderPassCommandStream.d.ts +156 -0
  42. package/Engines/WebGPU/webgpuRenderPassCommandStream.js +323 -0
  43. package/Engines/WebGPU/webgpuRenderPassCommandStream.js.map +1 -0
  44. package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -1
  45. package/Engines/WebGPU/webgpuTextureManager.js +4 -3
  46. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  47. package/Engines/WebGPU/webgpuTimestampQuery.d.ts +3 -1
  48. package/Engines/WebGPU/webgpuTimestampQuery.js +9 -6
  49. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  50. package/Engines/abstractEngine.pure.d.ts +2 -0
  51. package/Engines/abstractEngine.pure.js +14 -5
  52. package/Engines/abstractEngine.pure.js.map +1 -1
  53. package/Engines/constants.d.ts +6 -0
  54. package/Engines/constants.js +6 -0
  55. package/Engines/constants.js.map +1 -1
  56. package/Engines/engine.d.ts +198 -24
  57. package/Engines/pure.d.ts +1 -0
  58. package/Engines/pure.js +1 -0
  59. package/Engines/pure.js.map +1 -1
  60. package/Engines/renderCommandBatcher.pure.d.ts +16 -0
  61. package/Engines/renderCommandBatcher.pure.js +24 -0
  62. package/Engines/renderCommandBatcher.pure.js.map +1 -0
  63. package/Engines/thinEngine.functions.js +3 -2
  64. package/Engines/thinEngine.functions.js.map +1 -1
  65. package/Engines/thinEngine.pure.js +18 -2
  66. package/Engines/thinEngine.pure.js.map +1 -1
  67. package/Engines/thinNativeEngine.pure.d.ts +10 -7
  68. package/Engines/thinNativeEngine.pure.js +117 -46
  69. package/Engines/thinNativeEngine.pure.js.map +1 -1
  70. package/Engines/thinWebGPUEngine.d.ts +8 -0
  71. package/Engines/thinWebGPUEngine.js +11 -0
  72. package/Engines/thinWebGPUEngine.js.map +1 -1
  73. package/Engines/webgpuEngine.pure.d.ts +60 -1
  74. package/Engines/webgpuEngine.pure.js +238 -42
  75. package/Engines/webgpuEngine.pure.js.map +1 -1
  76. package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.d.ts +3 -3
  77. package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js +2 -1
  78. package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js.map +1 -1
  79. package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.d.ts +3 -3
  80. package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js +2 -1
  81. package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js.map +1 -1
  82. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.d.ts +5 -0
  83. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js +8 -0
  84. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js.map +1 -0
  85. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.d.ts +77 -0
  86. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js +141 -0
  87. package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js.map +1 -0
  88. package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.d.ts +5 -3
  89. package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js +38 -7
  90. package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js.map +1 -1
  91. package/FlowGraph/Blocks/Event/index.d.ts +1 -0
  92. package/FlowGraph/Blocks/Event/index.js +1 -0
  93. package/FlowGraph/Blocks/Event/index.js.map +1 -1
  94. package/FlowGraph/Blocks/Event/pure.d.ts +1 -0
  95. package/FlowGraph/Blocks/Event/pure.js +1 -0
  96. package/FlowGraph/Blocks/Event/pure.js.map +1 -1
  97. package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.d.ts +3 -3
  98. package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js +2 -1
  99. package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js.map +1 -1
  100. package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.d.ts +3 -3
  101. package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js +2 -1
  102. package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js.map +1 -1
  103. package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.d.ts +3 -3
  104. package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js +2 -1
  105. package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js.map +1 -1
  106. package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.d.ts +3 -3
  107. package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js +2 -1
  108. package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js.map +1 -1
  109. package/FlowGraph/Blocks/allBlocks.pure.js +2 -0
  110. package/FlowGraph/Blocks/allBlocks.pure.js.map +1 -1
  111. package/FlowGraph/Blocks/flowGraphBlockFactory.js +2 -0
  112. package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
  113. package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +1 -0
  114. package/FlowGraph/Blocks/flowGraphBlockNames.js +1 -0
  115. package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
  116. package/FlowGraph/flowGraph.d.ts +12 -1
  117. package/FlowGraph/flowGraph.js +38 -0
  118. package/FlowGraph/flowGraph.js.map +1 -1
  119. package/FlowGraph/flowGraphCoordinator.d.ts +44 -0
  120. package/FlowGraph/flowGraphCoordinator.js +141 -0
  121. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  122. package/FlowGraph/flowGraphDataConnection.pure.js +41 -14
  123. package/FlowGraph/flowGraphDataConnection.pure.js.map +1 -1
  124. package/FlowGraph/flowGraphParser.js +105 -5
  125. package/FlowGraph/flowGraphParser.js.map +1 -1
  126. package/FlowGraph/flowGraphSoundAssets.d.ts +40 -0
  127. package/FlowGraph/flowGraphSoundAssets.js +33 -0
  128. package/FlowGraph/flowGraphSoundAssets.js.map +1 -0
  129. package/FlowGraph/index.d.ts +1 -0
  130. package/FlowGraph/index.js +1 -0
  131. package/FlowGraph/index.js.map +1 -1
  132. package/FlowGraph/pure.d.ts +1 -0
  133. package/FlowGraph/pure.js +1 -0
  134. package/FlowGraph/pure.js.map +1 -1
  135. package/FlowGraph/serialization.d.ts +8 -0
  136. package/FlowGraph/serialization.js +31 -12
  137. package/FlowGraph/serialization.js.map +1 -1
  138. package/FlowGraph/typeDefinitions.d.ts +25 -0
  139. package/FlowGraph/typeDefinitions.js.map +1 -1
  140. package/FrameGraph/Tasks/PostProcesses/taaTask.js +2 -0
  141. package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -1
  142. package/Instrumentation/engineInstrumentation.d.ts +1 -0
  143. package/Instrumentation/engineInstrumentation.js +25 -6
  144. package/Instrumentation/engineInstrumentation.js.map +1 -1
  145. package/Lights/Clustered/clusteredLightContainer.pure.js +2 -0
  146. package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
  147. package/Lights/Shadows/cascadedShadowGenerator.pure.d.ts +36 -1
  148. package/Lights/Shadows/cascadedShadowGenerator.pure.js +202 -27
  149. package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
  150. package/Lights/directionalLight.pure.d.ts +24 -10
  151. package/Lights/directionalLight.pure.js +29 -11
  152. package/Lights/directionalLight.pure.js.map +1 -1
  153. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +4 -4
  154. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
  155. package/Materials/Node/Blocks/Dual/lightBlock.pure.js +1 -1
  156. package/Materials/Node/Blocks/Dual/lightBlock.pure.js.map +1 -1
  157. package/Materials/Node/Blocks/Input/inputBlock.pure.js +4 -0
  158. package/Materials/Node/Blocks/Input/inputBlock.pure.js.map +1 -1
  159. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.d.ts +9 -0
  160. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +23 -3
  161. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
  162. package/Materials/PBR/openpbrMaterial.pure.js +1 -1
  163. package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
  164. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +9 -0
  165. package/Materials/PBR/pbrBaseMaterial.pure.js +60 -1
  166. package/Materials/PBR/pbrBaseMaterial.pure.js.map +1 -1
  167. package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +11 -0
  168. package/Materials/PBR/pbrBaseSimpleMaterial.js +21 -2
  169. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  170. package/Materials/PBR/pbrMaterial.pure.d.ts +12 -0
  171. package/Materials/PBR/pbrMaterial.pure.js +23 -3
  172. package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
  173. package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -0
  174. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +10 -0
  175. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
  176. package/Materials/Textures/HTML/htmlInCanvasPolyfill.d.ts +5 -0
  177. package/Materials/Textures/HTML/htmlInCanvasPolyfill.js +7 -0
  178. package/Materials/Textures/HTML/htmlInCanvasPolyfill.js.map +1 -1
  179. package/Materials/Textures/HTML/htmlInteractionManager.d.ts +9 -3
  180. package/Materials/Textures/HTML/htmlInteractionManager.js +64 -5
  181. package/Materials/Textures/HTML/htmlInteractionManager.js.map +1 -1
  182. package/Materials/Textures/HTML/htmlTexture.d.ts +11 -11
  183. package/Materials/Textures/HTML/htmlTexture.js +106 -65
  184. package/Materials/Textures/HTML/htmlTexture.js.map +1 -1
  185. package/Materials/Textures/Loaders/internalTextureLoader.d.ts +2 -1
  186. package/Materials/Textures/Loaders/internalTextureLoader.js.map +1 -1
  187. package/Materials/Textures/Loaders/ktxTextureLoader.d.ts +2 -1
  188. package/Materials/Textures/Loaders/ktxTextureLoader.js +4 -50
  189. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  190. package/Materials/Textures/Procedurals/proceduralTexture.pure.js +10 -0
  191. package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
  192. package/Materials/Textures/dynamicTexture.pure.js +6 -0
  193. package/Materials/Textures/dynamicTexture.pure.js.map +1 -1
  194. package/Materials/Textures/ktx2encoderTypes.d.ts +51 -0
  195. package/Materials/Textures/ktx2encoderTypes.js +2 -0
  196. package/Materials/Textures/ktx2encoderTypes.js.map +1 -0
  197. package/Materials/Textures/renderTargetTexture.pure.js +10 -2
  198. package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
  199. package/Materials/Textures/texture.pure.js +7 -1
  200. package/Materials/Textures/texture.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
@@ -1 +1 @@
1
- {"version":3,"file":"typeDefinitions.js","sourceRoot":"","sources":["../../../../dev/core/src/FlowGraph/typeDefinitions.ts"],"names":[],"mappings":"","sourcesContent":["import { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type Animation } from \"core/Animations/animation\";\r\nimport { type FlowGraphConnectionType } from \"./flowGraphConnection\";\r\n\r\n/**\r\n * Interpolation generator\r\n */\r\nexport interface IInterpolationPropertyInfo {\r\n /**\r\n * type of the interpolation\r\n */\r\n type: number;\r\n /**\r\n * The name of the property\r\n */\r\n name: string;\r\n /** @internal */\r\n getValue: (target: any, source: Float32Array, offset: number, scale: number) => any;\r\n /** @internal */\r\n getStride: (target: any) => number;\r\n /**\r\n * @internal\r\n */\r\n buildAnimations(target: any, name: string, fps: number, keys: any[]): { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[];\r\n}\r\n\r\n/**\r\n * An accessor that allows modifying properties on some other object.\r\n */\r\nexport interface IObjectAccessor<GLTFTargetType = any, BabylonTargetType = any, BabylonValueType = any> {\r\n /**\r\n * The number of components that are changed in the property when setting this value.\r\n * This will usually be 1. But, for example, Babylon has both orthoLeft and orthoRight (two components) properties that are changed when setting xmag (single value in glTF).\r\n * Defaults to 1 if not provided!\r\n */\r\n componentsCount?: number;\r\n /**\r\n * The (babylon) type of the property.\r\n */\r\n type: string;\r\n /**\r\n * Get the value of the property.\r\n */\r\n get: (target: GLTFTargetType, index?: number, payload?: any) => BabylonValueType | undefined;\r\n /**\r\n * Get the target of the property.\r\n */\r\n getTarget: (target: GLTFTargetType, index?: number, payload?: any) => BabylonTargetType | undefined;\r\n /**\r\n * is the property readonly?\r\n */\r\n isReadOnly?: boolean;\r\n /**\r\n * @deprecated Use get instead\r\n */\r\n getPropertyName?: Array<(target: GLTFTargetType, index?: number) => string>;\r\n /**\r\n * Set a new value to the property.\r\n * @param newValue the new value to set\r\n * @param target the target object\r\n * @param index the index of the target object in the array (optional)\r\n */\r\n set?: (newValue: BabylonValueType, target: GLTFTargetType, index?: number, payload?: any) => void;\r\n /**\r\n * Interpolation/animation information for the property.\r\n * This is an array that can be used to animate the value over time.\r\n */\r\n interpolation?: IInterpolationPropertyInfo[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Context\r\n */\r\nexport interface ISerializedFlowGraphContext {\r\n /**\r\n * The unique id of the context\r\n */\r\n uniqueId: string;\r\n /**\r\n * An optional user-facing name for the context\r\n */\r\n name?: string;\r\n /**\r\n * User variables\r\n */\r\n _userVariables: { [key: string]: any };\r\n /**\r\n * Optional type annotations for user variables.\r\n * Keys are variable names; values are type name strings.\r\n */\r\n _variableTypes?: { [key: string]: string };\r\n /**\r\n * Values of the connection points\r\n */\r\n _connectionValues: { [key: string]: any };\r\n\r\n /**\r\n * Assets context, if not the scene\r\n */\r\n _assetsContext?: { [key: string]: any };\r\n\r\n /**\r\n * Should logging be enabled?\r\n */\r\n enableLogging?: boolean;\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Connection\r\n */\r\nexport interface ISerializedFlowGraphConnection {\r\n /**\r\n * The unique id of the connection\r\n */\r\n uniqueId: string;\r\n /**\r\n * The name of the connection\r\n */\r\n name: string;\r\n /**\r\n * The type of the connection\r\n */\r\n _connectionType: FlowGraphConnectionType;\r\n /**\r\n * The id of the connection that this is connected to\r\n */\r\n connectedPointIds: string[];\r\n /**\r\n * Optional host-format metadata associated with this connection.\r\n */\r\n metadata?: any;\r\n /**\r\n * The serialized default value of a data connection (set by the user for\r\n * unconnected inputs). Only present on data connections.\r\n */\r\n defaultValue?: any;\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Block\r\n */\r\nexport interface ISerializedFlowGraphBlock {\r\n /**\r\n * The class name of the block\r\n */\r\n className: string;\r\n /**\r\n * The glTF type of the block\r\n */\r\n type: string;\r\n /**\r\n * Configuration parameters for the block\r\n */\r\n config: any;\r\n /**\r\n * The unique id of the block\r\n */\r\n uniqueId: string;\r\n /**\r\n * Input connection data\r\n */\r\n dataInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection data\r\n */\r\n dataOutputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Metadata for the block\r\n */\r\n metadata: any;\r\n /**\r\n * Input connection signal\r\n */\r\n signalInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection signal\r\n */\r\n signalOutputs: ISerializedFlowGraphConnection[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph\r\n */\r\nexport interface ISerializedFlowGraph {\r\n /**\r\n * Optional human-readable name for the graph\r\n */\r\n name?: string;\r\n /**\r\n * Optional unique identifier for the graph\r\n */\r\n uniqueId?: string;\r\n /**\r\n * Optional host-format metadata associated with the graph.\r\n */\r\n metadata?: any;\r\n /**\r\n * Contexts belonging to the flow graph\r\n */\r\n executionContexts: ISerializedFlowGraphContext[];\r\n /**\r\n * Blocks belonging to the flow graph\r\n */\r\n allBlocks: ISerializedFlowGraphBlock[];\r\n\r\n /**\r\n * Is the flow graph in RHS mode?\r\n */\r\n rightHanded?: boolean;\r\n}\r\n"]}
1
+ {"version":3,"file":"typeDefinitions.js","sourceRoot":"","sources":["../../../../dev/core/src/FlowGraph/typeDefinitions.ts"],"names":[],"mappings":"","sourcesContent":["import { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type Animation } from \"core/Animations/animation\";\r\nimport { type FlowGraphConnectionType } from \"./flowGraphConnection\";\r\n\r\n/**\r\n * Interpolation generator\r\n */\r\nexport interface IInterpolationPropertyInfo {\r\n /**\r\n * type of the interpolation\r\n */\r\n type: number;\r\n /**\r\n * The name of the property\r\n */\r\n name: string;\r\n /** @internal */\r\n getValue: (target: any, source: Float32Array, offset: number, scale: number) => any;\r\n /** @internal */\r\n getStride: (target: any) => number;\r\n /**\r\n * @internal\r\n */\r\n buildAnimations(target: any, name: string, fps: number, keys: any[]): { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[];\r\n}\r\n\r\n/**\r\n * An accessor that allows modifying properties on some other object.\r\n */\r\nexport interface IObjectAccessor<GLTFTargetType = any, BabylonTargetType = any, BabylonValueType = any> {\r\n /**\r\n * The number of components that are changed in the property when setting this value.\r\n * This will usually be 1. But, for example, Babylon has both orthoLeft and orthoRight (two components) properties that are changed when setting xmag (single value in glTF).\r\n * Defaults to 1 if not provided!\r\n */\r\n componentsCount?: number;\r\n /**\r\n * The (babylon) type of the property.\r\n */\r\n type: string;\r\n /**\r\n * Get the value of the property.\r\n */\r\n get: (target: GLTFTargetType, index?: number, payload?: any) => BabylonValueType | undefined;\r\n /**\r\n * Get the target of the property.\r\n */\r\n getTarget: (target: GLTFTargetType, index?: number, payload?: any) => BabylonTargetType | undefined;\r\n /**\r\n * is the property readonly?\r\n */\r\n isReadOnly?: boolean;\r\n /**\r\n * @deprecated Use get instead\r\n */\r\n getPropertyName?: Array<(target: GLTFTargetType, index?: number) => string>;\r\n /**\r\n * Set a new value to the property.\r\n * @param newValue the new value to set\r\n * @param target the target object\r\n * @param index the index of the target object in the array (optional)\r\n */\r\n set?: (newValue: BabylonValueType, target: GLTFTargetType, index?: number, payload?: any) => void;\r\n /**\r\n * Interpolation/animation information for the property.\r\n * This is an array that can be used to animate the value over time.\r\n */\r\n interpolation?: IInterpolationPropertyInfo[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Context\r\n */\r\nexport interface ISerializedFlowGraphContext {\r\n /**\r\n * The unique id of the context\r\n */\r\n uniqueId: string;\r\n /**\r\n * An optional user-facing name for the context\r\n */\r\n name?: string;\r\n /**\r\n * User variables\r\n */\r\n _userVariables: { [key: string]: any };\r\n /**\r\n * Optional type annotations for user variables.\r\n * Keys are variable names; values are type name strings.\r\n */\r\n _variableTypes?: { [key: string]: string };\r\n /**\r\n * Values of the connection points\r\n */\r\n _connectionValues: { [key: string]: any };\r\n\r\n /**\r\n * Assets context, if not the scene\r\n */\r\n _assetsContext?: { [key: string]: any };\r\n\r\n /**\r\n * Should logging be enabled?\r\n */\r\n enableLogging?: boolean;\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Connection\r\n */\r\nexport interface ISerializedFlowGraphConnection {\r\n /**\r\n * The unique id of the connection\r\n */\r\n uniqueId: string;\r\n /**\r\n * The name of the connection\r\n */\r\n name: string;\r\n /**\r\n * The type of the connection\r\n */\r\n _connectionType: FlowGraphConnectionType;\r\n /**\r\n * The id of the connection that this is connected to\r\n */\r\n connectedPointIds: string[];\r\n /**\r\n * Optional host-format metadata associated with this connection.\r\n */\r\n metadata?: any;\r\n /**\r\n * The serialized default value of a data connection (set by the user for\r\n * unconnected inputs). Only present on data connections.\r\n */\r\n defaultValue?: any;\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Block\r\n */\r\nexport interface ISerializedFlowGraphBlock {\r\n /**\r\n * The class name of the block\r\n */\r\n className: string;\r\n /**\r\n * The glTF type of the block\r\n */\r\n type: string;\r\n /**\r\n * Configuration parameters for the block\r\n */\r\n config: any;\r\n /**\r\n * The unique id of the block\r\n */\r\n uniqueId: string;\r\n /**\r\n * Input connection data\r\n */\r\n dataInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection data\r\n */\r\n dataOutputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Metadata for the block\r\n */\r\n metadata: any;\r\n /**\r\n * Input connection signal\r\n */\r\n signalInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection signal\r\n */\r\n signalOutputs: ISerializedFlowGraphConnection[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph\r\n */\r\nexport interface ISerializedFlowGraph {\r\n /**\r\n * Optional human-readable name for the graph\r\n */\r\n name?: string;\r\n /**\r\n * Optional unique identifier for the graph\r\n */\r\n uniqueId?: string;\r\n /**\r\n * Optional host-format metadata associated with the graph.\r\n */\r\n metadata?: any;\r\n /**\r\n * Contexts belonging to the flow graph\r\n */\r\n executionContexts: ISerializedFlowGraphContext[];\r\n /**\r\n * Blocks belonging to the flow graph\r\n */\r\n allBlocks: ISerializedFlowGraphBlock[];\r\n\r\n /**\r\n * Is the flow graph in RHS mode?\r\n */\r\n rightHanded?: boolean;\r\n /**\r\n * Optional scene-reference provenance used to disambiguate duplicate nodes.\r\n */\r\n referenceProvenance?: SerializedFlowGraphReferenceProvenance;\r\n}\r\n\r\n/**\r\n * Describes the authored identity of a serialized scene-node reference.\r\n */\r\nexport interface ISerializedFlowGraphReferenceLocation {\r\n /** Node id at serialization time. */\r\n id: string;\r\n /** Node name at serialization time. */\r\n name: string;\r\n /** Babylon class name. */\r\n className: string;\r\n /** Zero-based occurrence among same-class nodes with the same id. */\r\n idIndex: number;\r\n /** Zero-based occurrence among same-class nodes with the same name. */\r\n nameIndex: number;\r\n /** Scene identifier when the reference was captured. */\r\n sceneUid?: string;\r\n}\r\n\r\n/**\r\n * Maps serialized node unique ids to their authored scene identity.\r\n */\r\nexport type SerializedFlowGraphReferenceProvenance = Array<[number, ISerializedFlowGraphReferenceLocation]>;\r\n"]}
@@ -24,6 +24,8 @@ export class FrameGraphTAATask extends FrameGraphPostProcessTask {
24
24
  this._frameGraph.scene.onBeforeRenderObservable.remove(this._onBeforeRenderSceneObserver);
25
25
  this._onBeforeRenderSceneObserver = this._frameGraph.scene.onBeforeRenderObservable.add(() => {
26
26
  if (this.postProcess.reprojectHistory && !this.disabled) {
27
+ // the jitter is written for the camera the object renderer draws in this frame
28
+ this.postProcess.camera = this.objectRendererTask.objectRenderer.activeCamera;
27
29
  this.postProcess._updateJitter();
28
30
  }
29
31
  });
@@ -1 +1 @@
1
- {"version":3,"file":"taaTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/taaTask.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,yBAAyB;IAiB5D;;;;;OAKG;IACH,YAAY,IAAY,EAAE,UAAsB,EAAE,eAAoC;QAClF,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,IAAI,IAAI,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/F,CAAC;IAEe,YAAY;QACxB,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAEe,MAAM;QAClB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,IAAI,sDAAsD,CAAC,CAAC;QACnH,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1F,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;YACzF,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtD,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YACrC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC;QAE9D,cAAc,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7E,IAAI,CAAC,sBAAsB,GAAG,cAAc,CAAC,yBAAyB,CAAC,GAAG,CAAC,GAAG,EAAE;YAC5E,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvD,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;gBAEjC,8KAA8K;gBAC9K,MAAM,MAAM,GAAG,cAAc,CAAC,YAAa,CAAC;gBAC5C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7H,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;QACvD,MAAM,UAAU,GAAG,cAAc,CAAC,4BAA4B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEnF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC;QAE5D,MAAM,iBAAiB,GAAG,cAAc,CAAC,4BAA4B,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAE7G,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC;QAE1D,MAAM,8BAA8B,GAAqC;YACrE,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE;gBACL,aAAa,EAAE,KAAK;gBACpB,KAAK,EAAE,CAAC,SAAS,CAAC,sBAAsB,CAAC;gBACzC,OAAO,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC;gBACvC,OAAO,EAAE,CAAC;gBACV,cAAc,EAAE,CAAC,KAAK,CAAC;gBACvB,aAAa,EAAE,CAAC,CAAC,CAAC;gBAClB,MAAM,EAAE,CAAC,EAAE,CAAC;aACf;YACD,gBAAgB,EAAE,KAAK;YACvB,gBAAgB,EAAE,IAAI;SACzB,CAAC;QAEF,MAAM,cAAc,GAAG,cAAc,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC,IAAI,UAAU,EAAE,8BAA8B,CAAC,CAAC;QAExH,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAEzE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAE5C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,cAAc,CAAC,2BAA2B,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;YAChF,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC;YAEtD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACnC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAClG,CAAC;YAED,OAAO,CAAC,sBAAsB,CAAC,cAAc,EAAE,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAExF,OAAO,CAAC,qBAAqB,CACzB,IAAI,CAAC,uBAAuB,EAC5B,GAAG,EAAE;gBACD,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,aAAc,CAAC,CAAC;gBACvG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAO,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;gBAClG,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;oBAC1E,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC7G,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5B,CAAC,EACD,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,CACjB,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC;QAEnF,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAChD,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAEpD,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEjD,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC/D,YAAY,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YACpC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,OAAO;QACnB,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1F,KAAK,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;CACJ","sourcesContent":["import {\r\n type FrameGraph,\r\n type FrameGraphRenderPass,\r\n type FrameGraphObjectRendererTask,\r\n type FrameGraphTextureCreationOptions,\r\n type Observer,\r\n type ObjectRenderer,\r\n type FrameGraphTextureHandle,\r\n type Scene,\r\n} from \"core/index\";\r\nimport { ThinTAAPostProcess } from \"core/PostProcesses/thinTAAPostProcess\";\r\nimport { FrameGraphPostProcessTask } from \"./postProcessTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\n/**\r\n * Task which applies a Temporal Anti-Aliasing post process.\r\n */\r\nexport class FrameGraphTAATask extends FrameGraphPostProcessTask {\r\n public override readonly postProcess: ThinTAAPostProcess;\r\n\r\n /**\r\n * The object renderer task used to render the scene objects.\r\n */\r\n public objectRendererTask: FrameGraphObjectRendererTask;\r\n\r\n /**\r\n * The handle to the velocity texture. Only needed if postProcess.reprojectHistory is enabled.\r\n * Note that you must use the linear velocity texture!\r\n */\r\n public velocityTexture?: FrameGraphTextureHandle;\r\n\r\n protected _onBeforeRenderSceneObserver: Observer<Scene>;\r\n protected _initRenderingObserver: Observer<ObjectRenderer>;\r\n\r\n /**\r\n * Constructs a new Temporal Anti-Aliasing task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph this task is associated with.\r\n * @param thinPostProcess The thin post process to use for the Temporal Anti-Aliasing effect. If not provided, a new one will be created.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinTAAPostProcess) {\r\n super(name, frameGraph, thinPostProcess || new ThinTAAPostProcess(name, frameGraph.scene));\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphTAATask\";\r\n }\r\n\r\n public override record(): FrameGraphRenderPass {\r\n if (this.sourceTexture === undefined || this.objectRendererTask === undefined) {\r\n throw new Error(`FrameGraphPostProcessTask \"${this.name}\": sourceTexture and objectRendererTask are required`);\r\n }\r\n\r\n this._frameGraph.scene.onBeforeRenderObservable.remove(this._onBeforeRenderSceneObserver);\r\n this._onBeforeRenderSceneObserver = this._frameGraph.scene.onBeforeRenderObservable.add(() => {\r\n if (this.postProcess.reprojectHistory && !this.disabled) {\r\n this.postProcess._updateJitter();\r\n }\r\n });\r\n\r\n const objectRenderer = this.objectRendererTask.objectRenderer;\r\n\r\n objectRenderer.onInitRenderingObservable.remove(this._initRenderingObserver);\r\n this._initRenderingObserver = objectRenderer.onInitRenderingObservable.add(() => {\r\n if (!this.postProcess.reprojectHistory && !this.disabled) {\r\n this.postProcess._updateJitter();\r\n\r\n // We pass false to this.camera.getProjectionMatrix() when TAA is enabled to avoid overwriting the projection matrix calculated by the call to this.postProcess.updateJitter()\r\n const camera = objectRenderer.activeCamera!;\r\n this._frameGraph.scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(this.postProcess.disabled));\r\n }\r\n });\r\n\r\n const textureManager = this._frameGraph.textureManager;\r\n const sourceSize = textureManager.getTextureAbsoluteDimensions(this.sourceTexture);\r\n\r\n this._sourceWidth = this._outputWidth = sourceSize.width;\r\n this._sourceHeight = this._outputHeight = sourceSize.height;\r\n\r\n const renderTextureSize = textureManager.getTextureAbsoluteDimensions(this.objectRendererTask.outputTexture);\r\n\r\n this.postProcess.textureWidth = renderTextureSize.width;\r\n this.postProcess.textureHeight = renderTextureSize.height;\r\n\r\n const pingPongTextureCreationOptions: FrameGraphTextureCreationOptions = {\r\n size: sourceSize,\r\n options: {\r\n createMipMaps: false,\r\n types: [Constants.TEXTURETYPE_HALF_FLOAT],\r\n formats: [Constants.TEXTUREFORMAT_RGBA],\r\n samples: 1,\r\n useSRGBBuffers: [false],\r\n creationFlags: [0],\r\n labels: [\"\"],\r\n },\r\n sizeIsPercentage: false,\r\n isHistoryTexture: true,\r\n };\r\n\r\n const pingPongHandle = textureManager.createRenderTargetTexture(`${this.name} history`, pingPongTextureCreationOptions);\r\n\r\n textureManager.resolveDanglingHandle(this.outputTexture, pingPongHandle);\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n\r\n pass.depthReadOnly = this.depthReadOnly;\r\n pass.stencilReadOnly = this.stencilReadOnly;\r\n\r\n pass.addDependencies(this.sourceTexture);\r\n\r\n pass.setRenderTarget(this.outputTexture);\r\n pass.setRenderTargetDepth(this.depthAttachmentTexture);\r\n pass.setExecuteFunc((context) => {\r\n objectRenderer.dontSetTransformationMatrix = !this.postProcess.reprojectHistory;\r\n this.postProcess.camera = objectRenderer.activeCamera;\r\n\r\n if (this.sourceTexture !== undefined) {\r\n context.setTextureSamplingMode(this.sourceTexture, this.sourceSamplingMode);\r\n }\r\n if (this.velocityTexture !== undefined) {\r\n context.setTextureSamplingMode(this.velocityTexture, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n }\r\n\r\n context.setTextureSamplingMode(pingPongHandle, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n\r\n context.applyFullScreenEffect(\r\n this._postProcessDrawWrapper,\r\n () => {\r\n context.bindTextureHandle(this._postProcessDrawWrapper.effect!, \"textureSampler\", this.sourceTexture!);\r\n context.bindTextureHandle(this._postProcessDrawWrapper.effect!, \"historySampler\", pingPongHandle);\r\n if (this.postProcess.reprojectHistory && this.velocityTexture !== undefined) {\r\n context.bindTextureHandle(this._postProcessDrawWrapper.effect!, \"velocitySampler\", this.velocityTexture);\r\n }\r\n this.postProcess.bind();\r\n },\r\n this.stencilState,\r\n this.disableColorWrite,\r\n this.drawBackFace,\r\n this.depthTest\r\n );\r\n });\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.depthReadOnly = this.depthReadOnly;\r\n passDisabled.stencilReadOnly = this.stencilReadOnly;\r\n\r\n passDisabled.addDependencies(this.sourceTexture);\r\n\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setRenderTargetDepth(this.depthAttachmentTexture);\r\n passDisabled.setExecuteFunc((context) => {\r\n context.copyTexture(this.sourceTexture!);\r\n });\r\n\r\n return pass;\r\n }\r\n\r\n public override dispose() {\r\n this.objectRendererTask?.objectRenderer.onInitRenderingObservable.remove(this._initRenderingObserver);\r\n this._frameGraph.scene.onBeforeRenderObservable.remove(this._onBeforeRenderSceneObserver);\r\n super.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"taaTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/taaTask.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n type FrameGraph,\r\n type FrameGraphRenderPass,\r\n type FrameGraphObjectRendererTask,\r\n type FrameGraphTextureCreationOptions,\r\n type Observer,\r\n type ObjectRenderer,\r\n type FrameGraphTextureHandle,\r\n type Scene,\r\n} from \"core/index\";\r\nimport { ThinTAAPostProcess } from \"core/PostProcesses/thinTAAPostProcess\";\r\nimport { FrameGraphPostProcessTask } from \"./postProcessTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\n/**\r\n * Task which applies a Temporal Anti-Aliasing post process.\r\n */\r\nexport class FrameGraphTAATask extends FrameGraphPostProcessTask {\r\n public override readonly postProcess: ThinTAAPostProcess;\r\n\r\n /**\r\n * The object renderer task used to render the scene objects.\r\n */\r\n public objectRendererTask: FrameGraphObjectRendererTask;\r\n\r\n /**\r\n * The handle to the velocity texture. Only needed if postProcess.reprojectHistory is enabled.\r\n * Note that you must use the linear velocity texture!\r\n */\r\n public velocityTexture?: FrameGraphTextureHandle;\r\n\r\n protected _onBeforeRenderSceneObserver: Observer<Scene>;\r\n protected _initRenderingObserver: Observer<ObjectRenderer>;\r\n\r\n /**\r\n * Constructs a new Temporal Anti-Aliasing task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph this task is associated with.\r\n * @param thinPostProcess The thin post process to use for the Temporal Anti-Aliasing effect. If not provided, a new one will be created.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinTAAPostProcess) {\r\n super(name, frameGraph, thinPostProcess || new ThinTAAPostProcess(name, frameGraph.scene));\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphTAATask\";\r\n }\r\n\r\n public override record(): FrameGraphRenderPass {\r\n if (this.sourceTexture === undefined || this.objectRendererTask === undefined) {\r\n throw new Error(`FrameGraphPostProcessTask \"${this.name}\": sourceTexture and objectRendererTask are required`);\r\n }\r\n\r\n this._frameGraph.scene.onBeforeRenderObservable.remove(this._onBeforeRenderSceneObserver);\r\n this._onBeforeRenderSceneObserver = this._frameGraph.scene.onBeforeRenderObservable.add(() => {\r\n if (this.postProcess.reprojectHistory && !this.disabled) {\r\n // the jitter is written for the camera the object renderer draws in this frame\r\n this.postProcess.camera = this.objectRendererTask.objectRenderer.activeCamera;\r\n this.postProcess._updateJitter();\r\n }\r\n });\r\n\r\n const objectRenderer = this.objectRendererTask.objectRenderer;\r\n\r\n objectRenderer.onInitRenderingObservable.remove(this._initRenderingObserver);\r\n this._initRenderingObserver = objectRenderer.onInitRenderingObservable.add(() => {\r\n if (!this.postProcess.reprojectHistory && !this.disabled) {\r\n this.postProcess._updateJitter();\r\n\r\n // We pass false to this.camera.getProjectionMatrix() when TAA is enabled to avoid overwriting the projection matrix calculated by the call to this.postProcess.updateJitter()\r\n const camera = objectRenderer.activeCamera!;\r\n this._frameGraph.scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(this.postProcess.disabled));\r\n }\r\n });\r\n\r\n const textureManager = this._frameGraph.textureManager;\r\n const sourceSize = textureManager.getTextureAbsoluteDimensions(this.sourceTexture);\r\n\r\n this._sourceWidth = this._outputWidth = sourceSize.width;\r\n this._sourceHeight = this._outputHeight = sourceSize.height;\r\n\r\n const renderTextureSize = textureManager.getTextureAbsoluteDimensions(this.objectRendererTask.outputTexture);\r\n\r\n this.postProcess.textureWidth = renderTextureSize.width;\r\n this.postProcess.textureHeight = renderTextureSize.height;\r\n\r\n const pingPongTextureCreationOptions: FrameGraphTextureCreationOptions = {\r\n size: sourceSize,\r\n options: {\r\n createMipMaps: false,\r\n types: [Constants.TEXTURETYPE_HALF_FLOAT],\r\n formats: [Constants.TEXTUREFORMAT_RGBA],\r\n samples: 1,\r\n useSRGBBuffers: [false],\r\n creationFlags: [0],\r\n labels: [\"\"],\r\n },\r\n sizeIsPercentage: false,\r\n isHistoryTexture: true,\r\n };\r\n\r\n const pingPongHandle = textureManager.createRenderTargetTexture(`${this.name} history`, pingPongTextureCreationOptions);\r\n\r\n textureManager.resolveDanglingHandle(this.outputTexture, pingPongHandle);\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n\r\n pass.depthReadOnly = this.depthReadOnly;\r\n pass.stencilReadOnly = this.stencilReadOnly;\r\n\r\n pass.addDependencies(this.sourceTexture);\r\n\r\n pass.setRenderTarget(this.outputTexture);\r\n pass.setRenderTargetDepth(this.depthAttachmentTexture);\r\n pass.setExecuteFunc((context) => {\r\n objectRenderer.dontSetTransformationMatrix = !this.postProcess.reprojectHistory;\r\n this.postProcess.camera = objectRenderer.activeCamera;\r\n\r\n if (this.sourceTexture !== undefined) {\r\n context.setTextureSamplingMode(this.sourceTexture, this.sourceSamplingMode);\r\n }\r\n if (this.velocityTexture !== undefined) {\r\n context.setTextureSamplingMode(this.velocityTexture, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n }\r\n\r\n context.setTextureSamplingMode(pingPongHandle, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n\r\n context.applyFullScreenEffect(\r\n this._postProcessDrawWrapper,\r\n () => {\r\n context.bindTextureHandle(this._postProcessDrawWrapper.effect!, \"textureSampler\", this.sourceTexture!);\r\n context.bindTextureHandle(this._postProcessDrawWrapper.effect!, \"historySampler\", pingPongHandle);\r\n if (this.postProcess.reprojectHistory && this.velocityTexture !== undefined) {\r\n context.bindTextureHandle(this._postProcessDrawWrapper.effect!, \"velocitySampler\", this.velocityTexture);\r\n }\r\n this.postProcess.bind();\r\n },\r\n this.stencilState,\r\n this.disableColorWrite,\r\n this.drawBackFace,\r\n this.depthTest\r\n );\r\n });\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.depthReadOnly = this.depthReadOnly;\r\n passDisabled.stencilReadOnly = this.stencilReadOnly;\r\n\r\n passDisabled.addDependencies(this.sourceTexture);\r\n\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setRenderTargetDepth(this.depthAttachmentTexture);\r\n passDisabled.setExecuteFunc((context) => {\r\n context.copyTexture(this.sourceTexture!);\r\n });\r\n\r\n return pass;\r\n }\r\n\r\n public override dispose() {\r\n this.objectRendererTask?.objectRenderer.onInitRenderingObservable.remove(this._initRenderingObserver);\r\n this._frameGraph.scene.onBeforeRenderObservable.remove(this._onBeforeRenderSceneObserver);\r\n super.dispose();\r\n }\r\n}\r\n"]}
@@ -13,6 +13,7 @@ export declare class EngineInstrumentation implements IDisposable {
13
13
  private _captureGPUFrameTime;
14
14
  private _captureShaderCompilationTime;
15
15
  private _shaderCompilationTime;
16
+ private _shaderCompilationStartTimes;
16
17
  private _onBeginFrameObserver;
17
18
  private _onEndFrameObserver;
18
19
  private _onBeforeShaderCompilationObserver;
@@ -1,4 +1,5 @@
1
1
  import { PerfCounter } from "../Misc/perfCounter.js";
2
+ import { PrecisionDate } from "../Misc/precisionDate.js";
2
3
  /**
3
4
  * This class can be used to get instrumentation data from a Babylon engine
4
5
  * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation
@@ -48,13 +49,28 @@ export class EngineInstrumentation {
48
49
  }
49
50
  this._captureShaderCompilationTime = value;
50
51
  if (value) {
51
- this._onBeforeShaderCompilationObserver = this.engine.onBeforeShaderCompilationObservable.add(() => {
52
- this._shaderCompilationTime.fetchNewFrame();
53
- this._shaderCompilationTime.beginMonitoring();
52
+ this._onBeforeShaderCompilationObserver = this.engine.onBeforeShaderCompilationObservable.add((_engine, state) => {
53
+ if (state.target) {
54
+ this._shaderCompilationStartTimes.set(state.target, PrecisionDate.Now);
55
+ }
56
+ else {
57
+ this._shaderCompilationTime.fetchNewFrame();
58
+ this._shaderCompilationTime.beginMonitoring();
59
+ }
54
60
  });
55
- this._onAfterShaderCompilationObserver = this.engine.onAfterShaderCompilationObservable.add(() => {
56
- this._shaderCompilationTime.endMonitoring(false);
57
- this._shaderCompilationTime.endFrame();
61
+ this._onAfterShaderCompilationObserver = this.engine.onAfterShaderCompilationObservable.add((_engine, state) => {
62
+ if (state.target) {
63
+ const startTime = this._shaderCompilationStartTimes.get(state.target);
64
+ if (startTime !== undefined) {
65
+ this._shaderCompilationStartTimes.delete(state.target);
66
+ this._shaderCompilationTime.fetchNewFrame();
67
+ this._shaderCompilationTime.addCount(PrecisionDate.Now - startTime, true);
68
+ }
69
+ }
70
+ else {
71
+ this._shaderCompilationTime.endMonitoring(false);
72
+ this._shaderCompilationTime.endFrame();
73
+ }
58
74
  });
59
75
  }
60
76
  else {
@@ -62,6 +78,7 @@ export class EngineInstrumentation {
62
78
  this._onBeforeShaderCompilationObserver = null;
63
79
  this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);
64
80
  this._onAfterShaderCompilationObserver = null;
81
+ this._shaderCompilationStartTimes = new WeakMap();
65
82
  }
66
83
  }
67
84
  /**
@@ -79,6 +96,7 @@ export class EngineInstrumentation {
79
96
  this._captureGPUFrameTime = false;
80
97
  this._captureShaderCompilationTime = false;
81
98
  this._shaderCompilationTime = new PerfCounter();
99
+ this._shaderCompilationStartTimes = new WeakMap();
82
100
  // Observers
83
101
  this._onBeginFrameObserver = null;
84
102
  this._onEndFrameObserver = null;
@@ -101,6 +119,7 @@ export class EngineInstrumentation {
101
119
  this._onBeforeShaderCompilationObserver = null;
102
120
  this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);
103
121
  this._onAfterShaderCompilationObserver = null;
122
+ this._shaderCompilationStartTimes = new WeakMap();
104
123
  this.engine = null;
105
124
  this._disposed = true;
106
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engineInstrumentation.js","sourceRoot":"","sources":["../../../../dev/core/src/Instrumentation/engineInstrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Observer } from \"../Misc/observable\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport { type Nullable } from \"../types\";\r\nimport { type IDisposable } from \"../scene\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\n/**\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n */\r\nexport class EngineInstrumentation implements IDisposable {\r\n private _captureGPUFrameTime = false;\r\n\r\n private _captureShaderCompilationTime = false;\r\n private _shaderCompilationTime = new PerfCounter();\r\n\r\n // Observers\r\n private _onBeginFrameObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onEndFrameObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onBeforeShaderCompilationObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onAfterShaderCompilationObserver: Nullable<Observer<AbstractEngine>> = null;\r\n\r\n private _disposed = false;\r\n\r\n // Properties\r\n /**\r\n * Gets the perf counter used for GPU frame time\r\n */\r\n public get gpuFrameTimeCounter(): PerfCounter {\r\n return this.engine.getGPUFrameTimeCounter();\r\n }\r\n\r\n /**\r\n * Gets the GPU frame time capture status\r\n */\r\n public get captureGPUFrameTime(): boolean {\r\n return this._captureGPUFrameTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the GPU frame time capture\r\n */\r\n public set captureGPUFrameTime(value: boolean) {\r\n if (value === this._captureGPUFrameTime) {\r\n return;\r\n }\r\n\r\n this._captureGPUFrameTime = value;\r\n this.engine.captureGPUFrameTime(value);\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for shader compilation time\r\n */\r\n public get shaderCompilationTimeCounter(): PerfCounter {\r\n return this._shaderCompilationTime;\r\n }\r\n\r\n /**\r\n * Gets the shader compilation time capture status\r\n */\r\n public get captureShaderCompilationTime(): boolean {\r\n return this._captureShaderCompilationTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the shader compilation time capture\r\n */\r\n public set captureShaderCompilationTime(value: boolean) {\r\n if (value === this._captureShaderCompilationTime) {\r\n return;\r\n }\r\n\r\n this._captureShaderCompilationTime = value;\r\n\r\n if (value) {\r\n this._onBeforeShaderCompilationObserver = this.engine.onBeforeShaderCompilationObservable.add(() => {\r\n this._shaderCompilationTime.fetchNewFrame();\r\n this._shaderCompilationTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterShaderCompilationObserver = this.engine.onAfterShaderCompilationObservable.add(() => {\r\n this._shaderCompilationTime.endMonitoring(false);\r\n this._shaderCompilationTime.endFrame();\r\n });\r\n } else {\r\n this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver);\r\n this._onBeforeShaderCompilationObserver = null;\r\n this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);\r\n this._onAfterShaderCompilationObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates a new engine instrumentation.\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n * @param engine Defines the engine to instrument\r\n */\r\n public constructor(\r\n /**\r\n * Define the instrumented engine.\r\n */\r\n public engine: AbstractEngine\r\n ) {}\r\n\r\n /**\r\n * Dispose and release associated resources.\r\n */\r\n public dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this.engine.onBeginFrameObservable.remove(this._onBeginFrameObserver);\r\n this._onBeginFrameObserver = null;\r\n\r\n this.engine.onEndFrameObservable.remove(this._onEndFrameObserver);\r\n this._onEndFrameObserver = null;\r\n\r\n this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver);\r\n this._onBeforeShaderCompilationObserver = null;\r\n\r\n this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);\r\n this._onAfterShaderCompilationObserver = null;\r\n\r\n (<any>this.engine) = null;\r\n this._disposed = true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"engineInstrumentation.js","sourceRoot":"","sources":["../../../../dev/core/src/Instrumentation/engineInstrumentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IAe9B,aAAa;IACb;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,mBAAmB,CAAC,KAAc;QACzC,IAAI,KAAK,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,IAAW,4BAA4B;QACnC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,4BAA4B;QACnC,OAAO,IAAI,CAAC,6BAA6B,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,IAAW,4BAA4B,CAAC,KAAc;QAClD,IAAI,KAAK,KAAK,IAAI,CAAC,6BAA6B,EAAE,CAAC;YAC/C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC;QAE3C,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;gBAC7G,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACf,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;gBAC3E,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC;oBAC5C,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,CAAC;gBAClD,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;gBAC3G,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACf,MAAM,SAAS,GAAG,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;wBAC1B,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBACvD,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC;wBAC5C,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;oBAC9E,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBACjD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;gBAC3C,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAChG,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC9F,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;YAC9C,IAAI,CAAC,4BAA4B,GAAG,IAAI,OAAO,EAAE,CAAC;QACtD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH;IACI;;OAEG;IACI,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;QA3GzB,yBAAoB,GAAG,KAAK,CAAC;QAE7B,kCAA6B,GAAG,KAAK,CAAC;QACtC,2BAAsB,GAAG,IAAI,WAAW,EAAE,CAAC;QAC3C,iCAA4B,GAAG,IAAI,OAAO,EAA4B,CAAC;QAE/E,YAAY;QACJ,0BAAqB,GAAuC,IAAI,CAAC;QACjE,wBAAmB,GAAuC,IAAI,CAAC;QAC/D,uCAAkC,GAAuC,IAAI,CAAC;QAC9E,sCAAiC,GAAuC,IAAI,CAAC;QAE7E,cAAS,GAAG,KAAK,CAAC;IAgGvB,CAAC;IAEJ;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACtE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAEhC,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChG,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9F,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,4BAA4B,GAAG,IAAI,OAAO,EAAE,CAAC;QAE5C,IAAI,CAAC,MAAO,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;CACJ","sourcesContent":["import { type Observer } from \"../Misc/observable\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport { type Nullable } from \"../types\";\r\nimport { type IDisposable } from \"../scene\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { type IPipelineContext } from \"../Engines/IPipelineContext\";\r\nimport { PrecisionDate } from \"../Misc/precisionDate\";\r\n/**\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n */\r\nexport class EngineInstrumentation implements IDisposable {\r\n private _captureGPUFrameTime = false;\r\n\r\n private _captureShaderCompilationTime = false;\r\n private _shaderCompilationTime = new PerfCounter();\r\n private _shaderCompilationStartTimes = new WeakMap<IPipelineContext, number>();\r\n\r\n // Observers\r\n private _onBeginFrameObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onEndFrameObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onBeforeShaderCompilationObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onAfterShaderCompilationObserver: Nullable<Observer<AbstractEngine>> = null;\r\n\r\n private _disposed = false;\r\n\r\n // Properties\r\n /**\r\n * Gets the perf counter used for GPU frame time\r\n */\r\n public get gpuFrameTimeCounter(): PerfCounter {\r\n return this.engine.getGPUFrameTimeCounter();\r\n }\r\n\r\n /**\r\n * Gets the GPU frame time capture status\r\n */\r\n public get captureGPUFrameTime(): boolean {\r\n return this._captureGPUFrameTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the GPU frame time capture\r\n */\r\n public set captureGPUFrameTime(value: boolean) {\r\n if (value === this._captureGPUFrameTime) {\r\n return;\r\n }\r\n\r\n this._captureGPUFrameTime = value;\r\n this.engine.captureGPUFrameTime(value);\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for shader compilation time\r\n */\r\n public get shaderCompilationTimeCounter(): PerfCounter {\r\n return this._shaderCompilationTime;\r\n }\r\n\r\n /**\r\n * Gets the shader compilation time capture status\r\n */\r\n public get captureShaderCompilationTime(): boolean {\r\n return this._captureShaderCompilationTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the shader compilation time capture\r\n */\r\n public set captureShaderCompilationTime(value: boolean) {\r\n if (value === this._captureShaderCompilationTime) {\r\n return;\r\n }\r\n\r\n this._captureShaderCompilationTime = value;\r\n\r\n if (value) {\r\n this._onBeforeShaderCompilationObserver = this.engine.onBeforeShaderCompilationObservable.add((_engine, state) => {\r\n if (state.target) {\r\n this._shaderCompilationStartTimes.set(state.target, PrecisionDate.Now);\r\n } else {\r\n this._shaderCompilationTime.fetchNewFrame();\r\n this._shaderCompilationTime.beginMonitoring();\r\n }\r\n });\r\n\r\n this._onAfterShaderCompilationObserver = this.engine.onAfterShaderCompilationObservable.add((_engine, state) => {\r\n if (state.target) {\r\n const startTime = this._shaderCompilationStartTimes.get(state.target);\r\n if (startTime !== undefined) {\r\n this._shaderCompilationStartTimes.delete(state.target);\r\n this._shaderCompilationTime.fetchNewFrame();\r\n this._shaderCompilationTime.addCount(PrecisionDate.Now - startTime, true);\r\n }\r\n } else {\r\n this._shaderCompilationTime.endMonitoring(false);\r\n this._shaderCompilationTime.endFrame();\r\n }\r\n });\r\n } else {\r\n this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver);\r\n this._onBeforeShaderCompilationObserver = null;\r\n this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);\r\n this._onAfterShaderCompilationObserver = null;\r\n this._shaderCompilationStartTimes = new WeakMap();\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates a new engine instrumentation.\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n * @param engine Defines the engine to instrument\r\n */\r\n public constructor(\r\n /**\r\n * Define the instrumented engine.\r\n */\r\n public engine: AbstractEngine\r\n ) {}\r\n\r\n /**\r\n * Dispose and release associated resources.\r\n */\r\n public dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this.engine.onBeginFrameObservable.remove(this._onBeginFrameObserver);\r\n this._onBeginFrameObserver = null;\r\n\r\n this.engine.onEndFrameObservable.remove(this._onEndFrameObserver);\r\n this._onEndFrameObserver = null;\r\n\r\n this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver);\r\n this._onBeforeShaderCompilationObserver = null;\r\n\r\n this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);\r\n this._onAfterShaderCompilationObserver = null;\r\n this._shaderCompilationStartTimes = new WeakMap();\r\n\r\n (<any>this.engine) = null;\r\n this._disposed = true;\r\n }\r\n}\r\n"]}
@@ -261,6 +261,7 @@ let ClusteredLightContainer = (() => {
261
261
  // Ensure space for atleast 1 batch
262
262
  const batches = Math.max(Math.ceil(this._sortedLights.length / this._batchSize), 1);
263
263
  if (this._tileMaskBatches >= batches) {
264
+ this._tileMaskTexture.activeCamera = camera;
264
265
  this._proxyMesh.thinInstanceCount = this._sortedLights.length;
265
266
  return this._tileMaskTexture;
266
267
  }
@@ -287,6 +288,7 @@ let ClusteredLightContainer = (() => {
287
288
  this._tileMaskTexture.renderParticles = false;
288
289
  this._tileMaskTexture.renderSprites = false;
289
290
  this._tileMaskTexture.noPrePassRenderer = true;
291
+ this._tileMaskTexture.activeCamera = camera;
290
292
  this._tileMaskTexture.renderList = [this._proxyMesh];
291
293
  let currentRenderTarget = null;
292
294
  this._tileMaskTexture.onBeforeBindObservable.add(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"clusteredLightContainer.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Lights/Clustered/clusteredLightContainer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\nimport { type Camera } from \"core/Cameras/camera.pure\";\nimport { type AbstractEngine } from \"core/Engines/abstractEngine.pure\";\nimport { Constants } from \"core/Engines/constants\";\nimport { type WebGPUEngine } from \"core/Engines/webgpuEngine.pure\";\nimport { type Effect } from \"core/Materials/effect.pure\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial.pure\";\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture.pure\";\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\nimport { TmpColors } from \"core/Maths/math.color.pure\";\nimport { TmpVectors, Vector3 } from \"core/Maths/math.vector.pure\";\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder.pure\";\nimport { type Mesh } from \"core/Meshes/mesh.pure\";\nimport { serialize } from \"core/Misc/decorators\";\nimport { _WarnImport } from \"core/Misc/devTools\";\nimport { Logger } from \"core/Misc/logger\";\nimport { type Scene } from \"core/scene.pure\";\nimport { type Nullable } from \"core/types\";\nimport { Light } from \"../light\";\nimport { LightConstants } from \"../lightConstants\";\nimport { type PointLight } from \"../pointLight.pure\";\nimport { type SpotLight } from \"../spotLight.pure\";\nimport { type RenderTargetWrapper } from \"../../Engines/renderTargetWrapper\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\nimport { Node } from \"core/node\";\nimport { RegisterClusteredLightingSceneComponent } from \"./clusteredLightingSceneComponent.pure\";\nimport { RegisterEnginesExtensionsEngineRawTexture } from \"core/Engines/Extensions/engine.rawTexture.pure\";\nimport { RegisterEnginesExtensionsEngineRenderTarget } from \"core/Engines/Extensions/engine.renderTarget.pure\";\nimport { RegisterEnginesExtensionsEngineRenderTargetTexture } from \"core/Engines/Extensions/engine.renderTargetTexture.pure\";\nimport { RegisterThinInstanceMesh } from \"core/Meshes/thinInstanceMesh.pure\";\n\nconst DefaultDepthSlices = 16;\nconst MobileClusteredLightBatchSize = 8;\n\n/**\n * A special light that renders all its associated spot or point lights using a clustered or forward+ system.\n */\nexport class ClusteredLightContainer extends Light {\n private static _GetEngineBatchSize(engine: AbstractEngine): number {\n const caps = engine._caps;\n if (!caps.texelFetch) {\n return 0;\n } else if (engine.isWebGPU) {\n // On WebGPU we use atomic writes to storage buffers\n return 32;\n } else if (engine.version > 1) {\n // On WebGL 2 we use additive float blending as the light mask\n if (!caps.colorBufferFloat || !caps.blendFloat) {\n return 0;\n }\n // Due to the use of floats we want to limit lights to the precision of floats\n // The reduced precision for mobiles is because some devices (like Samsung Galaxy) report support for R32F but actually create the texture with less precision.\n return engine.hostInformation.isMobile ? MobileClusteredLightBatchSize : caps.shaderFloatPrecision;\n } else {\n // WebGL 1 is not supported due to lack of dynamic for loops\n return 0;\n }\n }\n\n /**\n * Checks if the clustered lighting system supports the given light with its current parameters.\n * This will also check if the light's associated engine supports clustered lighting.\n *\n * @param light The light to test\n * @returns true if the light and its engine is supported\n */\n public static IsLightSupported(light: Light): boolean {\n if (ClusteredLightContainer._GetEngineBatchSize(light.getEngine()) === 0) {\n return false;\n }\n\n if (light.shadowEnabled && light._scene.shadowsEnabled && light.getShadowGenerators()) {\n // Shadows are not supported\n return false;\n }\n\n if (light.falloffType !== Light.FALLOFF_DEFAULT) {\n // Only the default falloff is supported\n return false;\n }\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_POINTLIGHT) {\n return true;\n }\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n // Extra texture bindings per light are not supported\n return !(<SpotLight>light).projectionTexture && !(<SpotLight>light).iesProfileTexture;\n }\n\n // Currently only point and spot lights are supported\n return false;\n }\n\n /** @internal */\n public static _SceneComponentInitialization: (scene: Scene) => void = () => {\n throw _WarnImport(\"ClusteredLightingSceneComponent\");\n };\n\n private readonly _batchSize: number;\n\n /**\n * True if clustered lighting is supported.\n */\n public get isSupported(): boolean {\n return this._batchSize > 0;\n }\n\n private readonly _lights: Light[] = [];\n /**\n * Gets the current list of lights added to this clustering system.\n */\n public get lights(): readonly Light[] {\n return this._lights;\n }\n\n private _camera: Nullable<Camera> = null;\n\n // The lights sorted by depth\n private readonly _sortedLights: (PointLight | SpotLight)[] = [];\n\n private _lightDataBuffer: Float32Array;\n private _lightDataTexture: RawTexture;\n private _lightDataRenderId = -1;\n\n private _tileMaskBatches = -1;\n private _tileMaskTexture: RenderTargetTexture;\n private _tileMaskBuffer: Nullable<StorageBuffer>;\n\n private _horizontalTiles = 64;\n /**\n * The number of tiles in the horizontal direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get horizontalTiles(): number {\n return this._horizontalTiles;\n }\n\n public set horizontalTiles(horizontal: number) {\n if (this._horizontalTiles === horizontal) {\n return;\n }\n this._horizontalTiles = horizontal;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private _verticalTiles = 64;\n /**\n * The number of tiles in the vertical direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get verticalTiles(): number {\n return this._verticalTiles;\n }\n\n public set verticalTiles(vertical: number) {\n if (this._verticalTiles === vertical) {\n return;\n }\n this._verticalTiles = vertical;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private _sliceScale = 0;\n private _sliceBias = 0;\n // List of vec2's that keep track of the min and max index per slice\n private _sliceRanges: Float32Array<ArrayBuffer>;\n // Tracks the last lightIndex string passed to transferToEffect, or null if the cluster\n // has not yet been bound. Used to refresh the camera-dependent UBO entries (vSliceData /\n // vSliceRanges) every frame in cases where material binding is bypassed (e.g. WebGPU FAST\n // snapshot rendering replays cached bundles and never re-runs Light._bindLight).\n private _lastBoundLightIndex: Nullable<string> = null;\n\n private _depthSlices = DefaultDepthSlices;\n /**\n * The number of slices to split the depth range by and cluster lights into.\n */\n @serialize()\n public get depthSlices(): number {\n return this._depthSlices;\n }\n\n public set depthSlices(slices: number) {\n if (this._depthSlices === slices) {\n return;\n }\n this._depthSlices = slices;\n this._sliceRanges = new Float32Array(slices * 2);\n\n // UBO size depends on the number of depth slices\n this._uniformBuffer.dispose();\n this._uniformBuffer = new UniformBuffer(this.getEngine(), undefined, undefined, this.name);\n this._buildUniformLayout();\n // The UBO has been recreated so previous bindings are no longer valid; transferToEffect will repopulate it.\n this._lastBoundLightIndex = null;\n\n // CLUSTLIGHT_SLICES is a shader define that sizes the vSliceRanges array in the UBO.\n // Materials must recompile when depthSlices changes so the shader layout matches the rebuilt UBO.\n // Otherwise, if depthSlices is reduced, the rebuilt UBO can be smaller than what the previously compiled shader expects, causing rendering to fail.\n this._markMeshesAsLightDirty();\n }\n\n private readonly _proxyMaterial: ShaderMaterial;\n private readonly _proxyMesh: Mesh;\n\n private _maxRange = 16383;\n private _minInverseSquaredRange = 1 / (this._maxRange * this._maxRange);\n /**\n * This limits the range of all the added lights, so even lights with extreme ranges will still have bounds for clustering.\n */\n @serialize()\n public get maxRange(): number {\n return this._maxRange;\n }\n\n public set maxRange(range: number) {\n if (this._maxRange === range) {\n return;\n }\n this._maxRange = range;\n this._minInverseSquaredRange = 1 / (range * range);\n }\n\n /**\n * Creates a new clustered light system with an initial set of lights.\n *\n * @param name The name of the clustered light container\n * @param lights The initial set of lights to add\n * @param scene The scene the clustered light container belongs to\n */\n constructor(name: string, lights: Light[] = [], scene?: Scene) {\n super(name, scene);\n const engine = this.getEngine();\n this._batchSize = ClusteredLightContainer._GetEngineBatchSize(engine);\n\n // Clustered lighting relies on engine and mesh side effects that are not part of the\n // pure import baseline. Register them here (idempotently) so the feature works on the\n // tree-shakeable path without requiring callers to import these extensions manually.\n // Without this, createRawTexture/createRenderTargetTexture throw and the thin-instance\n // setters silently no-op, leaving the scene unlit with no error.\n RegisterEnginesExtensionsEngineRawTexture();\n RegisterEnginesExtensionsEngineRenderTarget();\n RegisterEnginesExtensionsEngineRenderTargetTexture();\n RegisterThinInstanceMesh();\n\n const proxyShader = { vertex: \"lightProxy\", fragment: \"lightProxy\" };\n const defines = [`CLUSTLIGHT_BATCH ${this._batchSize}`];\n if (this._scene.useRightHandedSystem) {\n defines.push(\"#define RIGHT_HANDED\");\n }\n this._proxyMaterial = new ShaderMaterial(\"ProxyMaterial\", this._scene, proxyShader, {\n attributes: [\"position\"],\n uniforms: [\"view\", \"projection\", \"tileMaskResolution\"],\n samplers: [\"lightDataTexture\"],\n uniformBuffers: [\"Scene\"],\n storageBuffers: [\"tileMaskBuffer\"],\n defines,\n shaderLanguage: engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (engine.isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/lightProxy.vertex\"), import(\"../../ShadersWGSL/lightProxy.fragment\")]);\n } else {\n await Promise.all([import(\"../../Shaders/lightProxy.vertex\"), import(\"../../Shaders/lightProxy.fragment\")]);\n }\n },\n });\n\n // Additive blending is for merging masks on WebGL\n this._proxyMaterial.transparencyMode = ShaderMaterial.MATERIAL_ALPHABLEND;\n this._proxyMaterial.alphaMode = Constants.ALPHA_ADD;\n this._proxyMaterial.sideOrientation = Constants.MATERIAL_CounterClockWiseSideOrientation;\n const originBlockState = this._scene._blockEntityCollection;\n this._scene._blockEntityCollection = true;\n this._proxyMesh = CreatePlane(\"ProxyMesh\", { size: 2 }, this._scene);\n // Make sure it doesn't render for the default scene\n this._scene.removeMesh(this._proxyMesh);\n this._scene._blockEntityCollection = originBlockState;\n this._proxyMesh.material = this._proxyMaterial;\n\n this._updateBatches();\n\n this._sliceRanges = new Float32Array(this._depthSlices * 2);\n\n if (this._batchSize > 0) {\n RegisterClusteredLightingSceneComponent(ClusteredLightContainer);\n ClusteredLightContainer._SceneComponentInitialization(this._scene);\n for (const light of lights) {\n this.addLight(light);\n }\n }\n }\n\n public override getClassName(): string {\n return \"ClusteredLightContainer\";\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override getTypeID(): number {\n return LightConstants.LIGHTTYPEID_CLUSTERED_CONTAINER;\n }\n\n /** @internal */\n public _updateBatches(camera: Nullable<Camera> = null): RenderTargetTexture {\n this._camera = camera;\n this._proxyMesh.isVisible = this._sortedLights.length > 0;\n\n // Ensure space for atleast 1 batch\n const batches = Math.max(Math.ceil(this._sortedLights.length / this._batchSize), 1);\n if (this._tileMaskBatches >= batches) {\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n return this._tileMaskTexture;\n }\n const engine = this.getEngine();\n // Round up to a batch size so we don't have to reallocate as often\n const maxLights = batches * this._batchSize;\n\n this._lightDataBuffer = new Float32Array(20 * maxLights);\n this._lightDataTexture?.dispose();\n this._lightDataTexture = new RawTexture(\n this._lightDataBuffer,\n 5,\n maxLights,\n Constants.TEXTUREFORMAT_RGBA,\n this._scene,\n false,\n false,\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n Constants.TEXTURETYPE_FLOAT\n );\n this._lightDataTexture.name = \"LightDataTexture_clustered_\" + this.name;\n this._proxyMaterial.setTexture(\"lightDataTexture\", this._lightDataTexture);\n\n this._tileMaskTexture?.dispose();\n const textureSize = { width: this._horizontalTiles, height: this._verticalTiles };\n if (!engine.isWebGPU) {\n // In WebGL we shift the light proxy by the batch number\n textureSize.height *= batches;\n }\n this._tileMaskTexture = new RenderTargetTexture(\"TileMaskTexture\", textureSize, this._scene, {\n // We don't write anything on WebGPU so make it as small as possible\n type: engine.isWebGPU ? Constants.TEXTURETYPE_UNSIGNED_BYTE : Constants.TEXTURETYPE_FLOAT,\n format: Constants.TEXTUREFORMAT_RED,\n generateDepthBuffer: false,\n });\n\n this._tileMaskTexture.renderParticles = false;\n this._tileMaskTexture.renderSprites = false;\n this._tileMaskTexture.noPrePassRenderer = true;\n this._tileMaskTexture.renderList = [this._proxyMesh];\n\n let currentRenderTarget: Nullable<RenderTargetWrapper> = null;\n\n this._tileMaskTexture.onBeforeBindObservable.add(() => {\n currentRenderTarget = engine._currentRenderTarget;\n this._updateLightData();\n // On WebGPU, clear the storage buffer here (before bindFramebuffer) because\n // clearBuffer is a command encoder operation that cannot run while a render pass is open.\n // In snapshot rendering mode, bindFramebuffer eagerly creates the render pass, so\n // clearing must happen before that point.\n if (engine.isWebGPU) {\n this._tileMaskBuffer?.clear();\n }\n });\n\n this._tileMaskTexture.onAfterUnbindObservable.add(() => {\n if (engine._currentRenderTarget !== currentRenderTarget) {\n if (!currentRenderTarget) {\n engine.restoreDefaultFramebuffer();\n } else {\n engine.bindFramebuffer(currentRenderTarget);\n }\n }\n });\n\n this._tileMaskTexture.onClearObservable.add(() => {\n if (!engine.isWebGPU) {\n // Only clear the texture on WebGL\n engine.clear({ r: 0, g: 0, b: 0, a: 1 }, true, false);\n }\n });\n\n if (engine.isWebGPU) {\n // WebGPU also needs a storage buffer to write to\n this._tileMaskBuffer?.dispose();\n const bufferSize = this._horizontalTiles * this._verticalTiles * batches * 4;\n this._tileMaskBuffer = new StorageBuffer(<WebGPUEngine>engine, bufferSize);\n this._proxyMaterial.setStorageBuffer(\"tileMaskBuffer\", this._tileMaskBuffer);\n }\n\n this._proxyMaterial.setVector3(\"tileMaskResolution\", new Vector3(this._horizontalTiles, this.verticalTiles, batches));\n\n // We don't actually use the matrix data but we need enough capacity for the lights\n if (this._proxyMesh.thinInstanceSetBuffer) {\n this._proxyMesh.thinInstanceSetBuffer(\"matrix\", new Float32Array(maxLights * 16));\n }\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n this._tileMaskBatches = batches;\n return this._tileMaskTexture;\n }\n\n private _getSliceIndex(camera: Camera, depth: number): number {\n if (depth < camera.minZ) {\n // Prevent calling log on small or negative values\n return -1;\n }\n return Math.floor(Math.log(depth) * this._sliceScale + this._sliceBias);\n }\n\n private _updateLightData(): void {\n const camera = this._camera || this._scene.activeCamera;\n const renderId = this._scene.getRenderId();\n if (!camera || this._lightDataRenderId === renderId) {\n return;\n }\n this._lightDataRenderId = renderId;\n\n // Resort lights based on distance from camera\n const view = camera.getViewMatrix();\n for (const light of this._sortedLights) {\n const position = light.computeTransformedInformation() ? light.transformedPosition : light.position;\n const viewPosition = Vector3.TransformCoordinatesToRef(position, view, TmpVectors.Vector3[0]);\n light._currentViewDepth = this._scene.useRightHandedSystem ? -viewPosition.z : viewPosition.z;\n }\n this._sortedLights.sort((a, b) => a._currentViewDepth - b._currentViewDepth);\n\n // DOOM 2016 subdivision scheme, copied from: https://www.aortiz.me/2018/12/21/CG.html\n const logFarNear = Math.log(camera.maxZ / camera.minZ);\n this._sliceScale = this._depthSlices / logFarNear;\n this._sliceBias = -(this._depthSlices * Math.log(camera.minZ)) / logFarNear;\n\n this._sliceRanges.fill(0);\n // Last slice which had had its min index updated\n let minSlice = -1;\n\n const buf = this._lightDataBuffer;\n const offset = this._scene.floatingOriginOffset;\n\n for (let i = 0; i < this._sortedLights.length; i += 1) {\n const light = this._sortedLights[i];\n const off = i * 20;\n const computed = light.computeTransformedInformation();\n const scaledIntensity = light.getScaledIntensity();\n\n const position = computed ? light.transformedPosition : light.position;\n const diffuse = light.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]);\n const specular = light.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]);\n const range = Math.min(light.range, this.maxRange);\n const inverseSquaredRange = Math.max(light._inverseSquaredRange, this._minInverseSquaredRange);\n\n // vLightData\n buf[off + 0] = position.x - offset.x;\n buf[off + 1] = position.y - offset.y;\n buf[off + 2] = position.z - offset.z;\n buf[off + 3] = 0;\n // vLightDiffuse\n buf[off + 4] = diffuse.r;\n buf[off + 5] = diffuse.g;\n buf[off + 6] = diffuse.b;\n buf[off + 7] = range;\n // vLightSpecular\n buf[off + 8] = specular.r;\n buf[off + 9] = specular.g;\n buf[off + 10] = specular.b;\n buf[off + 11] = light.radius;\n // vLightDirection\n buf[off + 12] = 0;\n buf[off + 13] = 0;\n buf[off + 14] = 0;\n buf[off + 15] = -1;\n // vLightFalloff\n buf[off + 16] = range;\n buf[off + 17] = inverseSquaredRange;\n buf[off + 18] = 0;\n buf[off + 19] = 0;\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n const spotLight = <SpotLight>light;\n const direction = Vector3.NormalizeToRef(computed ? spotLight.transformedDirection : spotLight.direction, TmpVectors.Vector3[0]);\n\n // vLightData.a\n buf[off + 3] = spotLight.exponent;\n // vLightDirection\n buf[off + 12] = direction.x;\n buf[off + 13] = direction.y;\n buf[off + 14] = direction.z;\n buf[off + 15] = spotLight._cosHalfAngle;\n // vLightFalloff.zw\n buf[off + 18] = spotLight._lightAngleScale;\n buf[off + 19] = spotLight._lightAngleOffset;\n }\n\n // Update the depth slices that include this light\n const firstSlice = this._getSliceIndex(camera, light._currentViewDepth - range);\n const lastSlice = this._getSliceIndex(camera, light._currentViewDepth + range);\n for (let j = firstSlice; j <= lastSlice; j += 1) {\n if (j < 0 || j >= this._depthSlices) {\n continue;\n } else if (j > minSlice) {\n // Update min index\n this._sliceRanges[j * 2] = i;\n minSlice = j;\n }\n // Update max index\n this._sliceRanges[j * 2 + 1] = i;\n }\n }\n\n const engine = this.getEngine();\n if (engine.isWebGPU) {\n // Whenever the light data changes we have to flush pending WebGPU command buffers so that\n // previous render passes use the old data and later render passes use the new data.\n engine.flushFramebuffer();\n }\n this._lightDataTexture.update(this._lightDataBuffer);\n\n // Refresh camera-dependent UBO fields when running under FAST snapshot rendering, where\n // ObjectRenderer.render bypasses the rendering manager and Light._bindLight is not\n // re-invoked each frame. Without this, transferToEffect would never run again after the\n // recording frame and the slice data would stay frozen, producing visibly stale lighting\n // as the camera moves. STANDARD snapshot mode and non-snapshot rendering still go through\n // material binding each frame, so transferToEffect already keeps the UBO up to date.\n if (this._lastBoundLightIndex !== null && engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST) {\n this._uniformBuffer.updateFloat2(\"vSliceData\", this._sliceScale, this._sliceBias, this._lastBoundLightIndex);\n this._uniformBuffer.updateFloatArray(\"vSliceRanges\", this._sliceRanges, this._lastBoundLightIndex);\n this._uniformBuffer.update();\n }\n }\n\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void {\n for (const light of this._lights) {\n if (light._clusteredContainer) {\n light._clusteredContainer = null;\n }\n light.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n this._lightDataTexture.dispose();\n this._tileMaskTexture.dispose();\n this._tileMaskBuffer?.dispose();\n this._proxyMesh.dispose(doNotRecurse, disposeMaterialAndTextures);\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n\n /**\n * Adds a light to the clustering system.\n * @param light The light to add\n */\n public addLight(light: Light): void {\n if (!ClusteredLightContainer.IsLightSupported(light)) {\n Logger.Warn(\"Attempting to add a light to cluster that does not support clustering\");\n return;\n }\n if (light._clusteredContainer) {\n Logger.Warn(\"Attempting to add a light to a cluster that is already owned by a clustered light container\");\n return;\n }\n light._clusteredContainer = this;\n // scene.removeLight returns -1 if the light wasn't in scene.lights. In that case the\n // mesh.lightSources cleanup it normally performs didn't happen — but the light may still be\n // there: lights constructed with `dontAddToScene = true` are pushed into mesh.lightSources\n // by the Light constructor (the `includedOnlyMeshes` setter calls `_resyncMeshes`).\n // Without explicit cleanup, the orphan would be picked up by PrepareDefinesForLights and\n // rendered as a regular point/spot light, bypassing the cluster (notably ignoring `maxRange`).\n if (this._scene.removeLight(light) === -1) {\n for (const mesh of this._scene.meshes) {\n mesh._removeLightSource(light, false);\n }\n }\n this._lights.push(light);\n this._sortedLights.push(<PointLight | SpotLight>light);\n\n this._proxyMesh.isVisible = true;\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n }\n\n /**\n * Removes a light from the clustering system.\n * @param light The light to remove\n * @returns the index where the light was in the light list\n */\n public removeLight(light: Light): number {\n // Convert to `Light` array without cast so `indexOf` has correct typing\n const sortedLights: Light[] = this._sortedLights;\n const sortedIndex = sortedLights.indexOf(light);\n if (sortedIndex !== -1) {\n sortedLights.splice(sortedIndex, 1);\n\n this._proxyMesh.thinInstanceCount = sortedLights.length;\n if (sortedLights.length === 0) {\n this._proxyMesh.isVisible = false;\n }\n }\n\n const index = this._lights.indexOf(light);\n if (index !== -1) {\n this._lights.splice(index, 1);\n // We treat the unsorted array as the \"real\" one so only add back to the scene if it was found in that\n if (light._clusteredContainer === this) {\n light._clusteredContainer = null;\n }\n this._scene.addLight(light);\n }\n return index;\n }\n\n protected override _buildUniformLayout(): void {\n this._uniformBuffer.addUniform(\"vLightData\", 4);\n this._uniformBuffer.addUniform(\"vLightDiffuse\", 4);\n this._uniformBuffer.addUniform(\"vLightSpecular\", 4);\n this._uniformBuffer.addUniform(\"vSliceData\", 2);\n // _depthSlices might not be initialized yet\n this._uniformBuffer.addUniform(\"vSliceRanges\", 2, this._depthSlices ?? DefaultDepthSlices);\n this._uniformBuffer.addUniform(\"shadowsInfo\", 3);\n this._uniformBuffer.addUniform(\"depthValues\", 2);\n this._uniformBuffer.create();\n }\n\n public override transferToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n const hscale = this._horizontalTiles / engine.getRenderWidth();\n const vscale = this._verticalTiles / engine.getRenderHeight();\n this._uniformBuffer.updateFloat4(\"vLightData\", hscale, vscale, this._verticalTiles, this._tileMaskBatches, lightIndex);\n this._uniformBuffer.updateFloat2(\"vSliceData\", this._sliceScale, this._sliceBias, lightIndex);\n this._uniformBuffer.updateFloatArray(\"vSliceRanges\", this._sliceRanges, lightIndex);\n this._lastBoundLightIndex = lightIndex;\n return this;\n }\n\n public override transferTexturesToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n effect.setTexture(\"lightDataTexture\" + lightIndex, this._lightDataTexture);\n if (engine.isWebGPU) {\n (<WebGPUEngine>engine).setStorageBuffer(\"tileMaskBuffer\" + lightIndex, this._tileMaskBuffer);\n } else {\n effect.setTexture(\"tileMaskTexture\" + lightIndex, this._tileMaskTexture);\n }\n return this;\n }\n\n /**\n * Transfers the effect to the node material effect\n * @param _effect the effect to transfer to\n * @returns the light\n */\n public override transferToNodeMaterialEffect(_effect: Effect): Light {\n return this;\n }\n\n public override prepareLightSpecificDefines(defines: any, lightIndex: number): void {\n defines[\"CLUSTLIGHT\" + lightIndex] = true;\n defines[\"CLUSTLIGHT_BATCH\"] = this._batchSize;\n defines[\"CLUSTLIGHT_SLICES\"] = this._depthSlices;\n }\n\n /**\n * Returns whether this light is ready to be used\n * @returns true if the light is ready\n */\n public override _isReady(): boolean {\n this._updateBatches();\n return this._proxyMesh.isReady(true, true);\n }\n\n /**\n * Serializes the ClusteredLightContainer to a JSON object, including all child lights.\n * @returns the serialized object\n */\n public override serialize(): any {\n const serializationObject = super.serialize();\n\n // Serialize child lights inline so they round-trip with the container.\n // Child lights are removed from scene.lights by addLight(), so the scene\n // serializer would not reach them on its own.\n serializationObject.clusteredLights = [];\n for (const light of this._lights) {\n if (!light.doNotSerialize) {\n serializationObject.clusteredLights.push(light.serialize());\n }\n }\n\n return serializationObject;\n }\n\n protected override _onParsed(parsedLight: any, scene: Scene, rootUrl: string = \"\"): void {\n if (parsedLight.clusteredLights) {\n // Parse child lights first, but defer addLight() until after the loader\n // fixup passes (parent resolution, excluded/included mesh resolution)\n // have run on scene.lights. addLight() removes lights from scene.lights,\n // which would cause those fixups to miss the child lights.\n const parsedChildLights: Light[] = [];\n for (const parsedChildLight of parsedLight.clusteredLights) {\n const childLight = Light.Parse(parsedChildLight, scene, rootUrl);\n if (childLight) {\n parsedChildLights.push(childLight);\n }\n }\n\n if (parsedChildLights.length > 0) {\n scene.onDataLoadedObservable.addOnce(() => {\n for (const childLight of parsedChildLights) {\n this.addLight(childLight);\n }\n });\n }\n }\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for clusteredLightContainer.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterClusteredLightContainer(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n Node.AddNodeConstructor(\"Light_Type_5\", (name, scene) => {\n return () => new ClusteredLightContainer(name, [], scene);\n });\n\n // Register Class Name\n RegisterClass(\"BABYLON.ClusteredLightContainer\", ClusteredLightContainer);\n}\n"]}
1
+ {"version":3,"file":"clusteredLightContainer.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Lights/Clustered/clusteredLightContainer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\nimport { type Camera } from \"core/Cameras/camera.pure\";\nimport { type AbstractEngine } from \"core/Engines/abstractEngine.pure\";\nimport { Constants } from \"core/Engines/constants\";\nimport { type WebGPUEngine } from \"core/Engines/webgpuEngine.pure\";\nimport { type Effect } from \"core/Materials/effect.pure\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial.pure\";\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture.pure\";\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\nimport { TmpColors } from \"core/Maths/math.color.pure\";\nimport { TmpVectors, Vector3 } from \"core/Maths/math.vector.pure\";\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder.pure\";\nimport { type Mesh } from \"core/Meshes/mesh.pure\";\nimport { serialize } from \"core/Misc/decorators\";\nimport { _WarnImport } from \"core/Misc/devTools\";\nimport { Logger } from \"core/Misc/logger\";\nimport { type Scene } from \"core/scene.pure\";\nimport { type Nullable } from \"core/types\";\nimport { Light } from \"../light\";\nimport { LightConstants } from \"../lightConstants\";\nimport { type PointLight } from \"../pointLight.pure\";\nimport { type SpotLight } from \"../spotLight.pure\";\nimport { type RenderTargetWrapper } from \"../../Engines/renderTargetWrapper\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\nimport { Node } from \"core/node\";\nimport { RegisterClusteredLightingSceneComponent } from \"./clusteredLightingSceneComponent.pure\";\nimport { RegisterEnginesExtensionsEngineRawTexture } from \"core/Engines/Extensions/engine.rawTexture.pure\";\nimport { RegisterEnginesExtensionsEngineRenderTarget } from \"core/Engines/Extensions/engine.renderTarget.pure\";\nimport { RegisterEnginesExtensionsEngineRenderTargetTexture } from \"core/Engines/Extensions/engine.renderTargetTexture.pure\";\nimport { RegisterThinInstanceMesh } from \"core/Meshes/thinInstanceMesh.pure\";\n\nconst DefaultDepthSlices = 16;\nconst MobileClusteredLightBatchSize = 8;\n\n/**\n * A special light that renders all its associated spot or point lights using a clustered or forward+ system.\n */\nexport class ClusteredLightContainer extends Light {\n private static _GetEngineBatchSize(engine: AbstractEngine): number {\n const caps = engine._caps;\n if (!caps.texelFetch) {\n return 0;\n } else if (engine.isWebGPU) {\n // On WebGPU we use atomic writes to storage buffers\n return 32;\n } else if (engine.version > 1) {\n // On WebGL 2 we use additive float blending as the light mask\n if (!caps.colorBufferFloat || !caps.blendFloat) {\n return 0;\n }\n // Due to the use of floats we want to limit lights to the precision of floats\n // The reduced precision for mobiles is because some devices (like Samsung Galaxy) report support for R32F but actually create the texture with less precision.\n return engine.hostInformation.isMobile ? MobileClusteredLightBatchSize : caps.shaderFloatPrecision;\n } else {\n // WebGL 1 is not supported due to lack of dynamic for loops\n return 0;\n }\n }\n\n /**\n * Checks if the clustered lighting system supports the given light with its current parameters.\n * This will also check if the light's associated engine supports clustered lighting.\n *\n * @param light The light to test\n * @returns true if the light and its engine is supported\n */\n public static IsLightSupported(light: Light): boolean {\n if (ClusteredLightContainer._GetEngineBatchSize(light.getEngine()) === 0) {\n return false;\n }\n\n if (light.shadowEnabled && light._scene.shadowsEnabled && light.getShadowGenerators()) {\n // Shadows are not supported\n return false;\n }\n\n if (light.falloffType !== Light.FALLOFF_DEFAULT) {\n // Only the default falloff is supported\n return false;\n }\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_POINTLIGHT) {\n return true;\n }\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n // Extra texture bindings per light are not supported\n return !(<SpotLight>light).projectionTexture && !(<SpotLight>light).iesProfileTexture;\n }\n\n // Currently only point and spot lights are supported\n return false;\n }\n\n /** @internal */\n public static _SceneComponentInitialization: (scene: Scene) => void = () => {\n throw _WarnImport(\"ClusteredLightingSceneComponent\");\n };\n\n private readonly _batchSize: number;\n\n /**\n * True if clustered lighting is supported.\n */\n public get isSupported(): boolean {\n return this._batchSize > 0;\n }\n\n private readonly _lights: Light[] = [];\n /**\n * Gets the current list of lights added to this clustering system.\n */\n public get lights(): readonly Light[] {\n return this._lights;\n }\n\n private _camera: Nullable<Camera> = null;\n\n // The lights sorted by depth\n private readonly _sortedLights: (PointLight | SpotLight)[] = [];\n\n private _lightDataBuffer: Float32Array;\n private _lightDataTexture: RawTexture;\n private _lightDataRenderId = -1;\n\n private _tileMaskBatches = -1;\n private _tileMaskTexture: RenderTargetTexture;\n private _tileMaskBuffer: Nullable<StorageBuffer>;\n\n private _horizontalTiles = 64;\n /**\n * The number of tiles in the horizontal direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get horizontalTiles(): number {\n return this._horizontalTiles;\n }\n\n public set horizontalTiles(horizontal: number) {\n if (this._horizontalTiles === horizontal) {\n return;\n }\n this._horizontalTiles = horizontal;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private _verticalTiles = 64;\n /**\n * The number of tiles in the vertical direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get verticalTiles(): number {\n return this._verticalTiles;\n }\n\n public set verticalTiles(vertical: number) {\n if (this._verticalTiles === vertical) {\n return;\n }\n this._verticalTiles = vertical;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private _sliceScale = 0;\n private _sliceBias = 0;\n // List of vec2's that keep track of the min and max index per slice\n private _sliceRanges: Float32Array<ArrayBuffer>;\n // Tracks the last lightIndex string passed to transferToEffect, or null if the cluster\n // has not yet been bound. Used to refresh the camera-dependent UBO entries (vSliceData /\n // vSliceRanges) every frame in cases where material binding is bypassed (e.g. WebGPU FAST\n // snapshot rendering replays cached bundles and never re-runs Light._bindLight).\n private _lastBoundLightIndex: Nullable<string> = null;\n\n private _depthSlices = DefaultDepthSlices;\n /**\n * The number of slices to split the depth range by and cluster lights into.\n */\n @serialize()\n public get depthSlices(): number {\n return this._depthSlices;\n }\n\n public set depthSlices(slices: number) {\n if (this._depthSlices === slices) {\n return;\n }\n this._depthSlices = slices;\n this._sliceRanges = new Float32Array(slices * 2);\n\n // UBO size depends on the number of depth slices\n this._uniformBuffer.dispose();\n this._uniformBuffer = new UniformBuffer(this.getEngine(), undefined, undefined, this.name);\n this._buildUniformLayout();\n // The UBO has been recreated so previous bindings are no longer valid; transferToEffect will repopulate it.\n this._lastBoundLightIndex = null;\n\n // CLUSTLIGHT_SLICES is a shader define that sizes the vSliceRanges array in the UBO.\n // Materials must recompile when depthSlices changes so the shader layout matches the rebuilt UBO.\n // Otherwise, if depthSlices is reduced, the rebuilt UBO can be smaller than what the previously compiled shader expects, causing rendering to fail.\n this._markMeshesAsLightDirty();\n }\n\n private readonly _proxyMaterial: ShaderMaterial;\n private readonly _proxyMesh: Mesh;\n\n private _maxRange = 16383;\n private _minInverseSquaredRange = 1 / (this._maxRange * this._maxRange);\n /**\n * This limits the range of all the added lights, so even lights with extreme ranges will still have bounds for clustering.\n */\n @serialize()\n public get maxRange(): number {\n return this._maxRange;\n }\n\n public set maxRange(range: number) {\n if (this._maxRange === range) {\n return;\n }\n this._maxRange = range;\n this._minInverseSquaredRange = 1 / (range * range);\n }\n\n /**\n * Creates a new clustered light system with an initial set of lights.\n *\n * @param name The name of the clustered light container\n * @param lights The initial set of lights to add\n * @param scene The scene the clustered light container belongs to\n */\n constructor(name: string, lights: Light[] = [], scene?: Scene) {\n super(name, scene);\n const engine = this.getEngine();\n this._batchSize = ClusteredLightContainer._GetEngineBatchSize(engine);\n\n // Clustered lighting relies on engine and mesh side effects that are not part of the\n // pure import baseline. Register them here (idempotently) so the feature works on the\n // tree-shakeable path without requiring callers to import these extensions manually.\n // Without this, createRawTexture/createRenderTargetTexture throw and the thin-instance\n // setters silently no-op, leaving the scene unlit with no error.\n RegisterEnginesExtensionsEngineRawTexture();\n RegisterEnginesExtensionsEngineRenderTarget();\n RegisterEnginesExtensionsEngineRenderTargetTexture();\n RegisterThinInstanceMesh();\n\n const proxyShader = { vertex: \"lightProxy\", fragment: \"lightProxy\" };\n const defines = [`CLUSTLIGHT_BATCH ${this._batchSize}`];\n if (this._scene.useRightHandedSystem) {\n defines.push(\"#define RIGHT_HANDED\");\n }\n this._proxyMaterial = new ShaderMaterial(\"ProxyMaterial\", this._scene, proxyShader, {\n attributes: [\"position\"],\n uniforms: [\"view\", \"projection\", \"tileMaskResolution\"],\n samplers: [\"lightDataTexture\"],\n uniformBuffers: [\"Scene\"],\n storageBuffers: [\"tileMaskBuffer\"],\n defines,\n shaderLanguage: engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (engine.isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/lightProxy.vertex\"), import(\"../../ShadersWGSL/lightProxy.fragment\")]);\n } else {\n await Promise.all([import(\"../../Shaders/lightProxy.vertex\"), import(\"../../Shaders/lightProxy.fragment\")]);\n }\n },\n });\n\n // Additive blending is for merging masks on WebGL\n this._proxyMaterial.transparencyMode = ShaderMaterial.MATERIAL_ALPHABLEND;\n this._proxyMaterial.alphaMode = Constants.ALPHA_ADD;\n this._proxyMaterial.sideOrientation = Constants.MATERIAL_CounterClockWiseSideOrientation;\n const originBlockState = this._scene._blockEntityCollection;\n this._scene._blockEntityCollection = true;\n this._proxyMesh = CreatePlane(\"ProxyMesh\", { size: 2 }, this._scene);\n // Make sure it doesn't render for the default scene\n this._scene.removeMesh(this._proxyMesh);\n this._scene._blockEntityCollection = originBlockState;\n this._proxyMesh.material = this._proxyMaterial;\n\n this._updateBatches();\n\n this._sliceRanges = new Float32Array(this._depthSlices * 2);\n\n if (this._batchSize > 0) {\n RegisterClusteredLightingSceneComponent(ClusteredLightContainer);\n ClusteredLightContainer._SceneComponentInitialization(this._scene);\n for (const light of lights) {\n this.addLight(light);\n }\n }\n }\n\n public override getClassName(): string {\n return \"ClusteredLightContainer\";\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override getTypeID(): number {\n return LightConstants.LIGHTTYPEID_CLUSTERED_CONTAINER;\n }\n\n /** @internal */\n public _updateBatches(camera: Nullable<Camera> = null): RenderTargetTexture {\n this._camera = camera;\n this._proxyMesh.isVisible = this._sortedLights.length > 0;\n\n // Ensure space for atleast 1 batch\n const batches = Math.max(Math.ceil(this._sortedLights.length / this._batchSize), 1);\n if (this._tileMaskBatches >= batches) {\n this._tileMaskTexture.activeCamera = camera;\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n return this._tileMaskTexture;\n }\n const engine = this.getEngine();\n // Round up to a batch size so we don't have to reallocate as often\n const maxLights = batches * this._batchSize;\n\n this._lightDataBuffer = new Float32Array(20 * maxLights);\n this._lightDataTexture?.dispose();\n this._lightDataTexture = new RawTexture(\n this._lightDataBuffer,\n 5,\n maxLights,\n Constants.TEXTUREFORMAT_RGBA,\n this._scene,\n false,\n false,\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n Constants.TEXTURETYPE_FLOAT\n );\n this._lightDataTexture.name = \"LightDataTexture_clustered_\" + this.name;\n this._proxyMaterial.setTexture(\"lightDataTexture\", this._lightDataTexture);\n\n this._tileMaskTexture?.dispose();\n const textureSize = { width: this._horizontalTiles, height: this._verticalTiles };\n if (!engine.isWebGPU) {\n // In WebGL we shift the light proxy by the batch number\n textureSize.height *= batches;\n }\n this._tileMaskTexture = new RenderTargetTexture(\"TileMaskTexture\", textureSize, this._scene, {\n // We don't write anything on WebGPU so make it as small as possible\n type: engine.isWebGPU ? Constants.TEXTURETYPE_UNSIGNED_BYTE : Constants.TEXTURETYPE_FLOAT,\n format: Constants.TEXTUREFORMAT_RED,\n generateDepthBuffer: false,\n });\n\n this._tileMaskTexture.renderParticles = false;\n this._tileMaskTexture.renderSprites = false;\n this._tileMaskTexture.noPrePassRenderer = true;\n this._tileMaskTexture.activeCamera = camera;\n this._tileMaskTexture.renderList = [this._proxyMesh];\n\n let currentRenderTarget: Nullable<RenderTargetWrapper> = null;\n\n this._tileMaskTexture.onBeforeBindObservable.add(() => {\n currentRenderTarget = engine._currentRenderTarget;\n this._updateLightData();\n // On WebGPU, clear the storage buffer here (before bindFramebuffer) because\n // clearBuffer is a command encoder operation that cannot run while a render pass is open.\n // In snapshot rendering mode, bindFramebuffer eagerly creates the render pass, so\n // clearing must happen before that point.\n if (engine.isWebGPU) {\n this._tileMaskBuffer?.clear();\n }\n });\n\n this._tileMaskTexture.onAfterUnbindObservable.add(() => {\n if (engine._currentRenderTarget !== currentRenderTarget) {\n if (!currentRenderTarget) {\n engine.restoreDefaultFramebuffer();\n } else {\n engine.bindFramebuffer(currentRenderTarget);\n }\n }\n });\n\n this._tileMaskTexture.onClearObservable.add(() => {\n if (!engine.isWebGPU) {\n // Only clear the texture on WebGL\n engine.clear({ r: 0, g: 0, b: 0, a: 1 }, true, false);\n }\n });\n\n if (engine.isWebGPU) {\n // WebGPU also needs a storage buffer to write to\n this._tileMaskBuffer?.dispose();\n const bufferSize = this._horizontalTiles * this._verticalTiles * batches * 4;\n this._tileMaskBuffer = new StorageBuffer(<WebGPUEngine>engine, bufferSize);\n this._proxyMaterial.setStorageBuffer(\"tileMaskBuffer\", this._tileMaskBuffer);\n }\n\n this._proxyMaterial.setVector3(\"tileMaskResolution\", new Vector3(this._horizontalTiles, this.verticalTiles, batches));\n\n // We don't actually use the matrix data but we need enough capacity for the lights\n if (this._proxyMesh.thinInstanceSetBuffer) {\n this._proxyMesh.thinInstanceSetBuffer(\"matrix\", new Float32Array(maxLights * 16));\n }\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n this._tileMaskBatches = batches;\n return this._tileMaskTexture;\n }\n\n private _getSliceIndex(camera: Camera, depth: number): number {\n if (depth < camera.minZ) {\n // Prevent calling log on small or negative values\n return -1;\n }\n return Math.floor(Math.log(depth) * this._sliceScale + this._sliceBias);\n }\n\n private _updateLightData(): void {\n const camera = this._camera || this._scene.activeCamera;\n const renderId = this._scene.getRenderId();\n if (!camera || this._lightDataRenderId === renderId) {\n return;\n }\n this._lightDataRenderId = renderId;\n\n // Resort lights based on distance from camera\n const view = camera.getViewMatrix();\n for (const light of this._sortedLights) {\n const position = light.computeTransformedInformation() ? light.transformedPosition : light.position;\n const viewPosition = Vector3.TransformCoordinatesToRef(position, view, TmpVectors.Vector3[0]);\n light._currentViewDepth = this._scene.useRightHandedSystem ? -viewPosition.z : viewPosition.z;\n }\n this._sortedLights.sort((a, b) => a._currentViewDepth - b._currentViewDepth);\n\n // DOOM 2016 subdivision scheme, copied from: https://www.aortiz.me/2018/12/21/CG.html\n const logFarNear = Math.log(camera.maxZ / camera.minZ);\n this._sliceScale = this._depthSlices / logFarNear;\n this._sliceBias = -(this._depthSlices * Math.log(camera.minZ)) / logFarNear;\n\n this._sliceRanges.fill(0);\n // Last slice which had had its min index updated\n let minSlice = -1;\n\n const buf = this._lightDataBuffer;\n const offset = this._scene.floatingOriginOffset;\n\n for (let i = 0; i < this._sortedLights.length; i += 1) {\n const light = this._sortedLights[i];\n const off = i * 20;\n const computed = light.computeTransformedInformation();\n const scaledIntensity = light.getScaledIntensity();\n\n const position = computed ? light.transformedPosition : light.position;\n const diffuse = light.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]);\n const specular = light.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]);\n const range = Math.min(light.range, this.maxRange);\n const inverseSquaredRange = Math.max(light._inverseSquaredRange, this._minInverseSquaredRange);\n\n // vLightData\n buf[off + 0] = position.x - offset.x;\n buf[off + 1] = position.y - offset.y;\n buf[off + 2] = position.z - offset.z;\n buf[off + 3] = 0;\n // vLightDiffuse\n buf[off + 4] = diffuse.r;\n buf[off + 5] = diffuse.g;\n buf[off + 6] = diffuse.b;\n buf[off + 7] = range;\n // vLightSpecular\n buf[off + 8] = specular.r;\n buf[off + 9] = specular.g;\n buf[off + 10] = specular.b;\n buf[off + 11] = light.radius;\n // vLightDirection\n buf[off + 12] = 0;\n buf[off + 13] = 0;\n buf[off + 14] = 0;\n buf[off + 15] = -1;\n // vLightFalloff\n buf[off + 16] = range;\n buf[off + 17] = inverseSquaredRange;\n buf[off + 18] = 0;\n buf[off + 19] = 0;\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n const spotLight = <SpotLight>light;\n const direction = Vector3.NormalizeToRef(computed ? spotLight.transformedDirection : spotLight.direction, TmpVectors.Vector3[0]);\n\n // vLightData.a\n buf[off + 3] = spotLight.exponent;\n // vLightDirection\n buf[off + 12] = direction.x;\n buf[off + 13] = direction.y;\n buf[off + 14] = direction.z;\n buf[off + 15] = spotLight._cosHalfAngle;\n // vLightFalloff.zw\n buf[off + 18] = spotLight._lightAngleScale;\n buf[off + 19] = spotLight._lightAngleOffset;\n }\n\n // Update the depth slices that include this light\n const firstSlice = this._getSliceIndex(camera, light._currentViewDepth - range);\n const lastSlice = this._getSliceIndex(camera, light._currentViewDepth + range);\n for (let j = firstSlice; j <= lastSlice; j += 1) {\n if (j < 0 || j >= this._depthSlices) {\n continue;\n } else if (j > minSlice) {\n // Update min index\n this._sliceRanges[j * 2] = i;\n minSlice = j;\n }\n // Update max index\n this._sliceRanges[j * 2 + 1] = i;\n }\n }\n\n const engine = this.getEngine();\n if (engine.isWebGPU) {\n // Whenever the light data changes we have to flush pending WebGPU command buffers so that\n // previous render passes use the old data and later render passes use the new data.\n engine.flushFramebuffer();\n }\n this._lightDataTexture.update(this._lightDataBuffer);\n\n // Refresh camera-dependent UBO fields when running under FAST snapshot rendering, where\n // ObjectRenderer.render bypasses the rendering manager and Light._bindLight is not\n // re-invoked each frame. Without this, transferToEffect would never run again after the\n // recording frame and the slice data would stay frozen, producing visibly stale lighting\n // as the camera moves. STANDARD snapshot mode and non-snapshot rendering still go through\n // material binding each frame, so transferToEffect already keeps the UBO up to date.\n if (this._lastBoundLightIndex !== null && engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST) {\n this._uniformBuffer.updateFloat2(\"vSliceData\", this._sliceScale, this._sliceBias, this._lastBoundLightIndex);\n this._uniformBuffer.updateFloatArray(\"vSliceRanges\", this._sliceRanges, this._lastBoundLightIndex);\n this._uniformBuffer.update();\n }\n }\n\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void {\n for (const light of this._lights) {\n if (light._clusteredContainer) {\n light._clusteredContainer = null;\n }\n light.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n this._lightDataTexture.dispose();\n this._tileMaskTexture.dispose();\n this._tileMaskBuffer?.dispose();\n this._proxyMesh.dispose(doNotRecurse, disposeMaterialAndTextures);\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n\n /**\n * Adds a light to the clustering system.\n * @param light The light to add\n */\n public addLight(light: Light): void {\n if (!ClusteredLightContainer.IsLightSupported(light)) {\n Logger.Warn(\"Attempting to add a light to cluster that does not support clustering\");\n return;\n }\n if (light._clusteredContainer) {\n Logger.Warn(\"Attempting to add a light to a cluster that is already owned by a clustered light container\");\n return;\n }\n light._clusteredContainer = this;\n // scene.removeLight returns -1 if the light wasn't in scene.lights. In that case the\n // mesh.lightSources cleanup it normally performs didn't happen — but the light may still be\n // there: lights constructed with `dontAddToScene = true` are pushed into mesh.lightSources\n // by the Light constructor (the `includedOnlyMeshes` setter calls `_resyncMeshes`).\n // Without explicit cleanup, the orphan would be picked up by PrepareDefinesForLights and\n // rendered as a regular point/spot light, bypassing the cluster (notably ignoring `maxRange`).\n if (this._scene.removeLight(light) === -1) {\n for (const mesh of this._scene.meshes) {\n mesh._removeLightSource(light, false);\n }\n }\n this._lights.push(light);\n this._sortedLights.push(<PointLight | SpotLight>light);\n\n this._proxyMesh.isVisible = true;\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n }\n\n /**\n * Removes a light from the clustering system.\n * @param light The light to remove\n * @returns the index where the light was in the light list\n */\n public removeLight(light: Light): number {\n // Convert to `Light` array without cast so `indexOf` has correct typing\n const sortedLights: Light[] = this._sortedLights;\n const sortedIndex = sortedLights.indexOf(light);\n if (sortedIndex !== -1) {\n sortedLights.splice(sortedIndex, 1);\n\n this._proxyMesh.thinInstanceCount = sortedLights.length;\n if (sortedLights.length === 0) {\n this._proxyMesh.isVisible = false;\n }\n }\n\n const index = this._lights.indexOf(light);\n if (index !== -1) {\n this._lights.splice(index, 1);\n // We treat the unsorted array as the \"real\" one so only add back to the scene if it was found in that\n if (light._clusteredContainer === this) {\n light._clusteredContainer = null;\n }\n this._scene.addLight(light);\n }\n return index;\n }\n\n protected override _buildUniformLayout(): void {\n this._uniformBuffer.addUniform(\"vLightData\", 4);\n this._uniformBuffer.addUniform(\"vLightDiffuse\", 4);\n this._uniformBuffer.addUniform(\"vLightSpecular\", 4);\n this._uniformBuffer.addUniform(\"vSliceData\", 2);\n // _depthSlices might not be initialized yet\n this._uniformBuffer.addUniform(\"vSliceRanges\", 2, this._depthSlices ?? DefaultDepthSlices);\n this._uniformBuffer.addUniform(\"shadowsInfo\", 3);\n this._uniformBuffer.addUniform(\"depthValues\", 2);\n this._uniformBuffer.create();\n }\n\n public override transferToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n const hscale = this._horizontalTiles / engine.getRenderWidth();\n const vscale = this._verticalTiles / engine.getRenderHeight();\n this._uniformBuffer.updateFloat4(\"vLightData\", hscale, vscale, this._verticalTiles, this._tileMaskBatches, lightIndex);\n this._uniformBuffer.updateFloat2(\"vSliceData\", this._sliceScale, this._sliceBias, lightIndex);\n this._uniformBuffer.updateFloatArray(\"vSliceRanges\", this._sliceRanges, lightIndex);\n this._lastBoundLightIndex = lightIndex;\n return this;\n }\n\n public override transferTexturesToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n effect.setTexture(\"lightDataTexture\" + lightIndex, this._lightDataTexture);\n if (engine.isWebGPU) {\n (<WebGPUEngine>engine).setStorageBuffer(\"tileMaskBuffer\" + lightIndex, this._tileMaskBuffer);\n } else {\n effect.setTexture(\"tileMaskTexture\" + lightIndex, this._tileMaskTexture);\n }\n return this;\n }\n\n /**\n * Transfers the effect to the node material effect\n * @param _effect the effect to transfer to\n * @returns the light\n */\n public override transferToNodeMaterialEffect(_effect: Effect): Light {\n return this;\n }\n\n public override prepareLightSpecificDefines(defines: any, lightIndex: number): void {\n defines[\"CLUSTLIGHT\" + lightIndex] = true;\n defines[\"CLUSTLIGHT_BATCH\"] = this._batchSize;\n defines[\"CLUSTLIGHT_SLICES\"] = this._depthSlices;\n }\n\n /**\n * Returns whether this light is ready to be used\n * @returns true if the light is ready\n */\n public override _isReady(): boolean {\n this._updateBatches();\n return this._proxyMesh.isReady(true, true);\n }\n\n /**\n * Serializes the ClusteredLightContainer to a JSON object, including all child lights.\n * @returns the serialized object\n */\n public override serialize(): any {\n const serializationObject = super.serialize();\n\n // Serialize child lights inline so they round-trip with the container.\n // Child lights are removed from scene.lights by addLight(), so the scene\n // serializer would not reach them on its own.\n serializationObject.clusteredLights = [];\n for (const light of this._lights) {\n if (!light.doNotSerialize) {\n serializationObject.clusteredLights.push(light.serialize());\n }\n }\n\n return serializationObject;\n }\n\n protected override _onParsed(parsedLight: any, scene: Scene, rootUrl: string = \"\"): void {\n if (parsedLight.clusteredLights) {\n // Parse child lights first, but defer addLight() until after the loader\n // fixup passes (parent resolution, excluded/included mesh resolution)\n // have run on scene.lights. addLight() removes lights from scene.lights,\n // which would cause those fixups to miss the child lights.\n const parsedChildLights: Light[] = [];\n for (const parsedChildLight of parsedLight.clusteredLights) {\n const childLight = Light.Parse(parsedChildLight, scene, rootUrl);\n if (childLight) {\n parsedChildLights.push(childLight);\n }\n }\n\n if (parsedChildLights.length > 0) {\n scene.onDataLoadedObservable.addOnce(() => {\n for (const childLight of parsedChildLights) {\n this.addLight(childLight);\n }\n });\n }\n }\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for clusteredLightContainer.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterClusteredLightContainer(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n Node.AddNodeConstructor(\"Light_Type_5\", (name, scene) => {\n return () => new ClusteredLightContainer(name, [], scene);\n });\n\n // Register Class Name\n RegisterClass(\"BABYLON.ClusteredLightContainer\", ClusteredLightContainer);\n}\n"]}
@@ -32,10 +32,12 @@ export declare class CascadedShadowGenerator extends ShadowGenerator {
32
32
  */
33
33
  static MAX_CASCADES_COUNT: number;
34
34
  protected _validateFilter(filter: number): number;
35
+ private _penumbraDarkness;
35
36
  /**
36
37
  * Gets or sets the actual darkness of the soft shadows while using PCSS filtering (value between 0. and 1.)
37
38
  */
38
- penumbraDarkness: number;
39
+ get penumbraDarkness(): number;
40
+ set penumbraDarkness(value: number);
39
41
  private _numCascades;
40
42
  /**
41
43
  * Gets or set the number of cascades used by the CSM.
@@ -116,6 +118,9 @@ export declare class CascadedShadowGenerator extends ShadowGenerator {
116
118
  private _frustumCornersWorldSpace;
117
119
  private _frustumCenter;
118
120
  private _shadowCameraPos;
121
+ private _cascadesUbos;
122
+ private _cascadesBuffers;
123
+ private _cascadesMatrices;
119
124
  private _shadowMaxZ;
120
125
  /**
121
126
  * Gets the shadow max z distance. It's the limit beyond which shadows are not displayed.
@@ -259,6 +264,36 @@ export declare class CascadedShadowGenerator extends ShadowGenerator {
259
264
  * @param effect The effect we are binfing the information for
260
265
  */
261
266
  bindShadowLight(lightIndex: string, effect: Effect): void;
267
+ private _computePCSSCorrections;
268
+ /**
269
+ * Writes the cascades just computed in the buffer of the camera they were computed for, and makes it the one receivers bind
270
+ */
271
+ private _updateCascadesUbo;
272
+ /**
273
+ * In floating origin mode, the light matrices are offset by the eye the receivers are rendered for, which a mirror or a
274
+ * reflection probe moves (scene._forcedViewPosition). Receivers rendered for the same eye share a buffer. Another eye in the
275
+ * same frame gets another buffer, since the commands of every view run after all the writes of the frame, and a buffer no
276
+ * view bound in this frame is the one rewritten for a new eye.
277
+ * @param cascades the cascades buffers of the camera the cascades were last computed for
278
+ * @param origin the floating origin offset of the eye
279
+ * @returns the buffer holding the last computed cascades for that eye
280
+ */
281
+ private _getCascadesBufferForEye;
282
+ private _createCascadesBuffer;
283
+ /**
284
+ * Writes the cascades last computed in a buffer, with the light matrices offset by the given floating origin offset
285
+ * @param cascades the cascades buffers the buffer belongs to
286
+ * @param buffer the buffer to write
287
+ * @param origin the floating origin offset of the eye the buffer is for (zero outside of floating origin mode)
288
+ */
289
+ private _writeCascades;
290
+ /**
291
+ * cascadeBlendPercentage and penumbraDarkness only matter to the receivers, and the shadow map may not render again
292
+ * (refreshRate 0): they are written in the cascades buffers when they change, not for each receiver
293
+ */
294
+ private _updateCascadesSettings;
295
+ private _getCascadeBlendFactor;
296
+ private _releaseCascadesUbo;
262
297
  /**
263
298
  * Gets the transformation matrix of the first cascade used to project the meshes into the map from the light point of view.
264
299
  * (eq to view projection * shadow projection matrices)