@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', this._karisAverage ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D, srgbOutput: boolean) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","textures","dstTexture","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","karis","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","weights","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
1
+ {"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static readonly PHYSICAL_LEVEL_WEIGHTS = [0.3465 + 0.138, 0.1176, 0.066, 0.066, 0.061].map(\r\n (w) => w * 0.675\r\n );\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n *\r\n * Only applies under legacy lighting. With physical lighting, bloom downsample is a\r\n * plain linear average and leaves fireflies to TAA (bloom reads the TAA-resolved frame).\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n private static _levelWeights(ctx: DrawContext, count: number) {\r\n const physical = ctx.scene?.lightingMode === 'physical';\r\n const weights: number[] = [];\r\n for (let i = 0; i < count; i++) {\r\n weights.push(physical ? (Bloom.PHYSICAL_LEVEL_WEIGHTS[i] ?? 0) : 1);\r\n }\r\n return weights;\r\n }\r\n /** Whether the prefilter uses the Karis average, see {@link Bloom.karisAverage}. */\r\n private _useKarisAverage(ctx: DrawContext) {\r\n return this._karisAverage && ctx.scene?.lightingMode !== 'physical';\r\n }\r\n /**\r\n * Upsample source scale for level `i + 1` into level `i`.\r\n *\r\n * @remarks\r\n * The chain accumulates acc[i] = L[i] + (w[i+1] / w[i]) * up(acc[i+1]), which equals\r\n * sum(w[k] * L[k]) / w[i]; the final compose multiplies by w[0]. This weights every level with a\r\n * single scalar per pass.\r\n */\r\n private static _upsampleScale(weights: number[], i: number) {\r\n return weights[i] > 0 ? weights[i + 1] / weights[i] : 0;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n const weights = Bloom._levelWeights(ctx, levels.length);\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out), this._useKarisAverage(ctx));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(\r\n device,\r\n rg.getTexture<Texture2D>(src),\r\n rg.getTexture<Texture2D>(out),\r\n Bloom._upsampleScale(weights, i)\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput,\r\n weights[0]\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex, this._useKarisAverage(ctx));\r\n this.downsample(device, colorTex, downsampleTextures);\r\n const weights = Bloom._levelWeights(ctx, downsampleTextures.length);\r\n this.upsample(device, downsampleTextures, weights);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput, weights[0]);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D, karis = this._karisAverage) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', karis ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(\r\n device: AbstractDevice,\r\n srcTexture: Texture2D,\r\n bloomTexture: Texture2D,\r\n srgbOutput: boolean,\r\n levelWeight = 1\r\n ) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity * levelWeight);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[], weights?: number[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i], weights ? Bloom._upsampleScale(weights, i) : 1);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D, scale = 1) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('scale', scale);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.scale = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.sum, this.scale), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\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.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","PHYSICAL_LEVEL_WEIGHTS","map","w","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","_levelWeights","ctx","count","physical","scene","lightingMode","weights","i","push","_useKarisAverage","_upsampleScale","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","h","maxLevels","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","karis","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","levelWeight","textures","dstTexture","scale","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
@@ -5,61 +5,61 @@ import { Vector2 } from '@zephyr3d/base';
5
5
  import { FrameResources } from '../render/rendergraph/blackboard.js';
6
6
 
7
7
  /** Default for {@link MotionBlur.maxBlurLength}. @internal */ const DEFAULT_MAX_BLUR_LENGTH = 40;
8
- /**
9
- * Sample spacing along a streak, in pixels. The taps are not dithered, so this
10
- * is all that stands between a long streak and ghosting.
11
- * @internal
8
+ /**
9
+ * Sample spacing along a streak, in pixels. The taps are not dithered, so this
10
+ * is all that stands between a long streak and ghosting.
11
+ * @internal
12
12
  */ const TARGET_STEP_PX = 3.3;
13
- /**
14
- * Cost ceiling, and the one place the spacing above is allowed to slip. Past
15
- * `MAX_WALK_STEPS * TARGET_STEP_PX` per direction the taps thin out and long
16
- * streaks ghost, which caps the usable {@link MotionBlur.maxBlurLength} at
17
- * roughly 210 px on a fully biased shutter, twice that on a centred one.
18
- * @internal
13
+ /**
14
+ * Cost ceiling, and the one place the spacing above is allowed to slip. Past
15
+ * `MAX_WALK_STEPS * TARGET_STEP_PX` per direction the taps thin out and long
16
+ * streaks ghost, which caps the usable {@link MotionBlur.maxBlurLength} at
17
+ * roughly 210 px on a fully biased shutter, twice that on a centred one.
18
+ * @internal
19
19
  */ const MIN_WALK_STEPS = 4;
20
20
  const MAX_WALK_STEPS = 64;
21
- /**
22
- * Velocity tile size, which is also the furthest a point may throw its streak:
23
- * NeighborMax dilates across one tile, so anything that can reach a pixel has
24
- * to live within a tile of it. A centred shutter spends that reach both ways
25
- * and affords twice the tile size; a fully biased one spends it all one way.
26
- * @internal
21
+ /**
22
+ * Velocity tile size, which is also the furthest a point may throw its streak:
23
+ * NeighborMax dilates across one tile, so anything that can reach a pixel has
24
+ * to live within a tile of it. A centred shutter spends that reach both ways
25
+ * and affords twice the tile size; a fully biased one spends it all one way.
26
+ * @internal
27
27
  */ function tileSizeFor(maxBlurLength, shutterBias) {
28
28
  return Math.max(2, Math.ceil(maxBlurLength * Math.max(shutterBias, 1 - shutterBias)));
29
29
  }
30
- /**
31
- * Steps for a walk spanning `spanPx` pixels, at {@link TARGET_STEP_PX} stride.
32
- * Per direction rather than per pair: the bias splits the streak unevenly, and
33
- * a direction with no share must take no steps (see the walk).
34
- * @internal
30
+ /**
31
+ * Steps for a walk spanning `spanPx` pixels, at {@link TARGET_STEP_PX} stride.
32
+ * Per direction rather than per pair: the bias splits the streak unevenly, and
33
+ * a direction with no share must take no steps (see the walk).
34
+ * @internal
35
35
  */ function walkStepsFor(spanPx) {
36
36
  if (spanPx <= 0) {
37
37
  return 0;
38
38
  }
39
39
  return Math.min(MAX_WALK_STEPS, Math.max(MIN_WALK_STEPS, Math.ceil(spanPx / TARGET_STEP_PX)));
40
40
  }
41
- /**
42
- * Sentinel velocity emitted by materials opting out of temporal reuse
43
- * ({@link MeshMaterial.disableTAA} writes `(6e4, 6e4)`). Read literally it
44
- * would smear those pixels across the screen. Same threshold
45
- * `temporalResolve()` tests against.
46
- * @internal
41
+ /**
42
+ * Sentinel velocity emitted by materials opting out of temporal reuse
43
+ * ({@link MeshMaterial.disableTAA} writes `(6e4, 6e4)`). Read literally it
44
+ * would smear those pixels across the screen. Same threshold
45
+ * `temporalResolve()` tests against.
46
+ * @internal
47
47
  */ const MV_SENTINEL = 5e4;
48
- /**
49
- * View-space depth gap past which two samples count as separate surfaces.
50
- * Small on purpose: the test is meant to be near-binary, with the ramp only
51
- * softening near-coplanar cases.
52
- * @internal
48
+ /**
49
+ * View-space depth gap past which two samples count as separate surfaces.
50
+ * Small on purpose: the test is meant to be near-binary, with the ramp only
51
+ * softening near-coplanar cases.
52
+ * @internal
53
53
  */ const SOFT_Z_EXTENT = 0.01;
54
54
  /** Half the separation between the two walks per direction. @internal */ const RIBBON_WIDTH = 3;
55
55
  /** Velocity tiles keep the sign of the motion, so a signed float format. @internal */ const TILE_FORMAT = 'rgba16f';
56
56
  const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
57
- /**
58
- * Raw motion vector to the velocity the filter works with: sentinel rejected,
59
- * scaled by strength, clamped to the longest reconstructible streak. Every
60
- * pass must apply exactly this, or the dilated and per-pixel velocities
61
- * disagree and the weights break.
62
- * @internal
57
+ /**
58
+ * Raw motion vector to the velocity the filter works with: sentinel rejected,
59
+ * scaled by strength, clamped to the longest reconstructible streak. Every
60
+ * pass must apply exactly this, or the dilated and per-pixel velocities
61
+ * disagree and the weights break.
62
+ * @internal
63
63
  */ function processVelocity(scope, raw, texSize, strength, maxLength) {
64
64
  const pb = scope.$builder;
65
65
  pb.func(FUNC_PROCESS_VELOCITY, [
@@ -76,21 +76,21 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
76
76
  });
77
77
  return scope[FUNC_PROCESS_VELOCITY](raw, texSize, strength, maxLength);
78
78
  }
79
- /**
80
- * The motion blur post effect
81
- *
82
- * @remarks
83
- * The reconstruction filter of McGuire et al., "A Reconstruction Filter for
84
- * Plausible Motion Blur" (2012), with the tap path walking the velocity field
85
- * rather than a straight line so that rotating geometry does not tear.
86
- *
87
- * Velocity is dilated over tiles first (TileMax, then NeighborMax) so a static
88
- * pixel still blurs when fast geometry passes near it. That dilation is what
89
- * makes moving *objects* streak over the background: reading only the velocity
90
- * under the current pixel reproduces camera motion, where the field is smooth
91
- * screen-wide, but leaves moving objects with hard edges.
92
- *
93
- * @public
79
+ /**
80
+ * The motion blur post effect
81
+ *
82
+ * @remarks
83
+ * The reconstruction filter of McGuire et al., "A Reconstruction Filter for
84
+ * Plausible Motion Blur" (2012), with the tap path walking the velocity field
85
+ * rather than a straight line so that rotating geometry does not tear.
86
+ *
87
+ * Velocity is dilated over tiles first (TileMax, then NeighborMax) so a static
88
+ * pixel still blurs when fast geometry passes near it. That dilation is what
89
+ * makes moving *objects* streak over the background: reading only the velocity
90
+ * under the current pixel reproduces camera motion, where the field is smooth
91
+ * screen-wide, but leaves moving objects with hard edges.
92
+ *
93
+ * @public
94
94
  */ class MotionBlur extends AbstractPostEffect {
95
95
  static _programTileMaxH = null;
96
96
  static _bindgroupTileMaxH = null;
@@ -104,8 +104,8 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
104
104
  /** @internal */ _shutterBias;
105
105
  /** @internal */ _maxBlurLength;
106
106
  /** @internal */ _texSize;
107
- /**
108
- * Creates an instance of tonemap post effect
107
+ /**
108
+ * Creates an instance of tonemap post effect
109
109
  */ constructor(){
110
110
  super();
111
111
  this._intensity = 1;
@@ -117,57 +117,57 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
117
117
  // handle is final before either post chain is built.
118
118
  this._layer = PostEffectLayer.end;
119
119
  }
120
- /**
121
- * Motion blur strength, the fraction of the frame interval the shutter is
122
- * open. 1 blurs over a whole frame of movement (a 360 degree shutter), 0.5
123
- * over half of it (the cinematic 180 degree shutter), 0 disables the effect.
124
- *
125
- * @remarks
126
- * Motion vectors already carry one frame of displacement, so this is a plain
127
- * dimensionless factor and must not be scaled by frame time again. The
128
- * result is capped by {@link MotionBlur.maxBlurLength} whatever the strength.
120
+ /**
121
+ * Motion blur strength, the fraction of the frame interval the shutter is
122
+ * open. 1 blurs over a whole frame of movement (a 360 degree shutter), 0.5
123
+ * over half of it (the cinematic 180 degree shutter), 0 disables the effect.
124
+ *
125
+ * @remarks
126
+ * Motion vectors already carry one frame of displacement, so this is a plain
127
+ * dimensionless factor and must not be scaled by frame time again. The
128
+ * result is capped by {@link MotionBlur.maxBlurLength} whatever the strength.
129
129
  */ get strength() {
130
130
  return this._intensity;
131
131
  }
132
132
  set strength(val) {
133
133
  this._intensity = val;
134
134
  }
135
- /**
136
- * How much of the streak lies ahead of where the object is now, as a fraction
137
- * of its length. Clamped to [0, 1].
138
- *
139
- * - `0` trails the streak entirely behind, which is what a shutter closing
140
- * on the current frame produces and reads as the object dragging a tail.
141
- * - `0.5` (the default) centres it, as McGuire et al. describe: nothing lags,
142
- * at the cost of blurring into where the object has not been yet.
143
- * - `1` puts it entirely ahead. Offered for symmetry, rarely wanted.
144
- *
145
- * @remarks
146
- * This slides the streak without lengthening it;
147
- * {@link MotionBlur.maxBlurLength} is honoured at any bias, paid for with a
148
- * coarser tile grid towards the extremes.
135
+ /**
136
+ * How much of the streak lies ahead of where the object is now, as a fraction
137
+ * of its length. Clamped to [0, 1].
138
+ *
139
+ * - `0` trails the streak entirely behind, which is what a shutter closing
140
+ * on the current frame produces and reads as the object dragging a tail.
141
+ * - `0.5` (the default) centres it, as McGuire et al. describe: nothing lags,
142
+ * at the cost of blurring into where the object has not been yet.
143
+ * - `1` puts it entirely ahead. Offered for symmetry, rarely wanted.
144
+ *
145
+ * @remarks
146
+ * This slides the streak without lengthening it;
147
+ * {@link MotionBlur.maxBlurLength} is honoured at any bias, paid for with a
148
+ * coarser tile grid towards the extremes.
149
149
  */ get shutterBias() {
150
150
  return this._shutterBias;
151
151
  }
152
152
  set shutterBias(val) {
153
153
  this._shutterBias = Math.min(1, Math.max(0, val));
154
154
  }
155
- /**
156
- * Longest streak the filter will reconstruct, in pixels at render
157
- * resolution. Velocity beyond this is clamped: the direction survives, the
158
- * length does not.
159
- *
160
- * @remarks
161
- * This is the ceiling {@link MotionBlur.strength} runs into: an object
162
- * crossing `V` pixels per frame stops responding once `V * strength` reaches
163
- * it. The clamp is per pixel, so fast objects saturate first and pushing
164
- * strength further only flattens the fast/slow difference. Raise this instead.
165
- *
166
- * Cost is linear in it - 28 samples per pixel at the default 40, 100 at 160,
167
- * since step counts are derived from the length to keep the sampling dense.
168
- * The quality limit comes sooner though: a tile is as wide as the reach, so
169
- * raising this spreads the dilated velocity further and a fast object starts
170
- * dragging nearby slow geometry into its blur.
155
+ /**
156
+ * Longest streak the filter will reconstruct, in pixels at render
157
+ * resolution. Velocity beyond this is clamped: the direction survives, the
158
+ * length does not.
159
+ *
160
+ * @remarks
161
+ * This is the ceiling {@link MotionBlur.strength} runs into: an object
162
+ * crossing `V` pixels per frame stops responding once `V * strength` reaches
163
+ * it. The clamp is per pixel, so fast objects saturate first and pushing
164
+ * strength further only flattens the fast/slow difference. Raise this instead.
165
+ *
166
+ * Cost is linear in it - 28 samples per pixel at the default 40, 100 at 160,
167
+ * since step counts are derived from the length to keep the sampling dense.
168
+ * The quality limit comes sooner though: a tile is as wide as the reach, so
169
+ * raising this spreads the dilated velocity further and a fast object starts
170
+ * dragging nearby slow geometry into its blur.
171
171
  */ get maxBlurLength() {
172
172
  return this._maxBlurLength;
173
173
  }
@@ -297,13 +297,13 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
297
297
  return output.color;
298
298
  });
