@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
@@ -2,9 +2,14 @@ import { RenderPass } from './renderpass.js';
2
2
  import { MaterialVaryingFlags, RENDER_PASS_TYPE_LIGHT, QUEUE_OPAQUE, QUEUE_TRANSPARENT } from '../values.js';
3
3
  import { Vector4 } from '@zephyr3d/base';
4
4
  import { ShaderHelper } from '../material/shader/helper.js';
5
+ import { warnUnsupported } from '../utility/unsupported.js';
6
+ import { DualDepthPeelingOIT } from './dualdepthpeeling_oit.js';
7
+ import { getActiveProbeVolume } from './gi/probe_volume.js';
5
8
 
6
9
  const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SCENE_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE;
7
- const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SCENE_STORE_NORMAL;
10
+ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SCENE_STORE_NORMAL | // The skin mask is a surface property, not accumulated lighting: the base
11
+ // pass establishes it and additive light passes must leave it alone.
12
+ MaterialVaryingFlags.SKIN_SSS_STORE;
8
13
  /**
9
14
  * Forward render pass
10
15
  * @internal
@@ -64,7 +69,7 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
64
69
  attachments.push(ctx.SSSTransmissionTexture);
65
70
  }
66
71
  if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {
67
- attachments.push(ctx.SkinSSSTexture);
72
+ attachments.push(ctx.SSSMaskTexture);
68
73
  }
69
74
  return attachments.length === 1 ? attachments[0] : attachments;
70
75
  }
@@ -87,15 +92,16 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
87
92
  return shadowMapInfo.keys().next().value ?? null;
88
93
  }
89
94
  /** @internal */ _getGlobalBindGroupHash(ctx, camera) {
90
- return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0}`;
95
+ return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0}:${ctx.transmissionThickness ? 1 : 0}:${ShaderHelper.getSceneSDF(ctx)?.levels ?? 0}`;
91
96
  }
92
97
  /** @internal */ _getShaderVariantHash(ctx, camera) {
93
98
  const textureVariant = (texture)=>texture ? `1:${texture.format}` : '0';
94
- return `LightPassShaderVariant:${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(ctx.sceneColorTexture)}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0}`;
99
+ return `LightPassShaderVariant:${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(ctx.sceneColorTexture)}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0}:${ctx.transmissionThickness ? 1 : 0}:${textureVariant(ctx.transmissionThicknessTexture)}:${ShaderHelper.getSceneSDF(ctx)?.levels ?? 0}`;
95
100
  }
96
101
  /** @internal */ renderLightPass(ctx, camera, itemList, lights, flags) {
97
102
  const baseLightPass = !ctx.lightBlending;
98
- ctx.drawEnvLight = baseLightPass && ctx.env.light.type !== 'none' && (ctx.env.light.envLight.hasRadiance() || ctx.env.light.envLight.hasIrradiance());
103
+ // Without an environment light probe GI still applies via EnvProbesOnly
104
+ ctx.drawEnvLight = baseLightPass && (ctx.env.light.type !== 'none' ? ctx.env.light.envLight.hasRadiance() || ctx.env.light.envLight.hasIrradiance() : !!getActiveProbeVolume(ctx.scene));
99
105
  ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);
100
106
  ctx.shaderVariantHash = this._getShaderVariantHash(ctx, camera);
101
107
  const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);
@@ -107,7 +113,7 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
107
113
  ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);
108
114
  } else {
109
115
  if (!flags.lightSet[ctx.renderPassHash]) {
110
- ShaderHelper.setLightUniforms(bindGroup, ctx, ctx.clusteredLight.clusterParam, ctx.clusteredLight.countParam, ctx.clusteredLight.lightBuffer, ctx.clusteredLight.lightIndexTexture);
116
+ ShaderHelper.setLightUniforms(bindGroup, ctx, ctx.clusteredLight);
111
117
  flags.lightSet[ctx.renderPassHash] = 1;
112
118
  }
113
119
  // Bind the per-queue cluster shadow-mask mode every call (not cached with
@@ -118,7 +124,7 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
118
124
  }
119
125
  }
120
126
  if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {
121
- ShaderHelper.setFogUniforms(bindGroup, ctx.env.sky.skyType === 'scatter' ? 1 : 0, ctx.env.sky.mappedFogType, baseLightPass ? 0 : 1, ctx.env.sky.atmosphereParams, ctx.env.sky.heightFogParams, ctx.env.sky.getAerialPerspectiveLUT(ctx), ctx.env.sky.getSkyDistantLightLUT(ctx));
127
+ ShaderHelper.setFogUniforms(bindGroup, ctx.env.sky.skyType === 'scatter' ? 1 : 0, ctx.env.sky.mappedFogType, baseLightPass ? 0 : 1, ctx.env.sky.atmosphereParams, ctx.env.sky.getUploadHeightFogParams(), ctx.env.sky.getAerialPerspectiveLUT(ctx), ctx.env.sky.getSkyDistantLightLUT(ctx), ctx.env.sky.getFogSkyLightCubemap(ctx));
122
128
  flags.fogSet[ctx.renderPassHash] = 1;
123
129
  }
124
130
  ctx.device.setBindGroup(0, bindGroup);
@@ -144,7 +150,12 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
144
150
  const tmpFramebuffer = surfaceMRT ? ctx.device.pool.fetchTemporalFramebuffer(false, ctx.device.getDrawingBufferWidth(), ctx.device.getDrawingBufferHeight(), this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags), ctx.device.getFramebuffer().getDepthAttachment()) : null;
145
151
  const needsTransparentSingleColorFramebuffer = !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;
146
152
  const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer ? ctx.device.pool.fetchTemporalFramebuffer(false, ctx.device.getDrawingBufferWidth(), ctx.device.getDrawingBufferHeight(), this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags), ctx.device.getFramebuffer().getDepthAttachment()) : tmpFramebuffer;
147
- const oit = renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type) ? camera.oit : null;
153
+ const oitSupported = !!camera.oit?.supportDevice(ctx.device.type);
154
+ if (renderQueue.drawTransparent && camera.oit && !oitSupported) {
155
+ const dualDepth = camera.oit.getType() === DualDepthPeelingOIT.type;
156
+ warnUnsupported(`${dualDepth ? 'Dual depth peeling' : 'A-buffer'} OIT (Camera.oitMode)`, dualDepth ? 'per-target blending and float color blending (WebGPU, or WebGL2 with OES_draw_buffers_indexed and EXT_float_blend)' : 'WebGPU', 'transparent objects fall back to sorted alpha blending');
157
+ }
158
+ const oit = renderQueue.drawTransparent && camera.oit && oitSupported ? camera.oit : null;
148
159
  // Sort only when this invocation actually draws the transparent queue.
149
160
  // The opaque pass (and the SSS-profile pass) run with _renderTransparent
150
161
  // === false; without this guard they would sort the transparent lists
