@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
@@ -1,19 +1,35 @@
1
1
  import { drawFullscreenQuad } from './fullscreenquad.js';
2
- import { DEPTH_FARTHEST, DEPTH_REDUCE_FARTHER } from '@zephyr3d/base';
2
+ import { REVERSE_Z, DEPTH_FARTHEST, DEPTH_REDUCE_FARTHER, DEPTH_REDUCE_CLOSER } from '@zephyr3d/base';
3
3
  import './primitive.js';
4
4
  import '@zephyr3d/device';
5
5
  import { getDevice } from '../app/api.js';
6
6
  import { CopyBlitter } from '../blitter/copy.js';
7
7
  import { fetchSampler } from '../utility/misc.js';
8
8
 
9
- let hzbProgram = null;
9
+ let hzbProgram = [];
10
10
  let hzbBindGroupCache = new WeakMap();
11
- let blitter = null;
11
+ let blitter = [];
12
12
  const srcSize = new Int32Array(2);
13
- class HiZInitBlitter extends CopyBlitter {
13
+ /**
14
+ * Seeds mip 0 of the pyramid from the depth prepass.
15
+ *
16
+ * Both channels start from the same device depth: the pyramid only diverges
17
+ * once the reductions run, one keeping the farthest sample of each 2x2 and the
18
+ * other the nearest. `twoChannel` decides whether the nearest channel exists at
19
+ * all - it is a second full mip chain's worth of bandwidth, so a frame that only
20
+ * needs the occlusion pyramid does not carry it.
21
+ */ class HiZInitBlitter extends CopyBlitter {
22
+ _twoChannel;
23
+ constructor(twoChannel){
24
+ super();
25
+ this._twoChannel = twoChannel;
26
+ }
14
27
  /** @override */ filter(scope, type, srcTex, srcUV, srcLayer, sampleType) {
15
28
  const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);
16
- return scope.$builder.vec4(depth.x, 0, 0, 1);
29
+ return scope.$builder.vec4(depth.x, this._twoChannel ? depth.x : 0, 0, 1);
30
+ }
31
+ /** @override */ calcHash() {
32
+ return `${super.calcHash()}:${this._twoChannel ? 1 : 0}`;
17
33
  }
18
34
  }
19
35
  /*
@@ -192,7 +208,26 @@ float3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {
192
208
  }
193
209
  return ray;
194
210
  }
195
- */ function buildHZBProgram(device) {
211
+ */ /**
212
+ * Texture format for the Hi-Z pyramid.
213
+ *
214
+ * Half float under reverse-Z and full float otherwise, because reverse-Z spends
215
+ * float's relative precision where the depth is: a 16-bit mantissa there is
216
+ * worth a few centimetres at a hundred metres, while a linear-Z half float
217
+ * would quantise the near field into steps.
218
+ *
219
+ * `withNearest` adds the nearest-depth channel. It doubles the pyramid's
220
+ * bandwidth, so it is only requested by a frame that has a consumer for it.
221
+ */ function getHiZFormat(withNearest) {
222
+ if (withNearest) {
223
+ return REVERSE_Z ? 'rg16f' : 'rg32f';
224
+ }
225
+ return REVERSE_Z ? 'r16f' : 'r32f';
226
+ }
227
+ /** Whether a Hi-Z texture of this format carries the nearest-depth channel. */ function hasNearestChannel(format) {
228
+ return format === 'rg16f' || format === 'rg32f';
229
+ }
230
+ function buildHZBProgram(device, twoChannel) {
196
231
  const program = device.buildRenderProgram({
197
232
  label: 'HZBBuilder',
198
233
  vertex (pb) {
@@ -221,22 +256,33 @@ float3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {
221
256
  this.$l[`d${i}`] = pb.textureLoad(this.srcTex, pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord), device.type === 'webgpu' ? 0 : this.srcMipLevel);
222
257
  }
223
258
  // Furthest-depth reduction (max under standard Z, min under reverse Z).
259
+ // This is the conservative direction for occlusion: a cell reports the
260
+ // depth nothing behind it can be in front of.
224
261
  this.$l.maxDepth = pb[DEPTH_REDUCE_FARTHER](pb[DEPTH_REDUCE_FARTHER](this.d0.r, this.d1.r), pb[DEPTH_REDUCE_FARTHER](this.d2.r, this.d3.r));
225
- this.$outputs.color = pb.vec4(this.maxDepth, 0, 0, 1);
262
+ if (twoChannel) {
263
+ // Nearest-depth reduction, from the green channel. The opposite
264
+ // conservative direction, and the one a proximity query needs: a cell
265
+ // reports the closest surface anywhere inside it, so a query that
266
+ // covers the cell cannot miss geometry that is in there.
267
+ this.$l.minDepth = pb[DEPTH_REDUCE_CLOSER](pb[DEPTH_REDUCE_CLOSER](this.d0.g, this.d1.g), pb[DEPTH_REDUCE_CLOSER](this.d2.g, this.d3.g));
268
+ this.$outputs.color = pb.vec4(this.maxDepth, this.minDepth, 0, 1);
269
+ } else {
270
+ this.$outputs.color = pb.vec4(this.maxDepth, 0, 0, 1);
271
+ }
226
272
  });
227
273
  }
228
274
  });