299
299
  }
300
- /**
301
- * {@inheritDoc AbstractPostEffect.apply}
302
- *
303
- * @remarks
304
- * Reconstruction needs the dilated tiles that {@link MotionBlur.setup} builds
305
- * and this single-pass entry cannot. Only reached without motion vectors,
306
- * where no blur is the right answer anyway.
300
+ /**
301
+ * {@inheritDoc AbstractPostEffect.apply}
302
+ *
303
+ * @remarks
304
+ * Reconstruction needs the dilated tiles that {@link MotionBlur.setup} builds
305
+ * and this single-pass entry cannot. Only reached without motion vectors,
306
+ * where no blur is the right answer anyway.
307
307
  */ apply(ctx, inputColorTexture, _sceneDepthTexture, srgbOutput) {
308
308
  this.passThrough(ctx, inputColorTexture, srgbOutput);
309
309
  }
@@ -694,11 +694,11 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
694
694
  MotionBlur._bindgroupMotionBlur = device.createBindGroup(MotionBlur._programMotionBlur.bindGroupLayouts[0]);
695
695
  }
696
696
  }
697
- /**
698
- * Shared fullscreen quad vertex stage. `uv` is derived from the attribute and
699
- * so is unaffected by the flip, which keeps every pass in this effect writing
700
- * and sampling the same orientation on both backends.
701
- * @internal
697
+ /**
698
+ * Shared fullscreen quad vertex stage. `uv` is derived from the attribute and
699
+ * so is unaffected by the flip, which keeps every pass in this effect writing
700
+ * and sampling the same orientation on both backends.
701
+ * @internal
702
702
  */ function fullscreenVertex(pb) {
703
703
  this.flip = pb.int().uniform(0);
704
704
  this.$inputs.pos = pb.vec2().attrib('position');