@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cluster_light.js","sources":["../../src/render/cluster_light.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Vector4 } from '@zephyr3d/base';\r\nimport { MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBStructTypeInfo,\r\n RenderStateSet,\r\n StructuredBuffer,\r\n Texture2D,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport class ClusteredLight {\r\n /** Emit the shadow-mask overflow warning only once per session. */\r\n private static _warnedShadowMaskOverflow = false;\r\n private readonly _tileCountX: number;\r\n private readonly _tileCountY: number;\r\n private readonly _tileCountZ: number;\r\n private readonly _lights: Float32Array<ArrayBuffer>;\r\n private _lightIndexTexture: Nullable<Texture2D>;\r\n private _lightIndexFramebuffer: Nullable<FrameBuffer>;\r\n private _lightIndexProgram: Nullable<GPUProgram>;\r\n private _bindGroup: Nullable<BindGroup>;\r\n private _lightIndexVertexLayout: Nullable<VertexLayout>;\r\n private _lightIndexRenderStates: Nullable<RenderStateSet>;\r\n private _lightBuffer: Nullable<StructuredBuffer>;\r\n private readonly _sizeParam: Vector4;\r\n private _countParam: Int32Array<ArrayBuffer>;\r\n private readonly _clusterParam: Vector4;\r\n private _numShadowLights: number;\r\n constructor() {\r\n this._tileCountX = 16;\r\n this._tileCountY = 16;\r\n this._tileCountZ = 32;\r\n this._lights = new Float32Array(16 * (ShaderHelper.getMaxClusterLights() + 1));\r\n this._lightIndexTexture = null;\r\n this._lightIndexFramebuffer = null;\r\n this._lightIndexProgram = null;\r\n this._lightBuffer = null;\r\n this._bindGroup = null;\r\n this._lightIndexVertexLayout = null;\r\n this._lightIndexRenderStates = null;\r\n this._sizeParam = new Vector4();\r\n this._countParam = new Int32Array(4);\r\n this._clusterParam = new Vector4();\r\n this._numShadowLights = 0;\r\n }\r\n get lightBuffer() {\r\n return this._lightBuffer;\r\n }\r\n /**\r\n * Number of shadow-casting lights placed at the head of the clustered light\r\n * buffer (indices `1..N`), each backed by a screen-space shadow mask slot.\r\n * Zero unless the screen-space shadow mask path is active.\r\n */\r\n get numShadowLights() {\r\n return this._numShadowLights;\r\n }\r\n get clusterParam() {\r\n return this._clusterParam;\r\n }\r\n get countParam() {\r\n return this._countParam;\r\n }\r\n get lightIndexTexture() {\r\n return this._lightIndexTexture;\r\n }\r\n private createVertexLayout(device: AbstractDevice, textureWidth: number, textureHeight: number) {\r\n let vb: StructuredBuffer;\r\n if (device.type === 'webgl') {\r\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 3);\r\n for (let i = 0; i < vertices.length; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 3 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 3 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n vertices[i * 3 + 2] = i;\r\n }\r\n vb = device.createVertexBuffer('position_f32x3', vertices)!;\r\n } else {\r\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 2);\r\n for (let i = 0; i < vertices.length; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 2 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 2 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n }\r\n vb = device.createVertexBuffer('position_f32x2', vertices)!;\r\n }\r\n this._lightIndexVertexLayout = device.createVertexLayout({\r\n vertexBuffers: [{ buffer: vb }]\r\n });\r\n }\r\n private createRenderState(device: AbstractDevice) {\r\n this._lightIndexRenderStates = device.createRenderStateSet();\r\n this._lightIndexRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._lightIndexRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n private createProgram(device: AbstractDevice) {\r\n const webgl1 = device.type === 'webgl';\r\n this._lightIndexProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = (webgl1 ? pb.vec3() : pb.vec2()).attrib('position');\r\n this.$outputs.value = webgl1 ? pb.vec4() : pb.uvec4();\r\n this.invProjMatrix = pb.mat4().uniform(0);\r\n this.viewMatrix = pb.mat4().uniform(0);\r\n this.sizeParam = pb.vec4().uniform(0);\r\n this.countParam = pb.ivec4().uniform(0);\r\n this[ShaderHelper.getLightBufferUniformName()] =\r\n pb.vec4[(ShaderHelper.getMaxClusterLights() + 1) * 4]().uniformBuffer(0);\r\n pb.func('lineIntersectionToZPlane', [pb.vec3('a'), pb.vec3('b'), pb.float('zDistance')], function () {\r\n this.$l.normal = pb.vec3(0, 0, 1);\r\n this.$l.ab = pb.sub(this.b, this.a);\r\n this.$l.t = pb.div(\r\n pb.sub(this.zDistance, pb.dot(this.normal, this.a)),\r\n pb.dot(this.normal, this.ab)\r\n );\r\n this.$return(pb.add(this.a, pb.mul(this.t, this.ab)));\r\n });\r\n pb.func('clipToView', [pb.vec4('clip')], function () {\r\n this.$l.view = pb.mul(this.invProjMatrix, this.clip);\r\n this.$return(pb.div(this.view, this.view.w));\r\n });\r\n pb.func('screenToView', [pb.vec4('screen')], function () {\r\n this.$l.texCoord = pb.div(this.screen.xy, this.sizeParam.xy);\r\n this.$l.clip = pb.vec4(\r\n pb.sub(pb.mul(pb.vec2(this.texCoord.x, pb.sub(1, this.texCoord.y)), 2), pb.vec2(1)),\r\n this.screen.z,\r\n this.screen.w\r\n );\r\n this.$return(this.clipToView(this.clip));\r\n });\r\n pb.func(\r\n 'sphereIntersectsAABB',\r\n [pb.vec4('sphere'), pb.vec3('aabbMin'), pb.vec3('aabbMax')],\r\n function () {\r\n this.$l.dmin = pb.float(0);\r\n this.$if(pb.lessThanEqual(this.sphere.w, 0), function () {\r\n this.$return(true);\r\n });\r\n this.$for(pb.int('i'), 0, 3, function () {\r\n this.$if(pb.lessThan(this.sphere.at(this.i), this.aabbMin.at(this.i)), function () {\r\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMin.at(this.i));\r\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\r\n }).$elseif(pb.greaterThan(this.sphere.at(this.i), this.aabbMax.at(this.i)), function () {\r\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMax.at(this.i));\r\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\r\n });\r\n });\r\n this.$if(pb.lessThanEqual(this.dmin, pb.mul(this.sphere.w, this.sphere.w)), function () {\r\n this.$return(true);\r\n });\r\n this.$return(false);\r\n }\r\n );\r\n pb.main(function () {\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$builtins.position = pb.vec4(this.$inputs.pos.xy, 0, 1);\r\n if (pb.getDevice().type === 'webgpu') {\r\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\r\n }\r\n this.$l.tileIndex = webgl1 ? pb.int(this.$inputs.pos.z) : pb.int(this.$builtins.vertexIndex);\r\n this.$l.tileSize = pb.div(this.sizeParam.xy, pb.vec2(this.countParam.xy));\r\n this.$l.zIndex = pb.div(this.tileIndex, pb.mul(this.countParam.x, this.countParam.y));\r\n this.$l.yIndex = pb.div(\r\n pb.sub(this.tileIndex, pb.mul(this.zIndex, this.countParam.x, this.countParam.y)),\r\n this.countParam.x\r\n );\r\n this.$l.xIndex = pb.sub(\r\n this.tileIndex,\r\n pb.add(\r\n pb.mul(this.zIndex, this.countParam.x, this.countParam.y),\r\n pb.mul(this.yIndex, this.countParam.x)\r\n )\r\n );\r\n this.$l.maxPoint_sS = pb.vec4(\r\n pb.mul(\r\n pb.vec2(pb.float(pb.add(this.xIndex, 1)), pb.float(pb.add(this.yIndex, 1))),\r\n this.tileSize\r\n ),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.minPoint_sS = pb.vec4(\r\n pb.mul(pb.vec2(pb.float(this.xIndex), pb.float(this.yIndex)), this.tileSize),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.maxPoint_vS = this.screenToView(this.maxPoint_sS).xyz;\r\n this.$l.minPoint_vS = this.screenToView(this.minPoint_sS).xyz;\r\n this.$l.tileNear = pb.mul(\r\n pb.neg(this.sizeParam.z),\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sizeParam.z),\r\n pb.div(pb.float(this.zIndex), pb.float(this.countParam.z))\r\n )\r\n );\r\n this.$l.tileFar = pb.mul(\r\n pb.neg(this.sizeParam.z),\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sizeParam.z),\r\n pb.div(pb.add(pb.float(this.zIndex), 1), pb.float(this.countParam.z))\r\n )\r\n );\r\n this.$l.eyePos = pb.vec3(0);\r\n this.$l.minPointNear = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileNear);\r\n this.$l.minPointFar = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileFar);\r\n this.$l.maxPointNear = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileNear);\r\n this.$l.maxPointFar = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileFar);\r\n this.$l.aabbMin = pb.min(\r\n pb.min(this.minPointNear, this.minPointFar),\r\n pb.min(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.$l.aabbMax = pb.max(\r\n pb.max(this.minPointNear, this.minPointFar),\r\n pb.max(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.$l.n = pb.int(0);\r\n if (webgl1) {\r\n this.$l.lightIndices = pb.float[8]();\r\n this.$for(pb.int('i'), 0, 8, function () {\r\n this.lightIndices.setAt(this.i, 0);\r\n });\r\n this.$for(pb.int('i'), 1, 256, function () {\r\n this.$if(pb.equal(this.i, this.countParam.w), function () {\r\n this.$break();\r\n });\r\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\r\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\r\n this.$l.lightPos.w = this.light.w;\r\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\r\n this.$for(pb.int('j'), 0, 8, function () {\r\n this.$if(pb.equal(this.j, this.n), function () {\r\n this.lightIndices.setAt(this.j, pb.float(this.i));\r\n this.n = pb.add(this.n, 1);\r\n this.$break();\r\n });\r\n });\r\n this.$if(pb.equal(this.n, 8), function () {\r\n this.$break();\r\n });\r\n });\r\n });\r\n this.$outputs.value.r = pb.add(pb.mul(this.lightIndices[0], 256), this.lightIndices[1]);\r\n this.$outputs.value.g = pb.add(pb.mul(this.lightIndices[2], 256), this.lightIndices[3]);\r\n this.$outputs.value.b = pb.add(pb.mul(this.lightIndices[4], 256), this.lightIndices[5]);\r\n this.$outputs.value.a = pb.add(pb.mul(this.lightIndices[6], 256), this.lightIndices[7]);\r\n } else {\r\n this.$l.lightIndex = [\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0)\r\n ];\r\n this.$for(pb.uint('i'), 1, pb.uint(this.countParam.w), function () {\r\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\r\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\r\n this.$l.lightPos.w = this.light.w;\r\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\r\n this.lightIndex.setAt(this.n, this.i);\r\n this.n = pb.add(this.n, 1);\r\n this.$if(pb.equal(this.n, 16), function () {\r\n this.$break();\r\n });\r\n });\r\n });\r\n this.$l.r = pb.add(\r\n pb.sal(this.lightIndex[0], 24),\r\n pb.sal(this.lightIndex[1], 16),\r\n pb.sal(this.lightIndex[2], 8),\r\n this.lightIndex[3]\r\n );\r\n this.$l.g = pb.add(\r\n pb.sal(this.lightIndex[4], 24),\r\n pb.sal(this.lightIndex[5], 16),\r\n pb.sal(this.lightIndex[6], 8),\r\n this.lightIndex[7]\r\n );\r\n this.$l.b = pb.add(\r\n pb.sal(this.lightIndex[8], 24),\r\n pb.sal(this.lightIndex[9], 16),\r\n pb.sal(this.lightIndex[10], 8),\r\n this.lightIndex[11]\r\n );\r\n this.$l.a = pb.add(\r\n pb.sal(this.lightIndex[12], 24),\r\n pb.sal(this.lightIndex[13], 16),\r\n pb.sal(this.lightIndex[14], 8),\r\n this.lightIndex[15]\r\n );\r\n this.$outputs.value = pb.uvec4(this.r, this.g, this.b, this.a);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = webgl1 ? pb.vec4() : pb.uvec4();\r\n pb.main(function () {\r\n this.$outputs.color = this.$inputs.value;\r\n });\r\n }\r\n })!;\r\n this._lightIndexProgram.name = '@ClusteredLight_Index';\r\n this._bindGroup = device.createBindGroup(this._lightIndexProgram.bindGroupLayouts[0]);\r\n this._lightBuffer?.dispose();\r\n const lightBufferType = this._lightIndexProgram.getBindingInfo(\r\n ShaderHelper.getLightBufferUniformName()!\r\n )!.type;\r\n this._lightBuffer = device.createStructuredBuffer(lightBufferType as PBStructTypeInfo, {\r\n usage: 'uniform'\r\n });\r\n }\r\n private createLightIndexTexture(device: AbstractDevice) {\r\n const exp = Math.log2(this._tileCountX * this._tileCountY * this._tileCountZ);\r\n const a = (exp + 1) >>> 1;\r\n const b = exp - a;\r\n const textureWidth = 2 << (a - 1);\r\n const textureHeight = 2 << (b - 1);\r\n if (textureWidth * textureHeight !== this._tileCountX * this._tileCountY * this._tileCountZ) {\r\n throw new Error('Internal error');\r\n }\r\n this._lightIndexTexture = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rgba32ui',\r\n textureWidth,\r\n textureHeight,\r\n { mipmapping: false }\r\n )!;\r\n this._lightIndexTexture.name = 'ClusterLightIndex';\r\n this._lightIndexFramebuffer?.dispose();\r\n this._lightIndexFramebuffer = device.createFrameBuffer([this._lightIndexTexture], null);\r\n }\r\n calculateLightIndex(\r\n camera: Camera,\r\n renderQueue: RenderQueue,\r\n screenSpaceShadowMask = camera.screenSpaceShadowMask,\r\n preExposure = 1\r\n ) {\r\n const numLights = this.getVisibleLights(renderQueue, this._lights, screenSpaceShadowMask, preExposure);\r\n const device = getDevice();\r\n if (!this._lightIndexTexture) {\r\n this.createLightIndexTexture(device);\r\n }\r\n if (!this._lightIndexProgram) {\r\n this.createProgram(device);\r\n }\r\n if (!this._lightIndexVertexLayout) {\r\n this.createVertexLayout(device, this._lightIndexTexture!.width, this._lightIndexTexture!.height);\r\n }\r\n if (!this._lightIndexRenderStates) {\r\n this.createRenderState(device);\r\n }\r\n const viewport = device.getViewport();\r\n const vw = device.screenXToDevice(viewport.width);\r\n const vh = device.screenYToDevice(viewport.height);\r\n const scale = this._tileCountZ / Math.log2(camera.getFarPlane() / camera.getNearPlane());\r\n const bias = -(\r\n (this._tileCountZ * Math.log2(camera.getNearPlane())) /\r\n Math.log2(camera.getFarPlane() / camera.getNearPlane())\r\n );\r\n this._clusterParam.setXYZW(vw, vh, scale, bias);\r\n this._sizeParam.setXYZW(vw, vh, camera.getNearPlane(), camera.getFarPlane());\r\n this._countParam[0] = this._tileCountX;\r\n this._countParam[1] = this._tileCountY;\r\n this._countParam[2] = this._tileCountZ;\r\n // countParam.w stores light count + 1 because clustered indices start from 1.\r\n // Keep it valid even when there are no unshadowed punctual lights so clustered\r\n // shading math stays well-defined for emissive and environment lighting paths.\r\n this._countParam[3] = numLights + 1;\r\n device.pushDeviceStates();\r\n device.setFramebuffer(this._lightIndexFramebuffer);\r\n if (numLights > 0) {\r\n if (this._lightBuffer!.disposed) {\r\n this._lightBuffer!.reload();\r\n }\r\n this._lightBuffer!.bufferSubData(0, this._lights);\r\n this._bindGroup!.setValue('invProjMatrix', camera.getInvProjectionMatrix());\r\n this._bindGroup!.setValue('viewMatrix', camera.viewMatrix);\r\n this._bindGroup!.setValue('sizeParam', this._sizeParam);\r\n this._bindGroup!.setValue('countParam', this._countParam);\r\n this._bindGroup!.setBuffer(ShaderHelper.getLightBufferUniformName(), this._lightBuffer!);\r\n device.setProgram(this._lightIndexProgram);\r\n device.setVertexLayout(this._lightIndexVertexLayout);\r\n device.setBindGroup(0, this._bindGroup!);\r\n const savedRS = device.getRenderStates();\r\n device.setRenderStates(this._lightIndexRenderStates);\r\n device.draw('point-list', 0, this._tileCountX * this._tileCountY * this._tileCountZ);\r\n device.setRenderStates(savedRS);\r\n } else {\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 0), DEPTH_CLEAR_VALUE, 0);\r\n }\r\n device.popDeviceStates();\r\n }\r\n private getVisibleLights(\r\n renderQueue: RenderQueue,\r\n lights: Float32Array,\r\n useShadowMask: boolean,\r\n preExposure: number\r\n ) {\r\n const writeLight = (light: PunctualLight, slot: number) => {\r\n const offset = slot * 16;\r\n const colorIntensity = light.diffuseAndIntensity;\r\n lights.set(light.positionAndRange, offset);\r\n lights.set(light.directionAndCutoff, offset + 4);\r\n // Only the intensity carries the camera pre-exposure; the color stays as authored. The\r\n // light's own cached vector must not be mutated because it is shared across cameras.\r\n lights[offset + 8] = colorIntensity.x;\r\n lights[offset + 9] = colorIntensity.y;\r\n lights[offset + 10] = colorIntensity.z;\r\n lights[offset + 11] = colorIntensity.w * preExposure;\r\n lights.set(light.extraParams, offset + 12);\r\n };\r\n // When the screen-space shadow mask is active, shadow-casting lights occupy\r\n // the head of the buffer (slots 1..N) in the exact order of\r\n // renderQueue.shadowedLights. The mask pass must assign layers/channels from\r\n // the SAME list in the SAME order so that a light's buffer index maps to its\r\n // mask slot without storing a per-light index. Keep these two in lockstep.\r\n let numShadow = 0;\r\n let slot = 0;\r\n if (useShadowMask) {\r\n numShadow = Math.min(\r\n renderQueue.shadowedLights.length,\r\n MAX_SHADOW_MASK_LIGHTS,\r\n ShaderHelper.getMaxClusterLights()\r\n );\r\n for (let i = 1; i <= numShadow; i++) {\r\n writeLight(renderQueue.shadowedLights[i - 1], i);\r\n }\r\n slot = numShadow;\r\n }\r\n // Unshadowed lights fill the region after the mask-backed shadow lights.\r\n const numUnshadowed = Math.min(\r\n renderQueue.unshadowedLights.length,\r\n ShaderHelper.getMaxClusterLights() - slot\r\n );\r\n for (let j = 0; j < numUnshadowed; j++) {\r\n writeLight(renderQueue.unshadowedLights[j], slot + j + 1);\r\n }\r\n slot += numUnshadowed;\r\n // Shadow-casting lights beyond the mask capacity (MAX_SHADOW_MASK_LIGHTS) have\r\n // no mask slot. Rather than dropping them silently, place them past index N so\r\n // they are still lit — without a mask sample, i.e. degraded to no shadow.\r\n if (useShadowMask && renderQueue.shadowedLights.length > numShadow) {\r\n const overflow = renderQueue.shadowedLights.length - numShadow;\r\n const numOverflow = Math.min(overflow, ShaderHelper.getMaxClusterLights() - slot);\r\n for (let k = 0; k < numOverflow; k++) {\r\n writeLight(renderQueue.shadowedLights[numShadow + k], slot + k + 1);\r\n }\r\n slot += numOverflow;\r\n if (!ClusteredLight._warnedShadowMaskOverflow) {\r\n ClusteredLight._warnedShadowMaskOverflow = true;\r\n console.warn(\r\n `ClusteredLight: ${renderQueue.shadowedLights.length} shadow-casting lights exceed the ` +\r\n `screen-space shadow mask capacity (${MAX_SHADOW_MASK_LIGHTS}); ${overflow} light(s) are ` +\r\n `lit without shadows${numOverflow < overflow ? `, and ${overflow - numOverflow} dropped` : ''}.`\r\n );\r\n }\r\n }\r\n this._numShadowLights = numShadow;\r\n return slot;\r\n }\r\n}\r\n"],"names":["ClusteredLight","_warnedShadowMaskOverflow","_tileCountX","_tileCountY","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_sizeParam","_countParam","_clusterParam","_numShadowLights","Float32Array","ShaderHelper","getMaxClusterLights","Vector4","Int32Array","lightBuffer","numShadowLights","clusterParam","countParam","lightIndexTexture","createVertexLayout","device","textureWidth","textureHeight","vb","type","vertices","i","length","ix","iy","Math","floor","createVertexBuffer","vertexBuffers","buffer","createRenderState","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","createProgram","webgl1","buildRenderProgram","vertex","pb","$inputs","pos","vec3","vec2","attrib","$outputs","value","vec4","uvec4","invProjMatrix","mat4","uniform","viewMatrix","sizeParam","ivec4","getLightBufferUniformName","uniformBuffer","func","float","$l","normal","ab","sub","b","a","t","div","zDistance","dot","$return","add","mul","view","clip","w","texCoord","screen","xy","x","y","z","clipToView","dmin","$if","lessThanEqual","sphere","$for","int","lessThan","at","aabbMin","delta","$elseif","greaterThan","aabbMax","main","getDevice","$builtins","pointSize","position","tileIndex","vertexIndex","tileSize","zIndex","yIndex","xIndex","maxPoint_sS","minPoint_sS","maxPoint_vS","screenToView","xyz","minPoint_vS","tileNear","neg","pow","tileFar","eyePos","minPointNear","lineIntersectionToZPlane","minPointFar","maxPointNear","maxPointFar","min","max","n","lightIndices","setAt","equal","$break","light","lightPos","sphereIntersectsAABB","j","r","g","lightIndex","uint","sal","fragment","color","name","createBindGroup","bindGroupLayouts","dispose","lightBufferType","getBindingInfo","createStructuredBuffer","usage","createLightIndexTexture","exp","log2","Error","createTexture2D","mipmapping","createFrameBuffer","calculateLightIndex","camera","renderQueue","screenSpaceShadowMask","preExposure","numLights","getVisibleLights","width","height","viewport","getViewport","vw","screenXToDevice","vh","screenYToDevice","scale","getFarPlane","getNearPlane","bias","setXYZW","pushDeviceStates","setFramebuffer","disposed","reload","bufferSubData","setValue","getInvProjectionMatrix","setBuffer","setProgram","setVertexLayout","setBindGroup","savedRS","getRenderStates","setRenderStates","draw","clearFrameBuffer","DEPTH_CLEAR_VALUE","popDeviceStates","lights","useShadowMask","writeLight","slot","offset","colorIntensity","diffuseAndIntensity","set","positionAndRange","directionAndCutoff","extraParams","numShadow","shadowedLights","MAX_SHADOW_MASK_LIGHTS","numUnshadowed","unshadowedLights","overflow","numOverflow","k","console","warn"],"mappings":"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"}
1
+ {"version":3,"file":"cluster_light.js","sources":["../../src/render/cluster_light.ts"],"sourcesContent":["import type { Nullable, Vector3 } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Vector4 } from '@zephyr3d/base';\r\nimport { MAX_GLOBAL_LIGHTS, MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n RenderStateSet,\r\n StructuredBuffer,\r\n Texture2D,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport { PBArrayTypeInfo, PBPrimitiveType, PBPrimitiveTypeInfo, PBStructTypeInfo } from '@zephyr3d/device';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** Name of the index pass's per-light view-space bounding spheres. */\r\nconst UNIFORM_NAME_LIGHT_SPHERES = 'lightSpheres';\r\n/**\r\n * vec4s per light in the index pass's sphere buffer: the bounding sphere, then the\r\n * light's brightness in x.\r\n */\r\nconst SPHERE_STRIDE = 2;\r\n/** Target size in pixels of a cluster tile on screen. */\r\nconst TILE_SIZE_PX = 64;\r\n/** Bound on the tile count along each screen axis, which caps the index pass cost at high resolution. */\r\nconst MAX_TILES_PER_AXIS = 64;\r\n/** Number of depth slices. */\r\nconst TILE_COUNT_Z = 32;\r\n/**\r\n * View depth in meters where the exponential slices of a perspective camera begin.\r\n * Everything nearer shares slice 0: exponential slicing would otherwise spend a quarter\r\n * of the slices on the first meter in front of a 0.1 m near plane, where little is lit.\r\n */\r\nconst NEAR_SLICE_METERS = 1;\r\n/** Clusters per workgroup of the WebGPU index pass, and lights per shared batch. */\r\nconst INDEX_GROUP_SIZE = 64;\r\n/**\r\n * Average list length per cluster the WebGPU light list starts out sized for, once there\r\n * are more lights than this (with fewer, every cluster fits all of them). It then grows\r\n * to what the clusters asked for, read back from the GPU.\r\n */\r\nconst LIST_LIGHTS_PER_CLUSTER = 64;\r\n/** Bound on the entries of the WebGPU light list: 64 MB. */\r\nconst MAX_LIST_ENTRIES = 1 << 24;\r\n/**\r\n * Buckets of the per-cluster histogram of light scores that picks which lights a\r\n * cluster keeps when its list is cut. Each spans a factor of 4 in score.\r\n */\r\nconst SCORE_BUCKETS = 32;\r\n\r\n/**\r\n * Declares the uniforms and helper functions shared by the index pass programs.\r\n */\r\nfunction declareIndexPassScope(\r\n pb: ProgramBuilder,\r\n scope: PBGlobalScope,\r\n sphereStride: number,\r\n storage: boolean\r\n) {\r\n (function (this: PBGlobalScope) {\r\n this.invProjMatrix = pb.mat4().uniform(0);\r\n this.sizeParam = pb.vec4().uniform(0);\r\n this.countParam = pb.ivec4().uniform(0);\r\n this.orthoProj = pb.int().uniform(0);\r\n this.sliceParam = pb.vec4().uniform(0);\r\n // Already in view space: transformed once per light on the CPU rather than once\r\n // per light in each of the clusters. See writeLight for the layout.\r\n this[UNIFORM_NAME_LIGHT_SPHERES] = storage\r\n ? pb.vec4[0]().storageBufferReadonly(0)\r\n : pb.vec4[(ShaderHelper.getMaxClusterLights() + 1) * sphereStride]().uniformBuffer(0);\r\n pb.func('lineIntersectionToZPlane', [pb.vec3('a'), pb.vec3('b'), pb.float('zDistance')], function () {\r\n this.$l.normal = pb.vec3(0, 0, 1);\r\n this.$l.ab = pb.sub(this.b, this.a);\r\n this.$l.t = pb.div(pb.sub(this.zDistance, pb.dot(this.normal, this.a)), pb.dot(this.normal, this.ab));\r\n this.$return(pb.add(this.a, pb.mul(this.t, this.ab)));\r\n });\r\n // View depth where perspective slice k begins: slices before the first exponential\r\n // one form the near slice, which begins at the near plane.\r\n pb.func('sliceDepth', [pb.float('k')], function () {\r\n this.$if(pb.lessThan(this.k, this.sliceParam.y), function () {\r\n this.$return(this.sizeParam.z);\r\n });\r\n this.$return(\r\n pb.mul(\r\n this.sliceParam.x,\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sliceParam.x),\r\n pb.div(pb.sub(this.k, this.sliceParam.y), this.sliceParam.z)\r\n )\r\n )\r\n );\r\n });\r\n pb.func('clipToView', [pb.vec4('clip')], function () {\r\n this.$l.view = pb.mul(this.invProjMatrix, this.clip);\r\n this.$return(pb.div(this.view, this.view.w));\r\n });\r\n pb.func('screenToView', [pb.vec4('screen')], function () {\r\n this.$l.texCoord = pb.div(this.screen.xy, this.sizeParam.xy);\r\n this.$l.clip = pb.vec4(\r\n pb.sub(pb.mul(pb.vec2(this.texCoord.x, pb.sub(1, this.texCoord.y)), 2), pb.vec2(1)),\r\n this.screen.z,\r\n this.screen.w\r\n );\r\n this.$return(this.clipToView(this.clip));\r\n });\r\n // Squared distance from a point to the box, zero inside it.\r\n pb.func('aabbDistSq', [pb.vec3('p'), pb.vec3('aabbMin'), pb.vec3('aabbMax')], function () {\r\n this.$l.d = pb.max(pb.max(pb.sub(this.aabbMin, this.p), pb.sub(this.p, this.aabbMax)), pb.vec3(0));\r\n this.$return(pb.dot(this.d, this.d));\r\n });\r\n // Radius 0 marks an unbounded light that no global slot took: it reaches every cluster.\r\n pb.func('sphereReachesAABB', [pb.vec4('sphere'), pb.float('distSq')], function () {\r\n this.$return(\r\n pb.or(pb.equal(this.sphere.w, 0), pb.lessThanEqual(this.distSq, pb.mul(this.sphere.w, this.sphere.w)))\r\n );\r\n });\r\n // Whether the sphere lies entirely outside one of the tile frustum's side planes\r\n // (inward unit normals through the eye). The box of a far slice is much wider than\r\n // the frustum it bounds, and this rejects the lights reaching only its corners.\r\n pb.func(\r\n 'sphereOutsideTile',\r\n [pb.vec4('sphere'), pb.vec3('left'), pb.vec3('right'), pb.vec3('bottom'), pb.vec3('top')],\r\n function () {\r\n this.$l.r = pb.neg(this.sphere.w);\r\n this.$return(\r\n pb.and(\r\n pb.greaterThan(this.sphere.w, 0),\r\n pb.or(\r\n pb.or(\r\n pb.lessThan(pb.dot(this.left, this.sphere.xyz), this.r),\r\n pb.lessThan(pb.dot(this.right, this.sphere.xyz), this.r)\r\n ),\r\n pb.or(\r\n pb.lessThan(pb.dot(this.bottom, this.sphere.xyz), this.r),\r\n pb.lessThan(pb.dot(this.top, this.sphere.xyz), this.r)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n );\r\n }).call(scope);\r\n}\r\n\r\n/**\r\n * Emits the view-space bounds of cluster `tileIndex` (an int): locals `aabbMin`/`aabbMax`\r\n * and the inward side-plane normals `planeLeft`/`planeRight`/`planeBottom`/`planeTop`.\r\n */\r\nfunction emitClusterBounds(this: PBInsideFunctionScope, pb: ProgramBuilder, tileIndex: PBShaderExp) {\r\n this.$l.tileIndex = tileIndex;\r\n this.$l.tileSize = pb.div(this.sizeParam.xy, pb.vec2(this.countParam.xy));\r\n this.$l.zIndex = pb.div(this.tileIndex, pb.mul(this.countParam.x, this.countParam.y));\r\n this.$l.yIndex = pb.div(\r\n pb.sub(this.tileIndex, pb.mul(this.zIndex, this.countParam.x, this.countParam.y)),\r\n this.countParam.x\r\n );\r\n this.$l.xIndex = pb.sub(\r\n this.tileIndex,\r\n pb.add(pb.mul(this.zIndex, this.countParam.x, this.countParam.y), pb.mul(this.yIndex, this.countParam.x))\r\n );\r\n this.$l.maxPoint_sS = pb.vec4(\r\n pb.mul(pb.vec2(pb.float(pb.add(this.xIndex, 1)), pb.float(pb.add(this.yIndex, 1))), this.tileSize),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.minPoint_sS = pb.vec4(\r\n pb.mul(pb.vec2(pb.float(this.xIndex), pb.float(this.yIndex)), this.tileSize),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.maxPoint_vS = this.screenToView(this.maxPoint_sS).xyz;\r\n this.$l.minPoint_vS = this.screenToView(this.minPoint_sS).xyz;\r\n this.$l.sliceNear = pb.div(pb.float(this.zIndex), pb.float(this.countParam.z));\r\n this.$l.sliceFar = pb.div(pb.add(pb.float(this.zIndex), 1), pb.float(this.countParam.z));\r\n this.$l.aabbMin = pb.vec3();\r\n this.$l.aabbMax = pb.vec3();\r\n // Zero normals never reject: an orthographic tile is exactly its box.\r\n this.$l.planeLeft = pb.vec3(0);\r\n this.$l.planeRight = pb.vec3(0);\r\n this.$l.planeBottom = pb.vec3(0);\r\n this.$l.planeTop = pb.vec3(0);\r\n this.$if(pb.notEqual(this.orthoProj, 0), function () {\r\n // Orthographic: view rays are parallel, so a tile's view-space x/y extent does not\r\n // depend on depth, and slices are linear because near may be zero or negative.\r\n this.$l.tileNear = pb.neg(pb.mix(this.sizeParam.z, this.sizeParam.w, this.sliceNear));\r\n this.$l.tileFar = pb.neg(pb.mix(this.sizeParam.z, this.sizeParam.w, this.sliceFar));\r\n this.aabbMin = pb.vec3(pb.min(this.minPoint_vS.xy, this.maxPoint_vS.xy), this.tileFar);\r\n this.aabbMax = pb.vec3(pb.max(this.minPoint_vS.xy, this.maxPoint_vS.xy), this.tileNear);\r\n }).$else(function () {\r\n this.$l.tileNear = pb.neg(this.sliceDepth(pb.float(this.zIndex)));\r\n this.$l.tileFar = pb.neg(this.sliceDepth(pb.add(pb.float(this.zIndex), 1)));\r\n this.$l.eyePos = pb.vec3(0);\r\n this.$l.minPointNear = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileNear);\r\n this.$l.minPointFar = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileFar);\r\n this.$l.maxPointNear = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileNear);\r\n this.$l.maxPointFar = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileFar);\r\n this.aabbMin = pb.min(\r\n pb.min(this.minPointNear, this.minPointFar),\r\n pb.min(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.aabbMax = pb.max(\r\n pb.max(this.minPointNear, this.minPointFar),\r\n pb.max(this.maxPointNear, this.maxPointFar)\r\n );\r\n // Side planes through the eye and the tile edges at z = tileNear (< 0), with\r\n // normals facing into the tile.\r\n this.$l.lo = pb.min(this.minPointNear.xy, this.maxPointNear.xy);\r\n this.$l.hi = pb.max(this.minPointNear.xy, this.maxPointNear.xy);\r\n this.planeLeft = pb.normalize(pb.vec3(pb.neg(this.tileNear), 0, this.lo.x));\r\n this.planeRight = pb.normalize(pb.vec3(this.tileNear, 0, pb.neg(this.hi.x)));\r\n this.planeBottom = pb.normalize(pb.vec3(0, pb.neg(this.tileNear), this.lo.y));\r\n this.planeTop = pb.normalize(pb.vec3(0, this.tileNear, pb.neg(this.hi.y)));\r\n });\r\n}\r\n\r\n/**\r\n * Emits the state of a cluster keeping its 16 strongest lights. Needs the bounds from\r\n * emitClusterBounds.\r\n */\r\nfunction emitSelectionInit(this: PBInsideFunctionScope, pb: ProgramBuilder) {\r\n this.$l.n = pb.int(0);\r\n this.$l.lightIndex = [\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0)\r\n ];\r\n this.$l.lightScore = [\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0)\r\n ];\r\n // Once all slots are taken, the weakest one is replaced by any light scoring\r\n // higher, so a crowded cluster keeps the lights that matter most to it rather\r\n // than whichever happen to come first in the buffer.\r\n this.$l.minSlot = pb.int(0);\r\n this.$l.minScore = pb.float(0);\r\n emitScoreSetup.call(this, pb);\r\n}\r\n\r\n/** Emits the locals emitLightScore needs. Needs the bounds from emitClusterBounds. */\r\nfunction emitScoreSetup(this: PBInsideFunctionScope, pb: ProgramBuilder) {\r\n // Half the cluster diagonal: the irradiance estimate is taken at the cluster\r\n // center but not closer than this, so a light inside the cluster stays finite.\r\n this.$l.halfDiagSq = pb.mul(\r\n pb.dot(pb.sub(this.aabbMax, this.aabbMin), pb.sub(this.aabbMax, this.aabbMin)),\r\n 0.25\r\n );\r\n this.$l.center = pb.mul(pb.add(this.aabbMin, this.aabbMax), 0.5);\r\n}\r\n\r\n/**\r\n * Emits the local `score` of the light in `lightPos`, which emitLightReaches found to\r\n * reach the cluster: its brightness times the lit shader's range window at the nearest\r\n * point of the cluster, over the squared distance to the cluster center. Unbounded\r\n * lights score highest.\r\n */\r\nfunction emitLightScore(this: PBInsideFunctionScope, pb: ProgramBuilder, brightness: PBShaderExp) {\r\n this.$l.score = pb.float(3.0e38);\r\n this.$if(pb.greaterThan(this.lightPos.w, 0), function () {\r\n this.$l.f = pb.clamp(pb.sub(1, pb.div(this.distSq, pb.mul(this.lightPos.w, this.lightPos.w))), 0, 1);\r\n this.$l.toCenter = pb.sub(this.center, this.lightPos.xyz);\r\n this.score = pb.div(\r\n pb.mul(brightness, this.f, this.f),\r\n pb.max(pb.dot(this.toCenter, this.toCenter), pb.max(this.halfDiagSq, 1e-6))\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Emits the test of the light at buffer index `index` (a uint) with view-space bounding\r\n * sphere `sphere` and brightness `brightness` against the cluster, keeping it when it\r\n * reaches the cluster and is among its 16 strongest. Must be emitted inside a loop over\r\n * the lights: rejecting a light continues it.\r\n */\r\n/**\r\n * Emits whether the light whose view-space bounding sphere is in the local `lightPos`\r\n * reaches the cluster, declaring the local `distSq` (its squared distance to the box).\r\n * Needs the bounds from emitClusterBounds.\r\n */\r\nfunction emitLightReaches(this: PBInsideFunctionScope, pb: ProgramBuilder): PBShaderExp {\r\n this.$l.distSq = this.aabbDistSq(this.lightPos.xyz, this.aabbMin, this.aabbMax);\r\n // Negative radius: shaded through a global slot, never through the clusters.\r\n return pb.and(\r\n pb.greaterThanEqual(this.lightPos.w, 0),\r\n pb.and(\r\n this.sphereReachesAABB(this.lightPos, this.distSq),\r\n pb.not(\r\n this.sphereOutsideTile(\r\n this.lightPos,\r\n this.planeLeft,\r\n this.planeRight,\r\n this.planeBottom,\r\n this.planeTop\r\n )\r\n )\r\n )\r\n );\r\n}\r\n\r\nfunction emitConsiderLight(\r\n this: PBInsideFunctionScope,\r\n pb: ProgramBuilder,\r\n index: PBShaderExp,\r\n sphere: PBShaderExp,\r\n brightness: PBShaderExp\r\n) {\r\n this.$l.lightPos = sphere;\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n emitLightScore.call(this, pb, brightness);\r\n this.$if(pb.lessThan(this.n, 16), function () {\r\n this.lightIndex.setAt(this.n, index);\r\n this.lightScore.setAt(this.n, this.score);\r\n this.n = pb.add(this.n, 1);\r\n })\r\n .$elseif(pb.greaterThan(this.score, this.minScore), function () {\r\n this.lightIndex.setAt(this.minSlot, index);\r\n this.lightScore.setAt(this.minSlot, this.score);\r\n })\r\n .$else(function () {\r\n this.$continue();\r\n });\r\n this.$if(pb.equal(this.n, 16), function () {\r\n this.minSlot = 0;\r\n this.minScore = this.lightScore[0];\r\n this.$for(pb.int('k'), 1, 16, function () {\r\n this.$if(pb.lessThan(this.lightScore.at(this.k), this.minScore), function () {\r\n this.minSlot = this.k;\r\n this.minScore = this.lightScore.at(this.k);\r\n });\r\n });\r\n });\r\n });\r\n}\r\n\r\n/** Emits the packing of the selected light indices, one byte each, front to back. */\r\nfunction emitPackSelection(this: PBInsideFunctionScope, pb: ProgramBuilder): PBShaderExp {\r\n this.$l.r = pb.add(\r\n pb.sal(this.lightIndex[0], 24),\r\n pb.sal(this.lightIndex[1], 16),\r\n pb.sal(this.lightIndex[2], 8),\r\n this.lightIndex[3]\r\n );\r\n this.$l.g = pb.add(\r\n pb.sal(this.lightIndex[4], 24),\r\n pb.sal(this.lightIndex[5], 16),\r\n pb.sal(this.lightIndex[6], 8),\r\n this.lightIndex[7]\r\n );\r\n this.$l.b = pb.add(\r\n pb.sal(this.lightIndex[8], 24),\r\n pb.sal(this.lightIndex[9], 16),\r\n pb.sal(this.lightIndex[10], 8),\r\n this.lightIndex[11]\r\n );\r\n this.$l.a = pb.add(\r\n pb.sal(this.lightIndex[12], 24),\r\n pb.sal(this.lightIndex[13], 16),\r\n pb.sal(this.lightIndex[14], 8),\r\n this.lightIndex[15]\r\n );\r\n return pb.uvec4(this.r, this.g, this.b, this.a);\r\n}\r\n\r\n/**\r\n * The strength a light is ranked by: its peak color channel times its intensity, times\r\n * the area for rect lights, whose intensity is per unit area.\r\n */\r\nfunction lightBrightness(light: PunctualLight) {\r\n const c = light.diffuseAndIntensity;\r\n const brightness = Math.max(c.x, c.y, c.z) * c.w;\r\n return light.isRectLight() ? brightness * light.width * light.height : brightness;\r\n}\r\n\r\n/**\r\n * Writes the world-space sphere bounding the region `light` lights into `out` (center,\r\n * radius). The range sphere, except for spot lights: the smallest sphere around the cone\r\n * sector they light (the cone clipped by the range sphere), which for a half-angle up to\r\n * 45 degrees passes through the apex and the rim, and beyond that is centered on the\r\n * rim's plane. Radius <= 0 for unbounded lights.\r\n */\r\nfunction getLightBounds(light: PunctualLight, out: Float32Array) {\r\n const posRange = light.positionAndRange;\r\n out[0] = posRange.x;\r\n out[1] = posRange.y;\r\n out[2] = posRange.z;\r\n out[3] = posRange.w;\r\n if (posRange.w > 0 && light.isSpotLight()) {\r\n const dirCutoff = light.directionAndCutoff;\r\n const cosAngle = Math.min(dirCutoff.w, 1);\r\n if (cosAngle > 0) {\r\n const len = Math.hypot(dirCutoff.x, dirCutoff.y, dirCutoff.z) || 1;\r\n let dist: number;\r\n if (cosAngle >= Math.SQRT1_2) {\r\n dist = posRange.w / (2 * cosAngle);\r\n out[3] = dist;\r\n } else {\r\n dist = posRange.w * cosAngle;\r\n out[3] = posRange.w * Math.sqrt(1 - cosAngle * cosAngle);\r\n }\r\n out[0] += (dirCutoff.x / len) * dist;\r\n out[1] += (dirCutoff.y / len) * dist;\r\n out[2] += (dirCutoff.z / len) * dist;\r\n }\r\n }\r\n}\r\nconst _bounds = new Float32Array(4);\r\n\r\nexport class ClusteredLight {\r\n /** Emit the shadow-mask overflow warning only once per session. */\r\n private static _warnedShadowMaskOverflow = false;\r\n /** Instances returned by {@link ClusteredLight.release}, reused to keep their GPU resources. */\r\n private static readonly _pool: ClusteredLight[] = [];\r\n /**\r\n * Fetches an instance from the pool, creating one if it is empty.\r\n *\r\n * @param width - Width in device pixels of the target it will be built for.\r\n * @param height - Height in device pixels of that target.\r\n *\r\n * @remarks\r\n * The GPU work reading an instance's buffers may still be pending when the render\r\n * code is done with it, so release it only after the render graph has executed.\r\n */\r\n static acquire(width: number, height: number): ClusteredLight {\r\n // Prefer an instance already sized for this target, so alternating targets do not\r\n // rebuild the index texture every frame.\r\n const x = ClusteredLight.tileCount(width);\r\n const y = ClusteredLight.tileCount(height);\r\n const index = this._pool.findIndex((cl) => cl._tileCountX === x && cl._tileCountY === y);\r\n if (index >= 0) {\r\n return this._pool.splice(index, 1)[0];\r\n }\r\n return this._pool.pop() ?? new ClusteredLight();\r\n }\r\n /** Tile count along a screen axis of `size` pixels. */\r\n private static tileCount(size: number) {\r\n return Math.min(Math.max(Math.ceil(size / TILE_SIZE_PX), 1), MAX_TILES_PER_AXIS);\r\n }\r\n /** Returns an instance obtained from {@link ClusteredLight.acquire} to the pool. */\r\n static release(cl: ClusteredLight) {\r\n this._pool.push(cl);\r\n }\r\n private _tileCountX: number;\r\n private _tileCountY: number;\r\n private readonly _tileCountZ: number;\r\n private _lights: Float32Array<ArrayBuffer>;\r\n /** View-space bounding sphere of each light in `_lights`, for culling. See writeLight. */\r\n private _lightSpheres: Float32Array<ArrayBuffer>;\r\n /** Buffer indices of the lights shaded outside the clusters, zero-terminated. */\r\n private readonly _globalLights: Int32Array<ArrayBuffer>;\r\n private _lightIndexTexture: Nullable<Texture2D>;\r\n private _lightIndexFramebuffer: Nullable<FrameBuffer>;\r\n private _lightIndexProgram: Nullable<GPUProgram>;\r\n private _bindGroup: Nullable<BindGroup>;\r\n /** WebGPU only: the pass counting each cluster's lights ahead of the index pass. */\r\n private _lightCountProgram: Nullable<GPUProgram>;\r\n private _countBindGroup: Nullable<BindGroup>;\r\n /** WebGPU only: list entries the clusters asked for, as last read back from the GPU. */\r\n private _requestedListEntries: number;\r\n private _readbackPending: boolean;\r\n private readonly _readback: Uint8Array<ArrayBuffer>;\r\n private _warnedListOverflow: boolean;\r\n private _lightIndexVertexLayout: Nullable<VertexLayout>;\r\n /** Not released by disposing the layout, so kept to be disposed along with it. */\r\n private _lightIndexVertexBuffer: Nullable<StructuredBuffer>;\r\n private _lightIndexRenderStates: Nullable<RenderStateSet>;\r\n private _lightBuffer: Nullable<GPUDataBuffer>;\r\n private _lightSphereBuffer: Nullable<GPUDataBuffer>;\r\n /** Lights the WebGPU storage buffers above hold, slot 0 included. */\r\n private _storageLightCapacity: number;\r\n /**\r\n * WebGPU only: per cluster, the offset of its list in `_lightListBuffer` and its\r\n * length, two uints each.\r\n */\r\n private _clusterGridBuffer: Nullable<GPUDataBuffer>;\r\n /** WebGPU only: light buffer indices of every cluster's lights, one list after another. */\r\n private _lightListBuffer: Nullable<GPUDataBuffer>;\r\n private _lightListCapacity: number;\r\n /** WebGPU only: the atomic allocating list room, zeroed before each build. */\r\n private _listCounterBuffer: Nullable<GPUDataBuffer>;\r\n /**\r\n * WebGPU only: mappable copy of `_listCounterBuffer` for readBackListRequest, kept\r\n * across reads instead of a staging buffer being made for each one.\r\n */\r\n private _listCounterReadBuffer: Nullable<GPUDataBuffer>;\r\n private readonly _listCounterZero: Uint32Array<ArrayBuffer>;\r\n private readonly _lightIndexTexSize: Int32Array<ArrayBuffer>;\r\n private readonly _sizeParam: Vector4;\r\n private _countParam: Int32Array<ArrayBuffer>;\r\n private readonly _clusterParam: Vector4;\r\n /** Perspective depth slicing: split depth, first exponential slice, exponential slice count. */\r\n private readonly _sliceParam: Vector4;\r\n private _numShadowLights: number;\r\n private _orthographic: boolean;\r\n /** Scratch list of the lights competing for the slots after the mask-backed ones. */\r\n private readonly _rest: PunctualLight[];\r\n /** Scratch for prioritize(). */\r\n private _sortScores: Float64Array<ArrayBuffer>;\r\n private _sortOrder: Uint32Array<ArrayBuffer>;\r\n private readonly _sortScratch: PunctualLight[];\r\n constructor() {\r\n this._tileCountX = 0;\r\n this._tileCountY = 0;\r\n this._tileCountZ = TILE_COUNT_Z;\r\n // Grown to fit the frame's lights, see ensureLightArrayCapacity.\r\n this._lights = new Float32Array(16 * 64);\r\n this._lightSpheres = new Float32Array(4 * SPHERE_STRIDE * 64);\r\n this._globalLights = new Int32Array(MAX_GLOBAL_LIGHTS);\r\n this._lightIndexTexture = null;\r\n this._lightIndexFramebuffer = null;\r\n this._lightIndexProgram = null;\r\n this._lightBuffer = null;\r\n this._lightSphereBuffer = null;\r\n this._storageLightCapacity = 0;\r\n this._clusterGridBuffer = null;\r\n this._lightListBuffer = null;\r\n this._lightListCapacity = 0;\r\n this._listCounterBuffer = null;\r\n this._listCounterReadBuffer = null;\r\n this._listCounterZero = new Uint32Array(4);\r\n this._lightIndexTexSize = new Int32Array(2);\r\n this._bindGroup = null;\r\n this._lightCountProgram = null;\r\n this._countBindGroup = null;\r\n this._requestedListEntries = 0;\r\n this._readbackPending = false;\r\n this._readback = new Uint8Array(16);\r\n this._warnedListOverflow = false;\r\n this._lightIndexVertexLayout = null;\r\n this._lightIndexVertexBuffer = null;\r\n this._lightIndexRenderStates = null;\r\n this._sizeParam = new Vector4();\r\n this._countParam = new Int32Array(4);\r\n this._clusterParam = new Vector4();\r\n this._sliceParam = new Vector4();\r\n this._numShadowLights = 0;\r\n this._orthographic = false;\r\n this._rest = [];\r\n this._sortScores = new Float64Array(64);\r\n this._sortOrder = new Uint32Array(64);\r\n this._sortScratch = [];\r\n }\r\n get lightBuffer() {\r\n return this._lightBuffer;\r\n }\r\n /**\r\n * Number of shadow-casting lights placed at the head of the clustered light\r\n * buffer (indices `1..N`), each backed by a screen-space shadow mask slot.\r\n * Zero unless the screen-space shadow mask path is active.\r\n */\r\n get numShadowLights() {\r\n return this._numShadowLights;\r\n }\r\n /**\r\n * Whether the clusters were built for an orthographic camera, which slices depth linearly\r\n * rather than exponentially. The lit shader reads it to compute the matching slice.\r\n */\r\n get orthographic() {\r\n return this._orthographic;\r\n }\r\n /**\r\n * Buffer indices of the lights every fragment shades regardless of its cluster\r\n * (directional lights, up to {@link MAX_GLOBAL_LIGHTS}), zero-terminated. Kept out of\r\n * the clusters so they do not take one of the few slots in each.\r\n */\r\n get globalLights() {\r\n return this._globalLights;\r\n }\r\n get clusterParam() {\r\n return this._clusterParam;\r\n }\r\n get countParam() {\r\n return this._countParam;\r\n }\r\n /** The per-cluster light slots, except on WebGPU where the clusters hold lists. */\r\n get lightIndexTexture() {\r\n return this._lightIndexTexture;\r\n }\r\n get lightIndexTexSize() {\r\n return this._lightIndexTexSize;\r\n }\r\n /** See {@link ShaderHelper.getClusterGrid}. WebGPU only. */\r\n get clusterGridBuffer() {\r\n return this._clusterGridBuffer;\r\n }\r\n /** See {@link ShaderHelper.getClusterLightList}. WebGPU only. */\r\n get lightListBuffer() {\r\n return this._lightListBuffer;\r\n }\r\n private createVertexLayout(device: AbstractDevice, textureWidth: number, textureHeight: number) {\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n const vertices = new Float32Array(numClusters * 2);\r\n for (let i = 0; i < numClusters; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 2 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 2 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n }\r\n const vb = device.createVertexBuffer('position_f32x2', vertices)!;\r\n this._lightIndexVertexBuffer = vb;\r\n this._lightIndexVertexLayout = device.createVertexLayout({\r\n vertexBuffers: [{ buffer: vb }]\r\n });\r\n }\r\n /** Sizes the grid for a target, dropping the resources built for another grid. */\r\n private resizeGrid(width: number, height: number) {\r\n const x = ClusteredLight.tileCount(width);\r\n const y = ClusteredLight.tileCount(height);\r\n if (x === this._tileCountX && y === this._tileCountY) {\r\n return;\r\n }\r\n this._tileCountX = x;\r\n this._tileCountY = y;\r\n this._lightIndexFramebuffer?.dispose();\r\n this._lightIndexFramebuffer = null;\r\n this._lightIndexTexture?.dispose();\r\n this._lightIndexTexture = null;\r\n this._lightIndexVertexLayout?.dispose();\r\n this._lightIndexVertexLayout = null;\r\n this._lightIndexVertexBuffer?.dispose();\r\n this._lightIndexVertexBuffer = null;\r\n this._clusterGridBuffer?.dispose();\r\n this._clusterGridBuffer = null;\r\n this._lightListBuffer?.dispose();\r\n this._lightListBuffer = null;\r\n this._lightListCapacity = 0;\r\n }\r\n private createRenderState(device: AbstractDevice) {\r\n this._lightIndexRenderStates = device.createRenderStateSet();\r\n this._lightIndexRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._lightIndexRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n private createProgram(device: AbstractDevice) {\r\n const sphereStride = SPHERE_STRIDE;\r\n if (device.type === 'webgpu') {\r\n // Declares what both passes use and returns the batched light loop: runs `body`\r\n // for each light of each batch the workgroup loads, with the light's index in\r\n // `lightId`, its sphere in `lightPos` and its brightness in `brightness`, for the\r\n // threads where `test` holds. Also emits the cluster bounds and the locals below.\r\n const setup = function (this: PBGlobalScope) {\r\n declareIndexPassScope(pb0!, this, sphereStride, true);\r\n this.clusterGrid = pb0!.uint[0]().storageBuffer(0);\r\n this.listCounter = pb0!.atomic_uint[0]().storageBuffer(0);\r\n // One batch of lights, loaded by the whole workgroup and then tested by each of\r\n // its clusters, instead of every cluster reading every light on its own.\r\n this.batchSpheres = pb0!.vec4[INDEX_GROUP_SIZE]().workgroup();\r\n this.batchBrightness = pb0!.float[INDEX_GROUP_SIZE]().workgroup();\r\n };\r\n let pb0: Nullable<ProgramBuilder> = null;\r\n const emitMainSetup = function (this: PBInsideFunctionScope, pb: ProgramBuilder) {\r\n this.$l.numClusters = pb.mul(this.countParam.x, this.countParam.y, this.countParam.z);\r\n this.$l.cluster = pb.int(this.$builtins.globalInvocationId.x);\r\n // Threads past the last cluster still take part in loading the batches.\r\n this.$l.valid = pb.lessThan(this.cluster, this.numClusters);\r\n emitClusterBounds.call(this, pb, pb.min(this.cluster, pb.sub(this.numClusters, 1)));\r\n this.$l.cell = pb.mul(pb.uint(pb.min(this.cluster, pb.sub(this.numClusters, 1))), 2);\r\n this.$l.local = pb.uint(this.$builtins.localInvocationId.x);\r\n this.$l.numLights = pb.uint(pb.sub(this.countParam.w, 1));\r\n this.$l.numBatches = pb.div(pb.add(this.numLights, INDEX_GROUP_SIZE - 1), INDEX_GROUP_SIZE);\r\n };\r\n const forEachBatchedLight = function (\r\n this: PBInsideFunctionScope,\r\n pb: ProgramBuilder,\r\n test: () => PBShaderExp,\r\n body: (this: PBInsideFunctionScope) => void\r\n ) {\r\n this.$for(pb.uint('b'), 0, this.numBatches, function () {\r\n this.$l.base = pb.add(pb.mul(this.b, INDEX_GROUP_SIZE), 1);\r\n this.$l.li = pb.add(this.base, this.local);\r\n this.$if(pb.lessThan(this.li, pb.uint(this.countParam.w)), function () {\r\n this.batchSpheres.setAt(this.local, this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.mul(this.li, 2)));\r\n this.batchBrightness.setAt(\r\n this.local,\r\n this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.add(pb.mul(this.li, 2), 1)).x\r\n );\r\n });\r\n pb.workgroupBarrier();\r\n this.$if(test.call(this), function () {\r\n this.$l.batchCount = pb.min(pb.sub(pb.uint(this.countParam.w), this.base), INDEX_GROUP_SIZE);\r\n this.$for(pb.uint('j'), 0, this.batchCount, function () {\r\n this.$l.lightId = pb.add(this.base, this.j);\r\n this.$l.lightPos = this.batchSpheres.at(this.j);\r\n this.$l.brightness = this.batchBrightness.at(this.j);\r\n body.call(this);\r\n });\r\n });\r\n // The next batch overwrites the one still being read.\r\n pb.workgroupBarrier();\r\n });\r\n };\r\n // Count pass: how many lights reach each cluster, and in total. The total decides\r\n // in the write pass whether the lists fit, which no single pass could know before\r\n // every cluster had allocated its list.\r\n this._lightCountProgram = device.buildComputeProgram({\r\n label: 'ClusteredLightCount',\r\n workgroupSize: [INDEX_GROUP_SIZE, 1, 1],\r\n compute(pb) {\r\n pb0 = pb;\r\n setup.call(this);\r\n pb.main(function () {\r\n emitMainSetup.call(this, pb);\r\n this.$l.listCount = pb.uint(0);\r\n forEachBatchedLight.call(\r\n this,\r\n pb,\r\n () => this.valid,\r\n function () {\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n this.listCount = pb.add(this.listCount, 1);\r\n });\r\n }\r\n );\r\n this.$if(this.valid, function () {\r\n this.clusterGrid.setAt(pb.add(this.cell, 1), this.listCount);\r\n pb.atomicAdd(this.listCounter.at(1), this.listCount);\r\n });\r\n });\r\n }\r\n })!;\r\n this._lightCountProgram.name = '@ClusteredLight_Count';\r\n this._countBindGroup = device.createBindGroup(this._lightCountProgram.bindGroupLayouts[0]);\r\n // Write pass: allocates each cluster's list and fills it.\r\n this._lightIndexProgram = device.buildComputeProgram({\r\n label: 'ClusteredLightIndex',\r\n workgroupSize: [INDEX_GROUP_SIZE, 1, 1],\r\n compute(pb) {\r\n pb0 = pb;\r\n setup.call(this);\r\n this.listCapacity = pb.uint().uniform(0);\r\n this.lightList = pb.uint[0]().storageBuffer(0);\r\n // The bucket of a score, higher for stronger lights.\r\n pb.func('scoreBucket', [pb.float('score')], function () {\r\n this.$return(\r\n pb.uint(\r\n pb.clamp(\r\n pb.add(pb.floor(pb.mul(pb.log2(pb.max(this.score, 1e-30)), 0.5)), SCORE_BUCKETS / 2),\r\n 0,\r\n SCORE_BUCKETS - 1\r\n )\r\n )\r\n );\r\n });\r\n pb.main(function () {\r\n emitMainSetup.call(this, pb);\r\n emitScoreSetup.call(this, pb);\r\n this.$l.need = pb.uint(0);\r\n this.$if(this.valid, function () {\r\n this.need = this.clusterGrid.at(pb.add(this.cell, 1));\r\n });\r\n // When the lists do not all fit, every cluster gives up the same share of its\r\n // lights, so the sum fits and none is left empty. The margin absorbs the\r\n // rounding of the float scale.\r\n this.$l.total = pb.atomicLoad(this.listCounter.at(1));\r\n this.$l.allowed = this.need;\r\n this.$if(pb.greaterThan(this.total, this.listCapacity), function () {\r\n this.allowed = pb.uint(\r\n pb.floor(\r\n pb.mul(\r\n pb.float(this.need),\r\n pb.div(pb.float(this.listCapacity), pb.float(this.total)),\r\n 0.999\r\n )\r\n )\r\n );\r\n });\r\n this.$l.truncated = pb.lessThan(this.allowed, this.need);\r\n // A cut list keeps the strongest lights for this cluster: the buckets above\r\n // `cutBucket` whole, and of that bucket only the first `cutRoom`.\r\n this.$l.hist = pb.uint[SCORE_BUCKETS]();\r\n this.$for(pb.int('h'), 0, SCORE_BUCKETS, function () {\r\n this.hist.setAt(this.h, 0);\r\n });\r\n forEachBatchedLight.call(\r\n this,\r\n pb,\r\n () => pb.and(this.valid, this.truncated),\r\n function () {\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n emitLightScore.call(this, pb, this.brightness);\r\n this.$l.bucket = this.scoreBucket(this.score);\r\n this.hist.setAt(this.bucket, pb.add(this.hist.at(this.bucket), 1));\r\n });\r\n }\r\n );\r\n this.$l.cutBucket = pb.int(-1);\r\n this.$l.cutRoom = pb.uint(0);\r\n this.$if(this.truncated, function () {\r\n this.$l.kept = pb.uint(0);\r\n this.$for(pb.int('h'), SCORE_BUCKETS - 1, 0, false, true, function () {\r\n this.$if(pb.greaterThan(pb.add(this.kept, this.hist.at(this.h)), this.allowed), function () {\r\n this.cutBucket = this.h;\r\n this.cutRoom = pb.sub(this.allowed, this.kept);\r\n this.$break();\r\n });\r\n this.kept = pb.add(this.kept, this.hist.at(this.h));\r\n });\r\n });\r\n this.$l.listOffset = pb.uint(0);\r\n this.$if(pb.and(this.valid, pb.greaterThan(this.allowed, 0)), function () {\r\n this.listOffset = pb.atomicAdd(this.listCounter.at(0), this.allowed);\r\n // Only rounding can leave the sum above the capacity; trim the last lists.\r\n this.allowed = pb.select(\r\n pb.uint(0),\r\n pb.min(this.allowed, pb.sub(this.listCapacity, this.listOffset)),\r\n pb.lessThan(this.listOffset, this.listCapacity)\r\n );\r\n });\r\n this.$l.written = pb.uint(0);\r\n forEachBatchedLight.call(\r\n this,\r\n pb,\r\n () => pb.and(this.valid, pb.lessThan(this.written, this.allowed)),\r\n function () {\r\n this.$if(pb.greaterThanEqual(this.written, this.allowed), function () {\r\n this.$break();\r\n });\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n this.$l.keep = true;\r\n this.$if(this.truncated, function () {\r\n emitLightScore.call(this, pb, this.brightness);\r\n this.$l.bucket = pb.int(this.scoreBucket(this.score));\r\n this.keep = pb.greaterThan(this.bucket, this.cutBucket);\r\n this.$if(\r\n pb.and(pb.equal(this.bucket, this.cutBucket), pb.greaterThan(this.cutRoom, 0)),\r\n function () {\r\n this.keep = true;\r\n this.cutRoom = pb.sub(this.cutRoom, 1);\r\n }\r\n );\r\n });\r\n this.$if(this.keep, function () {\r\n this.lightList.setAt(pb.add(this.listOffset, this.written), this.lightId);\r\n this.written = pb.add(this.written, 1);\r\n });\r\n });\r\n }\r\n );\r\n this.$if(this.valid, function () {\r\n this.clusterGrid.setAt(this.cell, this.listOffset);\r\n this.clusterGrid.setAt(pb.add(this.cell, 1), this.written);\r\n });\r\n });\r\n }\r\n })!;\r\n } else {\r\n this._lightIndexProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.value = pb.uvec4();\r\n declareIndexPassScope(pb, this, sphereStride, false);\r\n pb.main(function () {\r\n this.$builtins.pointSize = 1;\r\n this.$builtins.position = pb.vec4(this.$inputs.pos.xy, 0, 1);\r\n emitClusterBounds.call(this, pb, pb.int(this.$builtins.vertexIndex));\r\n emitSelectionInit.call(this, pb);\r\n this.$for(pb.uint('i'), 1, pb.uint(this.countParam.w), function () {\r\n emitConsiderLight.call(\r\n this,\r\n pb,\r\n this.i,\r\n this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.mul(this.i, sphereStride)),\r\n this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.add(pb.mul(this.i, sphereStride), 1)).x\r\n );\r\n });\r\n this.$outputs.value = emitPackSelection.call(this, pb);\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.uvec4();\r\n pb.main(function () {\r\n this.$outputs.color = this.$inputs.value;\r\n });\r\n }\r\n })!;\r\n }\r\n this._lightIndexProgram.name = '@ClusteredLight_Index';\r\n this._bindGroup = device.createBindGroup(this._lightIndexProgram.bindGroupLayouts[0]);\r\n if (!ShaderHelper.usesClusterLightLists()) {\r\n this._lightSphereBuffer?.dispose();\r\n const sphereBufferType = this._lightIndexProgram.getBindingInfo(UNIFORM_NAME_LIGHT_SPHERES)!.type;\r\n this._lightSphereBuffer = device.createStructuredBuffer(sphereBufferType as PBStructTypeInfo, {\r\n usage: 'uniform'\r\n });\r\n }\r\n }\r\n /**\r\n * Grows the WebGPU light and sphere storage buffers to hold `count` entries (slot 0\r\n * included). The contents are rewritten every frame, so nothing is copied.\r\n */\r\n private ensureStorageLightCapacity(device: AbstractDevice, count: number) {\r\n if (this._storageLightCapacity >= count && this._lightBuffer && this._lightSphereBuffer) {\r\n return;\r\n }\r\n const capacity = Math.max(64, 1 << Math.ceil(Math.log2(count)));\r\n this._lightBuffer?.dispose();\r\n this._lightSphereBuffer?.dispose();\r\n this._lightBuffer = device.createBuffer(capacity * 64, { usage: 'uniform', storage: true })!;\r\n this._lightSphereBuffer = device.createBuffer(capacity * 16 * SPHERE_STRIDE, {\r\n usage: 'uniform',\r\n storage: true\r\n })!;\r\n this._storageLightCapacity = capacity;\r\n }\r\n /**\r\n * Makes the WebGPU cluster grid and light list buffers fit the current grid and\r\n * `numLights` lights. The list grows but is not shrunk.\r\n */\r\n private ensureListBuffers(device: AbstractDevice, numLights: number) {\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n if (!this._clusterGridBuffer) {\r\n this._clusterGridBuffer = device.createBuffer(numClusters * 8, { usage: 'uniform', storage: true })!;\r\n }\r\n const capacity = Math.min(\r\n Math.max(\r\n numClusters * Math.min(Math.max(numLights, 1), LIST_LIGHTS_PER_CLUSTER),\r\n // With some headroom, as moving lights change what the clusters ask for.\r\n Math.ceil(this._requestedListEntries * 1.25)\r\n ),\r\n MAX_LIST_ENTRIES\r\n );\r\n if (!this._lightListBuffer || this._lightListCapacity < capacity) {\r\n this._lightListBuffer?.dispose();\r\n this._lightListBuffer = device.createBuffer(capacity * 4, { usage: 'uniform', storage: true })!;\r\n this._lightListCapacity = capacity;\r\n }\r\n if (!this._listCounterBuffer) {\r\n this._listCounterBuffer = device.createBuffer(16, { usage: 'uniform', storage: true })!;\r\n }\r\n if (!this._listCounterReadBuffer) {\r\n this._listCounterReadBuffer = device.createBuffer(16, { usage: 'read' })!;\r\n }\r\n }\r\n /**\r\n * Reads back how many list entries the clusters asked for, so the next builds can\r\n * size the list to fit. One read is in flight at a time.\r\n */\r\n private readBackListRequest() {\r\n if (this._readbackPending) {\r\n return;\r\n }\r\n this._readbackPending = true;\r\n // The read buffer is copied into only while no read is pending, so a copy never\r\n // lands in it while it is being mapped.\r\n getDevice().copyBuffer(this._listCounterBuffer!, this._listCounterReadBuffer!, 0, 0, 16);\r\n this._listCounterReadBuffer!.getBufferSubData(this._readback, 0, 16).then(\r\n () => {\r\n this._readbackPending = false;\r\n const requested = new Uint32Array(this._readback.buffer, 0, 4)[1];\r\n this._requestedListEntries = requested;\r\n if (requested > MAX_LIST_ENTRIES && !this._warnedListOverflow) {\r\n this._warnedListOverflow = true;\r\n console.warn(\r\n `ClusteredLight: the light clusters ask for ${requested} list entries, above the ` +\r\n `${MAX_LIST_ENTRIES} budget; crowded clusters keep only their strongest lights. ` +\r\n `Giving lights a finite range usually cuts this down by orders of magnitude.`\r\n );\r\n }\r\n },\r\n () => {\r\n this._readbackPending = false;\r\n }\r\n );\r\n }\r\n /** Grows the CPU-side light arrays to hold `count` entries (slot 0 included). */\r\n private ensureLightArrayCapacity(count: number) {\r\n const stride = SPHERE_STRIDE;\r\n if (this._lights.length >= count * 16) {\r\n return;\r\n }\r\n const capacity = 1 << Math.ceil(Math.log2(count));\r\n this._lights = new Float32Array(capacity * 16);\r\n this._lightSpheres = new Float32Array(capacity * 4 * stride);\r\n }\r\n /** Creates the uniform light buffer read by the lit shaders, laid out as ShaderHelper declares it. */\r\n private createLightBuffer(device: AbstractDevice) {\r\n const lightBufferType = new PBStructTypeInfo('ClusteredLightBuffer', 'std140', [\r\n {\r\n name: ShaderHelper.getLightBufferUniformName(),\r\n type: new PBArrayTypeInfo(\r\n new PBPrimitiveTypeInfo(PBPrimitiveType.F32VEC4),\r\n (ShaderHelper.getMaxClusterLights() + 1) * 4\r\n )\r\n }\r\n ]);\r\n this._lightBuffer = device.createStructuredBuffer(lightBufferType, { usage: 'uniform' });\r\n }\r\n private createLightIndexTexture(device: AbstractDevice) {\r\n // One texel per cluster in row-major order; the tail of the last row is unused.\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n const textureWidth = Math.min(\r\n 1 << Math.ceil(Math.log2(Math.ceil(Math.sqrt(numClusters)))),\r\n device.getDeviceCaps().textureCaps.maxTextureSize\r\n );\r\n const textureHeight = Math.ceil(numClusters / textureWidth);\r\n this._lightIndexTexture = device.createTexture2D('rgba32ui', textureWidth, textureHeight, {\r\n mipmapping: false\r\n })!;\r\n this._lightIndexTexture.name = 'ClusterLightIndex';\r\n this._lightIndexTexSize[0] = textureWidth;\r\n this._lightIndexTexSize[1] = textureHeight;\r\n this._lightIndexFramebuffer?.dispose();\r\n this._lightIndexFramebuffer = device.createFrameBuffer([this._lightIndexTexture], null);\r\n }\r\n /**\r\n * Builds the per-cluster light lists for a camera.\r\n *\r\n * @param width - Width in device pixels of the target the lit pass will draw into.\r\n * @param height - Height in device pixels of that target.\r\n *\r\n * @remarks\r\n * The lit shader maps `fragCoord` to a tile with `width`/`height`, so they must be the\r\n * size of the target it actually renders to, not whatever viewport is current here.\r\n */\r\n calculateLightIndex(\r\n camera: Camera,\r\n renderQueue: RenderQueue,\r\n width: number,\r\n height: number,\r\n screenSpaceShadowMask = camera.screenSpaceShadowMask,\r\n preExposure = 1\r\n ) {\r\n const numLights = this.getVisibleLights(camera, renderQueue, screenSpaceShadowMask, preExposure);\r\n const device = getDevice();\r\n const compute = ShaderHelper.usesClusterLightLists();\r\n this.resizeGrid(width, height);\r\n if (compute) {\r\n this.ensureStorageLightCapacity(device, numLights + 1);\r\n this.ensureListBuffers(device, numLights);\r\n } else if (!this._lightIndexTexture) {\r\n this.createLightIndexTexture(device);\r\n }\r\n if (!this._lightIndexProgram) {\r\n this.createProgram(device);\r\n }\r\n if (!compute && !this._lightBuffer) {\r\n this.createLightBuffer(device);\r\n }\r\n if (!compute && !this._lightIndexVertexLayout) {\r\n this.createVertexLayout(device, this._lightIndexTexture!.width, this._lightIndexTexture!.height);\r\n }\r\n if (!compute && !this._lightIndexRenderStates) {\r\n this.createRenderState(device);\r\n }\r\n const vw = width;\r\n const vh = height;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n // The lit shader computes slice = t * scale + bias, where t is log2(view depth) for\r\n // perspective (exponential slices) and the view depth itself for orthographic (linear\r\n // slices: an orthographic near plane may be zero or negative, where log2 is undefined).\r\n this._orthographic = !camera.isPerspective();\r\n let scale: number;\r\n let bias: number;\r\n if (this._orthographic) {\r\n scale = this._tileCountZ / (far - near);\r\n bias = -near * scale;\r\n } else {\r\n // A near slice pays off only when it spans more than one regular exponential slice.\r\n const split = NEAR_SLICE_METERS / (camera.scene?.metersPerUnit ?? 1);\r\n const nearSlice = split > near * Math.pow(far / near, 1 / this._tileCountZ) && split < far;\r\n const expStart = nearSlice ? split : near;\r\n const firstExpSlice = nearSlice ? 1 : 0;\r\n const numExpSlices = this._tileCountZ - firstExpSlice;\r\n scale = numExpSlices / Math.log2(far / expStart);\r\n // Depths before the split land below firstExpSlice, which the lit shader's clamp\r\n // and integer conversion take to slice 0.\r\n bias = firstExpSlice - Math.log2(expStart) * scale;\r\n this._sliceParam.setXYZW(expStart, firstExpSlice, numExpSlices, 0);\r\n }\r\n this._clusterParam.setXYZW(vw, vh, scale, bias);\r\n this._sizeParam.setXYZW(vw, vh, near, far);\r\n this._countParam[0] = this._tileCountX;\r\n this._countParam[1] = this._tileCountY;\r\n this._countParam[2] = this._tileCountZ;\r\n // countParam.w stores light count + 1 because clustered indices start from 1.\r\n // Keep it valid even when there are no unshadowed punctual lights so clustered\r\n // shading math stays well-defined for emissive and environment lighting paths.\r\n this._countParam[3] = numLights + 1;\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n device.pushDeviceStates();\r\n if (!compute) {\r\n device.setFramebuffer(this._lightIndexFramebuffer);\r\n // setFramebuffer may no-op, so reset viewport and scissor explicitly.\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n // The compute pass writes every cluster itself, empty ones included.\r\n if (compute || numLights > 0) {\r\n if (this._lightSphereBuffer!.disposed) {\r\n this._lightSphereBuffer!.reload();\r\n }\r\n // Slot 0 is never read, so upload only up to the last light.\r\n if (this._lightBuffer!.disposed) {\r\n this._lightBuffer!.reload();\r\n }\r\n this._lightBuffer!.bufferSubData(0, this._lights, 0, (numLights + 1) * 16);\r\n this._lightSphereBuffer!.bufferSubData(0, this._lightSpheres, 0, (numLights + 1) * 4 * SPHERE_STRIDE);\r\n this._bindGroup!.setValue('invProjMatrix', camera.getInvProjectionMatrix());\r\n this._bindGroup!.setValue('sizeParam', this._sizeParam);\r\n this._bindGroup!.setValue('countParam', this._countParam);\r\n this._bindGroup!.setValue('orthoProj', this._orthographic ? 1 : 0);\r\n this._bindGroup!.setValue('sliceParam', this._sliceParam);\r\n this._bindGroup!.setBuffer(UNIFORM_NAME_LIGHT_SPHERES, this._lightSphereBuffer!);\r\n device.setProgram(this._lightIndexProgram);\r\n if (compute) {\r\n const numGroups = Math.ceil(numClusters / INDEX_GROUP_SIZE);\r\n this._listCounterBuffer!.bufferSubData(0, this._listCounterZero);\r\n const countBindGroup = this._countBindGroup!;\r\n countBindGroup.setValue('invProjMatrix', camera.getInvProjectionMatrix());\r\n countBindGroup.setValue('sizeParam', this._sizeParam);\r\n countBindGroup.setValue('countParam', this._countParam);\r\n countBindGroup.setValue('orthoProj', this._orthographic ? 1 : 0);\r\n countBindGroup.setValue('sliceParam', this._sliceParam);\r\n countBindGroup.setBuffer(UNIFORM_NAME_LIGHT_SPHERES, this._lightSphereBuffer!);\r\n countBindGroup.setBuffer('clusterGrid', this._clusterGridBuffer!);\r\n countBindGroup.setBuffer('listCounter', this._listCounterBuffer!);\r\n device.setProgram(this._lightCountProgram);\r\n device.setBindGroup(0, countBindGroup);\r\n device.compute(numGroups, 1, 1);\r\n this._bindGroup!.setValue('listCapacity', this._lightListCapacity);\r\n this._bindGroup!.setBuffer('clusterGrid', this._clusterGridBuffer!);\r\n this._bindGroup!.setBuffer('lightList', this._lightListBuffer!);\r\n this._bindGroup!.setBuffer('listCounter', this._listCounterBuffer!);\r\n device.setProgram(this._lightIndexProgram);\r\n device.setBindGroup(0, this._bindGroup!);\r\n device.compute(numGroups, 1, 1);\r\n this.readBackListRequest();\r\n } else {\r\n device.setVertexLayout(this._lightIndexVertexLayout);\r\n device.setBindGroup(0, this._bindGroup!);\r\n const savedRS = device.getRenderStates();\r\n device.setRenderStates(this._lightIndexRenderStates);\r\n device.draw('point-list', 0, numClusters);\r\n device.setRenderStates(savedRS);\r\n }\r\n } else {\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 0), DEPTH_CLEAR_VALUE, 0);\r\n }\r\n device.popDeviceStates();\r\n }\r\n /**\r\n * Orders `lights` by estimated contribution at the camera, most important first.\r\n *\r\n * @remarks\r\n * Both caps drop lights by buffer index - the global one truncates the tail, and\r\n * a full cluster keeps its lowest 16 indices - so without this whichever lights the\r\n * scene traversal happened to reach last are the ones that vanish. The score is\r\n * `brightness * r^2 / (r^2 + d^2)`, with `r` the radius of the sphere bounding the\r\n * lit region and `d` the camera's distance to it: 0 from anywhere inside it, falling\r\n * off with distance beyond it, and larger for lights that reach further. The sphere is\r\n * getLightBounds', so a spot light pointing away from the camera ranks by where it\r\n * shines rather than where it stands, and the brightness is lightBrightness', so a\r\n * rect light counts its whole area. Directional lights have no range and light\r\n * everything, so they always rank first.\r\n */\r\n private prioritize(lights: PunctualLight[], eye: Vector3) {\r\n if (lights.length < 2) {\r\n return;\r\n }\r\n // Scores and a permutation in reused typed arrays, so a frame allocates nothing.\r\n const n = lights.length;\r\n if (this._sortScores.length < n) {\r\n const capacity = 1 << Math.ceil(Math.log2(n));\r\n this._sortScores = new Float64Array(capacity);\r\n this._sortOrder = new Uint32Array(capacity);\r\n }\r\n const scores = this._sortScores;\r\n const order = this._sortOrder.subarray(0, n);\r\n const sorted = this._sortScratch;\r\n sorted.length = n;\r\n for (let i = 0; i < n; i++) {\r\n const light = lights[i];\r\n getLightBounds(light, _bounds);\r\n const range = _bounds[3];\r\n let score: number;\r\n if (light.isDirectionLight() || range <= 0) {\r\n score = Infinity;\r\n } else {\r\n const dx = _bounds[0] - eye.x;\r\n const dy = _bounds[1] - eye.y;\r\n const dz = _bounds[2] - eye.z;\r\n const d = Math.max(Math.sqrt(dx * dx + dy * dy + dz * dz) - range, 0);\r\n const range2 = range * range;\r\n score = (lightBrightness(light) * range2) / (range2 + d * d);\r\n }\r\n scores[i] = score;\r\n order[i] = i;\r\n sorted[i] = light;\r\n }\r\n order.sort(this._compareScores);\r\n for (let i = 0; i < n; i++) {\r\n lights[i] = sorted[order[i]];\r\n }\r\n sorted.length = 0;\r\n }\r\n /**\r\n * Orders buffer positions by descending score. Ties go to the lower position, which\r\n * keeps equally important lights in traversal order frame to frame. Compared rather\r\n * than subtracted: two directional lights would give Infinity - Infinity.\r\n */\r\n private readonly _compareScores = (a: number, b: number) => {\r\n const sa = this._sortScores[a];\r\n const sb = this._sortScores[b];\r\n return sa > sb ? -1 : sa < sb ? 1 : a - b;\r\n };\r\n private getVisibleLights(\r\n camera: Camera,\r\n renderQueue: RenderQueue,\r\n useShadowMask: boolean,\r\n preExposure: number\r\n ) {\r\n this.ensureLightArrayCapacity(\r\n Math.min(\r\n renderQueue.shadowedLights.length + renderQueue.unshadowedLights.length,\r\n ShaderHelper.getMaxClusterLights()\r\n ) + 1\r\n );\r\n const lights = this._lights;\r\n const view = camera.viewMatrix;\r\n const spheres = this._lightSpheres;\r\n const sphereStride = SPHERE_STRIDE;\r\n const globalLights = this._globalLights;\r\n globalLights.fill(0);\r\n let numGlobal = 0;\r\n const writeLight = (light: PunctualLight, slot: number) => {\r\n const offset = slot * 16;\r\n const colorIntensity = light.diffuseAndIntensity;\r\n const posRange = light.positionAndRange;\r\n const dirCutoff = light.directionAndCutoff;\r\n lights.set(posRange, offset);\r\n // Culling sphere: radius < 0 = shaded through a global slot, skipped by the index\r\n // pass; 0 = unbounded, in every cluster; otherwise it bounds the lit region.\r\n getLightBounds(light, _bounds);\r\n const x = _bounds[0];\r\n const y = _bounds[1];\r\n const z = _bounds[2];\r\n let radius = _bounds[3];\r\n if (radius <= 0) {\r\n if (numGlobal < MAX_GLOBAL_LIGHTS) {\r\n globalLights[numGlobal++] = slot;\r\n radius = -1;\r\n } else {\r\n radius = 0;\r\n }\r\n }\r\n // The view matrix is column-major.\r\n const s = slot * 4 * sphereStride;\r\n spheres[s + 0] = view[0] * x + view[4] * y + view[8] * z + view[12];\r\n spheres[s + 1] = view[1] * x + view[5] * y + view[9] * z + view[13];\r\n spheres[s + 2] = view[2] * x + view[6] * y + view[10] * z + view[14];\r\n spheres[s + 3] = radius;\r\n // Ranks the lights competing for a crowded cluster; same measure as prioritize().\r\n spheres[s + 4] = lightBrightness(light);\r\n lights.set(dirCutoff, offset + 4);\r\n // Only the intensity carries the camera pre-exposure; the color stays as authored. The\r\n // light's own cached vector must not be mutated because it is shared across cameras.\r\n lights[offset + 8] = colorIntensity.x;\r\n lights[offset + 9] = colorIntensity.y;\r\n lights[offset + 10] = colorIntensity.z;\r\n lights[offset + 11] = colorIntensity.w * preExposure;\r\n lights.set(light.extraParams, offset + 12);\r\n };\r\n // When the screen-space shadow mask is active, shadow-casting lights occupy\r\n // the head of the buffer (slots 1..N) in the exact order of\r\n // renderQueue.shadowedLights. The mask pass must assign layers/channels from\r\n // the SAME list in the SAME order so that a light's buffer index maps to its\r\n // mask slot without storing a per-light index. Keep these two in lockstep.\r\n let numShadow = 0;\r\n let slot = 0;\r\n if (useShadowMask) {\r\n numShadow = Math.min(\r\n renderQueue.shadowedLights.length,\r\n MAX_SHADOW_MASK_LIGHTS,\r\n ShaderHelper.getMaxClusterLights()\r\n );\r\n for (let i = 1; i <= numShadow; i++) {\r\n writeLight(renderQueue.shadowedLights[i - 1], i);\r\n }\r\n slot = numShadow;\r\n }\r\n // Everything without a mask slot fills the region after the mask-backed shadow\r\n // lights: the unshadowed lights, plus shadow-casting lights beyond the mask\r\n // capacity (MAX_SHADOW_MASK_LIGHTS). Rather than dropping the latter silently they\r\n // are still lit here - without a mask sample, i.e. degraded to no shadow. Both\r\n // compete for the remaining slots on equal terms, most important first.\r\n const rest = this._rest;\r\n rest.length = 0;\r\n for (const light of renderQueue.unshadowedLights) {\r\n rest.push(light);\r\n }\r\n const overflow = useShadowMask ? renderQueue.shadowedLights.length - numShadow : 0;\r\n for (let k = 0; k < overflow; k++) {\r\n rest.push(renderQueue.shadowedLights[numShadow + k]);\r\n }\r\n this.prioritize(rest, camera.getWorldPosition());\r\n const numRest = Math.min(rest.length, ShaderHelper.getMaxClusterLights() - slot);\r\n for (let j = 0; j < numRest; j++) {\r\n writeLight(rest[j], slot + j + 1);\r\n }\r\n slot += numRest;\r\n if (overflow > 0 && !ClusteredLight._warnedShadowMaskOverflow) {\r\n ClusteredLight._warnedShadowMaskOverflow = true;\r\n const dropped = rest.length - numRest;\r\n console.warn(\r\n `ClusteredLight: ${renderQueue.shadowedLights.length} shadow-casting lights exceed the ` +\r\n `screen-space shadow mask capacity (${MAX_SHADOW_MASK_LIGHTS}); ${overflow} light(s) are ` +\r\n `lit without shadows${dropped > 0 ? `, and the ${dropped} least important light(s) dropped` : ''}.`\r\n );\r\n }\r\n rest.length = 0;\r\n this._numShadowLights = numShadow;\r\n return slot;\r\n }\r\n}\r\n"],"names":["UNIFORM_NAME_LIGHT_SPHERES","SPHERE_STRIDE","TILE_SIZE_PX","MAX_TILES_PER_AXIS","TILE_COUNT_Z","NEAR_SLICE_METERS","INDEX_GROUP_SIZE","LIST_LIGHTS_PER_CLUSTER","MAX_LIST_ENTRIES","SCORE_BUCKETS","declareIndexPassScope","pb","scope","sphereStride","storage","invProjMatrix","mat4","uniform","sizeParam","vec4","countParam","ivec4","orthoProj","int","sliceParam","storageBufferReadonly","ShaderHelper","getMaxClusterLights","uniformBuffer","func","vec3","float","$l","normal","ab","sub","b","a","t","div","zDistance","dot","$return","add","mul","$if","lessThan","k","y","z","x","pow","w","view","clip","texCoord","screen","xy","vec2","clipToView","d","max","aabbMin","p","aabbMax","or","equal","sphere","lessThanEqual","distSq","r","neg","and","greaterThan","left","xyz","right","bottom","top","call","emitClusterBounds","tileIndex","tileSize","zIndex","yIndex","xIndex","maxPoint_sS","minPoint_sS","maxPoint_vS","screenToView","minPoint_vS","sliceNear","sliceFar","planeLeft","planeRight","planeBottom","planeTop","notEqual","tileNear","mix","tileFar","min","$else","sliceDepth","eyePos","minPointNear","lineIntersectionToZPlane","minPointFar","maxPointNear","maxPointFar","lo","hi","normalize","emitSelectionInit","n","lightIndex","uint","lightScore","minSlot","minScore","emitScoreSetup","halfDiagSq","center","emitLightScore","brightness","score","lightPos","f","clamp","toCenter","emitLightReaches","aabbDistSq","greaterThanEqual","sphereReachesAABB","not","sphereOutsideTile","emitConsiderLight","index","setAt","$elseif","$continue","$for","at","emitPackSelection","sal","g","uvec4","lightBrightness","light","c","diffuseAndIntensity","Math","isRectLight","width","height","getLightBounds","out","posRange","positionAndRange","isSpotLight","dirCutoff","directionAndCutoff","cosAngle","len","hypot","dist","SQRT1_2","sqrt","_bounds","Float32Array","ClusteredLight","_warnedShadowMaskOverflow","_pool","acquire","tileCount","findIndex","cl","_tileCountX","_tileCountY","splice","pop","size","ceil","release","push","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_countBindGroup","_readbackPending","_readback","_warnedListOverflow","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_lightSphereBuffer","_lightListCapacity","_listCounterZero","_lightIndexTexSize","_sizeParam","_countParam","_clusterParam","_numShadowLights","_orthographic","_sortOrder","_sortScratch","_lightSpheres","_globalLights","Int32Array","MAX_GLOBAL_LIGHTS","_storageLightCapacity","_clusterGridBuffer","_lightListBuffer","_listCounterBuffer","_listCounterReadBuffer","Uint32Array","_lightCountProgram","_requestedListEntries","Uint8Array","_lightIndexVertexBuffer","Vector4","_sliceParam","_rest","_sortScores","Float64Array","lightBuffer","numShadowLights","orthographic","globalLights","clusterParam","lightIndexTexture","lightIndexTexSize","clusterGridBuffer","lightListBuffer","createVertexLayout","device","textureWidth","textureHeight","numClusters","vertices","i","ix","iy","floor","vb","createVertexBuffer","vertexBuffers","buffer","resizeGrid","dispose","createRenderState","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","createProgram","type","setup","pb0","clusterGrid","storageBuffer","listCounter","atomic_uint","batchSpheres","workgroup","batchBrightness","emitMainSetup","cluster","$builtins","globalInvocationId","valid","cell","local","localInvocationId","numLights","numBatches","forEachBatchedLight","test","body","base","li","workgroupBarrier","batchCount","lightId","j","buildComputeProgram","label","workgroupSize","compute","main","listCount","atomicAdd","name","createBindGroup","bindGroupLayouts","listCapacity","lightList","log2","need","total","atomicLoad","allowed","truncated","hist","h","bucket","scoreBucket","cutBucket","cutRoom","kept","$break","listOffset","select","written","keep","buildRenderProgram","vertex","$inputs","pos","attrib","$outputs","value","pointSize","position","vertexIndex","fragment","color","usesClusterLightLists","sphereBufferType","getBindingInfo","createStructuredBuffer","usage","ensureStorageLightCapacity","count","capacity","createBuffer","ensureListBuffers","getDevice","copyBuffer","getBufferSubData","then","requested","console","warn","ensureLightArrayCapacity","stride","length","createLightBuffer","lightBufferType","PBStructTypeInfo","getLightBufferUniformName","PBArrayTypeInfo","PBPrimitiveTypeInfo","PBPrimitiveType","F32VEC4","createLightIndexTexture","getDeviceCaps","textureCaps","maxTextureSize","createTexture2D","mipmapping","createFrameBuffer","calculateLightIndex","camera","renderQueue","screenSpaceShadowMask","preExposure","getVisibleLights","vw","vh","near","getNearPlane","far","getFarPlane","isPerspective","scale","bias","split","scene","metersPerUnit","nearSlice","expStart","firstExpSlice","numExpSlices","setXYZW","pushDeviceStates","setFramebuffer","setViewport","setScissor","disposed","reload","bufferSubData","setValue","getInvProjectionMatrix","setBuffer","setProgram","numGroups","countBindGroup","setBindGroup","readBackListRequest","setVertexLayout","savedRS","getRenderStates","setRenderStates","draw","clearFrameBuffer","DEPTH_CLEAR_VALUE","popDeviceStates","prioritize","lights","eye","scores","order","subarray","sorted","range","isDirectionLight","Infinity","dx","dy","dz","range2","sort","_compareScores","sa","sb","useShadowMask","shadowedLights","unshadowedLights","viewMatrix","spheres","fill","numGlobal","writeLight","slot","offset","colorIntensity","set","radius","s","extraParams","numShadow","MAX_SHADOW_MASK_LIGHTS","rest","overflow","getWorldPosition","numRest","dropped"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { ClipState } from '@zephyr3d/base';
2
2
  import { OctreeNode } from '../scene/octree.js';
3
3
  import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values.js';
4
+ import { getDevice } from '../app/api.js';
5
+ import { warnUnsupported } from '../utility/unsupported.js';
4
6
 
5
7
  /**
6
8
  * Node visitor for culling
@@ -12,14 +14,16 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
12
14
  /** @internal */ _renderPass;
13
15
  /** @internal */ _isGPUPicking;
14
16
  /** @internal */ _isShadowMapping;
17
+ /** @internal */ _lodCamera;
15
18
  /**
16
19
  * Creates an instance of CullVisitor
17
20
  * @param renderPass - Render pass for the culling task
18
21
  * @param camera - Camera that will be used for culling
19
22
  * @param rendeQueue - RenderQueue
20
- * @param viewPoint - Camera position of the primary render pass
21
- */ constructor(renderPass, camera, renderQueue){
23
+ * @param lodCamera - Camera whose view selects the levels of detail, the culling camera by default
24
+ */ constructor(renderPass, camera, renderQueue, lodCamera){
22
25
  this._camera = camera;
26
+ this._lodCamera = lodCamera ?? camera;
23
27
  this._renderQueue = renderQueue;
24
28
  this._skipClipTest = false;
25
29
  this._renderPass = renderPass;
@@ -32,6 +36,15 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
32
36
  set camera(camera) {
33
37
  this._camera = camera || null;
34
38
  }
39
+ /**
40
+ * The camera whose view selects the levels of detail: the view being rendered, which for shadow
41
+ * maps is not the culling camera
42
+ */ get lodCamera() {
43
+ return this._lodCamera;
44
+ }
45
+ set lodCamera(camera) {
46
+ this._lodCamera = camera;
47
+ }
35
48
  /** true if cull with frustum culling, otherwise false. default is true */ get frustumCulling() {
36
49
  return !this._skipClipTest;
37
50
  }
@@ -50,8 +63,8 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
50
63
  /** Frustum for culling */ get frustum() {
51
64
  return this._camera?.frustum || null;
52
65
  }
53
- /** @internal */ push(camera, drawable) {
54
- this.renderQueue.push(camera, drawable);
66
+ /** @internal */ push(camera, drawable, lod = 0) {
67
+ this.renderQueue.push(camera, drawable, lod);
55
68
  }
56
69
  /** @internal */ pushRenderQueue(renderQueue) {
57
70
  this.renderQueue.pushRenderQueue(renderQueue);
@@ -164,7 +177,7 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
164
177
  if (!node.hidden && (node.castShadow || !this._isShadowMapping) && (node.gpuPickable || !this._isGPUPicking)) {
165
178
  const clipState = this.getClipStateWithNode(node);
166
179
  if (clipState !== ClipState.NOT_CLIPPED) {
167
- this.push(this._camera, node);
180
+ this.push(this._camera, node, node.selectLod(this._lodCamera));
168
181
  return true;
169
182
  }
170
183
  }
@@ -178,6 +191,13 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
178
191
  * strand material has a transparent shadow caster path built for exactly that.
179
192
  * @internal
180
193
  */ visitHair(node) {
194
+ if (getDevice().type !== 'webgpu') {
195
+ // Kept out of the queue entirely: the strand shader reads storage buffers
196
+ // from the vertex stage, so every pass that drew it would fail to build its
197
+ // program and log an error that does not say why.
198
+ warnUnsupported('Hair strands (Hair node)', 'WebGPU', 'hair is not drawn');
199
+ return false;
200
+ }
181
201
  if (!node.hidden && (node.castShadow || !this._isShadowMapping) && (node.gpuPickable || !this._isGPUPicking)) {
182
202
  const clipState = this.getClipStateWithNode(node);
183
203
  if (clipState !== ClipState.NOT_CLIPPED) {
@@ -1 +1 @@
1
- {"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { MSDFText, MSDFTextSprite, ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\nimport type { HairNode } from '../scene/hair';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param viewPoint - Camera position of the primary render pass\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue) {\r\n this._camera = camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable) {\r\n this.renderQueue.push(camera, drawable);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isHair()) {\r\n return this.visitHair(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else if (target.isMSDFTextSprite()) {\r\n return this.visitMSDFTextSprite(target);\r\n } else if (target.isMSDFText()) {\r\n return this.visitMSDFText(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFText(node: MSDFText) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFTextSprite(node: MSDFTextSprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Visits a hair node.\r\n *\r\n * @remarks\r\n * Treated like a mesh rather than like water: hair casts shadows, and the\r\n * strand material has a transparent shadow caster path built for exactly that.\r\n * @internal\r\n */\r\n visitHair(node: HairNode) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n this.renderQueue.pushWater(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","_camera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isHair","visitHair","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","isMSDFTextSprite","visitMSDFTextSprite","isMSDFText","visitMSDFText","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","batch","batches","pushWater","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":"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"}
1
+ {"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { MSDFText, MSDFTextSprite, ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\nimport type { HairNode } from '../scene/hair';\r\nimport { getDevice } from '../app/api';\r\nimport { warnUnsupported } from '../utility/unsupported';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /** @internal */\r\n private _lodCamera: Camera;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param lodCamera - Camera whose view selects the levels of detail, the culling camera by default\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue, lodCamera?: Camera) {\r\n this._camera = camera;\r\n this._lodCamera = lodCamera ?? camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /**\r\n * The camera whose view selects the levels of detail: the view being rendered, which for shadow\r\n * maps is not the culling camera\r\n */\r\n get lodCamera() {\r\n return this._lodCamera;\r\n }\r\n set lodCamera(camera: Camera) {\r\n this._lodCamera = camera;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable, lod = 0) {\r\n this.renderQueue.push(camera, drawable, lod);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isHair()) {\r\n return this.visitHair(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else if (target.isMSDFTextSprite()) {\r\n return this.visitMSDFTextSprite(target);\r\n } else if (target.isMSDFText()) {\r\n return this.visitMSDFText(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFText(node: MSDFText) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFTextSprite(node: MSDFTextSprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node, node.selectLod(this._lodCamera));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Visits a hair node.\r\n *\r\n * @remarks\r\n * Treated like a mesh rather than like water: hair casts shadows, and the\r\n * strand material has a transparent shadow caster path built for exactly that.\r\n * @internal\r\n */\r\n visitHair(node: HairNode) {\r\n if (getDevice().type !== 'webgpu') {\r\n // Kept out of the queue entirely: the strand shader reads storage buffers\r\n // from the vertex stage, so every pass that drew it would fail to build its\r\n // program and log an error that does not say why.\r\n warnUnsupported('Hair strands (Hair node)', 'WebGPU', 'hair is not drawn');\r\n return false;\r\n }\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n this.renderQueue.pushWater(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","lodCamera","_camera","_lodCamera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","lod","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isHair","visitHair","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","isMSDFTextSprite","visitMSDFTextSprite","isMSDFText","visitMSDFText","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","batch","batches","selectLod","getDevice","warnUnsupported","pushWater","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":"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"}