229
- program.name = '@HZB_Builder';
275
+ program.name = `@HZB_Builder${twoChannel ? '_MinMax' : ''}`;
230
276
  return program;
231
277
  }
232
- function getHiZBindGroup(tex, mip) {
278
+ function getHiZBindGroup(tex, mip, program) {
233
279
  let info = hzbBindGroupCache.get(tex);
234
280
  if (!info) {
235
281
  info = [];
236
282
  hzbBindGroupCache.set(tex, info);
237
283
  }
238
284
  if (!info[mip]) {
239
- info[mip] = tex.device.createBindGroup(hzbProgram.bindGroupLayouts[0]);
285
+ info[mip] = tex.device.createBindGroup(program.bindGroupLayouts[0]);
240
286
  srcSize[0] = Math.max(tex.width >> mip, 1);
241
287
  srcSize[1] = Math.max(tex.height >> mip, 1);
242
288
  info[mip].setValue('srcSize', srcSize);
@@ -249,13 +295,13 @@ function getHiZBindGroup(tex, mip) {
249
295
  }
250
296
  return info[mip];
251
297
  }
252
- function buildHiZLevel(device, miplevel, srcTexture, dstTexture) {
298
+ function buildHiZLevel(device, miplevel, srcTexture, dstTexture, program) {
253
299
  const framebuffer = device.pool.fetchTemporalFramebuffer(false, 0, 0, [
254
300
  dstTexture
255
301
  ], null, false, 1, true, miplevel + 1);
256
302
  framebuffer.setColorAttachmentGenerateMipmaps(0, false);
257
- device.setProgram(hzbProgram);
258
- device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel));
303
+ device.setProgram(program);
304
+ device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel, program));
259
305
  device.setFramebuffer(framebuffer);
260
306
  drawFullscreenQuad();
261
307
  if (srcTexture !== dstTexture) {
@@ -263,29 +309,41 @@ function buildHiZLevel(device, miplevel, srcTexture, dstTexture) {
263
309
  }
264
310
  device.pool.releaseFrameBuffer(framebuffer);
265
311
  }
266
- function buildHiZ(sourceTex, HiZFrameBuffer) {
312
+ /**
313
+ * Builds the Hi-Z pyramid from the depth prepass.
314
+ *
315
+ * The target's channel count picks the variant: a one-channel target carries
316
+ * only the farthest-depth pyramid the occlusion tests want, a two-channel one
317
+ * adds the nearest-depth pyramid in green for proximity queries. Keyed off the
318
+ * texture rather than a flag so the pyramid and its consumer cannot disagree
319
+ * about what is in green.
320
+ */ function buildHiZ(sourceTex, HiZFrameBuffer) {
267
321
  const device = getDevice();
268
- if (!hzbProgram) {
269
- hzbProgram = buildHZBProgram(device);
270
- blitter = new HiZInitBlitter();
322
+ const dstTex = HiZFrameBuffer.getColorAttachments()[0];
323
+ const twoChannel = hasNearestChannel(dstTex.format);
324
+ const variant = twoChannel ? 1 : 0;
325
+ if (!hzbProgram[variant]) {
326
+ hzbProgram[variant] = buildHZBProgram(device, twoChannel);
327
+ blitter[variant] = new HiZInitBlitter(twoChannel);
271
328
  }
272
- blitter.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));
329
+ const program = hzbProgram[variant];
330
+ blitter[variant].blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));
273
331
  device.pushDeviceStates();
