@zephyr3d/scene 0.9.26 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1 +1 @@
1
- {"version":3,"file":"motionblur.js","sources":["../../src/posteffect/motionblur.ts"],"sourcesContent":["import { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { AbstractDevice, BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\n\r\n/**\r\n * The motion blur post effect\r\n * @public\r\n */\r\nexport class MotionBlur extends AbstractPostEffect {\r\n private static _programMotionBlur: Nullable<GPUProgram> = null;\r\n private static _bindgroupMotionBlur: Nullable<BindGroup> = null;\r\n /** @internal */\r\n private _intensity: number;\r\n /** @internal */\r\n private _aspect: Vector2;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n this._intensity = 1;\r\n this._aspect = new Vector2();\r\n // End layer: the display chain runs after the TAA resolve (see Camera.setupPostEffects).\r\n // Motion vectors are unaffected by the move -- the blackboard handle is final before\r\n // either post chain is built.\r\n this._layer = PostEffectLayer.end;\r\n }\r\n /** Motion blur strength */\r\n get strength() {\r\n return this._intensity;\r\n }\r\n set strength(val: number) {\r\n this._intensity = 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.requireMotionVectorTexture} */\r\n requireMotionVectorTexture() {\r\n return true;\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 this._prepare(device);\r\n this._aspect.setXY(inputColorTexture.width / inputColorTexture.height, 1);\r\n MotionBlur._bindgroupMotionBlur!.setTexture(\r\n 'inputTexture',\r\n inputColorTexture,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n MotionBlur._bindgroupMotionBlur!.setTexture(\r\n 'motionVectorTexture',\r\n ctx.motionVectorTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n MotionBlur._bindgroupMotionBlur!.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n MotionBlur._bindgroupMotionBlur!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n MotionBlur._bindgroupMotionBlur!.setValue('frameDeltaTime', device.frameInfo.elapsedFrame);\r\n MotionBlur._bindgroupMotionBlur!.setValue('intensity', this._intensity);\r\n MotionBlur._bindgroupMotionBlur!.setValue('aspect', this._aspect);\r\n device.setProgram(MotionBlur._programMotionBlur);\r\n device.setBindGroup(0, MotionBlur._bindgroupMotionBlur!);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice) {\r\n if (!MotionBlur._programMotionBlur) {\r\n MotionBlur._programMotionBlur = 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.srgbOut = pb.int().uniform(0);\r\n this.frameDeltaTime = pb.float().uniform(0);\r\n this.inputTexture = pb.tex2D().uniform(0);\r\n this.motionVectorTexture = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.aspect = pb.vec2().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.color = pb.vec3();\r\n this.$l.velocity = pb.textureSampleLevel(this.motionVectorTexture, this.$inputs.uv, 0).xy;\r\n this.velocity = pb.div(pb.mul(this.velocity, 0.5), this.aspect);\r\n this.$l.sourceSample = pb.textureSampleLevel(this.inputTexture, this.$inputs.uv, 0);\r\n this.$l.color = this.sourceSample.rgb;\r\n this.$if(pb.greaterThan(pb.dot(this.velocity, this.velocity), 1e-7), function () {\r\n this.velocity = pb.mul(this.velocity, this.intensity, this.frameDeltaTime);\r\n this.$l.uv0 = pb.clamp(pb.sub(this.$inputs.uv, this.velocity), pb.vec2(0), pb.vec2(1));\r\n this.$l.uv1 = pb.clamp(pb.add(this.$inputs.uv, this.velocity), pb.vec2(0), pb.vec2(1));\r\n const NUM_SAMPLES = 17;\r\n this.$for(pb.float('i'), 0, NUM_SAMPLES, function () {\r\n this.$l.t = pb.div(this.i, NUM_SAMPLES - 1);\r\n this.color = pb.add(\r\n this.color,\r\n pb.textureSampleLevel(this.inputTexture, pb.mix(this.uv0, this.uv1, this.t), 0).rgb\r\n );\r\n });\r\n this.color = pb.mul(this.color, 1 / NUM_SAMPLES);\r\n });\r\n //this.color = pb.vec3(this.velocity, 0);\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.color = linearToGamma(this, this.color);\r\n });\r\n this.$outputs.outColor = pb.vec4(this.color, this.sourceSample.a);\r\n });\r\n }\r\n })!;\r\n MotionBlur._programMotionBlur.name = '@MotionBlur';\r\n MotionBlur._bindgroupMotionBlur = device.createBindGroup(\r\n MotionBlur._programMotionBlur.bindGroupLayouts[0]\r\n );\r\n console.log(MotionBlur._programMotionBlur.getShaderSource('fragment'));\r\n }\r\n }\r\n}\r\n"],"names":["MotionBlur","AbstractPostEffect","_programMotionBlur","_bindgroupMotionBlur","_intensity","_aspect","Vector2","_layer","PostEffectLayer","end","strength","val","requireLinearDepthTexture","requireDepthAttachment","requireMotionVectorTexture","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","device","_prepare","setXY","width","height","setTexture","fetchSampler","motionVectorTexture","setValue","needFlip","frameInfo","elapsedFrame","setProgram","setBindGroup","drawFullscreenQuad","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","srgbOut","frameDeltaTime","float","inputTexture","tex2D","intensity","aspect","outColor","$l","color","vec3","velocity","textureSampleLevel","div","sourceSample","rgb","greaterThan","dot","uv0","clamp","sub","uv1","NUM_SAMPLES","$for","t","i","mix","linearToGamma","a","name","createBindGroup","bindGroupLayouts","console","log","getShaderSource"],"mappings":"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"}
1
+ {"version":3,"file":"motionblur.js","sources":["../../src/posteffect/motionblur.ts"],"sourcesContent":["import { AbstractPostEffect, PostEffectLayer } from './posteffect';\nimport type { PostEffectSetupContext } from './posteffect';\nimport { linearToGamma } from '../shaders/misc';\nimport type {\n AbstractDevice,\n BindGroup,\n GPUProgram,\n PBGlobalScope,\n PBInsideFunctionScope,\n PBShaderExp,\n ProgramBuilder,\n Texture2D,\n TextureFormat\n} from '@zephyr3d/device';\nimport type { DrawContext } from '../render';\nimport { fetchSampler } from '../utility/misc';\nimport type { Nullable } from '@zephyr3d/base';\nimport { Vector2 } from '@zephyr3d/base';\nimport { FrameResources } from '../render/rendergraph/blackboard';\nimport type { RGHandle } from '../render/rendergraph/types';\n\n/** Default for {@link MotionBlur.maxBlurLength}. @internal */\nconst DEFAULT_MAX_BLUR_LENGTH = 40;\n\n/**\n * Sample spacing along a streak, in pixels. The taps are not dithered, so this\n * is all that stands between a long streak and ghosting.\n * @internal\n */\nconst TARGET_STEP_PX = 3.3;\n\n/**\n * Cost ceiling, and the one place the spacing above is allowed to slip. Past\n * `MAX_WALK_STEPS * TARGET_STEP_PX` per direction the taps thin out and long\n * streaks ghost, which caps the usable {@link MotionBlur.maxBlurLength} at\n * roughly 210 px on a fully biased shutter, twice that on a centred one.\n * @internal\n */\nconst MIN_WALK_STEPS = 4;\nconst MAX_WALK_STEPS = 64;\n\n/**\n * Velocity tile size, which is also the furthest a point may throw its streak:\n * NeighborMax dilates across one tile, so anything that can reach a pixel has\n * to live within a tile of it. A centred shutter spends that reach both ways\n * and affords twice the tile size; a fully biased one spends it all one way.\n * @internal\n */\nfunction tileSizeFor(maxBlurLength: number, shutterBias: number): number {\n return Math.max(2, Math.ceil(maxBlurLength * Math.max(shutterBias, 1 - shutterBias)));\n}\n\n/**\n * Steps for a walk spanning `spanPx` pixels, at {@link TARGET_STEP_PX} stride.\n * Per direction rather than per pair: the bias splits the streak unevenly, and\n * a direction with no share must take no steps (see the walk).\n * @internal\n */\nfunction walkStepsFor(spanPx: number): number {\n if (spanPx <= 0) {\n return 0;\n }\n return Math.min(MAX_WALK_STEPS, Math.max(MIN_WALK_STEPS, Math.ceil(spanPx / TARGET_STEP_PX)));\n}\n\n/**\n * Sentinel velocity emitted by materials opting out of temporal reuse\n * ({@link MeshMaterial.disableTAA} writes `(6e4, 6e4)`). Read literally it\n * would smear those pixels across the screen. Same threshold\n * `temporalResolve()` tests against.\n * @internal\n */\nconst MV_SENTINEL = 5e4;\n\n/**\n * View-space depth gap past which two samples count as separate surfaces.\n * Small on purpose: the test is meant to be near-binary, with the ramp only\n * softening near-coplanar cases.\n * @internal\n */\nconst SOFT_Z_EXTENT = 0.01;\n\n/** Half the separation between the two walks per direction. @internal */\nconst RIBBON_WIDTH = 3;\n\n/** Velocity tiles keep the sign of the motion, so a signed float format. @internal */\nconst TILE_FORMAT: TextureFormat = 'rgba16f';\n\nconst FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';\n\n/**\n * Raw motion vector to the velocity the filter works with: sentinel rejected,\n * scaled by strength, clamped to the longest reconstructible streak. Every\n * pass must apply exactly this, or the dilated and per-pixel velocities\n * disagree and the weights break.\n * @internal\n */\nfunction processVelocity(\n scope: PBInsideFunctionScope,\n raw: PBShaderExp,\n texSize: PBShaderExp,\n strength: PBShaderExp,\n maxLength: PBShaderExp\n): PBShaderExp {\n const pb = scope.$builder;\n pb.func(\n FUNC_PROCESS_VELOCITY,\n [pb.vec2('raw'), pb.vec2('texSize'), pb.float('strength'), pb.float('maxLength')],\n function () {\n this.$l.sentinel = pb.and(\n pb.greaterThanEqual(this.raw.x, MV_SENTINEL),\n pb.greaterThanEqual(this.raw.y, MV_SENTINEL)\n );\n this.$l.v = this.$choice(this.sentinel, pb.vec2(0), pb.mul(this.raw, this.strength));\n this.$l.len = pb.length(pb.mul(this.v, this.texSize));\n // Branchless clamp: the factor is 1 while the velocity is within budget.\n this.$return(pb.mul(this.v, pb.div(this.maxLength, pb.max(this.len, this.maxLength))));\n }\n );\n return scope[FUNC_PROCESS_VELOCITY](raw, texSize, strength, maxLength) as PBShaderExp;\n}\n\n/**\n * The motion blur post effect\n *\n * @remarks\n * The reconstruction filter of McGuire et al., \"A Reconstruction Filter for\n * Plausible Motion Blur\" (2012), with the tap path walking the velocity field\n * rather than a straight line so that rotating geometry does not tear.\n *\n * Velocity is dilated over tiles first (TileMax, then NeighborMax) so a static\n * pixel still blurs when fast geometry passes near it. That dilation is what\n * makes moving *objects* streak over the background: reading only the velocity\n * under the current pixel reproduces camera motion, where the field is smooth\n * screen-wide, but leaves moving objects with hard edges.\n *\n * @public\n */\nexport class MotionBlur extends AbstractPostEffect {\n private static _programTileMaxH: Nullable<GPUProgram> = null;\n private static _bindgroupTileMaxH: Nullable<BindGroup> = null;\n private static _programTileMaxV: Nullable<GPUProgram> = null;\n private static _bindgroupTileMaxV: Nullable<BindGroup> = null;\n private static _programNeighborMax: Nullable<GPUProgram> = null;\n private static _bindgroupNeighborMax: Nullable<BindGroup> = null;\n private static _programMotionBlur: Nullable<GPUProgram> = null;\n private static _bindgroupMotionBlur: Nullable<BindGroup> = null;\n /** @internal */\n private _intensity: number;\n /** @internal */\n private _shutterBias: number;\n /** @internal */\n private _maxBlurLength: number;\n /** @internal */\n private readonly _texSize: Vector2;\n /**\n * Creates an instance of tonemap post effect\n */\n constructor() {\n super();\n this._intensity = 1;\n this._shutterBias = 0.5;\n this._maxBlurLength = DEFAULT_MAX_BLUR_LENGTH;\n this._texSize = new Vector2();\n // End layer, so the display chain runs after the TAA resolve (see\n // Camera.setupPostEffects). Motion vectors are unaffected: the blackboard\n // handle is final before either post chain is built.\n this._layer = PostEffectLayer.end;\n }\n /**\n * Motion blur strength, the fraction of the frame interval the shutter is\n * open. 1 blurs over a whole frame of movement (a 360 degree shutter), 0.5\n * over half of it (the cinematic 180 degree shutter), 0 disables the effect.\n *\n * @remarks\n * Motion vectors already carry one frame of displacement, so this is a plain\n * dimensionless factor and must not be scaled by frame time again. The\n * result is capped by {@link MotionBlur.maxBlurLength} whatever the strength.\n */\n get strength() {\n return this._intensity;\n }\n set strength(val: number) {\n this._intensity = val;\n }\n /**\n * How much of the streak lies ahead of where the object is now, as a fraction\n * of its length. Clamped to [0, 1].\n *\n * - `0` trails the streak entirely behind, which is what a shutter closing\n * on the current frame produces and reads as the object dragging a tail.\n * - `0.5` (the default) centres it, as McGuire et al. describe: nothing lags,\n * at the cost of blurring into where the object has not been yet.\n * - `1` puts it entirely ahead. Offered for symmetry, rarely wanted.\n *\n * @remarks\n * This slides the streak without lengthening it;\n * {@link MotionBlur.maxBlurLength} is honoured at any bias, paid for with a\n * coarser tile grid towards the extremes.\n */\n get shutterBias() {\n return this._shutterBias;\n }\n set shutterBias(val: number) {\n this._shutterBias = Math.min(1, Math.max(0, val));\n }\n /**\n * Longest streak the filter will reconstruct, in pixels at render\n * resolution. Velocity beyond this is clamped: the direction survives, the\n * length does not.\n *\n * @remarks\n * This is the ceiling {@link MotionBlur.strength} runs into: an object\n * crossing `V` pixels per frame stops responding once `V * strength` reaches\n * it. The clamp is per pixel, so fast objects saturate first and pushing\n * strength further only flattens the fast/slow difference. Raise this instead.\n *\n * Cost is linear in it - 28 samples per pixel at the default 40, 100 at 160,\n * since step counts are derived from the length to keep the sampling dense.\n * The quality limit comes sooner though: a tile is as wide as the reach, so\n * raising this spreads the dilated velocity further and a fast object starts\n * dragging nearby slow geometry into its blur.\n */\n get maxBlurLength() {\n return this._maxBlurLength;\n }\n set maxBlurLength(val: number) {\n this._maxBlurLength = Math.max(1, val);\n }\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\n requireLinearDepthTexture() {\n return true;\n }\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\n requireDepthAttachment() {\n return false;\n }\n /** {@inheritDoc AbstractPostEffect.requireMotionVectorTexture} */\n requireMotionVectorTexture() {\n return true;\n }\n /** {@inheritDoc AbstractPostEffect.setup} */\n setup(s: PostEffectSetupContext): RGHandle {\n const { graph, ctx, blackboard } = s;\n const motionVectorHandle = blackboard.get(FrameResources.MotionVector);\n const linearDepthHandle = blackboard.get(FrameResources.LinearDepth);\n if (!motionVectorHandle || !linearDepthHandle || this._intensity <= 0) {\n // Without velocity or depth there is nothing to reconstruct from; the\n // legacy path degrades to a pass-through.\n return this._setupFromApply(s);\n }\n // Tile size follows the requested streak length, and is what every pass\n // this frame sizes itself against. Read once here so the tile textures, the\n // shader loop bounds and the velocity clamp cannot disagree.\n const tileSize = tileSizeFor(this._maxBlurLength, this._shutterBias);\n const tileCountX = Math.max(1, Math.ceil(s.width / tileSize));\n const tileCountY = Math.max(1, Math.ceil(s.height / tileSize));\n\n // 1. TileMax, separable: rows then columns. max() is separable, so the two\n // passes together cover the tile far more cheaply than a 2D reduction.\n const tileMaxHHandle = graph.addPass('MotionBlur:TileMaxH', (builder) => {\n builder.read(motionVectorHandle);\n for (const dep of s.dependencies) {\n builder.read(dep);\n }\n const out = builder.createTexture({\n format: TILE_FORMAT,\n sizeMode: 'absolute',\n width: tileCountX,\n height: s.height,\n label: 'MotionBlur:tileMaxH'\n });\n builder.setExecute((rg) => {\n const device = ctx.device;\n device.pushDeviceStates();\n try {\n this._tileMaxH(\n device,\n rg.getTexture<Texture2D>(motionVectorHandle),\n rg.getTexture<Texture2D>(out),\n tileCountX,\n tileSize\n );\n } finally {\n device.popDeviceStates();\n }\n });\n return out;\n });\n\n const tileMaxHandle = graph.addPass('MotionBlur:TileMaxV', (builder) => {\n builder.read(tileMaxHHandle);\n const out = builder.createTexture({\n format: TILE_FORMAT,\n sizeMode: 'absolute',\n width: tileCountX,\n height: tileCountY,\n label: 'MotionBlur:tileMax'\n });\n builder.setExecute((rg) => {\n const device = ctx.device;\n device.pushDeviceStates();\n try {\n this._tileMaxV(\n device,\n rg.getTexture<Texture2D>(tileMaxHHandle),\n rg.getTexture<Texture2D>(out),\n tileCountY,\n tileSize\n );\n } finally {\n device.popDeviceStates();\n }\n });\n return out;\n });\n\n // 2. NeighborMax: max over the 3x3 tile neighbourhood, so a background-only\n // tile learns about the fast geometry beside it and the streak may cross\n // the silhouette.\n const neighborMaxHandle = graph.addPass('MotionBlur:NeighborMax', (builder) => {\n builder.read(tileMaxHandle);\n const out = builder.createTexture({\n format: TILE_FORMAT,\n sizeMode: 'absolute',\n width: tileCountX,\n height: tileCountY,\n label: 'MotionBlur:neighborMax'\n });\n builder.setExecute((rg) => {\n const device = ctx.device;\n device.pushDeviceStates();\n try {\n this._neighborMax(device, rg.getTexture<Texture2D>(tileMaxHandle), rg.getTexture<Texture2D>(out));\n } finally {\n device.popDeviceStates();\n }\n });\n return out;\n });\n\n // 3. Reconstruction.\n return graph.addPass('PostEffect:MotionBlur', (builder) => {\n builder.read(s.input);\n builder.read(motionVectorHandle);\n builder.read(linearDepthHandle);\n builder.read(neighborMaxHandle);\n for (const dep of s.dependencies) {\n builder.read(dep);\n }\n for (const binding of s.historyReads) {\n builder.read(binding.handle);\n }\n const output = s.createOutput(builder);\n builder.setExecute((rg) => {\n const device = ctx.device;\n device.pushDeviceStates();\n try {\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\n // A framebuffer bind may be a backend no-op when the requested target is already\n // current. Never let a previous multi-resolution effect (for example Bloom) leak its\n // smaller viewport/scissor into this fullscreen pass.\n device.setViewport(null);\n device.setScissor(null);\n this._reconstruct(\n ctx,\n rg.getTexture<Texture2D>(s.input),\n rg.getTexture<Texture2D>(motionVectorHandle),\n rg.getTexture<Texture2D>(linearDepthHandle),\n rg.getTexture<Texture2D>(neighborMaxHandle),\n output.srgbOutput\n );\n } finally {\n device.popDeviceStates();\n }\n });\n return output.color;\n });\n }\n /**\n * {@inheritDoc AbstractPostEffect.apply}\n *\n * @remarks\n * Reconstruction needs the dilated tiles that {@link MotionBlur.setup} builds\n * and this single-pass entry cannot. Only reached without motion vectors,\n * where no blur is the right answer anyway.\n */\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\n this.passThrough(ctx, inputColorTexture, srgbOutput);\n }\n /** @internal */\n private _tileMaxH(\n device: AbstractDevice,\n motionVectorTexture: Texture2D,\n target: Texture2D,\n tileCountX: number,\n tileSize: number\n ) {\n this._prepareTileMax(device);\n device.setFramebuffer([target]);\n device.setViewport(null);\n device.setScissor(null);\n const bindGroup = MotionBlur._bindgroupTileMaxH!;\n bindGroup.setTexture('srcTexture', motionVectorTexture, fetchSampler('clamp_nearest_nomip'));\n this._texSize.setXY(motionVectorTexture.width, motionVectorTexture.height);\n bindGroup.setValue('srcSize', this._texSize);\n bindGroup.setValue('tileCount', tileCountX);\n bindGroup.setValue('tileSize', tileSize);\n bindGroup.setValue('strength', this._intensity);\n bindGroup.setValue('maxBlurLength', this._maxBlurLength);\n bindGroup.setValue('flip', this.needFlip(device) ? 1 : 0);\n device.setProgram(MotionBlur._programTileMaxH);\n device.setBindGroup(0, bindGroup);\n this.drawFullscreenQuad();\n }\n /** @internal */\n private _tileMaxV(\n device: AbstractDevice,\n srcTexture: Texture2D,\n target: Texture2D,\n tileCountY: number,\n tileSize: number\n ) {\n this._prepareTileMax(device);\n device.setFramebuffer([target]);\n device.setViewport(null);\n device.setScissor(null);\n const bindGroup = MotionBlur._bindgroupTileMaxV!;\n bindGroup.setTexture('srcTexture', srcTexture, fetchSampler('clamp_nearest_nomip'));\n this._texSize.setXY(srcTexture.width, srcTexture.height);\n bindGroup.setValue('srcSize', this._texSize);\n bindGroup.setValue('tileCount', tileCountY);\n bindGroup.setValue('tileSize', tileSize);\n bindGroup.setValue('flip', this.needFlip(device) ? 1 : 0);\n device.setProgram(MotionBlur._programTileMaxV);\n device.setBindGroup(0, bindGroup);\n this.drawFullscreenQuad();\n }\n /** @internal */\n private _neighborMax(device: AbstractDevice, srcTexture: Texture2D, target: Texture2D) {\n this._prepareNeighborMax(device);\n device.setFramebuffer([target]);\n device.setViewport(null);\n device.setScissor(null);\n const bindGroup = MotionBlur._bindgroupNeighborMax!;\n bindGroup.setTexture('srcTexture', srcTexture, fetchSampler('clamp_nearest_nomip'));\n this._texSize.setXY(srcTexture.width, srcTexture.height);\n bindGroup.setValue('srcSize', this._texSize);\n bindGroup.setValue('flip', this.needFlip(device) ? 1 : 0);\n device.setProgram(MotionBlur._programNeighborMax);\n device.setBindGroup(0, bindGroup);\n this.drawFullscreenQuad();\n }\n /** @internal */\n private _reconstruct(\n ctx: DrawContext,\n inputColorTexture: Texture2D,\n motionVectorTexture: Texture2D,\n linearDepthTexture: Texture2D,\n neighborMaxTexture: Texture2D,\n srgbOutput: boolean\n ) {\n const device = ctx.device;\n this._prepareReconstruct(device);\n const bindGroup = MotionBlur._bindgroupMotionBlur!;\n const nearest = fetchSampler('clamp_nearest_nomip');\n // Taps land on sub-pixel offsets, so colour is filtered. Velocity and depth\n // stay point-sampled: interpolating either across a silhouette invents a\n // surface at neither depth, moving at neither speed.\n bindGroup.setTexture('inputTexture', inputColorTexture, fetchSampler('clamp_linear_nomip'));\n bindGroup.setTexture('motionVectorTexture', motionVectorTexture, nearest);\n bindGroup.setTexture('linearDepthTexture', linearDepthTexture, nearest);\n bindGroup.setTexture('neighborMaxTexture', neighborMaxTexture, nearest);\n this._texSize.setXY(motionVectorTexture.width, motionVectorTexture.height);\n bindGroup.setValue('texSize', this._texSize);\n bindGroup.setValue('strength', this._intensity);\n bindGroup.setValue('maxBlurLength', this._maxBlurLength);\n bindGroup.setValue('shutterBias', this._shutterBias);\n // Split the streak between the two directions and give each the steps its\n // own share needs. The strides are resolved here rather than in the shader\n // so that a direction with no share divides by nothing.\n const spanBack = this._maxBlurLength * this._shutterBias;\n const spanFwd = this._maxBlurLength * (1 - this._shutterBias);\n const stepsBack = walkStepsFor(spanBack);\n const stepsFwd = walkStepsFor(spanFwd);\n bindGroup.setValue('stepsBack', stepsBack);\n bindGroup.setValue('stepsFwd', stepsFwd);\n bindGroup.setValue('dtBack', stepsBack > 0 ? this._shutterBias / stepsBack : 0);\n bindGroup.setValue('dtFwd', stepsFwd > 0 ? (1 - this._shutterBias) / stepsFwd : 0);\n // Linear depth is stored normalized against the far plane; the filter\n // compares depths in view-space units so the extent above is scene units.\n bindGroup.setValue('cameraFar', ctx.camera.getFarPlane());\n bindGroup.setValue('flip', this.needFlip(device) ? 1 : 0);\n bindGroup.setValue('srgbOut', srgbOutput ? 1 : 0);\n device.setProgram(MotionBlur._programMotionBlur);\n device.setBindGroup(0, bindGroup);\n this.drawFullscreenQuad();\n }\n /** @internal */\n private _prepareTileMax(device: AbstractDevice) {\n if (!MotionBlur._programTileMaxH) {\n MotionBlur._programTileMaxH = device.buildRenderProgram({\n vertex: fullscreenVertex,\n fragment(pb) {\n this.srcTexture = pb.tex2D().uniform(0);\n this.srcSize = pb.vec2().uniform(0);\n this.tileCount = pb.float().uniform(0);\n this.strength = pb.float().uniform(0);\n this.maxBlurLength = pb.float().uniform(0);\n this.tileSize = pb.float().uniform(0);\n this.$outputs.outColor = pb.vec4();\n pb.main(function () {\n // Destination is one texel per tile column but keeps the source\n // height, so the row index maps straight through.\n this.$l.tileX = pb.floor(pb.mul(this.$inputs.uv.x, this.tileCount));\n this.$l.srcY = pb.floor(pb.mul(this.$inputs.uv.y, this.srcSize.y));\n this.$l.baseX = pb.mul(this.tileX, this.tileSize);\n this.$l.best = pb.vec2(0);\n this.$l.bestLen = pb.float(0);\n this.$for(pb.float('i'), 0, this.tileSize, function () {\n this.$l.srcUV = pb.div(\n pb.add(pb.vec2(pb.add(this.baseX, this.i), this.srcY), pb.vec2(0.5)),\n this.srcSize\n );\n // The sampler clamps, so a partial tile at the right edge just\n // re-reads its last texel, which cannot change a maximum.\n this.$l.raw = pb.textureSampleLevel(this.srcTexture, this.srcUV, 0).xy;\n this.$l.v = processVelocity(this, this.raw, this.srcSize, this.strength, this.maxBlurLength);\n this.$l.len = pb.dot(this.v, this.v);\n this.$if(pb.greaterThan(this.len, this.bestLen), function () {\n this.bestLen = this.len;\n this.best = this.v;\n });\n });\n this.$outputs.outColor = pb.vec4(this.best, 0, 1);\n });\n }\n })!;\n MotionBlur._programTileMaxH.name = '@MotionBlurTileMaxH';\n MotionBlur._bindgroupTileMaxH = device.createBindGroup(MotionBlur._programTileMaxH.bindGroupLayouts[0]);\n }\n if (!MotionBlur._programTileMaxV) {\n MotionBlur._programTileMaxV = device.buildRenderProgram({\n vertex: fullscreenVertex,\n fragment(pb) {\n this.srcTexture = pb.tex2D().uniform(0);\n this.srcSize = pb.vec2().uniform(0);\n this.tileCount = pb.float().uniform(0);\n this.tileSize = pb.float().uniform(0);\n this.$outputs.outColor = pb.vec4();\n pb.main(function () {\n // Source already holds one texel per tile column, so the column\n // index maps straight through and only rows are reduced here.\n this.$l.srcX = pb.floor(pb.mul(this.$inputs.uv.x, this.srcSize.x));\n this.$l.tileY = pb.floor(pb.mul(this.$inputs.uv.y, this.tileCount));\n this.$l.baseY = pb.mul(this.tileY, this.tileSize);\n this.$l.best = pb.vec2(0);\n this.$l.bestLen = pb.float(0);\n this.$for(pb.float('i'), 0, this.tileSize, function () {\n this.$l.srcUV = pb.div(\n pb.add(pb.vec2(this.srcX, pb.add(this.baseY, this.i)), pb.vec2(0.5)),\n this.srcSize\n );\n // Already processed by the horizontal pass, so taken verbatim.\n this.$l.v = pb.textureSampleLevel(this.srcTexture, this.srcUV, 0).xy;\n this.$l.len = pb.dot(this.v, this.v);\n this.$if(pb.greaterThan(this.len, this.bestLen), function () {\n this.bestLen = this.len;\n this.best = this.v;\n });\n });\n this.$outputs.outColor = pb.vec4(this.best, 0, 1);\n });\n }\n })!;\n MotionBlur._programTileMaxV.name = '@MotionBlurTileMaxV';\n MotionBlur._bindgroupTileMaxV = device.createBindGroup(MotionBlur._programTileMaxV.bindGroupLayouts[0]);\n }\n }\n /** @internal */\n private _prepareNeighborMax(device: AbstractDevice) {\n if (MotionBlur._programNeighborMax) {\n return;\n }\n MotionBlur._programNeighborMax = device.buildRenderProgram({\n vertex: fullscreenVertex,\n fragment(pb) {\n this.srcTexture = pb.tex2D().uniform(0);\n this.srcSize = pb.vec2().uniform(0);\n this.$outputs.outColor = pb.vec4();\n pb.main(function () {\n this.$l.best = pb.vec2(0);\n this.$l.bestLen = pb.float(0);\n // Unrolled: the 3x3 offsets are compile-time constants, so this\n // avoids a nested dynamic loop for nine taps.\n for (let dy = -1; dy <= 1; dy++) {\n for (let dx = -1; dx <= 1; dx++) {\n const nName = `n${dy + 1}${dx + 1}`;\n const lenName = `len${dy + 1}${dx + 1}`;\n this.$l[nName] = pb.textureSampleLevel(\n this.srcTexture,\n pb.add(this.$inputs.uv, pb.div(pb.vec2(dx, dy), this.srcSize)),\n 0\n ).xy;\n this.$l[lenName] = pb.dot(this[nName], this[nName]);\n this.$if(pb.greaterThan(this[lenName], this.bestLen), function () {\n this.bestLen = this[lenName];\n this.best = this[nName];\n });\n }\n }\n this.$outputs.outColor = pb.vec4(this.best, 0, 1);\n });\n }\n })!;\n MotionBlur._programNeighborMax.name = '@MotionBlurNeighborMax';\n MotionBlur._bindgroupNeighborMax = device.createBindGroup(\n MotionBlur._programNeighborMax.bindGroupLayouts[0]\n );\n }\n /** @internal */\n private _prepareReconstruct(device: AbstractDevice) {\n if (MotionBlur._programMotionBlur) {\n return;\n }\n MotionBlur._programMotionBlur = device.buildRenderProgram({\n vertex: fullscreenVertex,\n fragment(pb) {\n this.inputTexture = pb.tex2D().uniform(0);\n this.motionVectorTexture = pb.tex2D().uniform(0);\n this.linearDepthTexture = pb.tex2D().uniform(0);\n this.neighborMaxTexture = pb.tex2D().uniform(0);\n this.texSize = pb.vec2().uniform(0);\n this.strength = pb.float().uniform(0);\n this.maxBlurLength = pb.float().uniform(0);\n this.shutterBias = pb.float().uniform(0);\n this.stepsBack = pb.float().uniform(0);\n this.stepsFwd = pb.float().uniform(0);\n this.dtBack = pb.float().uniform(0);\n this.dtFwd = pb.float().uniform(0);\n this.cameraFar = pb.float().uniform(0);\n this.srgbOut = pb.int().uniform(0);\n this.$outputs.outColor = pb.vec4();\n\n // Coverage of a streak of length `len` at a point `dist` away. The half\n // pixel floor keeps a static sample from dividing by zero.\n pb.func('Z_mbCone', [pb.float('dist'), pb.float('len')], function () {\n this.$return(pb.clamp(pb.sub(1, pb.div(this.dist, pb.max(this.len, 0.5))), 0, 1));\n });\n // Coverage of a streak that passes over the point rather than ending\n // on it, used when both samples are blurry.\n pb.func('Z_mbCylinder', [pb.float('dist'), pb.float('len')], function () {\n this.$l.r = pb.max(this.len, 0.5);\n this.$return(pb.sub(1, pb.smoothStep(pb.mul(this.r, 0.95), pb.mul(this.r, 1.05), this.dist)));\n });\n // 1 when za is in front of zb, 0 when clearly behind it.\n pb.func('Z_mbSoftDepthCompare', [pb.float('za'), pb.float('zb')], function () {\n this.$return(pb.clamp(pb.sub(1, pb.div(pb.sub(this.za, this.zb), SOFT_Z_EXTENT)), 0, 1));\n });\n pb.func('Z_mbLinearDepth', [pb.vec2('uv')], function () {\n // Motion vectors are unavailable on WebGL, so this effect never runs\n // against the RGBA-packed depth variant that backend uses.\n this.$return(pb.mul(pb.textureSampleLevel(this.linearDepthTexture, this.uv, 0).r, this.cameraFar));\n });\n // Velocity to advance the walk by: the field where there is one, else the\n // dilated vector. That fallback is what starts a walk at all - a\n // background pixel has no velocity of its own to leave on.\n pb.func('Z_mbFlowAt', [pb.vec2('uv'), pb.vec2('vFallback')], function () {\n this.$l.v = processVelocity(\n this,\n pb.textureSampleLevel(this.motionVectorTexture, this.uv, 0).xy,\n this.texSize,\n this.strength,\n this.maxBlurLength\n );\n this.$l.len = pb.length(pb.mul(this.v, this.texSize));\n this.$return(this.$choice(pb.greaterThan(this.len, 0.5), this.v, this.vFallback));\n });\n // One tap of the reconstruction filter, returning the weighted colour\n // in rgb and the weight in a.\n pb.func(\n 'Z_mbTap',\n [pb.vec2('sampleUV'), pb.float('dist'), pb.float('zC'), pb.float('lenC')],\n function () {\n this.$l.zS = this.Z_mbLinearDepth(this.sampleUV);\n this.$l.vS = processVelocity(\n this,\n pb.textureSampleLevel(this.motionVectorTexture, this.sampleUV, 0).xy,\n this.texSize,\n this.strength,\n this.maxBlurLength\n );\n this.$l.lenS = pb.length(pb.mul(this.vS, this.texSize));\n // f: the sample sits in front of the centre, so its own blur is\n // allowed to spill onto the centre. b: the centre is in front and\n // blurry, so it gathers whatever is behind it.\n this.$l.f = this.Z_mbSoftDepthCompare(this.zS, this.zC);\n this.$l.b = this.Z_mbSoftDepthCompare(this.zC, this.zS);\n this.$l.alpha = pb.add(\n pb.mul(this.f, this.Z_mbCone(this.dist, this.lenS)),\n pb.mul(this.b, this.Z_mbCone(this.dist, this.lenC)),\n pb.mul(this.Z_mbCylinder(this.dist, this.lenS), this.Z_mbCylinder(this.dist, this.lenC), 2)\n );\n this.$l.colorS = pb.textureSampleLevel(this.inputTexture, this.sampleUV, 0).rgb;\n this.$return(pb.vec4(pb.mul(this.colorS, this.alpha), this.alpha));\n }\n );\n\n pb.main(function () {\n this.$l.uv = this.$inputs.uv;\n this.$l.sourceSample = pb.textureSampleLevel(this.inputTexture, this.uv, 0);\n this.$l.color = this.sourceSample.rgb;\n // Dilated tile velocity: non-zero even where the pixel is static but\n // fast geometry passes close by.\n this.$l.vN = pb.textureSampleLevel(this.neighborMaxTexture, this.uv, 0).xy;\n this.$l.lenN = pb.length(pb.mul(this.vN, this.texSize));\n this.$if(pb.greaterThan(this.lenN, 0.5), function () {\n this.$l.vC = processVelocity(\n this,\n pb.textureSampleLevel(this.motionVectorTexture, this.uv, 0).xy,\n this.texSize,\n this.strength,\n this.maxBlurLength\n );\n // Floored at half a pixel, as the paper floors the stored velocity:\n // a sharp centre needs a large but finite self weight.\n this.$l.lenC = pb.max(pb.length(pb.mul(this.vC, this.texSize)), 0.5);\n this.$l.zC = this.Z_mbLinearDepth(this.uv);\n // The sharper this pixel is, the more of its own colour it keeps.\n this.$l.weight = pb.div(1, this.lenC);\n this.$l.sum = pb.mul(this.sourceSample.rgb, this.weight);\n // Four walks leave the pixel: backwards into the points arriving\n // here during the shutter, forwards into the ones this pixel's\n // motion carries it onto, each doubled across the streak.\n //\n // They follow the velocity field rather than a straight line. A\n // point Y covers this pixel only if X - Y runs along Y's own\n // velocity; translation makes that locus a line, self-rotation\n // curves it into an arc, and a straight walk cuts across the arc,\n // catching a different set of points at every pixel - the crack a\n // spinning object shows. Re-reading the field each step follows the\n // arc, and reduces to the straight line when the field is uniform.\n //\n // The doubling averages over silhouette tangency, where a lone walk\n // loses several taps at once for a one-pixel shift. Its offset is\n // perpendicular to the motion, which a blur must not smear along,\n // so it stays as narrow as the tangency allows.\n //\n // shutterBias splits the streak between the two directions, each\n // getting steps in proportion. A direction with no share must take\n // none: zero-length steps park every tap on the centre at distance\n // zero, where cone, cylinder and the depth test all peak, spending\n // the heaviest weight in the filter on the pixel's own colour.\n this.$l.nrmN = pb.normalize(this.vN);\n this.$l.lane = pb.div(\n pb.mul(pb.vec2(pb.neg(this.nrmN.y), this.nrmN.x), RIBBON_WIDTH),\n this.texSize\n );\n this.$l.posBack = this.uv;\n this.$l.posFwd = this.uv;\n this.$l.posBack2 = this.uv;\n this.$l.posFwd2 = this.uv;\n // Arc length walked, in pixels: the weights compare it against a\n // sample speed, so it must follow the curve, not the chord.\n this.$l.arcBack = pb.float(0);\n this.$l.arcFwd = pb.float(0);\n this.$l.arcBack2 = pb.float(0);\n this.$l.arcFwd2 = pb.float(0);\n // Direction carried between steps, seeded with the dilated vector.\n // Carried rather than re-seeded so that leaving the geometry again\n // does not kink the path mid-arc.\n this.$l.flowBack = this.vN;\n this.$l.flowFwd = this.vN;\n this.$l.flowBack2 = this.vN;\n this.$l.flowFwd2 = this.vN;\n // The lanes separate with distance rather than running parallel:\n // coincident at the pixel, where sharpness shows, and a few pixels\n // apart far along the streak, where the tangency needs averaging.\n this.$for(pb.float('i'), 0, this.stepsBack, function () {\n this.$l.spread = pb.mul(this.lane, pb.div(pb.add(this.i, 1), this.stepsBack));\n\n this.flowBack = this.Z_mbFlowAt(this.posBack, this.flowBack);\n this.$l.stepBack = pb.mul(this.flowBack, pb.neg(this.dtBack));\n this.posBack = pb.clamp(pb.add(this.posBack, this.stepBack), pb.vec2(0), pb.vec2(1));\n this.arcBack = pb.add(this.arcBack, pb.length(pb.mul(this.stepBack, this.texSize)));\n this.$l.tapBack = this.Z_mbTap(\n pb.add(this.posBack, this.spread),\n this.arcBack,\n this.zC,\n this.lenC\n );\n\n this.flowBack2 = this.Z_mbFlowAt(this.posBack2, this.flowBack2);\n this.$l.stepBack2 = pb.mul(this.flowBack2, pb.neg(this.dtBack));\n this.posBack2 = pb.clamp(pb.add(this.posBack2, this.stepBack2), pb.vec2(0), pb.vec2(1));\n this.arcBack2 = pb.add(this.arcBack2, pb.length(pb.mul(this.stepBack2, this.texSize)));\n this.$l.tapBack2 = this.Z_mbTap(\n pb.sub(this.posBack2, this.spread),\n this.arcBack2,\n this.zC,\n this.lenC\n );\n\n this.sum = pb.add(this.sum, this.tapBack.rgb, this.tapBack2.rgb);\n this.weight = pb.add(this.weight, this.tapBack.a, this.tapBack2.a);\n });\n this.$for(pb.float('i'), 0, this.stepsFwd, function () {\n this.$l.spread = pb.mul(this.lane, pb.div(pb.add(this.i, 1), this.stepsFwd));\n\n this.flowFwd = this.Z_mbFlowAt(this.posFwd, this.flowFwd);\n this.$l.stepFwd = pb.mul(this.flowFwd, this.dtFwd);\n this.posFwd = pb.clamp(pb.add(this.posFwd, this.stepFwd), pb.vec2(0), pb.vec2(1));\n this.arcFwd = pb.add(this.arcFwd, pb.length(pb.mul(this.stepFwd, this.texSize)));\n this.$l.tapFwd = this.Z_mbTap(\n pb.add(this.posFwd, this.spread),\n this.arcFwd,\n this.zC,\n this.lenC\n );\n\n this.flowFwd2 = this.Z_mbFlowAt(this.posFwd2, this.flowFwd2);\n this.$l.stepFwd2 = pb.mul(this.flowFwd2, this.dtFwd);\n this.posFwd2 = pb.clamp(pb.add(this.posFwd2, this.stepFwd2), pb.vec2(0), pb.vec2(1));\n this.arcFwd2 = pb.add(this.arcFwd2, pb.length(pb.mul(this.stepFwd2, this.texSize)));\n this.$l.tapFwd2 = this.Z_mbTap(\n pb.sub(this.posFwd2, this.spread),\n this.arcFwd2,\n this.zC,\n this.lenC\n );\n\n this.sum = pb.add(this.sum, this.tapFwd.rgb, this.tapFwd2.rgb);\n this.weight = pb.add(this.weight, this.tapFwd.a, this.tapFwd2.a);\n });\n this.color = pb.div(this.sum, pb.max(this.weight, 1e-5));\n });\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\n this.color = linearToGamma(this, this.color);\n });\n this.$outputs.outColor = pb.vec4(this.color, this.sourceSample.a);\n });\n }\n })!;\n MotionBlur._programMotionBlur.name = '@MotionBlur';\n MotionBlur._bindgroupMotionBlur = device.createBindGroup(\n MotionBlur._programMotionBlur.bindGroupLayouts[0]\n );\n }\n}\n\n/**\n * Shared fullscreen quad vertex stage. `uv` is derived from the attribute and\n * so is unaffected by the flip, which keeps every pass in this effect writing\n * and sampling the same orientation on both backends.\n * @internal\n */\nfunction fullscreenVertex(this: PBGlobalScope, pb: ProgramBuilder): void {\n this.flip = pb.int().uniform(0);\n this.$inputs.pos = pb.vec2().attrib('position');\n this.$outputs.uv = pb.vec2();\n pb.main(function () {\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\n this.$if(pb.notEqual(this.flip, 0), function () {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n });\n });\n}\n"],"names":["DEFAULT_MAX_BLUR_LENGTH","TARGET_STEP_PX","MIN_WALK_STEPS","MAX_WALK_STEPS","tileSizeFor","maxBlurLength","shutterBias","Math","max","ceil","walkStepsFor","spanPx","min","MV_SENTINEL","SOFT_Z_EXTENT","RIBBON_WIDTH","TILE_FORMAT","FUNC_PROCESS_VELOCITY","processVelocity","scope","raw","texSize","strength","maxLength","pb","$builder","func","vec2","float","$l","sentinel","and","greaterThanEqual","x","y","v","$choice","mul","len","length","$return","div","MotionBlur","AbstractPostEffect","_programTileMaxH","_bindgroupTileMaxH","_programTileMaxV","_bindgroupTileMaxV","_programNeighborMax","_bindgroupNeighborMax","_programMotionBlur","_bindgroupMotionBlur","_intensity","_shutterBias","_maxBlurLength","_texSize","Vector2","_layer","PostEffectLayer","end","val","requireLinearDepthTexture","requireDepthAttachment","requireMotionVectorTexture","setup","s","graph","ctx","blackboard","motionVectorHandle","get","FrameResources","MotionVector","linearDepthHandle","LinearDepth","_setupFromApply","tileSize","tileCountX","width","tileCountY","height","tileMaxHHandle","addPass","builder","read","dep","dependencies","out","createTexture","format","sizeMode","label","setExecute","rg","device","pushDeviceStates","_tileMaxH","getTexture","popDeviceStates","tileMaxHandle","_tileMaxV","neighborMaxHandle","_neighborMax","input","binding","historyReads","handle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","_reconstruct","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","passThrough","motionVectorTexture","target","_prepareTileMax","bindGroup","setTexture","fetchSampler","setXY","setValue","needFlip","setProgram","setBindGroup","drawFullscreenQuad","srcTexture","_prepareNeighborMax","linearDepthTexture","neighborMaxTexture","_prepareReconstruct","nearest","spanBack","spanFwd","stepsBack","stepsFwd","camera","getFarPlane","buildRenderProgram","vertex","fullscreenVertex","fragment","tex2D","uniform","srcSize","tileCount","$outputs","outColor","vec4","main","tileX","floor","$inputs","uv","srcY","baseX","best","bestLen","$for","srcUV","add","i","textureSampleLevel","xy","dot","$if","greaterThan","name","createBindGroup","bindGroupLayouts","srcX","tileY","baseY","dy","dx","nName","lenName","inputTexture","dtBack","dtFwd","cameraFar","srgbOut","int","clamp","sub","dist","r","smoothStep","za","zb","vFallback","zS","Z_mbLinearDepth","sampleUV","vS","lenS","f","Z_mbSoftDepthCompare","zC","b","alpha","Z_mbCone","lenC","Z_mbCylinder","colorS","rgb","sourceSample","vN","lenN","vC","weight","sum","nrmN","normalize","lane","neg","posBack","posFwd","posBack2","posFwd2","arcBack","arcFwd","arcBack2","arcFwd2","flowBack","flowFwd","flowBack2","flowFwd2","spread","Z_mbFlowAt","stepBack","tapBack","Z_mbTap","stepBack2","tapBack2","a","stepFwd","tapFwd","stepFwd2","tapFwd2","notEqual","linearToGamma","flip","pos","attrib","$builtins","position"],"mappings":"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"}
@@ -65,6 +65,16 @@ import { FrameResources } from '../render/rendergraph/blackboard.js';
65
65
  /** Checks whether this post effect requires the Hi-Z depth pyramid. */ requireHiZTexture(_ctx) {
66
66
  return false;
67
67
  }