@@ -1 +1 @@
1
- {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { Texture2D } from '@zephyr3d/device';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL;\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /** @internal */\r\n protected _renderOpaque: boolean;\r\n /** @internal */\r\n protected _renderTransparent: boolean;\r\n /** @internal */\r\n protected _renderSky: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._renderOpaque = true;\r\n this._renderTransparent = true;\r\n this._renderSky = true;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n get renderOpaque() {\r\n return this._renderOpaque;\r\n }\r\n set renderOpaque(val: boolean) {\r\n this._renderOpaque = !!val;\r\n }\r\n /** @internal */\r\n get renderTransparent() {\r\n return this._renderTransparent;\r\n }\r\n set renderTransparent(val: boolean) {\r\n this._renderTransparent = !!val;\r\n }\r\n /** @internal */\r\n get renderSky() {\r\n return this._renderSky;\r\n }\r\n set renderSky(val: boolean) {\r\n this._renderSky = !!val;\r\n }\r\n /** @internal */\r\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n if (!framebuffer) {\r\n return null;\r\n }\r\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SkinSSSTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n }\r\n /** @internal */\r\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\r\n const shadowMapInfo = ctx.shadowMapInfo;\r\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\r\n return null;\r\n }\r\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\r\n return renderQueue.primaryDirectionalLight;\r\n }\r\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\r\n return renderQueue.primaryTransmissionLight;\r\n }\r\n for (const light of renderQueue.shadowedLights) {\r\n if (shadowMapInfo.has(light)) {\r\n return light;\r\n }\r\n }\r\n return shadowMapInfo.keys().next().value ?? null;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\r\n ctx.HiZTexture?.uid ?? 0\r\n }:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${\r\n ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0\r\n }`;\r\n }\r\n /** @internal */\r\n protected _getShaderVariantHash(ctx: DrawContext, camera: Camera) {\r\n const textureVariant = (texture: Texture2D | null | undefined) => (texture ? `1:${texture.format}` : '0');\r\n return `LightPassShaderVariant:${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(\r\n ctx.sceneColorTexture\r\n )}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${\r\n ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0\r\n }`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n ctx.shaderVariantHash = this._getShaderVariantHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n // Bind the per-queue cluster shadow-mask mode every call (not cached with\r\n // lightSet): the same clustered program/bind group may serve both the opaque\r\n // (sample mask) and transparent (skip shadow lights) queues.\r\n if (ctx.screenSpaceShadowMask) {\r\n ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.shaderVariantHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\r\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const tmpFramebuffer = surfaceMRT\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const needsTransparentSingleColorFramebuffer =\r\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\r\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : tmpFramebuffer;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n // Sort only when this invocation actually draws the transparent queue.\r\n // The opaque pass (and the SSS-profile pass) run with _renderTransparent\r\n // === false; without this guard they would sort the transparent lists\r\n // pointlessly, and the real transparent pass would then sort them again.\r\n if (!oit && renderQueue.drawTransparent && this._renderTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n for (let i = 0; i < lists.length; i++) {\r\n const isOpaquePass = i === 0;\r\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\r\n continue;\r\n }\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n // The screen-space shadow mask is only valid for the opaque depth-prepass\r\n // geometry: lists[0] in non-transmission mode. For that queue, shadow lights\r\n // are lit via the clustered pass sampling the mask (additive passes skipped).\r\n // Every other queue (transparent/OIT hair, transmission) keeps the inline\r\n // additive shadow path, where shadows are sampled per-fragment at the real\r\n // surface depth.\r\n const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;\r\n ctx.shadowMaskClusterSample = useShadowMaskQueue;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n const isolateTransparentABufferLightPasses =\r\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\r\n // Transparent geometry fogs itself, the screen-space pass over the opaque\r\n // scene being unable to reach it. Suppressed while submerged for the same\r\n // reason the screen-space one is: the medium is water, not air.\r\n if (\r\n (ctx.queue === QUEUE_TRANSPARENT || this._transmission) &&\r\n ctx.scene.env.sky.fogPresents &&\r\n !ctx.underwater\r\n ) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n const runLightPass = (lights: PunctualLight[]) => {\r\n if (ctx.oit && isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n return;\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n ctx.oit.endPass(ctx, p);\r\n } else {\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n }\r\n };\r\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\r\n const passFramebuffer =\r\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\r\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\r\n const savedMaterialFlags = ctx.materialFlags;\r\n ctx.materialFlags =\r\n ctx.queue === QUEUE_TRANSPARENT\r\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\r\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(passFramebuffer);\r\n try {\r\n runLightPass(lights);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.device.popDeviceStates();\r\n }\r\n } else {\r\n runLightPass(lights);\r\n }\r\n };\r\n let lightIndex = 0;\r\n // Run the per-shadowed-light additive passes unless this queue uses the\r\n // screen-space shadow mask (opaque). Transparent/transmission queues keep\r\n // the inline additive shadow path even when the mask is enabled.\r\n if (!useShadowMaskQueue && ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n runAdditiveLightPass([k]);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n runAdditiveLightPass(renderQueue.unshadowedLights);\r\n }\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture && this._renderSky) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n // Post effects of all layers are built as render graph passes; the\r\n // opaque-layer chain runs between the opaque and transparent passes.\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\r\n }\r\n ctx.oit = null;\r\n }\r\n}\r\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SCENE_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SCENE_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_renderSky","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","renderSky","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","screenSpaceShadowMask","scene","lightingMode","ShaderHelper","usesWaterCaustics","_getShaderVariantHash","textureVariant","texture","format","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","shaderVariantHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","setShadowMaskMode","shadowMaskClusterSample","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","useShadowMaskQueue","isolateTransparentABufferLightPasses","getType","fogPresents","underwater","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderFog","releaseFrameBuffer"],"mappings":"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"}
1
+ {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { BaseTexture } from '@zephyr3d/device';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { warnUnsupported } from '../utility/unsupported';\r\nimport { DualDepthPeelingOIT } from './dualdepthpeeling_oit';\r\nimport type { Camera } from '../camera';\r\nimport { getActiveProbeVolume } from './gi/probe_volume';\r\n\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n // The skin mask is a surface property, not accumulated lighting: the base\r\n // pass establishes it and additive light passes must leave it alone.\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /** @internal */\r\n protected _renderOpaque: boolean;\r\n /** @internal */\r\n protected _renderTransparent: boolean;\r\n /** @internal */\r\n protected _renderSky: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._renderOpaque = true;\r\n this._renderTransparent = true;\r\n this._renderSky = true;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n get renderOpaque() {\r\n return this._renderOpaque;\r\n }\r\n set renderOpaque(val: boolean) {\r\n this._renderOpaque = !!val;\r\n }\r\n /** @internal */\r\n get renderTransparent() {\r\n return this._renderTransparent;\r\n }\r\n set renderTransparent(val: boolean) {\r\n this._renderTransparent = !!val;\r\n }\r\n /** @internal */\r\n get renderSky() {\r\n return this._renderSky;\r\n }\r\n set renderSky(val: boolean) {\r\n this._renderSky = !!val;\r\n }\r\n /** @internal */\r\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n if (!framebuffer) {\r\n return null;\r\n }\r\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SSSMaskTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n }\r\n /** @internal */\r\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\r\n const shadowMapInfo = ctx.shadowMapInfo;\r\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\r\n return null;\r\n }\r\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\r\n return renderQueue.primaryDirectionalLight;\r\n }\r\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\r\n return renderQueue.primaryTransmissionLight;\r\n }\r\n for (const light of renderQueue.shadowedLights) {\r\n if (shadowMapInfo.has(light)) {\r\n return light;\r\n }\r\n }\r\n return shadowMapInfo.keys().next().value ?? null;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\r\n ctx.HiZTexture?.uid ?? 0\r\n }:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${\r\n ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0\r\n }:${ctx.transmissionThickness ? 1 : 0}:${ShaderHelper.getSceneSDF(ctx)?.levels ?? 0}`;\r\n }\r\n /** @internal */\r\n protected _getShaderVariantHash(ctx: DrawContext, camera: Camera) {\r\n const textureVariant = (texture: BaseTexture | null | undefined) =>\r\n texture ? `1:${texture.format}` : '0';\r\n return `LightPassShaderVariant:${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(\r\n ctx.sceneColorTexture\r\n )}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${\r\n ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0\r\n }:${ctx.transmissionThickness ? 1 : 0}:${textureVariant(ctx.transmissionThicknessTexture)}:${\r\n ShaderHelper.getSceneSDF(ctx)?.levels ?? 0\r\n }`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n // Without an environment light probe GI still applies via EnvProbesOnly\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n (ctx.env!.light.type !== 'none'\r\n ? ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance()\r\n : !!getActiveProbeVolume(ctx.scene));\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n ctx.shaderVariantHash = this._getShaderVariantHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(bindGroup, ctx, ctx.clusteredLight!);\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n // Bind the per-queue cluster shadow-mask mode every call (not cached with\r\n // lightSet): the same clustered program/bind group may serve both the opaque\r\n // (sample mask) and transparent (skip shadow lights) queues.\r\n if (ctx.screenSpaceShadowMask) {\r\n ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.getUploadHeightFogParams(),\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx),\r\n ctx.env!.sky.getFogSkyLightCubemap(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.shaderVariantHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\r\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const tmpFramebuffer = surfaceMRT\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const needsTransparentSingleColorFramebuffer =\r\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\r\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : tmpFramebuffer;\r\n const oitSupported = !!camera.oit?.supportDevice(ctx.device.type);\r\n if (renderQueue.drawTransparent && camera.oit && !oitSupported) {\r\n const dualDepth = camera.oit.getType() === DualDepthPeelingOIT.type;\r\n warnUnsupported(\r\n `${dualDepth ? 'Dual depth peeling' : 'A-buffer'} OIT (Camera.oitMode)`,\r\n dualDepth\r\n ? 'per-target blending and float color blending (WebGPU, or WebGL2 with OES_draw_buffers_indexed and EXT_float_blend)'\r\n : 'WebGPU',\r\n 'transparent objects fall back to sorted alpha blending'\r\n );\r\n }\r\n const oit = renderQueue.drawTransparent && camera.oit && oitSupported ? camera.oit : null;\r\n // Sort only when this invocation actually draws the transparent queue.\r\n // The opaque pass (and the SSS-profile pass) run with _renderTransparent\r\n // === false; without this guard they would sort the transparent lists\r\n // pointlessly, and the real transparent pass would then sort them again.\r\n if (!oit && renderQueue.drawTransparent && this._renderTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n for (let i = 0; i < lists.length; i++) {\r\n const isOpaquePass = i === 0;\r\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\r\n continue;\r\n }\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n // The screen-space shadow mask is only valid for the opaque depth-prepass\r\n // geometry: lists[0] in non-transmission mode. For that queue, shadow lights\r\n // are lit via the clustered pass sampling the mask (additive passes skipped).\r\n // Every other queue (transparent/OIT hair, transmission) keeps the inline\r\n // additive shadow path, where shadows are sampled per-fragment at the real\r\n // surface depth.\r\n const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;\r\n ctx.shadowMaskClusterSample = useShadowMaskQueue;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n const isolateTransparentABufferLightPasses =\r\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\r\n // Transparent geometry fogs itself, the screen-space pass over the opaque\r\n // scene being unable to reach it. Suppressed while submerged for the same\r\n // reason the screen-space one is: the medium is water, not air.\r\n if (\r\n (ctx.queue === QUEUE_TRANSPARENT || this._transmission) &&\r\n ctx.scene.env.sky.fogPresents &&\r\n !ctx.underwater\r\n ) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n const runLightPass = (lights: PunctualLight[]) => {\r\n if (ctx.oit && isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n return;\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n ctx.oit.endPass(ctx, p);\r\n } else {\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n }\r\n };\r\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\r\n const passFramebuffer =\r\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\r\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\r\n const savedMaterialFlags = ctx.materialFlags;\r\n ctx.materialFlags =\r\n ctx.queue === QUEUE_TRANSPARENT\r\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\r\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(passFramebuffer);\r\n try {\r\n runLightPass(lights);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.device.popDeviceStates();\r\n }\r\n } else {\r\n runLightPass(lights);\r\n }\r\n };\r\n let lightIndex = 0;\r\n // Run the per-shadowed-light additive passes unless this queue uses the\r\n // screen-space shadow mask (opaque). Transparent/transmission queues keep\r\n // the inline additive shadow path even when the mask is enabled.\r\n if (!useShadowMaskQueue && ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n runAdditiveLightPass([k]);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n runAdditiveLightPass(renderQueue.unshadowedLights);\r\n }\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture && this._renderSky) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n // Post effects of all layers are built as render graph passes; the\r\n // opaque-layer chain runs between the opaque and transparent passes.\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\r\n }\r\n ctx.oit = null;\r\n }\r\n}\r\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SCENE_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SCENE_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_renderSky","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","renderSky","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SSSMaskTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","screenSpaceShadowMask","scene","lightingMode","ShaderHelper","usesWaterCaustics","transmissionThickness","getSceneSDF","levels","_getShaderVariantHash","textureVariant","texture","format","transmissionThicknessTexture","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","getActiveProbeVolume","renderPassHash","getGlobalBindGroupHash","shaderVariantHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","setShadowMaskMode","shadowMaskClusterSample","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","getUploadHeightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","getFogSkyLightCubemap","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","oitSupported","supportDevice","drawTransparent","dualDepth","getType","DualDepthPeelingOIT","warnUnsupported","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","useShadowMaskQueue","isolateTransparentABufferLightPasses","fogPresents","underwater","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderFog","releaseFrameBuffer"],"mappings":";;;;;;;;AAcA,MAAMA,oBACJC,oBAAqBC,CAAAA,qBAAqB,GAC1CD,oBAAAA,CAAqBE,iBAAiB,GACtCF,oBAAAA,CAAqBG,iBAAiB,GACtCH,qBAAqBI,kBAAkB,GACvCJ,qBAAqBK,sBAAsB,GAC3CL,qBAAqBM,cAAc;AACrC,MAAMC,kCAAAA,GACJP,oBAAqBC,CAAAA,qBAAqB,GAC1CD,oBAAAA,CAAqBE,iBAAiB,GACtCF,oBAAAA,CAAqBI,kBAAkB;AAEvC;AACAJ,oBAAAA,CAAqBM,cAAc;AAErC;;;IAIO,MAAME,SAAkBC,SAAAA,UAAAA,CAAAA;qBAE7B,cAA2C;qBAE3C,aAAiC;qBAEjC,aAAiC;qBAEjC,kBAAsC;qBAEtC,UAA8B;AAC9B;;AAEC,MACD,WAAc,EAAA;AACZ,QAAA,KAAK,CAACC,sBAAAA,CAAAA;QACN,IAAI,CAACC,cAAc,GAAG,IAAA;QACtB,IAAI,CAACC,aAAa,GAAG,KAAA;QACrB,IAAI,CAACC,aAAa,GAAG,IAAA;QACrB,IAAI,CAACC,kBAAkB,GAAG,IAAA;QAC1B,IAAI,CAACC,UAAU,GAAG,IAAA;AAClB,QAAA,IAAI,CAACC,WAAW,GAAGC,OAAAA,CAAQC,IAAI,EAAA;AACjC;qBAEA,IAAIC,YAAe,GAAA;QACjB,OAAO,IAAI,CAACP,aAAa;AAC3B;IACA,IAAIO,YAAAA,CAAaC,GAAG,EAAE;QACpB,IAAI,CAACR,aAAa,GAAGQ,GAAAA;AACvB;qBAEA,IAAIC,YAAe,GAAA;QACjB,OAAO,IAAI,CAACR,aAAa;AAC3B;IACA,IAAIQ,YAAAA,CAAaD,GAAY,EAAE;AAC7B,QAAA,IAAI,CAACP,aAAa,GAAG,CAAC,CAACO,GAAAA;AACzB;qBAEA,IAAIE,iBAAoB,GAAA;QACtB,OAAO,IAAI,CAACR,kBAAkB;AAChC;IACA,IAAIQ,iBAAAA,CAAkBF,GAAY,EAAE;AAClC,QAAA,IAAI,CAACN,kBAAkB,GAAG,CAAC,CAACM,GAAAA;AAC9B;qBAEA,IAAIG,SAAY,GAAA;QACd,OAAO,IAAI,CAACR,UAAU;AACxB;IACA,IAAIQ,SAAAA,CAAUH,GAAY,EAAE;AAC1B,QAAA,IAAI,CAACL,UAAU,GAAG,CAAC,CAACK,GAAAA;AACtB;AACA,qBACA,oCAAUI,CAAqCC,GAAgB,EAAEC,aAAqB,EAAE;AACtF,QAAA,MAAMC,WAAcF,GAAAA,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA;AAC7C,QAAA,IAAI,CAACF,WAAa,EAAA;YAChB,OAAO,IAAA;AACT;AACA,QAAA,MAAMG,WAAqB,GAAA;YAACH,WAAYI,CAAAA,mBAAmB,EAAE,CAAC,CAAE;AAAC,SAAA;QACjE,IAAIL,aAAAA,GAAgB1B,oBAAqBG,CAAAA,iBAAiB,EAAE;YAC1D2B,WAAYE,CAAAA,IAAI,CAACP,GAAAA,CAAIQ,iBAAiB,CAAA;AACxC;QACA,IAAIP,aAAAA,GAAgB1B,oBAAqBK,CAAAA,sBAAsB,EAAE;YAC/DyB,WAAYE,CAAAA,IAAI,CAACP,GAAAA,CAAIS,sBAAsB,CAAA;AAC7C;QACA,IAAIR,aAAAA,GAAgB1B,oBAAqBM,CAAAA,cAAc,EAAE;YACvDwB,WAAYE,CAAAA,IAAI,CAACP,GAAAA,CAAIU,cAAc,CAAA;AACrC;AACA,QAAA,OAAOL,YAAYM,MAAM,KAAK,IAAIN,WAAW,CAAC,EAAE,GAAGA,WAAAA;AACrD;AACA,qBACA,+BAAUO,CAAgCZ,GAAgB,EAAEa,WAAwB,EAAE;QACpF,MAAMC,aAAAA,GAAgBd,IAAIc,aAAa;AACvC,QAAA,IAAI,CAACA,aAAAA,IAAiBA,aAAcC,CAAAA,IAAI,KAAK,CAAG,EAAA;YAC9C,OAAO,IAAA;AACT;QACA,IAAIF,WAAAA,CAAYG,uBAAuB,IAAIF,aAAAA,CAAcG,GAAG,CAACJ,WAAAA,CAAYG,uBAAuB,CAAG,EAAA;AACjG,YAAA,OAAOH,YAAYG,uBAAuB;AAC5C;QACA,IAAIH,WAAAA,CAAYK,wBAAwB,IAAIJ,aAAAA,CAAcG,GAAG,CAACJ,WAAAA,CAAYK,wBAAwB,CAAG,EAAA;AACnG,YAAA,OAAOL,YAAYK,wBAAwB;AAC7C;AACA,QAAA,KAAK,MAAMC,KAAAA,IAASN,WAAYO,CAAAA,cAAc,CAAE;YAC9C,IAAIN,aAAAA,CAAcG,GAAG,CAACE,KAAQ,CAAA,EAAA;gBAC5B,OAAOA,KAAAA;AACT;AACF;AACA,QAAA,OAAOL,cAAcO,IAAI,EAAA,CAAGC,IAAI,EAAA,CAAGC,KAAK,IAAI,IAAA;AAC9C;AACA,qBACA,uBAAUC,CAAwBxB,GAAgB,EAAEyB,MAAc,EAAE;QAClE,OAAO,CAAA,EAAG,IAAI,CAACvC,cAAc,CAAC,CAAC,EAAEc,IAAI0B,kBAAkB,EAAEC,aAAa,CAAE,CAAA,CAAC,EACvE3B,GAAI4B,CAAAA,aAAa,GAAG,CAAI,GAAA,CAAA,CACzB,CAAC,EAAEH,MAAOI,CAAAA,GAAG,EAAEC,aAAmB,EAAA,IAAA,EAAA,CAAG,CAAC,EAAE9B,GAAAA,CAAI+B,GAAG,CAAEC,OAAO,CACvDhC,GACA,CAAA,CAAA,CAAC,EAAEA,GAAIC,CAAAA,aAAa,CAAC,CAAC,EAAED,IAAIiC,kBAAkB,EAAEC,GAAO,IAAA,CAAA,CAAE,CAAC,EAAElC,IAAImC,iBAAiB,EAAED,OAAO,CAAE,CAAA,CAAC,EAC7FlC,GAAIoC,CAAAA,UAAU,EAAEF,GAAO,IAAA,CAAA,CACxB,CAAC,EAAElC,GAAAA,CAAIqC,qBAAqB,GAAG,CAAA,GAAI,EAAE,CAAC,EAAErC,GAAIsC,CAAAA,KAAK,CAACC,YAAY,CAAC,CAAC,EAC/DC,aAAaC,iBAAiB,CAACzC,OAAO,CAAI,GAAA,CAAA,CAC3C,CAAC,EAAEA,GAAAA,CAAI0C,qBAAqB,GAAG,CAAA,GAAI,EAAE,CAAC,EAAEF,aAAaG,WAAW,CAAC3C,GAAM4C,CAAAA,EAAAA,MAAAA,IAAU,CAAG,CAAA,CAAA;AACvF;AACA,qBACA,qBAAUC,CAAsB7C,GAAgB,EAAEyB,MAAc,EAAE;QAChE,MAAMqB,cAAAA,GAAiB,CAACC,OAAAA,GACtBA,OAAU,GAAA,CAAC,EAAE,EAAEA,OAAAA,CAAQC,MAAM,CAAA,CAAE,GAAG,GAAA;QACpC,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC9D,cAAc,CAAC,CAAC,EAAEc,GAAI0B,CAAAA,kBAAkB,EAAEC,SAAa,IAAA,CAAA,CAAE,CAAC,EAC9F3B,GAAAA,CAAI4B,aAAa,GAAG,CAAA,GAAI,CACzB,CAAA,CAAC,EAAEH,MAAAA,CAAOI,GAAG,EAAEC,aAAAA,EAAAA,IAAmB,GAAG,CAAC,EAAE9B,IAAI+B,GAAG,CAAEC,OAAO,CACvDhC,GACA,CAAA,CAAA,CAAC,EAAEA,GAAIC,CAAAA,aAAa,CAAC,CAAC,EAAE6C,eAAe9C,GAAIiC,CAAAA,kBAAkB,CAAE,CAAA,CAAC,EAAEa,cAAAA,CAClE9C,IAAImC,iBAAiB,CAAA,CACrB,CAAC,EAAEW,cAAAA,CAAe9C,IAAIoC,UAAU,CAAA,CAAE,CAAC,EAAEpC,GAAIqC,CAAAA,qBAAqB,GAAG,CAAI,GAAA,CAAA,CAAE,CAAC,EAAErC,GAAAA,CAAIsC,KAAK,CAACC,YAAY,CAAC,CAAC,EAClGC,YAAAA,CAAaC,iBAAiB,CAACzC,GAAAA,CAAAA,GAAO,IAAI,CAC3C,CAAA,CAAC,EAAEA,GAAI0C,CAAAA,qBAAqB,GAAG,CAAA,GAAI,CAAE,CAAA,CAAC,EAAEI,cAAe9C,CAAAA,GAAAA,CAAIiD,4BAA4B,CAAA,CAAE,CAAC,EACzFT,aAAaG,WAAW,CAAC3C,GAAM4C,CAAAA,EAAAA,MAAAA,IAAU,CACzC,CAAA,CAAA;AACJ;AACA,qBACUM,eACRlD,CAAAA,GAAgB,EAChByB,MAAc,EACd0B,QAA8B,EAC9BC,MAAuB,EACvBC,KAAU,EACV;QACA,MAAMC,aAAAA,GAAgB,CAACtD,GAAAA,CAAI4B,aAAa;;AAExC5B,QAAAA,GAAAA,CAAIuD,YAAY,GACdD,aACCtD,KAAAA,IAAI+B,GAAG,CAAEZ,KAAK,CAACqC,IAAI,KAAK,MAAA,GACrBxD,GAAI+B,CAAAA,GAAG,CAAEZ,KAAK,CAACsC,QAAQ,CAACC,WAAW,EAAM1D,IAAAA,GAAAA,CAAI+B,GAAG,CAAEZ,KAAK,CAACsC,QAAQ,CAACE,aAAa,KAC9E,CAAC,CAACC,oBAAqB5D,CAAAA,GAAAA,CAAIsC,KAAK,CAAA,CAAA;AACtCtC,QAAAA,GAAAA,CAAI6D,cAAc,GAAG,IAAI,CAACC,sBAAsB,CAAC9D,GAAKyB,EAAAA,MAAAA,CAAAA;AACtDzB,QAAAA,GAAAA,CAAI+D,iBAAiB,GAAG,IAAI,CAAClB,qBAAqB,CAAC7C,GAAKyB,EAAAA,MAAAA,CAAAA;AACxD,QAAA,MAAMuC,SAAYhE,GAAAA,GAAAA,CAAIiE,wBAAwB,CAACC,kBAAkB,CAAClE,GAAAA,CAAAA;AAClE,QAAA,IAAI,CAACqD,KAAMc,CAAAA,SAAS,CAACnE,GAAI6D,CAAAA,cAAc,CAAC,EAAE;YACxCrB,YAAa4B,CAAAA,iBAAiB,CAACJ,SAAAA,EAAWhE,GAAKyB,EAAAA,MAAAA,EAAQ,CAAC,CAACzB,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA,CAAA;AAClFiD,YAAAA,KAAAA,CAAMc,SAAS,CAACnE,GAAI6D,CAAAA,cAAc,CAAC,GAAG,CAAA;AACxC;QACA,IAAI7D,GAAAA,CAAI0B,kBAAkB,EAAE;AAC1Bc,YAAAA,YAAAA,CAAa6B,sBAAsB,CAACL,SAAAA,EAAWhE,GAAKoD,EAAAA,MAAM,CAAC,CAAE,CAAA,CAAA;SACxD,MAAA;AACL,YAAA,IAAI,CAACC,KAAMiB,CAAAA,QAAQ,CAACtE,GAAI6D,CAAAA,cAAc,CAAC,EAAE;AACvCrB,gBAAAA,YAAAA,CAAa+B,gBAAgB,CAACP,SAAWhE,EAAAA,GAAAA,EAAKA,IAAIwE,cAAc,CAAA;AAChEnB,gBAAAA,KAAAA,CAAMiB,QAAQ,CAACtE,GAAI6D,CAAAA,cAAc,CAAC,GAAG,CAAA;AACvC;;;;YAIA,IAAI7D,GAAAA,CAAIqC,qBAAqB,EAAE;AAC7BG,gBAAAA,YAAAA,CAAaiC,iBAAiB,CAACT,SAAAA,EAAW,CAAC,CAAChE,IAAI0E,uBAAuB,CAAA;AACzE;AACF;AACA,QAAA,IAAI1E,GAAIC,CAAAA,aAAa,GAAG1B,oBAAAA,CAAqBoG,SAAS,IAAI,CAACtB,KAAAA,CAAMuB,MAAM,CAAC5E,GAAI6D,CAAAA,cAAc,CAAC,EAAE;YAC3FrB,YAAaqC,CAAAA,cAAc,CACzBb,SAAAA,EACAhE,GAAI+B,CAAAA,GAAG,CAAE+C,GAAG,CAACC,OAAO,KAAK,SAAA,GAAY,CAAI,GAAA,CAAA,EACzC/E,GAAI+B,CAAAA,GAAG,CAAE+C,GAAG,CAACE,aAAa,EAC1B1B,aAAAA,GAAgB,CAAI,GAAA,CAAA,EACpBtD,GAAI+B,CAAAA,GAAG,CAAE+C,GAAG,CAACG,gBAAgB,EAC7BjF,GAAAA,CAAI+B,GAAG,CAAE+C,GAAG,CAACI,wBAAwB,EAAA,EACrClF,GAAI+B,CAAAA,GAAG,CAAE+C,GAAG,CAACK,uBAAuB,CAACnF,GAAAA,CAAAA,EACrCA,GAAI+B,CAAAA,GAAG,CAAE+C,GAAG,CAACM,qBAAqB,CAACpF,GAAAA,CAAAA,EACnCA,GAAI+B,CAAAA,GAAG,CAAE+C,GAAG,CAACO,qBAAqB,CAACrF,GAAAA,CAAAA,CAAAA;AAErCqD,YAAAA,KAAAA,CAAMuB,MAAM,CAAC5E,GAAI6D,CAAAA,cAAc,CAAC,GAAG,CAAA;AACrC;AACA7D,QAAAA,GAAAA,CAAIG,MAAM,CAACmF,YAAY,CAAC,CAAGtB,EAAAA,SAAAA,CAAAA;QAC3B,MAAMuB,cAAAA,GAAiB9D,MAAO+D,CAAAA,cAAc,GAAG,CAAA;AAC/C,QAAA,KAAK,MAAMC,GAAAA,IAAOtC,QAASsC,CAAAA,GAAG,CAAE;AAC9B,YAAA,IAAI,CAACC,YAAY,CAACD,GAAAA,EAAKzF,GAAKuF,EAAAA,cAAAA,CAAAA;AAC9B;QACA,IAAI,CAACvF,GAAI4B,CAAAA,aAAa,EAAE;AACtB,YAAA,KAAK,MAAM+D,KAAAA,IAASxC,QAASwC,CAAAA,KAAK,CAAE;AAClC,gBAAA,IAAI,CAACD,YAAY,CAACC,KAAAA,EAAO3F,GAAKuF,EAAAA,cAAAA,CAAAA;AAChC;AACF;AACF;qBAEA,WAAsBvF,CAAAA,GAAgB,EAAEyB,MAAc,EAAEZ,WAAwB,EAAE;AAChFb,QAAAA,GAAAA,CAAI6D,cAAc,GAAG,IAAA;AACrB7D,QAAAA,GAAAA,CAAI+D,iBAAiB,GAAG,IAAA;AACxB/D,QAAAA,GAAAA,CAAI+B,GAAG,GAAG/B,GAAIsC,CAAAA,KAAK,CAACP,GAAG;AACvB/B,QAAAA,GAAAA,CAAIuD,YAAY,GAAG,KAAA;AACnBvD,QAAAA,GAAAA,CAAI4F,IAAI,GAAG,IAAI,CAACC,UAAU,CAAC7F,GAAAA,CAAAA;QAC3B,MAAM8F,UAAAA,GAAa9F,GAAIC,CAAAA,aAAa,GAAG3B,iBAAAA;AACvC,QAAA,MAAMyH,2BAA8B/F,GAAAA,GAAAA,CAAIC,aAAa,GAAG,CAACnB,kCAAAA;AACzD,QAAA,MAAMkH,gCAAmChG,GAAAA,GAAAA,CAAIC,aAAa,GAAG,CAAC3B,iBAAAA;AAC9D,QAAA,MAAM2H,cAAiBH,GAAAA,UAAAA,GACnB9F,GAAIG,CAAAA,MAAM,CAAC+F,IAAI,CAACC,wBAAwB,CACtC,KACAnG,EAAAA,GAAAA,CAAIG,MAAM,CAACiG,qBAAqB,EAChCpG,EAAAA,GAAAA,CAAIG,MAAM,CAACkG,sBAAsB,EAAA,EACjC,IAAI,CAACtG,oCAAoC,CAACC,GAAAA,EAAK+F,2BAC/C/F,CAAAA,EAAAA,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA,CAAIkG,kBAAkB,EAEjD,CAAA,GAAA,IAAA;QACJ,MAAMC,sCAAAA,GACJ,CAAC,CAACN,cAAAA,IAAkBA,eAAe3F,mBAAmB,EAAA,CAAGK,MAAM,GAAG,CAAA;AACpE,QAAA,MAAM6F,yBAA4BD,GAAAA,sCAAAA,GAC9BvG,GAAIG,CAAAA,MAAM,CAAC+F,IAAI,CAACC,wBAAwB,CACtC,KACAnG,EAAAA,GAAAA,CAAIG,MAAM,CAACiG,qBAAqB,EAChCpG,EAAAA,GAAAA,CAAIG,MAAM,CAACkG,sBAAsB,EAAA,EACjC,IAAI,CAACtG,oCAAoC,CAACC,GAAAA,EAAKgG,gCAC/ChG,CAAAA,EAAAA,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA,CAAIkG,kBAAkB,EAEjDL,CAAAA,GAAAA,cAAAA;QACJ,MAAMQ,YAAAA,GAAe,CAAC,CAAChF,MAAOI,CAAAA,GAAG,EAAE6E,aAAc1G,CAAAA,GAAAA,CAAIG,MAAM,CAACqD,IAAI,CAAA;AAChE,QAAA,IAAI3C,YAAY8F,eAAe,IAAIlF,OAAOI,GAAG,IAAI,CAAC4E,YAAc,EAAA;AAC9D,YAAA,MAAMG,YAAYnF,MAAOI,CAAAA,GAAG,CAACgF,OAAO,EAAA,KAAOC,oBAAoBtD,IAAI;YACnEuD,eACE,CAAA,CAAA,EAAGH,YAAY,oBAAuB,GAAA,UAAA,CAAW,qBAAqB,CAAC,EACvEA,SACI,GAAA,oHAAA,GACA,QACJ,EAAA,wDAAA,CAAA;AAEJ;QACA,MAAM/E,GAAAA,GAAMhB,WAAY8F,CAAAA,eAAe,IAAIlF,MAAAA,CAAOI,GAAG,IAAI4E,YAAAA,GAAehF,MAAOI,CAAAA,GAAG,GAAG,IAAA;;;;;QAKrF,IAAI,CAACA,OAAOhB,WAAY8F,CAAAA,eAAe,IAAI,IAAI,CAACtH,kBAAkB,EAAE;YAClEwB,WAAYmG,CAAAA,oBAAoB,CAACvF,MAAAA,CAAOwF,gBAAgB,EAAA,CAAA;AAC1D;AACA,QAAA,MAAM5D,KAAa,GAAA;AACjBiB,YAAAA,QAAAA,EAAU,EAAC;AACXH,YAAAA,SAAAA,EAAW,EAAC;AACZS,YAAAA,MAAAA,EAAQ;AACV,SAAA;QACA,MAAMsC,KAAAA,GAAQrG,YAAYsC,QAAQ;AAClC,QAAA,MAAMgE,KAAQ,GAAA,IAAI,CAAChI,aAAa,GAC5B;YAAC+H,KAAOxH,EAAAA,YAAAA;YAAcwH,KAAOE,EAAAA,kBAAAA;YAAoBF,KAAOG,EAAAA;SAAY,GACpE;YAACH,KAAOI,EAAAA,MAAAA;YAAQJ,KAAOG,EAAAA;AAAY,SAAA;AACvC,QAAA,IAAK,IAAIE,CAAI,GAAA,CAAA,EAAGA,IAAIJ,KAAMxG,CAAAA,MAAM,EAAE4G,CAAK,EAAA,CAAA;AACrC,YAAA,MAAMC,eAAeD,CAAM,KAAA,CAAA;AAC3B,YAAA,IAAI,YAACC,IAAgB,CAAC,IAAI,CAACpI,aAAa,IAAM,CAACoI,YAAgB,IAAA,CAAC,IAAI,CAACnI,kBAAkB,EAAG;AACxF,gBAAA;AACF;YACA,IAAI8H,KAAK,CAACI,CAAAA,CAAE,EAAE;AACZvH,gBAAAA,GAAAA,CAAIyH,KAAK,GAAGF,CAAM,KAAA,CAAA,GAAIG,YAAeC,GAAAA,iBAAAA;;;;;;;gBAOrC,MAAMC,kBAAAA,GAAqB5H,IAAIqC,qBAAqB,IAAI,CAAC,IAAI,CAAClD,aAAa,IAAIoI,CAAM,KAAA,CAAA;AACrFvH,gBAAAA,GAAAA,CAAI0E,uBAAuB,GAAGkD,kBAAAA;AAC9B5H,gBAAAA,GAAAA,CAAI6B,GAAG,GAAG0F,CAAAA,KAAM,CAAK,IAAA,CAACL,QAAQ,IAAOrF,GAAAA,GAAAA;AACrC,gBAAA,MAAMgG,oCACJ,GAAA,CAAC,CAAC7H,GAAAA,CAAI6B,GAAG,IAAI7B,GAAAA,CAAIyH,KAAK,KAAKE,iBAAqB3H,IAAAA,GAAAA,CAAI6B,GAAG,CAACgF,OAAO,EAAO,KAAA,IAAA;;;;gBAIxE,IACG7G,CAAAA,GAAIyH,CAAAA,KAAK,KAAKE,iBAAqB,IAAA,IAAI,CAACxI,aAAa,KACtDa,IAAIsC,KAAK,CAACP,GAAG,CAAC+C,GAAG,CAACgD,WAAW,IAC7B,CAAC9H,GAAI+H,CAAAA,UAAU,EACf;oBACA/H,GAAIC,CAAAA,aAAa,IAAI1B,oBAAAA,CAAqBoG,SAAS;AACrD;gBACA,MAAMqD,YAAAA,GAAehI,IAAI6B,GAAG,GAAG7B,IAAI6B,GAAG,CAACoG,KAAK,CAACjI,GAAO,CAAA,GAAA,CAAA;AACpD,gBAAA,IAAK,IAAIkI,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIF,cAAcE,CAAK,EAAA,CAAA;AACrC,oBAAA,IAAIlI,GAAI6B,CAAAA,GAAG,IAAI,CAACgG,oCAAsC,EAAA;AACpD,wBAAA,IAAI,CAAC7H,GAAI6B,CAAAA,GAAG,CAACsG,SAAS,CAACnI,KAAKkI,CAAI,CAAA,EAAA;AAC9B,4BAAA;AACF;AACF;AACA,oBAAA,MAAME,eAAe,CAAChF,MAAAA,GAAAA;wBACpB,IAAIpD,GAAAA,CAAI6B,GAAG,IAAIgG,oCAAsC,EAAA;AACnD,4BAAA,IAAI,CAAC7H,GAAI6B,CAAAA,GAAG,CAACsG,SAAS,CAACnI,KAAKkI,CAAI,CAAA,EAAA;AAC9B,gCAAA;AACF;4BACA,IAAI,CAAChF,eAAe,CAAClD,GAAAA,EAAKyB,QAAQ0F,KAAK,CAACI,CAAE,CAAA,EAAGnE,MAAQC,EAAAA,KAAAA,CAAAA;AACrDrD,4BAAAA,GAAAA,CAAI6B,GAAG,CAACwG,OAAO,CAACrI,GAAKkI,EAAAA,CAAAA,CAAAA;yBAChB,MAAA;4BACL,IAAI,CAAChF,eAAe,CAAClD,GAAAA,EAAKyB,QAAQ0F,KAAK,CAACI,CAAE,CAAA,EAAGnE,MAAQC,EAAAA,KAAAA,CAAAA;AACvD;AACF,qBAAA;AACA,oBAAA,MAAMiF,uBAAuB,CAAClF,MAAAA,GAAAA;AAC5B,wBAAA,MAAMmF,eACJvI,GAAAA,GAAAA,CAAIyH,KAAK,KAAKE,oBAAoBnB,yBAA4BP,GAAAA,cAAAA;AAChE,wBAAA,IAAIjG,IAAI4B,aAAa,IAAI2G,mBAAmB,CAACvI,GAAAA,CAAI6B,GAAG,EAAE;4BACpD,MAAM2G,kBAAAA,GAAqBxI,IAAIC,aAAa;4BAC5CD,GAAIC,CAAAA,aAAa,GACfD,GAAAA,CAAIyH,KAAK,KAAKE,oBACVa,kBAAqB,GAAA,CAAClK,iBACtBkK,GAAAA,kBAAAA,GAAqB,CAAC1J,kCAAAA;4BAC5BkB,GAAIG,CAAAA,MAAM,CAACsI,gBAAgB,EAAA;4BAC3BzI,GAAIG,CAAAA,MAAM,CAACuI,cAAc,CAACH,eAAAA,CAAAA;4BAC1B,IAAI;gCACFH,YAAahF,CAAAA,MAAAA,CAAAA;6BACL,QAAA;AACRpD,gCAAAA,GAAAA,CAAIC,aAAa,GAAGuI,kBAAAA;gCACpBxI,GAAIG,CAAAA,MAAM,CAACwI,eAAe,EAAA;AAC5B;yBACK,MAAA;4BACLP,YAAahF,CAAAA,MAAAA,CAAAA;AACf;AACF,qBAAA;AACA,oBAAA,IAAIwF,UAAa,GAAA,CAAA;;;;AAIjB,oBAAA,IAAI,CAAChB,kBAAAA,IAAsB5H,GAAIc,CAAAA,aAAa,EAAE;AAC5C,wBAAA,KAAK,MAAM+H,CAAK7I,IAAAA,GAAAA,CAAIc,aAAa,CAACO,IAAI,EAAI,CAAA;AACxCrB,4BAAAA,GAAAA,CAAI0B,kBAAkB,GAAGmH,CAAAA;4BACzB7I,GAAI4B,CAAAA,aAAa,GAAGgH,UAAa,GAAA,CAAA;4BACjC,IAAI,CAAC1J,cAAc,GAAGc,GAAAA,CAAIc,aAAa,CAACgI,GAAG,CAACD,CAAAA,CAAAA,CAAIE,UAAU;4BAC1DT,oBAAqB,CAAA;AAACO,gCAAAA;AAAE,6BAAA,CAAA;AACxBD,4BAAAA,UAAAA,EAAAA;AACF;AACF;AACA,oBAAA,IAAIA,eAAe,CAAK/H,IAAAA,WAAAA,CAAYmI,gBAAgB,CAACrI,MAAM,GAAG,CAAG,EAAA;AAC/DX,wBAAAA,GAAAA,CAAI0B,kBAAkB,GAAG,IAAA;wBACzB1B,GAAI4B,CAAAA,aAAa,GAAGgH,UAAa,GAAA,CAAA;wBACjC,IAAI,CAAC1J,cAAc,GAAG,EAAA;AACtBoJ,wBAAAA,oBAAAA,CAAqBzH,YAAYmI,gBAAgB,CAAA;AACnD;AACA,oBAAA,IAAIhJ,GAAI6B,CAAAA,GAAG,IAAI,CAACgG,oCAAsC,EAAA;AACpD7H,wBAAAA,GAAAA,CAAI6B,GAAG,CAACwG,OAAO,CAACrI,GAAKkI,EAAAA,CAAAA,CAAAA;AACvB;AACF;gBACA,IAAIlI,GAAAA,CAAI6B,GAAG,EAAE;oBACX7B,GAAI6B,CAAAA,GAAG,CAACoH,GAAG,CAACjJ,GAAAA,CAAAA;AACd;AACAA,gBAAAA,GAAAA,CAAIC,aAAa,IAAI,CAAC1B,oBAAAA,CAAqBoG,SAAS;AACtD;YACA,IAAI4C,CAAAA,KAAM,KAAK,CAACvH,GAAAA,CAAImC,iBAAiB,IAAI,IAAI,CAAC7C,UAAU,EAAE;AACxD,gBAAA,IAAI2G,cAAgB,EAAA;oBAClBjG,GAAIG,CAAAA,MAAM,CAACsI,gBAAgB,EAAA;oBAC3BzI,GAAIG,CAAAA,MAAM,CAACuI,cAAc,CAACzC,cAAAA,CAAAA;AAC5B;AACAjG,gBAAAA,GAAAA,CAAI+B,GAAG,CAAC+C,GAAG,CAAChF,SAAS,CAACE,GAAAA,CAAAA;AACtB,gBAAA,IAAIA,IAAI+B,GAAG,CAAC+C,GAAG,CAACgD,WAAW,EAAE;AAC3B9H,oBAAAA,GAAAA,CAAI+B,GAAG,CAAC+C,GAAG,CAACoE,SAAS,CAACzH,MAAAA,CAAAA;AACxB;AACA,gBAAA,IAAIwE,cAAgB,EAAA;oBAClBjG,GAAIG,CAAAA,MAAM,CAACwI,eAAe,EAAA;AAC5B;AACF;;;AAGF;AACA,QAAA,IAAI1C,cAAgB,EAAA;AAClBjG,YAAAA,GAAAA,CAAIG,MAAM,CAAC+F,IAAI,CAACiD,kBAAkB,CAAClD,cAAAA,CAAAA;AACrC;QACA,IAAIO,yBAAAA,IAA6BA,8BAA8BP,cAAgB,EAAA;AAC7EjG,YAAAA,GAAAA,CAAIG,MAAM,CAAC+F,IAAI,CAACiD,kBAAkB,CAAC3C,yBAAAA,CAAAA;AACrC;AACAxG,QAAAA,GAAAA,CAAI6B,GAAG,GAAG,IAAA;AACZ;AACF;;;;"}
@@ -0,0 +1,46 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+
3
+ const tmpViewOrigin = new Vector3();
4
+ function computeBoundsScreenRadiusSquared(center, radius, camera) {
5
+ const proj = camera.getProjectionMatrix();
6
+ const distSq = camera.isPerspective() ? Math.max(Vector3.distanceSq(center, camera.getWorldPosition(tmpViewOrigin)), 1e-4) : 1;
7
+ const screenMultiple = Math.max(0.5 * Math.abs(proj.m00), 0.5 * Math.abs(proj.m11));
8
+ const screenRadius = screenMultiple * radius;
9
+ return screenRadius * screenRadius / distSq;
10
+ }
11
+ /**
12
+ * Squared projected radius of the sphere enclosing a world space box
13
+ * @internal
14
+ */ function computeAABBScreenRadiusSquared(aabb, camera, out) {
15
+ const min = aabb.minPoint;
16
+ const max = aabb.maxPoint;
17
+ out.setXYZ((min.x + max.x) * 0.5, (min.y + max.y) * 0.5, (min.z + max.z) * 0.5);
18
+ const dx = (max.x - min.x) * 0.5;
19
+ const dy = (max.y - min.y) * 0.5;
20
+ const dz = (max.z - min.z) * 0.5;
21
+ return computeBoundsScreenRadiusSquared(out, Math.sqrt(dx * dx + dy * dy + dz * dz), camera);
22
+ }
23
+ /**
24
+ * Picks the level of detail for a projected size.
25
+ *
26
+ * @param lods - Levels after the first, finest to coarsest
27
+ * @param screenRadiusSquared - Squared projected radius, see {@link computeBoundsScreenRadiusSquared}
28
+ * @param screenSizeScale - Scale of the level screen sizes, larger switches to coarser levels sooner
29
+ * @param currentLod - Level used so far
30
+ * @param minLod - Finest level allowed
31
+ * @returns The level of detail, 0 being the finest
32
+ * @internal
33
+ */ function selectLod(lods, screenRadiusSquared, screenSizeScale, currentLod, minLod) {
34
+ minLod = Math.min(Math.max(minLod, 0), lods.length);
35
+ for(let i = lods.length; i > 0; i--){
36
+ const lod = lods[i - 1];
37
+ const screenSize = (lod.screenSize + (i <= currentLod ? lod.hysteresis : 0)) * screenSizeScale;
38
+ if (screenSize * screenSize * 0.25 > screenRadiusSquared) {
39
+ return Math.max(i, minLod);
40
+ }
41
+ }
42
+ return minLod;
43
+ }
44
+
45
+ export { computeAABBScreenRadiusSquared, selectLod };
46
+ //# sourceMappingURL=lod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lod.js","sources":["../../src/render/lod.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { PrimitiveLod } from './primitive';\r\n\r\nconst tmpViewOrigin = new Vector3();\r\n\r\nfunction computeBoundsScreenRadiusSquared(center: Vector3, radius: number, camera: Camera) {\r\n const proj = camera.getProjectionMatrix();\r\n const distSq = camera.isPerspective()\r\n ? Math.max(Vector3.distanceSq(center, camera.getWorldPosition(tmpViewOrigin)), 1e-4)\r\n : 1;\r\n const screenMultiple = Math.max(0.5 * Math.abs(proj.m00), 0.5 * Math.abs(proj.m11));\r\n const screenRadius = screenMultiple * radius;\r\n return (screenRadius * screenRadius) / distSq;\r\n}\r\n\r\n/**\r\n * Squared projected radius of the sphere enclosing a world space box\r\n * @internal\r\n */\r\nexport function computeAABBScreenRadiusSquared(aabb: AABB, camera: Camera, out: Vector3) {\r\n const min = aabb.minPoint;\r\n const max = aabb.maxPoint;\r\n out.setXYZ((min.x + max.x) * 0.5, (min.y + max.y) * 0.5, (min.z + max.z) * 0.5);\r\n const dx = (max.x - min.x) * 0.5;\r\n const dy = (max.y - min.y) * 0.5;\r\n const dz = (max.z - min.z) * 0.5;\r\n return computeBoundsScreenRadiusSquared(out, Math.sqrt(dx * dx + dy * dy + dz * dz), camera);\r\n}\r\n\r\n/**\r\n * Picks the level of detail for a projected size.\r\n *\r\n * @param lods - Levels after the first, finest to coarsest\r\n * @param screenRadiusSquared - Squared projected radius, see {@link computeBoundsScreenRadiusSquared}\r\n * @param screenSizeScale - Scale of the level screen sizes, larger switches to coarser levels sooner\r\n * @param currentLod - Level used so far\r\n * @param minLod - Finest level allowed\r\n * @returns The level of detail, 0 being the finest\r\n * @internal\r\n */\r\nexport function selectLod(\r\n lods: readonly Readonly<PrimitiveLod>[],\r\n screenRadiusSquared: number,\r\n screenSizeScale: number,\r\n currentLod: number,\r\n minLod: number\r\n) {\r\n minLod = Math.min(Math.max(minLod, 0), lods.length);\r\n for (let i = lods.length; i > 0; i--) {\r\n const lod = lods[i - 1];\r\n const screenSize = (lod.screenSize + (i <= currentLod ? lod.hysteresis : 0)) * screenSizeScale;\r\n if (screenSize * screenSize * 0.25 > screenRadiusSquared) {\r\n return Math.max(i, minLod);\r\n }\r\n }\r\n return minLod;\r\n}\r\n"],"names":["tmpViewOrigin","Vector3","computeBoundsScreenRadiusSquared","center","radius","camera","proj","getProjectionMatrix","distSq","isPerspective","Math","max","distanceSq","getWorldPosition","screenMultiple","abs","m00","m11","screenRadius","computeAABBScreenRadiusSquared","aabb","out","min","minPoint","maxPoint","setXYZ","x","y","z","dx","dy","dz","sqrt","selectLod","lods","screenRadiusSquared","screenSizeScale","currentLod","minLod","length","i","lod","screenSize","hysteresis"],"mappings":";;AAKA,MAAMA,gBAAgB,IAAIC,OAAAA,EAAAA;AAE1B,SAASC,gCAAiCC,CAAAA,MAAe,EAAEC,MAAc,EAAEC,MAAc,EAAA;IACvF,MAAMC,IAAAA,GAAOD,OAAOE,mBAAmB,EAAA;AACvC,IAAA,MAAMC,MAASH,GAAAA,MAAAA,CAAOI,aAAa,EAAA,GAC/BC,KAAKC,GAAG,CAACV,OAAQW,CAAAA,UAAU,CAACT,MAAQE,EAAAA,MAAAA,CAAOQ,gBAAgB,CAACb,iBAAiB,IAC7E,CAAA,GAAA,CAAA;AACJ,IAAA,MAAMc,iBAAiBJ,IAAKC,CAAAA,GAAG,CAAC,GAAA,GAAMD,KAAKK,GAAG,CAACT,IAAKU,CAAAA,GAAG,GAAG,GAAMN,GAAAA,IAAAA,CAAKK,GAAG,CAACT,KAAKW,GAAG,CAAA,CAAA;AACjF,IAAA,MAAMC,eAAeJ,cAAiBV,GAAAA,MAAAA;IACtC,OAAQc,eAAeA,YAAgBV,GAAAA,MAAAA;AACzC;AAEA;;;AAGC,IACM,SAASW,8BAAAA,CAA+BC,IAAU,EAAEf,MAAc,EAAEgB,GAAY,EAAA;IACrF,MAAMC,GAAAA,GAAMF,KAAKG,QAAQ;IACzB,MAAMZ,GAAAA,GAAMS,KAAKI,QAAQ;AACzBH,IAAAA,GAAAA,CAAII,MAAM,CAAC,CAACH,GAAII,CAAAA,CAAC,GAAGf,GAAAA,CAAIe,CAAAA,IAAK,GAAA,EAAK,CAACJ,GAAAA,CAAIK,CAAC,GAAGhB,GAAIgB,CAAAA,CAAC,IAAI,GAAK,EAACL,CAAAA,GAAAA,CAAIM,CAAC,GAAGjB,GAAIiB,CAAAA,CAAC,IAAI,GAAA,CAAA;IAC3E,MAAMC,EAAAA,GAAK,CAAClB,GAAAA,CAAIe,CAAC,GAAGJ,GAAAA,CAAII,CAAAA,IAAK,GAAA;IAC7B,MAAMI,EAAAA,GAAK,CAACnB,GAAAA,CAAIgB,CAAC,GAAGL,GAAAA,CAAIK,CAAAA,IAAK,GAAA;IAC7B,MAAMI,EAAAA,GAAK,CAACpB,GAAAA,CAAIiB,CAAC,GAAGN,GAAAA,CAAIM,CAAAA,IAAK,GAAA;IAC7B,OAAO1B,gCAAAA,CAAiCmB,GAAKX,EAAAA,IAAAA,CAAKsB,IAAI,CAACH,KAAKA,EAAKC,GAAAA,EAAAA,GAAKA,EAAKC,GAAAA,EAAAA,GAAKA,EAAK1B,CAAAA,EAAAA,MAAAA,CAAAA;AACvF;AAEA;;;;;;;;;;IAWO,SAAS4B,SAAAA,CACdC,IAAuC,EACvCC,mBAA2B,EAC3BC,eAAuB,EACvBC,UAAkB,EAClBC,MAAc,EAAA;IAEdA,MAAS5B,GAAAA,IAAAA,CAAKY,GAAG,CAACZ,IAAAA,CAAKC,GAAG,CAAC2B,MAAAA,EAAQ,CAAIJ,CAAAA,EAAAA,IAAAA,CAAKK,MAAM,CAAA;AAClD,IAAA,IAAK,IAAIC,CAAIN,GAAAA,IAAAA,CAAKK,MAAM,EAAEC,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AACpC,QAAA,MAAMC,GAAMP,GAAAA,IAAI,CAACM,CAAAA,GAAI,CAAE,CAAA;AACvB,QAAA,MAAME,UAAa,GAACD,CAAAA,GAAAA,CAAIC,UAAU,IAAIF,CAAKH,IAAAA,UAAAA,GAAaI,GAAIE,CAAAA,UAAU,GAAG,CAAA,CAAC,IAAKP,eAAAA;QAC/E,IAAIM,UAAAA,GAAaA,UAAa,GAAA,IAAA,GAAOP,mBAAqB,EAAA;YACxD,OAAOzB,IAAAA,CAAKC,GAAG,CAAC6B,CAAGF,EAAAA,MAAAA,CAAAA;AACrB;AACF;IACA,OAAOA,MAAAA;AACT;;;;"}