274
332
  const srcTex = HiZFrameBuffer.getColorAttachments()[0];
275
333
  if (device.type === 'webgpu') {
276
334
  for(let i = 0; i < srcTex.mipLevelCount - 1; i++){
277
- buildHiZLevel(device, i, srcTex, srcTex);
335
+ buildHiZLevel(device, i, srcTex, srcTex, program);
278
336
  }
279
337
  } else {
280
338
  const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(false, HiZFrameBuffer.getWidth(), HiZFrameBuffer.getHeight(), HiZFrameBuffer.getColorAttachments()[0].format, null, true);
281
- const dstTex = tmpFramebuffer.getColorAttachments()[0];
339
+ const tmpTex = tmpFramebuffer.getColorAttachments()[0];
282
340
  for(let i = 0; i < srcTex.mipLevelCount - 1; i++){
283
- buildHiZLevel(device, i, srcTex, dstTex);
341
+ buildHiZLevel(device, i, srcTex, tmpTex, program);
284
342
  }
285
343
  device.pool.releaseFrameBuffer(tmpFramebuffer);
286
344
  }
287
345
  device.popDeviceStates();
288
346
  }
289
347
 
290
- export { buildHiZ };
348
+ export { buildHiZ, getHiZFormat, hasNearestChannel };
291
349
  //# sourceMappingURL=hzb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BaseTexture,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter, type BlitType } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, DEPTH_REDUCE_FARTHER } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram> = null;\r\nlet hzbBindGroupCache: WeakMap<BaseTexture, BindGroup[]> = new WeakMap();\r\nlet blitter: Nullable<HiZInitBlitter> = null;\r\nconst srcSize = new Int32Array(2);\r\n\r\nclass HiZInitBlitter extends CopyBlitter {\r\n /** @override */\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n return scope.$builder.vec4(depth.x, 0, 0, 1);\r\n }\r\n}\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\nfunction buildHZBProgram(device: AbstractDevice) {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n );\r\n }\r\n // Furthest-depth reduction (max under standard Z, min under reverse Z).\r\n this.$l.maxDepth = pb[DEPTH_REDUCE_FARTHER](\r\n pb[DEPTH_REDUCE_FARTHER](this.d0.r, this.d1.r),\r\n pb[DEPTH_REDUCE_FARTHER](this.d2.r, this.d3.r)\r\n );\r\n this.$outputs.color = pb.vec4(this.maxDepth, 0, 0, 1);\r\n });\r\n }\r\n })!;\r\n program.name = '@HZB_Builder';\r\n return program;\r\n}\r\n\r\nfunction getHiZBindGroup(tex: BaseTexture, mip: number) {\r\n let info = hzbBindGroupCache.get(tex);\r\n if (!info) {\r\n info = [];\r\n hzbBindGroupCache.set(tex, info);\r\n }\r\n if (!info[mip]) {\r\n info[mip] = tex.device.createBindGroup(hzbProgram!.bindGroupLayouts[0]);\r\n srcSize[0] = Math.max(tex.width >> mip, 1);\r\n srcSize[1] = Math.max(tex.height >> mip, 1);\r\n info[mip].setValue('srcSize', srcSize);\r\n if (tex.device.type === 'webgpu') {\r\n info[mip].setTextureView('srcTex', tex, mip, 0, 1, fetchSampler('clamp_nearest'));\r\n } else {\r\n info[mip].setTexture('srcTex', tex, fetchSampler('clamp_nearest'));\r\n info[mip].setValue('srcMipLevel', mip);\r\n }\r\n }\r\n return info[mip];\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D\r\n) {\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n device.setProgram(hzbProgram);\r\n device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel));\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n if (!hzbProgram) {\r\n hzbProgram = buildHZBProgram(device);\r\n blitter = new HiZInitBlitter();\r\n }\r\n blitter!.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, dstTex);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroupCache","WeakMap","blitter","srcSize","Int32Array","HiZInitBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","depth","$builder","vec4","x","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","DEPTH_FARTHEST","add","mul","xy","y","neg","fragment","color","tex2D","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","maxDepth","DEPTH_REDUCE_FARTHER","d0","r","d1","d2","d3","name","getHiZBindGroup","tex","mip","info","get","set","createBindGroup","bindGroupLayouts","Math","max","width","height","setValue","setTextureView","fetchSampler","setTexture","buildHiZLevel","miplevel","srcTexture","dstTexture","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","blit","pushDeviceStates","getColorAttachments","mipLevelCount","tmpFramebuffer","getWidth","getHeight","format","dstTex","popDeviceStates"],"mappings":"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"}