68
+ /**
69
+ * Checks whether this post effect requires the Hi-Z pyramid's nearest-depth
70
+ * channel, which answers "how close is the nearest surface in this screen
71
+ * region" rather than the farthest-depth channel's occlusion question.
72
+ *
73
+ * Implies {@link AbstractPostEffect.requireHiZTexture}; an effect that needs
74
+ * the nearest channel does not have to request the pyramid separately.
75
+ */ requireHiZNearest(_ctx) {
76
+ return false;
77
+ }
68
78
  /** Checks whether this post effect requires opaque-scene world normals. */ requireSceneNormalTexture(_ctx) {
69
79
  return false;
70
80
  }
@@ -84,7 +94,8 @@ import { FrameResources } from '../render/rendergraph/blackboard.js';
84
94
  /** Collect this effect's semantic frame-resource requirements. @internal */ getFrameResourceRequirements(ctx) {
85
95
  return {
86
96
  motionVector: this.requireMotionVectorTexture(ctx),
87
- hiZ: this.requireHiZTexture(ctx),
97
+ hiZ: this.requireHiZTexture(ctx) || this.requireHiZNearest(ctx),
98
+ hiZNearest: this.requireHiZNearest(ctx),
88
99
  sceneNormal: this.requireSceneNormalTexture(ctx),
89
100
  sceneRoughness: this.requireSceneRoughnessTexture(ctx),
90
101
  shadowMask: this.requireShadowMask(ctx)
@@ -1 +1 @@
1
- {"version":3,"file":"posteffect.js","sources":["../../src/posteffect/posteffect.ts"],"sourcesContent":["import type { AbstractDevice, CompareFunc, RenderStateSet, Texture2D, TextureFormat } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { drawFullscreenQuad } from '../render/fullscreenquad';\r\nimport { copyTexture, fetchSampler } from '../utility/misc';\r\nimport { Disposable } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { RenderGraph } from '../render/rendergraph/rendergraph';\r\nimport type { RGHandle, RGPassBuilder, RGTextureAttachment } from '../render/rendergraph/types';\r\nimport type { RGBlackboard } from '../render/rendergraph/blackboard';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport type { FrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements';\r\nimport type { HistoryResourceManager } from '../render/rendergraph/history_resource_manager';\r\n\r\n/**\r\n * Rendering layer of post processing effects\r\n * @public\r\n *\r\n */\r\nexport enum PostEffectLayer {\r\n opaque = 0,\r\n transparent = 1,\r\n end = 2\r\n}\r\n\r\n/**\r\n * History texture binding required while a post effect executes.\r\n * @public\r\n */\r\nexport interface PostEffectHistoryRead {\r\n /** History resource name (see {@link RGHistoryResources}). */\r\n name: string;\r\n /** Graph handle of the imported previous-frame texture. */\r\n handle: RGHandle;\r\n}\r\n\r\n/**\r\n * Output target of a post effect, created through {@link PostEffectSetupContext.createOutput}.\r\n * @public\r\n */\r\nexport interface PostEffectOutput {\r\n /** Color handle produced by this effect. Return it from {@link AbstractPostEffect.setup}. */\r\n color: RGHandle;\r\n /**\r\n * Graph framebuffer to render into, or null when the effect must render to the\r\n * device default framebuffer (screen).\r\n */\r\n framebuffer: Nullable<RGHandle>;\r\n /** Whether the effect must gamma-correct its final write. */\r\n srgbOutput: boolean;\r\n}\r\n\r\n/**\r\n * Build-time context handed to {@link AbstractPostEffect.setup}.\r\n *\r\n * The context carries everything an effect needs to declare its passes on the\r\n * render graph. Where the effect output physically lands (intermediate texture,\r\n * backbuffer or screen) is decided by {@link PostEffectSetupContext.createOutput};\r\n * effect implementations never deal with final-target selection themselves.\r\n *\r\n * @public\r\n */\r\nexport interface PostEffectSetupContext {\r\n /** The render graph being built for this frame. */\r\n readonly graph: RenderGraph;\r\n /** Frame draw context. Read configuration from it, never textures. */\r\n readonly ctx: DrawContext;\r\n /** Named frame resources (linear depth, motion vectors, GBuffer, ...). */\r\n readonly blackboard: RGBlackboard;\r\n /** Chain input: color output of the previous effect (or the scene color). */\r\n readonly input: RGHandle;\r\n /** Intermediate color format of the post effect chain. */\r\n readonly colorFormat: TextureFormat;\r\n /** Render width in pixels. */\r\n readonly width: number;\r\n /** Render height in pixels. */\r\n readonly height: number;\r\n /** Cross-frame history resources, or null when unavailable. */\r\n readonly history: Nullable<HistoryResourceManager<Texture2D>>;\r\n /**\r\n * Scene depth attachment for intermediate passes that depth-test against\r\n * scene depth: either a graph texture handle or a backend depth texture.\r\n * Pass it as the depthAttachment of intermediate framebuffers; the final\r\n * pass gets it through createOutput({needDepthAttachment: true}).\r\n */\r\n readonly sceneDepthAttachment: Nullable<RGTextureAttachment>;\r\n /**\r\n * Ordering/lifetime dependencies that every pass created by this effect must\r\n * declare with {@link RGPassBuilder.read}.\r\n * @internal\r\n */\r\n readonly dependencies: readonly RGHandle[];\r\n /**\r\n * History texture bindings that must be in a read scope while this effect\r\n * executes (legacy apply path).\r\n * @internal\r\n */\r\n readonly historyReads: readonly PostEffectHistoryRead[];\r\n /**\r\n * Create the output target for the effect's final pass.\r\n *\r\n * Must be called exactly once, inside the setup callback of the pass that\r\n * produces the effect's final color. The compositor decides whether this\r\n * resolves to an intermediate texture or a direct write to the final target.\r\n *\r\n * @param builder - The pass builder of the effect's final pass.\r\n * @param opts - Set needDepthAttachment when the pass depth-tests against scene depth.\r\n * @returns The resolved output target.\r\n */\r\n createOutput(builder: RGPassBuilder, opts?: { needDepthAttachment?: boolean }): PostEffectOutput;\r\n}\r\n\r\n/**\r\n * Base class for any type of post effect\r\n * @public\r\n */\r\nexport class AbstractPostEffect extends Disposable {\r\n private static _defaultRenderStates: { CompareFunc?: RenderStateSet } = {};\r\n protected _enabled: boolean;\r\n protected _layer: PostEffectLayer;\r\n /**\r\n * Creates an instance of a post effect\r\n * @param name - Name of the post effect\r\n */\r\n constructor() {\r\n super();\r\n this._enabled = true;\r\n this._layer = PostEffectLayer.end;\r\n }\r\n /** Whether this post effect is enabled */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set enabled(val) {\r\n this._enabled = !!val;\r\n }\r\n /** Whether this post effect will be rendered at opaque phase */\r\n get layer() {\r\n return this._layer;\r\n }\r\n /**\r\n * Check if the post effect should be rendered upside down.\r\n * @param device - The device object\r\n * @returns true if the post effect should be rendered upside down\r\n */\r\n needFlip(device: AbstractDevice) {\r\n return device.type === 'webgpu' && !!device.getFramebuffer();\r\n }\r\n /**\r\n * Checks whether this post effect requires the linear depth texture\r\n * @returns true if the linear depth texture is required.\r\n */\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the scene depth buffer\r\n * @returns true if the scene depth buffer is required.\r\n */\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the motion vector texture\r\n * @returns true if the motion vector texture is required.\r\n */\r\n requireMotionVectorTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires the Hi-Z depth pyramid. */\r\n requireHiZTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires opaque-scene world normals. */\r\n requireSceneNormalTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires opaque-scene roughness data. */\r\n requireSceneRoughnessTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the screen-space shadow mask.\r\n *\r\n * When true and the mask was produced this frame, the effect can sample\r\n * `DrawContext.shadowMaskTexture` in its apply() body; the graph keeps the\r\n * mask alive for the effect's pass.\r\n * @returns true if the shadow mask is required.\r\n */\r\n requireShadowMask(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Collect this effect's semantic frame-resource requirements. @internal */\r\n getFrameResourceRequirements(ctx: DrawContext): FrameResourceRequirements {\r\n return {\r\n motionVector: this.requireMotionVectorTexture(ctx),\r\n hiZ: this.requireHiZTexture(ctx),\r\n sceneNormal: this.requireSceneNormalTexture(ctx),\r\n sceneRoughness: this.requireSceneRoughnessTexture(ctx),\r\n shadowMask: this.requireShadowMask(ctx)\r\n };\r\n }\r\n /**\r\n * Apply the post effect\r\n * @param camera - Camera used the render the scene\r\n * @param inputColorTexture - The previous scene color texture\r\n * @param sceneDepthTexture - The linear scene depth texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n *\r\n * @remarks\r\n * The frame buffer of the post effect is already set when apply() is called.\r\n */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n }\r\n /**\r\n * Declare this effect's passes on the render graph.\r\n *\r\n * The default implementation wraps {@link AbstractPostEffect.apply} into a\r\n * single graph pass, so effects only overriding apply() work unchanged.\r\n * Multi-pass effects override this method to declare each internal step as\r\n * its own pass, calling {@link PostEffectSetupContext.createOutput} inside\r\n * the final pass.\r\n *\r\n * @param s - Build-time setup context.\r\n * @returns The effect's output color handle.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n return this._setupFromApply(s);\r\n }\r\n /**\r\n * Wraps the legacy apply() entry into a single graph pass.\r\n * @internal\r\n */\r\n protected _setupFromApply(s: PostEffectSetupContext): RGHandle {\r\n const passName = `PostEffect:${this.constructor.name}`;\r\n return s.graph.addPass(passName, (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n for (const binding of s.historyReads) {\r\n builder.read(binding.handle);\r\n }\r\n // Declare reads according to the effect's declared requirements so the\r\n // executor keeps exactly the textures this effect samples alive. Effects\r\n // reaching frame textures through DrawContext fields must declare them\r\n // via requireLinearDepthTexture / requireMotionVectorTexture.\r\n const linearDepthHandle = this.requireLinearDepthTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.LinearDepth)\r\n : null;\r\n if (linearDepthHandle) {\r\n builder.read(linearDepthHandle);\r\n }\r\n const motionVectorHandle = this.requireMotionVectorTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.MotionVector)\r\n : null;\r\n if (motionVectorHandle) {\r\n builder.read(motionVectorHandle);\r\n }\r\n const hiZHandle = this.requireHiZTexture(s.ctx) ? s.blackboard.get(FrameResources.HiZ) : null;\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n const sceneNormalHandle = this.requireSceneNormalTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.SceneNormal)\r\n : null;\r\n if (sceneNormalHandle) {\r\n builder.read(sceneNormalHandle);\r\n }\r\n const sceneRoughnessHandle = this.requireSceneRoughnessTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.SceneRoughness)\r\n : null;\r\n if (sceneRoughnessHandle) {\r\n builder.read(sceneRoughnessHandle);\r\n }\r\n // Keep the screen-space shadow mask alive for effects that sample it\r\n // (via DrawContext.shadowMaskTexture) instead of recomputing shadows.\r\n const shadowMaskHandle = this.requireShadowMask(s.ctx)\r\n ? s.blackboard.get(FrameResources.ShadowMask)\r\n : null;\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n const output = s.createOutput(builder, {\r\n needDepthAttachment: this.requireDepthAttachment(s.ctx)\r\n });\r\n builder.setExecute((rg) => {\r\n const device = s.ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n const linearDepthTexture = linearDepthHandle\r\n ? rg.getTexture<Texture2D>(linearDepthHandle)\r\n : s.ctx.linearDepthTexture!;\r\n const applyEffect = () => {\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n // A framebuffer bind may be a backend no-op when the requested target is already\r\n // current. Never let a previous multi-resolution effect (for example Bloom) leak its\r\n // smaller viewport/scissor into this fullscreen pass.\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.apply(s.ctx, inputTexture, linearDepthTexture, output.srgbOutput);\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n };\r\n if (s.history && s.historyReads.length > 0) {\r\n s.history.beginReadScope(\r\n s.historyReads.map((binding) => ({\r\n name: binding.name,\r\n texture: rg.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n applyEffect();\r\n } finally {\r\n s.history.endReadScope();\r\n }\r\n } else {\r\n applyEffect();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /**\r\n *\r\n * @param ctx - Draw context\r\n * @param inputColorTexture - Input color texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n */\r\n protected passThrough(\r\n ctx: DrawContext,\r\n inputColorTexture: Texture2D,\r\n srgbOutput: boolean,\r\n renderStates?: RenderStateSet\r\n ) {\r\n copyTexture(\r\n inputColorTexture,\r\n ctx.device.getFramebuffer()!,\r\n fetchSampler('clamp_nearest_nomip'),\r\n renderStates,\r\n 0,\r\n srgbOutput\r\n );\r\n }\r\n /**\r\n * Draws a fullscreen quad\r\n * @param renderStateSet - Render states that will be used when drawing the fullscreen quad.\r\n */\r\n protected drawFullscreenQuad(renderStateSet?: RenderStateSet) {\r\n drawFullscreenQuad(renderStateSet);\r\n }\r\n /** @internal */\r\n protected createVertexLayout(device: AbstractDevice) {\r\n return device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]))!\r\n }\r\n ]\r\n });\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this.destroy();\r\n }\r\n /** @internal */\r\n protected createRenderStates(device: AbstractDevice) {\r\n const renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n return renderStates;\r\n }\r\n /** @internal */\r\n protected destroy() {}\r\n /** @internal */\r\n static getDefaultRenderState(ctx: DrawContext, compareFunc: CompareFunc) {\r\n let renderState = this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates];\r\n if (!renderState) {\r\n renderState = ctx.device.createRenderStateSet();\r\n renderState.useRasterizerState().setCullMode('none');\r\n renderState\r\n .useDepthState()\r\n .enableTest(compareFunc !== 'always')\r\n .enableWrite(false)\r\n .setCompareFunc(compareFunc);\r\n this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates] = renderState;\r\n }\r\n return renderState;\r\n }\r\n}\r\n"],"names":["PostEffectLayer","AbstractPostEffect","Disposable","_defaultRenderStates","_enabled","_layer","enabled","val","layer","needFlip","device","type","getFramebuffer","requireLinearDepthTexture","_ctx","requireDepthAttachment","requireMotionVectorTexture","requireHiZTexture","requireSceneNormalTexture","requireSceneRoughnessTexture","requireShadowMask","getFrameResourceRequirements","ctx","motionVector","hiZ","sceneNormal","sceneRoughness","shadowMask","apply","inputColorTexture","sceneDepthTexture","srgbOutput","passThrough","setup","s","_setupFromApply","passName","name","graph","addPass","builder","read","input","dep","dependencies","binding","historyReads","handle","linearDepthHandle","blackboard","get","FrameResources","LinearDepth","motionVectorHandle","MotionVector","hiZHandle","HiZ","sceneNormalHandle","SceneNormal","sceneRoughnessHandle","SceneRoughness","shadowMaskHandle","ShadowMask","output","createOutput","needDepthAttachment","setExecute","rg","inputTexture","getTexture","linearDepthTexture","applyEffect","pushDeviceStates","setFramebuffer","framebuffer","setViewport","setScissor","popDeviceStates","history","length","beginReadScope","map","texture","endReadScope","color","renderStates","copyTexture","fetchSampler","drawFullscreenQuad","renderStateSet","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","onDispose","destroy","createRenderStates","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getDefaultRenderState","compareFunc","renderState","setCompareFunc"],"mappings":"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"}
1
+ {"version":3,"file":"posteffect.js","sources":["../../src/posteffect/posteffect.ts"],"sourcesContent":["import type { AbstractDevice, CompareFunc, RenderStateSet, Texture2D, TextureFormat } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { drawFullscreenQuad } from '../render/fullscreenquad';\r\nimport { copyTexture, fetchSampler } from '../utility/misc';\r\nimport { Disposable } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { RenderGraph } from '../render/rendergraph/rendergraph';\r\nimport type { RGHandle, RGPassBuilder, RGTextureAttachment } from '../render/rendergraph/types';\r\nimport type { RGBlackboard } from '../render/rendergraph/blackboard';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport type { FrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements';\r\nimport type { HistoryResourceManager } from '../render/rendergraph/history_resource_manager';\r\n\r\n/**\r\n * Rendering layer of post processing effects\r\n * @public\r\n *\r\n */\r\nexport enum PostEffectLayer {\r\n opaque = 0,\r\n transparent = 1,\r\n end = 2\r\n}\r\n\r\n/**\r\n * History texture binding required while a post effect executes.\r\n * @public\r\n */\r\nexport interface PostEffectHistoryRead {\r\n /** History resource name (see {@link RGHistoryResources}). */\r\n name: string;\r\n /** Graph handle of the imported previous-frame texture. */\r\n handle: RGHandle;\r\n}\r\n\r\n/**\r\n * Output target of a post effect, created through {@link PostEffectSetupContext.createOutput}.\r\n * @public\r\n */\r\nexport interface PostEffectOutput {\r\n /** Color handle produced by this effect. Return it from {@link AbstractPostEffect.setup}. */\r\n color: RGHandle;\r\n /**\r\n * Graph framebuffer to render into, or null when the effect must render to the\r\n * device default framebuffer (screen).\r\n */\r\n framebuffer: Nullable<RGHandle>;\r\n /** Whether the effect must gamma-correct its final write. */\r\n srgbOutput: boolean;\r\n}\r\n\r\n/**\r\n * Build-time context handed to {@link AbstractPostEffect.setup}.\r\n *\r\n * The context carries everything an effect needs to declare its passes on the\r\n * render graph. Where the effect output physically lands (intermediate texture,\r\n * backbuffer or screen) is decided by {@link PostEffectSetupContext.createOutput};\r\n * effect implementations never deal with final-target selection themselves.\r\n *\r\n * @public\r\n */\r\nexport interface PostEffectSetupContext {\r\n /** The render graph being built for this frame. */\r\n readonly graph: RenderGraph;\r\n /** Frame draw context. Read configuration from it, never textures. */\r\n readonly ctx: DrawContext;\r\n /** Named frame resources (linear depth, motion vectors, GBuffer, ...). */\r\n readonly blackboard: RGBlackboard;\r\n /** Chain input: color output of the previous effect (or the scene color). */\r\n readonly input: RGHandle;\r\n /** Intermediate color format of the post effect chain. */\r\n readonly colorFormat: TextureFormat;\r\n /** Render width in pixels. */\r\n readonly width: number;\r\n /** Render height in pixels. */\r\n readonly height: number;\r\n /** Cross-frame history resources, or null when unavailable. */\r\n readonly history: Nullable<HistoryResourceManager<Texture2D>>;\r\n /**\r\n * Scene depth attachment for intermediate passes that depth-test against\r\n * scene depth: either a graph texture handle or a backend depth texture.\r\n * Pass it as the depthAttachment of intermediate framebuffers; the final\r\n * pass gets it through createOutput({needDepthAttachment: true}).\r\n */\r\n readonly sceneDepthAttachment: Nullable<RGTextureAttachment>;\r\n /**\r\n * Ordering/lifetime dependencies that every pass created by this effect must\r\n * declare with {@link RGPassBuilder.read}.\r\n * @internal\r\n */\r\n readonly dependencies: readonly RGHandle[];\r\n /**\r\n * History texture bindings that must be in a read scope while this effect\r\n * executes (legacy apply path).\r\n * @internal\r\n */\r\n readonly historyReads: readonly PostEffectHistoryRead[];\r\n /**\r\n * Create the output target for the effect's final pass.\r\n *\r\n * Must be called exactly once, inside the setup callback of the pass that\r\n * produces the effect's final color. The compositor decides whether this\r\n * resolves to an intermediate texture or a direct write to the final target.\r\n *\r\n * @param builder - The pass builder of the effect's final pass.\r\n * @param opts - Set needDepthAttachment when the pass depth-tests against scene depth.\r\n * @returns The resolved output target.\r\n */\r\n createOutput(builder: RGPassBuilder, opts?: { needDepthAttachment?: boolean }): PostEffectOutput;\r\n}\r\n\r\n/**\r\n * Base class for any type of post effect\r\n * @public\r\n */\r\nexport class AbstractPostEffect extends Disposable {\r\n private static _defaultRenderStates: { CompareFunc?: RenderStateSet } = {};\r\n protected _enabled: boolean;\r\n protected _layer: PostEffectLayer;\r\n /**\r\n * Creates an instance of a post effect\r\n * @param name - Name of the post effect\r\n */\r\n constructor() {\r\n super();\r\n this._enabled = true;\r\n this._layer = PostEffectLayer.end;\r\n }\r\n /** Whether this post effect is enabled */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set enabled(val) {\r\n this._enabled = !!val;\r\n }\r\n /** Whether this post effect will be rendered at opaque phase */\r\n get layer() {\r\n return this._layer;\r\n }\r\n /**\r\n * Check if the post effect should be rendered upside down.\r\n * @param device - The device object\r\n * @returns true if the post effect should be rendered upside down\r\n */\r\n needFlip(device: AbstractDevice) {\r\n return device.type === 'webgpu' && !!device.getFramebuffer();\r\n }\r\n /**\r\n * Checks whether this post effect requires the linear depth texture\r\n * @returns true if the linear depth texture is required.\r\n */\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the scene depth buffer\r\n * @returns true if the scene depth buffer is required.\r\n */\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the motion vector texture\r\n * @returns true if the motion vector texture is required.\r\n */\r\n requireMotionVectorTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires the Hi-Z depth pyramid. */\r\n requireHiZTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the Hi-Z pyramid's nearest-depth\r\n * channel, which answers \"how close is the nearest surface in this screen\r\n * region\" rather than the farthest-depth channel's occlusion question.\r\n *\r\n * Implies {@link AbstractPostEffect.requireHiZTexture}; an effect that needs\r\n * the nearest channel does not have to request the pyramid separately.\r\n */\r\n requireHiZNearest(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires opaque-scene world normals. */\r\n requireSceneNormalTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires opaque-scene roughness data. */\r\n requireSceneRoughnessTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the screen-space shadow mask.\r\n *\r\n * When true and the mask was produced this frame, the effect can sample\r\n * `DrawContext.shadowMaskTexture` in its apply() body; the graph keeps the\r\n * mask alive for the effect's pass.\r\n * @returns true if the shadow mask is required.\r\n */\r\n requireShadowMask(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Collect this effect's semantic frame-resource requirements. @internal */\r\n getFrameResourceRequirements(ctx: DrawContext): FrameResourceRequirements {\r\n return {\r\n motionVector: this.requireMotionVectorTexture(ctx),\r\n hiZ: this.requireHiZTexture(ctx) || this.requireHiZNearest(ctx),\r\n hiZNearest: this.requireHiZNearest(ctx),\r\n sceneNormal: this.requireSceneNormalTexture(ctx),\r\n sceneRoughness: this.requireSceneRoughnessTexture(ctx),\r\n shadowMask: this.requireShadowMask(ctx)\r\n };\r\n }\r\n /**\r\n * Apply the post effect\r\n * @param camera - Camera used the render the scene\r\n * @param inputColorTexture - The previous scene color texture\r\n * @param sceneDepthTexture - The linear scene depth texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n *\r\n * @remarks\r\n * The frame buffer of the post effect is already set when apply() is called.\r\n */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n }\r\n /**\r\n * Declare this effect's passes on the render graph.\r\n *\r\n * The default implementation wraps {@link AbstractPostEffect.apply} into a\r\n * single graph pass, so effects only overriding apply() work unchanged.\r\n * Multi-pass effects override this method to declare each internal step as\r\n * its own pass, calling {@link PostEffectSetupContext.createOutput} inside\r\n * the final pass.\r\n *\r\n * @param s - Build-time setup context.\r\n * @returns The effect's output color handle.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n return this._setupFromApply(s);\r\n }\r\n /**\r\n * Wraps the legacy apply() entry into a single graph pass.\r\n * @internal\r\n */\r\n protected _setupFromApply(s: PostEffectSetupContext): RGHandle {\r\n const passName = `PostEffect:${this.constructor.name}`;\r\n return s.graph.addPass(passName, (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n for (const binding of s.historyReads) {\r\n builder.read(binding.handle);\r\n }\r\n // Declare reads according to the effect's declared requirements so the\r\n // executor keeps exactly the textures this effect samples alive. Effects\r\n // reaching frame textures through DrawContext fields must declare them\r\n // via requireLinearDepthTexture / requireMotionVectorTexture.\r\n const linearDepthHandle = this.requireLinearDepthTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.LinearDepth)\r\n : null;\r\n if (linearDepthHandle) {\r\n builder.read(linearDepthHandle);\r\n }\r\n const motionVectorHandle = this.requireMotionVectorTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.MotionVector)\r\n : null;\r\n if (motionVectorHandle) {\r\n builder.read(motionVectorHandle);\r\n }\r\n const hiZHandle = this.requireHiZTexture(s.ctx) ? s.blackboard.get(FrameResources.HiZ) : null;\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n const sceneNormalHandle = this.requireSceneNormalTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.SceneNormal)\r\n : null;\r\n if (sceneNormalHandle) {\r\n builder.read(sceneNormalHandle);\r\n }\r\n const sceneRoughnessHandle = this.requireSceneRoughnessTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.SceneRoughness)\r\n : null;\r\n if (sceneRoughnessHandle) {\r\n builder.read(sceneRoughnessHandle);\r\n }\r\n // Keep the screen-space shadow mask alive for effects that sample it\r\n // (via DrawContext.shadowMaskTexture) instead of recomputing shadows.\r\n const shadowMaskHandle = this.requireShadowMask(s.ctx)\r\n ? s.blackboard.get(FrameResources.ShadowMask)\r\n : null;\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n const output = s.createOutput(builder, {\r\n needDepthAttachment: this.requireDepthAttachment(s.ctx)\r\n });\r\n builder.setExecute((rg) => {\r\n const device = s.ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n const linearDepthTexture = linearDepthHandle\r\n ? rg.getTexture<Texture2D>(linearDepthHandle)\r\n : s.ctx.linearDepthTexture!;\r\n const applyEffect = () => {\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n // A framebuffer bind may be a backend no-op when the requested target is already\r\n // current. Never let a previous multi-resolution effect (for example Bloom) leak its\r\n // smaller viewport/scissor into this fullscreen pass.\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.apply(s.ctx, inputTexture, linearDepthTexture, output.srgbOutput);\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n };\r\n if (s.history && s.historyReads.length > 0) {\r\n s.history.beginReadScope(\r\n s.historyReads.map((binding) => ({\r\n name: binding.name,\r\n texture: rg.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n applyEffect();\r\n } finally {\r\n s.history.endReadScope();\r\n }\r\n } else {\r\n applyEffect();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /**\r\n *\r\n * @param ctx - Draw context\r\n * @param inputColorTexture - Input color texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n */\r\n protected passThrough(\r\n ctx: DrawContext,\r\n inputColorTexture: Texture2D,\r\n srgbOutput: boolean,\r\n renderStates?: RenderStateSet\r\n ) {\r\n copyTexture(\r\n inputColorTexture,\r\n ctx.device.getFramebuffer()!,\r\n fetchSampler('clamp_nearest_nomip'),\r\n renderStates,\r\n 0,\r\n srgbOutput\r\n );\r\n }\r\n /**\r\n * Draws a fullscreen quad\r\n * @param renderStateSet - Render states that will be used when drawing the fullscreen quad.\r\n */\r\n protected drawFullscreenQuad(renderStateSet?: RenderStateSet) {\r\n drawFullscreenQuad(renderStateSet);\r\n }\r\n /** @internal */\r\n protected createVertexLayout(device: AbstractDevice) {\r\n return device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]))!\r\n }\r\n ]\r\n });\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this.destroy();\r\n }\r\n /** @internal */\r\n protected createRenderStates(device: AbstractDevice) {\r\n const renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n return renderStates;\r\n }\r\n /** @internal */\r\n protected destroy() {}\r\n /** @internal */\r\n static getDefaultRenderState(ctx: DrawContext, compareFunc: CompareFunc) {\r\n let renderState = this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates];\r\n if (!renderState) {\r\n renderState = ctx.device.createRenderStateSet();\r\n renderState.useRasterizerState().setCullMode('none');\r\n renderState\r\n .useDepthState()\r\n .enableTest(compareFunc !== 'always')\r\n .enableWrite(false)\r\n .setCompareFunc(compareFunc);\r\n this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates] = renderState;\r\n }\r\n return renderState;\r\n }\r\n}\r\n"],"names":["PostEffectLayer","AbstractPostEffect","Disposable","_defaultRenderStates","_enabled","_layer","enabled","val","layer","needFlip","device","type","getFramebuffer","requireLinearDepthTexture","_ctx","requireDepthAttachment","requireMotionVectorTexture","requireHiZTexture","requireHiZNearest","requireSceneNormalTexture","requireSceneRoughnessTexture","requireShadowMask","getFrameResourceRequirements","ctx","motionVector","hiZ","hiZNearest","sceneNormal","sceneRoughness","shadowMask","apply","inputColorTexture","sceneDepthTexture","srgbOutput","passThrough","setup","s","_setupFromApply","passName","name","graph","addPass","builder","read","input","dep","dependencies","binding","historyReads","handle","linearDepthHandle","blackboard","get","FrameResources","LinearDepth","motionVectorHandle","MotionVector","hiZHandle","HiZ","sceneNormalHandle","SceneNormal","sceneRoughnessHandle","SceneRoughness","shadowMaskHandle","ShadowMask","output","createOutput","needDepthAttachment","setExecute","rg","inputTexture","getTexture","linearDepthTexture","applyEffect","pushDeviceStates","setFramebuffer","framebuffer","setViewport","setScissor","popDeviceStates","history","length","beginReadScope","map","texture","endReadScope","color","renderStates","copyTexture","fetchSampler","drawFullscreenQuad","renderStateSet","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","onDispose","destroy","createRenderStates","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getDefaultRenderState","compareFunc","renderState","setCompareFunc"],"mappings":"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"}