@zephyr3d/scene 0.9.26 → 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 (506) 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 +146 -30
  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 +300 -56
  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 +177 -3
  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 +178 -200
  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 +30475 -19865
  109. package/dist/index.js +67 -12
  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/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -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}`;
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}`;
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
@@ -183,7 +194,10 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
183
194
  ctx.shadowMaskClusterSample = useShadowMaskQueue;
184
195
  ctx.oit = i === 0 || !items ? null : oit;
185
196
  const isolateTransparentABufferLightPasses = !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';
186
- if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {
197
+ // Transparent geometry fogs itself, the screen-space pass over the opaque
198
+ // scene being unable to reach it. Suppressed while submerged for the same
199
+ // reason the screen-space one is: the medium is water, not air.
200
+ if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents && !ctx.underwater) {
187
201
  ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;
188
202
  }
189
203
  const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;
@@ -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 }\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 }\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 if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\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","_getShaderVariantHash","textureVariant","texture","format","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","shaderVariantHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","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","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":"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"}
@@ -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;;;;"}
@@ -1,16 +1,16 @@
1
1
  import { Disposable } from '@zephyr3d/base';
2
2
 
3
- /**
4
- * Abstract class for order-independent transparency renderers.
5
- *
6
- * Order-independent transparency (OIT) renderers allow for rendering
7
- * of transparent objects in any order, regardless of their depth.
8
- *
9
- * This abstract class defines the common interface for all OIT renderers.
10
- * Specific implementations of OIT renderers should extend this class and
11
- * provide concrete implementations for the abstract methods.
12
- *
13
- * @public
3
+ /**
4
+ * Abstract class for order-independent transparency renderers.
5
+ *
6
+ * Order-independent transparency (OIT) renderers allow for rendering
7
+ * of transparent objects in any order, regardless of their depth.
8
+ *
9
+ * This abstract class defines the common interface for all OIT renderers.
10
+ * Specific implementations of OIT renderers should extend this class and
11
+ * provide concrete implementations for the abstract methods.
12
+ *
13
+ * @public
14
14
  */ class OIT extends Disposable {
15
15
  _uniformTag;
16
16
  constructor(){
@@ -1 +1 @@
1
- {"version":3,"file":"oit.js","sources":["../../src/render/oit.ts"],"sourcesContent":["import type {\n BindGroup,\n PBGlobalScope,\n PBInsideFunctionScope,\n PBShaderExp,\n RenderStateSet\n} from '@zephyr3d/device';\nimport type { DrawContext } from './drawable';\nimport { Disposable } from '@zephyr3d/base';\n\n/**\n * Abstract class for order-independent transparency renderers.\n *\n * Order-independent transparency (OIT) renderers allow for rendering\n * of transparent objects in any order, regardless of their depth.\n *\n * This abstract class defines the common interface for all OIT renderers.\n * Specific implementations of OIT renderers should extend this class and\n * provide concrete implementations for the abstract methods.\n *\n * @public\n */\nexport abstract class OIT extends Disposable {\n private _uniformTag: number;\n constructor() {\n super();\n this._uniformTag = 0;\n }\n get uniformTag() {\n return this._uniformTag;\n }\n uniformChanged() {\n this._uniformTag++;\n }\n /**\n * Returns the type of the renderer.\n *\n * @returns The type of the renderer.\n */\n abstract getType(): string;\n /**\n * Checks whether the renderer supports the given device type.\n *\n * @param deviceType - The device type.\n * @returns True if the renderer supports the device type, false otherwise.\n */\n abstract supportDevice(deviceType: string): boolean;\n /**\n * Whether this OIT algorithm wants pre-multiplied alpha\n *\n * @returns True if the OIT wants pre-multiplied alpha, false otherwise\n */\n abstract wantsPremultipliedAlpha(): boolean;\n /**\n * Begins rendering the transparent objects.\n *\n * @remarks\n * Contract: the caller (the transparent scene pass) must have explicitly\n * bound the transparent scene target framebuffer before calling begin(),\n * beginPass() or endPass(). Implementations may redirect rendering to\n * internal buffers, but must composite into that bound target and restore\n * it before returning.\n *\n * @param ctx - The draw context.\n * @returns The number of passes required for rendering.\n */\n abstract begin(ctx: DrawContext): number;\n /**\n * Ends rendering the transparent objects.\n *\n * @param ctx - The draw context.\n */\n abstract end(ctx: DrawContext): void;\n /**\n * Begins rendering for the given pass.\n *\n * @param ctx - The draw context.\n * @param pass - The pass number.\n * @returns True if the transparent objects should be rendered, false otherwise.\n */\n abstract beginPass(ctx: DrawContext, pass: number): boolean;\n /**\n * Ends rendering for the given pass.\n *\n * @param ctx - The draw context.\n * @param pass - The pass number.\n */\n abstract endPass(ctx: DrawContext, pass: number): void;\n /**\n * Sets up the fragment output.\n *\n * @remarks\n * This method declares necessary uniform variables for OIT rendering and injects it into the object's material.\n *\n * @param scope - The global shader scope.\n */\n abstract setupFragmentOutput(scope: PBGlobalScope): void;\n /**\n * Do the fragment color output.\n *\n * @remarks\n * This method outputs the calculated fragment color for OIT rendering and injects it into the object's material.\n *\n * @param scope - The global shader scope.\n * @param color - The calculated fragment color.\n */\n abstract outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext): boolean;\n /**\n * Applies the uniforms for the given draw context and bind group.\n *\n * This function will be called when ever the transparent material will upload uniform variables.\n *\n * @param ctx - The draw context.\n * @param bindGroup - The bind group.\n */\n abstract applyUniforms(ctx: DrawContext, bindGroup: BindGroup): void;\n /**\n * Whether additive light passes should keep the material alpha before OIT output.\n *\n * @remarks\n * Some OIT algorithms need the original material alpha to weight additive light color,\n * but write zero alpha to their accumulation targets so transmittance is not counted twice.\n */\n abstract wantsAdditiveLightPassAlpha(): boolean;\n /**\n * Calculates the hash of the renderer.\n *\n * @remarks\n * When this hash value was changed, material shader will be forced recreate.\n *\n * @returns The hash of the renderer.\n */\n abstract calculateHash(): string;\n /**\n * Sets the render states for the renderer.\n *\n * This function will be called when the transparent object will be rendered.\n *\n * @param rs - The render states.\n */\n abstract setRenderStates(rs: RenderStateSet): void;\n}\n"],"names":["OIT","Disposable","_uniformTag","uniformTag","uniformChanged"],"mappings":";;AAUA;;;;;;;;;;;IAYO,MAAeA,GAAYC,SAAAA,UAAAA,CAAAA;IACxBC,WAAoB;IAC5B,WAAc,EAAA;QACZ,KAAK,EAAA;QACL,IAAI,CAACA,WAAW,GAAG,CAAA;AACrB;AACA,IAAA,IAAIC,UAAa,GAAA;QACf,OAAO,IAAI,CAACD,WAAW;AACzB;IACAE,cAAiB,GAAA;AACf,QAAA,IAAI,CAACF,WAAW,EAAA;AAClB;AA4GF;;;;"}
1
+ {"version":3,"file":"oit.js","sources":["../../src/render/oit.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport { Disposable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Abstract class for order-independent transparency renderers.\r\n *\r\n * Order-independent transparency (OIT) renderers allow for rendering\r\n * of transparent objects in any order, regardless of their depth.\r\n *\r\n * This abstract class defines the common interface for all OIT renderers.\r\n * Specific implementations of OIT renderers should extend this class and\r\n * provide concrete implementations for the abstract methods.\r\n *\r\n * @public\r\n */\r\nexport abstract class OIT extends Disposable {\r\n private _uniformTag: number;\r\n constructor() {\r\n super();\r\n this._uniformTag = 0;\r\n }\r\n get uniformTag() {\r\n return this._uniformTag;\r\n }\r\n uniformChanged() {\r\n this._uniformTag++;\r\n }\r\n /**\r\n * Returns the type of the renderer.\r\n *\r\n * @returns The type of the renderer.\r\n */\r\n abstract getType(): string;\r\n /**\r\n * Checks whether the renderer supports the given device type.\r\n *\r\n * @param deviceType - The device type.\r\n * @returns True if the renderer supports the device type, false otherwise.\r\n */\r\n abstract supportDevice(deviceType: string): boolean;\r\n /**\r\n * Whether this OIT algorithm wants pre-multiplied alpha\r\n *\r\n * @returns True if the OIT wants pre-multiplied alpha, false otherwise\r\n */\r\n abstract wantsPremultipliedAlpha(): boolean;\r\n /**\r\n * Begins rendering the transparent objects.\r\n *\r\n * @remarks\r\n * Contract: the caller (the transparent scene pass) must have explicitly\r\n * bound the transparent scene target framebuffer before calling begin(),\r\n * beginPass() or endPass(). Implementations may redirect rendering to\r\n * internal buffers, but must composite into that bound target and restore\r\n * it before returning.\r\n *\r\n * @param ctx - The draw context.\r\n * @returns The number of passes required for rendering.\r\n */\r\n abstract begin(ctx: DrawContext): number;\r\n /**\r\n * Ends rendering the transparent objects.\r\n *\r\n * @param ctx - The draw context.\r\n */\r\n abstract end(ctx: DrawContext): void;\r\n /**\r\n * Begins rendering for the given pass.\r\n *\r\n * @param ctx - The draw context.\r\n * @param pass - The pass number.\r\n * @returns True if the transparent objects should be rendered, false otherwise.\r\n */\r\n abstract beginPass(ctx: DrawContext, pass: number): boolean;\r\n /**\r\n * Ends rendering for the given pass.\r\n *\r\n * @param ctx - The draw context.\r\n * @param pass - The pass number.\r\n */\r\n abstract endPass(ctx: DrawContext, pass: number): void;\r\n /**\r\n * Sets up the fragment output.\r\n *\r\n * @remarks\r\n * This method declares necessary uniform variables for OIT rendering and injects it into the object's material.\r\n *\r\n * @param scope - The global shader scope.\r\n */\r\n abstract setupFragmentOutput(scope: PBGlobalScope): void;\r\n /**\r\n * Do the fragment color output.\r\n *\r\n * @remarks\r\n * This method outputs the calculated fragment color for OIT rendering and injects it into the object's material.\r\n *\r\n * @param scope - The global shader scope.\r\n * @param color - The calculated fragment color.\r\n */\r\n abstract outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext): boolean;\r\n /**\r\n * Applies the uniforms for the given draw context and bind group.\r\n *\r\n * This function will be called when ever the transparent material will upload uniform variables.\r\n *\r\n * @param ctx - The draw context.\r\n * @param bindGroup - The bind group.\r\n */\r\n abstract applyUniforms(ctx: DrawContext, bindGroup: BindGroup): void;\r\n /**\r\n * Whether additive light passes should keep the material alpha before OIT output.\r\n *\r\n * @remarks\r\n * Some OIT algorithms need the original material alpha to weight additive light color,\r\n * but write zero alpha to their accumulation targets so transmittance is not counted twice.\r\n */\r\n abstract wantsAdditiveLightPassAlpha(): boolean;\r\n /**\r\n * Calculates the hash of the renderer.\r\n *\r\n * @remarks\r\n * When this hash value was changed, material shader will be forced recreate.\r\n *\r\n * @returns The hash of the renderer.\r\n */\r\n abstract calculateHash(): string;\r\n /**\r\n * Sets the render states for the renderer.\r\n *\r\n * This function will be called when the transparent object will be rendered.\r\n *\r\n * @param rs - The render states.\r\n */\r\n abstract setRenderStates(rs: RenderStateSet): void;\r\n}\r\n"],"names":["OIT","Disposable","_uniformTag","uniformTag","uniformChanged"],"mappings":";;AAUA;;;;;;;;;;;IAYO,MAAeA,GAAYC,SAAAA,UAAAA,CAAAA;IACxBC,WAAoB;IAC5B,WAAc,EAAA;QACZ,KAAK,EAAA;QACL,IAAI,CAACA,WAAW,GAAG,CAAA;AACrB;AACA,IAAA,IAAIC,UAAa,GAAA;QACf,OAAO,IAAI,CAACD,WAAW;AACzB;IACAE,cAAiB,GAAA;AACf,QAAA,IAAI,CAACF,WAAW,EAAA;AAClB;AA4GF;;;;"}