1
+ {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BaseTexture,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter, type BlitType } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, DEPTH_REDUCE_CLOSER, DEPTH_REDUCE_FARTHER, REVERSE_Z } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram>[] = [];\r\nlet hzbBindGroupCache: WeakMap<BaseTexture, BindGroup[]> = new WeakMap();\r\nlet blitter: Nullable<HiZInitBlitter>[] = [];\r\nconst srcSize = new Int32Array(2);\r\n\r\n/**\r\n * Seeds mip 0 of the pyramid from the depth prepass.\r\n *\r\n * Both channels start from the same device depth: the pyramid only diverges\r\n * once the reductions run, one keeping the farthest sample of each 2x2 and the\r\n * other the nearest. `twoChannel` decides whether the nearest channel exists at\r\n * all - it is a second full mip chain's worth of bandwidth, so a frame that only\r\n * needs the occlusion pyramid does not carry it.\r\n */\r\nclass HiZInitBlitter extends CopyBlitter {\r\n private readonly _twoChannel: boolean;\r\n constructor(twoChannel: boolean) {\r\n super();\r\n this._twoChannel = twoChannel;\r\n }\r\n /** @override */\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n return scope.$builder.vec4(depth.x, this._twoChannel ? depth.x : 0, 0, 1);\r\n }\r\n /** @override */\r\n protected calcHash(): string {\r\n return `${super.calcHash()}:${this._twoChannel ? 1 : 0}`;\r\n }\r\n}\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\n/**\r\n * Texture format for the Hi-Z pyramid.\r\n *\r\n * Half float under reverse-Z and full float otherwise, because reverse-Z spends\r\n * float's relative precision where the depth is: a 16-bit mantissa there is\r\n * worth a few centimetres at a hundred metres, while a linear-Z half float\r\n * would quantise the near field into steps.\r\n *\r\n * `withNearest` adds the nearest-depth channel. It doubles the pyramid's\r\n * bandwidth, so it is only requested by a frame that has a consumer for it.\r\n */\r\nexport function getHiZFormat(withNearest: boolean): TextureFormat {\r\n if (withNearest) {\r\n return REVERSE_Z ? 'rg16f' : 'rg32f';\r\n }\r\n return REVERSE_Z ? 'r16f' : 'r32f';\r\n}\r\n\r\n/** Whether a Hi-Z texture of this format carries the nearest-depth channel. */\r\nexport function hasNearestChannel(format: TextureFormat): boolean {\r\n return format === 'rg16f' || format === 'rg32f';\r\n}\r\n\r\nfunction buildHZBProgram(device: AbstractDevice, twoChannel: boolean) {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n );\r\n }\r\n // Furthest-depth reduction (max under standard Z, min under reverse Z).\r\n // This is the conservative direction for occlusion: a cell reports the\r\n // depth nothing behind it can be in front of.\r\n this.$l.maxDepth = pb[DEPTH_REDUCE_FARTHER](\r\n pb[DEPTH_REDUCE_FARTHER](this.d0.r, this.d1.r),\r\n pb[DEPTH_REDUCE_FARTHER](this.d2.r, this.d3.r)\r\n );\r\n if (twoChannel) {\r\n // Nearest-depth reduction, from the green channel. The opposite\r\n // conservative direction, and the one a proximity query needs: a cell\r\n // reports the closest surface anywhere inside it, so a query that\r\n // covers the cell cannot miss geometry that is in there.\r\n this.$l.minDepth = pb[DEPTH_REDUCE_CLOSER](\r\n pb[DEPTH_REDUCE_CLOSER](this.d0.g, this.d1.g),\r\n pb[DEPTH_REDUCE_CLOSER](this.d2.g, this.d3.g)\r\n );\r\n this.$outputs.color = pb.vec4(this.maxDepth, this.minDepth, 0, 1);\r\n } else {\r\n this.$outputs.color = pb.vec4(this.maxDepth, 0, 0, 1);\r\n }\r\n });\r\n }\r\n })!;\r\n program.name = `@HZB_Builder${twoChannel ? '_MinMax' : ''}`;\r\n return program;\r\n}\r\n\r\nfunction getHiZBindGroup(tex: BaseTexture, mip: number, program: GPUProgram) {\r\n let info = hzbBindGroupCache.get(tex);\r\n if (!info) {\r\n info = [];\r\n hzbBindGroupCache.set(tex, info);\r\n }\r\n if (!info[mip]) {\r\n info[mip] = tex.device.createBindGroup(program.bindGroupLayouts[0]);\r\n srcSize[0] = Math.max(tex.width >> mip, 1);\r\n srcSize[1] = Math.max(tex.height >> mip, 1);\r\n info[mip].setValue('srcSize', srcSize);\r\n if (tex.device.type === 'webgpu') {\r\n info[mip].setTextureView('srcTex', tex, mip, 0, 1, fetchSampler('clamp_nearest'));\r\n } else {\r\n info[mip].setTexture('srcTex', tex, fetchSampler('clamp_nearest'));\r\n info[mip].setValue('srcMipLevel', mip);\r\n }\r\n }\r\n return info[mip];\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D,\r\n program: GPUProgram\r\n) {\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n device.setProgram(program);\r\n device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel, program));\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\n/**\r\n * Builds the Hi-Z pyramid from the depth prepass.\r\n *\r\n * The target's channel count picks the variant: a one-channel target carries\r\n * only the farthest-depth pyramid the occlusion tests want, a two-channel one\r\n * adds the nearest-depth pyramid in green for proximity queries. Keyed off the\r\n * texture rather than a flag so the pyramid and its consumer cannot disagree\r\n * about what is in green.\r\n */\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n const dstTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n const twoChannel = hasNearestChannel(dstTex.format);\r\n const variant = twoChannel ? 1 : 0;\r\n if (!hzbProgram[variant]) {\r\n hzbProgram[variant] = buildHZBProgram(device, twoChannel);\r\n blitter[variant] = new HiZInitBlitter(twoChannel);\r\n }\r\n const program = hzbProgram[variant]!;\r\n blitter[variant]!.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex, program);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const tmpTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, tmpTex, program);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroupCache","WeakMap","blitter","srcSize","Int32Array","HiZInitBlitter","CopyBlitter","_twoChannel","twoChannel","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","depth","$builder","vec4","x","calcHash","getHiZFormat","withNearest","REVERSE_Z","hasNearestChannel","format","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","DEPTH_FARTHEST","add","mul","xy","y","neg","fragment","color","tex2D","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","maxDepth","DEPTH_REDUCE_FARTHER","d0","r","d1","d2","d3","minDepth","DEPTH_REDUCE_CLOSER","g","name","getHiZBindGroup","tex","mip","info","get","set","createBindGroup","bindGroupLayouts","Math","max","width","height","setValue","setTextureView","fetchSampler","setTexture","buildHiZLevel","miplevel","srcTexture","dstTexture","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","dstTex","getColorAttachments","variant","blit","pushDeviceStates","mipLevelCount","tmpFramebuffer","getWidth","getHeight","tmpTex","popDeviceStates"],"mappings":"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"}